From 7d9b6793d398e6fcbf558c85a76fc69b96e30327 Mon Sep 17 00:00:00 2001 From: James Collins Date: Tue, 14 Nov 2023 09:40:05 +1000 Subject: [PATCH] cleanup --- .env.example | 27 +- .env.testing | 59 - .eslintignore | 3 - .eslintrc.js | 22 - .gitattributes | 2 +- .github/dependabot.yml | 15 - .github/workflows/laravel.yml | 42 - .gitignore | 273 +- .ls-lint.yml | 14 - .prettierrc.json | 5 - .vscode/settings.json | 21 +- README.md | 18 +- _ide_helper.php | 23355 ---------------- app/Conductors/AnalyticsConductor.php | 71 - app/Conductors/ArticleConductor.php | 181 - app/Conductors/Conductor.php | 1055 - app/Conductors/EventConductor.php | 140 - app/Conductors/MediaConductor.php | 184 - app/Conductors/MediaJobConductor.php | 76 - app/Conductors/ShortlinkConductor.php | 59 - app/Conductors/SubscriptionConductor.php | 45 - app/Conductors/UserConductor.php | 89 - app/Console/Commands/CleanupTempFiles.php | 46 - app/Console/Commands/RemoveStaleMediaJobs.php | 42 - app/Console/Kernel.php | 9 +- app/Enum/CurlErrorCodes.php | 169 - app/Enum/Enum.php | 73 - app/Enum/HttpResponseCodes.php | 165 - app/Exceptions/Handler.php | 72 +- app/Filters/SubscriptionFilter.php | 30 - app/Helpers/Array.php | 78 - app/Helpers/Temp.php | 92 - app/Helpers/TypeValue.php | 27 - .../Controllers/Api/AnalyticsController.php | 121 - app/Http/Controllers/Api/ApiController.php | 243 - .../Controllers/Api/ArticleController.php | 139 - app/Http/Controllers/Api/AuthController.php | 105 - .../Controllers/Api/ContactController.php | 30 - app/Http/Controllers/Api/EventController.php | 234 - app/Http/Controllers/Api/InfoController.php | 26 - app/Http/Controllers/Api/LogController.php | 165 - app/Http/Controllers/Api/MediaController.php | 443 - .../Controllers/Api/MediaJobController.php | 52 - app/Http/Controllers/Api/OCRController.php | 234 - .../Controllers/Api/ShortlinkController.php | 111 - app/Http/Controllers/Api/UserController.php | 369 - app/Http/Controllers/Controller.php | 3 +- app/Http/Kernel.php | 15 +- app/Http/Middleware/Authenticate.php | 12 +- app/Http/Middleware/ForceJsonResponse.php | 21 - app/Http/Middleware/LogRequest.php | 36 - .../Middleware/RedirectIfAuthenticated.php | 11 +- app/Http/Middleware/TrustProxies.php | 11 +- app/Http/Middleware/UnmangleRequest.php | 47 - app/Http/Middleware/UseSanctumGuard.php | 24 - app/Http/Requests/AnalyticsRequest.php | 35 - app/Http/Requests/ArticleRequest.php | 46 - app/Http/Requests/AuthLoginRequest.php | 21 - app/Http/Requests/BaseRequest.php | 107 - app/Http/Requests/ContactSendRequest.php | 24 - app/Http/Requests/EventRequest.php | 59 - app/Http/Requests/MediaRequest.php | 33 - app/Http/Requests/ShortlinkRequest.php | 36 - app/Http/Requests/SubscriptionRequest.php | 46 - .../Requests/UserForgotPasswordRequest.php | 22 - app/Http/Requests/UserRegisterRequest.php | 23 - app/Http/Requests/UserRequest.php | 111 - .../Requests/UserResendVerifyEmailRequest.php | 22 - .../Requests/UserResetPasswordRequest.php | 23 - app/Http/Requests/UserVerifyEmailRequest.php | 22 - app/Jobs/MediaWorkerJob.php | 393 - app/Jobs/SendEmailJob.php | 57 - app/Mail/ChangeEmailVerify.php | 79 - app/Mail/ChangedEmail.php | 79 - app/Mail/ChangedPassword.php | 61 - app/Mail/Contact.php | 78 - app/Mail/EmailVerify.php | 70 - app/Mail/ExceptionMail.php | 59 - app/Mail/ForgotPassword.php | 70 - app/Mail/SubscriptionConfirm.php | 61 - app/Mail/SubscriptionUnsubscribed.php | 61 - app/Models/AnalyticsItemRequest.php | 73 - app/Models/AnalyticsSession.php | 44 - app/Models/Article.php | 43 - app/Models/Attachment.php | 86 - app/Models/Event.php | 51 - app/Models/EventUsers.php | 45 - app/Models/Gallery.php | 107 - app/Models/Media.php | 1064 - app/Models/MediaJob.php | 239 - app/Models/Permission.php | 35 - app/Models/Shortlink.php | 37 - app/Models/Subscription.php | 22 - app/Models/User.php | 209 +- app/Models/UserCode.php | 83 - app/Models/UserLogins.php | 39 - app/Providers/AppServiceProvider.php | 31 +- app/Providers/AuthServiceProvider.php | 5 +- app/Providers/BroadcastServiceProvider.php | 2 - app/Providers/EventServiceProvider.php | 8 - app/Providers/RouteServiceProvider.php | 58 +- app/Rules/Recaptcha.php | 52 - app/Rules/UniqueFileName.php | 41 - app/Rules/Uniqueish.php | 107 - app/Traits/HasAttachments.php | 98 - app/Traits/HasGallery.php | 88 - app/Traits/Uuids.php | 42 - composer.json | 42 +- composer.lock | 2593 +- config/app.php | 10 +- config/audit.php | 169 - config/broadcasting.php | 3 +- config/cache.php | 3 +- config/clamav.php | 69 - config/clockwork.php | 416 - config/contact.php | 6 - config/database.php | 4 +- config/filesystems.php | 43 +- config/hashing.php | 4 +- config/image.php | 20 - config/logging.php | 2 +- config/mail.php | 6 +- config/purify.php | 87 - config/queue.php | 16 + config/sanctum.php | 24 +- config/services.php | 1 + config/session.php | 2 +- database/factories/ArticleFactory.php | 31 - database/factories/EventFactory.php | 40 - database/factories/MediaFactory.php | 28 - database/factories/UserFactory.php | 20 +- .../2014_10_12_000000_create_users_table.php | 12 +- ...12_100000_create_password_resets_table.php | 28 - ...01_create_personal_access_tokens_table.php | 2 +- .../2022_12_28_113117_create_posts_table.php | 33 - .../2022_12_30_105153_create_media_table.php | 33 - ..._12_30_110049_create_permissions_table.php | 31 - .../2023_01_01_103251_create_events_table.php | 38 - ..._021_050482_create_subscriptions_table.php | 29 - .../2023_01_05_043106_create_jobs_table.php | 32 - ...3_01_05_112154_create_user_codes_table.php | 33 - .../2023_01_08_045958_create_audits_table.php | 43 - ..._01_08_050847_create_user_logins_table.php | 35 - ...23_01_24_080416_create_analytics_table.php | 31 - ..._02_24_023054_create_attachments_table.php | 31 - ...02_28_090609_add_price_to_events_table.php | 28 - ..._03_01_075334_add_ages_to_events_table.php | 28 - .../2023_04_05_222458_update_media_table.php | 55 - ...pdate_no_nullable_phone_on_users_table.php | 31 - ...113354_add_display_name_to_users_table.php | 36 - ..._04_19_122711_drop_subscriptions_table.php | 29 - .../2023_04_25_235615_update_posts_table.php | 31 - ...23_05_01_045630_update_analytics_table.php | 72 - ...71954_remove_username_from_users_table.php | 31 - ...3_05_06_080418_create_shortlinks_table.php | 29 - ...082705_add_counter_to_shortlinks_table.php | 28 - .../2023_05_08_021929_update_users_table.php | 30 - ...5_09_003156_add_location_url_to_events.php | 28 - ...32859_add_private_to_attachments_table.php | 28 - ..._05_11_033621_create_event_users_table.php | 32 - ...24_000000_rename_password_resets_table.php | 24 - ...023_05_25_024138_split_analytics_table.php | 116 - ...023_06_22_233236_add_open_at_to_events.php | 28 - ...23_07_16_095623_create_galleries_table.php | 32 - ..._07_19_041445_update_attachments_table.php | 36 - ..._in_analytics_analytics_sessions_table.php | 28 - ...26_235416_add_thumbnail_to_media_table.php | 28 - ...3_08_29_211400_create_media_jobs_table.php | 36 - ...4_remove_status_and_update_media_table.php | 37 - ...025739_update_analytics_requests_table.php | 28 - ...25916_update_location_url_events_table.php | 30 - ...0_add_progress_max_to_media_jobs_table.php | 28 - ...ename_permission_column_in_media_table.php | 44 - database/seeders/DatabaseSeeder.php | 18 +- faker/provider/CustomInternetProvider.php | 16 - import-meta.ts | 6 - package-lock.json | 6348 +---- package.json | 51 +- phpcs.xml | 119 - phpunit.xml | 57 +- public/.htaccess | 46 - public/android-chrome-192x192.png | Bin 20338 -> 0 bytes public/android-chrome-512x512.png | Bin 76262 -> 0 bytes public/apple-touch-icon.png | Bin 18187 -> 0 bytes public/assets/community-discord.webp | Bin 22412 -> 0 bytes public/assets/community-facebook.webp | Bin 35152 -> 0 bytes public/assets/community-github.webp | Bin 20038 -> 0 bytes public/assets/community-mastodon.webp | Bin 32456 -> 0 bytes public/assets/community-minecraft.webp | Bin 35916 -> 0 bytes public/assets/community-youtube.webp | Bin 11242 -> 0 bytes public/assets/fileicons/.htaccess | 3 - public/assets/fileicons/doc.webp | Bin 4172 -> 0 bytes public/assets/fileicons/docx.webp | Bin 4712 -> 0 bytes public/assets/fileicons/jpeg.webp | Bin 3430 -> 0 bytes public/assets/fileicons/jpg.webp | Bin 3134 -> 0 bytes public/assets/fileicons/mov.webp | Bin 3782 -> 0 bytes public/assets/fileicons/mp4.webp | Bin 3384 -> 0 bytes public/assets/fileicons/pdf.webp | Bin 3730 -> 0 bytes public/assets/fileicons/png.webp | Bin 3566 -> 0 bytes public/assets/fileicons/sb3.webp | Bin 9218 -> 0 bytes .../fileicons/stopmotionstudiomobile.webp | Bin 14794 -> 0 bytes public/assets/fileicons/svg.webp | Bin 4124 -> 0 bytes public/assets/fileicons/txt.webp | Bin 3078 -> 0 bytes public/assets/fileicons/unknown.webp | Bin 2856 -> 0 bytes public/assets/fileicons/xls.webp | Bin 3484 -> 0 bytes public/assets/fileicons/xml.webp | Bin 3780 -> 0 bytes public/assets/fileicons/zip.webp | Bin 2936 -> 0 bytes public/assets/hamburger.svg | 15 - public/assets/home-discord.webp | Bin 30750 -> 0 bytes public/assets/home-green-screen.webp | Bin 30930 -> 0 bytes public/assets/home-hero.webp | Bin 146254 -> 0 bytes public/assets/home-minecraft-address.webp | Bin 898 -> 0 bytes public/assets/home-minecraft-edu.webp | Bin 7002 -> 0 bytes public/assets/home-minecraft.webp | Bin 14380 -> 0 bytes public/assets/logo-dark.webp | Bin 8890 -> 0 bytes public/assets/logo.webp | Bin 8838 -> 0 bytes public/assets/sad-monster.webp | Bin 33432 -> 0 bytes public/assets/vareal.webp | Bin 38496 -> 0 bytes public/favicon-16x16.png | Bin 683 -> 0 bytes public/favicon-32x32.png | Bin 1587 -> 0 bytes public/favicon.ico | Bin 15406 -> 0 bytes public/media.php | 83 - public/shortlink.php | 51 - resources/css/app.scss | 230 - resources/js/bootstrap.js | 32 + resources/js/components/SMArticleCard.vue | 41 - resources/js/components/SMAttachments.vue | 193 - resources/js/components/SMCard.vue | 22 - resources/js/components/SMCheckbox.vue | 248 - resources/js/components/SMControl.vue | 74 - resources/js/components/SMDialog.ts | 124 - resources/js/components/SMDropdown.vue | 225 - resources/js/components/SMEditor.vue | 936 - resources/js/components/SMEventCard.vue | 269 - resources/js/components/SMFileLink.vue | 42 - resources/js/components/SMForm.vue | 79 - resources/js/components/SMFormError.vue | 38 - resources/js/components/SMHTML.vue | 72 - resources/js/components/SMHeader.vue | 78 - resources/js/components/SMImage.vue | 64 - resources/js/components/SMImageGallery.vue | 364 - resources/js/components/SMImageStack.vue | 80 - resources/js/components/SMInput copy.vue | 882 - resources/js/components/SMInput.vue | 315 - .../js/components/SMInputAttachments.vue | 202 - resources/js/components/SMInputFile.vue | 882 - resources/js/components/SMLoading.vue | 73 - resources/js/components/SMMastHead.vue | 103 - resources/js/components/SMNavbar.vue | 717 - resources/js/components/SMPageFooter.vue | 645 - resources/js/components/SMPageStatus.vue | 37 - resources/js/components/SMPagination.vue | 210 - resources/js/components/SMRange.vue | 876 - resources/js/components/SMSelectFile.vue | 653 - resources/js/components/SMSocialIcons.vue | 61 - resources/js/components/SMTab.vue | 29 - resources/js/components/SMTabGroup.vue | 87 - resources/js/components/SMTable.vue | 193 - resources/js/components/SMToast.vue | 151 - resources/js/components/SMToastList.vue | 21 - .../dialogs/SMDialogChangePassword.vue | 121 - .../js/components/dialogs/SMDialogConfirm.vue | 130 - .../js/components/dialogs/SMDialogMedia.vue | 1642 -- .../components/dialogs/SMDialogProgress.vue | 45 - resources/js/extensions/danger.ts | 60 - resources/js/extensions/info.ts | 60 - resources/js/extensions/small.ts | 59 - resources/js/extensions/success.ts | 60 - resources/js/extensions/warning.ts | 60 - resources/js/helpers/api.ts | 476 - resources/js/helpers/api.types.ts | 190 - resources/js/helpers/array.ts | 24 - resources/js/helpers/datetime.ts | 462 - resources/js/helpers/debounce.ts | 27 - resources/js/helpers/form.ts | 221 - resources/js/helpers/image.ts | 81 - resources/js/helpers/media.ts | 309 - resources/js/helpers/object.ts | 29 - resources/js/helpers/seo.ts | 53 - resources/js/helpers/square.ts | 36 - resources/js/helpers/string.ts | 129 - resources/js/helpers/transition.ts | 131 - resources/js/helpers/types.ts | 73 - resources/js/helpers/url.ts | 147 - resources/js/helpers/utils.ts | 164 - resources/js/helpers/uuid.ts | 24 - resources/js/helpers/validate.ts | 978 - resources/js/lib/prism.js | 25 - resources/js/main.js | 12 - resources/js/router/index.js | 619 - resources/js/store/ApplicationStore.ts | 94 - resources/js/store/CacheStore.ts | 61 - resources/js/store/ToastStore.ts | 83 - resources/js/store/UserStore.ts | 72 - resources/js/tests/datetime.test.ts | 33 - resources/js/tests/string.test.ts | 14 - resources/js/tests/validate.test.ts | 28 - resources/js/views/404.vue | 7 - resources/js/views/App.vue | 44 - resources/js/views/Article.vue | 163 - resources/js/views/Blog.vue | 167 - resources/js/views/Cart.vue | 3 - resources/js/views/CodeOfConduct.vue | 150 - resources/js/views/Community.vue | 130 - resources/js/views/Contact.vue | 50 - resources/js/views/EmailVerify.vue | 101 - resources/js/views/Event.vue | 357 - resources/js/views/File.vue | 193 - resources/js/views/ForgotPassword.vue | 91 - resources/js/views/Home.vue | 385 - resources/js/views/Login.vue | 104 - resources/js/views/Logout.vue | 37 - resources/js/views/Minecraft.vue | 99 - resources/js/views/MinecraftCurve.vue | 1104 - resources/js/views/Privacy.vue | 359 - resources/js/views/Register.vue | 127 - resources/js/views/ResendEmailVerify.vue | 91 - resources/js/views/ResetPassword.vue | 92 - resources/js/views/Rules.vue | 55 - resources/js/views/TermsAndConditions.vue | 589 - resources/js/views/Workshops.vue | 256 - .../js/views/dashboard/AnalyticsItem.vue | 71 - .../js/views/dashboard/AnalyticsList.vue | 199 - 323 files changed, 907 insertions(+), 65589 deletions(-) delete mode 100644 .env.testing delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js delete mode 100644 .github/dependabot.yml delete mode 100644 .github/workflows/laravel.yml delete mode 100644 .ls-lint.yml delete mode 100644 .prettierrc.json delete mode 100644 _ide_helper.php delete mode 100644 app/Conductors/AnalyticsConductor.php delete mode 100644 app/Conductors/ArticleConductor.php delete mode 100644 app/Conductors/Conductor.php delete mode 100644 app/Conductors/EventConductor.php delete mode 100644 app/Conductors/MediaConductor.php delete mode 100644 app/Conductors/MediaJobConductor.php delete mode 100644 app/Conductors/ShortlinkConductor.php delete mode 100644 app/Conductors/SubscriptionConductor.php delete mode 100644 app/Conductors/UserConductor.php delete mode 100644 app/Console/Commands/CleanupTempFiles.php delete mode 100644 app/Console/Commands/RemoveStaleMediaJobs.php delete mode 100644 app/Enum/CurlErrorCodes.php delete mode 100644 app/Enum/Enum.php delete mode 100644 app/Enum/HttpResponseCodes.php delete mode 100644 app/Filters/SubscriptionFilter.php delete mode 100644 app/Helpers/Array.php delete mode 100644 app/Helpers/Temp.php delete mode 100644 app/Helpers/TypeValue.php delete mode 100644 app/Http/Controllers/Api/AnalyticsController.php delete mode 100644 app/Http/Controllers/Api/ApiController.php delete mode 100644 app/Http/Controllers/Api/ArticleController.php delete mode 100644 app/Http/Controllers/Api/AuthController.php delete mode 100644 app/Http/Controllers/Api/ContactController.php delete mode 100644 app/Http/Controllers/Api/EventController.php delete mode 100644 app/Http/Controllers/Api/InfoController.php delete mode 100644 app/Http/Controllers/Api/LogController.php delete mode 100644 app/Http/Controllers/Api/MediaController.php delete mode 100644 app/Http/Controllers/Api/MediaJobController.php delete mode 100644 app/Http/Controllers/Api/OCRController.php delete mode 100644 app/Http/Controllers/Api/ShortlinkController.php delete mode 100644 app/Http/Controllers/Api/UserController.php delete mode 100644 app/Http/Middleware/ForceJsonResponse.php delete mode 100644 app/Http/Middleware/LogRequest.php delete mode 100644 app/Http/Middleware/UnmangleRequest.php delete mode 100644 app/Http/Middleware/UseSanctumGuard.php delete mode 100644 app/Http/Requests/AnalyticsRequest.php delete mode 100644 app/Http/Requests/ArticleRequest.php delete mode 100644 app/Http/Requests/AuthLoginRequest.php delete mode 100644 app/Http/Requests/BaseRequest.php delete mode 100644 app/Http/Requests/ContactSendRequest.php delete mode 100644 app/Http/Requests/EventRequest.php delete mode 100644 app/Http/Requests/MediaRequest.php delete mode 100644 app/Http/Requests/ShortlinkRequest.php delete mode 100644 app/Http/Requests/SubscriptionRequest.php delete mode 100644 app/Http/Requests/UserForgotPasswordRequest.php delete mode 100644 app/Http/Requests/UserRegisterRequest.php delete mode 100644 app/Http/Requests/UserRequest.php delete mode 100644 app/Http/Requests/UserResendVerifyEmailRequest.php delete mode 100644 app/Http/Requests/UserResetPasswordRequest.php delete mode 100644 app/Http/Requests/UserVerifyEmailRequest.php delete mode 100644 app/Jobs/MediaWorkerJob.php delete mode 100644 app/Jobs/SendEmailJob.php delete mode 100644 app/Mail/ChangeEmailVerify.php delete mode 100644 app/Mail/ChangedEmail.php delete mode 100644 app/Mail/ChangedPassword.php delete mode 100644 app/Mail/Contact.php delete mode 100644 app/Mail/EmailVerify.php delete mode 100644 app/Mail/ExceptionMail.php delete mode 100644 app/Mail/ForgotPassword.php delete mode 100644 app/Mail/SubscriptionConfirm.php delete mode 100644 app/Mail/SubscriptionUnsubscribed.php delete mode 100644 app/Models/AnalyticsItemRequest.php delete mode 100644 app/Models/AnalyticsSession.php delete mode 100644 app/Models/Article.php delete mode 100644 app/Models/Attachment.php delete mode 100644 app/Models/Event.php delete mode 100644 app/Models/EventUsers.php delete mode 100644 app/Models/Gallery.php delete mode 100644 app/Models/Media.php delete mode 100644 app/Models/MediaJob.php delete mode 100644 app/Models/Permission.php delete mode 100644 app/Models/Shortlink.php delete mode 100644 app/Models/Subscription.php delete mode 100644 app/Models/UserCode.php delete mode 100644 app/Models/UserLogins.php delete mode 100644 app/Rules/Recaptcha.php delete mode 100644 app/Rules/UniqueFileName.php delete mode 100644 app/Rules/Uniqueish.php delete mode 100644 app/Traits/HasAttachments.php delete mode 100644 app/Traits/HasGallery.php delete mode 100644 app/Traits/Uuids.php delete mode 100644 config/audit.php delete mode 100644 config/clamav.php delete mode 100644 config/clockwork.php delete mode 100644 config/contact.php delete mode 100644 config/image.php delete mode 100644 config/purify.php delete mode 100644 database/factories/ArticleFactory.php delete mode 100644 database/factories/EventFactory.php delete mode 100644 database/factories/MediaFactory.php delete mode 100644 database/migrations/2014_10_12_100000_create_password_resets_table.php delete mode 100644 database/migrations/2022_12_28_113117_create_posts_table.php delete mode 100644 database/migrations/2022_12_30_105153_create_media_table.php delete mode 100644 database/migrations/2022_12_30_110049_create_permissions_table.php delete mode 100644 database/migrations/2023_01_01_103251_create_events_table.php delete mode 100644 database/migrations/2023_01_021_050482_create_subscriptions_table.php delete mode 100644 database/migrations/2023_01_05_043106_create_jobs_table.php delete mode 100644 database/migrations/2023_01_05_112154_create_user_codes_table.php delete mode 100644 database/migrations/2023_01_08_045958_create_audits_table.php delete mode 100644 database/migrations/2023_01_08_050847_create_user_logins_table.php delete mode 100644 database/migrations/2023_01_24_080416_create_analytics_table.php delete mode 100644 database/migrations/2023_02_24_023054_create_attachments_table.php delete mode 100644 database/migrations/2023_02_28_090609_add_price_to_events_table.php delete mode 100644 database/migrations/2023_03_01_075334_add_ages_to_events_table.php delete mode 100644 database/migrations/2023_04_05_222458_update_media_table.php delete mode 100644 database/migrations/2023_04_18_111723_update_no_nullable_phone_on_users_table.php delete mode 100644 database/migrations/2023_04_18_113354_add_display_name_to_users_table.php delete mode 100644 database/migrations/2023_04_19_122711_drop_subscriptions_table.php delete mode 100644 database/migrations/2023_04_25_235615_update_posts_table.php delete mode 100644 database/migrations/2023_05_01_045630_update_analytics_table.php delete mode 100644 database/migrations/2023_05_04_071954_remove_username_from_users_table.php delete mode 100644 database/migrations/2023_05_06_080418_create_shortlinks_table.php delete mode 100644 database/migrations/2023_05_06_082705_add_counter_to_shortlinks_table.php delete mode 100644 database/migrations/2023_05_08_021929_update_users_table.php delete mode 100644 database/migrations/2023_05_09_003156_add_location_url_to_events.php delete mode 100644 database/migrations/2023_05_11_032859_add_private_to_attachments_table.php delete mode 100644 database/migrations/2023_05_11_033621_create_event_users_table.php delete mode 100644 database/migrations/2023_05_24_000000_rename_password_resets_table.php delete mode 100644 database/migrations/2023_05_25_024138_split_analytics_table.php delete mode 100644 database/migrations/2023_06_22_233236_add_open_at_to_events.php delete mode 100644 database/migrations/2023_07_16_095623_create_galleries_table.php delete mode 100644 database/migrations/2023_07_19_041445_update_attachments_table.php delete mode 100644 database/migrations/2023_07_24_022737_update_useragent_nullable_in_analytics_analytics_sessions_table.php delete mode 100644 database/migrations/2023_07_26_235416_add_thumbnail_to_media_table.php delete mode 100644 database/migrations/2023_08_29_211400_create_media_jobs_table.php delete mode 100644 database/migrations/2023_08_31_224314_remove_status_and_update_media_table.php delete mode 100644 database/migrations/2023_09_01_025739_update_analytics_requests_table.php delete mode 100644 database/migrations/2023_09_01_025916_update_location_url_events_table.php delete mode 100644 database/migrations/2023_09_10_085850_add_progress_max_to_media_jobs_table.php delete mode 100644 database/migrations/2023_09_25_053320_rename_permission_column_in_media_table.php delete mode 100644 faker/provider/CustomInternetProvider.php delete mode 100644 import-meta.ts delete mode 100644 phpcs.xml delete mode 100644 public/android-chrome-192x192.png delete mode 100644 public/android-chrome-512x512.png delete mode 100644 public/apple-touch-icon.png delete mode 100644 public/assets/community-discord.webp delete mode 100644 public/assets/community-facebook.webp delete mode 100644 public/assets/community-github.webp delete mode 100644 public/assets/community-mastodon.webp delete mode 100644 public/assets/community-minecraft.webp delete mode 100644 public/assets/community-youtube.webp delete mode 100644 public/assets/fileicons/.htaccess delete mode 100644 public/assets/fileicons/doc.webp delete mode 100644 public/assets/fileicons/docx.webp delete mode 100644 public/assets/fileicons/jpeg.webp delete mode 100644 public/assets/fileicons/jpg.webp delete mode 100644 public/assets/fileicons/mov.webp delete mode 100644 public/assets/fileicons/mp4.webp delete mode 100644 public/assets/fileicons/pdf.webp delete mode 100644 public/assets/fileicons/png.webp delete mode 100644 public/assets/fileicons/sb3.webp delete mode 100644 public/assets/fileicons/stopmotionstudiomobile.webp delete mode 100644 public/assets/fileicons/svg.webp delete mode 100644 public/assets/fileicons/txt.webp delete mode 100644 public/assets/fileicons/unknown.webp delete mode 100644 public/assets/fileicons/xls.webp delete mode 100644 public/assets/fileicons/xml.webp delete mode 100644 public/assets/fileicons/zip.webp delete mode 100644 public/assets/hamburger.svg delete mode 100644 public/assets/home-discord.webp delete mode 100644 public/assets/home-green-screen.webp delete mode 100644 public/assets/home-hero.webp delete mode 100644 public/assets/home-minecraft-address.webp delete mode 100644 public/assets/home-minecraft-edu.webp delete mode 100644 public/assets/home-minecraft.webp delete mode 100644 public/assets/logo-dark.webp delete mode 100644 public/assets/logo.webp delete mode 100644 public/assets/sad-monster.webp delete mode 100644 public/assets/vareal.webp delete mode 100644 public/favicon-16x16.png delete mode 100644 public/favicon-32x32.png delete mode 100644 public/media.php delete mode 100644 public/shortlink.php delete mode 100644 resources/css/app.scss delete mode 100644 resources/js/components/SMArticleCard.vue delete mode 100644 resources/js/components/SMAttachments.vue delete mode 100644 resources/js/components/SMCard.vue delete mode 100644 resources/js/components/SMCheckbox.vue delete mode 100644 resources/js/components/SMControl.vue delete mode 100644 resources/js/components/SMDialog.ts delete mode 100644 resources/js/components/SMDropdown.vue delete mode 100644 resources/js/components/SMEditor.vue delete mode 100644 resources/js/components/SMEventCard.vue delete mode 100644 resources/js/components/SMFileLink.vue delete mode 100644 resources/js/components/SMForm.vue delete mode 100644 resources/js/components/SMFormError.vue delete mode 100644 resources/js/components/SMHTML.vue delete mode 100644 resources/js/components/SMHeader.vue delete mode 100644 resources/js/components/SMImage.vue delete mode 100644 resources/js/components/SMImageGallery.vue delete mode 100644 resources/js/components/SMImageStack.vue delete mode 100644 resources/js/components/SMInput copy.vue delete mode 100644 resources/js/components/SMInput.vue delete mode 100644 resources/js/components/SMInputAttachments.vue delete mode 100644 resources/js/components/SMInputFile.vue delete mode 100644 resources/js/components/SMLoading.vue delete mode 100644 resources/js/components/SMMastHead.vue delete mode 100644 resources/js/components/SMNavbar.vue delete mode 100644 resources/js/components/SMPageFooter.vue delete mode 100644 resources/js/components/SMPageStatus.vue delete mode 100644 resources/js/components/SMPagination.vue delete mode 100644 resources/js/components/SMRange.vue delete mode 100644 resources/js/components/SMSelectFile.vue delete mode 100644 resources/js/components/SMSocialIcons.vue delete mode 100644 resources/js/components/SMTab.vue delete mode 100644 resources/js/components/SMTabGroup.vue delete mode 100644 resources/js/components/SMTable.vue delete mode 100644 resources/js/components/SMToast.vue delete mode 100644 resources/js/components/SMToastList.vue delete mode 100644 resources/js/components/dialogs/SMDialogChangePassword.vue delete mode 100644 resources/js/components/dialogs/SMDialogConfirm.vue delete mode 100644 resources/js/components/dialogs/SMDialogMedia.vue delete mode 100644 resources/js/components/dialogs/SMDialogProgress.vue delete mode 100644 resources/js/extensions/danger.ts delete mode 100644 resources/js/extensions/info.ts delete mode 100644 resources/js/extensions/small.ts delete mode 100644 resources/js/extensions/success.ts delete mode 100644 resources/js/extensions/warning.ts delete mode 100644 resources/js/helpers/api.ts delete mode 100644 resources/js/helpers/api.types.ts delete mode 100644 resources/js/helpers/array.ts delete mode 100644 resources/js/helpers/datetime.ts delete mode 100644 resources/js/helpers/debounce.ts delete mode 100644 resources/js/helpers/form.ts delete mode 100644 resources/js/helpers/image.ts delete mode 100644 resources/js/helpers/media.ts delete mode 100644 resources/js/helpers/object.ts delete mode 100644 resources/js/helpers/seo.ts delete mode 100644 resources/js/helpers/square.ts delete mode 100644 resources/js/helpers/string.ts delete mode 100644 resources/js/helpers/transition.ts delete mode 100644 resources/js/helpers/types.ts delete mode 100644 resources/js/helpers/url.ts delete mode 100644 resources/js/helpers/utils.ts delete mode 100644 resources/js/helpers/uuid.ts delete mode 100644 resources/js/helpers/validate.ts delete mode 100644 resources/js/lib/prism.js delete mode 100644 resources/js/main.js delete mode 100644 resources/js/router/index.js delete mode 100644 resources/js/store/ApplicationStore.ts delete mode 100644 resources/js/store/CacheStore.ts delete mode 100644 resources/js/store/ToastStore.ts delete mode 100644 resources/js/store/UserStore.ts delete mode 100644 resources/js/tests/datetime.test.ts delete mode 100644 resources/js/tests/string.test.ts delete mode 100644 resources/js/tests/validate.test.ts delete mode 100644 resources/js/views/404.vue delete mode 100644 resources/js/views/App.vue delete mode 100644 resources/js/views/Article.vue delete mode 100644 resources/js/views/Blog.vue delete mode 100644 resources/js/views/Cart.vue delete mode 100644 resources/js/views/CodeOfConduct.vue delete mode 100644 resources/js/views/Community.vue delete mode 100644 resources/js/views/Contact.vue delete mode 100644 resources/js/views/EmailVerify.vue delete mode 100644 resources/js/views/Event.vue delete mode 100644 resources/js/views/File.vue delete mode 100644 resources/js/views/ForgotPassword.vue delete mode 100644 resources/js/views/Home.vue delete mode 100644 resources/js/views/Login.vue delete mode 100644 resources/js/views/Logout.vue delete mode 100644 resources/js/views/Minecraft.vue delete mode 100644 resources/js/views/MinecraftCurve.vue delete mode 100644 resources/js/views/Privacy.vue delete mode 100644 resources/js/views/Register.vue delete mode 100644 resources/js/views/ResendEmailVerify.vue delete mode 100644 resources/js/views/ResetPassword.vue delete mode 100644 resources/js/views/Rules.vue delete mode 100644 resources/js/views/TermsAndConditions.vue delete mode 100644 resources/js/views/Workshops.vue delete mode 100644 resources/js/views/dashboard/AnalyticsItem.vue delete mode 100644 resources/js/views/dashboard/AnalyticsList.vue diff --git a/.env.example b/.env.example index db61606..ea0665b 100644 --- a/.env.example +++ b/.env.example @@ -3,7 +3,6 @@ APP_ENV=local APP_KEY= APP_DEBUG=true APP_URL=http://localhost -APP_URL_API="${APP_URL}/api/" LOG_CHANNEL=stack LOG_DEPRECATIONS_CHANNEL=null @@ -30,7 +29,7 @@ REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_MAILER=smtp -MAIL_HOST=mailhog +MAIL_HOST=mailpit MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null @@ -38,24 +37,11 @@ MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS="hello@example.com" MAIL_FROM_NAME="${APP_NAME}" -AWS_PUBLIC_ACCESS_KEY_ID= -AWS_PUBLIC_SECRET_ACCESS_KEY= -AWS_PUBLIC_DEFAULT_REGION="us-west-002" -AWS_PUBLIC_BUCKET= -AWS_PUBLIC_USE_PATH_STYLE_ENDPOINT=false -AWS_PUBLIC_ENDPOINT= -AWS_PUBLIC_URL= - -AWS_PRIVATE_ACCESS_KEY_ID= -AWS_PRIVATE_SECRET_ACCESS_KEY= -AWS_PRIVATE_DEFAULT_REGION="us-west-002" -AWS_PRIVATE_BUCKET= -AWS_PRIVATE_USE_PATH_STYLE_ENDPOINT=false -AWS_PRIVATE_ENDPOINT= -AWS_PRIVATE_URL= - -CLOUDFLARE_ZONE_ID= -CLOUDFLARE_API_KEY= +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false PUSHER_APP_ID= PUSHER_APP_KEY= @@ -65,6 +51,7 @@ PUSHER_PORT=443 PUSHER_SCHEME=https PUSHER_APP_CLUSTER=mt1 +VITE_APP_NAME="${APP_NAME}" VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" VITE_PUSHER_HOST="${PUSHER_HOST}" VITE_PUSHER_PORT="${PUSHER_PORT}" diff --git a/.env.testing b/.env.testing deleted file mode 100644 index 999d7c8..0000000 --- a/.env.testing +++ /dev/null @@ -1,59 +0,0 @@ -APP_NAME=Laravel -APP_ENV=local -APP_KEY=base64:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= -APP_DEBUG=true -APP_URL=http://127.0.0.1 -APP_URL_API="${APP_URL}/api/" - -LOG_CHANNEL=stack -LOG_LEVEL=debug - -DB_CONNECTION=sqlite -DB_DATABASE=:memory: - -BROADCAST_DRIVER=log -CACHE_DRIVER=array -QUEUE_CONNECTION=sync -SESSION_DRIVER=file -SESSION_LIFETIME=120 - -MEMCACHED_HOST=127.0.0.1 - -REDIS_HOST=127.0.0.1 -REDIS_PASSWORD=null -REDIS_PORT=6379 - -MAIL_MAILER=log -MAIL_HOST=null -MAIL_PORT=null -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 - -PUSHER_APP_ID= -PUSHER_APP_KEY= -PUSHER_APP_SECRET= -PUSHER_HOST= -PUSHER_PORT=443 -PUSHER_SCHEME=https -PUSHER_APP_CLUSTER=mt1 - -VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" -VITE_PUSHER_HOST="${PUSHER_HOST}" -VITE_PUSHER_PORT="${PUSHER_PORT}" -VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" -VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" - -CONTACT_ADDRESS="hello@stemmechanics.com.au" -CONTACT_SUBJECT="Contact from website" - -STORAGE_LOCAL_URL="${APP_URL}/api/media/%ID%/download" -STORAGE_PUBLIC_URL="${APP_URL}/uploads/%NAME%" \ No newline at end of file diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 6c27ec2..0000000 --- a/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -.github/ -.vscode/ -vendor/ diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 0e015c6..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,22 +0,0 @@ -module.exports = { - env: { - node: true, - }, - extends: [ - "eslint:recommended", - "plugin:vue/vue3-strongly-recommended", - "prettier", - "plugin:jsdoc/recommended", - "plugin:@typescript-eslint/recommended", - ], - rules: { - "vue/multi-word-component-names": "off", - indent: ["off", 4, { ignoredNodes: ["ConditionalExpression"] }], - "@typescript-eslint/no-inferrable-types": "off", - }, - plugins: ["jsdoc", "@typescript-eslint"], - parser: "vue-eslint-parser", - parserOptions: { - parser: "@typescript-eslint/parser", - }, -}; diff --git a/.gitattributes b/.gitattributes index 7dbbf41..fcb21d3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,4 @@ -* text=auto +* text=auto eol=lf *.blade.php diff=html *.css diff=css diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 461cddb..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,15 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - -version: 2 -updates: - - package-ecosystem: "npm" - directory: "/" - schedule: - interval: "daily" - - package-ecosystem: "composer" - directory: "/" - schedule: - interval: "daily" diff --git a/.github/workflows/laravel.yml b/.github/workflows/laravel.yml deleted file mode 100644 index 003cbd5..0000000 --- a/.github/workflows/laravel.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Laravel - -on: - push: - branches: ["main"] - -jobs: - laravel-tests: - runs-on: ubuntu-latest - - steps: - - uses: shivammathur/setup-php@v2 - with: - php-version: "8.1" - - uses: actions/checkout@v3 - - name: Copy .env - run: php -r "file_exists('.env') || copy('.env.example', '.env');" - - name: Install Dependencies - run: composer install -q --no-interaction --no-progress --prefer-dist - - name: Generate key - run: php artisan key:generate - - name: Directory Permissions - run: chmod -R 777 storage bootstrap/cache - - name: Create Database - run: | - mkdir -p database - touch database/database.sqlite - - name: Execute tests (Unit and Feature tests) via PHPUnit - env: - DB_CONNECTION: sqlite - DB_DATABASE: database/database.sqlite - run: vendor/bin/phpunit - - name: Install Node.js - uses: actions/setup-node@v2 - with: - node-version: "16.x" - - name: Install dependencies - run: npm ci - - name: Run Vue tests - env: - LARAVEL_BYPASS_ENV_CHECK: "1" - run: npm run test diff --git a/.gitignore b/.gitignore index d7d0c27..7fe978f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,258 +1,19 @@ -### Composer ### -composer.phar -/vendor/ - -# composer.lock - -### Laravel ### -node_modules/ +/.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 - -# Laravel 4 specific -bootstrap/compiled.php -app/storage/ - -# Laravel 5 & Lumen specific -public/storage -public/hot - -# Laravel 5 & Lumen specific with changed public path -public_html/storage -public_html/hot - -storage/*.key -.env -Homestead.yaml -Homestead.json -/.vagrant -/.phpunit.cache - -### macOS ### -# General -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### macOS Patch ### -# iCloud generated files -*.icloud - -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-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 -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# 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 variable files -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# 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 - -# vuepress v2.x temp and cache directory -.temp - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - -### Node Patch ### -# Serverless Webpack directories -.webpack/ - -# Optional stylelint cache - -# SvelteKit build / generate output -.svelte-kit - -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -!.vscode/*.code-snippets - -# Local History for Visual Studio Code -.history/ - -# Built Visual Studio Code Extensions -*.vsix - -### VisualStudioCode Patch ### -# Ignore all local history of files -.history -.ionide - -### Vue ### -# gitignore template for Vue.js projects -# -# Recommended template: Node.gitignore - -# TODO: where does this rule come from? -docs/_book - -# TODO: where does this rule come from? -test/ - -### Vuejs ### -# Recommended template: Node.gitignore - -dist/ - -### This Project ### -/public/uploads -/public/build -*.key - -### TinyMCE ### -/public/tinymce -!/public/tinymce/skins/ui/stemmech/ - -### Synk ### -.dccache - -### TempCodeRunner ### -tempCodeRunnerFile.* - -### PHPUnit ### -.phpunit.result.cache -.gitignore - -### Codesniffer ### -phpcs.phar -phpcbf.phar +/.fleet +/.idea +/.vscode diff --git a/.ls-lint.yml b/.ls-lint.yml deleted file mode 100644 index 1269e23..0000000 --- a/.ls-lint.yml +++ /dev/null @@ -1,14 +0,0 @@ -ls: - resources/js/store: - .ts: pascalcase - "*": - .js: camelcase - .ts: camelcase - .vue: pascalcase - .dir: snakecase - .type.ts: camelcase -ignore: - - node_modules - - vendor - - public/build - - public/tinymce diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index 57d158c..0000000 --- a/.prettierrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "bracketSameLine": true, - "tabWidth": 4, - "htmlWhitespaceSensitivity": "css" -} diff --git a/.vscode/settings.json b/.vscode/settings.json index 65f2c6a..4988eb6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,20 +1,5 @@ { - "editor.formatOnType": true, - "editor.formatOnSave": true, - "editor.codeActionsOnSave": { - "source.fixAll.eslint": true - // "source.organizeImports": true // <-- when enabled, breaks tinymce required import order - }, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "[vue]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[php]": { - // "editor.defaultFormatter": "bmewburn.vscode-intelephense-client" - "editor.defaultFormatter": "wongjn.php-sniffer" - }, - "cSpell.words": ["TIMESTAMPDIFF"] + "files.associations": { + "*.css": "tailwindcss" + } } diff --git a/README.md b/README.md index bf0ddd9..1824fc1 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

Laravel Logo

-Build Status +Build Status Total Downloads Latest Stable Version License @@ -31,23 +31,23 @@ If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Lar ## Laravel Sponsors -We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the Laravel [Patreon page](https://patreon.com/taylorotwell). +We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com). ### Premium Partners - **[Vehikl](https://vehikl.com/)** - **[Tighten Co.](https://tighten.co)** +- **[WebReinvent](https://webreinvent.com/)** - **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** - **[64 Robots](https://64robots.com)** -- **[Cubet Techno Labs](https://cubettech.com)** -- **[Cyber-Duck](https://cyber-duck.co.uk)** -- **[Many](https://www.many.co.uk)** -- **[Webdock, Fast VPS Hosting](https://www.webdock.io/en)** -- **[DevSquad](https://devsquad.com)** - **[Curotec](https://www.curotec.com/services/technologies/laravel/)** +- **[Cyber-Duck](https://cyber-duck.co.uk)** +- **[DevSquad](https://devsquad.com/hire-laravel-developers)** +- **[Jump24](https://jump24.co.uk)** +- **[Redberry](https://redberry.international/laravel/)** +- **[Active Logic](https://activelogic.com)** +- **[byte5](https://byte5.de)** - **[OP.GG](https://op.gg)** -- **[WebReinvent](https://webreinvent.com/?utm_source=laravel&utm_medium=github&utm_campaign=patreon-sponsors)** -- **[Lendio](https://lendio.com)** ## Contributing diff --git a/_ide_helper.php b/_ide_helper.php deleted file mode 100644 index fea124a..0000000 --- a/_ide_helper.php +++ /dev/null @@ -1,23355 +0,0 @@ - - * @see https://github.com/barryvdh/laravel-ide-helper - */ - - namespace Illuminate\Support\Facades { - /** - * - * - * @see \Illuminate\Foundation\Application - */ - class App { - /** - * Get the version number of the application. - * - * @return string - * @static - */ - public static function version() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->version(); - } - /** - * Run the given array of bootstrap classes. - * - * @param string[] $bootstrappers - * @return void - * @static - */ - public static function bootstrapWith($bootstrappers) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->bootstrapWith($bootstrappers); - } - /** - * Register a callback to run after loading the environment. - * - * @param \Closure $callback - * @return void - * @static - */ - public static function afterLoadingEnvironment($callback) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->afterLoadingEnvironment($callback); - } - /** - * Register a callback to run before a bootstrapper. - * - * @param string $bootstrapper - * @param \Closure $callback - * @return void - * @static - */ - public static function beforeBootstrapping($bootstrapper, $callback) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->beforeBootstrapping($bootstrapper, $callback); - } - /** - * Register a callback to run after a bootstrapper. - * - * @param string $bootstrapper - * @param \Closure $callback - * @return void - * @static - */ - public static function afterBootstrapping($bootstrapper, $callback) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->afterBootstrapping($bootstrapper, $callback); - } - /** - * Determine if the application has been bootstrapped before. - * - * @return bool - * @static - */ - public static function hasBeenBootstrapped() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->hasBeenBootstrapped(); - } - /** - * Set the base path for the application. - * - * @param string $basePath - * @return \Illuminate\Foundation\Application - * @static - */ - public static function setBasePath($basePath) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->setBasePath($basePath); - } - /** - * Get the path to the application "app" directory. - * - * @param string $path - * @return string - * @static - */ - public static function path($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->path($path); - } - /** - * Set the application directory. - * - * @param string $path - * @return \Illuminate\Foundation\Application - * @static - */ - public static function useAppPath($path) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->useAppPath($path); - } - /** - * Get the base path of the Laravel installation. - * - * @param string $path - * @return string - * @static - */ - public static function basePath($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->basePath($path); - } - /** - * Get the path to the bootstrap directory. - * - * @param string $path - * @return string - * @static - */ - public static function bootstrapPath($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->bootstrapPath($path); - } - /** - * Set the bootstrap file directory. - * - * @param string $path - * @return \Illuminate\Foundation\Application - * @static - */ - public static function useBootstrapPath($path) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->useBootstrapPath($path); - } - /** - * Get the path to the application configuration files. - * - * @param string $path - * @return string - * @static - */ - public static function configPath($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->configPath($path); - } - /** - * Set the configuration directory. - * - * @param string $path - * @return \Illuminate\Foundation\Application - * @static - */ - public static function useConfigPath($path) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->useConfigPath($path); - } - /** - * Get the path to the database directory. - * - * @param string $path - * @return string - * @static - */ - public static function databasePath($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->databasePath($path); - } - /** - * Set the database directory. - * - * @param string $path - * @return \Illuminate\Foundation\Application - * @static - */ - public static function useDatabasePath($path) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->useDatabasePath($path); - } - /** - * Get the path to the language files. - * - * @param string $path - * @return string - * @static - */ - public static function langPath($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->langPath($path); - } - /** - * Set the language file directory. - * - * @param string $path - * @return \Illuminate\Foundation\Application - * @static - */ - public static function useLangPath($path) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->useLangPath($path); - } - /** - * Get the path to the public / web directory. - * - * @param string $path - * @return string - * @static - */ - public static function publicPath($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->publicPath($path); - } - /** - * Set the public / web directory. - * - * @param string $path - * @return \Illuminate\Foundation\Application - * @static - */ - public static function usePublicPath($path) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->usePublicPath($path); - } - /** - * Get the path to the storage directory. - * - * @param string $path - * @return string - * @static - */ - public static function storagePath($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->storagePath($path); - } - /** - * Set the storage directory. - * - * @param string $path - * @return \Illuminate\Foundation\Application - * @static - */ - public static function useStoragePath($path) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->useStoragePath($path); - } - /** - * Get the path to the resources directory. - * - * @param string $path - * @return string - * @static - */ - public static function resourcePath($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->resourcePath($path); - } - /** - * Get the path to the views directory. - * - * This method returns the first configured path in the array of view paths. - * - * @param string $path - * @return string - * @static - */ - public static function viewPath($path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->viewPath($path); - } - /** - * Join the given paths together. - * - * @param string $basePath - * @param string $path - * @return string - * @static - */ - public static function joinPaths($basePath, $path = '') - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->joinPaths($basePath, $path); - } - /** - * Get the path to the environment file directory. - * - * @return string - * @static - */ - public static function environmentPath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->environmentPath(); - } - /** - * Set the directory for the environment file. - * - * @param string $path - * @return \Illuminate\Foundation\Application - * @static - */ - public static function useEnvironmentPath($path) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->useEnvironmentPath($path); - } - /** - * Set the environment file to be loaded during bootstrapping. - * - * @param string $file - * @return \Illuminate\Foundation\Application - * @static - */ - public static function loadEnvironmentFrom($file) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->loadEnvironmentFrom($file); - } - /** - * Get the environment file the application is using. - * - * @return string - * @static - */ - public static function environmentFile() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->environmentFile(); - } - /** - * Get the fully qualified path to the environment file. - * - * @return string - * @static - */ - public static function environmentFilePath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->environmentFilePath(); - } - /** - * Get or check the current application environment. - * - * @param string|array $environments - * @return string|bool - * @static - */ - public static function environment(...$environments) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->environment(...$environments); - } - /** - * Determine if the application is in the local environment. - * - * @return bool - * @static - */ - public static function isLocal() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isLocal(); - } - /** - * Determine if the application is in the production environment. - * - * @return bool - * @static - */ - public static function isProduction() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isProduction(); - } - /** - * Detect the application's current environment. - * - * @param \Closure $callback - * @return string - * @static - */ - public static function detectEnvironment($callback) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->detectEnvironment($callback); - } - /** - * Determine if the application is running in the console. - * - * @return bool - * @static - */ - public static function runningInConsole() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->runningInConsole(); - } - /** - * Determine if the application is running unit tests. - * - * @return bool - * @static - */ - public static function runningUnitTests() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->runningUnitTests(); - } - /** - * Determine if the application is running with debug mode enabled. - * - * @return bool - * @static - */ - public static function hasDebugModeEnabled() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->hasDebugModeEnabled(); - } - /** - * Register all of the configured providers. - * - * @return void - * @static - */ - public static function registerConfiguredProviders() - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->registerConfiguredProviders(); - } - /** - * Register a service provider with the application. - * - * @param \Illuminate\Support\ServiceProvider|string $provider - * @param bool $force - * @return \Illuminate\Support\ServiceProvider - * @static - */ - public static function register($provider, $force = false) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->register($provider, $force); - } - /** - * Get the registered service provider instance if it exists. - * - * @param \Illuminate\Support\ServiceProvider|string $provider - * @return \Illuminate\Support\ServiceProvider|null - * @static - */ - public static function getProvider($provider) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getProvider($provider); - } - /** - * Get the registered service provider instances if any exist. - * - * @param \Illuminate\Support\ServiceProvider|string $provider - * @return array - * @static - */ - public static function getProviders($provider) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getProviders($provider); - } - /** - * Resolve a service provider instance from the class name. - * - * @param string $provider - * @return \Illuminate\Support\ServiceProvider - * @static - */ - public static function resolveProvider($provider) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->resolveProvider($provider); - } - /** - * Load and boot all of the remaining deferred providers. - * - * @return void - * @static - */ - public static function loadDeferredProviders() - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->loadDeferredProviders(); - } - /** - * Load the provider for a deferred service. - * - * @param string $service - * @return void - * @static - */ - public static function loadDeferredProvider($service) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->loadDeferredProvider($service); - } - /** - * Register a deferred provider and service. - * - * @param string $provider - * @param string|null $service - * @return void - * @static - */ - public static function registerDeferredProvider($provider, $service = null) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->registerDeferredProvider($provider, $service); - } - /** - * Resolve the given type from the container. - * - * @param string $abstract - * @param array $parameters - * @return mixed - * @static - */ - public static function make($abstract, $parameters = []) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->make($abstract, $parameters); - } - /** - * Determine if the given abstract type has been bound. - * - * @param string $abstract - * @return bool - * @static - */ - public static function bound($abstract) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->bound($abstract); - } - /** - * Determine if the application has booted. - * - * @return bool - * @static - */ - public static function isBooted() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isBooted(); - } - /** - * Boot the application's service providers. - * - * @return void - * @static - */ - public static function boot() - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->boot(); - } - /** - * Register a new boot listener. - * - * @param callable $callback - * @return void - * @static - */ - public static function booting($callback) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->booting($callback); - } - /** - * Register a new "booted" listener. - * - * @param callable $callback - * @return void - * @static - */ - public static function booted($callback) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->booted($callback); - } - /** - * {@inheritdoc} - * - * @return \Symfony\Component\HttpFoundation\Response - * @static - */ - public static function handle($request, $type = 1, $catch = true) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->handle($request, $type, $catch); - } - /** - * Determine if middleware has been disabled for the application. - * - * @return bool - * @static - */ - public static function shouldSkipMiddleware() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->shouldSkipMiddleware(); - } - /** - * Get the path to the cached services.php file. - * - * @return string - * @static - */ - public static function getCachedServicesPath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getCachedServicesPath(); - } - /** - * Get the path to the cached packages.php file. - * - * @return string - * @static - */ - public static function getCachedPackagesPath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getCachedPackagesPath(); - } - /** - * Determine if the application configuration is cached. - * - * @return bool - * @static - */ - public static function configurationIsCached() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->configurationIsCached(); - } - /** - * Get the path to the configuration cache file. - * - * @return string - * @static - */ - public static function getCachedConfigPath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getCachedConfigPath(); - } - /** - * Determine if the application routes are cached. - * - * @return bool - * @static - */ - public static function routesAreCached() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->routesAreCached(); - } - /** - * Get the path to the routes cache file. - * - * @return string - * @static - */ - public static function getCachedRoutesPath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getCachedRoutesPath(); - } - /** - * Determine if the application events are cached. - * - * @return bool - * @static - */ - public static function eventsAreCached() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->eventsAreCached(); - } - /** - * Get the path to the events cache file. - * - * @return string - * @static - */ - public static function getCachedEventsPath() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getCachedEventsPath(); - } - /** - * Add new prefix to list of absolute path prefixes. - * - * @param string $prefix - * @return \Illuminate\Foundation\Application - * @static - */ - public static function addAbsoluteCachePathPrefix($prefix) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->addAbsoluteCachePathPrefix($prefix); - } - /** - * Get an instance of the maintenance mode manager implementation. - * - * @return \Illuminate\Contracts\Foundation\MaintenanceMode - * @static - */ - public static function maintenanceMode() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->maintenanceMode(); - } - /** - * Determine if the application is currently down for maintenance. - * - * @return bool - * @static - */ - public static function isDownForMaintenance() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isDownForMaintenance(); - } - /** - * Throw an HttpException with the given data. - * - * @param int $code - * @param string $message - * @param array $headers - * @return \Illuminate\Foundation\never - * @throws \Symfony\Component\HttpKernel\Exception\HttpException - * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException - * @static - */ - public static function abort($code, $message = '', $headers = []) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->abort($code, $message, $headers); - } - /** - * Register a terminating callback with the application. - * - * @param callable|string $callback - * @return \Illuminate\Foundation\Application - * @static - */ - public static function terminating($callback) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->terminating($callback); - } - /** - * Terminate the application. - * - * @return void - * @static - */ - public static function terminate() - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->terminate(); - } - /** - * Get the service providers that have been loaded. - * - * @return array - * @static - */ - public static function getLoadedProviders() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getLoadedProviders(); - } - /** - * Determine if the given service provider is loaded. - * - * @param string $provider - * @return bool - * @static - */ - public static function providerIsLoaded($provider) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->providerIsLoaded($provider); - } - /** - * Get the application's deferred services. - * - * @return array - * @static - */ - public static function getDeferredServices() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getDeferredServices(); - } - /** - * Set the application's deferred services. - * - * @param array $services - * @return void - * @static - */ - public static function setDeferredServices($services) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->setDeferredServices($services); - } - /** - * Add an array of services to the application's deferred services. - * - * @param array $services - * @return void - * @static - */ - public static function addDeferredServices($services) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->addDeferredServices($services); - } - /** - * Determine if the given service is a deferred service. - * - * @param string $service - * @return bool - * @static - */ - public static function isDeferredService($service) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isDeferredService($service); - } - /** - * Configure the real-time facade namespace. - * - * @param string $namespace - * @return void - * @static - */ - public static function provideFacades($namespace) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->provideFacades($namespace); - } - /** - * Get the current application locale. - * - * @return string - * @static - */ - public static function getLocale() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getLocale(); - } - /** - * Get the current application locale. - * - * @return string - * @static - */ - public static function currentLocale() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->currentLocale(); - } - /** - * Get the current application fallback locale. - * - * @return string - * @static - */ - public static function getFallbackLocale() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getFallbackLocale(); - } - /** - * Set the current application locale. - * - * @param string $locale - * @return void - * @static - */ - public static function setLocale($locale) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->setLocale($locale); - } - /** - * Set the current application fallback locale. - * - * @param string $fallbackLocale - * @return void - * @static - */ - public static function setFallbackLocale($fallbackLocale) - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->setFallbackLocale($fallbackLocale); - } - /** - * Determine if the application locale is the given locale. - * - * @param string $locale - * @return bool - * @static - */ - public static function isLocale($locale) - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isLocale($locale); - } - /** - * Register the core class aliases in the container. - * - * @return void - * @static - */ - public static function registerCoreContainerAliases() - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->registerCoreContainerAliases(); - } - /** - * Flush the container of all bindings and resolved instances. - * - * @return void - * @static - */ - public static function flush() - { - /** @var \Illuminate\Foundation\Application $instance */ - $instance->flush(); - } - /** - * Get the application namespace. - * - * @return string - * @throws \RuntimeException - * @static - */ - public static function getNamespace() - { - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getNamespace(); - } - /** - * Define a contextual binding. - * - * @param array|string $concrete - * @return \Illuminate\Contracts\Container\ContextualBindingBuilder - * @static - */ - public static function when($concrete) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->when($concrete); - } - /** - * Returns true if the container can return an entry for the given identifier. - * - * Returns false otherwise. - * - * `has($id)` returning true does not mean that `get($id)` will not throw an exception. - * It does however mean that `get($id)` will not throw a `NotFoundExceptionInterface`. - * - * @return bool - * @param string $id Identifier of the entry to look for. - * @return bool - * @static - */ - public static function has($id) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->has($id); - } - /** - * Determine if the given abstract type has been resolved. - * - * @param string $abstract - * @return bool - * @static - */ - public static function resolved($abstract) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->resolved($abstract); - } - /** - * Determine if a given type is shared. - * - * @param string $abstract - * @return bool - * @static - */ - public static function isShared($abstract) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isShared($abstract); - } - /** - * Determine if a given string is an alias. - * - * @param string $name - * @return bool - * @static - */ - public static function isAlias($name) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->isAlias($name); - } - /** - * Register a binding with the container. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @param bool $shared - * @return void - * @throws \TypeError - * @static - */ - public static function bind($abstract, $concrete = null, $shared = false) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->bind($abstract, $concrete, $shared); - } - /** - * Determine if the container has a method binding. - * - * @param string $method - * @return bool - * @static - */ - public static function hasMethodBinding($method) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->hasMethodBinding($method); - } - /** - * Bind a callback to resolve with Container::call. - * - * @param array|string $method - * @param \Closure $callback - * @return void - * @static - */ - public static function bindMethod($method, $callback) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->bindMethod($method, $callback); - } - /** - * Get the method binding for the given method. - * - * @param string $method - * @param mixed $instance - * @return mixed - * @static - */ - public static function callMethodBinding($method, $instance) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->callMethodBinding($method, $instance); - } - /** - * Add a contextual binding to the container. - * - * @param string $concrete - * @param string $abstract - * @param \Closure|string $implementation - * @return void - * @static - */ - public static function addContextualBinding($concrete, $abstract, $implementation) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->addContextualBinding($concrete, $abstract, $implementation); - } - /** - * Register a binding if it hasn't already been registered. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @param bool $shared - * @return void - * @static - */ - public static function bindIf($abstract, $concrete = null, $shared = false) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->bindIf($abstract, $concrete, $shared); - } - /** - * Register a shared binding in the container. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @return void - * @static - */ - public static function singleton($abstract, $concrete = null) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->singleton($abstract, $concrete); - } - /** - * Register a shared binding if it hasn't already been registered. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @return void - * @static - */ - public static function singletonIf($abstract, $concrete = null) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->singletonIf($abstract, $concrete); - } - /** - * Register a scoped binding in the container. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @return void - * @static - */ - public static function scoped($abstract, $concrete = null) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->scoped($abstract, $concrete); - } - /** - * Register a scoped binding if it hasn't already been registered. - * - * @param string $abstract - * @param \Closure|string|null $concrete - * @return void - * @static - */ - public static function scopedIf($abstract, $concrete = null) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->scopedIf($abstract, $concrete); - } - /** - * "Extend" an abstract type in the container. - * - * @param string $abstract - * @param \Closure $closure - * @return void - * @throws \InvalidArgumentException - * @static - */ - public static function extend($abstract, $closure) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->extend($abstract, $closure); - } - /** - * Register an existing instance as shared in the container. - * - * @param string $abstract - * @param mixed $instance - * @return mixed - * @static - */ - public static function instance($abstract, $instance) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->instance($abstract, $instance); - } - /** - * Assign a set of tags to a given binding. - * - * @param array|string $abstracts - * @param array|mixed $tags - * @return void - * @static - */ - public static function tag($abstracts, $tags) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->tag($abstracts, $tags); - } - /** - * Resolve all of the bindings for a given tag. - * - * @param string $tag - * @return \Illuminate\Container\iterable - * @static - */ - public static function tagged($tag) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->tagged($tag); - } - /** - * Alias a type to a different name. - * - * @param string $abstract - * @param string $alias - * @return void - * @throws \LogicException - * @static - */ - public static function alias($abstract, $alias) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->alias($abstract, $alias); - } - /** - * Bind a new callback to an abstract's rebind event. - * - * @param string $abstract - * @param \Closure $callback - * @return mixed - * @static - */ - public static function rebinding($abstract, $callback) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->rebinding($abstract, $callback); - } - /** - * Refresh an instance on the given target and method. - * - * @param string $abstract - * @param mixed $target - * @param string $method - * @return mixed - * @static - */ - public static function refresh($abstract, $target, $method) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->refresh($abstract, $target, $method); - } - /** - * Wrap the given closure such that its dependencies will be injected when executed. - * - * @param \Closure $callback - * @param array $parameters - * @return \Closure - * @static - */ - public static function wrap($callback, $parameters = []) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->wrap($callback, $parameters); - } - /** - * Call the given Closure / class@method and inject its dependencies. - * - * @param callable|string $callback - * @param array $parameters - * @param string|null $defaultMethod - * @return mixed - * @throws \InvalidArgumentException - * @static - */ - public static function call($callback, $parameters = [], $defaultMethod = null) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->call($callback, $parameters, $defaultMethod); - } - /** - * Get a closure to resolve the given type from the container. - * - * @param string $abstract - * @return \Closure - * @static - */ - public static function factory($abstract) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->factory($abstract); - } - /** - * An alias function name for make(). - * - * @param string|callable $abstract - * @param array $parameters - * @return mixed - * @throws \Illuminate\Contracts\Container\BindingResolutionException - * @static - */ - public static function makeWith($abstract, $parameters = []) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->makeWith($abstract, $parameters); - } - /** - * Finds an entry of the container by its identifier and returns it. - * - * @return mixed - * @param string $id Identifier of the entry to look for. - * @throws NotFoundExceptionInterface No entry was found for **this** identifier. - * @throws ContainerExceptionInterface Error while retrieving the entry. - * @return mixed Entry. - * @static - */ - public static function get($id) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->get($id); - } - /** - * Instantiate a concrete instance of the given type. - * - * @param \Closure|string $concrete - * @return mixed - * @throws \Illuminate\Contracts\Container\BindingResolutionException - * @throws \Illuminate\Contracts\Container\CircularDependencyException - * @static - */ - public static function build($concrete) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->build($concrete); - } - /** - * Register a new before resolving callback for all types. - * - * @param \Closure|string $abstract - * @param \Closure|null $callback - * @return void - * @static - */ - public static function beforeResolving($abstract, $callback = null) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->beforeResolving($abstract, $callback); - } - /** - * Register a new resolving callback. - * - * @param \Closure|string $abstract - * @param \Closure|null $callback - * @return void - * @static - */ - public static function resolving($abstract, $callback = null) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->resolving($abstract, $callback); - } - /** - * Register a new after resolving callback for all types. - * - * @param \Closure|string $abstract - * @param \Closure|null $callback - * @return void - * @static - */ - public static function afterResolving($abstract, $callback = null) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->afterResolving($abstract, $callback); - } - /** - * Get the container's bindings. - * - * @return array - * @static - */ - public static function getBindings() - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getBindings(); - } - /** - * Get the alias for an abstract if available. - * - * @param string $abstract - * @return string - * @static - */ - public static function getAlias($abstract) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->getAlias($abstract); - } - /** - * Remove all of the extender callbacks for a given type. - * - * @param string $abstract - * @return void - * @static - */ - public static function forgetExtenders($abstract) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->forgetExtenders($abstract); - } - /** - * Remove a resolved instance from the instance cache. - * - * @param string $abstract - * @return void - * @static - */ - public static function forgetInstance($abstract) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->forgetInstance($abstract); - } - /** - * Clear all of the instances from the container. - * - * @return void - * @static - */ - public static function forgetInstances() - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->forgetInstances(); - } - /** - * Clear all of the scoped instances from the container. - * - * @return void - * @static - */ - public static function forgetScopedInstances() - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->forgetScopedInstances(); - } - /** - * Get the globally available instance of the container. - * - * @return static - * @static - */ - public static function getInstance() - { //Method inherited from \Illuminate\Container\Container - return \Illuminate\Foundation\Application::getInstance(); - } - /** - * Set the shared instance of the container. - * - * @param \Illuminate\Contracts\Container\Container|null $container - * @return \Illuminate\Contracts\Container\Container|static - * @static - */ - public static function setInstance($container = null) - { //Method inherited from \Illuminate\Container\Container - return \Illuminate\Foundation\Application::setInstance($container); - } - /** - * Determine if a given offset exists. - * - * @param string $key - * @return bool - * @static - */ - public static function offsetExists($key) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->offsetExists($key); - } - /** - * Get the value at a given offset. - * - * @param string $key - * @return mixed - * @static - */ - public static function offsetGet($key) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - return $instance->offsetGet($key); - } - /** - * Set the value at a given offset. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function offsetSet($key, $value) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->offsetSet($key, $value); - } - /** - * Unset the value at a given offset. - * - * @param string $key - * @return void - * @static - */ - public static function offsetUnset($key) - { //Method inherited from \Illuminate\Container\Container - /** @var \Illuminate\Foundation\Application $instance */ - $instance->offsetUnset($key); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Foundation\Application::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Foundation\Application::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Foundation\Application::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Foundation\Application::flushMacros(); - } - - } - /** - * - * - * @see \Illuminate\Foundation\Console\Kernel - */ - class Artisan { - /** - * Re-route the Symfony command events to their Laravel counterparts. - * - * @internal - * @return \App\Console\Kernel - * @static - */ - public static function rerouteSymfonyCommandEvents() - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - return $instance->rerouteSymfonyCommandEvents(); - } - /** - * Run the console application. - * - * @param \Symfony\Component\Console\Input\InputInterface $input - * @param \Symfony\Component\Console\Output\OutputInterface|null $output - * @return int - * @static - */ - public static function handle($input, $output = null) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - return $instance->handle($input, $output); - } - /** - * Terminate the application. - * - * @param \Symfony\Component\Console\Input\InputInterface $input - * @param int $status - * @return void - * @static - */ - public static function terminate($input, $status) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - $instance->terminate($input, $status); - } - /** - * Register a callback to be invoked when the command lifecycle duration exceeds a given amount of time. - * - * @param \DateTimeInterface|\Carbon\CarbonInterval|float|int $threshold - * @param callable $handler - * @return void - * @static - */ - public static function whenCommandLifecycleIsLongerThan($threshold, $handler) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - $instance->whenCommandLifecycleIsLongerThan($threshold, $handler); - } - /** - * When the command being handled started. - * - * @return \Illuminate\Support\Carbon|null - * @static - */ - public static function commandStartedAt() - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - return $instance->commandStartedAt(); - } - /** - * Register a Closure based command with the application. - * - * @param string $signature - * @param \Closure $callback - * @return \Illuminate\Foundation\Console\ClosureCommand - * @static - */ - public static function command($signature, $callback) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - return $instance->command($signature, $callback); - } - /** - * Register the given command with the console application. - * - * @param \Symfony\Component\Console\Command\Command $command - * @return void - * @static - */ - public static function registerCommand($command) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - $instance->registerCommand($command); - } - /** - * Run an Artisan console command by name. - * - * @param string $command - * @param array $parameters - * @param \Symfony\Component\Console\Output\OutputInterface|null $outputBuffer - * @return int - * @throws \Symfony\Component\Console\Exception\CommandNotFoundException - * @static - */ - public static function call($command, $parameters = [], $outputBuffer = null) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - return $instance->call($command, $parameters, $outputBuffer); - } - /** - * Queue the given console command. - * - * @param string $command - * @param array $parameters - * @return \Illuminate\Foundation\Bus\PendingDispatch - * @static - */ - public static function queue($command, $parameters = []) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - return $instance->queue($command, $parameters); - } - /** - * Get all of the commands registered with the console. - * - * @return array - * @static - */ - public static function all() - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - return $instance->all(); - } - /** - * Get the output for the last run command. - * - * @return string - * @static - */ - public static function output() - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - return $instance->output(); - } - /** - * Bootstrap the application for artisan commands. - * - * @return void - * @static - */ - public static function bootstrap() - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - $instance->bootstrap(); - } - /** - * Bootstrap the application without booting service providers. - * - * @return void - * @static - */ - public static function bootstrapWithoutBootingProviders() - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - $instance->bootstrapWithoutBootingProviders(); - } - /** - * Set the Artisan application instance. - * - * @param \Illuminate\Console\Application|null $artisan - * @return void - * @static - */ - public static function setArtisan($artisan) - { //Method inherited from \Illuminate\Foundation\Console\Kernel - /** @var \App\Console\Kernel $instance */ - $instance->setArtisan($artisan); - } - - } - /** - * - * - * @see \Illuminate\Auth\AuthManager - * @see \Illuminate\Auth\SessionGuard - */ - class Auth { - /** - * Attempt to get the guard from the local cache. - * - * @param string|null $name - * @return \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard - * @static - */ - public static function guard($name = null) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->guard($name); - } - /** - * Create a session based authentication guard. - * - * @param string $name - * @param array $config - * @return \Illuminate\Auth\SessionGuard - * @static - */ - public static function createSessionDriver($name, $config) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->createSessionDriver($name, $config); - } - /** - * Create a token based authentication guard. - * - * @param string $name - * @param array $config - * @return \Illuminate\Auth\TokenGuard - * @static - */ - public static function createTokenDriver($name, $config) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->createTokenDriver($name, $config); - } - /** - * Get the default authentication driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the default guard driver the factory should serve. - * - * @param string $name - * @return void - * @static - */ - public static function shouldUse($name) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - $instance->shouldUse($name); - } - /** - * Set the default authentication driver name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - $instance->setDefaultDriver($name); - } - /** - * Register a new callback based request guard. - * - * @param string $driver - * @param callable $callback - * @return \Illuminate\Auth\AuthManager - * @static - */ - public static function viaRequest($driver, $callback) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->viaRequest($driver, $callback); - } - /** - * Get the user resolver callback. - * - * @return \Closure - * @static - */ - public static function userResolver() - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->userResolver(); - } - /** - * Set the callback to be used to resolve users. - * - * @param \Closure $userResolver - * @return \Illuminate\Auth\AuthManager - * @static - */ - public static function resolveUsersUsing($userResolver) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->resolveUsersUsing($userResolver); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Auth\AuthManager - * @static - */ - public static function extend($driver, $callback) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Register a custom provider creator Closure. - * - * @param string $name - * @param \Closure $callback - * @return \Illuminate\Auth\AuthManager - * @static - */ - public static function provider($name, $callback) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->provider($name, $callback); - } - /** - * Determines if any guards have already been resolved. - * - * @return bool - * @static - */ - public static function hasResolvedGuards() - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->hasResolvedGuards(); - } - /** - * Forget all of the resolved guard instances. - * - * @return \Illuminate\Auth\AuthManager - * @static - */ - public static function forgetGuards() - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->forgetGuards(); - } - /** - * Set the application instance used by the manager. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @return \Illuminate\Auth\AuthManager - * @static - */ - public static function setApplication($app) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->setApplication($app); - } - /** - * Create the user provider implementation for the driver. - * - * @param string|null $provider - * @return \Illuminate\Contracts\Auth\UserProvider|null - * @throws \InvalidArgumentException - * @static - */ - public static function createUserProvider($provider = null) - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->createUserProvider($provider); - } - /** - * Get the default user provider name. - * - * @return string - * @static - */ - public static function getDefaultUserProvider() - { - /** @var \Illuminate\Auth\AuthManager $instance */ - return $instance->getDefaultUserProvider(); - } - /** - * Get the currently authenticated user. - * - * @return \App\Models\User|null - * @static - */ - public static function user() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->user(); - } - /** - * Get the ID for the currently authenticated user. - * - * @return int|string|null - * @static - */ - public static function id() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->id(); - } - /** - * Log a user into the application without sessions or cookies. - * - * @param array $credentials - * @return bool - * @static - */ - public static function once($credentials = []) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->once($credentials); - } - /** - * Log the given user ID into the application without sessions or cookies. - * - * @param mixed $id - * @return \App\Models\User|false - * @static - */ - public static function onceUsingId($id) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->onceUsingId($id); - } - /** - * Validate a user's credentials. - * - * @param array $credentials - * @return bool - * @static - */ - public static function validate($credentials = []) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->validate($credentials); - } - /** - * Attempt to authenticate using HTTP Basic Auth. - * - * @param string $field - * @param array $extraConditions - * @return \Symfony\Component\HttpFoundation\Response|null - * @throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException - * @static - */ - public static function basic($field = 'email', $extraConditions = []) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->basic($field, $extraConditions); - } - /** - * Perform a stateless HTTP Basic login attempt. - * - * @param string $field - * @param array $extraConditions - * @return \Symfony\Component\HttpFoundation\Response|null - * @throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException - * @static - */ - public static function onceBasic($field = 'email', $extraConditions = []) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->onceBasic($field, $extraConditions); - } - /** - * Attempt to authenticate a user using the given credentials. - * - * @param array $credentials - * @param bool $remember - * @return bool - * @static - */ - public static function attempt($credentials = [], $remember = false) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->attempt($credentials, $remember); - } - /** - * Attempt to authenticate a user with credentials and additional callbacks. - * - * @param array $credentials - * @param array|callable|null $callbacks - * @param bool $remember - * @return bool - * @static - */ - public static function attemptWhen($credentials = [], $callbacks = null, $remember = false) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->attemptWhen($credentials, $callbacks, $remember); - } - /** - * Log the given user ID into the application. - * - * @param mixed $id - * @param bool $remember - * @return \App\Models\User|false - * @static - */ - public static function loginUsingId($id, $remember = false) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->loginUsingId($id, $remember); - } - /** - * Log a user into the application. - * - * @param \Illuminate\Contracts\Auth\Authenticatable $user - * @param bool $remember - * @return void - * @static - */ - public static function login($user, $remember = false) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - $instance->login($user, $remember); - } - /** - * Log the user out of the application. - * - * @return void - * @static - */ - public static function logout() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - $instance->logout(); - } - /** - * Log the user out of the application on their current device only. - * - * This method does not cycle the "remember" token. - * - * @return void - * @static - */ - public static function logoutCurrentDevice() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - $instance->logoutCurrentDevice(); - } - /** - * Invalidate other sessions for the current user. - * - * The application must be using the AuthenticateSession middleware. - * - * @param string $password - * @param string $attribute - * @return \App\Models\User|null - * @throws \Illuminate\Auth\AuthenticationException - * @static - */ - public static function logoutOtherDevices($password, $attribute = 'password') - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->logoutOtherDevices($password, $attribute); - } - /** - * Register an authentication attempt event listener. - * - * @param mixed $callback - * @return void - * @static - */ - public static function attempting($callback) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - $instance->attempting($callback); - } - /** - * Get the last user we attempted to authenticate. - * - * @return \App\Models\User - * @static - */ - public static function getLastAttempted() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->getLastAttempted(); - } - /** - * Get a unique identifier for the auth session value. - * - * @return string - * @static - */ - public static function getName() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->getName(); - } - /** - * Get the name of the cookie used to store the "recaller". - * - * @return string - * @static - */ - public static function getRecallerName() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->getRecallerName(); - } - /** - * Determine if the user was authenticated via "remember me" cookie. - * - * @return bool - * @static - */ - public static function viaRemember() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->viaRemember(); - } - /** - * Set the number of minutes the remember me cookie should be valid for. - * - * @param int $minutes - * @return \Illuminate\Auth\SessionGuard - * @static - */ - public static function setRememberDuration($minutes) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->setRememberDuration($minutes); - } - /** - * Get the cookie creator instance used by the guard. - * - * @return \Illuminate\Contracts\Cookie\QueueingFactory - * @throws \RuntimeException - * @static - */ - public static function getCookieJar() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->getCookieJar(); - } - /** - * Set the cookie creator instance used by the guard. - * - * @param \Illuminate\Contracts\Cookie\QueueingFactory $cookie - * @return void - * @static - */ - public static function setCookieJar($cookie) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - $instance->setCookieJar($cookie); - } - /** - * Get the event dispatcher instance. - * - * @return \Illuminate\Contracts\Events\Dispatcher - * @static - */ - public static function getDispatcher() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->getDispatcher(); - } - /** - * Set the event dispatcher instance. - * - * @param \Illuminate\Contracts\Events\Dispatcher $events - * @return void - * @static - */ - public static function setDispatcher($events) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - $instance->setDispatcher($events); - } - /** - * Get the session store used by the guard. - * - * @return \Illuminate\Contracts\Session\Session - * @static - */ - public static function getSession() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->getSession(); - } - /** - * Return the currently cached user. - * - * @return \App\Models\User|null - * @static - */ - public static function getUser() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->getUser(); - } - /** - * Set the current user. - * - * @param \Illuminate\Contracts\Auth\Authenticatable $user - * @return \Illuminate\Auth\SessionGuard - * @static - */ - public static function setUser($user) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->setUser($user); - } - /** - * Get the current request instance. - * - * @return \Symfony\Component\HttpFoundation\Request - * @static - */ - public static function getRequest() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->getRequest(); - } - /** - * Set the current request instance. - * - * @param \Symfony\Component\HttpFoundation\Request $request - * @return \Illuminate\Auth\SessionGuard - * @static - */ - public static function setRequest($request) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->setRequest($request); - } - /** - * Get the timebox instance used by the guard. - * - * @return \Illuminate\Support\Timebox - * @static - */ - public static function getTimebox() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->getTimebox(); - } - /** - * Determine if the current user is authenticated. If not, throw an exception. - * - * @return \App\Models\User - * @throws \Illuminate\Auth\AuthenticationException - * @static - */ - public static function authenticate() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->authenticate(); - } - /** - * Determine if the guard has a user instance. - * - * @return bool - * @static - */ - public static function hasUser() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->hasUser(); - } - /** - * Determine if the current user is authenticated. - * - * @return bool - * @static - */ - public static function check() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->check(); - } - /** - * Determine if the current user is a guest. - * - * @return bool - * @static - */ - public static function guest() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->guest(); - } - /** - * Forget the current user. - * - * @return \Illuminate\Auth\SessionGuard - * @static - */ - public static function forgetUser() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->forgetUser(); - } - /** - * Get the user provider used by the guard. - * - * @return \Illuminate\Contracts\Auth\UserProvider - * @static - */ - public static function getProvider() - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - return $instance->getProvider(); - } - /** - * Set the user provider used by the guard. - * - * @param \Illuminate\Contracts\Auth\UserProvider $provider - * @return void - * @static - */ - public static function setProvider($provider) - { - /** @var \Illuminate\Auth\SessionGuard $instance */ - $instance->setProvider($provider); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Auth\SessionGuard::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Auth\SessionGuard::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Auth\SessionGuard::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Auth\SessionGuard::flushMacros(); - } - - } - /** - * - * - * @see \Illuminate\View\Compilers\BladeCompiler - */ - class Blade { - /** - * Compile the view at the given path. - * - * @param string|null $path - * @return void - * @static - */ - public static function compile($path = null) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->compile($path); - } - /** - * Get the path currently being compiled. - * - * @return string - * @static - */ - public static function getPath() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->getPath(); - } - /** - * Set the path currently being compiled. - * - * @param string $path - * @return void - * @static - */ - public static function setPath($path) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->setPath($path); - } - /** - * Compile the given Blade template contents. - * - * @param string $value - * @return string - * @static - */ - public static function compileString($value) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->compileString($value); - } - /** - * Evaluate and render a Blade string to HTML. - * - * @param string $string - * @param array $data - * @param bool $deleteCachedView - * @return string - * @static - */ - public static function render($string, $data = [], $deleteCachedView = false) - { - return \Illuminate\View\Compilers\BladeCompiler::render($string, $data, $deleteCachedView); - } - /** - * Render a component instance to HTML. - * - * @param \Illuminate\View\Component $component - * @return string - * @static - */ - public static function renderComponent($component) - { - return \Illuminate\View\Compilers\BladeCompiler::renderComponent($component); - } - /** - * Strip the parentheses from the given expression. - * - * @param string $expression - * @return string - * @static - */ - public static function stripParentheses($expression) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->stripParentheses($expression); - } - /** - * Register a custom Blade compiler. - * - * @param callable $compiler - * @return void - * @static - */ - public static function extend($compiler) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->extend($compiler); - } - /** - * Get the extensions used by the compiler. - * - * @return array - * @static - */ - public static function getExtensions() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->getExtensions(); - } - /** - * Register an "if" statement directive. - * - * @param string $name - * @param callable $callback - * @return void - * @static - */ - public static function if($name, $callback) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->if($name, $callback); - } - /** - * Check the result of a condition. - * - * @param string $name - * @param mixed $parameters - * @return bool - * @static - */ - public static function check($name, ...$parameters) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->check($name, ...$parameters); - } - /** - * Register a class-based component alias directive. - * - * @param string $class - * @param string|null $alias - * @param string $prefix - * @return void - * @static - */ - public static function component($class, $alias = null, $prefix = '') - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->component($class, $alias, $prefix); - } - /** - * Register an array of class-based components. - * - * @param array $components - * @param string $prefix - * @return void - * @static - */ - public static function components($components, $prefix = '') - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->components($components, $prefix); - } - /** - * Get the registered class component aliases. - * - * @return array - * @static - */ - public static function getClassComponentAliases() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->getClassComponentAliases(); - } - /** - * Register a new anonymous component path. - * - * @param string $path - * @param string|null $prefix - * @return void - * @static - */ - public static function anonymousComponentPath($path, $prefix = null) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->anonymousComponentPath($path, $prefix); - } - /** - * Register an anonymous component namespace. - * - * @param string $directory - * @param string|null $prefix - * @return void - * @static - */ - public static function anonymousComponentNamespace($directory, $prefix = null) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->anonymousComponentNamespace($directory, $prefix); - } - /** - * Register a class-based component namespace. - * - * @param string $namespace - * @param string $prefix - * @return void - * @static - */ - public static function componentNamespace($namespace, $prefix) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->componentNamespace($namespace, $prefix); - } - /** - * Get the registered anonymous component paths. - * - * @return array - * @static - */ - public static function getAnonymousComponentPaths() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->getAnonymousComponentPaths(); - } - /** - * Get the registered anonymous component namespaces. - * - * @return array - * @static - */ - public static function getAnonymousComponentNamespaces() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->getAnonymousComponentNamespaces(); - } - /** - * Get the registered class component namespaces. - * - * @return array - * @static - */ - public static function getClassComponentNamespaces() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->getClassComponentNamespaces(); - } - /** - * Register a component alias directive. - * - * @param string $path - * @param string|null $alias - * @return void - * @static - */ - public static function aliasComponent($path, $alias = null) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->aliasComponent($path, $alias); - } - /** - * Register an include alias directive. - * - * @param string $path - * @param string|null $alias - * @return void - * @static - */ - public static function include($path, $alias = null) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->include($path, $alias); - } - /** - * Register an include alias directive. - * - * @param string $path - * @param string|null $alias - * @return void - * @static - */ - public static function aliasInclude($path, $alias = null) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->aliasInclude($path, $alias); - } - /** - * Register a handler for custom directives. - * - * @param string $name - * @param callable $handler - * @return void - * @throws \InvalidArgumentException - * @static - */ - public static function directive($name, $handler) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->directive($name, $handler); - } - /** - * Get the list of custom directives. - * - * @return array - * @static - */ - public static function getCustomDirectives() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->getCustomDirectives(); - } - /** - * Indicate that the following callable should be used to prepare strings for compilation. - * - * @param callable $callback - * @return \Illuminate\View\Compilers\BladeCompiler - * @static - */ - public static function prepareStringsForCompilationUsing($callback) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->prepareStringsForCompilationUsing($callback); - } - /** - * Register a new precompiler. - * - * @param callable $precompiler - * @return void - * @static - */ - public static function precompiler($precompiler) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->precompiler($precompiler); - } - /** - * Set the echo format to be used by the compiler. - * - * @param string $format - * @return void - * @static - */ - public static function setEchoFormat($format) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->setEchoFormat($format); - } - /** - * Set the "echo" format to double encode entities. - * - * @return void - * @static - */ - public static function withDoubleEncoding() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->withDoubleEncoding(); - } - /** - * Set the "echo" format to not double encode entities. - * - * @return void - * @static - */ - public static function withoutDoubleEncoding() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->withoutDoubleEncoding(); - } - /** - * Indicate that component tags should not be compiled. - * - * @return void - * @static - */ - public static function withoutComponentTags() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->withoutComponentTags(); - } - /** - * Get the path to the compiled version of a view. - * - * @param string $path - * @return string - * @static - */ - public static function getCompiledPath($path) - { //Method inherited from \Illuminate\View\Compilers\Compiler - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->getCompiledPath($path); - } - /** - * Determine if the view at the given path is expired. - * - * @param string $path - * @return bool - * @throws \ErrorException - * @static - */ - public static function isExpired($path) - { //Method inherited from \Illuminate\View\Compilers\Compiler - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->isExpired($path); - } - /** - * Get a new component hash for a component name. - * - * @param string $component - * @return string - * @static - */ - public static function newComponentHash($component) - { - return \Illuminate\View\Compilers\BladeCompiler::newComponentHash($component); - } - /** - * Compile a class component opening. - * - * @param string $component - * @param string $alias - * @param string $data - * @param string $hash - * @return string - * @static - */ - public static function compileClassComponentOpening($component, $alias, $data, $hash) - { - return \Illuminate\View\Compilers\BladeCompiler::compileClassComponentOpening($component, $alias, $data, $hash); - } - /** - * Compile the end-component statements into valid PHP. - * - * @return string - * @static - */ - public static function compileEndComponentClass() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->compileEndComponentClass(); - } - /** - * Sanitize the given component attribute value. - * - * @param mixed $value - * @return mixed - * @static - */ - public static function sanitizeComponentAttribute($value) - { - return \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value); - } - /** - * Compile an end-once block into valid PHP. - * - * @return string - * @static - */ - public static function compileEndOnce() - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->compileEndOnce(); - } - /** - * Add a handler to be executed before echoing a given class. - * - * @param string|callable $class - * @param callable|null $handler - * @return void - * @static - */ - public static function stringable($class, $handler = null) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->stringable($class, $handler); - } - /** - * Compile Blade echos into valid PHP. - * - * @param string $value - * @return string - * @static - */ - public static function compileEchos($value) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->compileEchos($value); - } - /** - * Apply the echo handler for the value if it exists. - * - * @param string $value - * @return string - * @static - */ - public static function applyEchoHandler($value) - { - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->applyEchoHandler($value); - } - - } - /** - * - * - * @method static mixed auth(\Illuminate\Http\Request $request) - * @method static mixed validAuthenticationResponse(\Illuminate\Http\Request $request, mixed $result) - * @method static void broadcast(array $channels, string $event, array $payload = []) - * @method static array|null resolveAuthenticatedUser(\Illuminate\Http\Request $request) - * @method static void resolveAuthenticatedUserUsing(\Closure $callback) - * @method static \Illuminate\Broadcasting\Broadcasters\Broadcaster channel(\Illuminate\Contracts\Broadcasting\HasBroadcastChannel|string $channel, callable|string $callback, array $options = []) - * @method static \Illuminate\Support\Collection getChannels() - * @see \Illuminate\Broadcasting\BroadcastManager - * @see \Illuminate\Broadcasting\Broadcasters\Broadcaster - */ - class Broadcast { - /** - * Register the routes for handling broadcast channel authentication and sockets. - * - * @param array|null $attributes - * @return void - * @static - */ - public static function routes($attributes = null) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - $instance->routes($attributes); - } - /** - * Register the routes for handling broadcast user authentication. - * - * @param array|null $attributes - * @return void - * @static - */ - public static function userRoutes($attributes = null) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - $instance->userRoutes($attributes); - } - /** - * Register the routes for handling broadcast authentication and sockets. - * - * Alias of "routes" method. - * - * @param array|null $attributes - * @return void - * @static - */ - public static function channelRoutes($attributes = null) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - $instance->channelRoutes($attributes); - } - /** - * Get the socket ID for the given request. - * - * @param \Illuminate\Http\Request|null $request - * @return string|null - * @static - */ - public static function socket($request = null) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->socket($request); - } - /** - * Begin broadcasting an event. - * - * @param mixed|null $event - * @return \Illuminate\Broadcasting\PendingBroadcast - * @static - */ - public static function event($event = null) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->event($event); - } - /** - * Queue the given event for broadcast. - * - * @param mixed $event - * @return void - * @static - */ - public static function queue($event) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - $instance->queue($event); - } - /** - * Get a driver instance. - * - * @param string|null $driver - * @return mixed - * @static - */ - public static function connection($driver = null) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->connection($driver); - } - /** - * Get a driver instance. - * - * @param string|null $name - * @return mixed - * @static - */ - public static function driver($name = null) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->driver($name); - } - /** - * Get a Pusher instance for the given configuration. - * - * @param array $config - * @return \Pusher\Pusher - * @static - */ - public static function pusher($config) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->pusher($config); - } - /** - * Get an Ably instance for the given configuration. - * - * @param array $config - * @return \Ably\AblyRest - * @static - */ - public static function ably($config) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->ably($config); - } - /** - * Get the default driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the default driver name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - $instance->setDefaultDriver($name); - } - /** - * Disconnect the given disk and remove from local cache. - * - * @param string|null $name - * @return void - * @static - */ - public static function purge($name = null) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - $instance->purge($name); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Broadcasting\BroadcastManager - * @static - */ - public static function extend($driver, $callback) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Get the application instance used by the manager. - * - * @return \Illuminate\Contracts\Foundation\Application - * @static - */ - public static function getApplication() - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->getApplication(); - } - /** - * Set the application instance used by the manager. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @return \Illuminate\Broadcasting\BroadcastManager - * @static - */ - public static function setApplication($app) - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->setApplication($app); - } - /** - * Forget all of the resolved driver instances. - * - * @return \Illuminate\Broadcasting\BroadcastManager - * @static - */ - public static function forgetDrivers() - { - /** @var \Illuminate\Broadcasting\BroadcastManager $instance */ - return $instance->forgetDrivers(); - } - - } - /** - * - * - * @see \Illuminate\Bus\Dispatcher - * @see \Illuminate\Support\Testing\Fakes\BusFake - */ - class Bus { - /** - * Dispatch a command to its appropriate handler. - * - * @param mixed $command - * @return mixed - * @static - */ - public static function dispatch($command) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->dispatch($command); - } - /** - * Dispatch a command to its appropriate handler in the current process. - * - * Queueable jobs will be dispatched to the "sync" queue. - * - * @param mixed $command - * @param mixed $handler - * @return mixed - * @static - */ - public static function dispatchSync($command, $handler = null) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->dispatchSync($command, $handler); - } - /** - * Dispatch a command to its appropriate handler in the current process without using the synchronous queue. - * - * @param mixed $command - * @param mixed $handler - * @return mixed - * @static - */ - public static function dispatchNow($command, $handler = null) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->dispatchNow($command, $handler); - } - /** - * Attempt to find the batch with the given ID. - * - * @param string $batchId - * @return \Illuminate\Bus\Batch|null - * @static - */ - public static function findBatch($batchId) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->findBatch($batchId); - } - /** - * Create a new batch of queueable jobs. - * - * @param \Illuminate\Support\Collection|array|mixed $jobs - * @return \Illuminate\Bus\PendingBatch - * @static - */ - public static function batch($jobs) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->batch($jobs); - } - /** - * Create a new chain of queueable jobs. - * - * @param \Illuminate\Support\Collection|array $jobs - * @return \Illuminate\Foundation\Bus\PendingChain - * @static - */ - public static function chain($jobs) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->chain($jobs); - } - /** - * Determine if the given command has a handler. - * - * @param mixed $command - * @return bool - * @static - */ - public static function hasCommandHandler($command) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->hasCommandHandler($command); - } - /** - * Retrieve the handler for a command. - * - * @param mixed $command - * @return bool|mixed - * @static - */ - public static function getCommandHandler($command) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->getCommandHandler($command); - } - /** - * Dispatch a command to its appropriate handler behind a queue. - * - * @param mixed $command - * @return mixed - * @throws \RuntimeException - * @static - */ - public static function dispatchToQueue($command) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->dispatchToQueue($command); - } - /** - * Dispatch a command to its appropriate handler after the current process. - * - * @param mixed $command - * @param mixed $handler - * @return void - * @static - */ - public static function dispatchAfterResponse($command, $handler = null) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - $instance->dispatchAfterResponse($command, $handler); - } - /** - * Set the pipes through which commands should be piped before dispatching. - * - * @param array $pipes - * @return \Illuminate\Bus\Dispatcher - * @static - */ - public static function pipeThrough($pipes) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->pipeThrough($pipes); - } - /** - * Map a command to a handler. - * - * @param array $map - * @return \Illuminate\Bus\Dispatcher - * @static - */ - public static function map($map) - { - /** @var \Illuminate\Bus\Dispatcher $instance */ - return $instance->map($map); - } - /** - * Specify the jobs that should be dispatched instead of faked. - * - * @param array|string $jobsToDispatch - * @return \Illuminate\Support\Testing\Fakes\BusFake - * @static - */ - public static function except($jobsToDispatch) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->except($jobsToDispatch); - } - /** - * Assert if a job was dispatched based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|int|null $callback - * @return void - * @static - */ - public static function assertDispatched($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertDispatched($command, $callback); - } - /** - * Assert if a job was pushed a number of times. - * - * @param string|\Closure $command - * @param int $times - * @return void - * @static - */ - public static function assertDispatchedTimes($command, $times = 1) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertDispatchedTimes($command, $times); - } - /** - * Determine if a job was dispatched based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|null $callback - * @return void - * @static - */ - public static function assertNotDispatched($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertNotDispatched($command, $callback); - } - /** - * Assert that no jobs were dispatched. - * - * @return void - * @static - */ - public static function assertNothingDispatched() - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertNothingDispatched(); - } - /** - * Assert if a job was explicitly dispatched synchronously based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|int|null $callback - * @return void - * @static - */ - public static function assertDispatchedSync($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertDispatchedSync($command, $callback); - } - /** - * Assert if a job was pushed synchronously a number of times. - * - * @param string|\Closure $command - * @param int $times - * @return void - * @static - */ - public static function assertDispatchedSyncTimes($command, $times = 1) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertDispatchedSyncTimes($command, $times); - } - /** - * Determine if a job was dispatched based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|null $callback - * @return void - * @static - */ - public static function assertNotDispatchedSync($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertNotDispatchedSync($command, $callback); - } - /** - * Assert if a job was dispatched after the response was sent based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|int|null $callback - * @return void - * @static - */ - public static function assertDispatchedAfterResponse($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertDispatchedAfterResponse($command, $callback); - } - /** - * Assert if a job was pushed after the response was sent a number of times. - * - * @param string|\Closure $command - * @param int $times - * @return void - * @static - */ - public static function assertDispatchedAfterResponseTimes($command, $times = 1) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertDispatchedAfterResponseTimes($command, $times); - } - /** - * Determine if a job was dispatched based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|null $callback - * @return void - * @static - */ - public static function assertNotDispatchedAfterResponse($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertNotDispatchedAfterResponse($command, $callback); - } - /** - * Assert if a chain of jobs was dispatched. - * - * @param array $expectedChain - * @return void - * @static - */ - public static function assertChained($expectedChain) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertChained($expectedChain); - } - /** - * Assert if a job was dispatched with an empty chain based on a truth-test callback. - * - * @param string|\Closure $command - * @param callable|null $callback - * @return void - * @static - */ - public static function assertDispatchedWithoutChain($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertDispatchedWithoutChain($command, $callback); - } - /** - * Assert if a batch was dispatched based on a truth-test callback. - * - * @param callable $callback - * @return void - * @static - */ - public static function assertBatched($callback) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertBatched($callback); - } - /** - * Assert the number of batches that have been dispatched. - * - * @param int $count - * @return void - * @static - */ - public static function assertBatchCount($count) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertBatchCount($count); - } - /** - * Assert that no batched jobs were dispatched. - * - * @return void - * @static - */ - public static function assertNothingBatched() - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - $instance->assertNothingBatched(); - } - /** - * Get all of the jobs matching a truth-test callback. - * - * @param string $command - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function dispatched($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->dispatched($command, $callback); - } - /** - * Get all of the jobs dispatched synchronously matching a truth-test callback. - * - * @param string $command - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function dispatchedSync($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->dispatchedSync($command, $callback); - } - /** - * Get all of the jobs dispatched after the response was sent matching a truth-test callback. - * - * @param string $command - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function dispatchedAfterResponse($command, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->dispatchedAfterResponse($command, $callback); - } - /** - * Get all of the pending batches matching a truth-test callback. - * - * @param callable $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function batched($callback) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->batched($callback); - } - /** - * Determine if there are any stored commands for a given class. - * - * @param string $command - * @return bool - * @static - */ - public static function hasDispatched($command) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->hasDispatched($command); - } - /** - * Determine if there are any stored commands for a given class. - * - * @param string $command - * @return bool - * @static - */ - public static function hasDispatchedSync($command) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->hasDispatchedSync($command); - } - /** - * Determine if there are any stored commands for a given class. - * - * @param string $command - * @return bool - * @static - */ - public static function hasDispatchedAfterResponse($command) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->hasDispatchedAfterResponse($command); - } - /** - * Dispatch an empty job batch for testing. - * - * @param string $name - * @return \Illuminate\Bus\Batch - * @static - */ - public static function dispatchFakeBatch($name = '') - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->dispatchFakeBatch($name); - } - /** - * Record the fake pending batch dispatch. - * - * @param \Illuminate\Bus\PendingBatch $pendingBatch - * @return \Illuminate\Bus\Batch - * @static - */ - public static function recordPendingBatch($pendingBatch) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->recordPendingBatch($pendingBatch); - } - /** - * Specify if commands should be serialized and restored when being batched. - * - * @param bool $serializeAndRestore - * @return \Illuminate\Support\Testing\Fakes\BusFake - * @static - */ - public static function serializeAndRestore($serializeAndRestore = true) - { - /** @var \Illuminate\Support\Testing\Fakes\BusFake $instance */ - return $instance->serializeAndRestore($serializeAndRestore); - } - - } - /** - * - * - * @see \Illuminate\Cache\CacheManager - * @mixin \Illuminate\Cache\Repository - */ - class Cache { - /** - * Get a cache store instance by name, wrapped in a repository. - * - * @param string|null $name - * @return \Illuminate\Contracts\Cache\Repository - * @static - */ - public static function store($name = null) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->store($name); - } - /** - * Get a cache driver instance. - * - * @param string|null $driver - * @return \Illuminate\Contracts\Cache\Repository - * @static - */ - public static function driver($driver = null) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->driver($driver); - } - /** - * Resolve the given store. - * - * @param string $name - * @return \Illuminate\Contracts\Cache\Repository - * @throws \InvalidArgumentException - * @static - */ - public static function resolve($name) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->resolve($name); - } - /** - * Create a new cache repository with the given implementation. - * - * @param \Illuminate\Contracts\Cache\Store $store - * @return \Illuminate\Cache\Repository - * @static - */ - public static function repository($store) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->repository($store); - } - /** - * Re-set the event dispatcher on all resolved cache repositories. - * - * @return void - * @static - */ - public static function refreshEventDispatcher() - { - /** @var \Illuminate\Cache\CacheManager $instance */ - $instance->refreshEventDispatcher(); - } - /** - * Get the default cache driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the default cache driver name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - $instance->setDefaultDriver($name); - } - /** - * Unset the given driver instances. - * - * @param array|string|null $name - * @return \Illuminate\Cache\CacheManager - * @static - */ - public static function forgetDriver($name = null) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->forgetDriver($name); - } - /** - * Disconnect the given driver and remove from local cache. - * - * @param string|null $name - * @return void - * @static - */ - public static function purge($name = null) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - $instance->purge($name); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Cache\CacheManager - * @static - */ - public static function extend($driver, $callback) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Set the application instance used by the manager. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @return \Illuminate\Cache\CacheManager - * @static - */ - public static function setApplication($app) - { - /** @var \Illuminate\Cache\CacheManager $instance */ - return $instance->setApplication($app); - } - /** - * Determine if an item exists in the cache. - * - * @param array|string $key - * @return bool - * @static - */ - public static function has($key) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->has($key); - } - /** - * Determine if an item doesn't exist in the cache. - * - * @param string $key - * @return bool - * @static - */ - public static function missing($key) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->missing($key); - } - /** - * Retrieve an item from the cache by key. - * - * @template TCacheValue - * @param array|string $key - * @param \Illuminate\Cache\TCacheValue|\Illuminate\Cache\(\Closure(): TCacheValue) $default - * @return \Illuminate\Cache\(TCacheValue is null ? mixed : TCacheValue) - * @static - */ - public static function get($key, $default = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->get($key, $default); - } - /** - * Retrieve multiple items from the cache by key. - * - * Items not found in the cache will have a null value. - * - * @param array $keys - * @return array - * @static - */ - public static function many($keys) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->many($keys); - } - /** - * Obtains multiple cache items by their unique keys. - * - * @return \Illuminate\Cache\iterable - * @param \Psr\SimpleCache\iterable $keys A list of keys that can be obtained in a single operation. - * @param mixed $default Default value to return for keys that do not exist. - * @return \Psr\SimpleCache\iterable A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value. - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $keys is neither an array nor a Traversable, - * or if any of the $keys are not a legal value. - * @static - */ - public static function getMultiple($keys, $default = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->getMultiple($keys, $default); - } - /** - * Retrieve an item from the cache and delete it. - * - * @template TCacheValue - * @param array|string $key - * @param \Illuminate\Cache\TCacheValue|\Illuminate\Cache\(\Closure(): TCacheValue) $default - * @return \Illuminate\Cache\(TCacheValue is null ? mixed : TCacheValue) - * @static - */ - public static function pull($key, $default = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->pull($key, $default); - } - /** - * Store an item in the cache. - * - * @param array|string $key - * @param mixed $value - * @param \DateTimeInterface|\DateInterval|int|null $ttl - * @return bool - * @static - */ - public static function put($key, $value, $ttl = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->put($key, $value, $ttl); - } - /** - * Persists data in the cache, uniquely referenced by a key with an optional expiration TTL time. - * - * @return bool - * @param string $key The key of the item to store. - * @param mixed $value The value of the item to store, must be serializable. - * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and - * the driver supports TTL then the library may set a default value - * for it or let the driver take care of that. - * @return bool True on success and false on failure. - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if the $key string is not a legal value. - * @static - */ - public static function set($key, $value, $ttl = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->set($key, $value, $ttl); - } - /** - * Store multiple items in the cache for a given number of seconds. - * - * @param array $values - * @param \DateTimeInterface|\DateInterval|int|null $ttl - * @return bool - * @static - */ - public static function putMany($values, $ttl = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->putMany($values, $ttl); - } - /** - * Persists a set of key => value pairs in the cache, with an optional TTL. - * - * @return bool - * @param \Psr\SimpleCache\iterable $values A list of key => value pairs for a multiple-set operation. - * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and - * the driver supports TTL then the library may set a default value - * for it or let the driver take care of that. - * @return bool True on success and false on failure. - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $values is neither an array nor a Traversable, - * or if any of the $values are not a legal value. - * @static - */ - public static function setMultiple($values, $ttl = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->setMultiple($values, $ttl); - } - /** - * Store an item in the cache if the key does not exist. - * - * @param string $key - * @param mixed $value - * @param \DateTimeInterface|\DateInterval|int|null $ttl - * @return bool - * @static - */ - public static function add($key, $value, $ttl = null) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->add($key, $value, $ttl); - } - /** - * Increment the value of an item in the cache. - * - * @param string $key - * @param mixed $value - * @return int|bool - * @static - */ - public static function increment($key, $value = 1) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->increment($key, $value); - } - /** - * Decrement the value of an item in the cache. - * - * @param string $key - * @param mixed $value - * @return int|bool - * @static - */ - public static function decrement($key, $value = 1) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->decrement($key, $value); - } - /** - * Store an item in the cache indefinitely. - * - * @param string $key - * @param mixed $value - * @return bool - * @static - */ - public static function forever($key, $value) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->forever($key, $value); - } - /** - * Get an item from the cache, or execute the given Closure and store the result. - * - * @template TCacheValue - * @param string $key - * @param \Closure|\DateTimeInterface|\DateInterval|int|null $ttl - * @param \Closure(): TCacheValue $callback - * @return \Illuminate\Cache\TCacheValue - * @static - */ - public static function remember($key, $ttl, $callback) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->remember($key, $ttl, $callback); - } - /** - * Get an item from the cache, or execute the given Closure and store the result forever. - * - * @template TCacheValue - * @param string $key - * @param \Closure(): TCacheValue $callback - * @return \Illuminate\Cache\TCacheValue - * @static - */ - public static function sear($key, $callback) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->sear($key, $callback); - } - /** - * Get an item from the cache, or execute the given Closure and store the result forever. - * - * @template TCacheValue - * @param string $key - * @param \Closure(): TCacheValue $callback - * @return \Illuminate\Cache\TCacheValue - * @static - */ - public static function rememberForever($key, $callback) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->rememberForever($key, $callback); - } - /** - * Remove an item from the cache. - * - * @param string $key - * @return bool - * @static - */ - public static function forget($key) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->forget($key); - } - /** - * Delete an item from the cache by its unique key. - * - * @return bool - * @param string $key The unique cache key of the item to delete. - * @return bool True if the item was successfully removed. False if there was an error. - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if the $key string is not a legal value. - * @static - */ - public static function delete($key) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->delete($key); - } - /** - * Deletes multiple cache items in a single operation. - * - * @return bool - * @param \Psr\SimpleCache\iterable $keys A list of string-based keys to be deleted. - * @return bool True if the items were successfully removed. False if there was an error. - * @throws \Psr\SimpleCache\InvalidArgumentException - * MUST be thrown if $keys is neither an array nor a Traversable, - * or if any of the $keys are not a legal value. - * @static - */ - public static function deleteMultiple($keys) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->deleteMultiple($keys); - } - /** - * Wipes clean the entire cache's keys. - * - * @return bool - * @return bool True on success and false on failure. - * @static - */ - public static function clear() - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->clear(); - } - /** - * Begin executing a new tags operation if the store supports it. - * - * @param array|mixed $names - * @return \Illuminate\Cache\TaggedCache - * @throws \BadMethodCallException - * @static - */ - public static function tags($names) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->tags($names); - } - /** - * Determine if the current store supports tags. - * - * @return bool - * @static - */ - public static function supportsTags() - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->supportsTags(); - } - /** - * Get the default cache time. - * - * @return int|null - * @static - */ - public static function getDefaultCacheTime() - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->getDefaultCacheTime(); - } - /** - * Set the default cache time in seconds. - * - * @param int|null $seconds - * @return \Illuminate\Cache\Repository - * @static - */ - public static function setDefaultCacheTime($seconds) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->setDefaultCacheTime($seconds); - } - /** - * Get the cache store implementation. - * - * @return \Illuminate\Contracts\Cache\Store - * @static - */ - public static function getStore() - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->getStore(); - } - /** - * Set the cache store implementation. - * - * @param \Illuminate\Contracts\Cache\Store $store - * @return static - * @static - */ - public static function setStore($store) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->setStore($store); - } - /** - * Get the event dispatcher instance. - * - * @return \Illuminate\Contracts\Events\Dispatcher - * @static - */ - public static function getEventDispatcher() - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->getEventDispatcher(); - } - /** - * Set the event dispatcher instance. - * - * @param \Illuminate\Contracts\Events\Dispatcher $events - * @return void - * @static - */ - public static function setEventDispatcher($events) - { - /** @var \Illuminate\Cache\Repository $instance */ - $instance->setEventDispatcher($events); - } - /** - * Determine if a cached value exists. - * - * @param string $key - * @return bool - * @static - */ - public static function offsetExists($key) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->offsetExists($key); - } - /** - * Retrieve an item from the cache by key. - * - * @param string $key - * @return mixed - * @static - */ - public static function offsetGet($key) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->offsetGet($key); - } - /** - * Store an item in the cache for the default time. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function offsetSet($key, $value) - { - /** @var \Illuminate\Cache\Repository $instance */ - $instance->offsetSet($key, $value); - } - /** - * Remove an item from the cache. - * - * @param string $key - * @return void - * @static - */ - public static function offsetUnset($key) - { - /** @var \Illuminate\Cache\Repository $instance */ - $instance->offsetUnset($key); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Cache\Repository::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Cache\Repository::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Cache\Repository::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Cache\Repository::flushMacros(); - } - /** - * Dynamically handle calls to the class. - * - * @param string $method - * @param array $parameters - * @return mixed - * @throws \BadMethodCallException - * @static - */ - public static function macroCall($method, $parameters) - { - /** @var \Illuminate\Cache\Repository $instance */ - return $instance->macroCall($method, $parameters); - } - /** - * Get a lock instance. - * - * @param string $name - * @param int $seconds - * @param string|null $owner - * @return \Illuminate\Contracts\Cache\Lock - * @static - */ - public static function lock($name, $seconds = 0, $owner = null) - { - /** @var \Illuminate\Cache\RedisStore $instance */ - return $instance->lock($name, $seconds, $owner); - } - /** - * Restore a lock instance using the owner identifier. - * - * @param string $name - * @param string $owner - * @return \Illuminate\Contracts\Cache\Lock - * @static - */ - public static function restoreLock($name, $owner) - { - /** @var \Illuminate\Cache\RedisStore $instance */ - return $instance->restoreLock($name, $owner); - } - /** - * Remove all items from the cache. - * - * @return bool - * @static - */ - public static function flush() - { - /** @var \Illuminate\Cache\RedisStore $instance */ - return $instance->flush(); - } - /** - * Remove all expired tag set entries. - * - * @return void - * @static - */ - public static function flushStaleTags() - { - /** @var \Illuminate\Cache\RedisStore $instance */ - $instance->flushStaleTags(); - } - /** - * Get the Redis connection instance. - * - * @return \Illuminate\Redis\Connections\Connection - * @static - */ - public static function connection() - { - /** @var \Illuminate\Cache\RedisStore $instance */ - return $instance->connection(); - } - /** - * Get the Redis connection instance that should be used to manage locks. - * - * @return \Illuminate\Redis\Connections\Connection - * @static - */ - public static function lockConnection() - { - /** @var \Illuminate\Cache\RedisStore $instance */ - return $instance->lockConnection(); - } - /** - * Specify the name of the connection that should be used to store data. - * - * @param string $connection - * @return void - * @static - */ - public static function setConnection($connection) - { - /** @var \Illuminate\Cache\RedisStore $instance */ - $instance->setConnection($connection); - } - /** - * Specify the name of the connection that should be used to manage locks. - * - * @param string $connection - * @return \Illuminate\Cache\RedisStore - * @static - */ - public static function setLockConnection($connection) - { - /** @var \Illuminate\Cache\RedisStore $instance */ - return $instance->setLockConnection($connection); - } - /** - * Get the Redis database instance. - * - * @return \Illuminate\Contracts\Redis\Factory - * @static - */ - public static function getRedis() - { - /** @var \Illuminate\Cache\RedisStore $instance */ - return $instance->getRedis(); - } - /** - * Get the cache key prefix. - * - * @return string - * @static - */ - public static function getPrefix() - { - /** @var \Illuminate\Cache\RedisStore $instance */ - return $instance->getPrefix(); - } - /** - * Set the cache key prefix. - * - * @param string $prefix - * @return void - * @static - */ - public static function setPrefix($prefix) - { - /** @var \Illuminate\Cache\RedisStore $instance */ - $instance->setPrefix($prefix); - } - - } - /** - * - * - * @see \Illuminate\Config\Repository - */ - class Config { - /** - * Determine if the given configuration value exists. - * - * @param string $key - * @return bool - * @static - */ - public static function has($key) - { - /** @var \Illuminate\Config\Repository $instance */ - return $instance->has($key); - } - /** - * Get the specified configuration value. - * - * @param array|string $key - * @param mixed $default - * @return mixed - * @static - */ - public static function get($key, $default = null) - { - /** @var \Illuminate\Config\Repository $instance */ - return $instance->get($key, $default); - } - /** - * Get many configuration values. - * - * @param array $keys - * @return array - * @static - */ - public static function getMany($keys) - { - /** @var \Illuminate\Config\Repository $instance */ - return $instance->getMany($keys); - } - /** - * Set a given configuration value. - * - * @param array|string $key - * @param mixed $value - * @return void - * @static - */ - public static function set($key, $value = null) - { - /** @var \Illuminate\Config\Repository $instance */ - $instance->set($key, $value); - } - /** - * Prepend a value onto an array configuration value. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function prepend($key, $value) - { - /** @var \Illuminate\Config\Repository $instance */ - $instance->prepend($key, $value); - } - /** - * Push a value onto an array configuration value. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function push($key, $value) - { - /** @var \Illuminate\Config\Repository $instance */ - $instance->push($key, $value); - } - /** - * Get all of the configuration items for the application. - * - * @return array - * @static - */ - public static function all() - { - /** @var \Illuminate\Config\Repository $instance */ - return $instance->all(); - } - /** - * Determine if the given configuration option exists. - * - * @param string $key - * @return bool - * @static - */ - public static function offsetExists($key) - { - /** @var \Illuminate\Config\Repository $instance */ - return $instance->offsetExists($key); - } - /** - * Get a configuration option. - * - * @param string $key - * @return mixed - * @static - */ - public static function offsetGet($key) - { - /** @var \Illuminate\Config\Repository $instance */ - return $instance->offsetGet($key); - } - /** - * Set a configuration option. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function offsetSet($key, $value) - { - /** @var \Illuminate\Config\Repository $instance */ - $instance->offsetSet($key, $value); - } - /** - * Unset a configuration option. - * - * @param string $key - * @return void - * @static - */ - public static function offsetUnset($key) - { - /** @var \Illuminate\Config\Repository $instance */ - $instance->offsetUnset($key); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Config\Repository::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Config\Repository::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Config\Repository::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Config\Repository::flushMacros(); - } - - } - /** - * - * - * @see \Illuminate\Cookie\CookieJar - */ - class Cookie { - /** - * Create a new cookie instance. - * - * @param string $name - * @param string $value - * @param int $minutes - * @param string|null $path - * @param string|null $domain - * @param bool|null $secure - * @param bool $httpOnly - * @param bool $raw - * @param string|null $sameSite - * @return \Symfony\Component\HttpFoundation\Cookie - * @static - */ - public static function make($name, $value, $minutes = 0, $path = null, $domain = null, $secure = null, $httpOnly = true, $raw = false, $sameSite = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->make($name, $value, $minutes, $path, $domain, $secure, $httpOnly, $raw, $sameSite); - } - /** - * Create a cookie that lasts "forever" (400 days). - * - * @param string $name - * @param string $value - * @param string|null $path - * @param string|null $domain - * @param bool|null $secure - * @param bool $httpOnly - * @param bool $raw - * @param string|null $sameSite - * @return \Symfony\Component\HttpFoundation\Cookie - * @static - */ - public static function forever($name, $value, $path = null, $domain = null, $secure = null, $httpOnly = true, $raw = false, $sameSite = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->forever($name, $value, $path, $domain, $secure, $httpOnly, $raw, $sameSite); - } - /** - * Expire the given cookie. - * - * @param string $name - * @param string|null $path - * @param string|null $domain - * @return \Symfony\Component\HttpFoundation\Cookie - * @static - */ - public static function forget($name, $path = null, $domain = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->forget($name, $path, $domain); - } - /** - * Determine if a cookie has been queued. - * - * @param string $key - * @param string|null $path - * @return bool - * @static - */ - public static function hasQueued($key, $path = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->hasQueued($key, $path); - } - /** - * Get a queued cookie instance. - * - * @param string $key - * @param mixed $default - * @param string|null $path - * @return \Symfony\Component\HttpFoundation\Cookie|null - * @static - */ - public static function queued($key, $default = null, $path = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->queued($key, $default, $path); - } - /** - * Queue a cookie to send with the next response. - * - * @param mixed $parameters - * @return void - * @static - */ - public static function queue(...$parameters) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - $instance->queue(...$parameters); - } - /** - * Queue a cookie to expire with the next response. - * - * @param string $name - * @param string|null $path - * @param string|null $domain - * @return void - * @static - */ - public static function expire($name, $path = null, $domain = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - $instance->expire($name, $path, $domain); - } - /** - * Remove a cookie from the queue. - * - * @param string $name - * @param string|null $path - * @return void - * @static - */ - public static function unqueue($name, $path = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - $instance->unqueue($name, $path); - } - /** - * Set the default path and domain for the jar. - * - * @param string $path - * @param string|null $domain - * @param bool|null $secure - * @param string|null $sameSite - * @return \Illuminate\Cookie\CookieJar - * @static - */ - public static function setDefaultPathAndDomain($path, $domain, $secure = false, $sameSite = null) - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->setDefaultPathAndDomain($path, $domain, $secure, $sameSite); - } - /** - * Get the cookies which have been queued for the next request. - * - * @return \Symfony\Component\HttpFoundation\Cookie[] - * @static - */ - public static function getQueuedCookies() - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->getQueuedCookies(); - } - /** - * Flush the cookies which have been queued for the next request. - * - * @return \Illuminate\Cookie\CookieJar - * @static - */ - public static function flushQueuedCookies() - { - /** @var \Illuminate\Cookie\CookieJar $instance */ - return $instance->flushQueuedCookies(); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Cookie\CookieJar::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Cookie\CookieJar::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Cookie\CookieJar::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Cookie\CookieJar::flushMacros(); - } - - } - /** - * - * - * @see \Illuminate\Encryption\Encrypter - */ - class Crypt { - /** - * Determine if the given key and cipher combination is valid. - * - * @param string $key - * @param string $cipher - * @return bool - * @static - */ - public static function supported($key, $cipher) - { - return \Illuminate\Encryption\Encrypter::supported($key, $cipher); - } - /** - * Create a new encryption key for the given cipher. - * - * @param string $cipher - * @return string - * @static - */ - public static function generateKey($cipher) - { - return \Illuminate\Encryption\Encrypter::generateKey($cipher); - } - /** - * Encrypt the given value. - * - * @param mixed $value - * @param bool $serialize - * @return string - * @throws \Illuminate\Contracts\Encryption\EncryptException - * @static - */ - public static function encrypt($value, $serialize = true) - { - /** @var \Illuminate\Encryption\Encrypter $instance */ - return $instance->encrypt($value, $serialize); - } - /** - * Encrypt a string without serialization. - * - * @param string $value - * @return string - * @throws \Illuminate\Contracts\Encryption\EncryptException - * @static - */ - public static function encryptString($value) - { - /** @var \Illuminate\Encryption\Encrypter $instance */ - return $instance->encryptString($value); - } - /** - * Decrypt the given value. - * - * @param string $payload - * @param bool $unserialize - * @return mixed - * @throws \Illuminate\Contracts\Encryption\DecryptException - * @static - */ - public static function decrypt($payload, $unserialize = true) - { - /** @var \Illuminate\Encryption\Encrypter $instance */ - return $instance->decrypt($payload, $unserialize); - } - /** - * Decrypt the given string without unserialization. - * - * @param string $payload - * @return string - * @throws \Illuminate\Contracts\Encryption\DecryptException - * @static - */ - public static function decryptString($payload) - { - /** @var \Illuminate\Encryption\Encrypter $instance */ - return $instance->decryptString($payload); - } - /** - * Get the encryption key that the encrypter is currently using. - * - * @return string - * @static - */ - public static function getKey() - { - /** @var \Illuminate\Encryption\Encrypter $instance */ - return $instance->getKey(); - } - - } - /** - * - * - * @see https://carbon.nesbot.com/docs/ - * @see https://github.com/briannesbitt/Carbon/blob/master/src/Carbon/Factory.php - * @method static \Illuminate\Support\Carbon create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $tz = null) - * @method static \Illuminate\Support\Carbon createFromDate($year = null, $month = null, $day = null, $tz = null) - * @method static \Illuminate\Support\Carbon|false createFromFormat($format, $time, $tz = null) - * @method static \Illuminate\Support\Carbon createFromTime($hour = 0, $minute = 0, $second = 0, $tz = null) - * @method static \Illuminate\Support\Carbon createFromTimeString($time, $tz = null) - * @method static \Illuminate\Support\Carbon createFromTimestamp($timestamp, $tz = null) - * @method static \Illuminate\Support\Carbon createFromTimestampMs($timestamp, $tz = null) - * @method static \Illuminate\Support\Carbon createFromTimestampUTC($timestamp) - * @method static \Illuminate\Support\Carbon createMidnightDate($year = null, $month = null, $day = null, $tz = null) - * @method static \Illuminate\Support\Carbon|false createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null) - * @method static void disableHumanDiffOption($humanDiffOption) - * @method static void enableHumanDiffOption($humanDiffOption) - * @method static mixed executeWithLocale($locale, $func) - * @method static \Illuminate\Support\Carbon fromSerialized($value) - * @method static array getAvailableLocales() - * @method static array getDays() - * @method static int getHumanDiffOptions() - * @method static array getIsoUnits() - * @method static array getLastErrors() - * @method static string getLocale() - * @method static int getMidDayAt() - * @method static \Illuminate\Support\Carbon|null getTestNow() - * @method static \Symfony\Component\Translation\TranslatorInterface getTranslator() - * @method static int getWeekEndsAt() - * @method static int getWeekStartsAt() - * @method static array getWeekendDays() - * @method static bool hasFormat($date, $format) - * @method static bool hasMacro($name) - * @method static bool hasRelativeKeywords($time) - * @method static bool hasTestNow() - * @method static \Illuminate\Support\Carbon instance($date) - * @method static bool isImmutable() - * @method static bool isModifiableUnit($unit) - * @method static bool isMutable() - * @method static bool isStrictModeEnabled() - * @method static bool localeHasDiffOneDayWords($locale) - * @method static bool localeHasDiffSyntax($locale) - * @method static bool localeHasDiffTwoDayWords($locale) - * @method static bool localeHasPeriodSyntax($locale) - * @method static bool localeHasShortUnits($locale) - * @method static void macro($name, $macro) - * @method static \Illuminate\Support\Carbon|null make($var) - * @method static \Illuminate\Support\Carbon maxValue() - * @method static \Illuminate\Support\Carbon minValue() - * @method static void mixin($mixin) - * @method static \Illuminate\Support\Carbon now($tz = null) - * @method static \Illuminate\Support\Carbon parse($time = null, $tz = null) - * @method static string pluralUnit(string $unit) - * @method static void resetMonthsOverflow() - * @method static void resetToStringFormat() - * @method static void resetYearsOverflow() - * @method static void serializeUsing($callback) - * @method static void setHumanDiffOptions($humanDiffOptions) - * @method static bool setLocale($locale) - * @method static void setMidDayAt($hour) - * @method static void setTestNow($testNow = null) - * @method static void setToStringFormat($format) - * @method static void setTranslator(\Symfony\Component\Translation\TranslatorInterface $translator) - * @method static void setUtf8($utf8) - * @method static void setWeekEndsAt($day) - * @method static void setWeekStartsAt($day) - * @method static void setWeekendDays($days) - * @method static bool shouldOverflowMonths() - * @method static bool shouldOverflowYears() - * @method static string singularUnit(string $unit) - * @method static \Illuminate\Support\Carbon today($tz = null) - * @method static \Illuminate\Support\Carbon tomorrow($tz = null) - * @method static void useMonthsOverflow($monthsOverflow = true) - * @method static void useStrictMode($strictModeEnabled = true) - * @method static void useYearsOverflow($yearsOverflow = true) - * @method static \Illuminate\Support\Carbon yesterday($tz = null) - * @see \Illuminate\Support\DateFactory - */ - class Date { - /** - * Use the given handler when generating dates (class name, callable, or factory). - * - * @param mixed $handler - * @return mixed - * @throws \InvalidArgumentException - * @static - */ - public static function use($handler) - { - return \Illuminate\Support\DateFactory::use($handler); - } - /** - * Use the default date class when generating dates. - * - * @return void - * @static - */ - public static function useDefault() - { - \Illuminate\Support\DateFactory::useDefault(); - } - /** - * Execute the given callable on each date creation. - * - * @param callable $callable - * @return void - * @static - */ - public static function useCallable($callable) - { - \Illuminate\Support\DateFactory::useCallable($callable); - } - /** - * Use the given date type (class) when generating dates. - * - * @param string $dateClass - * @return void - * @static - */ - public static function useClass($dateClass) - { - \Illuminate\Support\DateFactory::useClass($dateClass); - } - /** - * Use the given Carbon factory when generating dates. - * - * @param object $factory - * @return void - * @static - */ - public static function useFactory($factory) - { - \Illuminate\Support\DateFactory::useFactory($factory); - } - - } - /** - * - * - * @see \Illuminate\Database\DatabaseManager - */ - class DB { - /** - * Get a database connection instance. - * - * @param string|null $name - * @return \Illuminate\Database\Connection - * @static - */ - public static function connection($name = null) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->connection($name); - } - /** - * Register a custom Doctrine type. - * - * @param string $class - * @param string $name - * @param string $type - * @return void - * @throws \Doctrine\DBAL\Exception - * @throws \RuntimeException - * @static - */ - public static function registerDoctrineType($class, $name, $type) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - $instance->registerDoctrineType($class, $name, $type); - } - /** - * Disconnect from the given database and remove from local cache. - * - * @param string|null $name - * @return void - * @static - */ - public static function purge($name = null) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - $instance->purge($name); - } - /** - * Disconnect from the given database. - * - * @param string|null $name - * @return void - * @static - */ - public static function disconnect($name = null) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - $instance->disconnect($name); - } - /** - * Reconnect to the given database. - * - * @param string|null $name - * @return \Illuminate\Database\Connection - * @static - */ - public static function reconnect($name = null) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->reconnect($name); - } - /** - * Set the default database connection for the callback execution. - * - * @param string $name - * @param callable $callback - * @return mixed - * @static - */ - public static function usingConnection($name, $callback) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->usingConnection($name, $callback); - } - /** - * Get the default connection name. - * - * @return string - * @static - */ - public static function getDefaultConnection() - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->getDefaultConnection(); - } - /** - * Set the default connection name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultConnection($name) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - $instance->setDefaultConnection($name); - } - /** - * Get all of the support drivers. - * - * @return string[] - * @static - */ - public static function supportedDrivers() - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->supportedDrivers(); - } - /** - * Get all of the drivers that are actually available. - * - * @return string[] - * @static - */ - public static function availableDrivers() - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->availableDrivers(); - } - /** - * Register an extension connection resolver. - * - * @param string $name - * @param callable $resolver - * @return void - * @static - */ - public static function extend($name, $resolver) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - $instance->extend($name, $resolver); - } - /** - * Remove an extension connection resolver. - * - * @param string $name - * @return void - * @static - */ - public static function forgetExtension($name) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - $instance->forgetExtension($name); - } - /** - * Return all of the created connections. - * - * @return array - * @static - */ - public static function getConnections() - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->getConnections(); - } - /** - * Set the database reconnector callback. - * - * @param callable $reconnector - * @return void - * @static - */ - public static function setReconnector($reconnector) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - $instance->setReconnector($reconnector); - } - /** - * Set the application instance used by the manager. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @return \Illuminate\Database\DatabaseManager - * @static - */ - public static function setApplication($app) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->setApplication($app); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Database\DatabaseManager::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Database\DatabaseManager::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Database\DatabaseManager::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Database\DatabaseManager::flushMacros(); - } - /** - * Dynamically handle calls to the class. - * - * @param string $method - * @param array $parameters - * @return mixed - * @throws \BadMethodCallException - * @static - */ - public static function macroCall($method, $parameters) - { - /** @var \Illuminate\Database\DatabaseManager $instance */ - return $instance->macroCall($method, $parameters); - } - /** - * Determine if the connected database is a MariaDB database. - * - * @return bool - * @static - */ - public static function isMaria() - { - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->isMaria(); - } - /** - * Get a schema builder instance for the connection. - * - * @return \Illuminate\Database\Schema\MySqlBuilder - * @static - */ - public static function getSchemaBuilder() - { - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getSchemaBuilder(); - } - /** - * Get the schema state for the connection. - * - * @param \Illuminate\Filesystem\Filesystem|null $files - * @param callable|null $processFactory - * @return \Illuminate\Database\Schema\MySqlSchemaState - * @static - */ - public static function getSchemaState($files = null, $processFactory = null) - { - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getSchemaState($files, $processFactory); - } - /** - * Set the query grammar to the default implementation. - * - * @return void - * @static - */ - public static function useDefaultQueryGrammar() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->useDefaultQueryGrammar(); - } - /** - * Set the schema grammar to the default implementation. - * - * @return void - * @static - */ - public static function useDefaultSchemaGrammar() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->useDefaultSchemaGrammar(); - } - /** - * Set the query post processor to the default implementation. - * - * @return void - * @static - */ - public static function useDefaultPostProcessor() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->useDefaultPostProcessor(); - } - /** - * Begin a fluent query against a database table. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Contracts\Database\Query\Expression|string $table - * @param string|null $as - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function table($table, $as = null) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->table($table, $as); - } - /** - * Get a new query builder instance. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function query() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->query(); - } - /** - * Run a select statement and return a single result. - * - * @param string $query - * @param array $bindings - * @param bool $useReadPdo - * @return mixed - * @static - */ - public static function selectOne($query, $bindings = [], $useReadPdo = true) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->selectOne($query, $bindings, $useReadPdo); - } - /** - * Run a select statement and return the first column of the first row. - * - * @param string $query - * @param array $bindings - * @param bool $useReadPdo - * @return mixed - * @throws \Illuminate\Database\MultipleColumnsSelectedException - * @static - */ - public static function scalar($query, $bindings = [], $useReadPdo = true) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->scalar($query, $bindings, $useReadPdo); - } - /** - * Run a select statement against the database. - * - * @param string $query - * @param array $bindings - * @return array - * @static - */ - public static function selectFromWriteConnection($query, $bindings = []) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->selectFromWriteConnection($query, $bindings); - } - /** - * Run a select statement against the database. - * - * @param string $query - * @param array $bindings - * @param bool $useReadPdo - * @return array - * @static - */ - public static function select($query, $bindings = [], $useReadPdo = true) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->select($query, $bindings, $useReadPdo); - } - /** - * Run a select statement against the database and returns all of the result sets. - * - * @param string $query - * @param array $bindings - * @param bool $useReadPdo - * @return array - * @static - */ - public static function selectResultSets($query, $bindings = [], $useReadPdo = true) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->selectResultSets($query, $bindings, $useReadPdo); - } - /** - * Run a select statement against the database and returns a generator. - * - * @param string $query - * @param array $bindings - * @param bool $useReadPdo - * @return \Generator - * @static - */ - public static function cursor($query, $bindings = [], $useReadPdo = true) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->cursor($query, $bindings, $useReadPdo); - } - /** - * Run an insert statement against the database. - * - * @param string $query - * @param array $bindings - * @return bool - * @static - */ - public static function insert($query, $bindings = []) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->insert($query, $bindings); - } - /** - * Run an update statement against the database. - * - * @param string $query - * @param array $bindings - * @return int - * @static - */ - public static function update($query, $bindings = []) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->update($query, $bindings); - } - /** - * Run a delete statement against the database. - * - * @param string $query - * @param array $bindings - * @return int - * @static - */ - public static function delete($query, $bindings = []) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->delete($query, $bindings); - } - /** - * Execute an SQL statement and return the boolean result. - * - * @param string $query - * @param array $bindings - * @return bool - * @static - */ - public static function statement($query, $bindings = []) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->statement($query, $bindings); - } - /** - * Run an SQL statement and get the number of rows affected. - * - * @param string $query - * @param array $bindings - * @return int - * @static - */ - public static function affectingStatement($query, $bindings = []) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->affectingStatement($query, $bindings); - } - /** - * Run a raw, unprepared query against the PDO connection. - * - * @param string $query - * @return bool - * @static - */ - public static function unprepared($query) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->unprepared($query); - } - /** - * Execute the given callback in "dry run" mode. - * - * @param \Closure $callback - * @return array - * @static - */ - public static function pretend($callback) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->pretend($callback); - } - /** - * Bind values to their parameters in the given statement. - * - * @param \PDOStatement $statement - * @param array $bindings - * @return void - * @static - */ - public static function bindValues($statement, $bindings) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->bindValues($statement, $bindings); - } - /** - * Prepare the query bindings for execution. - * - * @param array $bindings - * @return array - * @static - */ - public static function prepareBindings($bindings) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->prepareBindings($bindings); - } - /** - * Log a query in the connection's query log. - * - * @param string $query - * @param array $bindings - * @param float|null $time - * @return void - * @static - */ - public static function logQuery($query, $bindings, $time = null) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->logQuery($query, $bindings, $time); - } - /** - * Register a callback to be invoked when the connection queries for longer than a given amount of time. - * - * @param \DateTimeInterface|\Carbon\CarbonInterval|float|int $threshold - * @param callable $handler - * @return void - * @static - */ - public static function whenQueryingForLongerThan($threshold, $handler) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->whenQueryingForLongerThan($threshold, $handler); - } - /** - * Allow all the query duration handlers to run again, even if they have already run. - * - * @return void - * @static - */ - public static function allowQueryDurationHandlersToRunAgain() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->allowQueryDurationHandlersToRunAgain(); - } - /** - * Get the duration of all run queries in milliseconds. - * - * @return float - * @static - */ - public static function totalQueryDuration() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->totalQueryDuration(); - } - /** - * Reset the duration of all run queries. - * - * @return void - * @static - */ - public static function resetTotalQueryDuration() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->resetTotalQueryDuration(); - } - /** - * Reconnect to the database if a PDO connection is missing. - * - * @return void - * @static - */ - public static function reconnectIfMissingConnection() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->reconnectIfMissingConnection(); - } - /** - * Register a hook to be run just before a database query is executed. - * - * @param \Closure $callback - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function beforeExecuting($callback) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->beforeExecuting($callback); - } - /** - * Register a database query listener with the connection. - * - * @param \Closure $callback - * @return void - * @static - */ - public static function listen($callback) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->listen($callback); - } - /** - * Get a new raw query expression. - * - * @param mixed $value - * @return \Illuminate\Contracts\Database\Query\Expression - * @static - */ - public static function raw($value) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->raw($value); - } - /** - * Escape a value for safe SQL embedding. - * - * @param string|float|int|bool|null $value - * @param bool $binary - * @return string - * @static - */ - public static function escape($value, $binary = false) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->escape($value, $binary); - } - /** - * Determine if the database connection has modified any database records. - * - * @return bool - * @static - */ - public static function hasModifiedRecords() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->hasModifiedRecords(); - } - /** - * Indicate if any records have been modified. - * - * @param bool $value - * @return void - * @static - */ - public static function recordsHaveBeenModified($value = true) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->recordsHaveBeenModified($value); - } - /** - * Set the record modification state. - * - * @param bool $value - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setRecordModificationState($value) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setRecordModificationState($value); - } - /** - * Reset the record modification state. - * - * @return void - * @static - */ - public static function forgetRecordModificationState() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->forgetRecordModificationState(); - } - /** - * Indicate that the connection should use the write PDO connection for reads. - * - * @param bool $value - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function useWriteConnectionWhenReading($value = true) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->useWriteConnectionWhenReading($value); - } - /** - * Is Doctrine available? - * - * @return bool - * @static - */ - public static function isDoctrineAvailable() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->isDoctrineAvailable(); - } - /** - * Indicates whether native alter operations will be used when dropping, renaming, or modifying columns, even if Doctrine DBAL is installed. - * - * @return bool - * @static - */ - public static function usingNativeSchemaOperations() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->usingNativeSchemaOperations(); - } - /** - * Get a Doctrine Schema Column instance. - * - * @param string $table - * @param string $column - * @return \Doctrine\DBAL\Schema\Column - * @static - */ - public static function getDoctrineColumn($table, $column) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getDoctrineColumn($table, $column); - } - /** - * Get the Doctrine DBAL schema manager for the connection. - * - * @return \Doctrine\DBAL\Schema\AbstractSchemaManager - * @static - */ - public static function getDoctrineSchemaManager() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getDoctrineSchemaManager(); - } - /** - * Get the Doctrine DBAL database connection instance. - * - * @return \Doctrine\DBAL\Connection - * @static - */ - public static function getDoctrineConnection() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getDoctrineConnection(); - } - /** - * Get the current PDO connection. - * - * @return \PDO - * @static - */ - public static function getPdo() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getPdo(); - } - /** - * Get the current PDO connection parameter without executing any reconnect logic. - * - * @return \PDO|\Closure|null - * @static - */ - public static function getRawPdo() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getRawPdo(); - } - /** - * Get the current PDO connection used for reading. - * - * @return \PDO - * @static - */ - public static function getReadPdo() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getReadPdo(); - } - /** - * Get the current read PDO connection parameter without executing any reconnect logic. - * - * @return \PDO|\Closure|null - * @static - */ - public static function getRawReadPdo() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getRawReadPdo(); - } - /** - * Set the PDO connection. - * - * @param \PDO|\Closure|null $pdo - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setPdo($pdo) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setPdo($pdo); - } - /** - * Set the PDO connection used for reading. - * - * @param \PDO|\Closure|null $pdo - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setReadPdo($pdo) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setReadPdo($pdo); - } - /** - * Get the database connection name. - * - * @return string|null - * @static - */ - public static function getName() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getName(); - } - /** - * Get the database connection full name. - * - * @return string|null - * @static - */ - public static function getNameWithReadWriteType() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getNameWithReadWriteType(); - } - /** - * Get an option from the configuration options. - * - * @param string|null $option - * @return mixed - * @static - */ - public static function getConfig($option = null) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getConfig($option); - } - /** - * Get the PDO driver name. - * - * @return string - * @static - */ - public static function getDriverName() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getDriverName(); - } - /** - * Get the query grammar used by the connection. - * - * @return \Illuminate\Database\Query\Grammars\Grammar - * @static - */ - public static function getQueryGrammar() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getQueryGrammar(); - } - /** - * Set the query grammar used by the connection. - * - * @param \Illuminate\Database\Query\Grammars\Grammar $grammar - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setQueryGrammar($grammar) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setQueryGrammar($grammar); - } - /** - * Get the schema grammar used by the connection. - * - * @return \Illuminate\Database\Schema\Grammars\Grammar - * @static - */ - public static function getSchemaGrammar() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getSchemaGrammar(); - } - /** - * Set the schema grammar used by the connection. - * - * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setSchemaGrammar($grammar) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setSchemaGrammar($grammar); - } - /** - * Get the query post processor used by the connection. - * - * @return \Illuminate\Database\Query\Processors\Processor - * @static - */ - public static function getPostProcessor() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getPostProcessor(); - } - /** - * Set the query post processor used by the connection. - * - * @param \Illuminate\Database\Query\Processors\Processor $processor - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setPostProcessor($processor) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setPostProcessor($processor); - } - /** - * Get the event dispatcher used by the connection. - * - * @return \Illuminate\Contracts\Events\Dispatcher - * @static - */ - public static function getEventDispatcher() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getEventDispatcher(); - } - /** - * Set the event dispatcher instance on the connection. - * - * @param \Illuminate\Contracts\Events\Dispatcher $events - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setEventDispatcher($events) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setEventDispatcher($events); - } - /** - * Unset the event dispatcher for this connection. - * - * @return void - * @static - */ - public static function unsetEventDispatcher() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->unsetEventDispatcher(); - } - /** - * Set the transaction manager instance on the connection. - * - * @param \Illuminate\Database\DatabaseTransactionsManager $manager - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setTransactionManager($manager) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setTransactionManager($manager); - } - /** - * Unset the transaction manager for this connection. - * - * @return void - * @static - */ - public static function unsetTransactionManager() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->unsetTransactionManager(); - } - /** - * Determine if the connection is in a "dry run". - * - * @return bool - * @static - */ - public static function pretending() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->pretending(); - } - /** - * Get the connection query log. - * - * @return array - * @static - */ - public static function getQueryLog() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getQueryLog(); - } - /** - * Get the connection query log with embedded bindings. - * - * @return array - * @static - */ - public static function getRawQueryLog() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getRawQueryLog(); - } - /** - * Clear the query log. - * - * @return void - * @static - */ - public static function flushQueryLog() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->flushQueryLog(); - } - /** - * Enable the query log on the connection. - * - * @return void - * @static - */ - public static function enableQueryLog() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->enableQueryLog(); - } - /** - * Disable the query log on the connection. - * - * @return void - * @static - */ - public static function disableQueryLog() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->disableQueryLog(); - } - /** - * Determine whether we're logging queries. - * - * @return bool - * @static - */ - public static function logging() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->logging(); - } - /** - * Get the name of the connected database. - * - * @return string - * @static - */ - public static function getDatabaseName() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getDatabaseName(); - } - /** - * Set the name of the connected database. - * - * @param string $database - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setDatabaseName($database) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setDatabaseName($database); - } - /** - * Set the read / write type of the connection. - * - * @param string|null $readWriteType - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setReadWriteType($readWriteType) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setReadWriteType($readWriteType); - } - /** - * Get the table prefix for the connection. - * - * @return string - * @static - */ - public static function getTablePrefix() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->getTablePrefix(); - } - /** - * Set the table prefix in use by the connection. - * - * @param string $prefix - * @return \Illuminate\Database\MySqlConnection - * @static - */ - public static function setTablePrefix($prefix) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->setTablePrefix($prefix); - } - /** - * Set the table prefix and return the grammar. - * - * @param \Illuminate\Database\Grammar $grammar - * @return \Illuminate\Database\Grammar - * @static - */ - public static function withTablePrefix($grammar) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->withTablePrefix($grammar); - } - /** - * Register a connection resolver. - * - * @param string $driver - * @param \Closure $callback - * @return void - * @static - */ - public static function resolverFor($driver, $callback) - { //Method inherited from \Illuminate\Database\Connection - \Illuminate\Database\MySqlConnection::resolverFor($driver, $callback); - } - /** - * Get the connection resolver for the given driver. - * - * @param string $driver - * @return mixed - * @static - */ - public static function getResolver($driver) - { //Method inherited from \Illuminate\Database\Connection - return \Illuminate\Database\MySqlConnection::getResolver($driver); - } - /** - * Execute a Closure within a transaction. - * - * @param \Closure $callback - * @param int $attempts - * @return mixed - * @throws \Throwable - * @static - */ - public static function transaction($callback, $attempts = 1) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->transaction($callback, $attempts); - } - /** - * Start a new database transaction. - * - * @return void - * @throws \Throwable - * @static - */ - public static function beginTransaction() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->beginTransaction(); - } - /** - * Commit the active database transaction. - * - * @return void - * @throws \Throwable - * @static - */ - public static function commit() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->commit(); - } - /** - * Rollback the active database transaction. - * - * @param int|null $toLevel - * @return void - * @throws \Throwable - * @static - */ - public static function rollBack($toLevel = null) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->rollBack($toLevel); - } - /** - * Get the number of active transactions. - * - * @return int - * @static - */ - public static function transactionLevel() - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - return $instance->transactionLevel(); - } - /** - * Execute the callback after a transaction commits. - * - * @param callable $callback - * @return void - * @throws \RuntimeException - * @static - */ - public static function afterCommit($callback) - { //Method inherited from \Illuminate\Database\Connection - /** @var \Illuminate\Database\MySqlConnection $instance */ - $instance->afterCommit($callback); - } - - } - /** - * - * - * @see \Illuminate\Events\Dispatcher - * @see \Illuminate\Support\Testing\Fakes\EventFake - */ - class Event { - /** - * Register an event listener with the dispatcher. - * - * @param \Closure|string|array $events - * @param \Closure|string|array|null $listener - * @return void - * @static - */ - public static function listen($events, $listener = null) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - $instance->listen($events, $listener); - } - /** - * Determine if a given event has listeners. - * - * @param string $eventName - * @return bool - * @static - */ - public static function hasListeners($eventName) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->hasListeners($eventName); - } - /** - * Determine if the given event has any wildcard listeners. - * - * @param string $eventName - * @return bool - * @static - */ - public static function hasWildcardListeners($eventName) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->hasWildcardListeners($eventName); - } - /** - * Register an event and payload to be fired later. - * - * @param string $event - * @param object|array $payload - * @return void - * @static - */ - public static function push($event, $payload = []) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - $instance->push($event, $payload); - } - /** - * Flush a set of pushed events. - * - * @param string $event - * @return void - * @static - */ - public static function flush($event) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - $instance->flush($event); - } - /** - * Register an event subscriber with the dispatcher. - * - * @param object|string $subscriber - * @return void - * @static - */ - public static function subscribe($subscriber) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - $instance->subscribe($subscriber); - } - /** - * Fire an event until the first non-null response is returned. - * - * @param string|object $event - * @param mixed $payload - * @return mixed - * @static - */ - public static function until($event, $payload = []) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->until($event, $payload); - } - /** - * Fire an event and call the listeners. - * - * @param string|object $event - * @param mixed $payload - * @param bool $halt - * @return array|null - * @static - */ - public static function dispatch($event, $payload = [], $halt = false) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->dispatch($event, $payload, $halt); - } - /** - * Get all of the listeners for a given event name. - * - * @param string $eventName - * @return array - * @static - */ - public static function getListeners($eventName) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->getListeners($eventName); - } - /** - * Register an event listener with the dispatcher. - * - * @param \Closure|string|array $listener - * @param bool $wildcard - * @return \Closure - * @static - */ - public static function makeListener($listener, $wildcard = false) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->makeListener($listener, $wildcard); - } - /** - * Create a class based listener using the IoC container. - * - * @param string $listener - * @param bool $wildcard - * @return \Closure - * @static - */ - public static function createClassListener($listener, $wildcard = false) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->createClassListener($listener, $wildcard); - } - /** - * Remove a set of listeners from the dispatcher. - * - * @param string $event - * @return void - * @static - */ - public static function forget($event) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - $instance->forget($event); - } - /** - * Forget all of the pushed listeners. - * - * @return void - * @static - */ - public static function forgetPushed() - { - /** @var \Illuminate\Events\Dispatcher $instance */ - $instance->forgetPushed(); - } - /** - * Set the queue resolver implementation. - * - * @param callable $resolver - * @return \Illuminate\Events\Dispatcher - * @static - */ - public static function setQueueResolver($resolver) - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->setQueueResolver($resolver); - } - /** - * Gets the raw, unprepared listeners. - * - * @return array - * @static - */ - public static function getRawListeners() - { - /** @var \Illuminate\Events\Dispatcher $instance */ - return $instance->getRawListeners(); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Events\Dispatcher::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Events\Dispatcher::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Events\Dispatcher::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Events\Dispatcher::flushMacros(); - } - /** - * Specify the events that should be dispatched instead of faked. - * - * @param array|string $eventsToDispatch - * @return \Illuminate\Support\Testing\Fakes\EventFake - * @static - */ - public static function except($eventsToDispatch) - { - /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ - return $instance->except($eventsToDispatch); - } - /** - * Assert if an event has a listener attached to it. - * - * @param string $expectedEvent - * @param string|array $expectedListener - * @return void - * @static - */ - public static function assertListening($expectedEvent, $expectedListener) - { - /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ - $instance->assertListening($expectedEvent, $expectedListener); - } - /** - * Assert if an event was dispatched based on a truth-test callback. - * - * @param string|\Closure $event - * @param callable|int|null $callback - * @return void - * @static - */ - public static function assertDispatched($event, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ - $instance->assertDispatched($event, $callback); - } - /** - * Assert if an event was dispatched a number of times. - * - * @param string $event - * @param int $times - * @return void - * @static - */ - public static function assertDispatchedTimes($event, $times = 1) - { - /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ - $instance->assertDispatchedTimes($event, $times); - } - /** - * Determine if an event was dispatched based on a truth-test callback. - * - * @param string|\Closure $event - * @param callable|null $callback - * @return void - * @static - */ - public static function assertNotDispatched($event, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ - $instance->assertNotDispatched($event, $callback); - } - /** - * Assert that no events were dispatched. - * - * @return void - * @static - */ - public static function assertNothingDispatched() - { - /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ - $instance->assertNothingDispatched(); - } - /** - * Get all of the events matching a truth-test callback. - * - * @param string $event - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function dispatched($event, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ - return $instance->dispatched($event, $callback); - } - /** - * Determine if the given event has been dispatched. - * - * @param string $event - * @return bool - * @static - */ - public static function hasDispatched($event) - { - /** @var \Illuminate\Support\Testing\Fakes\EventFake $instance */ - return $instance->hasDispatched($event); - } - - } - /** - * - * - * @see \Illuminate\Filesystem\Filesystem - */ - class File { - /** - * Determine if a file or directory exists. - * - * @param string $path - * @return bool - * @static - */ - public static function exists($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->exists($path); - } - /** - * Determine if a file or directory is missing. - * - * @param string $path - * @return bool - * @static - */ - public static function missing($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->missing($path); - } - /** - * Get the contents of a file. - * - * @param string $path - * @param bool $lock - * @return string - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException - * @static - */ - public static function get($path, $lock = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->get($path, $lock); - } - /** - * Get the contents of a file as decoded JSON. - * - * @param string $path - * @param int $flags - * @param bool $lock - * @return array - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException - * @static - */ - public static function json($path, $flags = 0, $lock = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->json($path, $flags, $lock); - } - /** - * Get contents of a file with shared access. - * - * @param string $path - * @return string - * @static - */ - public static function sharedGet($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->sharedGet($path); - } - /** - * Get the returned value of a file. - * - * @param string $path - * @param array $data - * @return mixed - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException - * @static - */ - public static function getRequire($path, $data = []) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->getRequire($path, $data); - } - /** - * Require the given file once. - * - * @param string $path - * @param array $data - * @return mixed - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException - * @static - */ - public static function requireOnce($path, $data = []) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->requireOnce($path, $data); - } - /** - * Get the contents of a file one line at a time. - * - * @param string $path - * @return \Illuminate\Support\LazyCollection - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException - * @static - */ - public static function lines($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->lines($path); - } - /** - * Get the hash of the file at the given path. - * - * @param string $path - * @param string $algorithm - * @return string - * @static - */ - public static function hash($path, $algorithm = 'md5') - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->hash($path, $algorithm); - } - /** - * Write the contents of a file. - * - * @param string $path - * @param string $contents - * @param bool $lock - * @return int|bool - * @static - */ - public static function put($path, $contents, $lock = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->put($path, $contents, $lock); - } - /** - * Write the contents of a file, replacing it atomically if it already exists. - * - * @param string $path - * @param string $content - * @param int|null $mode - * @return void - * @static - */ - public static function replace($path, $content, $mode = null) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - $instance->replace($path, $content, $mode); - } - /** - * Replace a given string within a given file. - * - * @param array|string $search - * @param array|string $replace - * @param string $path - * @return void - * @static - */ - public static function replaceInFile($search, $replace, $path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - $instance->replaceInFile($search, $replace, $path); - } - /** - * Prepend to a file. - * - * @param string $path - * @param string $data - * @return int - * @static - */ - public static function prepend($path, $data) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->prepend($path, $data); - } - /** - * Append to a file. - * - * @param string $path - * @param string $data - * @return int - * @static - */ - public static function append($path, $data) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->append($path, $data); - } - /** - * Get or set UNIX mode of a file or directory. - * - * @param string $path - * @param int|null $mode - * @return mixed - * @static - */ - public static function chmod($path, $mode = null) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->chmod($path, $mode); - } - /** - * Delete the file at a given path. - * - * @param string|array $paths - * @return bool - * @static - */ - public static function delete($paths) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->delete($paths); - } - /** - * Move a file to a new location. - * - * @param string $path - * @param string $target - * @return bool - * @static - */ - public static function move($path, $target) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->move($path, $target); - } - /** - * Copy a file to a new location. - * - * @param string $path - * @param string $target - * @return bool - * @static - */ - public static function copy($path, $target) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->copy($path, $target); - } - /** - * Create a symlink to the target file or directory. On Windows, a hard link is created if the target is a file. - * - * @param string $target - * @param string $link - * @return void - * @static - */ - public static function link($target, $link) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - $instance->link($target, $link); - } - /** - * Create a relative symlink to the target file or directory. - * - * @param string $target - * @param string $link - * @return void - * @throws \RuntimeException - * @static - */ - public static function relativeLink($target, $link) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - $instance->relativeLink($target, $link); - } - /** - * Extract the file name from a file path. - * - * @param string $path - * @return string - * @static - */ - public static function name($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->name($path); - } - /** - * Extract the trailing name component from a file path. - * - * @param string $path - * @return string - * @static - */ - public static function basename($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->basename($path); - } - /** - * Extract the parent directory from a file path. - * - * @param string $path - * @return string - * @static - */ - public static function dirname($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->dirname($path); - } - /** - * Extract the file extension from a file path. - * - * @param string $path - * @return string - * @static - */ - public static function extension($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->extension($path); - } - /** - * Guess the file extension from the mime-type of a given file. - * - * @param string $path - * @return string|null - * @throws \RuntimeException - * @static - */ - public static function guessExtension($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->guessExtension($path); - } - /** - * Get the file type of a given file. - * - * @param string $path - * @return string - * @static - */ - public static function type($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->type($path); - } - /** - * Get the mime-type of a given file. - * - * @param string $path - * @return string|false - * @static - */ - public static function mimeType($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->mimeType($path); - } - /** - * Get the file size of a given file. - * - * @param string $path - * @return int - * @static - */ - public static function size($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->size($path); - } - /** - * Get the file's last modification time. - * - * @param string $path - * @return int - * @static - */ - public static function lastModified($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->lastModified($path); - } - /** - * Determine if the given path is a directory. - * - * @param string $directory - * @return bool - * @static - */ - public static function isDirectory($directory) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->isDirectory($directory); - } - /** - * Determine if the given path is a directory that does not contain any other files or directories. - * - * @param string $directory - * @param bool $ignoreDotFiles - * @return bool - * @static - */ - public static function isEmptyDirectory($directory, $ignoreDotFiles = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->isEmptyDirectory($directory, $ignoreDotFiles); - } - /** - * Determine if the given path is readable. - * - * @param string $path - * @return bool - * @static - */ - public static function isReadable($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->isReadable($path); - } - /** - * Determine if the given path is writable. - * - * @param string $path - * @return bool - * @static - */ - public static function isWritable($path) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->isWritable($path); - } - /** - * Determine if two files are the same by comparing their hashes. - * - * @param string $firstFile - * @param string $secondFile - * @return bool - * @static - */ - public static function hasSameHash($firstFile, $secondFile) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->hasSameHash($firstFile, $secondFile); - } - /** - * Determine if the given path is a file. - * - * @param string $file - * @return bool - * @static - */ - public static function isFile($file) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->isFile($file); - } - /** - * Find path names matching a given pattern. - * - * @param string $pattern - * @param int $flags - * @return array - * @static - */ - public static function glob($pattern, $flags = 0) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->glob($pattern, $flags); - } - /** - * Get an array of all files in a directory. - * - * @param string $directory - * @param bool $hidden - * @return \Symfony\Component\Finder\SplFileInfo[] - * @static - */ - public static function files($directory, $hidden = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->files($directory, $hidden); - } - /** - * Get all of the files from the given directory (recursive). - * - * @param string $directory - * @param bool $hidden - * @return \Symfony\Component\Finder\SplFileInfo[] - * @static - */ - public static function allFiles($directory, $hidden = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->allFiles($directory, $hidden); - } - /** - * Get all of the directories within a given directory. - * - * @param string $directory - * @return array - * @static - */ - public static function directories($directory) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->directories($directory); - } - /** - * Ensure a directory exists. - * - * @param string $path - * @param int $mode - * @param bool $recursive - * @return void - * @static - */ - public static function ensureDirectoryExists($path, $mode = 493, $recursive = true) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - $instance->ensureDirectoryExists($path, $mode, $recursive); - } - /** - * Create a directory. - * - * @param string $path - * @param int $mode - * @param bool $recursive - * @param bool $force - * @return bool - * @static - */ - public static function makeDirectory($path, $mode = 493, $recursive = false, $force = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->makeDirectory($path, $mode, $recursive, $force); - } - /** - * Move a directory. - * - * @param string $from - * @param string $to - * @param bool $overwrite - * @return bool - * @static - */ - public static function moveDirectory($from, $to, $overwrite = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->moveDirectory($from, $to, $overwrite); - } - /** - * Copy a directory from one location to another. - * - * @param string $directory - * @param string $destination - * @param int|null $options - * @return bool - * @static - */ - public static function copyDirectory($directory, $destination, $options = null) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->copyDirectory($directory, $destination, $options); - } - /** - * Recursively delete a directory. - * - * The directory itself may be optionally preserved. - * - * @param string $directory - * @param bool $preserve - * @return bool - * @static - */ - public static function deleteDirectory($directory, $preserve = false) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->deleteDirectory($directory, $preserve); - } - /** - * Remove all of the directories within a given directory. - * - * @param string $directory - * @return bool - * @static - */ - public static function deleteDirectories($directory) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->deleteDirectories($directory); - } - /** - * Empty the specified directory of all files and folders. - * - * @param string $directory - * @return bool - * @static - */ - public static function cleanDirectory($directory) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->cleanDirectory($directory); - } - /** - * Apply the callback if the given "value" is (or resolves to) truthy. - * - * @template TWhenParameter - * @template TWhenReturnType - * @param \Illuminate\Filesystem\(\Closure($this): TWhenParameter)|TWhenParameter|null $value - * @param \Illuminate\Filesystem\(callable($this, TWhenParameter): TWhenReturnType)|null $callback - * @param \Illuminate\Filesystem\(callable($this, TWhenParameter): TWhenReturnType)|null $default - * @return $this|\Illuminate\Filesystem\TWhenReturnType - * @static - */ - public static function when($value = null, $callback = null, $default = null) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->when($value, $callback, $default); - } - /** - * Apply the callback if the given "value" is (or resolves to) falsy. - * - * @template TUnlessParameter - * @template TUnlessReturnType - * @param \Illuminate\Filesystem\(\Closure($this): TUnlessParameter)|TUnlessParameter|null $value - * @param \Illuminate\Filesystem\(callable($this, TUnlessParameter): TUnlessReturnType)|null $callback - * @param \Illuminate\Filesystem\(callable($this, TUnlessParameter): TUnlessReturnType)|null $default - * @return $this|\Illuminate\Filesystem\TUnlessReturnType - * @static - */ - public static function unless($value = null, $callback = null, $default = null) - { - /** @var \Illuminate\Filesystem\Filesystem $instance */ - return $instance->unless($value, $callback, $default); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Filesystem\Filesystem::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Filesystem\Filesystem::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Filesystem\Filesystem::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Filesystem\Filesystem::flushMacros(); - } - - } - /** - * - * - * @see \Illuminate\Auth\Access\Gate - */ - class Gate { - /** - * Determine if a given ability has been defined. - * - * @param string|array $ability - * @return bool - * @static - */ - public static function has($ability) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->has($ability); - } - /** - * Perform an on-demand authorization check. Throw an authorization exception if the condition or callback is false. - * - * @param \Illuminate\Auth\Access\Response|\Closure|bool $condition - * @param string|null $message - * @param string|null $code - * @return \Illuminate\Auth\Access\Response - * @throws \Illuminate\Auth\Access\AuthorizationException - * @static - */ - public static function allowIf($condition, $message = null, $code = null) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->allowIf($condition, $message, $code); - } - /** - * Perform an on-demand authorization check. Throw an authorization exception if the condition or callback is true. - * - * @param \Illuminate\Auth\Access\Response|\Closure|bool $condition - * @param string|null $message - * @param string|null $code - * @return \Illuminate\Auth\Access\Response - * @throws \Illuminate\Auth\Access\AuthorizationException - * @static - */ - public static function denyIf($condition, $message = null, $code = null) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->denyIf($condition, $message, $code); - } - /** - * Define a new ability. - * - * @param string $ability - * @param callable|array|string $callback - * @return \Illuminate\Auth\Access\Gate - * @throws \InvalidArgumentException - * @static - */ - public static function define($ability, $callback) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->define($ability, $callback); - } - /** - * Define abilities for a resource. - * - * @param string $name - * @param string $class - * @param array|null $abilities - * @return \Illuminate\Auth\Access\Gate - * @static - */ - public static function resource($name, $class, $abilities = null) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->resource($name, $class, $abilities); - } - /** - * Define a policy class for a given class type. - * - * @param string $class - * @param string $policy - * @return \Illuminate\Auth\Access\Gate - * @static - */ - public static function policy($class, $policy) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->policy($class, $policy); - } - /** - * Register a callback to run before all Gate checks. - * - * @param callable $callback - * @return \Illuminate\Auth\Access\Gate - * @static - */ - public static function before($callback) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->before($callback); - } - /** - * Register a callback to run after all Gate checks. - * - * @param callable $callback - * @return \Illuminate\Auth\Access\Gate - * @static - */ - public static function after($callback) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->after($callback); - } - /** - * Determine if the given ability should be granted for the current user. - * - * @param string $ability - * @param array|mixed $arguments - * @return bool - * @static - */ - public static function allows($ability, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->allows($ability, $arguments); - } - /** - * Determine if the given ability should be denied for the current user. - * - * @param string $ability - * @param array|mixed $arguments - * @return bool - * @static - */ - public static function denies($ability, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->denies($ability, $arguments); - } - /** - * Determine if all of the given abilities should be granted for the current user. - * - * @param \Illuminate\Auth\Access\iterable|string $abilities - * @param array|mixed $arguments - * @return bool - * @static - */ - public static function check($abilities, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->check($abilities, $arguments); - } - /** - * Determine if any one of the given abilities should be granted for the current user. - * - * @param \Illuminate\Auth\Access\iterable|string $abilities - * @param array|mixed $arguments - * @return bool - * @static - */ - public static function any($abilities, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->any($abilities, $arguments); - } - /** - * Determine if all of the given abilities should be denied for the current user. - * - * @param \Illuminate\Auth\Access\iterable|string $abilities - * @param array|mixed $arguments - * @return bool - * @static - */ - public static function none($abilities, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->none($abilities, $arguments); - } - /** - * Determine if the given ability should be granted for the current user. - * - * @param string $ability - * @param array|mixed $arguments - * @return \Illuminate\Auth\Access\Response - * @throws \Illuminate\Auth\Access\AuthorizationException - * @static - */ - public static function authorize($ability, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->authorize($ability, $arguments); - } - /** - * Inspect the user for the given ability. - * - * @param string $ability - * @param array|mixed $arguments - * @return \Illuminate\Auth\Access\Response - * @static - */ - public static function inspect($ability, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->inspect($ability, $arguments); - } - /** - * Get the raw result from the authorization callback. - * - * @param string $ability - * @param array|mixed $arguments - * @return mixed - * @throws \Illuminate\Auth\Access\AuthorizationException - * @static - */ - public static function raw($ability, $arguments = []) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->raw($ability, $arguments); - } - /** - * Get a policy instance for a given class. - * - * @param object|string $class - * @return mixed - * @static - */ - public static function getPolicyFor($class) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->getPolicyFor($class); - } - /** - * Specify a callback to be used to guess policy names. - * - * @param callable $callback - * @return \Illuminate\Auth\Access\Gate - * @static - */ - public static function guessPolicyNamesUsing($callback) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->guessPolicyNamesUsing($callback); - } - /** - * Build a policy class instance of the given type. - * - * @param object|string $class - * @return mixed - * @throws \Illuminate\Contracts\Container\BindingResolutionException - * @static - */ - public static function resolvePolicy($class) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->resolvePolicy($class); - } - /** - * Get a gate instance for the given user. - * - * @param \Illuminate\Contracts\Auth\Authenticatable|mixed $user - * @return static - * @static - */ - public static function forUser($user) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->forUser($user); - } - /** - * Get all of the defined abilities. - * - * @return array - * @static - */ - public static function abilities() - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->abilities(); - } - /** - * Get all of the defined policies. - * - * @return array - * @static - */ - public static function policies() - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->policies(); - } - /** - * Set the default denial response for gates and policies. - * - * @param \Illuminate\Auth\Access\Response $response - * @return \Illuminate\Auth\Access\Gate - * @static - */ - public static function defaultDenialResponse($response) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->defaultDenialResponse($response); - } - /** - * Set the container instance used by the gate. - * - * @param \Illuminate\Contracts\Container\Container $container - * @return \Illuminate\Auth\Access\Gate - * @static - */ - public static function setContainer($container) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->setContainer($container); - } - /** - * Deny with a HTTP status code. - * - * @param int $status - * @param string|null $message - * @param int|null $code - * @return \Illuminate\Auth\Access\Response - * @static - */ - public static function denyWithStatus($status, $message = null, $code = null) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->denyWithStatus($status, $message, $code); - } - /** - * Deny with a 404 HTTP status code. - * - * @param string|null $message - * @param int|null $code - * @return \Illuminate\Auth\Access\Response - * @static - */ - public static function denyAsNotFound($message = null, $code = null) - { - /** @var \Illuminate\Auth\Access\Gate $instance */ - return $instance->denyAsNotFound($message, $code); - } - - } - /** - * - * - * @see \Illuminate\Hashing\HashManager - * @see \Illuminate\Hashing\AbstractHasher - */ - class Hash { - /** - * Create an instance of the Bcrypt hash Driver. - * - * @return \Illuminate\Hashing\BcryptHasher - * @static - */ - public static function createBcryptDriver() - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->createBcryptDriver(); - } - /** - * Create an instance of the Argon2i hash Driver. - * - * @return \Illuminate\Hashing\ArgonHasher - * @static - */ - public static function createArgonDriver() - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->createArgonDriver(); - } - /** - * Create an instance of the Argon2id hash Driver. - * - * @return \Illuminate\Hashing\Argon2IdHasher - * @static - */ - public static function createArgon2idDriver() - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->createArgon2idDriver(); - } - /** - * Get information about the given hashed value. - * - * @param string $hashedValue - * @return array - * @static - */ - public static function info($hashedValue) - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->info($hashedValue); - } - /** - * Hash the given value. - * - * @param string $value - * @param array $options - * @return string - * @static - */ - public static function make($value, $options = []) - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->make($value, $options); - } - /** - * Check the given plain value against a hash. - * - * @param string $value - * @param string $hashedValue - * @param array $options - * @return bool - * @static - */ - public static function check($value, $hashedValue, $options = []) - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->check($value, $hashedValue, $options); - } - /** - * Check if the given hash has been hashed using the given options. - * - * @param string $hashedValue - * @param array $options - * @return bool - * @static - */ - public static function needsRehash($hashedValue, $options = []) - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->needsRehash($hashedValue, $options); - } - /** - * Determine if a given string is already hashed. - * - * @param string $value - * @return bool - * @static - */ - public static function isHashed($value) - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->isHashed($value); - } - /** - * Get the default driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Get a driver instance. - * - * @param string|null $driver - * @return mixed - * @throws \InvalidArgumentException - * @static - */ - public static function driver($driver = null) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->driver($driver); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Hashing\HashManager - * @static - */ - public static function extend($driver, $callback) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Get all of the created "drivers". - * - * @return array - * @static - */ - public static function getDrivers() - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->getDrivers(); - } - /** - * Get the container instance used by the manager. - * - * @return \Illuminate\Contracts\Container\Container - * @static - */ - public static function getContainer() - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->getContainer(); - } - /** - * Set the container instance used by the manager. - * - * @param \Illuminate\Contracts\Container\Container $container - * @return \Illuminate\Hashing\HashManager - * @static - */ - public static function setContainer($container) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->setContainer($container); - } - /** - * Forget all of the resolved driver instances. - * - * @return \Illuminate\Hashing\HashManager - * @static - */ - public static function forgetDrivers() - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Hashing\HashManager $instance */ - return $instance->forgetDrivers(); - } - - } - /** - * - * - * @method static \Illuminate\Http\Client\PendingRequest baseUrl(string $url) - * @method static \Illuminate\Http\Client\PendingRequest withBody(string $content, string $contentType = 'application/json') - * @method static \Illuminate\Http\Client\PendingRequest asJson() - * @method static \Illuminate\Http\Client\PendingRequest asForm() - * @method static \Illuminate\Http\Client\PendingRequest attach(string|array $name, string|resource $contents = '', string|null $filename = null, array $headers = []) - * @method static \Illuminate\Http\Client\PendingRequest asMultipart() - * @method static \Illuminate\Http\Client\PendingRequest bodyFormat(string $format) - * @method static \Illuminate\Http\Client\PendingRequest withQueryParameters(array $parameters) - * @method static \Illuminate\Http\Client\PendingRequest contentType(string $contentType) - * @method static \Illuminate\Http\Client\PendingRequest acceptJson() - * @method static \Illuminate\Http\Client\PendingRequest accept(string $contentType) - * @method static \Illuminate\Http\Client\PendingRequest withHeaders(array $headers) - * @method static \Illuminate\Http\Client\PendingRequest withHeader(string $name, mixed $value) - * @method static \Illuminate\Http\Client\PendingRequest replaceHeaders(array $headers) - * @method static \Illuminate\Http\Client\PendingRequest withBasicAuth(string $username, string $password) - * @method static \Illuminate\Http\Client\PendingRequest withDigestAuth(string $username, string $password) - * @method static \Illuminate\Http\Client\PendingRequest withToken(string $token, string $type = 'Bearer') - * @method static \Illuminate\Http\Client\PendingRequest withUserAgent(string|bool $userAgent) - * @method static \Illuminate\Http\Client\PendingRequest withUrlParameters(array $parameters = []) - * @method static \Illuminate\Http\Client\PendingRequest withCookies(array $cookies, string $domain) - * @method static \Illuminate\Http\Client\PendingRequest maxRedirects(int $max) - * @method static \Illuminate\Http\Client\PendingRequest withoutRedirecting() - * @method static \Illuminate\Http\Client\PendingRequest withoutVerifying() - * @method static \Illuminate\Http\Client\PendingRequest sink(string|resource $to) - * @method static \Illuminate\Http\Client\PendingRequest timeout(int $seconds) - * @method static \Illuminate\Http\Client\PendingRequest connectTimeout(int $seconds) - * @method static \Illuminate\Http\Client\PendingRequest retry(int $times, \Closure|int $sleepMilliseconds = 0, callable|null $when = null, bool $throw = true) - * @method static \Illuminate\Http\Client\PendingRequest withOptions(array $options) - * @method static \Illuminate\Http\Client\PendingRequest withMiddleware(callable $middleware) - * @method static \Illuminate\Http\Client\PendingRequest withRequestMiddleware(callable $middleware) - * @method static \Illuminate\Http\Client\PendingRequest withResponseMiddleware(callable $middleware) - * @method static \Illuminate\Http\Client\PendingRequest beforeSending(callable $callback) - * @method static \Illuminate\Http\Client\PendingRequest throw(callable|null $callback = null) - * @method static \Illuminate\Http\Client\PendingRequest throwIf(callable|bool $condition, callable|null $throwCallback = null) - * @method static \Illuminate\Http\Client\PendingRequest throwUnless(bool $condition) - * @method static \Illuminate\Http\Client\PendingRequest dump() - * @method static \Illuminate\Http\Client\PendingRequest dd() - * @method static \Illuminate\Http\Client\Response get(string $url, array|string|null $query = null) - * @method static \Illuminate\Http\Client\Response head(string $url, array|string|null $query = null) - * @method static \Illuminate\Http\Client\Response post(string $url, array $data = []) - * @method static \Illuminate\Http\Client\Response patch(string $url, array $data = []) - * @method static \Illuminate\Http\Client\Response put(string $url, array $data = []) - * @method static \Illuminate\Http\Client\Response delete(string $url, array $data = []) - * @method static array pool(callable $callback) - * @method static \Illuminate\Http\Client\Response send(string $method, string $url, array $options = []) - * @method static \GuzzleHttp\Client buildClient() - * @method static \GuzzleHttp\Client createClient(\GuzzleHttp\HandlerStack $handlerStack) - * @method static \GuzzleHttp\HandlerStack buildHandlerStack() - * @method static \GuzzleHttp\HandlerStack pushHandlers(\GuzzleHttp\HandlerStack $handlerStack) - * @method static \Closure buildBeforeSendingHandler() - * @method static \Closure buildRecorderHandler() - * @method static \Closure buildStubHandler() - * @method static \GuzzleHttp\Psr7\RequestInterface runBeforeSendingCallbacks(\GuzzleHttp\Psr7\RequestInterface $request, array $options) - * @method static array mergeOptions(array ...$options) - * @method static \Illuminate\Http\Client\PendingRequest stub(callable $callback) - * @method static \Illuminate\Http\Client\PendingRequest async(bool $async = true) - * @method static \GuzzleHttp\Promise\PromiseInterface|null getPromise() - * @method static \Illuminate\Http\Client\PendingRequest setClient(\GuzzleHttp\Client $client) - * @method static \Illuminate\Http\Client\PendingRequest setHandler(callable $handler) - * @method static array getOptions() - * @method static \Illuminate\Http\Client\PendingRequest|mixed when(\Closure|mixed|null $value = null, callable|null $callback = null, callable|null $default = null) - * @method static \Illuminate\Http\Client\PendingRequest|mixed unless(\Closure|mixed|null $value = null, callable|null $callback = null, callable|null $default = null) - * @see \Illuminate\Http\Client\Factory - */ - class Http { - /** - * Add middleware to apply to every request. - * - * @param callable $middleware - * @return \Illuminate\Http\Client\Factory - * @static - */ - public static function globalMiddleware($middleware) - { - /** @var \Illuminate\Http\Client\Factory $instance */ - return $instance->globalMiddleware($middleware); - } - /** - * Add request middleware to apply to every request. - * - * @param callable $middleware - * @return \Illuminate\Http\Client\Factory - * @static - */ - public static function globalRequestMiddleware($middleware) - { - /** @var \Illuminate\Http\Client\Factory $instance */ - return $instance->globalRequestMiddleware($middleware); - } - /** - * Add response middleware to apply to every request. - * - * @param callable $middleware - * @return \Illuminate\Http\Client\Factory - * @static - */ - public static function globalResponseMiddleware($middleware) - { - /** @var \Illuminate\Http\Client\Factory $instance */ - return $instance->globalResponseMiddleware($middleware); - } - /** - * Create a new response instance for use during stubbing. - * - * @param array|string|null $body - * @param int $status - * @param array $headers - * @return \GuzzleHttp\Promise\PromiseInterface - * @static - */ - public static function response($body = null, $status = 200, $headers = []) - { - return \Illuminate\Http\Client\Factory::response($body, $status, $headers); - } - /** - * Get an invokable object that returns a sequence of responses in order for use during stubbing. - * - * @param array $responses - * @return \Illuminate\Http\Client\ResponseSequence - * @static - */ - public static function sequence($responses = []) - { - /** @var \Illuminate\Http\Client\Factory $instance */ - return $instance->sequence($responses); - } - /** - * Register a stub callable that will intercept requests and be able to return stub responses. - * - * @param callable|array|null $callback - * @return \Illuminate\Http\Client\Factory - * @static - */ - public static function fake($callback = null) - { - /** @var \Illuminate\Http\Client\Factory $instance */ - return $instance->fake($callback); - } - /** - * Register a response sequence for the given URL pattern. - * - * @param string $url - * @return \Illuminate\Http\Client\ResponseSequence - * @static - */ - public static function fakeSequence($url = '*') - { - /** @var \Illuminate\Http\Client\Factory $instance */ - return $instance->fakeSequence($url); - } - /** - * Stub the given URL using the given callback. - * - * @param string $url - * @param \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface|callable $callback - * @return \Illuminate\Http\Client\Factory - * @static - */ - public static function stubUrl($url, $callback) - { - /** @var \Illuminate\Http\Client\Factory $instance */ - return $instance->stubUrl($url, $callback); - } - /** - * Indicate that an exception should be thrown if any request is not faked. - * - * @param bool $prevent - * @return \Illuminate\Http\Client\Factory - * @static - */ - public static function preventStrayRequests($prevent = true) - { - /** @var \Illuminate\Http\Client\Factory $instance */ - return $instance->preventStrayRequests($prevent); - } - /** - * Indicate that an exception should not be thrown if any request is not faked. - * - * @return \Illuminate\Http\Client\Factory - * @static - */ - public static function allowStrayRequests() - { - /** @var \Illuminate\Http\Client\Factory $instance */ - return $instance->allowStrayRequests(); - } - /** - * Record a request response pair. - * - * @param \Illuminate\Http\Client\Request $request - * @param \Illuminate\Http\Client\Response $response - * @return void - * @static - */ - public static function recordRequestResponsePair($request, $response) - { - /** @var \Illuminate\Http\Client\Factory $instance */ - $instance->recordRequestResponsePair($request, $response); - } - /** - * Assert that a request / response pair was recorded matching a given truth test. - * - * @param callable $callback - * @return void - * @static - */ - public static function assertSent($callback) - { - /** @var \Illuminate\Http\Client\Factory $instance */ - $instance->assertSent($callback); - } - /** - * Assert that the given request was sent in the given order. - * - * @param array $callbacks - * @return void - * @static - */ - public static function assertSentInOrder($callbacks) - { - /** @var \Illuminate\Http\Client\Factory $instance */ - $instance->assertSentInOrder($callbacks); - } - /** - * Assert that a request / response pair was not recorded matching a given truth test. - * - * @param callable $callback - * @return void - * @static - */ - public static function assertNotSent($callback) - { - /** @var \Illuminate\Http\Client\Factory $instance */ - $instance->assertNotSent($callback); - } - /** - * Assert that no request / response pair was recorded. - * - * @return void - * @static - */ - public static function assertNothingSent() - { - /** @var \Illuminate\Http\Client\Factory $instance */ - $instance->assertNothingSent(); - } - /** - * Assert how many requests have been recorded. - * - * @param int $count - * @return void - * @static - */ - public static function assertSentCount($count) - { - /** @var \Illuminate\Http\Client\Factory $instance */ - $instance->assertSentCount($count); - } - /** - * Assert that every created response sequence is empty. - * - * @return void - * @static - */ - public static function assertSequencesAreEmpty() - { - /** @var \Illuminate\Http\Client\Factory $instance */ - $instance->assertSequencesAreEmpty(); - } - /** - * Get a collection of the request / response pairs matching the given truth test. - * - * @param callable $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function recorded($callback = null) - { - /** @var \Illuminate\Http\Client\Factory $instance */ - return $instance->recorded($callback); - } - /** - * Get the current event dispatcher implementation. - * - * @return \Illuminate\Contracts\Events\Dispatcher|null - * @static - */ - public static function getDispatcher() - { - /** @var \Illuminate\Http\Client\Factory $instance */ - return $instance->getDispatcher(); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Http\Client\Factory::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Http\Client\Factory::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Http\Client\Factory::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Http\Client\Factory::flushMacros(); - } - /** - * Dynamically handle calls to the class. - * - * @param string $method - * @param array $parameters - * @return mixed - * @throws \BadMethodCallException - * @static - */ - public static function macroCall($method, $parameters) - { - /** @var \Illuminate\Http\Client\Factory $instance */ - return $instance->macroCall($method, $parameters); - } - - } - /** - * - * - * @see \Illuminate\Translation\Translator - */ - class Lang { - /** - * Determine if a translation exists for a given locale. - * - * @param string $key - * @param string|null $locale - * @return bool - * @static - */ - public static function hasForLocale($key, $locale = null) - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->hasForLocale($key, $locale); - } - /** - * Determine if a translation exists. - * - * @param string $key - * @param string|null $locale - * @param bool $fallback - * @return bool - * @static - */ - public static function has($key, $locale = null, $fallback = true) - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->has($key, $locale, $fallback); - } - /** - * Get the translation for the given key. - * - * @param string $key - * @param array $replace - * @param string|null $locale - * @param bool $fallback - * @return string|array - * @static - */ - public static function get($key, $replace = [], $locale = null, $fallback = true) - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->get($key, $replace, $locale, $fallback); - } - /** - * Get a translation according to an integer value. - * - * @param string $key - * @param \Countable|int|array $number - * @param array $replace - * @param string|null $locale - * @return string - * @static - */ - public static function choice($key, $number, $replace = [], $locale = null) - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->choice($key, $number, $replace, $locale); - } - /** - * Add translation lines to the given locale. - * - * @param array $lines - * @param string $locale - * @param string $namespace - * @return void - * @static - */ - public static function addLines($lines, $locale, $namespace = '*') - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->addLines($lines, $locale, $namespace); - } - /** - * Load the specified language group. - * - * @param string $namespace - * @param string $group - * @param string $locale - * @return void - * @static - */ - public static function load($namespace, $group, $locale) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->load($namespace, $group, $locale); - } - /** - * Add a new namespace to the loader. - * - * @param string $namespace - * @param string $hint - * @return void - * @static - */ - public static function addNamespace($namespace, $hint) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->addNamespace($namespace, $hint); - } - /** - * Add a new JSON path to the loader. - * - * @param string $path - * @return void - * @static - */ - public static function addJsonPath($path) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->addJsonPath($path); - } - /** - * Parse a key into namespace, group, and item. - * - * @param string $key - * @return array - * @static - */ - public static function parseKey($key) - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->parseKey($key); - } - /** - * Specify a callback that should be invoked to determined the applicable locale array. - * - * @param callable $callback - * @return void - * @static - */ - public static function determineLocalesUsing($callback) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->determineLocalesUsing($callback); - } - /** - * Get the message selector instance. - * - * @return \Illuminate\Translation\MessageSelector - * @static - */ - public static function getSelector() - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->getSelector(); - } - /** - * Set the message selector instance. - * - * @param \Illuminate\Translation\MessageSelector $selector - * @return void - * @static - */ - public static function setSelector($selector) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->setSelector($selector); - } - /** - * Get the language line loader implementation. - * - * @return \Illuminate\Contracts\Translation\Loader - * @static - */ - public static function getLoader() - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->getLoader(); - } - /** - * Get the default locale being used. - * - * @return string - * @static - */ - public static function locale() - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->locale(); - } - /** - * Get the default locale being used. - * - * @return string - * @static - */ - public static function getLocale() - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->getLocale(); - } - /** - * Set the default locale. - * - * @param string $locale - * @return void - * @throws \InvalidArgumentException - * @static - */ - public static function setLocale($locale) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->setLocale($locale); - } - /** - * Get the fallback locale being used. - * - * @return string - * @static - */ - public static function getFallback() - { - /** @var \Illuminate\Translation\Translator $instance */ - return $instance->getFallback(); - } - /** - * Set the fallback locale being used. - * - * @param string $fallback - * @return void - * @static - */ - public static function setFallback($fallback) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->setFallback($fallback); - } - /** - * Set the loaded translation groups. - * - * @param array $loaded - * @return void - * @static - */ - public static function setLoaded($loaded) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->setLoaded($loaded); - } - /** - * Add a handler to be executed in order to format a given class to a string during translation replacements. - * - * @param callable|string $class - * @param callable|null $handler - * @return void - * @static - */ - public static function stringable($class, $handler = null) - { - /** @var \Illuminate\Translation\Translator $instance */ - $instance->stringable($class, $handler); - } - /** - * Set the parsed value of a key. - * - * @param string $key - * @param array $parsed - * @return void - * @static - */ - public static function setParsedKey($key, $parsed) - { //Method inherited from \Illuminate\Support\NamespacedItemResolver - /** @var \Illuminate\Translation\Translator $instance */ - $instance->setParsedKey($key, $parsed); - } - /** - * Flush the cache of parsed keys. - * - * @return void - * @static - */ - public static function flushParsedKeys() - { //Method inherited from \Illuminate\Support\NamespacedItemResolver - /** @var \Illuminate\Translation\Translator $instance */ - $instance->flushParsedKeys(); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Translation\Translator::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Translation\Translator::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Translation\Translator::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Translation\Translator::flushMacros(); - } - - } - /** - * - * - * @method static void write(string $level, \Illuminate\Contracts\Support\Arrayable|\Illuminate\Contracts\Support\Jsonable|\Illuminate\Support\Stringable|array|string $message, array $context = []) - * @method static \Illuminate\Log\Logger withContext(array $context = []) - * @method static \Illuminate\Log\Logger withoutContext() - * @method static void listen(\Closure $callback) - * @method static \Psr\Log\LoggerInterface getLogger() - * @method static \Illuminate\Contracts\Events\Dispatcher getEventDispatcher() - * @method static void setEventDispatcher(\Illuminate\Contracts\Events\Dispatcher $dispatcher) - * @method static \Illuminate\Log\Logger|mixed when(\Closure|mixed|null $value = null, callable|null $callback = null, callable|null $default = null) - * @method static \Illuminate\Log\Logger|mixed unless(\Closure|mixed|null $value = null, callable|null $callback = null, callable|null $default = null) - * @see \Illuminate\Log\LogManager - */ - class Log { - /** - * Build an on-demand log channel. - * - * @param array $config - * @return \Psr\Log\LoggerInterface - * @static - */ - public static function build($config) - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->build($config); - } - /** - * Create a new, on-demand aggregate logger instance. - * - * @param array $channels - * @param string|null $channel - * @return \Psr\Log\LoggerInterface - * @static - */ - public static function stack($channels, $channel = null) - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->stack($channels, $channel); - } - /** - * Get a log channel instance. - * - * @param string|null $channel - * @return \Psr\Log\LoggerInterface - * @static - */ - public static function channel($channel = null) - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->channel($channel); - } - /** - * Get a log driver instance. - * - * @param string|null $driver - * @return \Psr\Log\LoggerInterface - * @static - */ - public static function driver($driver = null) - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->driver($driver); - } - /** - * Share context across channels and stacks. - * - * @param array $context - * @return \Illuminate\Log\LogManager - * @static - */ - public static function shareContext($context) - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->shareContext($context); - } - /** - * The context shared across channels and stacks. - * - * @return array - * @static - */ - public static function sharedContext() - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->sharedContext(); - } - /** - * Flush the shared context. - * - * @return \Illuminate\Log\LogManager - * @static - */ - public static function flushSharedContext() - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->flushSharedContext(); - } - /** - * Get the default log driver name. - * - * @return string|null - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the default log driver name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->setDefaultDriver($name); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Log\LogManager - * @static - */ - public static function extend($driver, $callback) - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Unset the given channel instance. - * - * @param string|null $driver - * @return void - * @static - */ - public static function forgetChannel($driver = null) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->forgetChannel($driver); - } - /** - * Get all of the resolved log channels. - * - * @return array - * @static - */ - public static function getChannels() - { - /** @var \Illuminate\Log\LogManager $instance */ - return $instance->getChannels(); - } - /** - * System is unusable. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function emergency($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->emergency($message, $context); - } - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function alert($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->alert($message, $context); - } - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function critical($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->critical($message, $context); - } - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function error($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->error($message, $context); - } - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function warning($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->warning($message, $context); - } - /** - * Normal but significant events. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function notice($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->notice($message, $context); - } - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function info($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->info($message, $context); - } - /** - * Detailed debug information. - * - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function debug($message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->debug($message, $context); - } - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string $message - * @param array $context - * @return void - * @static - */ - public static function log($level, $message, $context = []) - { - /** @var \Illuminate\Log\LogManager $instance */ - $instance->log($level, $message, $context); - } - - } - /** - * - * - * @method static void alwaysFrom(string $address, string|null $name = null) - * @method static void alwaysReplyTo(string $address, string|null $name = null) - * @method static void alwaysReturnPath(string $address) - * @method static void alwaysTo(string $address, string|null $name = null) - * @method static \Illuminate\Mail\SentMessage|null html(string $html, mixed $callback) - * @method static \Illuminate\Mail\SentMessage|null plain(string $view, array $data, mixed $callback) - * @method static string render(string|array $view, array $data = []) - * @method static mixed onQueue(string $queue, \Illuminate\Contracts\Mail\Mailable $view) - * @method static mixed queueOn(string $queue, \Illuminate\Contracts\Mail\Mailable $view) - * @method static mixed laterOn(string $queue, \DateTimeInterface|\DateInterval|int $delay, \Illuminate\Contracts\Mail\Mailable $view) - * @method static \Symfony\Component\Mailer\Transport\TransportInterface getSymfonyTransport() - * @method static \Illuminate\Contracts\View\Factory getViewFactory() - * @method static void setSymfonyTransport(\Symfony\Component\Mailer\Transport\TransportInterface $transport) - * @method static \Illuminate\Mail\Mailer setQueue(\Illuminate\Contracts\Queue\Factory $queue) - * @method static void macro(string $name, object|callable $macro) - * @method static void mixin(object $mixin, bool $replace = true) - * @method static bool hasMacro(string $name) - * @method static void flushMacros() - * @see \Illuminate\Mail\MailManager - * @see \Illuminate\Support\Testing\Fakes\MailFake - */ - class Mail { - /** - * Get a mailer instance by name. - * - * @param string|null $name - * @return \Illuminate\Contracts\Mail\Mailer - * @static - */ - public static function mailer($name = null) - { - /** @var \Illuminate\Mail\MailManager $instance */ - return $instance->mailer($name); - } - /** - * Get a mailer driver instance. - * - * @param string|null $driver - * @return \Illuminate\Mail\Mailer - * @static - */ - public static function driver($driver = null) - { - /** @var \Illuminate\Mail\MailManager $instance */ - return $instance->driver($driver); - } - /** - * Create a new transport instance. - * - * @param array $config - * @return \Symfony\Component\Mailer\Transport\TransportInterface - * @throws \InvalidArgumentException - * @static - */ - public static function createSymfonyTransport($config) - { - /** @var \Illuminate\Mail\MailManager $instance */ - return $instance->createSymfonyTransport($config); - } - /** - * Get the default mail driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Mail\MailManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the default mail driver name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Mail\MailManager $instance */ - $instance->setDefaultDriver($name); - } - /** - * Disconnect the given mailer and remove from local cache. - * - * @param string|null $name - * @return void - * @static - */ - public static function purge($name = null) - { - /** @var \Illuminate\Mail\MailManager $instance */ - $instance->purge($name); - } - /** - * Register a custom transport creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Mail\MailManager - * @static - */ - public static function extend($driver, $callback) - { - /** @var \Illuminate\Mail\MailManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Get the application instance used by the manager. - * - * @return \Illuminate\Contracts\Foundation\Application - * @static - */ - public static function getApplication() - { - /** @var \Illuminate\Mail\MailManager $instance */ - return $instance->getApplication(); - } - /** - * Set the application instance used by the manager. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @return \Illuminate\Mail\MailManager - * @static - */ - public static function setApplication($app) - { - /** @var \Illuminate\Mail\MailManager $instance */ - return $instance->setApplication($app); - } - /** - * Forget all of the resolved mailer instances. - * - * @return \Illuminate\Mail\MailManager - * @static - */ - public static function forgetMailers() - { - /** @var \Illuminate\Mail\MailManager $instance */ - return $instance->forgetMailers(); - } - /** - * Assert if a mailable was sent based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|int|null $callback - * @return void - * @static - */ - public static function assertSent($mailable, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertSent($mailable, $callback); - } - /** - * Determine if a mailable was not sent or queued to be sent based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|null $callback - * @return void - * @static - */ - public static function assertNotOutgoing($mailable, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertNotOutgoing($mailable, $callback); - } - /** - * Determine if a mailable was not sent based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|null $callback - * @return void - * @static - */ - public static function assertNotSent($mailable, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertNotSent($mailable, $callback); - } - /** - * Assert that no mailables were sent or queued to be sent. - * - * @return void - * @static - */ - public static function assertNothingOutgoing() - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertNothingOutgoing(); - } - /** - * Assert that no mailables were sent. - * - * @return void - * @static - */ - public static function assertNothingSent() - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertNothingSent(); - } - /** - * Assert if a mailable was queued based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|int|null $callback - * @return void - * @static - */ - public static function assertQueued($mailable, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertQueued($mailable, $callback); - } - /** - * Determine if a mailable was not queued based on a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|null $callback - * @return void - * @static - */ - public static function assertNotQueued($mailable, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertNotQueued($mailable, $callback); - } - /** - * Assert that no mailables were queued. - * - * @return void - * @static - */ - public static function assertNothingQueued() - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertNothingQueued(); - } - /** - * Assert the total number of mailables that were sent. - * - * @param int $count - * @return void - * @static - */ - public static function assertSentCount($count) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertSentCount($count); - } - /** - * Assert the total number of mailables that were queued. - * - * @param int $count - * @return void - * @static - */ - public static function assertQueuedCount($count) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertQueuedCount($count); - } - /** - * Assert the total number of mailables that were sent or queued. - * - * @param int $count - * @return void - * @static - */ - public static function assertOutgoingCount($count) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->assertOutgoingCount($count); - } - /** - * Get all of the mailables matching a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function sent($mailable, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - return $instance->sent($mailable, $callback); - } - /** - * Determine if the given mailable has been sent. - * - * @param string $mailable - * @return bool - * @static - */ - public static function hasSent($mailable) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - return $instance->hasSent($mailable); - } - /** - * Get all of the queued mailables matching a truth-test callback. - * - * @param string|\Closure $mailable - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function queued($mailable, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - return $instance->queued($mailable, $callback); - } - /** - * Determine if the given mailable has been queued. - * - * @param string $mailable - * @return bool - * @static - */ - public static function hasQueued($mailable) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - return $instance->hasQueued($mailable); - } - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - * @static - */ - public static function to($users) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - return $instance->to($users); - } - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - * @static - */ - public static function cc($users) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - return $instance->cc($users); - } - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - * @static - */ - public static function bcc($users) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - return $instance->bcc($users); - } - /** - * Send a new message with only a raw text part. - * - * @param string $text - * @param \Closure|string $callback - * @return void - * @static - */ - public static function raw($text, $callback) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->raw($text, $callback); - } - /** - * Send a new message using a view. - * - * @param \Illuminate\Contracts\Mail\Mailable|string|array $view - * @param array $data - * @param \Closure|string|null $callback - * @return void - * @static - */ - public static function send($view, $data = [], $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - $instance->send($view, $data, $callback); - } - /** - * Queue a new e-mail message for sending. - * - * @param \Illuminate\Contracts\Mail\Mailable|string|array $view - * @param string|null $queue - * @return mixed - * @static - */ - public static function queue($view, $queue = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - return $instance->queue($view, $queue); - } - /** - * Queue a new e-mail message for sending after (n) seconds. - * - * @param \DateTimeInterface|\DateInterval|int $delay - * @param \Illuminate\Contracts\Mail\Mailable|string|array $view - * @param string|null $queue - * @return mixed - * @static - */ - public static function later($delay, $view, $queue = null) - { - /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ - return $instance->later($delay, $view, $queue); - } - - } - /** - * - * - * @see \Illuminate\Notifications\ChannelManager - * @see \Illuminate\Support\Testing\Fakes\NotificationFake - */ - class Notification { - /** - * Send the given notification to the given notifiable entities. - * - * @param \Illuminate\Support\Collection|array|mixed $notifiables - * @param mixed $notification - * @return void - * @static - */ - public static function send($notifiables, $notification) - { - /** @var \Illuminate\Notifications\ChannelManager $instance */ - $instance->send($notifiables, $notification); - } - /** - * Send the given notification immediately. - * - * @param \Illuminate\Support\Collection|array|mixed $notifiables - * @param mixed $notification - * @param array|null $channels - * @return void - * @static - */ - public static function sendNow($notifiables, $notification, $channels = null) - { - /** @var \Illuminate\Notifications\ChannelManager $instance */ - $instance->sendNow($notifiables, $notification, $channels); - } - /** - * Get a channel instance. - * - * @param string|null $name - * @return mixed - * @static - */ - public static function channel($name = null) - { - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->channel($name); - } - /** - * Get the default channel driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Get the default channel driver name. - * - * @return string - * @static - */ - public static function deliversVia() - { - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->deliversVia(); - } - /** - * Set the default channel driver name. - * - * @param string $channel - * @return void - * @static - */ - public static function deliverVia($channel) - { - /** @var \Illuminate\Notifications\ChannelManager $instance */ - $instance->deliverVia($channel); - } - /** - * Set the locale of notifications. - * - * @param string $locale - * @return \Illuminate\Notifications\ChannelManager - * @static - */ - public static function locale($locale) - { - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->locale($locale); - } - /** - * Get a driver instance. - * - * @param string|null $driver - * @return mixed - * @throws \InvalidArgumentException - * @static - */ - public static function driver($driver = null) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->driver($driver); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Notifications\ChannelManager - * @static - */ - public static function extend($driver, $callback) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Get all of the created "drivers". - * - * @return array - * @static - */ - public static function getDrivers() - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->getDrivers(); - } - /** - * Get the container instance used by the manager. - * - * @return \Illuminate\Contracts\Container\Container - * @static - */ - public static function getContainer() - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->getContainer(); - } - /** - * Set the container instance used by the manager. - * - * @param \Illuminate\Contracts\Container\Container $container - * @return \Illuminate\Notifications\ChannelManager - * @static - */ - public static function setContainer($container) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->setContainer($container); - } - /** - * Forget all of the resolved driver instances. - * - * @return \Illuminate\Notifications\ChannelManager - * @static - */ - public static function forgetDrivers() - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Notifications\ChannelManager $instance */ - return $instance->forgetDrivers(); - } - /** - * Assert if a notification was sent on-demand based on a truth-test callback. - * - * @param string|\Closure $notification - * @param callable|null $callback - * @return void - * @throws \Exception - * @static - */ - public static function assertSentOnDemand($notification, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - $instance->assertSentOnDemand($notification, $callback); - } - /** - * Assert if a notification was sent based on a truth-test callback. - * - * @param mixed $notifiable - * @param string|\Closure $notification - * @param callable|null $callback - * @return void - * @throws \Exception - * @static - */ - public static function assertSentTo($notifiable, $notification, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - $instance->assertSentTo($notifiable, $notification, $callback); - } - /** - * Assert if a notification was sent on-demand a number of times. - * - * @param string $notification - * @param int $times - * @return void - * @static - */ - public static function assertSentOnDemandTimes($notification, $times = 1) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - $instance->assertSentOnDemandTimes($notification, $times); - } - /** - * Assert if a notification was sent a number of times. - * - * @param mixed $notifiable - * @param string $notification - * @param int $times - * @return void - * @static - */ - public static function assertSentToTimes($notifiable, $notification, $times = 1) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - $instance->assertSentToTimes($notifiable, $notification, $times); - } - /** - * Determine if a notification was sent based on a truth-test callback. - * - * @param mixed $notifiable - * @param string|\Closure $notification - * @param callable|null $callback - * @return void - * @throws \Exception - * @static - */ - public static function assertNotSentTo($notifiable, $notification, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - $instance->assertNotSentTo($notifiable, $notification, $callback); - } - /** - * Assert that no notifications were sent. - * - * @return void - * @static - */ - public static function assertNothingSent() - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - $instance->assertNothingSent(); - } - /** - * Assert that no notifications were sent to the given notifiable. - * - * @param mixed $notifiable - * @return void - * @throws \Exception - * @static - */ - public static function assertNothingSentTo($notifiable) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - $instance->assertNothingSentTo($notifiable); - } - /** - * Assert the total amount of times a notification was sent. - * - * @param string $notification - * @param int $expectedCount - * @return void - * @static - */ - public static function assertSentTimes($notification, $expectedCount) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - $instance->assertSentTimes($notification, $expectedCount); - } - /** - * Assert the total count of notification that were sent. - * - * @param int $expectedCount - * @return void - * @static - */ - public static function assertCount($expectedCount) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - $instance->assertCount($expectedCount); - } - /** - * Get all of the notifications matching a truth-test callback. - * - * @param mixed $notifiable - * @param string $notification - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function sent($notifiable, $notification, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - return $instance->sent($notifiable, $notification, $callback); - } - /** - * Determine if there are more notifications left to inspect. - * - * @param mixed $notifiable - * @param string $notification - * @return bool - * @static - */ - public static function hasSent($notifiable, $notification) - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - return $instance->hasSent($notifiable, $notification); - } - /** - * Get the notifications that have been sent. - * - * @return array - * @static - */ - public static function sentNotifications() - { - /** @var \Illuminate\Support\Testing\Fakes\NotificationFake $instance */ - return $instance->sentNotifications(); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Support\Testing\Fakes\NotificationFake::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Support\Testing\Fakes\NotificationFake::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Support\Testing\Fakes\NotificationFake::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Support\Testing\Fakes\NotificationFake::flushMacros(); - } - - } - /** - * - * - * @method static string sendResetLink(array $credentials, \Closure|null $callback = null) - * @method static mixed reset(array $credentials, \Closure $callback) - * @method static \Illuminate\Contracts\Auth\CanResetPassword|null getUser(array $credentials) - * @method static string createToken(\Illuminate\Contracts\Auth\CanResetPassword $user) - * @method static void deleteToken(\Illuminate\Contracts\Auth\CanResetPassword $user) - * @method static bool tokenExists(\Illuminate\Contracts\Auth\CanResetPassword $user, string $token) - * @method static \Illuminate\Auth\Passwords\TokenRepositoryInterface getRepository() - * @see \Illuminate\Auth\Passwords\PasswordBrokerManager - * @see \Illuminate\Auth\Passwords\PasswordBroker - */ - class Password { - /** - * Attempt to get the broker from the local cache. - * - * @param string|null $name - * @return \Illuminate\Contracts\Auth\PasswordBroker - * @static - */ - public static function broker($name = null) - { - /** @var \Illuminate\Auth\Passwords\PasswordBrokerManager $instance */ - return $instance->broker($name); - } - /** - * Get the default password broker name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Auth\Passwords\PasswordBrokerManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the default password broker name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Auth\Passwords\PasswordBrokerManager $instance */ - $instance->setDefaultDriver($name); - } - - } - /** - * - * - * @method static \Illuminate\Process\PendingProcess command(array|string $command) - * @method static \Illuminate\Process\PendingProcess path(string $path) - * @method static \Illuminate\Process\PendingProcess timeout(int $timeout) - * @method static \Illuminate\Process\PendingProcess idleTimeout(int $timeout) - * @method static \Illuminate\Process\PendingProcess forever() - * @method static \Illuminate\Process\PendingProcess env(array $environment) - * @method static \Illuminate\Process\PendingProcess input(\Traversable|resource|string|int|float|bool|null $input) - * @method static \Illuminate\Process\PendingProcess quietly() - * @method static \Illuminate\Process\PendingProcess tty(bool $tty = true) - * @method static \Illuminate\Process\PendingProcess options(array $options) - * @method static \Illuminate\Contracts\Process\ProcessResult run(array|string|null $command = null, callable|null $output = null) - * @method static \Illuminate\Process\InvokedProcess start(array|string|null $command = null, callable $output = null) - * @method static \Illuminate\Process\PendingProcess withFakeHandlers(array $fakeHandlers) - * @method static \Illuminate\Process\PendingProcess|mixed when(\Closure|mixed|null $value = null, callable|null $callback = null, callable|null $default = null) - * @method static \Illuminate\Process\PendingProcess|mixed unless(\Closure|mixed|null $value = null, callable|null $callback = null, callable|null $default = null) - * @see \Illuminate\Process\PendingProcess - * @see \Illuminate\Process\Factory - */ - class Process { - /** - * Create a new fake process response for testing purposes. - * - * @param array|string $output - * @param array|string $errorOutput - * @param int $exitCode - * @return \Illuminate\Process\FakeProcessResult - * @static - */ - public static function result($output = '', $errorOutput = '', $exitCode = 0) - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->result($output, $errorOutput, $exitCode); - } - /** - * Begin describing a fake process lifecycle. - * - * @return \Illuminate\Process\FakeProcessDescription - * @static - */ - public static function describe() - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->describe(); - } - /** - * Begin describing a fake process sequence. - * - * @param array $processes - * @return \Illuminate\Process\FakeProcessSequence - * @static - */ - public static function sequence($processes = []) - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->sequence($processes); - } - /** - * Indicate that the process factory should fake processes. - * - * @param \Closure|array|null $callback - * @return \Illuminate\Process\Factory - * @static - */ - public static function fake($callback = null) - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->fake($callback); - } - /** - * Determine if the process factory has fake process handlers and is recording processes. - * - * @return bool - * @static - */ - public static function isRecording() - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->isRecording(); - } - /** - * Record the given process if processes should be recorded. - * - * @param \Illuminate\Process\PendingProcess $process - * @param \Illuminate\Contracts\Process\ProcessResult $result - * @return \Illuminate\Process\Factory - * @static - */ - public static function recordIfRecording($process, $result) - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->recordIfRecording($process, $result); - } - /** - * Record the given process. - * - * @param \Illuminate\Process\PendingProcess $process - * @param \Illuminate\Contracts\Process\ProcessResult $result - * @return \Illuminate\Process\Factory - * @static - */ - public static function record($process, $result) - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->record($process, $result); - } - /** - * Indicate that an exception should be thrown if any process is not faked. - * - * @param bool $prevent - * @return \Illuminate\Process\Factory - * @static - */ - public static function preventStrayProcesses($prevent = true) - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->preventStrayProcesses($prevent); - } - /** - * Determine if stray processes are being prevented. - * - * @return bool - * @static - */ - public static function preventingStrayProcesses() - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->preventingStrayProcesses(); - } - /** - * Assert that a process was recorded matching a given truth test. - * - * @param \Closure|string $callback - * @return \Illuminate\Process\Factory - * @static - */ - public static function assertRan($callback) - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->assertRan($callback); - } - /** - * Assert that a process was recorded a given number of times matching a given truth test. - * - * @param \Closure|string $callback - * @param int $times - * @return \Illuminate\Process\Factory - * @static - */ - public static function assertRanTimes($callback, $times = 1) - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->assertRanTimes($callback, $times); - } - /** - * Assert that a process was not recorded matching a given truth test. - * - * @param \Closure|string $callback - * @return \Illuminate\Process\Factory - * @static - */ - public static function assertNotRan($callback) - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->assertNotRan($callback); - } - /** - * Assert that a process was not recorded matching a given truth test. - * - * @param \Closure|string $callback - * @return \Illuminate\Process\Factory - * @static - */ - public static function assertDidntRun($callback) - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->assertDidntRun($callback); - } - /** - * Assert that no processes were recorded. - * - * @return \Illuminate\Process\Factory - * @static - */ - public static function assertNothingRan() - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->assertNothingRan(); - } - /** - * Start defining a pool of processes. - * - * @param callable $callback - * @return \Illuminate\Process\Pool - * @static - */ - public static function pool($callback) - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->pool($callback); - } - /** - * Start defining a series of piped processes. - * - * @param callable|array $callback - * @return \Illuminate\Contracts\Process\ProcessResult - * @static - */ - public static function pipe($callback, $output = null) - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->pipe($callback, $output); - } - /** - * Run a pool of processes and wait for them to finish executing. - * - * @param callable $callback - * @param callable|null $output - * @return \Illuminate\Process\ProcessPoolResults - * @static - */ - public static function concurrently($callback, $output = null) - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->concurrently($callback, $output); - } - /** - * Create a new pending process associated with this factory. - * - * @return \Illuminate\Process\PendingProcess - * @static - */ - public static function newPendingProcess() - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->newPendingProcess(); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Process\Factory::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Process\Factory::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Process\Factory::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Process\Factory::flushMacros(); - } - /** - * Dynamically handle calls to the class. - * - * @param string $method - * @param array $parameters - * @return mixed - * @throws \BadMethodCallException - * @static - */ - public static function macroCall($method, $parameters) - { - /** @var \Illuminate\Process\Factory $instance */ - return $instance->macroCall($method, $parameters); - } - - } - /** - * - * - * @see \Illuminate\Queue\QueueManager - * @see \Illuminate\Queue\Queue - * @see \Illuminate\Support\Testing\Fakes\QueueFake - */ - class Queue { - /** - * Register an event listener for the before job event. - * - * @param mixed $callback - * @return void - * @static - */ - public static function before($callback) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->before($callback); - } - /** - * Register an event listener for the after job event. - * - * @param mixed $callback - * @return void - * @static - */ - public static function after($callback) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->after($callback); - } - /** - * Register an event listener for the exception occurred job event. - * - * @param mixed $callback - * @return void - * @static - */ - public static function exceptionOccurred($callback) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->exceptionOccurred($callback); - } - /** - * Register an event listener for the daemon queue loop. - * - * @param mixed $callback - * @return void - * @static - */ - public static function looping($callback) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->looping($callback); - } - /** - * Register an event listener for the failed job event. - * - * @param mixed $callback - * @return void - * @static - */ - public static function failing($callback) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->failing($callback); - } - /** - * Register an event listener for the daemon queue stopping. - * - * @param mixed $callback - * @return void - * @static - */ - public static function stopping($callback) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->stopping($callback); - } - /** - * Determine if the driver is connected. - * - * @param string|null $name - * @return bool - * @static - */ - public static function connected($name = null) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - return $instance->connected($name); - } - /** - * Resolve a queue connection instance. - * - * @param string|null $name - * @return \Illuminate\Contracts\Queue\Queue - * @static - */ - public static function connection($name = null) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - return $instance->connection($name); - } - /** - * Add a queue connection resolver. - * - * @param string $driver - * @param \Closure $resolver - * @return void - * @static - */ - public static function extend($driver, $resolver) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->extend($driver, $resolver); - } - /** - * Add a queue connection resolver. - * - * @param string $driver - * @param \Closure $resolver - * @return void - * @static - */ - public static function addConnector($driver, $resolver) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->addConnector($driver, $resolver); - } - /** - * Get the name of the default queue connection. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Queue\QueueManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the name of the default queue connection. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - $instance->setDefaultDriver($name); - } - /** - * Get the full name for the given connection. - * - * @param string|null $connection - * @return string - * @static - */ - public static function getName($connection = null) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - return $instance->getName($connection); - } - /** - * Get the application instance used by the manager. - * - * @return \Illuminate\Contracts\Foundation\Application - * @static - */ - public static function getApplication() - { - /** @var \Illuminate\Queue\QueueManager $instance */ - return $instance->getApplication(); - } - /** - * Set the application instance used by the manager. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @return \Illuminate\Queue\QueueManager - * @static - */ - public static function setApplication($app) - { - /** @var \Illuminate\Queue\QueueManager $instance */ - return $instance->setApplication($app); - } - /** - * Specify the jobs that should be queued instead of faked. - * - * @param array|string $jobsToBeQueued - * @return \Illuminate\Support\Testing\Fakes\QueueFake - * @static - */ - public static function except($jobsToBeQueued) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->except($jobsToBeQueued); - } - /** - * Assert if a job was pushed based on a truth-test callback. - * - * @param string|\Closure $job - * @param callable|int|null $callback - * @return void - * @static - */ - public static function assertPushed($job, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - $instance->assertPushed($job, $callback); - } - /** - * Assert if a job was pushed based on a truth-test callback. - * - * @param string $queue - * @param string|\Closure $job - * @param callable|null $callback - * @return void - * @static - */ - public static function assertPushedOn($queue, $job, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - $instance->assertPushedOn($queue, $job, $callback); - } - /** - * Assert if a job was pushed with chained jobs based on a truth-test callback. - * - * @param string $job - * @param array $expectedChain - * @param callable|null $callback - * @return void - * @static - */ - public static function assertPushedWithChain($job, $expectedChain = [], $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - $instance->assertPushedWithChain($job, $expectedChain, $callback); - } - /** - * Assert if a job was pushed with an empty chain based on a truth-test callback. - * - * @param string $job - * @param callable|null $callback - * @return void - * @static - */ - public static function assertPushedWithoutChain($job, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - $instance->assertPushedWithoutChain($job, $callback); - } - /** - * Assert if a closure was pushed based on a truth-test callback. - * - * @param callable|int|null $callback - * @return void - * @static - */ - public static function assertClosurePushed($callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - $instance->assertClosurePushed($callback); - } - /** - * Assert that a closure was not pushed based on a truth-test callback. - * - * @param callable|null $callback - * @return void - * @static - */ - public static function assertClosureNotPushed($callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - $instance->assertClosureNotPushed($callback); - } - /** - * Determine if a job was pushed based on a truth-test callback. - * - * @param string|\Closure $job - * @param callable|null $callback - * @return void - * @static - */ - public static function assertNotPushed($job, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - $instance->assertNotPushed($job, $callback); - } - /** - * Assert that no jobs were pushed. - * - * @return void - * @static - */ - public static function assertNothingPushed() - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - $instance->assertNothingPushed(); - } - /** - * Get all of the jobs matching a truth-test callback. - * - * @param string $job - * @param callable|null $callback - * @return \Illuminate\Support\Collection - * @static - */ - public static function pushed($job, $callback = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->pushed($job, $callback); - } - /** - * Determine if there are any stored jobs for a given class. - * - * @param string $job - * @return bool - * @static - */ - public static function hasPushed($job) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->hasPushed($job); - } - /** - * Get the size of the queue. - * - * @param string|null $queue - * @return int - * @static - */ - public static function size($queue = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->size($queue); - } - /** - * Push a new job onto the queue. - * - * @param string|object $job - * @param mixed $data - * @param string|null $queue - * @return mixed - * @static - */ - public static function push($job, $data = '', $queue = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->push($job, $data, $queue); - } - /** - * Determine if a job should be faked or actually dispatched. - * - * @param object $job - * @return bool - * @static - */ - public static function shouldFakeJob($job) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->shouldFakeJob($job); - } - /** - * Push a raw payload onto the queue. - * - * @param string $payload - * @param string|null $queue - * @param array $options - * @return mixed - * @static - */ - public static function pushRaw($payload, $queue = null, $options = []) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->pushRaw($payload, $queue, $options); - } - /** - * Push a new job onto the queue after (n) seconds. - * - * @param \DateTimeInterface|\DateInterval|int $delay - * @param string|object $job - * @param mixed $data - * @param string|null $queue - * @return mixed - * @static - */ - public static function later($delay, $job, $data = '', $queue = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->later($delay, $job, $data, $queue); - } - /** - * Push a new job onto the queue. - * - * @param string $queue - * @param string|object $job - * @param mixed $data - * @return mixed - * @static - */ - public static function pushOn($queue, $job, $data = '') - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->pushOn($queue, $job, $data); - } - /** - * Push a new job onto a specific queue after (n) seconds. - * - * @param string $queue - * @param \DateTimeInterface|\DateInterval|int $delay - * @param string|object $job - * @param mixed $data - * @return mixed - * @static - */ - public static function laterOn($queue, $delay, $job, $data = '') - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->laterOn($queue, $delay, $job, $data); - } - /** - * Pop the next job off of the queue. - * - * @param string|null $queue - * @return \Illuminate\Contracts\Queue\Job|null - * @static - */ - public static function pop($queue = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->pop($queue); - } - /** - * Push an array of jobs onto the queue. - * - * @param array $jobs - * @param mixed $data - * @param string|null $queue - * @return mixed - * @static - */ - public static function bulk($jobs, $data = '', $queue = null) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->bulk($jobs, $data, $queue); - } - /** - * Get the jobs that have been pushed. - * - * @return array - * @static - */ - public static function pushedJobs() - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->pushedJobs(); - } - /** - * Specify if jobs should be serialized and restored when being "pushed" to the queue. - * - * @param bool $serializeAndRestore - * @return \Illuminate\Support\Testing\Fakes\QueueFake - * @static - */ - public static function serializeAndRestore($serializeAndRestore = true) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->serializeAndRestore($serializeAndRestore); - } - /** - * Get the connection name for the queue. - * - * @return string - * @static - */ - public static function getConnectionName() - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->getConnectionName(); - } - /** - * Set the connection name for the queue. - * - * @param string $name - * @return \Illuminate\Support\Testing\Fakes\QueueFake - * @static - */ - public static function setConnectionName($name) - { - /** @var \Illuminate\Support\Testing\Fakes\QueueFake $instance */ - return $instance->setConnectionName($name); - } - /** - * Release a reserved job back onto the queue after (n) seconds. - * - * @param string $queue - * @param \Illuminate\Queue\Jobs\DatabaseJobRecord $job - * @param int $delay - * @return mixed - * @static - */ - public static function release($queue, $job, $delay) - { - /** @var \Illuminate\Queue\DatabaseQueue $instance */ - return $instance->release($queue, $job, $delay); - } - /** - * Delete a reserved job from the queue. - * - * @param string $queue - * @param string $id - * @return void - * @throws \Throwable - * @static - */ - public static function deleteReserved($queue, $id) - { - /** @var \Illuminate\Queue\DatabaseQueue $instance */ - $instance->deleteReserved($queue, $id); - } - /** - * Delete a reserved job from the reserved queue and release it. - * - * @param string $queue - * @param \Illuminate\Queue\Jobs\DatabaseJob $job - * @param int $delay - * @return void - * @static - */ - public static function deleteAndRelease($queue, $job, $delay) - { - /** @var \Illuminate\Queue\DatabaseQueue $instance */ - $instance->deleteAndRelease($queue, $job, $delay); - } - /** - * Delete all of the jobs from the queue. - * - * @param string $queue - * @return int - * @static - */ - public static function clear($queue) - { - /** @var \Illuminate\Queue\DatabaseQueue $instance */ - return $instance->clear($queue); - } - /** - * Get the queue or return the default. - * - * @param string|null $queue - * @return string - * @static - */ - public static function getQueue($queue) - { - /** @var \Illuminate\Queue\DatabaseQueue $instance */ - return $instance->getQueue($queue); - } - /** - * Get the underlying database instance. - * - * @return \Illuminate\Database\Connection - * @static - */ - public static function getDatabase() - { - /** @var \Illuminate\Queue\DatabaseQueue $instance */ - return $instance->getDatabase(); - } - /** - * Get the backoff for an object-based queue handler. - * - * @param mixed $job - * @return mixed - * @static - */ - public static function getJobBackoff($job) - { //Method inherited from \Illuminate\Queue\Queue - /** @var \Illuminate\Queue\DatabaseQueue $instance */ - return $instance->getJobBackoff($job); - } - /** - * Get the expiration timestamp for an object-based queue handler. - * - * @param mixed $job - * @return mixed - * @static - */ - public static function getJobExpiration($job) - { //Method inherited from \Illuminate\Queue\Queue - /** @var \Illuminate\Queue\DatabaseQueue $instance */ - return $instance->getJobExpiration($job); - } - /** - * Register a callback to be executed when creating job payloads. - * - * @param callable|null $callback - * @return void - * @static - */ - public static function createPayloadUsing($callback) - { //Method inherited from \Illuminate\Queue\Queue - \Illuminate\Queue\DatabaseQueue::createPayloadUsing($callback); - } - /** - * Get the container instance being used by the connection. - * - * @return \Illuminate\Container\Container - * @static - */ - public static function getContainer() - { //Method inherited from \Illuminate\Queue\Queue - /** @var \Illuminate\Queue\DatabaseQueue $instance */ - return $instance->getContainer(); - } - /** - * Set the IoC container instance. - * - * @param \Illuminate\Container\Container $container - * @return void - * @static - */ - public static function setContainer($container) - { //Method inherited from \Illuminate\Queue\Queue - /** @var \Illuminate\Queue\DatabaseQueue $instance */ - $instance->setContainer($container); - } - - } - /** - * - * - * @see \Illuminate\Cache\RateLimiter - */ - class RateLimiter { - /** - * Register a named limiter configuration. - * - * @param string $name - * @param \Closure $callback - * @return \Illuminate\Cache\RateLimiter - * @static - */ - public static function for($name, $callback) - { - /** @var \Illuminate\Cache\RateLimiter $instance */ - return $instance->for($name, $callback); - } - /** - * Get the given named rate limiter. - * - * @param string $name - * @return \Closure|null - * @static - */ - public static function limiter($name) - { - /** @var \Illuminate\Cache\RateLimiter $instance */ - return $instance->limiter($name); - } - /** - * Attempts to execute a callback if it's not limited. - * - * @param string $key - * @param int $maxAttempts - * @param \Closure $callback - * @param int $decaySeconds - * @return mixed - * @static - */ - public static function attempt($key, $maxAttempts, $callback, $decaySeconds = 60) - { - /** @var \Illuminate\Cache\RateLimiter $instance */ - return $instance->attempt($key, $maxAttempts, $callback, $decaySeconds); - } - /** - * Determine if the given key has been "accessed" too many times. - * - * @param string $key - * @param int $maxAttempts - * @return bool - * @static - */ - public static function tooManyAttempts($key, $maxAttempts) - { - /** @var \Illuminate\Cache\RateLimiter $instance */ - return $instance->tooManyAttempts($key, $maxAttempts); - } - /** - * Increment the counter for a given key for a given decay time. - * - * @param string $key - * @param int $decaySeconds - * @return int - * @static - */ - public static function hit($key, $decaySeconds = 60) - { - /** @var \Illuminate\Cache\RateLimiter $instance */ - return $instance->hit($key, $decaySeconds); - } - /** - * Get the number of attempts for the given key. - * - * @param string $key - * @return mixed - * @static - */ - public static function attempts($key) - { - /** @var \Illuminate\Cache\RateLimiter $instance */ - return $instance->attempts($key); - } - /** - * Reset the number of attempts for the given key. - * - * @param string $key - * @return mixed - * @static - */ - public static function resetAttempts($key) - { - /** @var \Illuminate\Cache\RateLimiter $instance */ - return $instance->resetAttempts($key); - } - /** - * Get the number of retries left for the given key. - * - * @param string $key - * @param int $maxAttempts - * @return int - * @static - */ - public static function remaining($key, $maxAttempts) - { - /** @var \Illuminate\Cache\RateLimiter $instance */ - return $instance->remaining($key, $maxAttempts); - } - /** - * Get the number of retries left for the given key. - * - * @param string $key - * @param int $maxAttempts - * @return int - * @static - */ - public static function retriesLeft($key, $maxAttempts) - { - /** @var \Illuminate\Cache\RateLimiter $instance */ - return $instance->retriesLeft($key, $maxAttempts); - } - /** - * Clear the hits and lockout timer for the given key. - * - * @param string $key - * @return void - * @static - */ - public static function clear($key) - { - /** @var \Illuminate\Cache\RateLimiter $instance */ - $instance->clear($key); - } - /** - * Get the number of seconds until the "key" is accessible again. - * - * @param string $key - * @return int - * @static - */ - public static function availableIn($key) - { - /** @var \Illuminate\Cache\RateLimiter $instance */ - return $instance->availableIn($key); - } - /** - * Clean the rate limiter key from unicode characters. - * - * @param string $key - * @return string - * @static - */ - public static function cleanRateLimiterKey($key) - { - /** @var \Illuminate\Cache\RateLimiter $instance */ - return $instance->cleanRateLimiterKey($key); - } - - } - /** - * - * - * @see \Illuminate\Routing\Redirector - */ - class Redirect { - /** - * Create a new redirect response to the previous location. - * - * @param int $status - * @param array $headers - * @param mixed $fallback - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function back($status = 302, $headers = [], $fallback = false) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->back($status, $headers, $fallback); - } - /** - * Create a new redirect response to the current URI. - * - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function refresh($status = 302, $headers = []) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->refresh($status, $headers); - } - /** - * Create a new redirect response, while putting the current URL in the session. - * - * @param string $path - * @param int $status - * @param array $headers - * @param bool|null $secure - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function guest($path, $status = 302, $headers = [], $secure = null) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->guest($path, $status, $headers, $secure); - } - /** - * Create a new redirect response to the previously intended location. - * - * @param mixed $default - * @param int $status - * @param array $headers - * @param bool|null $secure - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function intended($default = '/', $status = 302, $headers = [], $secure = null) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->intended($default, $status, $headers, $secure); - } - /** - * Create a new redirect response to the given path. - * - * @param string $path - * @param int $status - * @param array $headers - * @param bool|null $secure - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function to($path, $status = 302, $headers = [], $secure = null) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->to($path, $status, $headers, $secure); - } - /** - * Create a new redirect response to an external URL (no validation). - * - * @param string $path - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function away($path, $status = 302, $headers = []) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->away($path, $status, $headers); - } - /** - * Create a new redirect response to the given HTTPS path. - * - * @param string $path - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function secure($path, $status = 302, $headers = []) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->secure($path, $status, $headers); - } - /** - * Create a new redirect response to a named route. - * - * @param string $route - * @param mixed $parameters - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function route($route, $parameters = [], $status = 302, $headers = []) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->route($route, $parameters, $status, $headers); - } - /** - * Create a new redirect response to a signed named route. - * - * @param string $route - * @param mixed $parameters - * @param \DateTimeInterface|\DateInterval|int|null $expiration - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function signedRoute($route, $parameters = [], $expiration = null, $status = 302, $headers = []) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->signedRoute($route, $parameters, $expiration, $status, $headers); - } - /** - * Create a new redirect response to a signed named route. - * - * @param string $route - * @param \DateTimeInterface|\DateInterval|int|null $expiration - * @param mixed $parameters - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function temporarySignedRoute($route, $expiration, $parameters = [], $status = 302, $headers = []) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->temporarySignedRoute($route, $expiration, $parameters, $status, $headers); - } - /** - * Create a new redirect response to a controller action. - * - * @param string|array $action - * @param mixed $parameters - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function action($action, $parameters = [], $status = 302, $headers = []) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->action($action, $parameters, $status, $headers); - } - /** - * Get the URL generator instance. - * - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function getUrlGenerator() - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->getUrlGenerator(); - } - /** - * Set the active session store. - * - * @param \Illuminate\Session\Store $session - * @return void - * @static - */ - public static function setSession($session) - { - /** @var \Illuminate\Routing\Redirector $instance */ - $instance->setSession($session); - } - /** - * Get the "intended" URL from the session. - * - * @return string|null - * @static - */ - public static function getIntendedUrl() - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->getIntendedUrl(); - } - /** - * Set the "intended" URL in the session. - * - * @param string $url - * @return \Illuminate\Routing\Redirector - * @static - */ - public static function setIntendedUrl($url) - { - /** @var \Illuminate\Routing\Redirector $instance */ - return $instance->setIntendedUrl($url); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Routing\Redirector::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Routing\Redirector::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Routing\Redirector::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Routing\Redirector::flushMacros(); - } - - } - /** - * - * - * @see \Illuminate\Http\Request - */ - class Request { - /** - * Create a new Illuminate HTTP request from server variables. - * - * @return static - * @static - */ - public static function capture() - { - return \Illuminate\Http\Request::capture(); - } - /** - * Return the Request instance. - * - * @return \Illuminate\Http\Request - * @static - */ - public static function instance() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->instance(); - } - /** - * Get the request method. - * - * @return string - * @static - */ - public static function method() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->method(); - } - /** - * Get the root URL for the application. - * - * @return string - * @static - */ - public static function root() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->root(); - } - /** - * Get the URL (no query string) for the request. - * - * @return string - * @static - */ - public static function url() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->url(); - } - /** - * Get the full URL for the request. - * - * @return string - * @static - */ - public static function fullUrl() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->fullUrl(); - } - /** - * Get the full URL for the request with the added query string parameters. - * - * @param array $query - * @return string - * @static - */ - public static function fullUrlWithQuery($query) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->fullUrlWithQuery($query); - } - /** - * Get the full URL for the request without the given query string parameters. - * - * @param array|string $keys - * @return string - * @static - */ - public static function fullUrlWithoutQuery($keys) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->fullUrlWithoutQuery($keys); - } - /** - * Get the current path info for the request. - * - * @return string - * @static - */ - public static function path() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->path(); - } - /** - * Get the current decoded path info for the request. - * - * @return string - * @static - */ - public static function decodedPath() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->decodedPath(); - } - /** - * Get a segment from the URI (1 based index). - * - * @param int $index - * @param string|null $default - * @return string|null - * @static - */ - public static function segment($index, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->segment($index, $default); - } - /** - * Get all of the segments for the request path. - * - * @return array - * @static - */ - public static function segments() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->segments(); - } - /** - * Determine if the current request URI matches a pattern. - * - * @param mixed $patterns - * @return bool - * @static - */ - public static function is(...$patterns) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->is(...$patterns); - } - /** - * Determine if the route name matches a given pattern. - * - * @param mixed $patterns - * @return bool - * @static - */ - public static function routeIs(...$patterns) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->routeIs(...$patterns); - } - /** - * Determine if the current request URL and query string match a pattern. - * - * @param mixed $patterns - * @return bool - * @static - */ - public static function fullUrlIs(...$patterns) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->fullUrlIs(...$patterns); - } - /** - * Get the host name. - * - * @return string - * @static - */ - public static function host() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->host(); - } - /** - * Get the HTTP host being requested. - * - * @return string - * @static - */ - public static function httpHost() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->httpHost(); - } - /** - * Get the scheme and HTTP host. - * - * @return string - * @static - */ - public static function schemeAndHttpHost() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->schemeAndHttpHost(); - } - /** - * Determine if the request is the result of an AJAX call. - * - * @return bool - * @static - */ - public static function ajax() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->ajax(); - } - /** - * Determine if the request is the result of a PJAX call. - * - * @return bool - * @static - */ - public static function pjax() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->pjax(); - } - /** - * Determine if the request is the result of a prefetch call. - * - * @return bool - * @static - */ - public static function prefetch() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->prefetch(); - } - /** - * Determine if the request is over HTTPS. - * - * @return bool - * @static - */ - public static function secure() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->secure(); - } - /** - * Get the client IP address. - * - * @return string|null - * @static - */ - public static function ip() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->ip(); - } - /** - * Get the client IP addresses. - * - * @return array - * @static - */ - public static function ips() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->ips(); - } - /** - * Get the client user agent. - * - * @return string|null - * @static - */ - public static function userAgent() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->userAgent(); - } - /** - * Merge new input into the current request's input array. - * - * @param array $input - * @return \Illuminate\Http\Request - * @static - */ - public static function merge($input) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->merge($input); - } - /** - * Merge new input into the request's input, but only when that key is missing from the request. - * - * @param array $input - * @return \Illuminate\Http\Request - * @static - */ - public static function mergeIfMissing($input) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->mergeIfMissing($input); - } - /** - * Replace the input for the current request. - * - * @param array $input - * @return \Illuminate\Http\Request - * @static - */ - public static function replace($input) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->replace($input); - } - /** - * This method belongs to Symfony HttpFoundation and is not usually needed when using Laravel. - * - * Instead, you may use the "input" method. - * - * @param string $key - * @param mixed $default - * @return mixed - * @static - */ - public static function get($key, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->get($key, $default); - } - /** - * Get the JSON payload for the request. - * - * @param string|null $key - * @param mixed $default - * @return \Symfony\Component\HttpFoundation\InputBag|mixed - * @static - */ - public static function json($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->json($key, $default); - } - /** - * Create a new request instance from the given Laravel request. - * - * @param \Illuminate\Http\Request $from - * @param \Illuminate\Http\Request|null $to - * @return static - * @static - */ - public static function createFrom($from, $to = null) - { - return \Illuminate\Http\Request::createFrom($from, $to); - } - /** - * Create an Illuminate request from a Symfony instance. - * - * @param \Symfony\Component\HttpFoundation\Request $request - * @return static - * @static - */ - public static function createFromBase($request) - { - return \Illuminate\Http\Request::createFromBase($request); - } - /** - * Clones a request and overrides some of its parameters. - * - * @return static - * @param array|null $query The GET parameters - * @param array|null $request The POST parameters - * @param array|null $attributes The request attributes (parameters parsed from the PATH_INFO, ...) - * @param array|null $cookies The COOKIE parameters - * @param array|null $files The FILES parameters - * @param array|null $server The SERVER parameters - * @static - */ - public static function duplicate($query = null, $request = null, $attributes = null, $cookies = null, $files = null, $server = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->duplicate($query, $request, $attributes, $cookies, $files, $server); - } - /** - * Whether the request contains a Session object. - * - * This method does not give any information about the state of the session object, - * like whether the session is started or not. It is just a way to check if this Request - * is associated with a Session instance. - * - * @param bool $skipIfUninitialized When true, ignores factories injected by `setSessionFactory` - * @static - */ - public static function hasSession($skipIfUninitialized = false) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->hasSession($skipIfUninitialized); - } - /** - * Gets the Session. - * - * @throws SessionNotFoundException When session is not set properly - * @static - */ - public static function getSession() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->getSession(); - } - /** - * Get the session associated with the request. - * - * @return \Illuminate\Contracts\Session\Session - * @throws \RuntimeException - * @static - */ - public static function session() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->session(); - } - /** - * Set the session instance on the request. - * - * @param \Illuminate\Contracts\Session\Session $session - * @return void - * @static - */ - public static function setLaravelSession($session) - { - /** @var \Illuminate\Http\Request $instance */ - $instance->setLaravelSession($session); - } - /** - * Set the locale for the request instance. - * - * @param string $locale - * @return void - * @static - */ - public static function setRequestLocale($locale) - { - /** @var \Illuminate\Http\Request $instance */ - $instance->setRequestLocale($locale); - } - /** - * Set the default locale for the request instance. - * - * @param string $locale - * @return void - * @static - */ - public static function setDefaultRequestLocale($locale) - { - /** @var \Illuminate\Http\Request $instance */ - $instance->setDefaultRequestLocale($locale); - } - /** - * Get the user making the request. - * - * @param string|null $guard - * @return mixed - * @static - */ - public static function user($guard = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->user($guard); - } - /** - * Get the route handling the request. - * - * @param string|null $param - * @param mixed $default - * @return \Illuminate\Routing\Route|object|string|null - * @static - */ - public static function route($param = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->route($param, $default); - } - /** - * Get a unique fingerprint for the request / route / IP address. - * - * @return string - * @throws \RuntimeException - * @static - */ - public static function fingerprint() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->fingerprint(); - } - /** - * Set the JSON payload for the request. - * - * @param \Symfony\Component\HttpFoundation\InputBag $json - * @return \Illuminate\Http\Request - * @static - */ - public static function setJson($json) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->setJson($json); - } - /** - * Get the user resolver callback. - * - * @return \Closure - * @static - */ - public static function getUserResolver() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->getUserResolver(); - } - /** - * Set the user resolver callback. - * - * @param \Closure $callback - * @return \Illuminate\Http\Request - * @static - */ - public static function setUserResolver($callback) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->setUserResolver($callback); - } - /** - * Get the route resolver callback. - * - * @return \Closure - * @static - */ - public static function getRouteResolver() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->getRouteResolver(); - } - /** - * Set the route resolver callback. - * - * @param \Closure $callback - * @return \Illuminate\Http\Request - * @static - */ - public static function setRouteResolver($callback) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->setRouteResolver($callback); - } - /** - * Get all of the input and files for the request. - * - * @return array - * @static - */ - public static function toArray() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->toArray(); - } - /** - * Determine if the given offset exists. - * - * @param string $offset - * @return bool - * @static - */ - public static function offsetExists($offset) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->offsetExists($offset); - } - /** - * Get the value at the given offset. - * - * @param string $offset - * @return mixed - * @static - */ - public static function offsetGet($offset) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->offsetGet($offset); - } - /** - * Set the value at the given offset. - * - * @param string $offset - * @param mixed $value - * @return void - * @static - */ - public static function offsetSet($offset, $value) - { - /** @var \Illuminate\Http\Request $instance */ - $instance->offsetSet($offset, $value); - } - /** - * Remove the value at the given offset. - * - * @param string $offset - * @return void - * @static - */ - public static function offsetUnset($offset) - { - /** @var \Illuminate\Http\Request $instance */ - $instance->offsetUnset($offset); - } - /** - * Sets the parameters for this request. - * - * This method also re-initializes all properties. - * - * @param array $query The GET parameters - * @param array $request The POST parameters - * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) - * @param array $cookies The COOKIE parameters - * @param array $files The FILES parameters - * @param array $server The SERVER parameters - * @param string|resource|null $content The raw body data - * @return void - * @static - */ - public static function initialize($query = [], $request = [], $attributes = [], $cookies = [], $files = [], $server = [], $content = null) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - $instance->initialize($query, $request, $attributes, $cookies, $files, $server, $content); - } - /** - * Creates a new request with values from PHP's super globals. - * - * @static - */ - public static function createFromGlobals() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::createFromGlobals(); - } - /** - * Creates a Request based on a given URI and configuration. - * - * The information contained in the URI always take precedence - * over the other information (server and parameters). - * - * @param string $uri The URI - * @param string $method The HTTP method - * @param array $parameters The query (GET) or request (POST) parameters - * @param array $cookies The request cookies ($_COOKIE) - * @param array $files The request files ($_FILES) - * @param array $server The server parameters ($_SERVER) - * @param string|resource|null $content The raw body data - * @static - */ - public static function create($uri, $method = 'GET', $parameters = [], $cookies = [], $files = [], $server = [], $content = null) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::create($uri, $method, $parameters, $cookies, $files, $server, $content); - } - /** - * Sets a callable able to create a Request instance. - * - * This is mainly useful when you need to override the Request class - * to keep BC with an existing system. It should not be used for any - * other purpose. - * - * @return void - * @static - */ - public static function setFactory($callable) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - \Illuminate\Http\Request::setFactory($callable); - } - /** - * Overrides the PHP global variables according to this request instance. - * - * It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE. - * $_FILES is never overridden, see rfc1867 - * - * @return void - * @static - */ - public static function overrideGlobals() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - $instance->overrideGlobals(); - } - /** - * Sets a list of trusted proxies. - * - * You should only list the reverse proxies that you manage directly. - * - * @param array $proxies A list of trusted proxies, the string 'REMOTE_ADDR' will be replaced with $_SERVER['REMOTE_ADDR'] - * @param int $trustedHeaderSet A bit field of Request::HEADER_*, to set which headers to trust from your proxies - * @return void - * @static - */ - public static function setTrustedProxies($proxies, $trustedHeaderSet) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - \Illuminate\Http\Request::setTrustedProxies($proxies, $trustedHeaderSet); - } - /** - * Gets the list of trusted proxies. - * - * @return string[] - * @static - */ - public static function getTrustedProxies() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::getTrustedProxies(); - } - /** - * Gets the set of trusted headers from trusted proxies. - * - * @return int A bit field of Request::HEADER_* that defines which headers are trusted from your proxies - * @static - */ - public static function getTrustedHeaderSet() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::getTrustedHeaderSet(); - } - /** - * Sets a list of trusted host patterns. - * - * You should only list the hosts you manage using regexs. - * - * @param array $hostPatterns A list of trusted host patterns - * @return void - * @static - */ - public static function setTrustedHosts($hostPatterns) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - \Illuminate\Http\Request::setTrustedHosts($hostPatterns); - } - /** - * Gets the list of trusted host patterns. - * - * @return string[] - * @static - */ - public static function getTrustedHosts() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::getTrustedHosts(); - } - /** - * Normalizes a query string. - * - * It builds a normalized query string, where keys/value pairs are alphabetized, - * have consistent escaping and unneeded delimiters are removed. - * - * @static - */ - public static function normalizeQueryString($qs) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::normalizeQueryString($qs); - } - /** - * Enables support for the _method request parameter to determine the intended HTTP method. - * - * Be warned that enabling this feature might lead to CSRF issues in your code. - * Check that you are using CSRF tokens when required. - * If the HTTP method parameter override is enabled, an html-form with method "POST" can be altered - * and used to send a "PUT" or "DELETE" request via the _method request parameter. - * If these methods are not protected against CSRF, this presents a possible vulnerability. - * - * The HTTP method can only be overridden when the real HTTP method is POST. - * - * @return void - * @static - */ - public static function enableHttpMethodParameterOverride() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - \Illuminate\Http\Request::enableHttpMethodParameterOverride(); - } - /** - * Checks whether support for the _method request parameter is enabled. - * - * @static - */ - public static function getHttpMethodParameterOverride() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::getHttpMethodParameterOverride(); - } - /** - * Whether the request contains a Session which was started in one of the - * previous requests. - * - * @static - */ - public static function hasPreviousSession() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->hasPreviousSession(); - } - /** - * - * - * @return void - * @static - */ - public static function setSession($session) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - $instance->setSession($session); - } - /** - * - * - * @internal - * @param \Symfony\Component\HttpFoundation\callable(): SessionInterface $factory - * @static - */ - public static function setSessionFactory($factory) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->setSessionFactory($factory); - } - /** - * Returns the client IP addresses. - * - * In the returned array the most trusted IP address is first, and the - * least trusted one last. The "real" client IP address is the last one, - * but this is also the least trusted one. Trusted proxies are stripped. - * - * Use this method carefully; you should use getClientIp() instead. - * - * @see getClientIp() - * @static - */ - public static function getClientIps() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getClientIps(); - } - /** - * Returns the client IP address. - * - * This method can read the client IP address from the "X-Forwarded-For" header - * when trusted proxies were set via "setTrustedProxies()". The "X-Forwarded-For" - * header value is a comma+space separated list of IP addresses, the left-most - * being the original client, and each successive proxy that passed the request - * adding the IP address where it received the request from. - * - * If your reverse proxy uses a different header name than "X-Forwarded-For", - * ("Client-Ip" for instance), configure it via the $trustedHeaderSet - * argument of the Request::setTrustedProxies() method instead. - * - * @see getClientIps() - * @see https://wikipedia.org/wiki/X-Forwarded-For - * @static - */ - public static function getClientIp() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getClientIp(); - } - /** - * Returns current script name. - * - * @static - */ - public static function getScriptName() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getScriptName(); - } - /** - * Returns the path being requested relative to the executed script. - * - * The path info always starts with a /. - * - * Suppose this request is instantiated from /mysite on localhost: - * - * * http://localhost/mysite returns an empty string - * * http://localhost/mysite/about returns '/about' - * * http://localhost/mysite/enco%20ded returns '/enco%20ded' - * * http://localhost/mysite/about?var=1 returns '/about' - * - * @return string The raw path (i.e. not urldecoded) - * @static - */ - public static function getPathInfo() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getPathInfo(); - } - /** - * Returns the root path from which this request is executed. - * - * Suppose that an index.php file instantiates this request object: - * - * * http://localhost/index.php returns an empty string - * * http://localhost/index.php/page returns an empty string - * * http://localhost/web/index.php returns '/web' - * * http://localhost/we%20b/index.php returns '/we%20b' - * - * @return string The raw path (i.e. not urldecoded) - * @static - */ - public static function getBasePath() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getBasePath(); - } - /** - * Returns the root URL from which this request is executed. - * - * The base URL never ends with a /. - * - * This is similar to getBasePath(), except that it also includes the - * script filename (e.g. index.php) if one exists. - * - * @return string The raw URL (i.e. not urldecoded) - * @static - */ - public static function getBaseUrl() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getBaseUrl(); - } - /** - * Gets the request's scheme. - * - * @static - */ - public static function getScheme() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getScheme(); - } - /** - * Returns the port on which the request is made. - * - * This method can read the client port from the "X-Forwarded-Port" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Port" header must contain the client port. - * - * @return int|string|null Can be a string if fetched from the server bag - * @static - */ - public static function getPort() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getPort(); - } - /** - * Returns the user. - * - * @static - */ - public static function getUser() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getUser(); - } - /** - * Returns the password. - * - * @static - */ - public static function getPassword() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getPassword(); - } - /** - * Gets the user info. - * - * @return string|null A user name if any and, optionally, scheme-specific information about how to gain authorization to access the server - * @static - */ - public static function getUserInfo() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getUserInfo(); - } - /** - * Returns the HTTP host being requested. - * - * The port name will be appended to the host if it's non-standard. - * - * @static - */ - public static function getHttpHost() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getHttpHost(); - } - /** - * Returns the requested URI (path and query string). - * - * @return string The raw URI (i.e. not URI decoded) - * @static - */ - public static function getRequestUri() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getRequestUri(); - } - /** - * Gets the scheme and HTTP host. - * - * If the URL was called with basic authentication, the user - * and the password are not added to the generated string. - * - * @static - */ - public static function getSchemeAndHttpHost() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getSchemeAndHttpHost(); - } - /** - * Generates a normalized URI (URL) for the Request. - * - * @see getQueryString() - * @static - */ - public static function getUri() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getUri(); - } - /** - * Generates a normalized URI for the given path. - * - * @param string $path A path to use instead of the current one - * @static - */ - public static function getUriForPath($path) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getUriForPath($path); - } - /** - * Returns the path as relative reference from the current Request path. - * - * Only the URIs path component (no schema, host etc.) is relevant and must be given. - * Both paths must be absolute and not contain relative parts. - * Relative URLs from one resource to another are useful when generating self-contained downloadable document archives. - * Furthermore, they can be used to reduce the link size in documents. - * - * Example target paths, given a base path of "/a/b/c/d": - * - "/a/b/c/d" -> "" - * - "/a/b/c/" -> "./" - * - "/a/b/" -> "../" - * - "/a/b/c/other" -> "other" - * - "/a/x/y" -> "../../x/y" - * - * @static - */ - public static function getRelativeUriForPath($path) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getRelativeUriForPath($path); - } - /** - * Generates the normalized query string for the Request. - * - * It builds a normalized query string, where keys/value pairs are alphabetized - * and have consistent escaping. - * - * @static - */ - public static function getQueryString() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getQueryString(); - } - /** - * Checks whether the request is secure or not. - * - * This method can read the client protocol from the "X-Forwarded-Proto" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Proto" header must contain the protocol: "https" or "http". - * - * @static - */ - public static function isSecure() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isSecure(); - } - /** - * Returns the host name. - * - * This method can read the client host name from the "X-Forwarded-Host" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Host" header must contain the client host name. - * - * @throws SuspiciousOperationException when the host name is invalid or not trusted - * @static - */ - public static function getHost() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getHost(); - } - /** - * Sets the request method. - * - * @return void - * @static - */ - public static function setMethod($method) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - $instance->setMethod($method); - } - /** - * Gets the request "intended" method. - * - * If the X-HTTP-Method-Override header is set, and if the method is a POST, - * then it is used to determine the "real" intended HTTP method. - * - * The _method request parameter can also be used to determine the HTTP method, - * but only if enableHttpMethodParameterOverride() has been called. - * - * The method is always an uppercased string. - * - * @see getRealMethod() - * @static - */ - public static function getMethod() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getMethod(); - } - /** - * Gets the "real" request method. - * - * @see getMethod() - * @static - */ - public static function getRealMethod() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getRealMethod(); - } - /** - * Gets the mime type associated with the format. - * - * @static - */ - public static function getMimeType($format) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getMimeType($format); - } - /** - * Gets the mime types associated with the format. - * - * @return string[] - * @static - */ - public static function getMimeTypes($format) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - return \Illuminate\Http\Request::getMimeTypes($format); - } - /** - * Gets the format associated with the mime type. - * - * @static - */ - public static function getFormat($mimeType) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getFormat($mimeType); - } - /** - * Associates a format with mime types. - * - * @param string|string[] $mimeTypes The associated mime types (the preferred one must be the first as it will be used as the content type) - * @return void - * @static - */ - public static function setFormat($format, $mimeTypes) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - $instance->setFormat($format, $mimeTypes); - } - /** - * Gets the request format. - * - * Here is the process to determine the format: - * - * * format defined by the user (with setRequestFormat()) - * * _format request attribute - * * $default - * - * @see getPreferredFormat - * @static - */ - public static function getRequestFormat($default = 'html') - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getRequestFormat($default); - } - /** - * Sets the request format. - * - * @return void - * @static - */ - public static function setRequestFormat($format) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - $instance->setRequestFormat($format); - } - /** - * Gets the usual name of the format associated with the request's media type (provided in the Content-Type header). - * - * @deprecated since Symfony 6.2, use getContentTypeFormat() instead - * @static - */ - public static function getContentType() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getContentType(); - } - /** - * Gets the usual name of the format associated with the request's media type (provided in the Content-Type header). - * - * @see Request::$formats - * @static - */ - public static function getContentTypeFormat() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getContentTypeFormat(); - } - /** - * Sets the default locale. - * - * @return void - * @static - */ - public static function setDefaultLocale($locale) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - $instance->setDefaultLocale($locale); - } - /** - * Get the default locale. - * - * @static - */ - public static function getDefaultLocale() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getDefaultLocale(); - } - /** - * Sets the locale. - * - * @return void - * @static - */ - public static function setLocale($locale) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - $instance->setLocale($locale); - } - /** - * Get the locale. - * - * @static - */ - public static function getLocale() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getLocale(); - } - /** - * Checks if the request method is of specified type. - * - * @param string $method Uppercase request method (GET, POST etc) - * @static - */ - public static function isMethod($method) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isMethod($method); - } - /** - * Checks whether or not the method is safe. - * - * @see https://tools.ietf.org/html/rfc7231#section-4.2.1 - * @static - */ - public static function isMethodSafe() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isMethodSafe(); - } - /** - * Checks whether or not the method is idempotent. - * - * @static - */ - public static function isMethodIdempotent() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isMethodIdempotent(); - } - /** - * Checks whether the method is cacheable or not. - * - * @see https://tools.ietf.org/html/rfc7231#section-4.2.3 - * @static - */ - public static function isMethodCacheable() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isMethodCacheable(); - } - /** - * Returns the protocol version. - * - * If the application is behind a proxy, the protocol version used in the - * requests between the client and the proxy and between the proxy and the - * server might be different. This returns the former (from the "Via" header) - * if the proxy is trusted (see "setTrustedProxies()"), otherwise it returns - * the latter (from the "SERVER_PROTOCOL" server parameter). - * - * @static - */ - public static function getProtocolVersion() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getProtocolVersion(); - } - /** - * Returns the request body content. - * - * @param bool $asResource If true, a resource will be returned - * @return string|resource - * @psalm-return ($asResource is true ? resource : string) - * @static - */ - public static function getContent($asResource = false) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getContent($asResource); - } - /** - * Gets the decoded form or json request body. - * - * @throws JsonException When the body cannot be decoded to an array - * @static - */ - public static function getPayload() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getPayload(); - } - /** - * Gets the Etags. - * - * @static - */ - public static function getETags() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getETags(); - } - /** - * - * - * @static - */ - public static function isNoCache() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isNoCache(); - } - /** - * Gets the preferred format for the response by inspecting, in the following order: - * * the request format set using setRequestFormat; - * * the values of the Accept HTTP header. - * - * Note that if you use this method, you should send the "Vary: Accept" header - * in the response to prevent any issues with intermediary HTTP caches. - * - * @static - */ - public static function getPreferredFormat($default = 'html') - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getPreferredFormat($default); - } - /** - * Returns the preferred language. - * - * @param string[] $locales An array of ordered available locales - * @static - */ - public static function getPreferredLanguage($locales = null) - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getPreferredLanguage($locales); - } - /** - * Gets a list of languages acceptable by the client browser ordered in the user browser preferences. - * - * @return string[] - * @static - */ - public static function getLanguages() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getLanguages(); - } - /** - * Gets a list of charsets acceptable by the client browser in preferable order. - * - * @return string[] - * @static - */ - public static function getCharsets() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getCharsets(); - } - /** - * Gets a list of encodings acceptable by the client browser in preferable order. - * - * @return string[] - * @static - */ - public static function getEncodings() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getEncodings(); - } - /** - * Gets a list of content types acceptable by the client browser in preferable order. - * - * @return string[] - * @static - */ - public static function getAcceptableContentTypes() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->getAcceptableContentTypes(); - } - /** - * Returns true if the request is an XMLHttpRequest. - * - * It works if your JavaScript library sets an X-Requested-With HTTP header. - * It is known to work with common JavaScript frameworks: - * - * @see https://wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript - * @static - */ - public static function isXmlHttpRequest() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isXmlHttpRequest(); - } - /** - * Checks whether the client browser prefers safe content or not according to RFC8674. - * - * @see https://tools.ietf.org/html/rfc8674 - * @static - */ - public static function preferSafeContent() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->preferSafeContent(); - } - /** - * Indicates whether this request originated from a trusted proxy. - * - * This can be useful to determine whether or not to trust the - * contents of a proxy-specific header. - * - * @static - */ - public static function isFromTrustedProxy() - { //Method inherited from \Symfony\Component\HttpFoundation\Request - /** @var \Illuminate\Http\Request $instance */ - return $instance->isFromTrustedProxy(); - } - /** - * Filter the given array of rules into an array of rules that are included in precognitive headers. - * - * @param array $rules - * @return array - * @static - */ - public static function filterPrecognitiveRules($rules) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->filterPrecognitiveRules($rules); - } - /** - * Determine if the request is attempting to be precognitive. - * - * @return bool - * @static - */ - public static function isAttemptingPrecognition() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->isAttemptingPrecognition(); - } - /** - * Determine if the request is precognitive. - * - * @return bool - * @static - */ - public static function isPrecognitive() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->isPrecognitive(); - } - /** - * Determine if the request is sending JSON. - * - * @return bool - * @static - */ - public static function isJson() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->isJson(); - } - /** - * Determine if the current request probably expects a JSON response. - * - * @return bool - * @static - */ - public static function expectsJson() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->expectsJson(); - } - /** - * Determine if the current request is asking for JSON. - * - * @return bool - * @static - */ - public static function wantsJson() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->wantsJson(); - } - /** - * Determines whether the current requests accepts a given content type. - * - * @param string|array $contentTypes - * @return bool - * @static - */ - public static function accepts($contentTypes) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->accepts($contentTypes); - } - /** - * Return the most suitable content type from the given array based on content negotiation. - * - * @param string|array $contentTypes - * @return string|null - * @static - */ - public static function prefers($contentTypes) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->prefers($contentTypes); - } - /** - * Determine if the current request accepts any content type. - * - * @return bool - * @static - */ - public static function acceptsAnyContentType() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->acceptsAnyContentType(); - } - /** - * Determines whether a request accepts JSON. - * - * @return bool - * @static - */ - public static function acceptsJson() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->acceptsJson(); - } - /** - * Determines whether a request accepts HTML. - * - * @return bool - * @static - */ - public static function acceptsHtml() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->acceptsHtml(); - } - /** - * Determine if the given content types match. - * - * @param string $actual - * @param string $type - * @return bool - * @static - */ - public static function matchesType($actual, $type) - { - return \Illuminate\Http\Request::matchesType($actual, $type); - } - /** - * Get the data format expected in the response. - * - * @param string $default - * @return string - * @static - */ - public static function format($default = 'html') - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->format($default); - } - /** - * Retrieve an old input item. - * - * @param string|null $key - * @param \Illuminate\Database\Eloquent\Model|string|array|null $default - * @return string|array|null - * @static - */ - public static function old($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->old($key, $default); - } - /** - * Flash the input for the current request to the session. - * - * @return void - * @static - */ - public static function flash() - { - /** @var \Illuminate\Http\Request $instance */ - $instance->flash(); - } - /** - * Flash only some of the input to the session. - * - * @param array|mixed $keys - * @return void - * @static - */ - public static function flashOnly($keys) - { - /** @var \Illuminate\Http\Request $instance */ - $instance->flashOnly($keys); - } - /** - * Flash only some of the input to the session. - * - * @param array|mixed $keys - * @return void - * @static - */ - public static function flashExcept($keys) - { - /** @var \Illuminate\Http\Request $instance */ - $instance->flashExcept($keys); - } - /** - * Flush all of the old input from the session. - * - * @return void - * @static - */ - public static function flush() - { - /** @var \Illuminate\Http\Request $instance */ - $instance->flush(); - } - /** - * Retrieve a server variable from the request. - * - * @param string|null $key - * @param string|array|null $default - * @return string|array|null - * @static - */ - public static function server($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->server($key, $default); - } - /** - * Determine if a header is set on the request. - * - * @param string $key - * @return bool - * @static - */ - public static function hasHeader($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->hasHeader($key); - } - /** - * Retrieve a header from the request. - * - * @param string|null $key - * @param string|array|null $default - * @return string|array|null - * @static - */ - public static function header($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->header($key, $default); - } - /** - * Get the bearer token from the request headers. - * - * @return string|null - * @static - */ - public static function bearerToken() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->bearerToken(); - } - /** - * Determine if the request contains a given input item key. - * - * @param string|array $key - * @return bool - * @static - */ - public static function exists($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->exists($key); - } - /** - * Determine if the request contains a given input item key. - * - * @param string|array $key - * @return bool - * @static - */ - public static function has($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->has($key); - } - /** - * Determine if the request contains any of the given inputs. - * - * @param string|array $keys - * @return bool - * @static - */ - public static function hasAny($keys) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->hasAny($keys); - } - /** - * Apply the callback if the request contains the given input item key. - * - * @param string $key - * @param callable $callback - * @param callable|null $default - * @return $this|mixed - * @static - */ - public static function whenHas($key, $callback, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->whenHas($key, $callback, $default); - } - /** - * Determine if the request contains a non-empty value for an input item. - * - * @param string|array $key - * @return bool - * @static - */ - public static function filled($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->filled($key); - } - /** - * Determine if the request contains an empty value for an input item. - * - * @param string|array $key - * @return bool - * @static - */ - public static function isNotFilled($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->isNotFilled($key); - } - /** - * Determine if the request contains a non-empty value for any of the given inputs. - * - * @param string|array $keys - * @return bool - * @static - */ - public static function anyFilled($keys) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->anyFilled($keys); - } - /** - * Apply the callback if the request contains a non-empty value for the given input item key. - * - * @param string $key - * @param callable $callback - * @param callable|null $default - * @return $this|mixed - * @static - */ - public static function whenFilled($key, $callback, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->whenFilled($key, $callback, $default); - } - /** - * Determine if the request is missing a given input item key. - * - * @param string|array $key - * @return bool - * @static - */ - public static function missing($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->missing($key); - } - /** - * Apply the callback if the request is missing the given input item key. - * - * @param string $key - * @param callable $callback - * @param callable|null $default - * @return $this|mixed - * @static - */ - public static function whenMissing($key, $callback, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->whenMissing($key, $callback, $default); - } - /** - * Get the keys for all of the input and files. - * - * @return array - * @static - */ - public static function keys() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->keys(); - } - /** - * Get all of the input and files for the request. - * - * @param array|mixed|null $keys - * @return array - * @static - */ - public static function all($keys = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->all($keys); - } - /** - * Retrieve an input item from the request. - * - * @param string|null $key - * @param mixed $default - * @return mixed - * @static - */ - public static function input($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->input($key, $default); - } - /** - * Retrieve input from the request as a Stringable instance. - * - * @param string $key - * @param mixed $default - * @return \Illuminate\Support\Stringable - * @static - */ - public static function str($key, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->str($key, $default); - } - /** - * Retrieve input from the request as a Stringable instance. - * - * @param string $key - * @param mixed $default - * @return \Illuminate\Support\Stringable - * @static - */ - public static function string($key, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->string($key, $default); - } - /** - * Retrieve input as a boolean value. - * - * Returns true when value is "1", "true", "on", and "yes". Otherwise, returns false. - * - * @param string|null $key - * @param bool $default - * @return bool - * @static - */ - public static function boolean($key = null, $default = false) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->boolean($key, $default); - } - /** - * Retrieve input as an integer value. - * - * @param string $key - * @param int $default - * @return int - * @static - */ - public static function integer($key, $default = 0) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->integer($key, $default); - } - /** - * Retrieve input as a float value. - * - * @param string $key - * @param float $default - * @return float - * @static - */ - public static function float($key, $default = 0.0) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->float($key, $default); - } - /** - * Retrieve input from the request as a Carbon instance. - * - * @param string $key - * @param string|null $format - * @param string|null $tz - * @return \Illuminate\Support\Carbon|null - * @throws \Carbon\Exceptions\InvalidFormatException - * @static - */ - public static function date($key, $format = null, $tz = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->date($key, $format, $tz); - } - /** - * Retrieve input from the request as an enum. - * - * @template TEnum - * @param string $key - * @param \Illuminate\Http\class-string $enumClass - * @return \Illuminate\Http\TEnum|null - * @static - */ - public static function enum($key, $enumClass) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->enum($key, $enumClass); - } - /** - * Retrieve input from the request as a collection. - * - * @param array|string|null $key - * @return \Illuminate\Support\Collection - * @static - */ - public static function collect($key = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->collect($key); - } - /** - * Get a subset containing the provided keys with values from the input data. - * - * @param array|mixed $keys - * @return array - * @static - */ - public static function only($keys) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->only($keys); - } - /** - * Get all of the input except for a specified array of items. - * - * @param array|mixed $keys - * @return array - * @static - */ - public static function except($keys) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->except($keys); - } - /** - * Retrieve a query string item from the request. - * - * @param string|null $key - * @param string|array|null $default - * @return string|array|null - * @static - */ - public static function query($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->query($key, $default); - } - /** - * Retrieve a request payload item from the request. - * - * @param string|null $key - * @param string|array|null $default - * @return string|array|null - * @static - */ - public static function post($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->post($key, $default); - } - /** - * Determine if a cookie is set on the request. - * - * @param string $key - * @return bool - * @static - */ - public static function hasCookie($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->hasCookie($key); - } - /** - * Retrieve a cookie from the request. - * - * @param string|null $key - * @param string|array|null $default - * @return string|array|null - * @static - */ - public static function cookie($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->cookie($key, $default); - } - /** - * Get an array of all of the files on the request. - * - * @return array - * @static - */ - public static function allFiles() - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->allFiles(); - } - /** - * Determine if the uploaded data contains a file. - * - * @param string $key - * @return bool - * @static - */ - public static function hasFile($key) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->hasFile($key); - } - /** - * Retrieve a file from the request. - * - * @param string|null $key - * @param mixed $default - * @return \Illuminate\Http\UploadedFile|\Illuminate\Http\UploadedFile[]|array|null - * @static - */ - public static function file($key = null, $default = null) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->file($key, $default); - } - /** - * Dump the request items and end the script. - * - * @param mixed $keys - * @return \Illuminate\Http\never - * @static - */ - public static function dd(...$keys) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->dd(...$keys); - } - /** - * Dump the items. - * - * @param mixed $keys - * @return \Illuminate\Http\Request - * @static - */ - public static function dump($keys = []) - { - /** @var \Illuminate\Http\Request $instance */ - return $instance->dump($keys); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Http\Request::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Http\Request::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Http\Request::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Http\Request::flushMacros(); - } - /** - * - * - * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestValidation() - * @param array $rules - * @param mixed $params - * @static - */ - public static function validate($rules, ...$params) - { - return \Illuminate\Http\Request::validate($rules, ...$params); - } - /** - * - * - * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestValidation() - * @param string $errorBag - * @param array $rules - * @param mixed $params - * @static - */ - public static function validateWithBag($errorBag, $rules, ...$params) - { - return \Illuminate\Http\Request::validateWithBag($errorBag, $rules, ...$params); - } - /** - * - * - * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() - * @param mixed $absolute - * @static - */ - public static function hasValidSignature($absolute = true) - { - return \Illuminate\Http\Request::hasValidSignature($absolute); - } - /** - * - * - * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() - * @static - */ - public static function hasValidRelativeSignature() - { - return \Illuminate\Http\Request::hasValidRelativeSignature(); - } - /** - * - * - * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() - * @param mixed $ignoreQuery - * @param mixed $absolute - * @static - */ - public static function hasValidSignatureWhileIgnoring($ignoreQuery = [], $absolute = true) - { - return \Illuminate\Http\Request::hasValidSignatureWhileIgnoring($ignoreQuery, $absolute); - } - /** - * - * - * @see \App\Providers\AppServiceProvider::boot() - * @param mixed $param - * @param mixed $newParam - * @static - */ - public static function rename($param, $newParam = null) - { - return \Illuminate\Http\Request::rename($param, $newParam); - } - - } - /** - * - * - * @see \Illuminate\Routing\ResponseFactory - */ - class Response { - /** - * Create a new response instance. - * - * @param mixed $content - * @param int $status - * @param array $headers - * @return \Illuminate\Http\Response - * @static - */ - public static function make($content = '', $status = 200, $headers = []) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->make($content, $status, $headers); - } - /** - * Create a new "no content" response. - * - * @param int $status - * @param array $headers - * @return \Illuminate\Http\Response - * @static - */ - public static function noContent($status = 204, $headers = []) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->noContent($status, $headers); - } - /** - * Create a new response for a given view. - * - * @param string|array $view - * @param array $data - * @param int $status - * @param array $headers - * @return \Illuminate\Http\Response - * @static - */ - public static function view($view, $data = [], $status = 200, $headers = []) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->view($view, $data, $status, $headers); - } - /** - * Create a new JSON response instance. - * - * @param mixed $data - * @param int $status - * @param array $headers - * @param int $options - * @return \Illuminate\Http\JsonResponse - * @static - */ - public static function json($data = [], $status = 200, $headers = [], $options = 0) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->json($data, $status, $headers, $options); - } - /** - * Create a new JSONP response instance. - * - * @param string $callback - * @param mixed $data - * @param int $status - * @param array $headers - * @param int $options - * @return \Illuminate\Http\JsonResponse - * @static - */ - public static function jsonp($callback, $data = [], $status = 200, $headers = [], $options = 0) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->jsonp($callback, $data, $status, $headers, $options); - } - /** - * Create a new streamed response instance. - * - * @param callable $callback - * @param int $status - * @param array $headers - * @return \Symfony\Component\HttpFoundation\StreamedResponse - * @static - */ - public static function stream($callback, $status = 200, $headers = []) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->stream($callback, $status, $headers); - } - /** - * Create a new streamed response instance as a file download. - * - * @param callable $callback - * @param string|null $name - * @param array $headers - * @param string|null $disposition - * @return \Symfony\Component\HttpFoundation\StreamedResponse - * @static - */ - public static function streamDownload($callback, $name = null, $headers = [], $disposition = 'attachment') - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->streamDownload($callback, $name, $headers, $disposition); - } - /** - * Create a new file download response. - * - * @param \SplFileInfo|string $file - * @param string|null $name - * @param array $headers - * @param string|null $disposition - * @return \Symfony\Component\HttpFoundation\BinaryFileResponse - * @static - */ - public static function download($file, $name = null, $headers = [], $disposition = 'attachment') - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->download($file, $name, $headers, $disposition); - } - /** - * Return the raw contents of a binary file. - * - * @param \SplFileInfo|string $file - * @param array $headers - * @return \Symfony\Component\HttpFoundation\BinaryFileResponse - * @static - */ - public static function file($file, $headers = []) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->file($file, $headers); - } - /** - * Create a new redirect response to the given path. - * - * @param string $path - * @param int $status - * @param array $headers - * @param bool|null $secure - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function redirectTo($path, $status = 302, $headers = [], $secure = null) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->redirectTo($path, $status, $headers, $secure); - } - /** - * Create a new redirect response to a named route. - * - * @param string $route - * @param mixed $parameters - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function redirectToRoute($route, $parameters = [], $status = 302, $headers = []) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->redirectToRoute($route, $parameters, $status, $headers); - } - /** - * Create a new redirect response to a controller action. - * - * @param array|string $action - * @param mixed $parameters - * @param int $status - * @param array $headers - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function redirectToAction($action, $parameters = [], $status = 302, $headers = []) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->redirectToAction($action, $parameters, $status, $headers); - } - /** - * Create a new redirect response, while putting the current URL in the session. - * - * @param string $path - * @param int $status - * @param array $headers - * @param bool|null $secure - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function redirectGuest($path, $status = 302, $headers = [], $secure = null) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->redirectGuest($path, $status, $headers, $secure); - } - /** - * Create a new redirect response to the previously intended location. - * - * @param string $default - * @param int $status - * @param array $headers - * @param bool|null $secure - * @return \Illuminate\Http\RedirectResponse - * @static - */ - public static function redirectToIntended($default = '/', $status = 302, $headers = [], $secure = null) - { - /** @var \Illuminate\Routing\ResponseFactory $instance */ - return $instance->redirectToIntended($default, $status, $headers, $secure); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Routing\ResponseFactory::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Routing\ResponseFactory::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Routing\ResponseFactory::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Routing\ResponseFactory::flushMacros(); - } - - } - /** - * - * - * @method static \Illuminate\Routing\RouteRegistrar attribute(string $key, mixed $value) - * @method static \Illuminate\Routing\RouteRegistrar whereAlpha(array|string $parameters) - * @method static \Illuminate\Routing\RouteRegistrar whereAlphaNumeric(array|string $parameters) - * @method static \Illuminate\Routing\RouteRegistrar whereNumber(array|string $parameters) - * @method static \Illuminate\Routing\RouteRegistrar whereUlid(array|string $parameters) - * @method static \Illuminate\Routing\RouteRegistrar whereUuid(array|string $parameters) - * @method static \Illuminate\Routing\RouteRegistrar whereIn(array|string $parameters, array $values) - * @method static \Illuminate\Routing\RouteRegistrar as(string $value) - * @method static \Illuminate\Routing\RouteRegistrar controller(string $controller) - * @method static \Illuminate\Routing\RouteRegistrar domain(string $value) - * @method static \Illuminate\Routing\RouteRegistrar middleware(array|string|null $middleware) - * @method static \Illuminate\Routing\RouteRegistrar name(string $value) - * @method static \Illuminate\Routing\RouteRegistrar namespace(string|null $value) - * @method static \Illuminate\Routing\RouteRegistrar prefix(string $prefix) - * @method static \Illuminate\Routing\RouteRegistrar scopeBindings() - * @method static \Illuminate\Routing\RouteRegistrar where(array $where) - * @method static \Illuminate\Routing\RouteRegistrar withoutMiddleware(array|string $middleware) - * @method static \Illuminate\Routing\RouteRegistrar withoutScopedBindings() - * @see \Illuminate\Routing\Router - */ - class Route { - /** - * Register a new GET route with the router. - * - * @param string $uri - * @param array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function get($uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->get($uri, $action); - } - /** - * Register a new POST route with the router. - * - * @param string $uri - * @param array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function post($uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->post($uri, $action); - } - /** - * Register a new PUT route with the router. - * - * @param string $uri - * @param array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function put($uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->put($uri, $action); - } - /** - * Register a new PATCH route with the router. - * - * @param string $uri - * @param array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function patch($uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->patch($uri, $action); - } - /** - * Register a new DELETE route with the router. - * - * @param string $uri - * @param array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function delete($uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->delete($uri, $action); - } - /** - * Register a new OPTIONS route with the router. - * - * @param string $uri - * @param array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function options($uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->options($uri, $action); - } - /** - * Register a new route responding to all verbs. - * - * @param string $uri - * @param array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function any($uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->any($uri, $action); - } - /** - * Register a new fallback route with the router. - * - * @param array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function fallback($action) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->fallback($action); - } - /** - * Create a redirect from one URI to another. - * - * @param string $uri - * @param string $destination - * @param int $status - * @return \Illuminate\Routing\Route - * @static - */ - public static function redirect($uri, $destination, $status = 302) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->redirect($uri, $destination, $status); - } - /** - * Create a permanent redirect from one URI to another. - * - * @param string $uri - * @param string $destination - * @return \Illuminate\Routing\Route - * @static - */ - public static function permanentRedirect($uri, $destination) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->permanentRedirect($uri, $destination); - } - /** - * Register a new route that returns a view. - * - * @param string $uri - * @param string $view - * @param array $data - * @param int|array $status - * @param array $headers - * @return \Illuminate\Routing\Route - * @static - */ - public static function view($uri, $view, $data = [], $status = 200, $headers = []) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->view($uri, $view, $data, $status, $headers); - } - /** - * Register a new route with the given verbs. - * - * @param array|string $methods - * @param string $uri - * @param array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function match($methods, $uri, $action = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->match($methods, $uri, $action); - } - /** - * Register an array of resource controllers. - * - * @param array $resources - * @param array $options - * @return void - * @static - */ - public static function resources($resources, $options = []) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->resources($resources, $options); - } - /** - * Route a resource to a controller. - * - * @param string $name - * @param string $controller - * @param array $options - * @return \Illuminate\Routing\PendingResourceRegistration - * @static - */ - public static function resource($name, $controller, $options = []) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->resource($name, $controller, $options); - } - /** - * Register an array of API resource controllers. - * - * @param array $resources - * @param array $options - * @return void - * @static - */ - public static function apiResources($resources, $options = []) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->apiResources($resources, $options); - } - /** - * Route an API resource to a controller. - * - * @param string $name - * @param string $controller - * @param array $options - * @return \Illuminate\Routing\PendingResourceRegistration - * @static - */ - public static function apiResource($name, $controller, $options = []) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->apiResource($name, $controller, $options); - } - /** - * Register an array of singleton resource controllers. - * - * @param array $singletons - * @param array $options - * @return void - * @static - */ - public static function singletons($singletons, $options = []) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->singletons($singletons, $options); - } - /** - * Route a singleton resource to a controller. - * - * @param string $name - * @param string $controller - * @param array $options - * @return \Illuminate\Routing\PendingSingletonResourceRegistration - * @static - */ - public static function singleton($name, $controller, $options = []) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->singleton($name, $controller, $options); - } - /** - * Register an array of API singleton resource controllers. - * - * @param array $singletons - * @param array $options - * @return void - * @static - */ - public static function apiSingletons($singletons, $options = []) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->apiSingletons($singletons, $options); - } - /** - * Route an API singleton resource to a controller. - * - * @param string $name - * @param string $controller - * @param array $options - * @return \Illuminate\Routing\PendingSingletonResourceRegistration - * @static - */ - public static function apiSingleton($name, $controller, $options = []) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->apiSingleton($name, $controller, $options); - } - /** - * Create a route group with shared attributes. - * - * @param array $attributes - * @param \Closure|array|string $routes - * @return \Illuminate\Routing\Router - * @static - */ - public static function group($attributes, $routes) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->group($attributes, $routes); - } - /** - * Merge the given array with the last group stack. - * - * @param array $new - * @param bool $prependExistingPrefix - * @return array - * @static - */ - public static function mergeWithLastGroup($new, $prependExistingPrefix = true) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->mergeWithLastGroup($new, $prependExistingPrefix); - } - /** - * Get the prefix from the last group on the stack. - * - * @return string - * @static - */ - public static function getLastGroupPrefix() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getLastGroupPrefix(); - } - /** - * Add a route to the underlying route collection. - * - * @param array|string $methods - * @param string $uri - * @param array|string|callable|null $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function addRoute($methods, $uri, $action) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->addRoute($methods, $uri, $action); - } - /** - * Create a new Route object. - * - * @param array|string $methods - * @param string $uri - * @param mixed $action - * @return \Illuminate\Routing\Route - * @static - */ - public static function newRoute($methods, $uri, $action) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->newRoute($methods, $uri, $action); - } - /** - * Return the response returned by the given route. - * - * @param string $name - * @return \Symfony\Component\HttpFoundation\Response - * @static - */ - public static function respondWithRoute($name) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->respondWithRoute($name); - } - /** - * Dispatch the request to the application. - * - * @param \Illuminate\Http\Request $request - * @return \Symfony\Component\HttpFoundation\Response - * @static - */ - public static function dispatch($request) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->dispatch($request); - } - /** - * Dispatch the request to a route and return the response. - * - * @param \Illuminate\Http\Request $request - * @return \Symfony\Component\HttpFoundation\Response - * @static - */ - public static function dispatchToRoute($request) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->dispatchToRoute($request); - } - /** - * Gather the middleware for the given route with resolved class names. - * - * @param \Illuminate\Routing\Route $route - * @return array - * @static - */ - public static function gatherRouteMiddleware($route) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->gatherRouteMiddleware($route); - } - /** - * Resolve a flat array of middleware classes from the provided array. - * - * @param array $middleware - * @param array $excluded - * @return array - * @static - */ - public static function resolveMiddleware($middleware, $excluded = []) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->resolveMiddleware($middleware, $excluded); - } - /** - * Create a response instance from the given value. - * - * @param \Symfony\Component\HttpFoundation\Request $request - * @param mixed $response - * @return \Symfony\Component\HttpFoundation\Response - * @static - */ - public static function prepareResponse($request, $response) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->prepareResponse($request, $response); - } - /** - * Static version of prepareResponse. - * - * @param \Symfony\Component\HttpFoundation\Request $request - * @param mixed $response - * @return \Symfony\Component\HttpFoundation\Response - * @static - */ - public static function toResponse($request, $response) - { - return \Illuminate\Routing\Router::toResponse($request, $response); - } - /** - * Substitute the route bindings onto the route. - * - * @param \Illuminate\Routing\Route $route - * @return \Illuminate\Routing\Route - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model> - * @throws \Illuminate\Routing\Exceptions\BackedEnumCaseNotFoundException - * @static - */ - public static function substituteBindings($route) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->substituteBindings($route); - } - /** - * Substitute the implicit route bindings for the given route. - * - * @param \Illuminate\Routing\Route $route - * @return void - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model> - * @throws \Illuminate\Routing\Exceptions\BackedEnumCaseNotFoundException - * @static - */ - public static function substituteImplicitBindings($route) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->substituteImplicitBindings($route); - } - /** - * Register a route matched event listener. - * - * @param string|callable $callback - * @return void - * @static - */ - public static function matched($callback) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->matched($callback); - } - /** - * Get all of the defined middleware short-hand names. - * - * @return array - * @static - */ - public static function getMiddleware() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getMiddleware(); - } - /** - * Register a short-hand name for a middleware. - * - * @param string $name - * @param string $class - * @return \Illuminate\Routing\Router - * @static - */ - public static function aliasMiddleware($name, $class) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->aliasMiddleware($name, $class); - } - /** - * Check if a middlewareGroup with the given name exists. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMiddlewareGroup($name) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->hasMiddlewareGroup($name); - } - /** - * Get all of the defined middleware groups. - * - * @return array - * @static - */ - public static function getMiddlewareGroups() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getMiddlewareGroups(); - } - /** - * Register a group of middleware. - * - * @param string $name - * @param array $middleware - * @return \Illuminate\Routing\Router - * @static - */ - public static function middlewareGroup($name, $middleware) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->middlewareGroup($name, $middleware); - } - /** - * Add a middleware to the beginning of a middleware group. - * - * If the middleware is already in the group, it will not be added again. - * - * @param string $group - * @param string $middleware - * @return \Illuminate\Routing\Router - * @static - */ - public static function prependMiddlewareToGroup($group, $middleware) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->prependMiddlewareToGroup($group, $middleware); - } - /** - * Add a middleware to the end of a middleware group. - * - * If the middleware is already in the group, it will not be added again. - * - * @param string $group - * @param string $middleware - * @return \Illuminate\Routing\Router - * @static - */ - public static function pushMiddlewareToGroup($group, $middleware) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->pushMiddlewareToGroup($group, $middleware); - } - /** - * Remove the given middleware from the specified group. - * - * @param string $group - * @param string $middleware - * @return \Illuminate\Routing\Router - * @static - */ - public static function removeMiddlewareFromGroup($group, $middleware) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->removeMiddlewareFromGroup($group, $middleware); - } - /** - * Flush the router's middleware groups. - * - * @return \Illuminate\Routing\Router - * @static - */ - public static function flushMiddlewareGroups() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->flushMiddlewareGroups(); - } - /** - * Add a new route parameter binder. - * - * @param string $key - * @param string|callable $binder - * @return void - * @static - */ - public static function bind($key, $binder) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->bind($key, $binder); - } - /** - * Register a model binder for a wildcard. - * - * @param string $key - * @param string $class - * @param \Closure|null $callback - * @return void - * @static - */ - public static function model($key, $class, $callback = null) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->model($key, $class, $callback); - } - /** - * Get the binding callback for a given binding. - * - * @param string $key - * @return \Closure|null - * @static - */ - public static function getBindingCallback($key) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getBindingCallback($key); - } - /** - * Get the global "where" patterns. - * - * @return array - * @static - */ - public static function getPatterns() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getPatterns(); - } - /** - * Set a global where pattern on all routes. - * - * @param string $key - * @param string $pattern - * @return void - * @static - */ - public static function pattern($key, $pattern) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->pattern($key, $pattern); - } - /** - * Set a group of global where patterns on all routes. - * - * @param array $patterns - * @return void - * @static - */ - public static function patterns($patterns) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->patterns($patterns); - } - /** - * Determine if the router currently has a group stack. - * - * @return bool - * @static - */ - public static function hasGroupStack() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->hasGroupStack(); - } - /** - * Get the current group stack for the router. - * - * @return array - * @static - */ - public static function getGroupStack() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getGroupStack(); - } - /** - * Get a route parameter for the current route. - * - * @param string $key - * @param string|null $default - * @return mixed - * @static - */ - public static function input($key, $default = null) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->input($key, $default); - } - /** - * Get the request currently being dispatched. - * - * @return \Illuminate\Http\Request - * @static - */ - public static function getCurrentRequest() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getCurrentRequest(); - } - /** - * Get the currently dispatched route instance. - * - * @return \Illuminate\Routing\Route|null - * @static - */ - public static function getCurrentRoute() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getCurrentRoute(); - } - /** - * Get the currently dispatched route instance. - * - * @return \Illuminate\Routing\Route|null - * @static - */ - public static function current() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->current(); - } - /** - * Check if a route with the given name exists. - * - * @param string|array $name - * @return bool - * @static - */ - public static function has($name) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->has($name); - } - /** - * Get the current route name. - * - * @return string|null - * @static - */ - public static function currentRouteName() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->currentRouteName(); - } - /** - * Alias for the "currentRouteNamed" method. - * - * @param mixed $patterns - * @return bool - * @static - */ - public static function is(...$patterns) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->is(...$patterns); - } - /** - * Determine if the current route matches a pattern. - * - * @param mixed $patterns - * @return bool - * @static - */ - public static function currentRouteNamed(...$patterns) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->currentRouteNamed(...$patterns); - } - /** - * Get the current route action. - * - * @return string|null - * @static - */ - public static function currentRouteAction() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->currentRouteAction(); - } - /** - * Alias for the "currentRouteUses" method. - * - * @param array $patterns - * @return bool - * @static - */ - public static function uses(...$patterns) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->uses(...$patterns); - } - /** - * Determine if the current route action matches a given action. - * - * @param string $action - * @return bool - * @static - */ - public static function currentRouteUses($action) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->currentRouteUses($action); - } - /** - * Set the unmapped global resource parameters to singular. - * - * @param bool $singular - * @return void - * @static - */ - public static function singularResourceParameters($singular = true) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->singularResourceParameters($singular); - } - /** - * Set the global resource parameter mapping. - * - * @param array $parameters - * @return void - * @static - */ - public static function resourceParameters($parameters = []) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->resourceParameters($parameters); - } - /** - * Get or set the verbs used in the resource URIs. - * - * @param array $verbs - * @return array|null - * @static - */ - public static function resourceVerbs($verbs = []) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->resourceVerbs($verbs); - } - /** - * Get the underlying route collection. - * - * @return \Illuminate\Routing\RouteCollectionInterface - * @static - */ - public static function getRoutes() - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->getRoutes(); - } - /** - * Set the route collection instance. - * - * @param \Illuminate\Routing\RouteCollection $routes - * @return void - * @static - */ - public static function setRoutes($routes) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->setRoutes($routes); - } - /** - * Set the compiled route collection instance. - * - * @param array $routes - * @return void - * @static - */ - public static function setCompiledRoutes($routes) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->setCompiledRoutes($routes); - } - /** - * Remove any duplicate middleware from the given array. - * - * @param array $middleware - * @return array - * @static - */ - public static function uniqueMiddleware($middleware) - { - return \Illuminate\Routing\Router::uniqueMiddleware($middleware); - } - /** - * Set the container instance used by the router. - * - * @param \Illuminate\Container\Container $container - * @return \Illuminate\Routing\Router - * @static - */ - public static function setContainer($container) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->setContainer($container); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Routing\Router::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Routing\Router::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Routing\Router::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Routing\Router::flushMacros(); - } - /** - * Dynamically handle calls to the class. - * - * @param string $method - * @param array $parameters - * @return mixed - * @throws \BadMethodCallException - * @static - */ - public static function macroCall($method, $parameters) - { - /** @var \Illuminate\Routing\Router $instance */ - return $instance->macroCall($method, $parameters); - } - /** - * - * - * @see \App\Providers\RouteServiceProvider::boot() - * @param mixed $addendum - * @param mixed $uri - * @param mixed $controller - * @static - */ - public static function apiAddendumResource($addendum, $uri, $controller) - { - return \Illuminate\Routing\Router::apiAddendumResource($addendum, $uri, $controller); - } - - } - /** - * - * - * @see \Illuminate\Database\Schema\Builder - */ - class Schema { - /** - * Create a database in the schema. - * - * @param string $name - * @return bool - * @static - */ - public static function createDatabase($name) - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->createDatabase($name); - } - /** - * Drop a database from the schema if the database exists. - * - * @param string $name - * @return bool - * @static - */ - public static function dropDatabaseIfExists($name) - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->dropDatabaseIfExists($name); - } - /** - * Determine if the given table exists. - * - * @param string $table - * @return bool - * @static - */ - public static function hasTable($table) - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->hasTable($table); - } - /** - * Get the column listing for a given table. - * - * @param string $table - * @return array - * @static - */ - public static function getColumnListing($table) - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->getColumnListing($table); - } - /** - * Drop all tables from the database. - * - * @return void - * @static - */ - public static function dropAllTables() - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->dropAllTables(); - } - /** - * Drop all views from the database. - * - * @return void - * @static - */ - public static function dropAllViews() - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->dropAllViews(); - } - /** - * Get all of the table names for the database. - * - * @return array - * @static - */ - public static function getAllTables() - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->getAllTables(); - } - /** - * Get all of the view names for the database. - * - * @return array - * @static - */ - public static function getAllViews() - { - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->getAllViews(); - } - /** - * Set the default string length for migrations. - * - * @param int $length - * @return void - * @static - */ - public static function defaultStringLength($length) - { //Method inherited from \Illuminate\Database\Schema\Builder - \Illuminate\Database\Schema\MySqlBuilder::defaultStringLength($length); - } - /** - * Set the default morph key type for migrations. - * - * @param string $type - * @return void - * @throws \InvalidArgumentException - * @static - */ - public static function defaultMorphKeyType($type) - { //Method inherited from \Illuminate\Database\Schema\Builder - \Illuminate\Database\Schema\MySqlBuilder::defaultMorphKeyType($type); - } - /** - * Set the default morph key type for migrations to UUIDs. - * - * @return void - * @static - */ - public static function morphUsingUuids() - { //Method inherited from \Illuminate\Database\Schema\Builder - \Illuminate\Database\Schema\MySqlBuilder::morphUsingUuids(); - } - /** - * Set the default morph key type for migrations to ULIDs. - * - * @return void - * @static - */ - public static function morphUsingUlids() - { //Method inherited from \Illuminate\Database\Schema\Builder - \Illuminate\Database\Schema\MySqlBuilder::morphUsingUlids(); - } - /** - * Attempt to use native schema operations for dropping, renaming, and modifying columns, even if Doctrine DBAL is installed. - * - * @param bool $value - * @return void - * @static - */ - public static function useNativeSchemaOperationsIfPossible($value = true) - { //Method inherited from \Illuminate\Database\Schema\Builder - \Illuminate\Database\Schema\MySqlBuilder::useNativeSchemaOperationsIfPossible($value); - } - /** - * Determine if the given table has a given column. - * - * @param string $table - * @param string $column - * @return bool - * @static - */ - public static function hasColumn($table, $column) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->hasColumn($table, $column); - } - /** - * Determine if the given table has given columns. - * - * @param string $table - * @param array $columns - * @return bool - * @static - */ - public static function hasColumns($table, $columns) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->hasColumns($table, $columns); - } - /** - * Execute a table builder callback if the given table has a given column. - * - * @param string $table - * @param string $column - * @param \Closure $callback - * @return void - * @static - */ - public static function whenTableHasColumn($table, $column, $callback) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->whenTableHasColumn($table, $column, $callback); - } - /** - * Execute a table builder callback if the given table doesn't have a given column. - * - * @param string $table - * @param string $column - * @param \Closure $callback - * @return void - * @static - */ - public static function whenTableDoesntHaveColumn($table, $column, $callback) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->whenTableDoesntHaveColumn($table, $column, $callback); - } - /** - * Get the data type for the given column name. - * - * @param string $table - * @param string $column - * @return string - * @static - */ - public static function getColumnType($table, $column) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->getColumnType($table, $column); - } - /** - * Modify a table on the schema. - * - * @param string $table - * @param \Closure $callback - * @return void - * @static - */ - public static function table($table, $callback) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->table($table, $callback); - } - /** - * Create a new table on the schema. - * - * @param string $table - * @param \Closure $callback - * @return void - * @static - */ - public static function create($table, $callback) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->create($table, $callback); - } - /** - * Drop a table from the schema. - * - * @param string $table - * @return void - * @static - */ - public static function drop($table) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->drop($table); - } - /** - * Drop a table from the schema if it exists. - * - * @param string $table - * @return void - * @static - */ - public static function dropIfExists($table) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->dropIfExists($table); - } - /** - * Drop columns from a table schema. - * - * @param string $table - * @param string|array $columns - * @return void - * @static - */ - public static function dropColumns($table, $columns) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->dropColumns($table, $columns); - } - /** - * Drop all types from the database. - * - * @return void - * @throws \LogicException - * @static - */ - public static function dropAllTypes() - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->dropAllTypes(); - } - /** - * Rename a table on the schema. - * - * @param string $from - * @param string $to - * @return void - * @static - */ - public static function rename($from, $to) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->rename($from, $to); - } - /** - * Enable foreign key constraints. - * - * @return bool - * @static - */ - public static function enableForeignKeyConstraints() - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->enableForeignKeyConstraints(); - } - /** - * Disable foreign key constraints. - * - * @return bool - * @static - */ - public static function disableForeignKeyConstraints() - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->disableForeignKeyConstraints(); - } - /** - * Disable foreign key constraints during the execution of a callback. - * - * @param \Closure $callback - * @return mixed - * @static - */ - public static function withoutForeignKeyConstraints($callback) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->withoutForeignKeyConstraints($callback); - } - /** - * Get the database connection instance. - * - * @return \Illuminate\Database\Connection - * @static - */ - public static function getConnection() - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->getConnection(); - } - /** - * Set the database connection instance. - * - * @param \Illuminate\Database\Connection $connection - * @return \Illuminate\Database\Schema\MySqlBuilder - * @static - */ - public static function setConnection($connection) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - return $instance->setConnection($connection); - } - /** - * Set the Schema Blueprint resolver callback. - * - * @param \Closure $resolver - * @return void - * @static - */ - public static function blueprintResolver($resolver) - { //Method inherited from \Illuminate\Database\Schema\Builder - /** @var \Illuminate\Database\Schema\MySqlBuilder $instance */ - $instance->blueprintResolver($resolver); - } - - } - /** - * - * - * @see \Illuminate\Session\SessionManager - */ - class Session { - /** - * Determine if requests for the same session should wait for each to finish before executing. - * - * @return bool - * @static - */ - public static function shouldBlock() - { - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->shouldBlock(); - } - /** - * Get the name of the cache store / driver that should be used to acquire session locks. - * - * @return string|null - * @static - */ - public static function blockDriver() - { - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->blockDriver(); - } - /** - * Get the session configuration. - * - * @return array - * @static - */ - public static function getSessionConfig() - { - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->getSessionConfig(); - } - /** - * Get the default session driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Set the default session driver name. - * - * @param string $name - * @return void - * @static - */ - public static function setDefaultDriver($name) - { - /** @var \Illuminate\Session\SessionManager $instance */ - $instance->setDefaultDriver($name); - } - /** - * Get a driver instance. - * - * @param string|null $driver - * @return mixed - * @throws \InvalidArgumentException - * @static - */ - public static function driver($driver = null) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->driver($driver); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Session\SessionManager - * @static - */ - public static function extend($driver, $callback) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Get all of the created "drivers". - * - * @return array - * @static - */ - public static function getDrivers() - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->getDrivers(); - } - /** - * Get the container instance used by the manager. - * - * @return \Illuminate\Contracts\Container\Container - * @static - */ - public static function getContainer() - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->getContainer(); - } - /** - * Set the container instance used by the manager. - * - * @param \Illuminate\Contracts\Container\Container $container - * @return \Illuminate\Session\SessionManager - * @static - */ - public static function setContainer($container) - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->setContainer($container); - } - /** - * Forget all of the resolved driver instances. - * - * @return \Illuminate\Session\SessionManager - * @static - */ - public static function forgetDrivers() - { //Method inherited from \Illuminate\Support\Manager - /** @var \Illuminate\Session\SessionManager $instance */ - return $instance->forgetDrivers(); - } - /** - * Start the session, reading the data from a handler. - * - * @return bool - * @static - */ - public static function start() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->start(); - } - /** - * Save the session data to storage. - * - * @return void - * @static - */ - public static function save() - { - /** @var \Illuminate\Session\Store $instance */ - $instance->save(); - } - /** - * Age the flash data for the session. - * - * @return void - * @static - */ - public static function ageFlashData() - { - /** @var \Illuminate\Session\Store $instance */ - $instance->ageFlashData(); - } - /** - * Get all of the session data. - * - * @return array - * @static - */ - public static function all() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->all(); - } - /** - * Get a subset of the session data. - * - * @param array $keys - * @return array - * @static - */ - public static function only($keys) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->only($keys); - } - /** - * Checks if a key exists. - * - * @param string|array $key - * @return bool - * @static - */ - public static function exists($key) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->exists($key); - } - /** - * Determine if the given key is missing from the session data. - * - * @param string|array $key - * @return bool - * @static - */ - public static function missing($key) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->missing($key); - } - /** - * Checks if a key is present and not null. - * - * @param string|array $key - * @return bool - * @static - */ - public static function has($key) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->has($key); - } - /** - * Get an item from the session. - * - * @param string $key - * @param mixed $default - * @return mixed - * @static - */ - public static function get($key, $default = null) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->get($key, $default); - } - /** - * Get the value of a given key and then forget it. - * - * @param string $key - * @param mixed $default - * @return mixed - * @static - */ - public static function pull($key, $default = null) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->pull($key, $default); - } - /** - * Determine if the session contains old input. - * - * @param string|null $key - * @return bool - * @static - */ - public static function hasOldInput($key = null) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->hasOldInput($key); - } - /** - * Get the requested item from the flashed input array. - * - * @param string|null $key - * @param mixed $default - * @return mixed - * @static - */ - public static function getOldInput($key = null, $default = null) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->getOldInput($key, $default); - } - /** - * Replace the given session attributes entirely. - * - * @param array $attributes - * @return void - * @static - */ - public static function replace($attributes) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->replace($attributes); - } - /** - * Put a key / value pair or array of key / value pairs in the session. - * - * @param string|array $key - * @param mixed $value - * @return void - * @static - */ - public static function put($key, $value = null) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->put($key, $value); - } - /** - * Get an item from the session, or store the default value. - * - * @param string $key - * @param \Closure $callback - * @return mixed - * @static - */ - public static function remember($key, $callback) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->remember($key, $callback); - } - /** - * Push a value onto a session array. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function push($key, $value) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->push($key, $value); - } - /** - * Increment the value of an item in the session. - * - * @param string $key - * @param int $amount - * @return mixed - * @static - */ - public static function increment($key, $amount = 1) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->increment($key, $amount); - } - /** - * Decrement the value of an item in the session. - * - * @param string $key - * @param int $amount - * @return int - * @static - */ - public static function decrement($key, $amount = 1) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->decrement($key, $amount); - } - /** - * Flash a key / value pair to the session. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function flash($key, $value = true) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->flash($key, $value); - } - /** - * Flash a key / value pair to the session for immediate use. - * - * @param string $key - * @param mixed $value - * @return void - * @static - */ - public static function now($key, $value) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->now($key, $value); - } - /** - * Reflash all of the session flash data. - * - * @return void - * @static - */ - public static function reflash() - { - /** @var \Illuminate\Session\Store $instance */ - $instance->reflash(); - } - /** - * Reflash a subset of the current flash data. - * - * @param array|mixed $keys - * @return void - * @static - */ - public static function keep($keys = null) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->keep($keys); - } - /** - * Flash an input array to the session. - * - * @param array $value - * @return void - * @static - */ - public static function flashInput($value) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->flashInput($value); - } - /** - * Remove an item from the session, returning its value. - * - * @param string $key - * @return mixed - * @static - */ - public static function remove($key) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->remove($key); - } - /** - * Remove one or many items from the session. - * - * @param string|array $keys - * @return void - * @static - */ - public static function forget($keys) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->forget($keys); - } - /** - * Remove all of the items from the session. - * - * @return void - * @static - */ - public static function flush() - { - /** @var \Illuminate\Session\Store $instance */ - $instance->flush(); - } - /** - * Flush the session data and regenerate the ID. - * - * @return bool - * @static - */ - public static function invalidate() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->invalidate(); - } - /** - * Generate a new session identifier. - * - * @param bool $destroy - * @return bool - * @static - */ - public static function regenerate($destroy = false) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->regenerate($destroy); - } - /** - * Generate a new session ID for the session. - * - * @param bool $destroy - * @return bool - * @static - */ - public static function migrate($destroy = false) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->migrate($destroy); - } - /** - * Determine if the session has been started. - * - * @return bool - * @static - */ - public static function isStarted() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->isStarted(); - } - /** - * Get the name of the session. - * - * @return string - * @static - */ - public static function getName() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->getName(); - } - /** - * Set the name of the session. - * - * @param string $name - * @return void - * @static - */ - public static function setName($name) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->setName($name); - } - /** - * Get the current session ID. - * - * @return string - * @static - */ - public static function getId() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->getId(); - } - /** - * Set the session ID. - * - * @param string|null $id - * @return void - * @static - */ - public static function setId($id) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->setId($id); - } - /** - * Determine if this is a valid session ID. - * - * @param string|null $id - * @return bool - * @static - */ - public static function isValidId($id) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->isValidId($id); - } - /** - * Set the existence of the session on the handler if applicable. - * - * @param bool $value - * @return void - * @static - */ - public static function setExists($value) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->setExists($value); - } - /** - * Get the CSRF token value. - * - * @return string - * @static - */ - public static function token() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->token(); - } - /** - * Regenerate the CSRF token value. - * - * @return void - * @static - */ - public static function regenerateToken() - { - /** @var \Illuminate\Session\Store $instance */ - $instance->regenerateToken(); - } - /** - * Get the previous URL from the session. - * - * @return string|null - * @static - */ - public static function previousUrl() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->previousUrl(); - } - /** - * Set the "previous" URL in the session. - * - * @param string $url - * @return void - * @static - */ - public static function setPreviousUrl($url) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->setPreviousUrl($url); - } - /** - * Specify that the user has confirmed their password. - * - * @return void - * @static - */ - public static function passwordConfirmed() - { - /** @var \Illuminate\Session\Store $instance */ - $instance->passwordConfirmed(); - } - /** - * Get the underlying session handler implementation. - * - * @return \SessionHandlerInterface - * @static - */ - public static function getHandler() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->getHandler(); - } - /** - * Set the underlying session handler implementation. - * - * @param \SessionHandlerInterface $handler - * @return \SessionHandlerInterface - * @static - */ - public static function setHandler($handler) - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->setHandler($handler); - } - /** - * Determine if the session handler needs a request. - * - * @return bool - * @static - */ - public static function handlerNeedsRequest() - { - /** @var \Illuminate\Session\Store $instance */ - return $instance->handlerNeedsRequest(); - } - /** - * Set the request on the handler instance. - * - * @param \Illuminate\Http\Request $request - * @return void - * @static - */ - public static function setRequestOnHandler($request) - { - /** @var \Illuminate\Session\Store $instance */ - $instance->setRequestOnHandler($request); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Session\Store::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Session\Store::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Session\Store::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Session\Store::flushMacros(); - } - - } - /** - * - * - * @method static bool has(string $location) - * @method static string read(string $location) - * @method static \League\Flysystem\DirectoryListing listContents(string $location, bool $deep = false) - * @method static int fileSize(string $path) - * @method static string visibility(string $path) - * @method static void write(string $location, string $contents, array $config = []) - * @method static void createDirectory(string $location, array $config = []) - * @see \Illuminate\Filesystem\FilesystemManager - */ - class Storage { - /** - * Get a filesystem instance. - * - * @param string|null $name - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function drive($name = null) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->drive($name); - } - /** - * Get a filesystem instance. - * - * @param string|null $name - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function disk($name = null) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->disk($name); - } - /** - * Get a default cloud filesystem instance. - * - * @return \Illuminate\Contracts\Filesystem\Cloud - * @static - */ - public static function cloud() - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->cloud(); - } - /** - * Build an on-demand disk. - * - * @param string|array $config - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function build($config) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->build($config); - } - /** - * Create an instance of the local driver. - * - * @param array $config - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function createLocalDriver($config) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->createLocalDriver($config); - } - /** - * Create an instance of the ftp driver. - * - * @param array $config - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function createFtpDriver($config) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->createFtpDriver($config); - } - /** - * Create an instance of the sftp driver. - * - * @param array $config - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function createSftpDriver($config) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->createSftpDriver($config); - } - /** - * Create an instance of the Amazon S3 driver. - * - * @param array $config - * @return \Illuminate\Contracts\Filesystem\Cloud - * @static - */ - public static function createS3Driver($config) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->createS3Driver($config); - } - /** - * Create a scoped driver. - * - * @param array $config - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function createScopedDriver($config) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->createScopedDriver($config); - } - /** - * Set the given disk instance. - * - * @param string $name - * @param mixed $disk - * @return \Illuminate\Filesystem\FilesystemManager - * @static - */ - public static function set($name, $disk) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->set($name, $disk); - } - /** - * Get the default driver name. - * - * @return string - * @static - */ - public static function getDefaultDriver() - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->getDefaultDriver(); - } - /** - * Get the default cloud driver name. - * - * @return string - * @static - */ - public static function getDefaultCloudDriver() - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->getDefaultCloudDriver(); - } - /** - * Unset the given disk instances. - * - * @param array|string $disk - * @return \Illuminate\Filesystem\FilesystemManager - * @static - */ - public static function forgetDisk($disk) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->forgetDisk($disk); - } - /** - * Disconnect the given disk and remove from local cache. - * - * @param string|null $name - * @return void - * @static - */ - public static function purge($name = null) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - $instance->purge($name); - } - /** - * Register a custom driver creator Closure. - * - * @param string $driver - * @param \Closure $callback - * @return \Illuminate\Filesystem\FilesystemManager - * @static - */ - public static function extend($driver, $callback) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->extend($driver, $callback); - } - /** - * Set the application instance used by the manager. - * - * @param \Illuminate\Contracts\Foundation\Application $app - * @return \Illuminate\Filesystem\FilesystemManager - * @static - */ - public static function setApplication($app) - { - /** @var \Illuminate\Filesystem\FilesystemManager $instance */ - return $instance->setApplication($app); - } - /** - * Assert that the given file or directory exists. - * - * @param string|array $path - * @param string|null $content - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function assertExists($path, $content = null) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->assertExists($path, $content); - } - /** - * Assert that the given file or directory does not exist. - * - * @param string|array $path - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function assertMissing($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->assertMissing($path); - } - /** - * Assert that the given directory is empty. - * - * @param string $path - * @return \Illuminate\Filesystem\FilesystemAdapter - * @static - */ - public static function assertDirectoryEmpty($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->assertDirectoryEmpty($path); - } - /** - * Determine if a file or directory exists. - * - * @param string $path - * @return bool - * @static - */ - public static function exists($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->exists($path); - } - /** - * Determine if a file or directory is missing. - * - * @param string $path - * @return bool - * @static - */ - public static function missing($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->missing($path); - } - /** - * Determine if a file exists. - * - * @param string $path - * @return bool - * @static - */ - public static function fileExists($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->fileExists($path); - } - /** - * Determine if a file is missing. - * - * @param string $path - * @return bool - * @static - */ - public static function fileMissing($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->fileMissing($path); - } - /** - * Determine if a directory exists. - * - * @param string $path - * @return bool - * @static - */ - public static function directoryExists($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->directoryExists($path); - } - /** - * Determine if a directory is missing. - * - * @param string $path - * @return bool - * @static - */ - public static function directoryMissing($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->directoryMissing($path); - } - /** - * Get the full path for the file at the given "short" path. - * - * @param string $path - * @return string - * @static - */ - public static function path($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->path($path); - } - /** - * Get the contents of a file. - * - * @param string $path - * @return string|null - * @static - */ - public static function get($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->get($path); - } - /** - * Get the contents of a file as decoded JSON. - * - * @param string $path - * @param int $flags - * @return array|null - * @static - */ - public static function json($path, $flags = 0) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->json($path, $flags); - } - /** - * Create a streamed response for a given file. - * - * @param string $path - * @param string|null $name - * @param array $headers - * @param string|null $disposition - * @return \Symfony\Component\HttpFoundation\StreamedResponse - * @static - */ - public static function response($path, $name = null, $headers = [], $disposition = 'inline') - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->response($path, $name, $headers, $disposition); - } - /** - * Create a streamed download response for a given file. - * - * @param string $path - * @param string|null $name - * @return \Symfony\Component\HttpFoundation\StreamedResponse - * @static - */ - public static function download($path, $name = null, $headers = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->download($path, $name, $headers); - } - /** - * Write the contents of a file. - * - * @param string $path - * @param \Psr\Http\Message\StreamInterface|\Illuminate\Http\File|\Illuminate\Http\UploadedFile|string|resource $contents - * @param mixed $options - * @return string|bool - * @static - */ - public static function put($path, $contents, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->put($path, $contents, $options); - } - /** - * Store the uploaded file on the disk. - * - * @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string $path - * @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string|array|null $file - * @param mixed $options - * @return string|false - * @static - */ - public static function putFile($path, $file = null, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->putFile($path, $file, $options); - } - /** - * Store the uploaded file on the disk with a given name. - * - * @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string $path - * @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string|array|null $file - * @param string|array|null $name - * @param mixed $options - * @return string|false - * @static - */ - public static function putFileAs($path, $file, $name = null, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->putFileAs($path, $file, $name, $options); - } - /** - * Get the visibility for the given path. - * - * @param string $path - * @return string - * @static - */ - public static function getVisibility($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->getVisibility($path); - } - /** - * Set the visibility for the given path. - * - * @param string $path - * @param string $visibility - * @return bool - * @static - */ - public static function setVisibility($path, $visibility) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->setVisibility($path, $visibility); - } - /** - * Prepend to a file. - * - * @param string $path - * @param string $data - * @param string $separator - * @return bool - * @static - */ - public static function prepend($path, $data, $separator = ' -') - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->prepend($path, $data, $separator); - } - /** - * Append to a file. - * - * @param string $path - * @param string $data - * @param string $separator - * @return bool - * @static - */ - public static function append($path, $data, $separator = ' -') - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->append($path, $data, $separator); - } - /** - * Delete the file at a given path. - * - * @param string|array $paths - * @return bool - * @static - */ - public static function delete($paths) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->delete($paths); - } - /** - * Copy a file to a new location. - * - * @param string $from - * @param string $to - * @return bool - * @static - */ - public static function copy($from, $to) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->copy($from, $to); - } - /** - * Move a file to a new location. - * - * @param string $from - * @param string $to - * @return bool - * @static - */ - public static function move($from, $to) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->move($from, $to); - } - /** - * Get the file size of a given file. - * - * @param string $path - * @return int - * @static - */ - public static function size($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->size($path); - } - /** - * Get the checksum for a file. - * - * @return string|false - * @throws UnableToProvideChecksum - * @static - */ - public static function checksum($path, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->checksum($path, $options); - } - /** - * Get the mime-type of a given file. - * - * @param string $path - * @return string|false - * @static - */ - public static function mimeType($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->mimeType($path); - } - /** - * Get the file's last modification time. - * - * @param string $path - * @return int - * @static - */ - public static function lastModified($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->lastModified($path); - } - /** - * Get a resource to read the file. - * - * @param string $path - * @return resource|null The path resource or null on failure. - * @static - */ - public static function readStream($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->readStream($path); - } - /** - * Write a new file using a stream. - * - * @param string $path - * @param resource $resource - * @param array $options - * @return bool - * @static - */ - public static function writeStream($path, $resource, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->writeStream($path, $resource, $options); - } - /** - * Get the URL for the file at the given path. - * - * @param string $path - * @return string - * @throws \RuntimeException - * @static - */ - public static function url($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->url($path); - } - /** - * Determine if temporary URLs can be generated. - * - * @return bool - * @static - */ - public static function providesTemporaryUrls() - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->providesTemporaryUrls(); - } - /** - * Get a temporary URL for the file at the given path. - * - * @param string $path - * @param \DateTimeInterface $expiration - * @param array $options - * @return string - * @throws \RuntimeException - * @static - */ - public static function temporaryUrl($path, $expiration, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->temporaryUrl($path, $expiration, $options); - } - /** - * Get a temporary upload URL for the file at the given path. - * - * @param string $path - * @param \DateTimeInterface $expiration - * @param array $options - * @return array - * @throws \RuntimeException - * @static - */ - public static function temporaryUploadUrl($path, $expiration, $options = []) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->temporaryUploadUrl($path, $expiration, $options); - } - /** - * Get an array of all files in a directory. - * - * @param string|null $directory - * @param bool $recursive - * @return array - * @static - */ - public static function files($directory = null, $recursive = false) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->files($directory, $recursive); - } - /** - * Get all of the files from the given directory (recursive). - * - * @param string|null $directory - * @return array - * @static - */ - public static function allFiles($directory = null) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->allFiles($directory); - } - /** - * Get all of the directories within a given directory. - * - * @param string|null $directory - * @param bool $recursive - * @return array - * @static - */ - public static function directories($directory = null, $recursive = false) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->directories($directory, $recursive); - } - /** - * Get all the directories within a given directory (recursive). - * - * @param string|null $directory - * @return array - * @static - */ - public static function allDirectories($directory = null) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->allDirectories($directory); - } - /** - * Create a directory. - * - * @param string $path - * @return bool - * @static - */ - public static function makeDirectory($path) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->makeDirectory($path); - } - /** - * Recursively delete a directory. - * - * @param string $directory - * @return bool - * @static - */ - public static function deleteDirectory($directory) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->deleteDirectory($directory); - } - /** - * Get the Flysystem driver. - * - * @return \League\Flysystem\FilesystemOperator - * @static - */ - public static function getDriver() - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->getDriver(); - } - /** - * Get the Flysystem adapter. - * - * @return \League\Flysystem\FilesystemAdapter - * @static - */ - public static function getAdapter() - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->getAdapter(); - } - /** - * Get the configuration values. - * - * @return array - * @static - */ - public static function getConfig() - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->getConfig(); - } - /** - * Define a custom temporary URL builder callback. - * - * @param \Closure $callback - * @return void - * @static - */ - public static function buildTemporaryUrlsUsing($callback) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - $instance->buildTemporaryUrlsUsing($callback); - } - /** - * Apply the callback if the given "value" is (or resolves to) truthy. - * - * @template TWhenParameter - * @template TWhenReturnType - * @param \Illuminate\Filesystem\(\Closure($this): TWhenParameter)|TWhenParameter|null $value - * @param \Illuminate\Filesystem\(callable($this, TWhenParameter): TWhenReturnType)|null $callback - * @param \Illuminate\Filesystem\(callable($this, TWhenParameter): TWhenReturnType)|null $default - * @return $this|\Illuminate\Filesystem\TWhenReturnType - * @static - */ - public static function when($value = null, $callback = null, $default = null) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->when($value, $callback, $default); - } - /** - * Apply the callback if the given "value" is (or resolves to) falsy. - * - * @template TUnlessParameter - * @template TUnlessReturnType - * @param \Illuminate\Filesystem\(\Closure($this): TUnlessParameter)|TUnlessParameter|null $value - * @param \Illuminate\Filesystem\(callable($this, TUnlessParameter): TUnlessReturnType)|null $callback - * @param \Illuminate\Filesystem\(callable($this, TUnlessParameter): TUnlessReturnType)|null $default - * @return $this|\Illuminate\Filesystem\TUnlessReturnType - * @static - */ - public static function unless($value = null, $callback = null, $default = null) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->unless($value, $callback, $default); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Filesystem\FilesystemAdapter::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Filesystem\FilesystemAdapter::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Filesystem\FilesystemAdapter::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Filesystem\FilesystemAdapter::flushMacros(); - } - /** - * Dynamically handle calls to the class. - * - * @param string $method - * @param array $parameters - * @return mixed - * @throws \BadMethodCallException - * @static - */ - public static function macroCall($method, $parameters) - { - /** @var \Illuminate\Filesystem\FilesystemAdapter $instance */ - return $instance->macroCall($method, $parameters); - } - /** - * - * - * @see \App\Providers\AppServiceProvider::boot() - * @param mixed $diskName - * @static - */ - public static function public($diskName) - { - return \Illuminate\Filesystem\FilesystemAdapter::public($diskName); - } - - } - /** - * - * - * @see \Illuminate\Routing\UrlGenerator - */ - class URL { - /** - * Get the full URL for the current request. - * - * @return string - * @static - */ - public static function full() - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->full(); - } - /** - * Get the current URL for the request. - * - * @return string - * @static - */ - public static function current() - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->current(); - } - /** - * Get the URL for the previous request. - * - * @param mixed $fallback - * @return string - * @static - */ - public static function previous($fallback = false) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->previous($fallback); - } - /** - * Get the previous path info for the request. - * - * @param mixed $fallback - * @return string - * @static - */ - public static function previousPath($fallback = false) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->previousPath($fallback); - } - /** - * Generate an absolute URL to the given path. - * - * @param string $path - * @param mixed $extra - * @param bool|null $secure - * @return string - * @static - */ - public static function to($path, $extra = [], $secure = null) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->to($path, $extra, $secure); - } - /** - * Generate a secure, absolute URL to the given path. - * - * @param string $path - * @param array $parameters - * @return string - * @static - */ - public static function secure($path, $parameters = []) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->secure($path, $parameters); - } - /** - * Generate the URL to an application asset. - * - * @param string $path - * @param bool|null $secure - * @return string - * @static - */ - public static function asset($path, $secure = null) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->asset($path, $secure); - } - /** - * Generate the URL to a secure asset. - * - * @param string $path - * @return string - * @static - */ - public static function secureAsset($path) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->secureAsset($path); - } - /** - * Generate the URL to an asset from a custom root domain such as CDN, etc. - * - * @param string $root - * @param string $path - * @param bool|null $secure - * @return string - * @static - */ - public static function assetFrom($root, $path, $secure = null) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->assetFrom($root, $path, $secure); - } - /** - * Get the default scheme for a raw URL. - * - * @param bool|null $secure - * @return string - * @static - */ - public static function formatScheme($secure = null) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->formatScheme($secure); - } - /** - * Create a signed route URL for a named route. - * - * @param string $name - * @param mixed $parameters - * @param \DateTimeInterface|\DateInterval|int|null $expiration - * @param bool $absolute - * @return string - * @throws \InvalidArgumentException - * @static - */ - public static function signedRoute($name, $parameters = [], $expiration = null, $absolute = true) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->signedRoute($name, $parameters, $expiration, $absolute); - } - /** - * Create a temporary signed route URL for a named route. - * - * @param string $name - * @param \DateTimeInterface|\DateInterval|int $expiration - * @param array $parameters - * @param bool $absolute - * @return string - * @static - */ - public static function temporarySignedRoute($name, $expiration, $parameters = [], $absolute = true) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->temporarySignedRoute($name, $expiration, $parameters, $absolute); - } - /** - * Determine if the given request has a valid signature. - * - * @param \Illuminate\Http\Request $request - * @param bool $absolute - * @param array $ignoreQuery - * @return bool - * @static - */ - public static function hasValidSignature($request, $absolute = true, $ignoreQuery = []) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->hasValidSignature($request, $absolute, $ignoreQuery); - } - /** - * Determine if the given request has a valid signature for a relative URL. - * - * @param \Illuminate\Http\Request $request - * @param array $ignoreQuery - * @return bool - * @static - */ - public static function hasValidRelativeSignature($request, $ignoreQuery = []) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->hasValidRelativeSignature($request, $ignoreQuery); - } - /** - * Determine if the signature from the given request matches the URL. - * - * @param \Illuminate\Http\Request $request - * @param bool $absolute - * @param array $ignoreQuery - * @return bool - * @static - */ - public static function hasCorrectSignature($request, $absolute = true, $ignoreQuery = []) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->hasCorrectSignature($request, $absolute, $ignoreQuery); - } - /** - * Determine if the expires timestamp from the given request is not from the past. - * - * @param \Illuminate\Http\Request $request - * @return bool - * @static - */ - public static function signatureHasNotExpired($request) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->signatureHasNotExpired($request); - } - /** - * Get the URL to a named route. - * - * @param string $name - * @param mixed $parameters - * @param bool $absolute - * @return string - * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException - * @static - */ - public static function route($name, $parameters = [], $absolute = true) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->route($name, $parameters, $absolute); - } - /** - * Get the URL for a given route instance. - * - * @param \Illuminate\Routing\Route $route - * @param mixed $parameters - * @param bool $absolute - * @return string - * @throws \Illuminate\Routing\Exceptions\UrlGenerationException - * @static - */ - public static function toRoute($route, $parameters, $absolute) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->toRoute($route, $parameters, $absolute); - } - /** - * Get the URL to a controller action. - * - * @param string|array $action - * @param mixed $parameters - * @param bool $absolute - * @return string - * @throws \InvalidArgumentException - * @static - */ - public static function action($action, $parameters = [], $absolute = true) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->action($action, $parameters, $absolute); - } - /** - * Format the array of URL parameters. - * - * @param mixed|array $parameters - * @return array - * @static - */ - public static function formatParameters($parameters) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->formatParameters($parameters); - } - /** - * Get the base URL for the request. - * - * @param string $scheme - * @param string|null $root - * @return string - * @static - */ - public static function formatRoot($scheme, $root = null) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->formatRoot($scheme, $root); - } - /** - * Format the given URL segments into a single URL. - * - * @param string $root - * @param string $path - * @param \Illuminate\Routing\Route|null $route - * @return string - * @static - */ - public static function format($root, $path, $route = null) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->format($root, $path, $route); - } - /** - * Determine if the given path is a valid URL. - * - * @param string $path - * @return bool - * @static - */ - public static function isValidUrl($path) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->isValidUrl($path); - } - /** - * Set the default named parameters used by the URL generator. - * - * @param array $defaults - * @return void - * @static - */ - public static function defaults($defaults) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - $instance->defaults($defaults); - } - /** - * Get the default named parameters used by the URL generator. - * - * @return array - * @static - */ - public static function getDefaultParameters() - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->getDefaultParameters(); - } - /** - * Force the scheme for URLs. - * - * @param string|null $scheme - * @return void - * @static - */ - public static function forceScheme($scheme) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - $instance->forceScheme($scheme); - } - /** - * Set the forced root URL. - * - * @param string|null $root - * @return void - * @static - */ - public static function forceRootUrl($root) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - $instance->forceRootUrl($root); - } - /** - * Set a callback to be used to format the host of generated URLs. - * - * @param \Closure $callback - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function formatHostUsing($callback) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->formatHostUsing($callback); - } - /** - * Set a callback to be used to format the path of generated URLs. - * - * @param \Closure $callback - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function formatPathUsing($callback) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->formatPathUsing($callback); - } - /** - * Get the path formatter being used by the URL generator. - * - * @return \Closure - * @static - */ - public static function pathFormatter() - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->pathFormatter(); - } - /** - * Get the request instance. - * - * @return \Illuminate\Http\Request - * @static - */ - public static function getRequest() - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->getRequest(); - } - /** - * Set the current request instance. - * - * @param \Illuminate\Http\Request $request - * @return void - * @static - */ - public static function setRequest($request) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - $instance->setRequest($request); - } - /** - * Set the route collection. - * - * @param \Illuminate\Routing\RouteCollectionInterface $routes - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function setRoutes($routes) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->setRoutes($routes); - } - /** - * Set the session resolver for the generator. - * - * @param callable $sessionResolver - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function setSessionResolver($sessionResolver) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->setSessionResolver($sessionResolver); - } - /** - * Set the encryption key resolver. - * - * @param callable $keyResolver - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function setKeyResolver($keyResolver) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->setKeyResolver($keyResolver); - } - /** - * Clone a new instance of the URL generator with a different encryption key resolver. - * - * @param callable $keyResolver - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function withKeyResolver($keyResolver) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->withKeyResolver($keyResolver); - } - /** - * Set the callback that should be used to attempt to resolve missing named routes. - * - * @param callable $missingNamedRouteResolver - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function resolveMissingNamedRoutesUsing($missingNamedRouteResolver) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->resolveMissingNamedRoutesUsing($missingNamedRouteResolver); - } - /** - * Get the root controller namespace. - * - * @return string - * @static - */ - public static function getRootControllerNamespace() - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->getRootControllerNamespace(); - } - /** - * Set the root controller namespace. - * - * @param string $rootNamespace - * @return \Illuminate\Routing\UrlGenerator - * @static - */ - public static function setRootControllerNamespace($rootNamespace) - { - /** @var \Illuminate\Routing\UrlGenerator $instance */ - return $instance->setRootControllerNamespace($rootNamespace); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Routing\UrlGenerator::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Routing\UrlGenerator::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Routing\UrlGenerator::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Routing\UrlGenerator::flushMacros(); - } - - } - /** - * - * - * @see \Illuminate\Validation\Factory - */ - class Validator { - /** - * Create a new Validator instance. - * - * @param array $data - * @param array $rules - * @param array $messages - * @param array $attributes - * @return \Illuminate\Validation\Validator - * @static - */ - public static function make($data, $rules, $messages = [], $attributes = []) - { - /** @var \Illuminate\Validation\Factory $instance */ - return $instance->make($data, $rules, $messages, $attributes); - } - /** - * Validate the given data against the provided rules. - * - * @param array $data - * @param array $rules - * @param array $messages - * @param array $attributes - * @return array - * @throws \Illuminate\Validation\ValidationException - * @static - */ - public static function validate($data, $rules, $messages = [], $attributes = []) - { - /** @var \Illuminate\Validation\Factory $instance */ - return $instance->validate($data, $rules, $messages, $attributes); - } - /** - * Register a custom validator extension. - * - * @param string $rule - * @param \Closure|string $extension - * @param string|null $message - * @return void - * @static - */ - public static function extend($rule, $extension, $message = null) - { - /** @var \Illuminate\Validation\Factory $instance */ - $instance->extend($rule, $extension, $message); - } - /** - * Register a custom implicit validator extension. - * - * @param string $rule - * @param \Closure|string $extension - * @param string|null $message - * @return void - * @static - */ - public static function extendImplicit($rule, $extension, $message = null) - { - /** @var \Illuminate\Validation\Factory $instance */ - $instance->extendImplicit($rule, $extension, $message); - } - /** - * Register a custom dependent validator extension. - * - * @param string $rule - * @param \Closure|string $extension - * @param string|null $message - * @return void - * @static - */ - public static function extendDependent($rule, $extension, $message = null) - { - /** @var \Illuminate\Validation\Factory $instance */ - $instance->extendDependent($rule, $extension, $message); - } - /** - * Register a custom validator message replacer. - * - * @param string $rule - * @param \Closure|string $replacer - * @return void - * @static - */ - public static function replacer($rule, $replacer) - { - /** @var \Illuminate\Validation\Factory $instance */ - $instance->replacer($rule, $replacer); - } - /** - * Indicate that unvalidated array keys should be included in validated data when the parent array is validated. - * - * @return void - * @static - */ - public static function includeUnvalidatedArrayKeys() - { - /** @var \Illuminate\Validation\Factory $instance */ - $instance->includeUnvalidatedArrayKeys(); - } - /** - * Indicate that unvalidated array keys should be excluded from the validated data, even if the parent array was validated. - * - * @return void - * @static - */ - public static function excludeUnvalidatedArrayKeys() - { - /** @var \Illuminate\Validation\Factory $instance */ - $instance->excludeUnvalidatedArrayKeys(); - } - /** - * Set the Validator instance resolver. - * - * @param \Closure $resolver - * @return void - * @static - */ - public static function resolver($resolver) - { - /** @var \Illuminate\Validation\Factory $instance */ - $instance->resolver($resolver); - } - /** - * Get the Translator implementation. - * - * @return \Illuminate\Contracts\Translation\Translator - * @static - */ - public static function getTranslator() - { - /** @var \Illuminate\Validation\Factory $instance */ - return $instance->getTranslator(); - } - /** - * Get the Presence Verifier implementation. - * - * @return \Illuminate\Validation\PresenceVerifierInterface - * @static - */ - public static function getPresenceVerifier() - { - /** @var \Illuminate\Validation\Factory $instance */ - return $instance->getPresenceVerifier(); - } - /** - * Set the Presence Verifier implementation. - * - * @param \Illuminate\Validation\PresenceVerifierInterface $presenceVerifier - * @return void - * @static - */ - public static function setPresenceVerifier($presenceVerifier) - { - /** @var \Illuminate\Validation\Factory $instance */ - $instance->setPresenceVerifier($presenceVerifier); - } - /** - * Get the container instance used by the validation factory. - * - * @return \Illuminate\Contracts\Container\Container|null - * @static - */ - public static function getContainer() - { - /** @var \Illuminate\Validation\Factory $instance */ - return $instance->getContainer(); - } - /** - * Set the container instance used by the validation factory. - * - * @param \Illuminate\Contracts\Container\Container $container - * @return \Illuminate\Validation\Factory - * @static - */ - public static function setContainer($container) - { - /** @var \Illuminate\Validation\Factory $instance */ - return $instance->setContainer($container); - } - - } - /** - * - * - * @see \Illuminate\View\Factory - */ - class View { - /** - * Get the evaluated view contents for the given view. - * - * @param string $path - * @param \Illuminate\Contracts\Support\Arrayable|array $data - * @param array $mergeData - * @return \Illuminate\Contracts\View\View - * @static - */ - public static function file($path, $data = [], $mergeData = []) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->file($path, $data, $mergeData); - } - /** - * Get the evaluated view contents for the given view. - * - * @param string $view - * @param \Illuminate\Contracts\Support\Arrayable|array $data - * @param array $mergeData - * @return \Illuminate\Contracts\View\View - * @static - */ - public static function make($view, $data = [], $mergeData = []) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->make($view, $data, $mergeData); - } - /** - * Get the first view that actually exists from the given list. - * - * @param array $views - * @param \Illuminate\Contracts\Support\Arrayable|array $data - * @param array $mergeData - * @return \Illuminate\Contracts\View\View - * @throws \InvalidArgumentException - * @static - */ - public static function first($views, $data = [], $mergeData = []) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->first($views, $data, $mergeData); - } - /** - * Get the rendered content of the view based on a given condition. - * - * @param bool $condition - * @param string $view - * @param \Illuminate\Contracts\Support\Arrayable|array $data - * @param array $mergeData - * @return string - * @static - */ - public static function renderWhen($condition, $view, $data = [], $mergeData = []) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->renderWhen($condition, $view, $data, $mergeData); - } - /** - * Get the rendered content of the view based on the negation of a given condition. - * - * @param bool $condition - * @param string $view - * @param \Illuminate\Contracts\Support\Arrayable|array $data - * @param array $mergeData - * @return string - * @static - */ - public static function renderUnless($condition, $view, $data = [], $mergeData = []) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->renderUnless($condition, $view, $data, $mergeData); - } - /** - * Get the rendered contents of a partial from a loop. - * - * @param string $view - * @param array $data - * @param string $iterator - * @param string $empty - * @return string - * @static - */ - public static function renderEach($view, $data, $iterator, $empty = 'raw|') - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->renderEach($view, $data, $iterator, $empty); - } - /** - * Determine if a given view exists. - * - * @param string $view - * @return bool - * @static - */ - public static function exists($view) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->exists($view); - } - /** - * Get the appropriate view engine for the given path. - * - * @param string $path - * @return \Illuminate\Contracts\View\Engine - * @throws \InvalidArgumentException - * @static - */ - public static function getEngineFromPath($path) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getEngineFromPath($path); - } - /** - * Add a piece of shared data to the environment. - * - * @param array|string $key - * @param mixed|null $value - * @return mixed - * @static - */ - public static function share($key, $value = null) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->share($key, $value); - } - /** - * Increment the rendering counter. - * - * @return void - * @static - */ - public static function incrementRender() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->incrementRender(); - } - /** - * Decrement the rendering counter. - * - * @return void - * @static - */ - public static function decrementRender() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->decrementRender(); - } - /** - * Check if there are no active render operations. - * - * @return bool - * @static - */ - public static function doneRendering() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->doneRendering(); - } - /** - * Determine if the given once token has been rendered. - * - * @param string $id - * @return bool - * @static - */ - public static function hasRenderedOnce($id) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->hasRenderedOnce($id); - } - /** - * Mark the given once token as having been rendered. - * - * @param string $id - * @return void - * @static - */ - public static function markAsRenderedOnce($id) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->markAsRenderedOnce($id); - } - /** - * Add a location to the array of view locations. - * - * @param string $location - * @return void - * @static - */ - public static function addLocation($location) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->addLocation($location); - } - /** - * Add a new namespace to the loader. - * - * @param string $namespace - * @param string|array $hints - * @return \Illuminate\View\Factory - * @static - */ - public static function addNamespace($namespace, $hints) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->addNamespace($namespace, $hints); - } - /** - * Prepend a new namespace to the loader. - * - * @param string $namespace - * @param string|array $hints - * @return \Illuminate\View\Factory - * @static - */ - public static function prependNamespace($namespace, $hints) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->prependNamespace($namespace, $hints); - } - /** - * Replace the namespace hints for the given namespace. - * - * @param string $namespace - * @param string|array $hints - * @return \Illuminate\View\Factory - * @static - */ - public static function replaceNamespace($namespace, $hints) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->replaceNamespace($namespace, $hints); - } - /** - * Register a valid view extension and its engine. - * - * @param string $extension - * @param string $engine - * @param \Closure|null $resolver - * @return void - * @static - */ - public static function addExtension($extension, $engine, $resolver = null) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->addExtension($extension, $engine, $resolver); - } - /** - * Flush all of the factory state like sections and stacks. - * - * @return void - * @static - */ - public static function flushState() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->flushState(); - } - /** - * Flush all of the section contents if done rendering. - * - * @return void - * @static - */ - public static function flushStateIfDoneRendering() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->flushStateIfDoneRendering(); - } - /** - * Get the extension to engine bindings. - * - * @return array - * @static - */ - public static function getExtensions() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getExtensions(); - } - /** - * Get the engine resolver instance. - * - * @return \Illuminate\View\Engines\EngineResolver - * @static - */ - public static function getEngineResolver() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getEngineResolver(); - } - /** - * Get the view finder instance. - * - * @return \Illuminate\View\ViewFinderInterface - * @static - */ - public static function getFinder() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getFinder(); - } - /** - * Set the view finder instance. - * - * @param \Illuminate\View\ViewFinderInterface $finder - * @return void - * @static - */ - public static function setFinder($finder) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->setFinder($finder); - } - /** - * Flush the cache of views located by the finder. - * - * @return void - * @static - */ - public static function flushFinderCache() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->flushFinderCache(); - } - /** - * Get the event dispatcher instance. - * - * @return \Illuminate\Contracts\Events\Dispatcher - * @static - */ - public static function getDispatcher() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getDispatcher(); - } - /** - * Set the event dispatcher instance. - * - * @param \Illuminate\Contracts\Events\Dispatcher $events - * @return void - * @static - */ - public static function setDispatcher($events) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->setDispatcher($events); - } - /** - * Get the IoC container instance. - * - * @return \Illuminate\Contracts\Container\Container - * @static - */ - public static function getContainer() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getContainer(); - } - /** - * Set the IoC container instance. - * - * @param \Illuminate\Contracts\Container\Container $container - * @return void - * @static - */ - public static function setContainer($container) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->setContainer($container); - } - /** - * Get an item from the shared data. - * - * @param string $key - * @param mixed $default - * @return mixed - * @static - */ - public static function shared($key, $default = null) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->shared($key, $default); - } - /** - * Get all of the shared data for the environment. - * - * @return array - * @static - */ - public static function getShared() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getShared(); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\View\Factory::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\View\Factory::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\View\Factory::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\View\Factory::flushMacros(); - } - /** - * Start a component rendering process. - * - * @param \Illuminate\Contracts\View\View|\Illuminate\Contracts\Support\Htmlable|\Closure|string $view - * @param array $data - * @return void - * @static - */ - public static function startComponent($view, $data = []) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->startComponent($view, $data); - } - /** - * Get the first view that actually exists from the given list, and start a component. - * - * @param array $names - * @param array $data - * @return void - * @static - */ - public static function startComponentFirst($names, $data = []) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->startComponentFirst($names, $data); - } - /** - * Render the current component. - * - * @return string - * @static - */ - public static function renderComponent() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->renderComponent(); - } - /** - * Get an item from the component data that exists above the current component. - * - * @param string $key - * @param mixed $default - * @return mixed|null - * @static - */ - public static function getConsumableComponentData($key, $default = null) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getConsumableComponentData($key, $default); - } - /** - * Start the slot rendering process. - * - * @param string $name - * @param string|null $content - * @param array $attributes - * @return void - * @static - */ - public static function slot($name, $content = null, $attributes = []) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->slot($name, $content, $attributes); - } - /** - * Save the slot content for rendering. - * - * @return void - * @static - */ - public static function endSlot() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->endSlot(); - } - /** - * Register a view creator event. - * - * @param array|string $views - * @param \Closure|string $callback - * @return array - * @static - */ - public static function creator($views, $callback) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->creator($views, $callback); - } - /** - * Register multiple view composers via an array. - * - * @param array $composers - * @return array - * @static - */ - public static function composers($composers) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->composers($composers); - } - /** - * Register a view composer event. - * - * @param array|string $views - * @param \Closure|string $callback - * @return array - * @static - */ - public static function composer($views, $callback) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->composer($views, $callback); - } - /** - * Call the composer for a given view. - * - * @param \Illuminate\Contracts\View\View $view - * @return void - * @static - */ - public static function callComposer($view) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->callComposer($view); - } - /** - * Call the creator for a given view. - * - * @param \Illuminate\Contracts\View\View $view - * @return void - * @static - */ - public static function callCreator($view) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->callCreator($view); - } - /** - * Start injecting content into a fragment. - * - * @param string $fragment - * @return void - * @static - */ - public static function startFragment($fragment) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->startFragment($fragment); - } - /** - * Stop injecting content into a fragment. - * - * @return string - * @throws \InvalidArgumentException - * @static - */ - public static function stopFragment() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->stopFragment(); - } - /** - * Get the contents of a fragment. - * - * @param string $name - * @param string|null $default - * @return mixed - * @static - */ - public static function getFragment($name, $default = null) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getFragment($name, $default); - } - /** - * Get the entire array of rendered fragments. - * - * @return array - * @static - */ - public static function getFragments() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getFragments(); - } - /** - * Flush all of the fragments. - * - * @return void - * @static - */ - public static function flushFragments() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->flushFragments(); - } - /** - * Start injecting content into a section. - * - * @param string $section - * @param string|null $content - * @return void - * @static - */ - public static function startSection($section, $content = null) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->startSection($section, $content); - } - /** - * Inject inline content into a section. - * - * @param string $section - * @param string $content - * @return void - * @static - */ - public static function inject($section, $content) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->inject($section, $content); - } - /** - * Stop injecting content into a section and return its contents. - * - * @return string - * @static - */ - public static function yieldSection() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->yieldSection(); - } - /** - * Stop injecting content into a section. - * - * @param bool $overwrite - * @return string - * @throws \InvalidArgumentException - * @static - */ - public static function stopSection($overwrite = false) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->stopSection($overwrite); - } - /** - * Stop injecting content into a section and append it. - * - * @return string - * @throws \InvalidArgumentException - * @static - */ - public static function appendSection() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->appendSection(); - } - /** - * Get the string contents of a section. - * - * @param string $section - * @param string $default - * @return string - * @static - */ - public static function yieldContent($section, $default = '') - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->yieldContent($section, $default); - } - /** - * Get the parent placeholder for the current request. - * - * @param string $section - * @return string - * @static - */ - public static function parentPlaceholder($section = '') - { - return \Illuminate\View\Factory::parentPlaceholder($section); - } - /** - * Check if section exists. - * - * @param string $name - * @return bool - * @static - */ - public static function hasSection($name) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->hasSection($name); - } - /** - * Check if section does not exist. - * - * @param string $name - * @return bool - * @static - */ - public static function sectionMissing($name) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->sectionMissing($name); - } - /** - * Get the contents of a section. - * - * @param string $name - * @param string|null $default - * @return mixed - * @static - */ - public static function getSection($name, $default = null) - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getSection($name, $default); - } - /** - * Get the entire array of sections. - * - * @return array - * @static - */ - public static function getSections() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getSections(); - } - /** - * Flush all of the sections. - * - * @return void - * @static - */ - public static function flushSections() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->flushSections(); - } - /** - * Add new loop to the stack. - * - * @param \Countable|array $data - * @return void - * @static - */ - public static function addLoop($data) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->addLoop($data); - } - /** - * Increment the top loop's indices. - * - * @return void - * @static - */ - public static function incrementLoopIndices() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->incrementLoopIndices(); - } - /** - * Pop a loop from the top of the loop stack. - * - * @return void - * @static - */ - public static function popLoop() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->popLoop(); - } - /** - * Get an instance of the last loop in the stack. - * - * @return \stdClass|null - * @static - */ - public static function getLastLoop() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getLastLoop(); - } - /** - * Get the entire loop stack. - * - * @return array - * @static - */ - public static function getLoopStack() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->getLoopStack(); - } - /** - * Start injecting content into a push section. - * - * @param string $section - * @param string $content - * @return void - * @static - */ - public static function startPush($section, $content = '') - { - /** @var \Illuminate\View\Factory $instance */ - $instance->startPush($section, $content); - } - /** - * Stop injecting content into a push section. - * - * @return string - * @throws \InvalidArgumentException - * @static - */ - public static function stopPush() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->stopPush(); - } - /** - * Start prepending content into a push section. - * - * @param string $section - * @param string $content - * @return void - * @static - */ - public static function startPrepend($section, $content = '') - { - /** @var \Illuminate\View\Factory $instance */ - $instance->startPrepend($section, $content); - } - /** - * Stop prepending content into a push section. - * - * @return string - * @throws \InvalidArgumentException - * @static - */ - public static function stopPrepend() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->stopPrepend(); - } - /** - * Get the string contents of a push section. - * - * @param string $section - * @param string $default - * @return string - * @static - */ - public static function yieldPushContent($section, $default = '') - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->yieldPushContent($section, $default); - } - /** - * Flush all of the stacks. - * - * @return void - * @static - */ - public static function flushStacks() - { - /** @var \Illuminate\View\Factory $instance */ - $instance->flushStacks(); - } - /** - * Start a translation block. - * - * @param array $replacements - * @return void - * @static - */ - public static function startTranslation($replacements = []) - { - /** @var \Illuminate\View\Factory $instance */ - $instance->startTranslation($replacements); - } - /** - * Render the current translation. - * - * @return string - * @static - */ - public static function renderTranslation() - { - /** @var \Illuminate\View\Factory $instance */ - return $instance->renderTranslation(); - } - - } - /** - * - * - * @see \Illuminate\Foundation\Vite - */ - class Vite { - /** - * Get the preloaded assets. - * - * @return array - * @static - */ - public static function preloadedAssets() - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->preloadedAssets(); - } - /** - * Get the Content Security Policy nonce applied to all generated tags. - * - * @return string|null - * @static - */ - public static function cspNonce() - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->cspNonce(); - } - /** - * Generate or set a Content Security Policy nonce to apply to all generated tags. - * - * @param string|null $nonce - * @return string - * @static - */ - public static function useCspNonce($nonce = null) - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->useCspNonce($nonce); - } - /** - * Use the given key to detect integrity hashes in the manifest. - * - * @param string|false $key - * @return \Illuminate\Foundation\Vite - * @static - */ - public static function useIntegrityKey($key) - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->useIntegrityKey($key); - } - /** - * Set the Vite entry points. - * - * @param array $entryPoints - * @return \Illuminate\Foundation\Vite - * @static - */ - public static function withEntryPoints($entryPoints) - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->withEntryPoints($entryPoints); - } - /** - * Set the filename for the manifest file. - * - * @param string $filename - * @return \Illuminate\Foundation\Vite - * @static - */ - public static function useManifestFilename($filename) - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->useManifestFilename($filename); - } - /** - * Get the Vite "hot" file path. - * - * @return string - * @static - */ - public static function hotFile() - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->hotFile(); - } - /** - * Set the Vite "hot" file path. - * - * @param string $path - * @return \Illuminate\Foundation\Vite - * @static - */ - public static function useHotFile($path) - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->useHotFile($path); - } - /** - * Set the Vite build directory. - * - * @param string $path - * @return \Illuminate\Foundation\Vite - * @static - */ - public static function useBuildDirectory($path) - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->useBuildDirectory($path); - } - /** - * Use the given callback to resolve attributes for script tags. - * - * @param \Illuminate\Foundation\(callable(string, string, ?array, ?array): array)|array $attributes - * @return \Illuminate\Foundation\Vite - * @static - */ - public static function useScriptTagAttributes($attributes) - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->useScriptTagAttributes($attributes); - } - /** - * Use the given callback to resolve attributes for style tags. - * - * @param \Illuminate\Foundation\(callable(string, string, ?array, ?array): array)|array $attributes - * @return \Illuminate\Foundation\Vite - * @static - */ - public static function useStyleTagAttributes($attributes) - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->useStyleTagAttributes($attributes); - } - /** - * Use the given callback to resolve attributes for preload tags. - * - * @param \Illuminate\Foundation\(callable(string, string, ?array, ?array): (array|false))|array|false $attributes - * @return \Illuminate\Foundation\Vite - * @static - */ - public static function usePreloadTagAttributes($attributes) - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->usePreloadTagAttributes($attributes); - } - /** - * Generate React refresh runtime script. - * - * @return \Illuminate\Support\HtmlString|void - * @static - */ - public static function reactRefresh() - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->reactRefresh(); - } - /** - * Get the URL for an asset. - * - * @param string $asset - * @param string|null $buildDirectory - * @return string - * @static - */ - public static function asset($asset, $buildDirectory = null) - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->asset($asset, $buildDirectory); - } - /** - * Get the content of a given asset. - * - * @param string $asset - * @param string|null $buildDirectory - * @return string - * @throws \Exception - * @static - */ - public static function content($asset, $buildDirectory = null) - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->content($asset, $buildDirectory); - } - /** - * Get a unique hash representing the current manifest, or null if there is no manifest. - * - * @param string|null $buildDirectory - * @return string|null - * @static - */ - public static function manifestHash($buildDirectory = null) - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->manifestHash($buildDirectory); - } - /** - * Determine if the HMR server is running. - * - * @return bool - * @static - */ - public static function isRunningHot() - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->isRunningHot(); - } - /** - * Get the Vite tag content as a string of HTML. - * - * @return string - * @static - */ - public static function toHtml() - { - /** @var \Illuminate\Foundation\Vite $instance */ - return $instance->toHtml(); - } - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Foundation\Vite::macro($name, $macro); - } - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Foundation\Vite::mixin($mixin, $replace); - } - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Foundation\Vite::hasMacro($name); - } - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Foundation\Vite::flushMacros(); - } - - } - -} - - namespace Illuminate\Support { - /** - * - * - */ - class Arr { - - } - /** - * - * - */ - class Js { - - } - /** - * - * - */ - class Str { - - } - -} - - namespace Intervention\Image\Facades { - /** - * - * - */ - class Image { - /** - * Overrides configuration settings - * - * @param array $config - * @return self - * @static - */ - public static function configure($config = []) - { - /** @var \Intervention\Image\ImageManager $instance */ - return $instance->configure($config); - } - /** - * Initiates an Image instance from different input types - * - * @param mixed $data - * @return \Intervention\Image\Image - * @static - */ - public static function make($data) - { - /** @var \Intervention\Image\ImageManager $instance */ - return $instance->make($data); - } - /** - * Creates an empty image canvas - * - * @param int $width - * @param int $height - * @param mixed $background - * @return \Intervention\Image\Image - * @static - */ - public static function canvas($width, $height, $background = null) - { - /** @var \Intervention\Image\ImageManager $instance */ - return $instance->canvas($width, $height, $background); - } - /** - * Create new cached image and run callback - * (requires additional package intervention/imagecache) - * - * @param \Closure $callback - * @param int $lifetime - * @param boolean $returnObj - * @return \Image - * @static - */ - public static function cache($callback, $lifetime = null, $returnObj = false) - { - /** @var \Intervention\Image\ImageManager $instance */ - return $instance->cache($callback, $lifetime, $returnObj); - } - - } - /** - * - * - */ - class Image { - /** - * Overrides configuration settings - * - * @param array $config - * @return self - * @static - */ - public static function configure($config = []) - { - /** @var \Intervention\Image\ImageManager $instance */ - return $instance->configure($config); - } - /** - * Initiates an Image instance from different input types - * - * @param mixed $data - * @return \Intervention\Image\Image - * @static - */ - public static function make($data) - { - /** @var \Intervention\Image\ImageManager $instance */ - return $instance->make($data); - } - /** - * Creates an empty image canvas - * - * @param int $width - * @param int $height - * @param mixed $background - * @return \Intervention\Image\Image - * @static - */ - public static function canvas($width, $height, $background = null) - { - /** @var \Intervention\Image\ImageManager $instance */ - return $instance->canvas($width, $height, $background); - } - /** - * Create new cached image and run callback - * (requires additional package intervention/imagecache) - * - * @param \Closure $callback - * @param int $lifetime - * @param boolean $returnObj - * @return \Image - * @static - */ - public static function cache($callback, $lifetime = null, $returnObj = false) - { - /** @var \Intervention\Image\ImageManager $instance */ - return $instance->cache($callback, $lifetime, $returnObj); - } - - } - -} - - namespace Clockwork\Support\Laravel { - /** - * - * - */ - class Facade { - /** - * - * - * @static - */ - public static function addDataSource($dataSource) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->addDataSource($dataSource); - } - /** - * - * - * @static - */ - public static function resolveRequest() - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->resolveRequest(); - } - /** - * - * - * @static - */ - public static function resolveAsCommand($name, $exitCode = null, $arguments = [], $options = [], $argumentsDefaults = [], $optionsDefaults = [], $output = null) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->resolveAsCommand($name, $exitCode, $arguments, $options, $argumentsDefaults, $optionsDefaults, $output); - } - /** - * - * - * @static - */ - public static function resolveAsQueueJob($name, $description = null, $status = 'processed', $payload = [], $queue = null, $connection = null, $options = []) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->resolveAsQueueJob($name, $description, $status, $payload, $queue, $connection, $options); - } - /** - * - * - * @static - */ - public static function resolveAsTest($name, $status = 'passed', $statusMessage = null, $asserts = []) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->resolveAsTest($name, $status, $statusMessage, $asserts); - } - /** - * - * - * @static - */ - public static function extendRequest($request = null) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->extendRequest($request); - } - /** - * - * - * @static - */ - public static function storeRequest() - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->storeRequest(); - } - /** - * - * - * @static - */ - public static function reset() - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->reset(); - } - /** - * - * - * @static - */ - public static function request($request = null) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->request($request); - } - /** - * - * - * @static - */ - public static function log($level = null, $message = null, $context = []) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->log($level, $message, $context); - } - /** - * - * - * @static - */ - public static function timeline() - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->timeline(); - } - /** - * - * - * @static - */ - public static function event($description, $data = []) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->event($description, $data); - } - /** - * - * - * @static - */ - public static function shouldCollect($shouldCollect = null) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->shouldCollect($shouldCollect); - } - /** - * - * - * @static - */ - public static function shouldRecord($shouldRecord = null) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->shouldRecord($shouldRecord); - } - /** - * - * - * @static - */ - public static function dataSources($dataSources = null) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->dataSources($dataSources); - } - /** - * - * - * @static - */ - public static function storage($storage = null) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->storage($storage); - } - /** - * - * - * @static - */ - public static function authenticator($authenticator = null) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->authenticator($authenticator); - } - /** - * - * - * @static - */ - public static function getDataSources() - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->getDataSources(); - } - /** - * - * - * @static - */ - public static function getRequest() - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->getRequest(); - } - /** - * - * - * @static - */ - public static function setRequest($request) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->setRequest($request); - } - /** - * - * - * @static - */ - public static function getStorage() - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->getStorage(); - } - /** - * - * - * @static - */ - public static function setStorage($storage) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->setStorage($storage); - } - /** - * - * - * @static - */ - public static function getAuthenticator() - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->getAuthenticator(); - } - /** - * - * - * @static - */ - public static function setAuthenticator($authenticator) - { - /** @var \Clockwork\Clockwork $instance */ - return $instance->setAuthenticator($authenticator); - } - - } - -} - - namespace Spatie\LaravelIgnition\Facades { - /** - * - * - * @see \Spatie\FlareClient\Flare - */ - class Flare { - /** - * - * - * @static - */ - public static function make($apiKey = null, $contextDetector = null) - { - return \Spatie\FlareClient\Flare::make($apiKey, $contextDetector); - } - /** - * - * - * @static - */ - public static function setApiToken($apiToken) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->setApiToken($apiToken); - } - /** - * - * - * @static - */ - public static function apiTokenSet() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->apiTokenSet(); - } - /** - * - * - * @static - */ - public static function setBaseUrl($baseUrl) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->setBaseUrl($baseUrl); - } - /** - * - * - * @static - */ - public static function setStage($stage) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->setStage($stage); - } - /** - * - * - * @static - */ - public static function sendReportsImmediately() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->sendReportsImmediately(); - } - /** - * - * - * @static - */ - public static function determineVersionUsing($determineVersionCallable) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->determineVersionUsing($determineVersionCallable); - } - /** - * - * - * @static - */ - public static function reportErrorLevels($reportErrorLevels) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->reportErrorLevels($reportErrorLevels); - } - /** - * - * - * @static - */ - public static function filterExceptionsUsing($filterExceptionsCallable) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->filterExceptionsUsing($filterExceptionsCallable); - } - /** - * - * - * @static - */ - public static function filterReportsUsing($filterReportsCallable) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->filterReportsUsing($filterReportsCallable); - } - /** - * - * - * @param array|ArgumentReducer>|\Spatie\Backtrace\Arguments\ArgumentReducers|null $argumentReducers - * @static - */ - public static function argumentReducers($argumentReducers) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->argumentReducers($argumentReducers); - } - /** - * - * - * @static - */ - public static function withStackFrameArguments($withStackFrameArguments = true) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->withStackFrameArguments($withStackFrameArguments); - } - /** - * - * - * @static - */ - public static function version() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->version(); - } - /** - * - * - * @return array> - * @static - */ - public static function getMiddleware() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->getMiddleware(); - } - /** - * - * - * @static - */ - public static function setContextProviderDetector($contextDetector) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->setContextProviderDetector($contextDetector); - } - /** - * - * - * @static - */ - public static function setContainer($container) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->setContainer($container); - } - /** - * - * - * @static - */ - public static function registerFlareHandlers() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->registerFlareHandlers(); - } - /** - * - * - * @static - */ - public static function registerExceptionHandler() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->registerExceptionHandler(); - } - /** - * - * - * @static - */ - public static function registerErrorHandler() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->registerErrorHandler(); - } - /** - * - * - * @param \Spatie\FlareClient\FlareMiddleware\FlareMiddleware|array|\Spatie\FlareClient\class-string|callable $middleware - * @return \Spatie\FlareClient\Flare - * @static - */ - public static function registerMiddleware($middleware) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->registerMiddleware($middleware); - } - /** - * - * - * @return array> - * @static - */ - public static function getMiddlewares() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->getMiddlewares(); - } - /** - * - * - * @param string $name - * @param string $messageLevel - * @param array $metaData - * @return \Spatie\FlareClient\Flare - * @static - */ - public static function glow($name, $messageLevel = 'info', $metaData = []) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->glow($name, $messageLevel, $metaData); - } - /** - * - * - * @static - */ - public static function handleException($throwable) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->handleException($throwable); - } - /** - * - * - * @return mixed - * @static - */ - public static function handleError($code, $message, $file = '', $line = 0) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->handleError($code, $message, $file, $line); - } - /** - * - * - * @static - */ - public static function applicationPath($applicationPath) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->applicationPath($applicationPath); - } - /** - * - * - * @static - */ - public static function report($throwable, $callback = null, $report = null) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->report($throwable, $callback, $report); - } - /** - * - * - * @static - */ - public static function reportMessage($message, $logLevel, $callback = null) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->reportMessage($message, $logLevel, $callback); - } - /** - * - * - * @static - */ - public static function sendTestReport($throwable) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->sendTestReport($throwable); - } - /** - * - * - * @static - */ - public static function reset() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->reset(); - } - /** - * - * - * @static - */ - public static function anonymizeIp() - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->anonymizeIp(); - } - /** - * - * - * @param array $fieldNames - * @return \Spatie\FlareClient\Flare - * @static - */ - public static function censorRequestBodyFields($fieldNames) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->censorRequestBodyFields($fieldNames); - } - /** - * - * - * @static - */ - public static function createReport($throwable) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->createReport($throwable); - } - /** - * - * - * @static - */ - public static function createReportFromMessage($message, $logLevel) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->createReportFromMessage($message, $logLevel); - } - /** - * - * - * @static - */ - public static function stage($stage) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->stage($stage); - } - /** - * - * - * @static - */ - public static function messageLevel($messageLevel) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->messageLevel($messageLevel); - } - /** - * - * - * @param string $groupName - * @param mixed $default - * @return array - * @static - */ - public static function getGroup($groupName = 'context', $default = []) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->getGroup($groupName, $default); - } - /** - * - * - * @static - */ - public static function context($key, $value) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->context($key, $value); - } - /** - * - * - * @param string $groupName - * @param array $properties - * @return \Spatie\FlareClient\Flare - * @static - */ - public static function group($groupName, $properties) - { - /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->group($groupName, $properties); - } - - } - -} - - namespace Illuminate\Http { - /** - * - * - */ - class Request { - /** - * - * - * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestValidation() - * @param array $rules - * @param mixed $params - * @static - */ - public static function validate($rules, ...$params) - { - return \Illuminate\Http\Request::validate($rules, ...$params); - } - /** - * - * - * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestValidation() - * @param string $errorBag - * @param array $rules - * @param mixed $params - * @static - */ - public static function validateWithBag($errorBag, $rules, ...$params) - { - return \Illuminate\Http\Request::validateWithBag($errorBag, $rules, ...$params); - } - /** - * - * - * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() - * @param mixed $absolute - * @static - */ - public static function hasValidSignature($absolute = true) - { - return \Illuminate\Http\Request::hasValidSignature($absolute); - } - /** - * - * - * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() - * @static - */ - public static function hasValidRelativeSignature() - { - return \Illuminate\Http\Request::hasValidRelativeSignature(); - } - /** - * - * - * @see \Illuminate\Foundation\Providers\FoundationServiceProvider::registerRequestSignatureValidation() - * @param mixed $ignoreQuery - * @param mixed $absolute - * @static - */ - public static function hasValidSignatureWhileIgnoring($ignoreQuery = [], $absolute = true) - { - return \Illuminate\Http\Request::hasValidSignatureWhileIgnoring($ignoreQuery, $absolute); - } - /** - * - * - * @see \App\Providers\AppServiceProvider::boot() - * @param mixed $param - * @param mixed $newParam - * @static - */ - public static function rename($param, $newParam = null) - { - return \Illuminate\Http\Request::rename($param, $newParam); - } - - } - -} - - namespace Illuminate\Routing { - /** - * - * - * @mixin \Illuminate\Routing\RouteRegistrar - */ - class Router { - /** - * - * - * @see \App\Providers\RouteServiceProvider::boot() - * @param mixed $addendum - * @param mixed $uri - * @param mixed $controller - * @static - */ - public static function apiAddendumResource($addendum, $uri, $controller) - { - return \Illuminate\Routing\Router::apiAddendumResource($addendum, $uri, $controller); - } - - } - -} - - namespace Illuminate\Filesystem { - /** - * - * - * @mixin \League\Flysystem\FilesystemOperator - */ - class FilesystemAdapter { - /** - * - * - * @see \App\Providers\AppServiceProvider::boot() - * @param mixed $diskName - * @static - */ - public static function public($diskName) - { - return \Illuminate\Filesystem\FilesystemAdapter::public($diskName); - } - - } - -} - - -namespace { - class App extends \Illuminate\Support\Facades\App {} - class Arr extends \Illuminate\Support\Arr {} - class Artisan extends \Illuminate\Support\Facades\Artisan {} - class Auth extends \Illuminate\Support\Facades\Auth {} - class Blade extends \Illuminate\Support\Facades\Blade {} - class Broadcast extends \Illuminate\Support\Facades\Broadcast {} - class Bus extends \Illuminate\Support\Facades\Bus {} - class Cache extends \Illuminate\Support\Facades\Cache {} - class Config extends \Illuminate\Support\Facades\Config {} - class Cookie extends \Illuminate\Support\Facades\Cookie {} - class Crypt extends \Illuminate\Support\Facades\Crypt {} - class Date extends \Illuminate\Support\Facades\Date {} - class DB extends \Illuminate\Support\Facades\DB {} - class Eloquent extends \Illuminate\Database\Eloquent\Model { - /** - * Create and return an un-saved model instance. - * - * @param array $attributes - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function make($attributes = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->make($attributes); - } - - /** - * Register a new global scope. - * - * @param string $identifier - * @param \Illuminate\Database\Eloquent\Scope|\Closure $scope - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withGlobalScope($identifier, $scope) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withGlobalScope($identifier, $scope); - } - - /** - * Remove a registered global scope. - * - * @param \Illuminate\Database\Eloquent\Scope|string $scope - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withoutGlobalScope($scope) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withoutGlobalScope($scope); - } - - /** - * Remove all or passed registered global scopes. - * - * @param array|null $scopes - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withoutGlobalScopes($scopes = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withoutGlobalScopes($scopes); - } - - /** - * Get an array of global scopes that were removed from the query. - * - * @return array - * @static - */ - public static function removedScopes() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->removedScopes(); - } - - /** - * Add a where clause on the primary key to the query. - * - * @param mixed $id - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereKey($id) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereKey($id); - } - - /** - * Add a where clause on the primary key to the query. - * - * @param mixed $id - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereKeyNot($id) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereKeyNot($id); - } - - /** - * Add a basic where clause to the query. - * - * @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function where($column, $operator = null, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->where($column, $operator, $value, $boolean); - } - - /** - * Add a basic where clause to the query, and return the first result. - * - * @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return \Illuminate\Database\Eloquent\Model|static|null - * @static - */ - public static function firstWhere($column, $operator = null, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->firstWhere($column, $operator, $value, $boolean); - } - - /** - * Add an "or where" clause to the query. - * - * @param \Closure|array|string|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhere($column, $operator = null, $value = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhere($column, $operator, $value); - } - - /** - * Add a basic "where not" clause to the query. - * - * @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereNot($column, $operator = null, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereNot($column, $operator, $value, $boolean); - } - - /** - * Add an "or where not" clause to the query. - * - * @param \Closure|array|string|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhereNot($column, $operator = null, $value = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhereNot($column, $operator, $value); - } - - /** - * Add an "order by" clause for a timestamp to the query. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function latest($column = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->latest($column); - } - - /** - * Add an "order by" clause for a timestamp to the query. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function oldest($column = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->oldest($column); - } - - /** - * Create a collection of models from plain arrays. - * - * @param array $items - * @return \Illuminate\Database\Eloquent\Collection - * @static - */ - public static function hydrate($items) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->hydrate($items); - } - - /** - * Create a collection of models from a raw query. - * - * @param string $query - * @param array $bindings - * @return \Illuminate\Database\Eloquent\Collection - * @static - */ - public static function fromQuery($query, $bindings = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->fromQuery($query, $bindings); - } - - /** - * Find a model by its primary key. - * - * @param mixed $id - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|static[]|static|null - * @static - */ - public static function find($id, $columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->find($id, $columns); - } - - /** - * Find multiple models by their primary keys. - * - * @param \Illuminate\Contracts\Support\Arrayable|array $ids - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Collection - * @static - */ - public static function findMany($ids, $columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->findMany($ids, $columns); - } - - /** - * Find a model by its primary key or throw an exception. - * - * @param mixed $id - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|static|static[] - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model> - * @static - */ - public static function findOrFail($id, $columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->findOrFail($id, $columns); - } - - /** - * Find a model by its primary key or return fresh model instance. - * - * @param mixed $id - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function findOrNew($id, $columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->findOrNew($id, $columns); - } - - /** - * Find a model by its primary key or call a callback. - * - * @param mixed $id - * @param \Closure|array|string $columns - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|static[]|static|mixed - * @static - */ - public static function findOr($id, $columns = [], $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->findOr($id, $columns, $callback); - } - - /** - * Get the first record matching the attributes or instantiate it. - * - * @param array $attributes - * @param array $values - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function firstOrNew($attributes = [], $values = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->firstOrNew($attributes, $values); - } - - /** - * Get the first record matching the attributes. If the record is not found, create it. - * - * @param array $attributes - * @param array $values - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function firstOrCreate($attributes = [], $values = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->firstOrCreate($attributes, $values); - } - - /** - * Attempt to create the record. If a unique constraint violation occurs, attempt to find the matching record. - * - * @param array $attributes - * @param array $values - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function createOrFirst($attributes = [], $values = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->createOrFirst($attributes, $values); - } - - /** - * Create or update a record matching the attributes, and fill it with values. - * - * @param array $attributes - * @param array $values - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function updateOrCreate($attributes, $values = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->updateOrCreate($attributes, $values); - } - - /** - * Execute the query and get the first result or throw an exception. - * - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Model|static - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model> - * @static - */ - public static function firstOrFail($columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->firstOrFail($columns); - } - - /** - * Execute the query and get the first result or call a callback. - * - * @param \Closure|array|string $columns - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Model|static|mixed - * @static - */ - public static function firstOr($columns = [], $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->firstOr($columns, $callback); - } - - /** - * Execute the query and get the first result if it's the sole matching record. - * - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Model - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model> - * @throws \Illuminate\Database\MultipleRecordsFoundException - * @static - */ - public static function sole($columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->sole($columns); - } - - /** - * Get a single column's value from the first result of a query. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @return mixed - * @static - */ - public static function value($column) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->value($column); - } - - /** - * Get a single column's value from the first result of a query if it's the sole matching record. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @return mixed - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model> - * @throws \Illuminate\Database\MultipleRecordsFoundException - * @static - */ - public static function soleValue($column) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->soleValue($column); - } - - /** - * Get a single column's value from the first result of the query or throw an exception. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @return mixed - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException<\Illuminate\Database\Eloquent\Model> - * @static - */ - public static function valueOrFail($column) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->valueOrFail($column); - } - - /** - * Execute the query as a "select" statement. - * - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Collection|static[] - * @static - */ - public static function get($columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->get($columns); - } - - /** - * Get the hydrated models without eager loading. - * - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Model[]|static[] - * @static - */ - public static function getModels($columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->getModels($columns); - } - - /** - * Eager load the relationships for the models. - * - * @param array $models - * @return array - * @static - */ - public static function eagerLoadRelations($models) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->eagerLoadRelations($models); - } - - /** - * Get a lazy collection for the given query. - * - * @return \Illuminate\Support\LazyCollection - * @static - */ - public static function cursor() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->cursor(); - } - - /** - * Get a collection with the values of a given column. - * - * @param string|\Illuminate\Contracts\Database\Query\Expression $column - * @param string|null $key - * @return \Illuminate\Support\Collection - * @static - */ - public static function pluck($column, $key = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->pluck($column, $key); - } - - /** - * Paginate the given query. - * - * @param int|null|\Closure $perPage - * @param array|string $columns - * @param string $pageName - * @param int|null $page - * @param \Closure|int|null $total - * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator - * @throws \InvalidArgumentException - * @static - */ - public static function paginate($perPage = null, $columns = [], $pageName = 'page', $page = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->paginate($perPage, $columns, $pageName, $page); - } - - /** - * Paginate the given query into a simple paginator. - * - * @param int|null $perPage - * @param array|string $columns - * @param string $pageName - * @param int|null $page - * @return \Illuminate\Contracts\Pagination\Paginator - * @static - */ - public static function simplePaginate($perPage = null, $columns = [], $pageName = 'page', $page = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->simplePaginate($perPage, $columns, $pageName, $page); - } - - /** - * Paginate the given query into a cursor paginator. - * - * @param int|null $perPage - * @param array|string $columns - * @param string $cursorName - * @param \Illuminate\Pagination\Cursor|string|null $cursor - * @return \Illuminate\Contracts\Pagination\CursorPaginator - * @static - */ - public static function cursorPaginate($perPage = null, $columns = [], $cursorName = 'cursor', $cursor = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->cursorPaginate($perPage, $columns, $cursorName, $cursor); - } - - /** - * Save a new model and return the instance. - * - * @param array $attributes - * @return \Illuminate\Database\Eloquent\Model|$this - * @static - */ - public static function create($attributes = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->create($attributes); - } - - /** - * Save a new model and return the instance. Allow mass-assignment. - * - * @param array $attributes - * @return \Illuminate\Database\Eloquent\Model|$this - * @static - */ - public static function forceCreate($attributes) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->forceCreate($attributes); - } - - /** - * Save a new model instance with mass assignment without raising model events. - * - * @param array $attributes - * @return \Illuminate\Database\Eloquent\Model|$this - * @static - */ - public static function forceCreateQuietly($attributes = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->forceCreateQuietly($attributes); - } - - /** - * Insert new records or update the existing ones. - * - * @param array $values - * @param array|string $uniqueBy - * @param array|null $update - * @return int - * @static - */ - public static function upsert($values, $uniqueBy, $update = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->upsert($values, $uniqueBy, $update); - } - - /** - * Register a replacement for the default delete function. - * - * @param \Closure $callback - * @return void - * @static - */ - public static function onDelete($callback) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - $instance->onDelete($callback); - } - - /** - * Call the given local model scopes. - * - * @param array|string $scopes - * @return static|mixed - * @static - */ - public static function scopes($scopes) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->scopes($scopes); - } - - /** - * Apply the scopes to the Eloquent builder instance and return it. - * - * @return static - * @static - */ - public static function applyScopes() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->applyScopes(); - } - - /** - * Prevent the specified relations from being eager loaded. - * - * @param mixed $relations - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function without($relations) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->without($relations); - } - - /** - * Set the relationships that should be eager loaded while removing any previously added eager loading specifications. - * - * @param mixed $relations - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withOnly($relations) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withOnly($relations); - } - - /** - * Create a new instance of the model being queried. - * - * @param array $attributes - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function newModelInstance($attributes = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->newModelInstance($attributes); - } - - /** - * Apply query-time casts to the model instance. - * - * @param array $casts - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withCasts($casts) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withCasts($casts); - } - - /** - * Execute the given Closure within a transaction savepoint if needed. - * - * @template TModelValue - * @param \Closure(): TModelValue $scope - * @return \Illuminate\Database\Eloquent\TModelValue - * @static - */ - public static function withSavepointIfNeeded($scope) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withSavepointIfNeeded($scope); - } - - /** - * Get the underlying query builder instance. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function getQuery() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->getQuery(); - } - - /** - * Set the underlying query builder instance. - * - * @param \Illuminate\Database\Query\Builder $query - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function setQuery($query) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->setQuery($query); - } - - /** - * Get a base query builder instance. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function toBase() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->toBase(); - } - - /** - * Get the relationships being eagerly loaded. - * - * @return array - * @static - */ - public static function getEagerLoads() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->getEagerLoads(); - } - - /** - * Set the relationships being eagerly loaded. - * - * @param array $eagerLoad - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function setEagerLoads($eagerLoad) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->setEagerLoads($eagerLoad); - } - - /** - * Indicate that the given relationships should not be eagerly loaded. - * - * @param array $relations - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withoutEagerLoad($relations) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withoutEagerLoad($relations); - } - - /** - * Flush the relationships being eagerly loaded. - * - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withoutEagerLoads() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withoutEagerLoads(); - } - - /** - * Get the model instance being queried. - * - * @return \Illuminate\Database\Eloquent\Model|static - * @static - */ - public static function getModel() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->getModel(); - } - - /** - * Set a model instance for the model being queried. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function setModel($model) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->setModel($model); - } - - /** - * Get the given macro by name. - * - * @param string $name - * @return \Closure - * @static - */ - public static function getMacro($name) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->getMacro($name); - } - - /** - * Checks if a macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->hasMacro($name); - } - - /** - * Get the given global macro by name. - * - * @param string $name - * @return \Closure - * @static - */ - public static function getGlobalMacro($name) - { - return \Illuminate\Database\Eloquent\Builder::getGlobalMacro($name); - } - - /** - * Checks if a global macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasGlobalMacro($name) - { - return \Illuminate\Database\Eloquent\Builder::hasGlobalMacro($name); - } - - /** - * Clone the Eloquent query builder. - * - * @return static - * @static - */ - public static function clone() - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->clone(); - } - - /** - * Chunk the results of the query. - * - * @param int $count - * @param callable $callback - * @return bool - * @static - */ - public static function chunk($count, $callback) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->chunk($count, $callback); - } - - /** - * Run a map over each item while chunking. - * - * @param callable $callback - * @param int $count - * @return \Illuminate\Support\Collection - * @static - */ - public static function chunkMap($callback, $count = 1000) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->chunkMap($callback, $count); - } - - /** - * Execute a callback over each item while chunking. - * - * @param callable $callback - * @param int $count - * @return bool - * @throws \RuntimeException - * @static - */ - public static function each($callback, $count = 1000) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->each($callback, $count); - } - - /** - * Chunk the results of a query by comparing IDs. - * - * @param int $count - * @param callable $callback - * @param string|null $column - * @param string|null $alias - * @return bool - * @static - */ - public static function chunkById($count, $callback, $column = null, $alias = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->chunkById($count, $callback, $column, $alias); - } - - /** - * Execute a callback over each item while chunking by ID. - * - * @param callable $callback - * @param int $count - * @param string|null $column - * @param string|null $alias - * @return bool - * @static - */ - public static function eachById($callback, $count = 1000, $column = null, $alias = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->eachById($callback, $count, $column, $alias); - } - - /** - * Query lazily, by chunks of the given size. - * - * @param int $chunkSize - * @return \Illuminate\Support\LazyCollection - * @throws \InvalidArgumentException - * @static - */ - public static function lazy($chunkSize = 1000) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->lazy($chunkSize); - } - - /** - * Query lazily, by chunking the results of a query by comparing IDs. - * - * @param int $chunkSize - * @param string|null $column - * @param string|null $alias - * @return \Illuminate\Support\LazyCollection - * @throws \InvalidArgumentException - * @static - */ - public static function lazyById($chunkSize = 1000, $column = null, $alias = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->lazyById($chunkSize, $column, $alias); - } - - /** - * Query lazily, by chunking the results of a query by comparing IDs in descending order. - * - * @param int $chunkSize - * @param string|null $column - * @param string|null $alias - * @return \Illuminate\Support\LazyCollection - * @throws \InvalidArgumentException - * @static - */ - public static function lazyByIdDesc($chunkSize = 1000, $column = null, $alias = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->lazyByIdDesc($chunkSize, $column, $alias); - } - - /** - * Execute the query and get the first result. - * - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Model|object|static|null - * @static - */ - public static function first($columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->first($columns); - } - - /** - * Execute the query and get the first result if it's the sole matching record. - * - * @param array|string $columns - * @return \Illuminate\Database\Eloquent\Model|object|static|null - * @throws \Illuminate\Database\RecordsNotFoundException - * @throws \Illuminate\Database\MultipleRecordsFoundException - * @static - */ - public static function baseSole($columns = []) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->baseSole($columns); - } - - /** - * Pass the query to a given callback. - * - * @param callable $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function tap($callback) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->tap($callback); - } - - /** - * Apply the callback if the given "value" is (or resolves to) truthy. - * - * @template TWhenParameter - * @template TWhenReturnType - * @param \Illuminate\Database\Eloquent\(\Closure($this): TWhenParameter)|TWhenParameter|null $value - * @param \Illuminate\Database\Eloquent\(callable($this, TWhenParameter): TWhenReturnType)|null $callback - * @param \Illuminate\Database\Eloquent\(callable($this, TWhenParameter): TWhenReturnType)|null $default - * @return $this|\Illuminate\Database\Eloquent\TWhenReturnType - * @static - */ - public static function when($value = null, $callback = null, $default = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->when($value, $callback, $default); - } - - /** - * Apply the callback if the given "value" is (or resolves to) falsy. - * - * @template TUnlessParameter - * @template TUnlessReturnType - * @param \Illuminate\Database\Eloquent\(\Closure($this): TUnlessParameter)|TUnlessParameter|null $value - * @param \Illuminate\Database\Eloquent\(callable($this, TUnlessParameter): TUnlessReturnType)|null $callback - * @param \Illuminate\Database\Eloquent\(callable($this, TUnlessParameter): TUnlessReturnType)|null $default - * @return $this|\Illuminate\Database\Eloquent\TUnlessReturnType - * @static - */ - public static function unless($value = null, $callback = null, $default = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->unless($value, $callback, $default); - } - - /** - * Add a relationship count / exists condition to the query. - * - * @param \Illuminate\Database\Eloquent\Relations\Relation|string $relation - * @param string $operator - * @param int $count - * @param string $boolean - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @throws \RuntimeException - * @static - */ - public static function has($relation, $operator = '>=', $count = 1, $boolean = 'and', $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->has($relation, $operator, $count, $boolean, $callback); - } - - /** - * Add a relationship count / exists condition to the query with an "or". - * - * @param string $relation - * @param string $operator - * @param int $count - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orHas($relation, $operator = '>=', $count = 1) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orHas($relation, $operator, $count); - } - - /** - * Add a relationship count / exists condition to the query. - * - * @param string $relation - * @param string $boolean - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function doesntHave($relation, $boolean = 'and', $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->doesntHave($relation, $boolean, $callback); - } - - /** - * Add a relationship count / exists condition to the query with an "or". - * - * @param string $relation - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orDoesntHave($relation) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orDoesntHave($relation); - } - - /** - * Add a relationship count / exists condition to the query with where clauses. - * - * @param string $relation - * @param \Closure|null $callback - * @param string $operator - * @param int $count - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereHas($relation, $callback = null, $operator = '>=', $count = 1) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereHas($relation, $callback, $operator, $count); - } - - /** - * Add a relationship count / exists condition to the query with where clauses. - * - * Also load the relationship with same condition. - * - * @param string $relation - * @param \Closure|null $callback - * @param string $operator - * @param int $count - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withWhereHas($relation, $callback = null, $operator = '>=', $count = 1) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withWhereHas($relation, $callback, $operator, $count); - } - - /** - * Add a relationship count / exists condition to the query with where clauses and an "or". - * - * @param string $relation - * @param \Closure|null $callback - * @param string $operator - * @param int $count - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhereHas($relation, $callback = null, $operator = '>=', $count = 1) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhereHas($relation, $callback, $operator, $count); - } - - /** - * Add a relationship count / exists condition to the query with where clauses. - * - * @param string $relation - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereDoesntHave($relation, $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereDoesntHave($relation, $callback); - } - - /** - * Add a relationship count / exists condition to the query with where clauses and an "or". - * - * @param string $relation - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhereDoesntHave($relation, $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhereDoesntHave($relation, $callback); - } - - /** - * Add a polymorphic relationship count / exists condition to the query. - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param string $operator - * @param int $count - * @param string $boolean - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function hasMorph($relation, $types, $operator = '>=', $count = 1, $boolean = 'and', $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->hasMorph($relation, $types, $operator, $count, $boolean, $callback); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with an "or". - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param string $operator - * @param int $count - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orHasMorph($relation, $types, $operator = '>=', $count = 1) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orHasMorph($relation, $types, $operator, $count); - } - - /** - * Add a polymorphic relationship count / exists condition to the query. - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param string $boolean - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function doesntHaveMorph($relation, $types, $boolean = 'and', $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->doesntHaveMorph($relation, $types, $boolean, $callback); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with an "or". - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orDoesntHaveMorph($relation, $types) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orDoesntHaveMorph($relation, $types); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with where clauses. - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param \Closure|null $callback - * @param string $operator - * @param int $count - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereHasMorph($relation, $types, $callback = null, $operator = '>=', $count = 1) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereHasMorph($relation, $types, $callback, $operator, $count); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with where clauses and an "or". - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param \Closure|null $callback - * @param string $operator - * @param int $count - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhereHasMorph($relation, $types, $callback = null, $operator = '>=', $count = 1) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhereHasMorph($relation, $types, $callback, $operator, $count); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with where clauses. - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereDoesntHaveMorph($relation, $types, $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereDoesntHaveMorph($relation, $types, $callback); - } - - /** - * Add a polymorphic relationship count / exists condition to the query with where clauses and an "or". - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param \Closure|null $callback - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhereDoesntHaveMorph($relation, $types, $callback = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhereDoesntHaveMorph($relation, $types, $callback); - } - - /** - * Add a basic where clause to a relationship query. - * - * @param string $relation - * @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereRelation($relation, $column, $operator = null, $value = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereRelation($relation, $column, $operator, $value); - } - - /** - * Add an "or where" clause to a relationship query. - * - * @param string $relation - * @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhereRelation($relation, $column, $operator = null, $value = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhereRelation($relation, $column, $operator, $value); - } - - /** - * Add a polymorphic relationship condition to the query with a where clause. - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereMorphRelation($relation, $types, $column, $operator = null, $value = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereMorphRelation($relation, $types, $column, $operator, $value); - } - - /** - * Add a polymorphic relationship condition to the query with an "or where" clause. - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param string|array $types - * @param \Closure|string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @param mixed $operator - * @param mixed $value - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhereMorphRelation($relation, $types, $column, $operator = null, $value = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhereMorphRelation($relation, $types, $column, $operator, $value); - } - - /** - * Add a morph-to relationship condition to the query. - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param \Illuminate\Database\Eloquent\Model|string|null $model - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereMorphedTo($relation, $model, $boolean = 'and') - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereMorphedTo($relation, $model, $boolean); - } - - /** - * Add a not morph-to relationship condition to the query. - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param \Illuminate\Database\Eloquent\Model|string $model - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function whereNotMorphedTo($relation, $model, $boolean = 'and') - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereNotMorphedTo($relation, $model, $boolean); - } - - /** - * Add a morph-to relationship condition to the query with an "or where" clause. - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param \Illuminate\Database\Eloquent\Model|string|null $model - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhereMorphedTo($relation, $model) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhereMorphedTo($relation, $model); - } - - /** - * Add a not morph-to relationship condition to the query with an "or where" clause. - * - * @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation - * @param \Illuminate\Database\Eloquent\Model|string $model - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function orWhereNotMorphedTo($relation, $model) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhereNotMorphedTo($relation, $model); - } - - /** - * Add a "belongs to" relationship where clause to the query. - * - * @param \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection<\Illuminate\Database\Eloquent\Model> $related - * @param string|null $relationshipName - * @param string $boolean - * @return \Illuminate\Database\Eloquent\Builder|static - * @throws \Illuminate\Database\Eloquent\RelationNotFoundException - * @static - */ - public static function whereBelongsTo($related, $relationshipName = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->whereBelongsTo($related, $relationshipName, $boolean); - } - - /** - * Add an "BelongsTo" relationship with an "or where" clause to the query. - * - * @param \Illuminate\Database\Eloquent\Model $related - * @param string|null $relationshipName - * @return \Illuminate\Database\Eloquent\Builder|static - * @throws \RuntimeException - * @static - */ - public static function orWhereBelongsTo($related, $relationshipName = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->orWhereBelongsTo($related, $relationshipName); - } - - /** - * Add subselect queries to include an aggregate value for a relationship. - * - * @param mixed $relations - * @param string $column - * @param string $function - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withAggregate($relations, $column, $function = null) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withAggregate($relations, $column, $function); - } - - /** - * Add subselect queries to count the relations. - * - * @param mixed $relations - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withCount($relations) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withCount($relations); - } - - /** - * Add subselect queries to include the max of the relation's column. - * - * @param string|array $relation - * @param string $column - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withMax($relation, $column) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withMax($relation, $column); - } - - /** - * Add subselect queries to include the min of the relation's column. - * - * @param string|array $relation - * @param string $column - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withMin($relation, $column) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withMin($relation, $column); - } - - /** - * Add subselect queries to include the sum of the relation's column. - * - * @param string|array $relation - * @param string $column - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withSum($relation, $column) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withSum($relation, $column); - } - - /** - * Add subselect queries to include the average of the relation's column. - * - * @param string|array $relation - * @param string $column - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withAvg($relation, $column) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withAvg($relation, $column); - } - - /** - * Add subselect queries to include the existence of related models. - * - * @param string|array $relation - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function withExists($relation) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->withExists($relation); - } - - /** - * Merge the where constraints from another query to the current query. - * - * @param \Illuminate\Database\Eloquent\Builder $from - * @return \Illuminate\Database\Eloquent\Builder|static - * @static - */ - public static function mergeConstraintsFrom($from) - { - /** @var \Illuminate\Database\Eloquent\Builder $instance */ - return $instance->mergeConstraintsFrom($from); - } - - /** - * Set the columns to be selected. - * - * @param array|mixed $columns - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function select($columns = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->select($columns); - } - - /** - * Add a subselect expression to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|string $query - * @param string $as - * @return \Illuminate\Database\Query\Builder - * @throws \InvalidArgumentException - * @static - */ - public static function selectSub($query, $as) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->selectSub($query, $as); - } - - /** - * Add a new "raw" select expression to the query. - * - * @param string $expression - * @param array $bindings - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function selectRaw($expression, $bindings = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->selectRaw($expression, $bindings); - } - - /** - * Makes "from" fetch from a subquery. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|string $query - * @param string $as - * @return \Illuminate\Database\Query\Builder - * @throws \InvalidArgumentException - * @static - */ - public static function fromSub($query, $as) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->fromSub($query, $as); - } - - /** - * Add a raw from clause to the query. - * - * @param string $expression - * @param mixed $bindings - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function fromRaw($expression, $bindings = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->fromRaw($expression, $bindings); - } - - /** - * Add a new select column to the query. - * - * @param array|mixed $column - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function addSelect($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->addSelect($column); - } - - /** - * Force the query to only return distinct results. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function distinct() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->distinct(); - } - - /** - * Set the table which the query is targeting. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|string $table - * @param string|null $as - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function from($table, $as = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->from($table, $as); - } - - /** - * Add an index hint to suggest a query index. - * - * @param string $index - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function useIndex($index) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->useIndex($index); - } - - /** - * Add an index hint to force a query index. - * - * @param string $index - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function forceIndex($index) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->forceIndex($index); - } - - /** - * Add an index hint to ignore a query index. - * - * @param string $index - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function ignoreIndex($index) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->ignoreIndex($index); - } - - /** - * Add a join clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @param \Closure|string $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @param string $type - * @param bool $where - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function join($table, $first, $operator = null, $second = null, $type = 'inner', $where = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->join($table, $first, $operator, $second, $type, $where); - } - - /** - * Add a "join where" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @param \Closure|string $first - * @param string $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string $second - * @param string $type - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function joinWhere($table, $first, $operator, $second, $type = 'inner') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->joinWhere($table, $first, $operator, $second, $type); - } - - /** - * Add a subquery join clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|string $query - * @param string $as - * @param \Closure|string $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @param string $type - * @param bool $where - * @return \Illuminate\Database\Query\Builder - * @throws \InvalidArgumentException - * @static - */ - public static function joinSub($query, $as, $first, $operator = null, $second = null, $type = 'inner', $where = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->joinSub($query, $as, $first, $operator, $second, $type, $where); - } - - /** - * Add a left join to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @param \Closure|string $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function leftJoin($table, $first, $operator = null, $second = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->leftJoin($table, $first, $operator, $second); - } - - /** - * Add a "join where" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @param \Closure|string $first - * @param string $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function leftJoinWhere($table, $first, $operator, $second) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->leftJoinWhere($table, $first, $operator, $second); - } - - /** - * Add a subquery left join to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|string $query - * @param string $as - * @param \Closure|string $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function leftJoinSub($query, $as, $first, $operator = null, $second = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->leftJoinSub($query, $as, $first, $operator, $second); - } - - /** - * Add a right join to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @param \Closure|string $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function rightJoin($table, $first, $operator = null, $second = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->rightJoin($table, $first, $operator, $second); - } - - /** - * Add a "right join where" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @param \Closure|string $first - * @param string $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string $second - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function rightJoinWhere($table, $first, $operator, $second) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->rightJoinWhere($table, $first, $operator, $second); - } - - /** - * Add a subquery right join to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|string $query - * @param string $as - * @param \Closure|string $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function rightJoinSub($query, $as, $first, $operator = null, $second = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->rightJoinSub($query, $as, $first, $operator, $second); - } - - /** - * Add a "cross join" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $table - * @param \Closure|string|null $first - * @param string|null $operator - * @param \Illuminate\Contracts\Database\Query\Expression|string|null $second - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function crossJoin($table, $first = null, $operator = null, $second = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->crossJoin($table, $first, $operator, $second); - } - - /** - * Add a subquery cross join to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|string $query - * @param string $as - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function crossJoinSub($query, $as) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->crossJoinSub($query, $as); - } - - /** - * Merge an array of where clauses and bindings. - * - * @param array $wheres - * @param array $bindings - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function mergeWheres($wheres, $bindings) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->mergeWheres($wheres, $bindings); - } - - /** - * Prepare the value and operator for a where clause. - * - * @param string $value - * @param string $operator - * @param bool $useDefault - * @return array - * @throws \InvalidArgumentException - * @static - */ - public static function prepareValueAndOperator($value, $operator, $useDefault = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->prepareValueAndOperator($value, $operator, $useDefault); - } - - /** - * Add a "where" clause comparing two columns to the query. - * - * @param string|array $first - * @param string|null $operator - * @param string|null $second - * @param string|null $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereColumn($first, $operator = null, $second = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereColumn($first, $operator, $second, $boolean); - } - - /** - * Add an "or where" clause comparing two columns to the query. - * - * @param string|array $first - * @param string|null $operator - * @param string|null $second - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereColumn($first, $operator = null, $second = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereColumn($first, $operator, $second); - } - - /** - * Add a raw where clause to the query. - * - * @param string $sql - * @param mixed $bindings - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereRaw($sql, $bindings = [], $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereRaw($sql, $bindings, $boolean); - } - - /** - * Add a raw or where clause to the query. - * - * @param string $sql - * @param mixed $bindings - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereRaw($sql, $bindings = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereRaw($sql, $bindings); - } - - /** - * Add a "where in" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param mixed $values - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereIn($column, $values, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereIn($column, $values, $boolean, $not); - } - - /** - * Add an "or where in" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param mixed $values - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereIn($column, $values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereIn($column, $values); - } - - /** - * Add a "where not in" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param mixed $values - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereNotIn($column, $values, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereNotIn($column, $values, $boolean); - } - - /** - * Add an "or where not in" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param mixed $values - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereNotIn($column, $values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereNotIn($column, $values); - } - - /** - * Add a "where in raw" clause for integer values to the query. - * - * @param string $column - * @param \Illuminate\Contracts\Support\Arrayable|array $values - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereIntegerInRaw($column, $values, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereIntegerInRaw($column, $values, $boolean, $not); - } - - /** - * Add an "or where in raw" clause for integer values to the query. - * - * @param string $column - * @param \Illuminate\Contracts\Support\Arrayable|array $values - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereIntegerInRaw($column, $values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereIntegerInRaw($column, $values); - } - - /** - * Add a "where not in raw" clause for integer values to the query. - * - * @param string $column - * @param \Illuminate\Contracts\Support\Arrayable|array $values - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereIntegerNotInRaw($column, $values, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereIntegerNotInRaw($column, $values, $boolean); - } - - /** - * Add an "or where not in raw" clause for integer values to the query. - * - * @param string $column - * @param \Illuminate\Contracts\Support\Arrayable|array $values - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereIntegerNotInRaw($column, $values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereIntegerNotInRaw($column, $values); - } - - /** - * Add a "where null" clause to the query. - * - * @param string|array|\Illuminate\Contracts\Database\Query\Expression $columns - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereNull($columns, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereNull($columns, $boolean, $not); - } - - /** - * Add an "or where null" clause to the query. - * - * @param string|array|\Illuminate\Contracts\Database\Query\Expression $column - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereNull($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereNull($column); - } - - /** - * Add a "where not null" clause to the query. - * - * @param string|array|\Illuminate\Contracts\Database\Query\Expression $columns - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereNotNull($columns, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereNotNull($columns, $boolean); - } - - /** - * Add a where between statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \Illuminate\Database\Query\iterable $values - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereBetween($column, $values, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereBetween($column, $values, $boolean, $not); - } - - /** - * Add a where between statement using columns to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param array $values - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereBetweenColumns($column, $values, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereBetweenColumns($column, $values, $boolean, $not); - } - - /** - * Add an or where between statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \Illuminate\Database\Query\iterable $values - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereBetween($column, $values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereBetween($column, $values); - } - - /** - * Add an or where between statement using columns to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param array $values - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereBetweenColumns($column, $values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereBetweenColumns($column, $values); - } - - /** - * Add a where not between statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \Illuminate\Database\Query\iterable $values - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereNotBetween($column, $values, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereNotBetween($column, $values, $boolean); - } - - /** - * Add a where not between statement using columns to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param array $values - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereNotBetweenColumns($column, $values, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereNotBetweenColumns($column, $values, $boolean); - } - - /** - * Add an or where not between statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \Illuminate\Database\Query\iterable $values - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereNotBetween($column, $values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereNotBetween($column, $values); - } - - /** - * Add an or where not between statement using columns to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param array $values - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereNotBetweenColumns($column, $values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereNotBetweenColumns($column, $values); - } - - /** - * Add an "or where not null" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereNotNull($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereNotNull($column); - } - - /** - * Add a "where date" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $operator - * @param \DateTimeInterface|string|null $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereDate($column, $operator, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereDate($column, $operator, $value, $boolean); - } - - /** - * Add an "or where date" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $operator - * @param \DateTimeInterface|string|null $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereDate($column, $operator, $value = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereDate($column, $operator, $value); - } - - /** - * Add a "where time" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $operator - * @param \DateTimeInterface|string|null $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereTime($column, $operator, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereTime($column, $operator, $value, $boolean); - } - - /** - * Add an "or where time" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $operator - * @param \DateTimeInterface|string|null $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereTime($column, $operator, $value = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereTime($column, $operator, $value); - } - - /** - * Add a "where day" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $operator - * @param \DateTimeInterface|string|int|null $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereDay($column, $operator, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereDay($column, $operator, $value, $boolean); - } - - /** - * Add an "or where day" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $operator - * @param \DateTimeInterface|string|int|null $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereDay($column, $operator, $value = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereDay($column, $operator, $value); - } - - /** - * Add a "where month" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $operator - * @param \DateTimeInterface|string|int|null $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereMonth($column, $operator, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereMonth($column, $operator, $value, $boolean); - } - - /** - * Add an "or where month" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $operator - * @param \DateTimeInterface|string|int|null $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereMonth($column, $operator, $value = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereMonth($column, $operator, $value); - } - - /** - * Add a "where year" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $operator - * @param \DateTimeInterface|string|int|null $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereYear($column, $operator, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereYear($column, $operator, $value, $boolean); - } - - /** - * Add an "or where year" statement to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $operator - * @param \DateTimeInterface|string|int|null $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereYear($column, $operator, $value = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereYear($column, $operator, $value); - } - - /** - * Add a nested where statement to the query. - * - * @param \Closure $callback - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereNested($callback, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereNested($callback, $boolean); - } - - /** - * Create a new query instance for nested where condition. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function forNestedWhere() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->forNestedWhere(); - } - - /** - * Add another query builder as a nested where to the query builder. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function addNestedWhereQuery($query, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->addNestedWhereQuery($query, $boolean); - } - - /** - * Add an exists clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder $callback - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereExists($callback, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereExists($callback, $boolean, $not); - } - - /** - * Add an or exists clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder $callback - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereExists($callback, $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereExists($callback, $not); - } - - /** - * Add a where not exists clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder $callback - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereNotExists($callback, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereNotExists($callback, $boolean); - } - - /** - * Add a where not exists clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder $callback - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereNotExists($callback) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereNotExists($callback); - } - - /** - * Add an exists clause to the query. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function addWhereExistsQuery($query, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->addWhereExistsQuery($query, $boolean, $not); - } - - /** - * Adds a where condition using row values. - * - * @param array $columns - * @param string $operator - * @param array $values - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @throws \InvalidArgumentException - * @static - */ - public static function whereRowValues($columns, $operator, $values, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereRowValues($columns, $operator, $values, $boolean); - } - - /** - * Adds an or where condition using row values. - * - * @param array $columns - * @param string $operator - * @param array $values - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereRowValues($columns, $operator, $values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereRowValues($columns, $operator, $values); - } - - /** - * Add a "where JSON contains" clause to the query. - * - * @param string $column - * @param mixed $value - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereJsonContains($column, $value, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereJsonContains($column, $value, $boolean, $not); - } - - /** - * Add an "or where JSON contains" clause to the query. - * - * @param string $column - * @param mixed $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereJsonContains($column, $value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereJsonContains($column, $value); - } - - /** - * Add a "where JSON not contains" clause to the query. - * - * @param string $column - * @param mixed $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereJsonDoesntContain($column, $value, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereJsonDoesntContain($column, $value, $boolean); - } - - /** - * Add an "or where JSON not contains" clause to the query. - * - * @param string $column - * @param mixed $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereJsonDoesntContain($column, $value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereJsonDoesntContain($column, $value); - } - - /** - * Add a clause that determines if a JSON path exists to the query. - * - * @param string $column - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereJsonContainsKey($column, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereJsonContainsKey($column, $boolean, $not); - } - - /** - * Add an "or" clause that determines if a JSON path exists to the query. - * - * @param string $column - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereJsonContainsKey($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereJsonContainsKey($column); - } - - /** - * Add a clause that determines if a JSON path does not exist to the query. - * - * @param string $column - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereJsonDoesntContainKey($column, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereJsonDoesntContainKey($column, $boolean); - } - - /** - * Add an "or" clause that determines if a JSON path does not exist to the query. - * - * @param string $column - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereJsonDoesntContainKey($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereJsonDoesntContainKey($column); - } - - /** - * Add a "where JSON length" clause to the query. - * - * @param string $column - * @param mixed $operator - * @param mixed $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereJsonLength($column, $operator, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereJsonLength($column, $operator, $value, $boolean); - } - - /** - * Add an "or where JSON length" clause to the query. - * - * @param string $column - * @param mixed $operator - * @param mixed $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereJsonLength($column, $operator, $value = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereJsonLength($column, $operator, $value); - } - - /** - * Handles dynamic "where" clauses to the query. - * - * @param string $method - * @param array $parameters - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function dynamicWhere($method, $parameters) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->dynamicWhere($method, $parameters); - } - - /** - * Add a "where fulltext" clause to the query. - * - * @param string|string[] $columns - * @param string $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function whereFullText($columns, $value, $options = [], $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->whereFullText($columns, $value, $options, $boolean); - } - - /** - * Add a "or where fulltext" clause to the query. - * - * @param string|string[] $columns - * @param string $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orWhereFullText($columns, $value, $options = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orWhereFullText($columns, $value, $options); - } - - /** - * Add a "group by" clause to the query. - * - * @param array|\Illuminate\Contracts\Database\Query\Expression|string $groups - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function groupBy(...$groups) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->groupBy(...$groups); - } - - /** - * Add a raw groupBy clause to the query. - * - * @param string $sql - * @param array $bindings - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function groupByRaw($sql, $bindings = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->groupByRaw($sql, $bindings); - } - - /** - * Add a "having" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|\Closure|string $column - * @param string|int|float|null $operator - * @param string|int|float|null $value - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function having($column, $operator = null, $value = null, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->having($column, $operator, $value, $boolean); - } - - /** - * Add an "or having" clause to the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|\Closure|string $column - * @param string|int|float|null $operator - * @param string|int|float|null $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orHaving($column, $operator = null, $value = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orHaving($column, $operator, $value); - } - - /** - * Add a nested having statement to the query. - * - * @param \Closure $callback - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function havingNested($callback, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->havingNested($callback, $boolean); - } - - /** - * Add another query builder as a nested having to the query builder. - * - * @param \Illuminate\Database\Query\Builder $query - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function addNestedHavingQuery($query, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->addNestedHavingQuery($query, $boolean); - } - - /** - * Add a "having null" clause to the query. - * - * @param string|array $columns - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function havingNull($columns, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->havingNull($columns, $boolean, $not); - } - - /** - * Add an "or having null" clause to the query. - * - * @param string $column - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orHavingNull($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orHavingNull($column); - } - - /** - * Add a "having not null" clause to the query. - * - * @param string|array $columns - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function havingNotNull($columns, $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->havingNotNull($columns, $boolean); - } - - /** - * Add an "or having not null" clause to the query. - * - * @param string $column - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orHavingNotNull($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orHavingNotNull($column); - } - - /** - * Add a "having between " clause to the query. - * - * @param string $column - * @param \Illuminate\Database\Query\iterable $values - * @param string $boolean - * @param bool $not - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function havingBetween($column, $values, $boolean = 'and', $not = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->havingBetween($column, $values, $boolean, $not); - } - - /** - * Add a raw having clause to the query. - * - * @param string $sql - * @param array $bindings - * @param string $boolean - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function havingRaw($sql, $bindings = [], $boolean = 'and') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->havingRaw($sql, $bindings, $boolean); - } - - /** - * Add a raw or having clause to the query. - * - * @param string $sql - * @param array $bindings - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orHavingRaw($sql, $bindings = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orHavingRaw($sql, $bindings); - } - - /** - * Add an "order by" clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|\Illuminate\Contracts\Database\Query\Expression|string $column - * @param string $direction - * @return \Illuminate\Database\Query\Builder - * @throws \InvalidArgumentException - * @static - */ - public static function orderBy($column, $direction = 'asc') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orderBy($column, $direction); - } - - /** - * Add a descending "order by" clause to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|\Illuminate\Contracts\Database\Query\Expression|string $column - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orderByDesc($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orderByDesc($column); - } - - /** - * Put the query's results in random order. - * - * @param string|int $seed - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function inRandomOrder($seed = '') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->inRandomOrder($seed); - } - - /** - * Add a raw "order by" clause to the query. - * - * @param string $sql - * @param array $bindings - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function orderByRaw($sql, $bindings = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->orderByRaw($sql, $bindings); - } - - /** - * Alias to set the "offset" value of the query. - * - * @param int $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function skip($value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->skip($value); - } - - /** - * Set the "offset" value of the query. - * - * @param int $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function offset($value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->offset($value); - } - - /** - * Alias to set the "limit" value of the query. - * - * @param int $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function take($value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->take($value); - } - - /** - * Set the "limit" value of the query. - * - * @param int $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function limit($value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->limit($value); - } - - /** - * Set the limit and offset for a given page. - * - * @param int $page - * @param int $perPage - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function forPage($page, $perPage = 15) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->forPage($page, $perPage); - } - - /** - * Constrain the query to the previous "page" of results before a given ID. - * - * @param int $perPage - * @param int|null $lastId - * @param string $column - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function forPageBeforeId($perPage = 15, $lastId = 0, $column = 'id') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->forPageBeforeId($perPage, $lastId, $column); - } - - /** - * Constrain the query to the next "page" of results after a given ID. - * - * @param int $perPage - * @param int|null $lastId - * @param string $column - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function forPageAfterId($perPage = 15, $lastId = 0, $column = 'id') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->forPageAfterId($perPage, $lastId, $column); - } - - /** - * Remove all existing orders and optionally add a new order. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Contracts\Database\Query\Expression|string|null $column - * @param string $direction - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function reorder($column = null, $direction = 'asc') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->reorder($column, $direction); - } - - /** - * Add a union statement to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder $query - * @param bool $all - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function union($query, $all = false) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->union($query, $all); - } - - /** - * Add a union all statement to the query. - * - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder $query - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function unionAll($query) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->unionAll($query); - } - - /** - * Lock the selected rows in the table. - * - * @param string|bool $value - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function lock($value = true) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->lock($value); - } - - /** - * Lock the selected rows in the table for updating. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function lockForUpdate() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->lockForUpdate(); - } - - /** - * Share lock the selected rows in the table. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function sharedLock() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->sharedLock(); - } - - /** - * Register a closure to be invoked before the query is executed. - * - * @param callable $callback - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function beforeQuery($callback) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->beforeQuery($callback); - } - - /** - * Invoke the "before query" modification callbacks. - * - * @return void - * @static - */ - public static function applyBeforeQueryCallbacks() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - $instance->applyBeforeQueryCallbacks(); - } - - /** - * Get the SQL representation of the query. - * - * @return string - * @static - */ - public static function toSql() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->toSql(); - } - - /** - * Get the raw SQL representation of the query with embedded bindings. - * - * @return string - * @static - */ - public static function toRawSql() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->toRawSql(); - } - - /** - * Get a single expression value from the first result of a query. - * - * @param string $expression - * @param array $bindings - * @return mixed - * @static - */ - public static function rawValue($expression, $bindings = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->rawValue($expression, $bindings); - } - - /** - * Get the count of the total records for the paginator. - * - * @param array $columns - * @return int - * @static - */ - public static function getCountForPagination($columns = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->getCountForPagination($columns); - } - - /** - * Concatenate values of a given column as a string. - * - * @param string $column - * @param string $glue - * @return string - * @static - */ - public static function implode($column, $glue = '') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->implode($column, $glue); - } - - /** - * Determine if any rows exist for the current query. - * - * @return bool - * @static - */ - public static function exists() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->exists(); - } - - /** - * Determine if no rows exist for the current query. - * - * @return bool - * @static - */ - public static function doesntExist() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->doesntExist(); - } - - /** - * Execute the given callback if no rows exist for the current query. - * - * @param \Closure $callback - * @return mixed - * @static - */ - public static function existsOr($callback) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->existsOr($callback); - } - - /** - * Execute the given callback if rows exist for the current query. - * - * @param \Closure $callback - * @return mixed - * @static - */ - public static function doesntExistOr($callback) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->doesntExistOr($callback); - } - - /** - * Retrieve the "count" result of the query. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $columns - * @return int - * @static - */ - public static function count($columns = '*') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->count($columns); - } - - /** - * Retrieve the minimum value of a given column. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return mixed - * @static - */ - public static function min($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->min($column); - } - - /** - * Retrieve the maximum value of a given column. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return mixed - * @static - */ - public static function max($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->max($column); - } - - /** - * Retrieve the sum of the values of a given column. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return mixed - * @static - */ - public static function sum($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->sum($column); - } - - /** - * Retrieve the average of the values of a given column. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return mixed - * @static - */ - public static function avg($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->avg($column); - } - - /** - * Alias for the "avg" method. - * - * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @return mixed - * @static - */ - public static function average($column) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->average($column); - } - - /** - * Execute an aggregate function on the database. - * - * @param string $function - * @param array $columns - * @return mixed - * @static - */ - public static function aggregate($function, $columns = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->aggregate($function, $columns); - } - - /** - * Execute a numeric aggregate function on the database. - * - * @param string $function - * @param array $columns - * @return float|int - * @static - */ - public static function numericAggregate($function, $columns = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->numericAggregate($function, $columns); - } - - /** - * Insert new records into the database. - * - * @param array $values - * @return bool - * @static - */ - public static function insert($values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->insert($values); - } - - /** - * Insert new records into the database while ignoring errors. - * - * @param array $values - * @return int - * @static - */ - public static function insertOrIgnore($values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->insertOrIgnore($values); - } - - /** - * Insert a new record and get the value of the primary key. - * - * @param array $values - * @param string|null $sequence - * @return int - * @static - */ - public static function insertGetId($values, $sequence = null) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->insertGetId($values, $sequence); - } - - /** - * Insert new records into the table using a subquery. - * - * @param array $columns - * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|string $query - * @return int - * @static - */ - public static function insertUsing($columns, $query) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->insertUsing($columns, $query); - } - - /** - * Update records in a PostgreSQL database using the update from syntax. - * - * @param array $values - * @return int - * @static - */ - public static function updateFrom($values) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->updateFrom($values); - } - - /** - * Insert or update a record matching the attributes, and fill it with values. - * - * @param array $attributes - * @param array $values - * @return bool - * @static - */ - public static function updateOrInsert($attributes, $values = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->updateOrInsert($attributes, $values); - } - - /** - * Increment the given column's values by the given amounts. - * - * @param array $columns - * @param array $extra - * @return int - * @throws \InvalidArgumentException - * @static - */ - public static function incrementEach($columns, $extra = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->incrementEach($columns, $extra); - } - - /** - * Decrement the given column's values by the given amounts. - * - * @param array $columns - * @param array $extra - * @return int - * @throws \InvalidArgumentException - * @static - */ - public static function decrementEach($columns, $extra = []) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->decrementEach($columns, $extra); - } - - /** - * Run a truncate statement on the table. - * - * @return void - * @static - */ - public static function truncate() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - $instance->truncate(); - } - - /** - * Get all of the query builder's columns in a text-only array with all expressions evaluated. - * - * @return array - * @static - */ - public static function getColumns() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->getColumns(); - } - - /** - * Create a raw database expression. - * - * @param mixed $value - * @return \Illuminate\Contracts\Database\Query\Expression - * @static - */ - public static function raw($value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->raw($value); - } - - /** - * Get the current query value bindings in a flattened array. - * - * @return array - * @static - */ - public static function getBindings() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->getBindings(); - } - - /** - * Get the raw array of bindings. - * - * @return array - * @static - */ - public static function getRawBindings() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->getRawBindings(); - } - - /** - * Set the bindings on the query builder. - * - * @param array $bindings - * @param string $type - * @return \Illuminate\Database\Query\Builder - * @throws \InvalidArgumentException - * @static - */ - public static function setBindings($bindings, $type = 'where') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->setBindings($bindings, $type); - } - - /** - * Add a binding to the query. - * - * @param mixed $value - * @param string $type - * @return \Illuminate\Database\Query\Builder - * @throws \InvalidArgumentException - * @static - */ - public static function addBinding($value, $type = 'where') - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->addBinding($value, $type); - } - - /** - * Cast the given binding value. - * - * @param mixed $value - * @return mixed - * @static - */ - public static function castBinding($value) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->castBinding($value); - } - - /** - * Merge an array of bindings into our bindings. - * - * @param \Illuminate\Database\Query\Builder $query - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function mergeBindings($query) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->mergeBindings($query); - } - - /** - * Remove all of the expressions from a list of bindings. - * - * @param array $bindings - * @return array - * @static - */ - public static function cleanBindings($bindings) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->cleanBindings($bindings); - } - - /** - * Get the database query processor instance. - * - * @return \Illuminate\Database\Query\Processors\Processor - * @static - */ - public static function getProcessor() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->getProcessor(); - } - - /** - * Get the query grammar instance. - * - * @return \Illuminate\Database\Query\Grammars\Grammar - * @static - */ - public static function getGrammar() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->getGrammar(); - } - - /** - * Use the "write" PDO connection when executing the query. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function useWritePdo() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->useWritePdo(); - } - - /** - * Clone the query without the given properties. - * - * @param array $properties - * @return static - * @static - */ - public static function cloneWithout($properties) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->cloneWithout($properties); - } - - /** - * Clone the query without the given bindings. - * - * @param array $except - * @return static - * @static - */ - public static function cloneWithoutBindings($except) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->cloneWithoutBindings($except); - } - - /** - * Dump the current SQL and bindings. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function dump() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->dump(); - } - - /** - * Dump the raw current SQL with embedded bindings. - * - * @return \Illuminate\Database\Query\Builder - * @static - */ - public static function dumpRawSql() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->dumpRawSql(); - } - - /** - * Die and dump the current SQL and bindings. - * - * @return \Illuminate\Database\Query\never - * @static - */ - public static function dd() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->dd(); - } - - /** - * Die and dump the current SQL with embedded bindings. - * - * @return \Illuminate\Database\Query\never - * @static - */ - public static function ddRawSql() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->ddRawSql(); - } - - /** - * Explains the query. - * - * @return \Illuminate\Support\Collection - * @static - */ - public static function explain() - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->explain(); - } - - /** - * Register a custom macro. - * - * @param string $name - * @param object|callable $macro - * @return void - * @static - */ - public static function macro($name, $macro) - { - \Illuminate\Database\Query\Builder::macro($name, $macro); - } - - /** - * Mix another object into the class. - * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException - * @static - */ - public static function mixin($mixin, $replace = true) - { - \Illuminate\Database\Query\Builder::mixin($mixin, $replace); - } - - /** - * Flush the existing macros. - * - * @return void - * @static - */ - public static function flushMacros() - { - \Illuminate\Database\Query\Builder::flushMacros(); - } - - /** - * Dynamically handle calls to the class. - * - * @param string $method - * @param array $parameters - * @return mixed - * @throws \BadMethodCallException - * @static - */ - public static function macroCall($method, $parameters) - { - /** @var \Illuminate\Database\Query\Builder $instance */ - return $instance->macroCall($method, $parameters); - } - } - class Event extends \Illuminate\Support\Facades\Event {} - class File extends \Illuminate\Support\Facades\File {} - class Gate extends \Illuminate\Support\Facades\Gate {} - class Hash extends \Illuminate\Support\Facades\Hash {} - class Http extends \Illuminate\Support\Facades\Http {} - class Js extends \Illuminate\Support\Js {} - class Lang extends \Illuminate\Support\Facades\Lang {} - class Log extends \Illuminate\Support\Facades\Log {} - class Mail extends \Illuminate\Support\Facades\Mail {} - class Notification extends \Illuminate\Support\Facades\Notification {} - class Password extends \Illuminate\Support\Facades\Password {} - class Process extends \Illuminate\Support\Facades\Process {} - class Queue extends \Illuminate\Support\Facades\Queue {} - class RateLimiter extends \Illuminate\Support\Facades\RateLimiter {} - class Redirect extends \Illuminate\Support\Facades\Redirect {} - class Request extends \Illuminate\Support\Facades\Request {} - class Response extends \Illuminate\Support\Facades\Response {} - class Route extends \Illuminate\Support\Facades\Route {} - class Schema extends \Illuminate\Support\Facades\Schema {} - class Session extends \Illuminate\Support\Facades\Session {} - class Storage extends \Illuminate\Support\Facades\Storage {} - class Str extends \Illuminate\Support\Str {} - class URL extends \Illuminate\Support\Facades\URL {} - class Validator extends \Illuminate\Support\Facades\Validator {} - class View extends \Illuminate\Support\Facades\View {} - class Vite extends \Illuminate\Support\Facades\Vite {} - class ImageIntervention extends \Intervention\Image\Facades\Image {} - class Image extends \Intervention\Image\Facades\Image {} - class Clockwork extends \Clockwork\Support\Laravel\Facade {} - class Flare extends \Spatie\LaravelIgnition\Facades\Flare {} - -} - - - - diff --git a/app/Conductors/AnalyticsConductor.php b/app/Conductors/AnalyticsConductor.php deleted file mode 100644 index 302d364..0000000 --- a/app/Conductors/AnalyticsConductor.php +++ /dev/null @@ -1,71 +0,0 @@ -user(); - return ($user !== null && $user->hasPermission('admin/analytics') === true); - } - - /** - * Return if the current model is creatable. - * - * @return boolean Allow creating model. - */ - public static function creatable(): bool - { - return true; - } - - /** - * Return if the current model is updatable. - * - * @param Model $model The model. - * @return boolean Allow updating model. - */ - public static function updatable(Model $model): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - return ($user !== null && $user->hasPermission('admin/analytics') === true); - } - - /** - * Return if the current model is destroyable. - * - * @param Model $model The model. - * @return boolean Allow deleting model. - */ - public static function destroyable(Model $model): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - return ($user !== null && $user->hasPermission('admin/analytics') === true); - } -} diff --git a/app/Conductors/ArticleConductor.php b/app/Conductors/ArticleConductor.php deleted file mode 100644 index 4814a3e..0000000 --- a/app/Conductors/ArticleConductor.php +++ /dev/null @@ -1,181 +0,0 @@ -user(); - if ($user === null || $user->hasPermission('admin/articles') === false) { - $builder - ->where('publish_at', '<=', now()); - } - } - - /** - * Return if the current model is visible. - * - * @param Model $model The model. - * @return boolean Allow model to be visible. - */ - public static function viewable(Model $model): bool - { - if (Carbon::parse($model->publish_at)->isFuture() === true) { - /** @var \App\Models\User */ - $user = auth()->user(); - if ($user === null || $user->hasPermission('admin/articles') === false) { - return false; - } - } - - return true; - } - - /** - * Return if the current model is creatable. - * - * @return boolean Allow creating model. - */ - public static function creatable(): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - return ($user !== null && $user->hasPermission('admin/articles') === true); - } - - /** - * Return if the current model is updatable. - * - * @param Model $model The model. - * @return boolean Allow updating model. - */ - public static function updatable(Model $model): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - return ($user !== null && $user->hasPermission('admin/articles') === true); - } - - /** - * Return if the current model is destroyable. - * - * @param Model $model The model. - * @return boolean Allow deleting model. - */ - public static function destroyable(Model $model): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - return ($user !== null && $user->hasPermission('admin/articles') === true); - } - - /** - * Transform the final model data - * - * @param array $data The model data to transform. - * @return array The transformed model. - */ - public function transformFinal(array $data): array - { - unset($data['user_id']); - return $data; - } - - /** - * Include Attachments Field. - * - * @param Model $model Them model. - * @return mixed The model result. - */ - public function includeAttachments(Model $model) - { - return $model->getAttachments()->map(function ($attachment) { - return MediaConductor::includeModel(request(), 'attachments', $attachment->media); - }); - } - - /** - * Include Gallery Field. - * - * @param Model $model Them model. - * @return mixed The model result. - */ - public function includeGallery(Model $model) - { - return $model->getGallery()->map(function ($item) { - return MediaConductor::includeModel(request(), 'gallery', $item->media); - }); - } - - /** - * Include User Field. - * - * @param Model $model Them model. - * @return mixed The model result. - */ - public function includeUser(Model $model) - { - $cacheKey = "user:{$model['user_id']}"; - $user = Cache::remember($cacheKey, now()->addDays(28), function () use ($model) { - return User::find($model['user_id']); - }); - - return UserConductor::includeModel(request(), 'user', $user); - } - - /** - * Transform the Hero field. - * - * @param mixed $value The current value. - * @return array|null The new value. - */ - public function transformHero(mixed $value): array|null - { - $cacheKey = "media:{$value}"; - $media = Cache::remember($cacheKey, now()->addDays(28), function () use ($value) { - return Media::find($value); - }); - - return MediaConductor::includeModel(request(), 'hero', $media); - } -} diff --git a/app/Conductors/Conductor.php b/app/Conductors/Conductor.php deleted file mode 100644 index 5ed9823..0000000 --- a/app/Conductors/Conductor.php +++ /dev/null @@ -1,1055 +0,0 @@ -all(); - if ($limitFields !== null) { - $filterFields = array_intersect_key($filterFields, array_flip($limitFields)); - } - $filterFields += $this->defaultFilters; - - foreach ($filterFields as $field => $value) { - if ( - is_array($limitFields) === false || - in_array(strtolower($field), array_map('strtolower', $limitFields)) !== false - ) { - $value = trim($value); - $operator = ''; - $join = 'AND'; - - // Check if value has a operator and remove it if it's a number - if (preg_match('/^(!?=|[<>]=?|<>|!|\|)([^=!<>].*)*$/', $value, $matches) > 0) { - $operator = $matches[1]; - $value = ($matches[2] ?? ''); - } - - if (strlen($value) === 0 && ($operator !== '==' && $operator !== '!=')) { - continue; - } - - switch ($operator) { - case '=': - $operator = '=='; - break; - case '!': - $operator = 'NOT LIKE'; - $value = "%{$value}%"; - break; - case '>': - case '<': - case '|': - $separatorPos = strpos($value, '|'); - if ($separatorPos !== false) { - $operator = '=='; - $valueList = explode('|', $value); - foreach ($valueList as $valueItem) { - $this->appendFilter($field, $operator, $valueItem, 'OR'); - } - continue 2; - } - break; - case '>=': - case '<=': - case '!=': - break; - case '<>': - $operator = '!='; - break; - default: - $operator = 'LIKE'; - $value = "%{$value}%"; - break; - }//end switch - - $this->appendFilter($field, $operator, $value, $join); - }//end if - }//end foreach - if ($request->has('filter') === true) { - $this->appendFilterString($request->input('filter', ''), $limitFields); - } - - $this->applyFilters(); - } - - /** - * Apple the filter array to the collection. - * - * @return void - */ - final public function applyFilters(): void - { - $parseFunc = function ($filterArray, $query) use (&$parseFunc) { - $item = null; - $result = null; - $join = 'AND'; - - $relationFilter = []; - - $buildWhereFunc = function ($query, $field, $operator, $value, $join) { - if ($join === 'OR') { - if ($operator === '<>') { - $separatorPos = strpos($value, '|'); - if ($separatorPos !== false) { - $query->orWhereBetween( - $field, - [substr($value, 0, $separatorPos), substr($value, ($separatorPos + 1))] - ); - } else { - $query->orWhere($field, '!=', $value); - } - } else { - $query->orWhere($field, $operator, $value); - } - } else { - if ($operator === '<>') { - $separatorPos = strpos($value, '|'); - if ($separatorPos !== false) { - $query->whereBetween( - $field, - [substr($value, 0, $separatorPos), substr($value, ($separatorPos + 1))] - ); - } else { - $query->where($field, '!=', $value); - } - } else { - $query->where($field, $operator, $value); - } - }//end if - }; - - if (gettype($query) === 'array') { - $item = $query; - } - - foreach ($filterArray as $condition) { - $currentResult = false; - - if (is_array($condition) === true) { - if (isset($condition[0]) === true && is_array($condition[0]) === true) { - if ($item !== null) { - $currentResult = $parseFunc($condition, $item); - } else { - if ($join === 'OR') { - $query->orWhere(function ($subQuery) use ($parseFunc, $condition) { - $parseFunc($condition, $subQuery); - }); - } else { - $query->where(function ($subQuery) use ($parseFunc, $condition) { - $parseFunc($condition, $subQuery); - }); - } - } - } else { - if (count($condition) < 3 && $condition[0] !== '') { - if (count($condition) < 2) { - $condition[1] = 'LIKE'; - } - $condition[2] = '%'; - } - - if (count($condition) === 3) { - list($field, $operator, $value) = $condition; - - if ($item !== null) { - if (array_key_exists($field, $item) === true) { - switch ($operator) { - case '==': - $currentResult = ($item[$field] == $value); - break; - case 'NOT LIKE': - $currentResult = (stripos($item[$field], substr($value, 1, -1)) === false); - break; - case '>': - $currentResult = ($item[$field] > $value); - break; - case '<': - $currentResult = ($item[$field] < $value); - break; - case '>=': - $currentResult = ($item[$field] >= $value); - break; - case '<=': - $currentResult = ($item[$field] <= $value); - break; - case '!=': - $currentResult = ($item[$field] != $value); - break; - case '<>': - $separatorPos = strpos($value, '|'); - if ($separatorPos !== false) { - $fieldInt = intval($item[$field]); - $currentResult = ( - $fieldInt > intVal( - substr($value, 0, $separatorPos) - ) && $fieldInt < intVal(substr($value, ($separatorPos + 1)))); - } else { - $currentResult = ($item[$field] != $value); - } - break; - case 'LIKE': - $currentResult = (stripos($item[$field], substr($value, 1, -1)) !== false); - break; - }//end switch - }//end if - } else { - if ($operator === '==') { - $operator = '='; - } - - $relationSplit = strpos($field, '.'); - if ($relationSplit !== false) { - $relation = substr($field, 0, $relationSplit); - $field = substr($field, ($relationSplit + 1)); - - if (method_exists($this->class, $relation) === true) { - $relationFilter[$relation][] = [$field, $operator, $value, $join]; - } - } else { - $buildWhereFunc($query, $field, $operator, $value, $join); - } - }//end if - }//end if - }//end if - - if ($item !== null) { - if ($result === null) { - $result = $currentResult; - } else { - if ($join === 'OR') { - $result = $result || $currentResult; - } else { - $result = $result && $currentResult; - } - } - } - - $join = 'OR'; - } else { - $join = $condition; - }//end if - }//end foreach - - foreach ($relationFilter as $relation => $conditions) { - $query->whereHas($relation, function ($subQuery) use ($buildWhereFunc, $conditions) { - foreach ($conditions as $condition) { - $buildWhereFunc($subQuery, $condition[0], $condition[1], $condition[2], $condition[3]); - } - }); - } - - return $result; - }; - - $filterArray = $this->filterArray; - if (count($filterArray) === 0) { - $filterArray = $this->defaultFilters; - } - if (count($filterArray) !== 0) { - if ($this->collection !== null) { - $this->collection = $this->collection->filter(function ($item) use ($parseFunc) { - return $parseFunc($this->filterArray, $item); - }); - } else { - $parseFunc($this->filterArray, $this->query); - } - } - } - - /** - * Run the conductor on a Request to generate a collection and total. - * - * @param Request $request The request data. - * @return array The processed and transformed collection | the total rows found. - */ - final public static function request(Request $request): array - { - $conductor_class = get_called_class(); - $conductor = new $conductor_class(); - - $total = 0; - - try { - $conductor->query = $conductor->class::query(); - } catch (\Throwable $e) { - throw new \Exception('Failed to create query builder instance for ' . $conductor->class . '.', 0, $e); - } - - // Filter request - $limitFields = $conductor->fields(new $conductor->class()); - if (is_array($limitFields) === false) { - $limitFields = []; - } - $conductor->filter($request, $limitFields); - - // After Scope query - $conductor->query->where(function ($query) use ($conductor) { - $conductor->scope($query); - }); - - // Sort request - $sort = $request->input('sort', $conductor->sort); - if (strlen($sort) === 0) { - if (strlen($conductor->sort) > 0) { - $conductor->sort($conductor->sort); - } - } else { - $conductor->sort($sort); - } - - // Get total - $total = $conductor->count(); - - // Paginate - $conductor->paginate($request->input('page', 1), $request->input('limit', -1), $request->input('offset', 0)); - - // Filter request - $fields = $conductor->fields(new $conductor->class()); - if (is_array($fields) === false) { - $fields = []; - } - - // Limit fields - $limitFields = array_map(function ($field) { - if (strpos($field, '.') !== false) { - return substr($field, 0, strpos($field, '.')); - } - return $field; - }, explode(',', $request->input('fields', ''))); - if ($limitFields === null) { - $limitFields = $fields; - } else { - $limitFields = array_intersect($limitFields, $fields); - } - $conductor->limitFields($limitFields); - $conductor->collection = $conductor->query->get(); - - // Transform and Includes - $includes = $conductor->includes; - if (count($limitFields) > 0) { - $includes = array_intersect($limitFields, $conductor->includes); - } - - $conductor->collection = $conductor->collection->map( - function ($model) use ($conductor, $includes, $limitFields) { - $conductor->applyIncludes($model, $includes); - - if (count($limitFields) > 0) { - $model->setAppends(array_intersect($model->getAppends(), $limitFields)); - } - - $model = $conductor->transformModel($model); - - return $model; - } - ); - - return [$conductor->collection, $total]; - } - - /** - * Run the conductor on a collection with the data stored in a Request. - * - * @param Request $request The request data. - * @param Collection $collection The collection. - * @return array The processed and transformed model data. - */ - final public static function collection(Request $request, Collection $collection): array - { - $conductor_class = get_called_class(); - $conductor = new $conductor_class(); - - $conductor->collection = collect(); - - foreach ($collection as $item) { - if ($conductor->viewable($item) === true) { - $conductor->collection->push($conductor->transformModel($item)); - } - } - - // Filter request - $limitFields = $conductor->fields(new $conductor->class()); - if (is_array($limitFields) === false) { - $limitFields = []; - } - $conductor->filter($request, $limitFields); - - // Get total - $total = $conductor->collection->count(); - - // Sort request - $sort = $request->input('sort', $conductor->sort); - if (strlen($sort) === 0) { - if (strlen($conductor->sort) > 0) { - $conductor->sort($sort); - } - } else { - $conductor->sort($sort); - } - - // Paginate - $conductor->paginate($request->input('page', 1), $request->input('limit', -1), $request->input('offset', 0)); - - - return [$conductor->collection, $total]; - } - - /** - * Filter a custom query on a user request. - * - * @param Builder $query The custom query. - * @param Request $request The request. - * @param array|null $limitFields Limit the request to these fields. - * @return Builder - */ - public static function filterQuery(Builder $query, Request $request, array|null $limitFields = null): Builder - { - $conductor_class = get_called_class(); - $conductor = new $conductor_class(); - - $conductor->query = $query; - $conductor->filter($request, $limitFields); - - return $conductor->query; - } - - - /** - * Run the conductor on a Model with the data stored in a Request. - * - * @param Request $request The request data. - * @param string $key The key prefix to use. - * @param Model|null $model The model. - * @return array|null The processed and transformed model data. - */ - final public static function includeModel(Request $request, string $key, mixed $model): array|null - { - $fields = []; - - if ($request !== null && $request->has('fields') === true) { - $requestFields = $request->input('fields'); - if ($requestFields !== null) { - $requestFields = explode(',', $requestFields); - if (in_array($key, $requestFields) === false) { - foreach ($requestFields as $field) { - if (strpos($field, $key . '.') === 0) { - $fields[] = substr($field, (strlen($key) + 1)); - } - } - } - } - } - - return static::model($fields, $model); - } - - /** - * Run the conductor on a Model with the data stored in a Request. - * - * @param mixed $fields The fields to show. - * @param Model|null $model The model. - * @return array|null The processed and transformed model data. - */ - final public static function model(mixed $fields, mixed $model): array|null - { - if ($model === null) { - return null; - } - - $conductor_class = get_called_class(); - $conductor = new $conductor_class(); - - $requestIncludes = []; - $modelFields = $conductor->fields(new $conductor->class()); - - // Limit fields - $limitFields = $modelFields; - if ($fields instanceof Request) { - if ($fields !== null && $fields->has('fields') === true) { - $requestFields = $fields->input('fields'); - if ($requestFields !== null) { - $limitFields = array_intersect(explode(',', $requestFields), $modelFields); - } - } - } elseif (is_array($fields) === true && count($fields) > 0) { - $limitFields = array_intersect($fields, $modelFields); - } - - if (empty($limitFields) === false) { - $modelAppends = $model->getAppends(); - - foreach (array_diff($modelFields, $limitFields) as $attribute) { - $key = array_search($attribute, $modelAppends); - if ($key !== false) { - unset($modelAppends[$key]); - } else { - unset($model[$attribute]); - } - } - $model->setAppends($modelAppends); - } - - // Includes - $includes = array_intersect($limitFields, $conductor->includes); - $conductor->applyIncludes($model, $includes); - - // Transform - $model = $conductor->transformModel($model); - - return $model; - } - - /** - * Return the current conductor collection count. - * - * @return integer The current collection count. - */ - final public function count(): int - { - if ($this->query !== null) { - return $this->query->count(); - } - - return 0; - } - - /** - * Sort the conductor collection. - * - * @param mixed $fields A field name or array of field names to sort. Supports prefix of +/- to change direction. - * @return void - */ - final public function sort(mixed $fields = null): void - { - $collectionSort = []; - - if (is_string($fields) === true) { - $fields = explode(',', $fields); - } elseif ($fields === null) { - $fields = $this->sort; - } - - if (is_array($fields) === true) { - foreach ($fields as $orderByField) { - $direction = 'asc'; - $directionChar = substr($orderByField, 0, 1); - - if (in_array($directionChar, ['-', '+']) === true) { - $orderByField = substr($orderByField, 1); - if ($directionChar === '-') { - $direction = 'desc'; - } - } - - if ($this->collection !== null) { - $collectionSort[] = [trim($orderByField), $direction]; - } else { - $this->query->orderBy(trim($orderByField), $direction); - } - } - } else { - throw new \InvalidArgumentException('Expected string or array, got ' . gettype($fields)); - }//end if - - if ($this->collection !== null) { - $this->collection = $this->collection->sortBy($collectionSort)->values(); - } - } - - /** - * Paginate the conductor collection. - * - * @param integer $page The current page to return. - * @param integer $limit The limit of items to include or use default. - * @param integer $offset Offset the page count after this count of rows. - * @return mixed - */ - final public function paginate(int $page = 1, int $limit = -1, int $offset = 0) - { - // Limit - if ($limit < 1) { - $limit = $this->limit; - } else { - $limit = min($limit, $this->maxLimit); - } - - // Page - if ($page < 1) { - $page = 1; - } - - // After - if ($offset < 0) { - $offset = 0; - } - - if ($this->collection !== null) { - $this->collection = $this->collection->splice(((($page - 1) * $limit) + $offset), $limit); - } else { - $this->query->limit($limit); - $this->query->offset((($page - 1) * $limit) + $offset); - } - } - - /** - * Apply a list of includes to the model. - * - * @param Model $model The model to append. - * @param array $includes The list of includes to include. - * @return void - */ - final public function applyIncludes(Model $model, array $includes): void - { - foreach ($includes as $include) { - $includeMethodName = 'include' . Str::studly($include); - if (method_exists($this, $includeMethodName) === true) { - $attributeName = Str::snake($include); - $attributeValue = $this->{$includeMethodName}($model); - if ($attributeValue !== null) { - $model->$attributeName = $this->{$includeMethodName}($model); - } - } - } - } - - /** - * Limit the returned fields in the conductor collection. - * - * @param array $fields An array of field names. - * @return void - */ - final public function limitFields(array $fields): void - { - if (empty($fields) !== true) { - $this->query->select(array_diff($fields, $this->includes)); - } - } - - /** - * Filter the conductor collection using raw data. - * - * @param string $rawFilter The raw filter string to parse. - * @param array|null $limitFields The fields to allow in the filter string. - * @param string $outerJoin The join for this filter group. - * @return void - */ - final public function appendFilterString( - string $rawFilter, - array|null $limitFields = null, - string $outerJoin = 'AND' - ): void { - if ($rawFilter === '') { - return; - } - - if (substr($rawFilter, -1) !== ',') { - $rawFilter .= ','; - } - - $parseFunc = function ($string, &$i = 0) use (&$parseFunc, $limitFields) { - $tokens = []; - $ignoreUntil = ''; - $skipUntil = ''; - $field = ''; - $value = null; - $set = &$field; - - for (; $i < strlen($string); $i++) { - $char = $string[$i]; - - if ($skipUntil !== '' && $char !== $skipUntil) { - continue; - } - - if ($ignoreUntil === '') { - if ($char === '\'' || $char === '"') { - $ignoreUntil = $char; - } elseif ($char === ':') { - if ($field === '') { - $skipUntil = ','; - continue; - } - - if ($field[0] === '\'' || $field[0] === '"') { - $field = substr($field, 1, -1); - } - - if ($set !== $value) { - $set = &$value; - continue; - } - } elseif (($char === ')' && $string[($i + 1)] === ',') || $char === ',') { - if ($value === null) { - $tokens[] = $field; - } else { - $value = trim($value); - $operator = 'LIKE'; - - // Check if value has a operator and remove it if it's a number - if (preg_match('/^(!?=|[<>]=?|<>|!)([^=!<>].*)*$/', $value, $matches) > 0) { - $operator = $matches[1]; - $value = ($matches[2] ?? ''); - } - - if ($value[0] === '\'' || $value[0] === '"') { - $value = substr($value, 1, -1); - } - - if ($operator === 'LIKE') { - $value = "%{$value}%"; - } - - if ( - is_array($limitFields) === false || - in_array(strtolower($field), array_map('strtolower', $limitFields)) !== false - ) { - $tokens[] = [$field, $operator, $value]; - } - }//end if - - $field = ''; - $value = null; - $set = &$field; - - if ($char === ')') { - $i++; - return $tokens; - } - - continue; - } elseif ($char === '(') { - if ($field === '') { - $i++; - $tokens[] = $parseFunc($string, $i); - continue; - } - }//end if - } elseif ($char === $ignoreUntil) { - $ignoreUntil = ''; - }//end if - - $set .= $char; - }//end for - - return $tokens; - }; - - $i = 0; - $filterArray = $parseFunc($rawFilter, $i); - - if (count($this->filterArray) !== 0) { - $this->filterArray[] = $outerJoin; - } - $this->filterArray[] = $filterArray; - } - - /** - * Append a field to the filter array. - * - * @param string $field The field name to append. - * @param string $operator The operator to append. - * @param string $value The value to append. - * @param string $join The join to append. - * @return void - */ - final public function appendFilter(string $field, string $operator, string $value, string $join = 'OR'): void - { - if (count($this->filterArray) !== 0) { - $this->filterArray[] = $join; - } - $this->filterArray[] = [$field, $operator, $value]; - } - - /** - * Run a scope query on the collection before anything else. - * - * @param Builder $builder The builder in use. - * @return void - */ - public function scope(Builder $builder): void - { - // empty - } - - /** - * Return an array of model fields visible to the current user. - * - * @param Model $model The model in question. - * @return array The array of field names. - */ - public function fields(Model $model): array - { - $visibleFields = Cache::remember( - "model:{$model->getTable()}:visible", - now()->addDays(28), - function () use ($model) { - $fields = $model->getVisible(); - if (empty($fields) === true) { - $fields = Cache::remember( - "schema:{$model->getTable()}:columns", - now()->addDays(28), - function () use ($model) { - return $model->getConnection() - ->getSchemaBuilder() - ->getColumnListing($model->getTable()); - } - ); - } - - return $fields; - } - ); - - $appends = $model->getAppends(); - if (is_array($appends) === true) { - $visibleFields = array_merge($visibleFields, $appends); - } - - if (is_array($this->includes) === true) { - $visibleFields = array_merge($visibleFields, $this->includes); - } - - return $visibleFields; - } - - /** - * Transform the passed Model to an array - * - * @param Model $model The model to transform. - * @return array The transformed model. - */ - protected function transformModel(Model $model): array - { - $result = $this->transform($model); - foreach ($result as $key => $value) { - $transformFunction = 'transform' . Str::studly($key); - if (method_exists($this, $transformFunction) === true) { - $result[$key] = $this->$transformFunction($value); - } - } - - $result = $this->transformFinal($result); - return $result; - } - - /** - * Transform the passed Model to an array - * - * @param Model $model The model to transform. - * @return array The transformed model. - */ - public function transform(Model $model): array - { - $result = $model->toArray(); - - $fields = $this->fields($model); - - if (is_array($fields) === true) { - $result = array_intersect_key($result, array_flip($fields)); - } - - return $result; - } - - /** - * Final Transform of the model array - * - * @param array $data The model array to transform. - * @return array The transformed model. - */ - public function transformFinal(array $data): array - { - return $data; - } - - /** - * Is the passed model viewable by the current user? - * - * @param Model $model The model in question. - * @return boolean Is the model viewable. - */ - public static function viewable(Model $model): bool - { - return true; - } - - /** - * Is the model creatable by the current user? - * - * @return boolean Is the model creatable. - */ - public static function creatable(): bool - { - return true; - } - - /** - * Is the passed model updatable by the current user? - * - * @param Model $model The model in question. - * @return boolean Is the model updatable. - */ - public static function updatable(Model $model): bool - { - return true; - } - - /** - * Is the passed model destroyable by the current user? - * - * @param Model $model The model in question. - * @return boolean Is the model destroyable. - */ - public static function destroyable(Model $model): bool - { - return true; - } -} diff --git a/app/Conductors/EventConductor.php b/app/Conductors/EventConductor.php deleted file mode 100644 index d91c14e..0000000 --- a/app/Conductors/EventConductor.php +++ /dev/null @@ -1,140 +0,0 @@ -user(); - if ($user === null || $user->hasPermission('admin/events') === false) { - $builder - ->where('status', '!=', 'draft') - ->where('publish_at', '<=', now()); - } - } - - /** - * Return if the current model is visible. - * - * @param Model $model The model. - * @return boolean Allow model to be visible. - */ - public static function viewable(Model $model): bool - { - if (strtolower($model->status) === 'draft' || Carbon::parse($model->publish_at)->isFuture() === true) { - /** @var \App\Models\User */ - $user = auth()->user(); - if ($user === null || $user->hasPermission('admin/events') === false) { - return false; - } - } - - return true; - } - - /** - * Return if the current model is creatable. - * - * @return boolean Allow creating model. - */ - public static function creatable(): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - return ($user !== null && $user->hasPermission('admin/events') === true); - } - - /** - * Return if the current model is updatable. - * - * @param Model $model The model. - * @return boolean Allow updating model. - */ - public static function updatable(Model $model): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - return ($user !== null && $user->hasPermission('admin/events') === true); - } - - /** - * Return if the current model is destroyable. - * - * @param Model $model The model. - * @return boolean Allow deleting model. - */ - public static function destroyable(Model $model): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - return ($user !== null && $user->hasPermission('admin/events') === true); - } - - /** - * Include Attachments Field. - * - * @param Model $model Them model. - * @return mixed The model result. - */ - public function includeAttachments(Model $model) - { - /** @var \App\Models\User */ - $user = auth()->user(); - - return $model->getAttachments()->map(function ($attachment) use ($user) { - if ($attachment->private === false || ($user !== null && $user->hasPermission('admin/events') === true)) { - return MediaConductor::includeModel(request(), 'attachments', $attachment->media); - } - }); - } - - /** - * Transform the Hero field. - * - * @param mixed $value The current value. - * @return array|null The new value. - */ - public function transformHero(mixed $value): array|null - { - $cacheKey = "media:{$value}"; - $media = Cache::remember($cacheKey, now()->addDays(28), function () use ($value) { - return Media::find($value); - }); - - return MediaConductor::includeModel(request(), 'hero', $media); - } -} diff --git a/app/Conductors/MediaConductor.php b/app/Conductors/MediaConductor.php deleted file mode 100644 index f627744..0000000 --- a/app/Conductors/MediaConductor.php +++ /dev/null @@ -1,184 +0,0 @@ - 'OK' - // ]; - - - /** - * Return an array of model fields visible to the current user. - * - * @param Model $model The model in question. - * @return array The array of field names. - */ - public function fields(Model $model): array - { - $fields = parent::fields($model); - - /** @var \App\Models\User */ - $user = auth()->user(); - if ($user === null || $user->hasPermission('admin/media') === false) { - $fields = arrayRemoveItem($fields, ['security_data', 'storage']); - } - - return $fields; - } - - /** - * Run a scope query on the collection before anything else. - * - * @param Builder $builder The builder in use. - * @return void - */ - public function scope(Builder $builder): void - { - $user = auth()->user(); - if ($user === null) { - $builder->where('security_type', '') - ->orWhere('security_type', 'password'); - } else { - $builder->where(function ($query) use ($user) { - $query->where('security_type', '') - ->orWhere('security_type', 'password') - ->orWhere(function ($subquery) use ($user) { - $subquery->where('security_type', 'permission') - ->whereIn('security_data', $user->permissions); - }); - }); - } - } - - /** - * Return if the current model is visible. - * - * @param Model $model The model. - * @return boolean Allow model to be visible. - */ - public static function viewable(Model $model): bool - { - if (strcasecmp('permission', $model->security_type) === 0) { - /** @var \App\Models\User */ - $user = auth()->user(); - if ($user === null || $user->hasPermission($model->security_data) === false) { - return false; - } - } elseif ($model->security_type !== '' && strcasecmp('password', $model->security_type) !== 0) { - return false; - } - - return true; - } - - /** - * Return if the current model is creatable. - * - * @return boolean Allow creating model. - */ - public static function creatable(): bool - { - $user = auth()->user(); - return ($user !== null); - } - - /** - * Return if the current model is updatable. - * - * @param Model $model The model. - * @return boolean Allow updating model. - */ - public static function updatable(Model $model): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - return ($user !== null && (strcasecmp($model->user_id, $user->id) === 0 || - $user->hasPermission('admin/media') === true)); - } - - /** - * Return if the current model is destroyable. - * - * @param Model $model The model. - * @return boolean Allow deleting model. - */ - public static function destroyable(Model $model): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - return ($user !== null && ($model->user_id === $user->id || $user->hasPermission('admin/media') === true)); - } - - /** - * Transform the final model data - * - * @param array $data The model data to transform. - * @return array The transformed model. - */ - public function transformFinal(array $data): array - { - unset($data['user_id']); - return $data; - } - - /** - * Include User Field. - * - * @param Model $model Them model. - * @return mixed The model result. - */ - public function includeUser(Model $model) - { - $user = Cache::remember("user:{$model['user_id']}", now()->addDays(28), function () use ($model) { - return User::find($model['user_id']); - }); - - return UserConductor::includeModel(request(), 'user', $user); - } - - /** - * Include job models in Media - * - * @param Model $model The reference model. - * @return mixed - */ - public function includeJobs(Model $model) - { - $jobs = $model->jobs() - ->select(['id','created_at','updated_at','user_id','status','status_text','progress']) - ->orderBy('created_at', 'desc')->get(); - return $jobs; - } -} diff --git a/app/Conductors/MediaJobConductor.php b/app/Conductors/MediaJobConductor.php deleted file mode 100644 index a55ef30..0000000 --- a/app/Conductors/MediaJobConductor.php +++ /dev/null @@ -1,76 +0,0 @@ -user(); - return ($user !== null && $user->hasPermission('admin/shortlinks') === true); - } - - /** - * Return if the current model is updatable. - * - * @param Model $model The model. - * @return boolean Allow updating model. - */ - public static function updatable(Model $model): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - return ($user !== null && $user->hasPermission('admin/shortlinks') === true); - } - - /** - * Return if the current model is destroyable. - * - * @param Model $model The model. - * @return boolean Allow deleting model. - */ - public static function destroyable(Model $model): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - return ($user !== null && $user->hasPermission('admin/shortlinks') === true); - } -} diff --git a/app/Conductors/SubscriptionConductor.php b/app/Conductors/SubscriptionConductor.php deleted file mode 100644 index 5bc3a3a..0000000 --- a/app/Conductors/SubscriptionConductor.php +++ /dev/null @@ -1,45 +0,0 @@ -user(); - return ($user !== null && ( - (strcasecmp($model->email, $user->email) === 0 && $user->email_verified_at !== null) || - $user->hasPermission('admin/subscriptions') === true - )); - } - - /** - * Return if the current model is destroyable. - * - * @param Model $model The model. - * @return boolean Allow deleting model. - */ - public static function destroyable(Model $model): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - return ($user !== null && ((strcasecmp($model->email, $user->email) === 0 && - $user->email_verified_at !== null) || $user->hasPermission('admin/subscriptions') === true)); - } -} diff --git a/app/Conductors/UserConductor.php b/app/Conductors/UserConductor.php deleted file mode 100644 index 4222de9..0000000 --- a/app/Conductors/UserConductor.php +++ /dev/null @@ -1,89 +0,0 @@ -user(); - if ($user === null || $user->hasPermission('admin/users') === false) { - return ['id', 'display_name']; - } - - return parent::fields($model); - } - - /** - * Transform the passed Model to an array - * - * @param Model $model The model to transform. - * @return array The transformed model. - */ - public function transform(Model $model): array - { - /** @var \App\Models\User */ - $user = auth()->user(); - $data = $model->toArray(); - $limit = $this->fields($model); - - if ( - $user === null || ( - $user->hasPermission('admin/users') === false && strcasecmp($user->id, $model->id) !== 0 - ) - ) { - $limit = ['id', 'display_name']; - } else { - $data['permissions'] = $user->permissions; - } - - $data = arrayLimitKeys($data, $limit); - return $data; - } - - /** - * Return if the current model is updatable. - * - * @param Model $model The model. - * @return boolean Allow updating model. - */ - public static function updatable(Model $model): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - if ($user !== null) { - return ($user->hasPermission('admin/users') === true || strcasecmp($user->id, $model->id) === 0); - } - - return false; - } - - /** - * Return if the current model is destroyable. - * - * @param Model $model The model. - * @return boolean Allow deleting model. - */ - public static function destroyable(Model $model): bool - { - /** @var \App\Models\User */ - $user = auth()->user(); - return ($user !== null && $user->hasPermission('admin/users') === true); - } -} diff --git a/app/Console/Commands/CleanupTempFiles.php b/app/Console/Commands/CleanupTempFiles.php deleted file mode 100644 index a68ad2f..0000000 --- a/app/Console/Commands/CleanupTempFiles.php +++ /dev/null @@ -1,46 +0,0 @@ - $keepTime) { - unlink($filename); - $deletedFileCount++; - } - } - - $this->comment('Deleted ' . $deletedFileCount . ' files'); - } -} diff --git a/app/Console/Commands/RemoveStaleMediaJobs.php b/app/Console/Commands/RemoveStaleMediaJobs.php deleted file mode 100644 index 48aee29..0000000 --- a/app/Console/Commands/RemoveStaleMediaJobs.php +++ /dev/null @@ -1,42 +0,0 @@ -subHours(48); - - $staleJobs = MediaJob::where('updated_at', '<=', $threshold)->get(); - - foreach ($staleJobs as $job) { - $job->delete(); - } - - $this->info(count($staleJobs) . ' stale media_jobs removed.'); - } -} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 61d0d1a..e6b9960 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -9,25 +9,18 @@ class Kernel extends ConsoleKernel { /** * Define the application's command schedule. - * - * @param \Illuminate\Console\Scheduling\Schedule $schedule The schedule. - * @return void */ protected function schedule(Schedule $schedule): void { // $schedule->command('inspire')->hourly(); - $schedule->command('app:cleanup-temp-files')->everyThirtyMinutes(); - $schedule->command('app:remove-stale-media-jobs')->everyThirtyMinutes(); } /** * Register the commands for the application. - * - * @return void */ protected function commands(): void { - $this->load(__DIR__ . '/Commands'); + $this->load(__DIR__.'/Commands'); require base_path('routes/console.php'); } diff --git a/app/Enum/CurlErrorCodes.php b/app/Enum/CurlErrorCodes.php deleted file mode 100644 index 9429f13..0000000 --- a/app/Enum/CurlErrorCodes.php +++ /dev/null @@ -1,169 +0,0 @@ - 'Unsupported protocol.', - 2 => 'Failed initalization.', - 3 => 'Invalid URL format.', - 4 => 'CURLE_URL_MALFORMAT_USER.', - 5 => 'Could not resolve proxy.', - 6 => 'Could not resolve host.', - 7 => 'Could not connect to host.', - 8 => 'Invalid reply from FTP server.', - 9 => 'Access denied on host.', - 11 => 'Invalid pass reply from FTP server.', - 13 => 'Invalid pasv reply from FTP server.', - 14 => 'Invalid 227 format from FTP server.', - 15 => 'Could not get FTP host.', - 17 => 'Could not set type for FTP transfer.', - 18 => 'Invalid partial size.', - 19 => 'Could not retrieve file from FTP server.', - 21 => 'Quote error.', - 22 => 'HTTP server returned error.', - 23 => 'File write error.', - 25 => 'Upload file error.', - 26 => 'File read error.', - 27 => 'Out of memory.', - 28 => 'File transfer timed out.', - 30 => 'Invalid port for FTP server.', - 31 => 'Could not use rest for FTP server.', - 33 => 'File range error.', - 34 => 'Invalid POST for HTTP server.', - 35 => 'SSL connectio error.', - 36 => 'Invalid resume download.', - 37 => 'Could not read file.', - 38 => 'Could not bind to LDAP.', - 39 => 'LDAP search failed.', - 41 => 'Function not found.', - 42 => 'Aborted by callback.', - 43 => 'Bad function argument.', - 45 => 'Interface failed.', - 47 => 'Too many redirects.', - 48 => 'Unknown telnet option.', - 49 => 'Telnet option syntax invalid.', - 51 => 'Peer failed verification.', - 52 => 'Did not receive any data.', - 53 => 'SSL engine was not found.', - 54 => 'SSL engine failed.', - 55 => 'Send data error.', - 56 => 'Receive data error.', - 58 => 'SSL certificate error.', - 59 => 'SSL cipher error.', - 60 => 'SSL CACertificate failed.', - 61 => 'Invalid content encoding.', - 62 => 'Invalid LDAP url.', - 63 => 'Filesize exceeded.', - 64 => 'SSL Failed.', - 65 => 'CURLE_SEND_FAIL_REWIND.', - 66 => 'SSL engine initalization failed.', - 67 => 'CURLE_LOGIN_DENIED.', - 68 => 'CURLE_TFTP_NOTFOUND.', - 69 => 'CURLE_TFTP_PERM.', - 70 => 'CURLE_REMOTE_DISK_FULL.', - 71 => 'CURLE_TFTP_ILLEGAL.', - 72 => 'CURLE_TFTP_UNKNOWNID.', - 73 => 'Remote file already exists.', - 74 => 'No such user on FTP server.', - 75 => 'Conversion failed.', - 76 => 'Conversion required.', - 77 => 'SSL CACertificate bad file.', - 78 => 'Remove file not found.', - 79 => 'SSH error.', - 80 => 'SSL Shutdown failed.', - 81 => 'Again.', - 82 => 'SSL bad CRL file.', - 83 => 'SSL issuer error.', - 84 => 'FTP pret failed.', - 85 => 'CURLE_RTSP_CSEQ_ERROR.', - 86 => 'CURLE_RTSP_SESSION_ERROR.', - 87 => 'CURLE_FTP_BAD_FILE_LIST.', - 88 => 'CURLE_CHUNK_FAILED.', - - - ]; -} diff --git a/app/Enum/Enum.php b/app/Enum/Enum.php deleted file mode 100644 index 9217845..0000000 --- a/app/Enum/Enum.php +++ /dev/null @@ -1,73 +0,0 @@ -> - */ - public static $messages = []; - - /** - * Caches reflections of enum subclasses. - * - * @var array, ReflectionClass> - */ - public static $reflectionCache = []; - - - /** - * Returns a reflection of the enum subclass. - * - * @return ReflectionClass - */ - public static function getReflection(): ReflectionClass - { - $class = static::class; - - return static::$reflectionCache[$class] ??= new ReflectionClass($class); - } - - - /** - * Returns the constants in the enum subclass - * - * @return array - */ - public static function getConstants(): array - { - return static::getReflection()->getConstants(); - } - - - /** - * Returns the constants values in the enum subclass - * - * @return array - */ - public static function getConstantValues(): array - { - return array_values(static::getReflection()->getConstants()); - } - - /** - * Returns a message from the enum subclass - * - * @param integer $messageIndex The message index to retrieve. - * @param string $defaultMessage Message to use if index does not exist. - * @return string - */ - public static function getMessage(int $messageIndex, string $defaultMessage = 'Unknown'): string - { - if (array_key_exists($messageIndex, self::$messages) === true) { - return self::$messages[$messageIndex]; - } - - return $defaultMessage; - } -} diff --git a/app/Enum/HttpResponseCodes.php b/app/Enum/HttpResponseCodes.php deleted file mode 100644 index 73513b5..0000000 --- a/app/Enum/HttpResponseCodes.php +++ /dev/null @@ -1,165 +0,0 @@ - 'Continue.', - 101 => 'Switching Protocols.', - 102 => 'Processing.', - // RFC2518 - 200 => 'OK.', - 201 => 'Created.', - 202 => 'Accepted.', - 203 => 'Non-Authoritative Information.', - 204 => 'No Content.', - 205 => 'Reset Content.', - 206 => 'Partial Content.', - 207 => 'Multi-Status.', - // RFC4918 - 208 => 'Already Reported.', - // RFC5842 - 226 => 'IM Used.', - // RFC3229 - 300 => 'Multiple Choices.', - 301 => 'Moved Permanently.', - 302 => 'Found.', - 303 => 'See Other.', - 304 => 'Not Modified.', - 305 => 'Use Proxy.', - 307 => 'Temporary Redirect.', - 308 => 'Permanent Redirect.', - // RFC7238 - 400 => 'Bad Request.', - 401 => 'Unauthorized.', - 402 => 'Payment Required.', - 403 => 'Forbidden.', - 404 => 'Not Found.', - 405 => 'Method Not Allowed.', - 406 => 'Not Acceptable.', - 407 => 'Proxy Authentication Required.', - 408 => 'Request Timeout.', - 409 => 'Conflict.', - 410 => 'Gone.', - 411 => 'Length Required.', - 412 => 'Precondition Failed.', - 413 => 'Payload Too Large.', - 414 => 'URI Too Long.', - 415 => 'Unsupported Media Type.', - 416 => 'Range Not Satisfiable.', - 417 => 'Expectation Failed.', - 418 => 'I\'m a teapot.', - // RFC2324 - 421 => 'Misdirected Request.', - // RFC7540 - 422 => 'Unprocessable Entity.', - // RFC4918 - 423 => 'Locked.', - // RFC4918 - 424 => 'Failed Dependency.', - // RFC4918 - 425 => 'Reserved for WebDAV advanced collections expired proposal.', - // RFC2817 - 426 => 'Upgrade Required.', - // RFC2817 - 428 => 'Precondition Required.', - // RFC6585 - 429 => 'Too Many Requests.', - // RFC6585 - 431 => 'Request Header Fields Too Large.', - // RFC6585 - 451 => 'Unavailable For Legal Reasons.', - // RFC7725 - 500 => 'Internal Server Error.', - 501 => 'Not Implemented.', - 502 => 'Bad Gateway.', - 503 => 'Service Unavailable.', - 504 => 'Gateway Timeout.', - 505 => 'HTTP Version Not Supported.', - 506 => 'Variant Also Negotiates.', - // RFC2295 - 507 => 'Insufficient Storage.', - // RFC4918 - 508 => 'Loop Detected.', - // RFC5842 - 510 => 'Not Extended.', - // RFC2774 - 511 => 'Network Authentication Required.', - // RFC6585 - ]; -} diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 74672f9..56af264 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -3,19 +3,12 @@ namespace App\Exceptions; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Throwable; -use PDOException; -use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer; -use Illuminate\Support\Facades\App; -use Illuminate\Support\Facades\Log; -use Illuminate\Support\Facades\Mail; -use Symfony\Component\ErrorHandler\Exception\FlattenException; class Handler extends ExceptionHandler { /** - * A list of the inputs that are never flashed to the session on validation exceptions. + * The list of the inputs that are never flashed to the session on validation exceptions. * * @var array */ @@ -25,74 +18,13 @@ class Handler extends ExceptionHandler 'password_confirmation', ]; - /** * Register the exception handling callbacks for the application. - * - * @return void */ public function register(): void { - // $this->renderable(function (HttpException $e, $request) { - // if ($request->is('api/*')) { - // $message = $e->getMessage(); - // if ($message === '') { - // $message = HttpResponseCodes::$statusTexts[$e->getStatusCode()]; - // } - - // return response()->json([ - // 'message' => $message - // ], $e->getStatusCode()); - // } - // }); - - $this->renderable(function (NotFoundHttpException $e, $request) { - if ($request->is('api/*') === true) { - return response()->json([ - 'message' => 'Resource not found' - ], 404); - } - }); - - $this->renderable(function (PDOException $e, $request) { - if ($request->is('api/*') === true) { - return response()->json([ - 'message' => 'The server is currently unavailable' - ], 503); - } - }); - $this->reportable(function (Throwable $e) { - if ($this->shouldReport($e) === true) { - if (App::runningUnitTests() === false) { - $this->sendEmail($e); - } - } + // }); } - - /** - * Send email - * - * @param Throwable $exception Throwable object. - * @return void - */ - public function sendEmail(Throwable $exception) - { - try { - $e = FlattenException::createFromThrowable($exception); - $handler = new HtmlErrorRenderer(true); - $css = $handler->getStylesheet(); - $content = $handler->getBody($e); - - Mail::send('emails.exception', compact('css', 'content'), function ($message) { - $message - ->to('webmaster@stemmechanics.com.au') - ->subject('Exception Generated') - ; - }); - } catch (Throwable $ex) { - Log::error($ex); - } - } } diff --git a/app/Filters/SubscriptionFilter.php b/app/Filters/SubscriptionFilter.php deleted file mode 100644 index 8e210d2..0000000 --- a/app/Filters/SubscriptionFilter.php +++ /dev/null @@ -1,30 +0,0 @@ -hasPermission('admin/users') !== true) { - return ['id', 'email', 'confirmed_at']; - } - } -} diff --git a/app/Helpers/Array.php b/app/Helpers/Array.php deleted file mode 100644 index 76e0103..0000000 --- a/app/Helpers/Array.php +++ /dev/null @@ -1,78 +0,0 @@ - $directory, - 'basename' => $name . ($extension !== '' ? ".{$extension}" : ''), - 'filename' => $name, - 'extension' => $extension, - 'part' => $part, - ]; -} - -/** - * Check a temporary file exists. - * - * @param string $dir The file parent directory. - * @param string $name The file name. - * @param string $extension The file extension to use. - * @param string $part The file part number. - * @return boolean If the file exists. - */ -function tempFileExists(string $dir, string $name, string $extension = '', string $part = ''): bool -{ - $filename = constructTempFileName($dir, $name, $extension, $part); - $exists = file_exists($filename); - - return $exists; -} - -/** - * Construct the temp file name based on the information - * - * @param string $dir The file parent directory. - * @param string $name The file name. - * @param string $extension The file extension to use. - * @param string $part The file part number. - * @return string The file path. - */ -function constructTempFileName(string $dir, string $name, string $extension = '', string $part = ''): string -{ - $filename = $dir . DIRECTORY_SEPARATOR . $name . ($extension !== '' ? ".{$extension}" : '') . - ($part !== "" ? ".part-{$part}" : ''); - - return $filename; -} diff --git a/app/Helpers/TypeValue.php b/app/Helpers/TypeValue.php deleted file mode 100644 index fac3573..0000000 --- a/app/Helpers/TypeValue.php +++ /dev/null @@ -1,27 +0,0 @@ -middleware('auth:sanctum') - ->only([ - 'index', - 'update', - 'delete' - ]); - } - - /** - * Display a listing of the resource. - * - * @param \Illuminate\Http\Request $request The endpoint request. - * @return \Illuminate\Http\Response - */ - public function index(Request $request) - { - if ($request->user() !== null && $request->user()?->hasPermission('admin/analytics') === true) { - $request->rename([ - 'type' => 'requests.type', - 'path' => 'requests.path' - ]); - - list($collection, $total) = AnalyticsConductor::request($request); - - return $this->respondAsResource( - $collection, - ['resourceName' => 'session', - 'isCollection' => true, - 'appendData' => ['total' => $total] - ] - ); - }//end if - - return $this->respondForbidden(); - } - - /** - * Display the specified resource. - * - * @param \Illuminate\Http\Request $request The endpoint request. - * @param \App\Models\AnalyticsSession $session The analytics session. - * @return \Illuminate\Http\Response - */ - public function show(Request $request, AnalyticsSession $session) - { - if ($request->user() !== null && $request->user()?->hasPermission('admin/analytics') === true) { - $session->load(['requests' => function ($query) { - $query->select('session_id', 'type', 'path', 'created_at'); - } - ]); - - foreach ($session->requests as $requestItem) { - $requestItem->makeHidden('session_id'); - } - - return $this->respondAsResource( - $session, - ['resourceName' => 'session'] - ); - } - - return $this->respondForbidden(); - } - - /** - * Store a newly created resource in storage. - * - * @param \App\Http\Requests\AnalyticsRequest $request The user request. - * @return \Illuminate\Http\Response - */ - public function store(AnalyticsRequest $request) - { - if (AnalyticsConductor::creatable() === true) { - $analytics = null; - $user = $request->user(); - - $data = [ - 'type' => $request->input('type'), - 'path' => $request->input('path', ''), - 'useragent' => $request->userAgent(), - 'ip' => $request->ip() - ]; - - if ( - $user !== null && - $user->hasPermission('admin/analytics') === true && - $request->has('session') === true - ) { - $data['session_id'] = $request->input('session_id'); - $analytics = AnalyticsItemRequest::create($data); - } else { - $analytics = AnalyticsItemRequest::create($data); - } - - return $this->respondAsResource( - AnalyticsConductor::model($request, $analytics), - ['respondCode' => HttpResponseCodes::HTTP_CREATED] - ); - } else { - return $this->respondForbidden(); - }//end if - } -} diff --git a/app/Http/Controllers/Api/ApiController.php b/app/Http/Controllers/Api/ApiController.php deleted file mode 100644 index d51842b..0000000 --- a/app/Http/Controllers/Api/ApiController.php +++ /dev/null @@ -1,243 +0,0 @@ -json($data, $respondCode, $headers); - } - - /** - * Return forbidden message - * - * @param string $message Response message. - * @return JsonResponse - */ - public function respondForbidden( - string $message = 'You do not have permission to access the resource.' - ): JsonResponse { - return response()->json(['message' => $message], HttpResponseCodes::HTTP_FORBIDDEN); - } - - /** - * Return forbidden message - * - * @param string $message Response message. - * @return JsonResponse - */ - public function respondNotFound(string $message = 'The resource was not found.'): JsonResponse - { - return response()->json(['message' => $message], HttpResponseCodes::HTTP_NOT_FOUND); - } - - /** - * Return too large message - * - * @param string $message Response message. - * @return JsonResponse - */ - public function respondTooLarge(string $message = 'The request entity is too large.'): JsonResponse - { - return response()->json(['message' => $message], HttpResponseCodes::HTTP_REQUEST_ENTITY_TOO_LARGE); - } - - /** - * Return no content. - * - * @return JsonResponse - */ - public function respondNoContent(): JsonResponse - { - return response()->json([], HttpResponseCodes::HTTP_NO_CONTENT); - } - - /** - * Return no content - * - * @return JsonResponse - */ - public function respondNotImplemented(): JsonResponse - { - return response()->json([], HttpResponseCodes::HTTP_NOT_IMPLEMENTED); - } - - /** - * Return created. - * - * @return JsonResponse - */ - public function respondCreated(): JsonResponse - { - return response()->json([], HttpResponseCodes::HTTP_CREATED); - } - - /** - * Return accepted. - * - * @return JsonResponse - */ - public function respondAccepted(): JsonResponse - { - return response()->json([], HttpResponseCodes::HTTP_ACCEPTED); - } - - /** - * Return server error. - * - * @return JsonResponse - */ - public function respondServerError(): JsonResponse - { - return response()->json([], HttpResponseCodes::HTTP_INTERNAL_SERVER_ERROR); - } - - /** - * Return single error message - * - * @param string $message Error message. - * @param integer $responseCode Resource code. - * @return JsonResponse - */ - public function respondError( - string $message, - int $responseCode = HttpResponseCodes::HTTP_UNPROCESSABLE_ENTITY - ): JsonResponse { - return response()->json([ - 'message' => $message - ], $responseCode); - } - - /** - * Return formatted errors - * - * @param array $errors Error messages. - * @param integer $responseCode Resource code. - * @return JsonResponse - */ - public function respondWithErrors( - array $errors, - int $responseCode = HttpResponseCodes::HTTP_UNPROCESSABLE_ENTITY - ): JsonResponse { - $keys = array_keys($errors); - $error = $errors[$keys[0]]; - - if (count($keys) > 1) { - $additional_errors = (count($keys) - 1); - $error .= sprintf(' (and %d more %s', $additional_errors, Str::plural('error', $additional_errors)); - } - - return response()->json([ - 'message' => $error, - 'errors' => $errors - ], $responseCode); - } - - /** - * Return resource data - * - * @param array|Model|Collection $data Resource data. - * @param array $options Respond options. - * @param callable|null $validationFn Optional validation function to check the data before responding. - * @return JsonResponse - */ - protected function respondAsResource( - mixed $data, - array $options = [], - $validationFn = null - ): JsonResponse { - $isCollection = ($options['isCollection'] ?? false); - $appendData = ($options['appendData'] ?? null); - $resourceName = ($options['resourceName'] ?? ''); - $transformResourceName = ($options['transformResourceName'] ?? true); - $respondCode = ($options['respondCode'] ?? HttpResponseCodes::HTTP_OK); - - if ($data === null || ($data instanceof Collection && $data->count() === 0)) { - $validationData = []; - if (array_key_exists('appendData', $options) === true) { - $validationData = $options['appendData']; - } - - if ($validationFn === null || $validationFn($validationData) === true) { - return $this->respondNotFound(); - } - } - - if (empty($resourceName) === true) { - $resourceName = $this->resourceName; - } - - if (empty($resourceName) === true) { - $resourceName = get_class($this); - $resourceName = substr($resourceName, (strrpos($resourceName, '\\') + 1)); - $resourceName = substr($resourceName, 0, strpos($resourceName, 'Controller')); - $resourceName = strtolower($resourceName); - } - - $dataArray = []; - if ($data instanceof Collection) { - $dataArray = $data->toArray(); - } elseif (is_array($data) === true) { - $dataArray = $data; - } elseif ($data instanceof Model) { - $dataArray = $data->toArray(); - } - - $resource = []; - if ($isCollection === true) { - $resource = [$transformResourceName === true ? Str::plural($resourceName) : $resourceName => $dataArray]; - } else { - $resource = [$transformResourceName === true ? Str::singular($resourceName) : $resourceName => $dataArray]; - } - - if ($appendData !== null) { - $resource += $appendData; - } - - return response()->json($resource, $respondCode); - } - - /** - * Get the Controller Model Class name. - * - * @return string - */ - public function getModelClass(): string - { - $controllerClass = static::class; - - $modelName = 'App\\Models\\' . Str::replaceLast('Controller', '', Str::afterLast($controllerClass, '\\')); - - if (class_exists($modelName) === false) { - return $modelName; - } - - return $modelName; - } -} diff --git a/app/Http/Controllers/Api/ArticleController.php b/app/Http/Controllers/Api/ArticleController.php deleted file mode 100644 index dd98184..0000000 --- a/app/Http/Controllers/Api/ArticleController.php +++ /dev/null @@ -1,139 +0,0 @@ -middleware('auth:sanctum') - ->only([ - 'store', - 'update', - 'delete' - ]); - } - - /** - * Display a listing of the resource. - * - * @param \Illuminate\Http\Request $request The endpoint request. - * @return \Illuminate\Http\Response - */ - public function index(Request $request) - { - list($collection, $total) = ArticleConductor::request($request); - - return $this->respondAsResource( - $collection, - ['isCollection' => true, - 'appendData' => ['total' => $total] - ] - ); - } - - /** - * Display the specified resource. - * - * @param \Illuminate\Http\Request $request The endpoint request. - * @param \App\Models\Article $article The article model. - * @return \Illuminate\Http\Response - */ - public function show(Request $request, Article $article) - { - if (ArticleConductor::viewable($article) === true) { - return $this->respondAsResource(ArticleConductor::model($request, $article)); - } - - return $this->respondForbidden(); - } - - /** - * Store a newly created resource in storage. - * - * @param \App\Http\Requests\ArticleRequest $request The user request. - * @return \Illuminate\Http\Response - */ - public function store(ArticleRequest $request) - { - if (ArticleConductor::creatable() === true) { - $article = Article::create($request->except(['attachments', 'gallery'])); - - if ($request->has('attachments') === true) { - $article->addAttachments($request->get('attachments')); - } - - if ($request->has('gallery') === true) { - $article->galleryAddMany($request->get('gallery')); - } - - return $this->respondAsResource( - ArticleConductor::model($request, $article), - ['respondCode' => HttpResponseCodes::HTTP_CREATED] - ); - } else { - return $this->respondForbidden(); - }//end if - } - - /** - * Update the specified resource in storage. - * - * @param \App\Http\Requests\ArticleRequest $request The article update request. - * @param \App\Models\Article $article The specified article. - * @return \Illuminate\Http\Response - */ - public function update(ArticleRequest $request, Article $article) - { - if (ArticleConductor::updatable($article) === true) { - if ($request->has('attachments') === true) { - $article->deleteAttachments(); - $article->addAttachments($request->get('attachments')); - } - - if ($request->has('gallery') === true) { - $article->gallery()->delete(); - $article->galleryAddMany($request->get('gallery')); - } - - $article->update($request->except(['attachments', 'gallery'])); - return $this->respondAsResource(ArticleConductor::model($request, $article)); - } - - return $this->respondForbidden(); - } - - /** - * Remove the specified resource from storage. - * - * @param \App\Models\Article $article The specified article. - * @return \Illuminate\Http\Response - */ - public function destroy(Article $article) - { - if (ArticleConductor::destroyable($article) === true) { - $article->delete(); - return $this->respondNoContent(); - } else { - return $this->respondForbidden(); - } - } -} diff --git a/app/Http/Controllers/Api/AuthController.php b/app/Http/Controllers/Api/AuthController.php deleted file mode 100644 index 0fe1851..0000000 --- a/app/Http/Controllers/Api/AuthController.php +++ /dev/null @@ -1,105 +0,0 @@ -middleware('auth:sanctum') - // ->only(['me']); - } - - /** - * Current User details - * - * @param Request $request Current request data. - * @return JsonResponse - */ - public function me(Request $request): JsonResponse - { - $user = $request->user()->makeVisible(['permissions']); - return $this->respondAsResource($user); - } - - /** - * Login user with supplied creditials - * - * @param App\Http\Controllers\Api\AuthLoginRequest $request Created request data. - * @return JsonResponse|void - */ - public function login(AuthLoginRequest $request) - { - $user = User::where('email', '=', $request->input('email'))->first(); - - if ( - $user !== null && - strlen($user->password) > 0 && - Hash::check($request->input('password'), $user->password) === true - ) { - if ($user->email_verified_at === null) { - return $this->respondWithErrors([ - 'email' => 'Email address has not been verified.' - ]); - } - - if ($user->disabled === true) { - return $this->respondWithErrors([ - 'email' => 'Account has been disabled.' - ]); - } - - $token = $user->createToken('user_token')->plainTextToken; - - $user->logins()->create([ - 'token' => $token, - 'login' => now(), - 'ip_address' => $request->ip(), - 'user_agent' => $request->userAgent() - ]); - - return $this->respondAsResource( - $user->makeVisible(['permissions']), - ['appendData' => ['token' => $token]] - ); - }//end if - - return $this->respondWithErrors([ - 'email' => 'Invalid email or password', - 'password' => 'Invalid email or password', - ]); - } - - /** - * Logout current user - * - * @param Request $request Current request data. - * @return JsonResponse - */ - public function logout(Request $request): JsonResponse - { - $user = $request->user(); - - $user->logins()->where('token', $user->currentAccessToken())->update(['logout' => now()]); - $user->currentAccessToken()->delete(); - - return $this->respondNoContent(); - } -} diff --git a/app/Http/Controllers/Api/ContactController.php b/app/Http/Controllers/Api/ContactController.php deleted file mode 100644 index 85d65fb..0000000 --- a/app/Http/Controllers/Api/ContactController.php +++ /dev/null @@ -1,30 +0,0 @@ -input('name'), - $request->input('email'), - $request->input('content') - ) - )))->onQueue('mail'); - - return $this->respondCreated(); - } -} diff --git a/app/Http/Controllers/Api/EventController.php b/app/Http/Controllers/Api/EventController.php deleted file mode 100644 index 31b562c..0000000 --- a/app/Http/Controllers/Api/EventController.php +++ /dev/null @@ -1,234 +0,0 @@ -middleware('auth:sanctum') - ->only(['store','update','destroy', 'userAdd', 'userUpdate', 'userDelete']); - } - - /** - * Display a listing of the resource. - * - * @param \Illuminate\Http\Request $request The endpoint request. - * @return \Illuminate\Http\Response - */ - public function index(Request $request) - { - list($collection, $total) = EventConductor::request($request); - - return $this->respondAsResource( - $collection, - ['isCollection' => true, - 'appendData' => ['total' => $total] - ] - ); - } - - /** - * Display the specified resource. - * - * @param \Illuminate\Http\Request $request The endpoint request. - * @param \App\Models\Event $event The specified event. - * @return \Illuminate\Http\Response - */ - public function show(Request $request, Event $event) - { - if (EventConductor::viewable($event) === true) { - return $this->respondAsResource(EventConductor::model($request, $event)); - } - - return $this->respondForbidden(); - } - - /** - * Store a newly created resource in storage. - * - * @param \App\Http\Requests\EventRequest $request The request. - * @return \Illuminate\Http\Response - */ - public function store(EventRequest $request) - { - if (EventConductor::creatable() === true) { - $event = Event::create($request->except(['attachments'])); - - if ($request->has('attachments') === true) { - $event->addAttachments($request->get('attachments')); - } - - return $this->respondAsResource( - EventConductor::model($request, $event), - ['respondCode' => HttpResponseCodes::HTTP_CREATED] - ); - } else { - return $this->respondForbidden(); - } - } - - /** - * Update the specified resource in storage. - * - * @param \App\Http\Requests\EventRequest $request The endpoint request. - * @param \App\Models\Event $event The specified event. - * @return \Illuminate\Http\Response - */ - public function update(EventRequest $request, Event $event) - { - if (EventConductor::updatable($event) === true) { - if ($request->has('attachments') === true) { - $event->deleteAttachments(); - $event->addAttachments($request->get('attachments')); - } - - $event->update($request->except(['attachments'])); - return $this->respondAsResource(EventConductor::model($request, $event)); - } - - return $this->respondForbidden(); - } - - /** - * Remove the specified resource from storage. - * - * @param \App\Models\Event $event The specified event. - * @return \Illuminate\Http\Response - */ - public function destroy(Event $event) - { - if (EventConductor::destroyable($event) === true) { - $event->delete(); - return $this->respondNoContent(); - } else { - return $this->respondForbidden(); - } - } - - /** - * List users of Event - * @param Request $request The HTTP request. - * @param Event $event Event model. - * @return JsonResponse - */ - public function userList(Request $request, Event $event): JsonResponse - { - $authUser = $request->user(); - $eventUsers = $event->users; - - if ($authUser !== null) { - $isAdmin = $authUser->hasPermission('admin/events'); - $isEventUser = $eventUsers->contains($authUser->id); - - if ($isAdmin === true || $isEventUser === true) { - if ($isAdmin === false) { - $eventUsers = $eventUsers->filter(function ($user) use ($authUser) { - return $user->id === $authUser->id; - }); - } - - return $this->respondAsResource( - UserConductor::collection($request, $eventUsers), - [ - 'isCollection' => true, - 'resourceName' => 'users' - ] - ); - } - - return $this->respondNotFound(); - }//end if - - return $this->respondForbidden(); - } - - /** - * Add user to Event - * @param Request $request The HTTP request. - * @param Event $event Event model. - * @return JsonResponse - */ - public function userAdd(Request $request, Event $event): JsonResponse - { - $authUser = $request->user(); - if ($authUser !== null && $authUser->hasPermission('admin/events') === true) { - if ($request->has("users") === true) { - $eventUsers = $event->users()->pluck('user_id')->toArray(); // Get the current users in the event - $requestedUsers = $request->input("users"); // Get the requested users - - $usersToAdd = array_diff($requestedUsers, $eventUsers); // Users to add - $usersToRemove = array_diff($eventUsers, $requestedUsers); // Users to remove - - // Add missing users - foreach ($usersToAdd as $userToAdd) { - if (User::find($userToAdd) !== null) { - $event->users()->attach($userToAdd); - } - } - - // Remove extra users - foreach ($usersToRemove as $userToRemove) { - $event->users()->detach($userToRemove); - } - - return $this->respondNoContent(); - }//end if - - return $this->respondWithErrors(['users' => 'The user list was not found']); - }//end if - - return $this->respondForbidden(); - } - - /** - * Update user - * @param Request $request The HTTP request. - * @param Event $event Event model. - * @return void - */ - public function userUpdate(Request $request, Event $event): void - { - // only admin/events permitted - } - - /** - * Delete user from event - * - * @param Request $request The HTTP request. - * @param Event $event Event model. - * @param User $user User model. - * @return JsonResponse - */ - public function userDelete(Request $request, Event $event, User $user): JsonResponse - { - $authUser = $request->user(); - if ($authUser !== null && $authUser->hasPermission('admin/events') === true) { - $eventUsers = $event->users; - if ($eventUsers->find($user->id) !== null) { - $eventUsers->detach($user->id); - return $this->respondNoContent(); - } else { - return $this->respondNotFound(); - } - } - - return $this->respondForbidden(); - } -} diff --git a/app/Http/Controllers/Api/InfoController.php b/app/Http/Controllers/Api/InfoController.php deleted file mode 100644 index 964ba6b..0000000 --- a/app/Http/Controllers/Api/InfoController.php +++ /dev/null @@ -1,26 +0,0 @@ - "1.0.0", - "max_upload_size" => Media::getMaxUploadSize() - ]; - - return $this->respondJson($info); - } -} diff --git a/app/Http/Controllers/Api/LogController.php b/app/Http/Controllers/Api/LogController.php deleted file mode 100644 index c81c802..0000000 --- a/app/Http/Controllers/Api/LogController.php +++ /dev/null @@ -1,165 +0,0 @@ -middleware('auth:sanctum') - ->only(['show']); - } - - /** - * Display the specified resource. - * - * @param Request $request The log request. - * @param string $name The log name. - * @return \Illuminate\Http\Response - */ - public function show(Request $request, string $name) - { - if ($request->user()?->hasPermission('logs/' . $name) === true) { - switch (strtolower($name)) { - case 'discord': - $data = []; - - $log = $request->get('log'); - if ($log === null) { - $log = ['output', 'error']; - } else { - $log = explode(',', strtolower($log)); - } - - $lines = intval($request->get('lines', 50)); - if ($lines > 100) { - $lines = 100; - } elseif ($lines < 0) { - $lines = 1; - } - - $before = $request->get('before'); - if ($before !== null) { - $before = preg_split( - "/([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})/", - $before, - -1, - (PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) - ); - if (count($before) !== 6) { - $before = null; - } - } - - $after = $request->get('after'); - if ($after !== null) { - $after = preg_split( - "/([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})/", - $after, - -1, - (PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) - ); - if (count($after) !== 6) { - $after = null; - } - } - - $logFiles = [ - [ - 'name' => 'output', - 'path' => '/home/discordbot/.pm2/logs/stemmech-discordbot-out-0.log' - ],[ - 'name' => 'error', - 'path' => '/home/discordbot/.pm2/logs/stemmech-discordbot-error-0.log' - ] - ]; - - foreach ($logFiles as $logFile) { - if (in_array($logFile['name'], $log) === true) { - $logContent = ''; - - if (file_exists($logFile['path']) === true) { - $logContent = file_get_contents($logFile['path']); - } - - $logArray = preg_split( - // phpcs:ignore Generic.Files.LineLength.TooLong - "/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}: (?:(?!\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}: )[\s\S])*)/", - $logContent, - -1, - (PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) - ); - - $logContent = ''; - $logLineCount = 0; - $logLineSkip = false; - foreach (array_reverse($logArray) as $logLine) { - $lineDate = preg_split( - "/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2}): /", - $logLine, - -1, - (PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) - ); - if (count($lineDate) >= 6) { - $logLineSkip = false; - - // Is line before - if ( - $before !== null && ( - $lineDate[0] > $before[0] || - $lineDate[1] > $before[1] || - $lineDate[2] > $before[2] || - $lineDate[3] > $before[3] || - $lineDate[4] > $before[4] || - $lineDate[5] > $before[5] - ) - ) { - $logLineSkip = true; - continue; - } - - // Is line after - if ( - $after !== null && ( - $after[0] > $lineDate[0] || - $after[1] > $lineDate[1] || - $after[2] > $lineDate[2] || - $after[3] > $lineDate[3] || - $after[4] > $lineDate[4] || - $after[5] > $lineDate[5] - ) - ) { - $logLineSkip = true; - continue; - } - - $logLineCount += 1; - }//end if - - if ($logLineCount > $lines) { - break; - } - - if ($logLineSkip === false) { - $logContent .= $logLine; - } - }//end foreach - - $data[$logFile['name']] = $logContent; - }//end if - }//end foreach - - return $this->respondJson([ - 'log' => $data - ]); - }//end switch - }//end if - - return $this->respondForbidden(); - } -} diff --git a/app/Http/Controllers/Api/MediaController.php b/app/Http/Controllers/Api/MediaController.php deleted file mode 100644 index 7e6b87c..0000000 --- a/app/Http/Controllers/Api/MediaController.php +++ /dev/null @@ -1,443 +0,0 @@ -middleware('auth:sanctum') - ->only(['store','update','destroy']); - } - - /** - * Display a listing of the resource. - * - * @param \Illuminate\Http\Request $request The endpoint request. - * @return \Illuminate\Http\Response - */ - public function index(Request $request) - { - list($collection, $total) = MediaConductor::request($request); - - return $this->respondAsResource( - $collection, - ['isCollection' => true, - 'appendData' => ['total' => $total] - ], - function ($options) { - return $options['total'] === 0; - } - ); - } - - /** - * Display the specified resource. - * - * @param \Illuminate\Http\Request $request The endpoint request. - * @param \App\Models\Media $medium The request media. - * @return \Illuminate\Http\Response - */ - public function show(Request $request, Media $medium) - { - if (MediaConductor::viewable($medium) === true) { - return $this->respondAsResource(MediaConductor::model($request, $medium)); - } - - return $this->respondForbidden(); - } - - /** - * Store a new media resource - * - * @param \App\Http\Requests\MediaRequest $request The uploaded media. - * @return \Illuminate\Http\Response - */ - public function store(MediaRequest $request) - { - // allowed to create a media item - if (MediaConductor::creatable() === false) { - return $this->respondForbidden(); - } - - // check for file - $file = $request->file('file'); - if ($file === null) { - return $this->respondWithErrors(['file' => 'The browser did not upload the file correctly to the server.']); - } - - return $this->storeOrUpdate($request, null); - } - - /** - * Update the media resource in storage. - * - * @param \App\Http\Requests\MediaRequest $request The update request. - * @param \App\Models\Media $medium The specified media. - * @return \Illuminate\Http\Response - */ - public function update(MediaRequest $request, Media $medium) - { - // allowed to update a media item - if (MediaConductor::updatable($medium) === false) { - return $this->respondForbidden(); - } - - return $this->storeOrUpdate($request, $medium); - } - - /** - * Store a new media resource - * - * @param \App\Http\Requests\MediaRequest $request The uploaded media. - * @param \App\Models\Media|null $medium The specified media. - * @return \Illuminate\Http\Response - */ - public function storeOrUpdate(MediaRequest $request, Media|null $medium) - { - $file = $request->file('file'); - if ($file !== null) { - // validate file object - if ($file->isValid() !== true) { - switch ($file->getError()) { - case UPLOAD_ERR_INI_SIZE: - case UPLOAD_ERR_FORM_SIZE: - return $this->respondTooLarge(); - case UPLOAD_ERR_PARTIAL: - return $this->respondWithErrors([$file => 'The file upload was interrupted.']); - default: - return $this->respondWithErrors( - [$file => 'An error occurred uploading the file to the server.'] - ); - } - } - - if ($file->getSize() > Media::getMaxUploadSize()) { - return $this->respondTooLarge(); - } - } - - // create/get media job - $mediaJob = null; - $data = []; - - if ($request->missing('job_id') === true) { - /** @var \App\Models\User */ - $user = auth()->user(); - - $mediaJob = new MediaJob(); - $mediaJob->user_id = $user->id; - if ($medium !== null) { - $mediaJob->media_id = $medium->id; - } - - if ($request->has('title') === true || $file !== null) { - $data['title'] = $request->get('title', ''); - } - - if ($request->has('name') === true || $file !== null) { - $data['name'] = ( - $request->has('chunk') === true ? $request->get('name', '') : $file->getClientOriginalName() - ); - } - - if ($file !== null) { - $data['size'] = $request->has('chunk') === true ? intval($request->get('size', 0)) : $file->getSize(); - $data['mime_type'] = ( - $request->has('chunk') === true ? $request->get('mime_type', '') : $file->getMimeType() - ); - } - - if ($request->has('storage') === true || $file !== null) { - $data['storage'] = $request->get('storage', ''); - } - - if ($request->has('security_type') === true || $file !== null) { - $data['security']['type'] = $request->get('security_type', ''); - $data['security']['data'] = $request->get('security_data', ''); - - if ($data['security']['type'] === '') { - $data['security']['data'] = ''; - } - - if ($medium === null || strcasecmp($data['security']['type'], $medium->security_type) !== 0) { - if ($request->has('storage') === false) { - $mime_type = $request->get('mime_type', $medium === null ? '' : $medium->mime_type); - $data['storage'] = Media::recommendedStorage($mime_type, $data['security']['type']); - } - } - } - - if ( - array_key_exists('storage', $data) === true && ( - array_key_exists('security', $data) === true && - array_key_exists('type', $data['security']) === true - ) && - array_key_exists('mime_type', $data) === true && - $data['mime_type'] !== "" - ) { - $error = Media::verifyStorage($data['mime_type'], $data['security']['type'], $data['storage']); - // Log::error($data['mime_type'] . ' - ' . $data['security']['type'] . ' - ' . $data['storage']); - switch ($error) { - case Media::STORAGE_VALID: - break; - case Media::STORAGE_MIME_MISSING: - return $this->respondWithErrors(['mime_type' => 'The file type is required.']); - case Media::STORAGE_NOT_FOUND: - return $this->respondWithErrors(['storage' => 'Storage was not found.']); - case Media::STORAGE_INVALID_SECURITY: - return $this->respondWithErrors( - ['storage' => 'Storage invalid for this security requirement.'] - ); - default: - return $this->respondWithErrors(['storage' => 'Storage verification error occurred.']); - } - } - - if ($request->has('transform') === true) { - $transform = []; - - foreach (explode(',', $request->get('transform', '')) as $value) { - if (is_string($value) === true) { - if (preg_match('/^rotate-(-?\d+)$/', $value, $matches) !== false) { - $transform['rotate'] = $matches[1]; - } elseif (preg_match('/^flip-([vh]|vh|hv)$/', $value, $matches) !== false) { - $transform['flip'] = $matches[1]; - } elseif (preg_match('/^crop-(\d+)-(\d+)$/', $value, $matches) !== false) { - $transform['crop'] = ['width' => $matches[1], 'height' => $matches[2]]; - } elseif (preg_match('/^crop-(\d+)-(\d+)-(\d+)-(\d+)$/', $value, $matches) !== false) { - $transform['crop'] = [ - 'width' => $matches[1], - 'height' => $matches[2], - 'x' => $matches[3], - 'y' => $matches[4] - ]; - } - } - } - - if (count($transform) > 0) { - $data['transform'] = $transform; - } - }//end if - - $mediaJob->setStatusWaiting(); - } else { - $mediaJob = MediaJob::find($request->get('job_id')); - if ($mediaJob === null || $mediaJob->exists() === false) { - $this->respondNotFound(); - } - - $data = json_decode($mediaJob->data, true); - if ($data === null) { - Log::error(`{$mediaJob->id} contains no data`); - return $this->respondServerError(); - } - - if (array_key_exists('name', $data) === false) { - Log::error(`{$mediaJob->id} data does not contain the name key`); - return $this->respondServerError(); - } - }//end if - - if ($mediaJob === null) { - Log::error(`media job does not exist`); - return $this->respondServerError(); - } - - // save uploaded file - if ($file !== null) { - if ($data['name'] === '') { - Log::error(`filename does not exist`); - return $this->respondServerError(); - } - - $temporaryFilePath = generateTempFilePath( - pathinfo($data['name'], PATHINFO_EXTENSION), - $request->get('chunk', '') - ); - copy($file->path(), $temporaryFilePath); - - if ($request->has('chunk') === true) { - $data['chunks'][$request->get('chunk', '1')] = $temporaryFilePath; - $data['chunk_count'] = $request->get('chunk_count', 1); - } else { - $data['file'] = $temporaryFilePath; - } - } - - $mediaJob->data = json_encode($data, true); - $mediaJob->save(); - $mediaJob->process(); - - return $this->respondAsResource( - MediaJobConductor::model($request, $mediaJob), - ['resourceName' => 'media_job', 'respondCode' => HttpResponseCodes::HTTP_ACCEPTED] - ); - } - - /** - * Remove the specified resource from storage. - * - * @param \App\Models\Media $medium Specified media file. - * @return \Illuminate\Http\Response - */ - public function destroy(Media $medium) - { - if (MediaConductor::destroyable($medium) === true) { - $medium->delete(); - return $this->respondNoContent(); - } - - return $this->respondForbidden(); - } - - /** - * Display the specified resource. - * - * @param \Illuminate\Http\Request $request The endpoint request. - * @param \App\Models\Media $media Specified media. - * @return \Illuminate\Http\Response - */ - public function download(Request $request, Media $media): Response - { - $headers = []; - - /* Check file exists */ - if (Storage::disk($media->storage)->exists($media->name) === false) { - return $this->respondNotFound(); - } - - $updated_at = Carbon::parse(Storage::disk($media->storage)->lastModified($media->name)); - - $headerPragma = 'no-cache'; - $headerCacheControl = 'max-age=0, must-revalidate'; - $headerExpires = $updated_at->toRfc2822String(); - - /* construct user if can */ - $user = $request->user(); - if ($user === null && $request->has('token') === true) { - $accessToken = PersonalAccessToken::findToken(urldecode($request->input('token'))); - - if ( - $accessToken !== null && (config('sanctum.expiration') === null || - $accessToken->created_at->lte(now()->subMinutes(config('sanctum.expiration'))) === false) - ) { - $user = $accessToken->tokenable; - } - } - - if ($media->security_type === '') { - /* no security */ - $headerPragma = 'public'; - $headerExpires = $updated_at->addMonth()->toRfc2822String(); - } elseif (strcasecmp('password', $media->security_type) === 0) { - /* password */ - if ( - ($user === null || $user->hasPermission('admin/media') === false) && - ($request->has('password') === false || $request->get('password') !== $media->security_data) - ) { - return $this->respondForbidden(); - } - } elseif (strcasecmp('permission', $media->security_type) === 0) { - /* permission */ - if ( - $user === null || ( - $user->hasPermission('admin/media') === false && - $user->hasPermission($media->security_data) === false - ) - ) { - return $this->respondForbidden(); - } - }//end if - - // deepcode ignore InsecureHash: Browsers expect Etag to be a md5 hash - $headerEtag = md5($updated_at->format('U')); - $headerLastModified = $updated_at->toRfc2822String(); - - $headers = [ - 'Cache-Control' => $headerCacheControl, - 'Content-Disposition' => sprintf('inline; filename="%s"', basename($media->name)), - 'Etag' => $headerEtag, - 'Expires' => $headerExpires, - 'Last-Modified' => $headerLastModified, - 'Pragma' => $headerPragma, - ]; - - $server = request()->server; - - $requestModifiedSince = $server->has('HTTP_IF_MODIFIED_SINCE') && - $server->get('HTTP_IF_MODIFIED_SINCE') === $headerLastModified; - - $requestNoneMatch = $server->has('HTTP_IF_NONE_MATCH') && - $server->get('HTTP_IF_NONE_MATCH') === $headerEtag; - - if ($requestModifiedSince === true || $requestNoneMatch === true) { - return response()->make('', 304, $headers); - } - - $headers['Content-Type'] = Storage::disk($media->storage)->mimeType($media->name); - $headers['Content-Length'] = Storage::disk($media->storage)->size($media->name); - $headers['Content-Disposition'] = 'attachment; filename="' . basename($media->name) . '"'; - - $stream = Storage::disk($media->storage)->readStream($media->name); - return response()->stream( - function () use ($stream) { - while (ob_get_level() > 0) { - ob_end_flush(); - } - fpassthru($stream); - }, - 200, - $headers - ); - } - - /** - * Validate a File item in a request is valid - * - * @param UploadedFile $file The file to validate. - * @param string $errorKey The error key to use. - * @return JsonResponse|null - */ - private function validateFileObject(UploadedFile $file, string $errorKey = 'file'): JsonResponse|null - { - if ($file->isValid() !== true) { - switch ($file->getError()) { - case UPLOAD_ERR_INI_SIZE: - case UPLOAD_ERR_FORM_SIZE: - return $this->respondTooLarge(); - case UPLOAD_ERR_PARTIAL: - return $this->respondWithErrors([$errorKey => 'The file upload was interrupted.']); - default: - return $this->respondWithErrors( - [$errorKey => 'An error occurred uploading the file to the server.'] - ); - } - } - - if ($file->getSize() > Media::getMaxUploadSize()) { - return $this->respondTooLarge(); - } - - return null; - } -} diff --git a/app/Http/Controllers/Api/MediaJobController.php b/app/Http/Controllers/Api/MediaJobController.php deleted file mode 100644 index daa1c22..0000000 --- a/app/Http/Controllers/Api/MediaJobController.php +++ /dev/null @@ -1,52 +0,0 @@ -respondAsResource( - $collection, - ['isCollection' => true, - 'appendData' => ['total' => $total], - 'resourceName' => 'media_job' - ], - function ($options) { - return $options['total'] === 0; - } - ); - } - - /** - * Display the specified resource. - * - * @param \Illuminate\Http\Request $request The endpoint request. - * @param \App\Models\MediaJob $mediaJob The request media job. - * @return \Illuminate\Http\Response - */ - public function show(Request $request, MediaJob $mediaJob) - { - if (MediaJobConductor::viewable($mediaJob) === true) { - return $this->respondAsResource( - MediaJobConductor::model($request, $mediaJob), - ['resourceName' => 'media_job'] - ); - } - - return $this->respondForbidden(); - } -} diff --git a/app/Http/Controllers/Api/OCRController.php b/app/Http/Controllers/Api/OCRController.php deleted file mode 100644 index 7c2cce5..0000000 --- a/app/Http/Controllers/Api/OCRController.php +++ /dev/null @@ -1,234 +0,0 @@ -middleware('auth:sanctum') - // ->only(['show']); - } - - /** - * Display the specified resource. - * - * @param Request $request The log request. - * @return \Illuminate\Http\Response - */ - public function show(Request $request) - { - // if ($request->user()?->hasPermission('logs/' . $name) === true) { - $url = $request->get('url'); - if ($url !== null) { - $data = ['ocr' => []]; - - $filters = $request->get('filters', ['tesseract']); - if (is_array($filters) === false) { - $filters = explode(',', $filters); - } - - $tesseractOEM = $request->get('tesseract.oem'); - $tesseractDigits = $request->get('tesseract.digits'); - $tesseractAllowlist = $request->get('tesseract.allowlist'); - - // Download URL - $urlDownloadFilePath = tempnam(sys_get_temp_dir(), 'download'); - $maxDownloadSize = (1024 * 1024); // 1MB - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - - // We need progress updates to break the connection mid-way - curl_setopt($ch, CURLOPT_BUFFERSIZE, 128); // more progress info - curl_setopt($ch, CURLOPT_NOPROGRESS, false); - curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, function ( - $downloadSize, - $downloaded, - $uploadSize, - $uploaded - ) use ($maxDownloadSize) { - return ($downloaded > $maxDownloadSize) ? 1 : 0; - }); - - $curlResult = curl_exec($ch); - $curlError = curl_errno($ch); - $curlSize = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); - curl_close($ch); - if ($curlError !== 0) { - $error = 'File size is larger then allowed'; - if ($curlError !== CurlErrorCodes::CURLE_ABORTED_BY_CALLBACK) { - $error = CurlErrorCodes::getMessage($curlError); - } - - return $this->respondWithErrors(['url' => $error]); - } - - // Save url file - file_put_contents($urlDownloadFilePath, $curlResult); - $urlDownloadFilePathBase = preg_replace('/\\.[^.\\s]{3,4}$/', '', $urlDownloadFilePath); - - // tesseract (overall) - $ocr = null; - foreach ($filters as $filterItem) { - if (str_starts_with($filterItem, 'tesseract') === true) { - $ocr = new TesseractOCR(); - $ocr->image($urlDownloadFilePath); - if ($tesseractOEM !== null) { - $ocr->oem($tesseractOEM); - } - if ($tesseractDigits !== null) { - $ocr->digits(); - } - if ($tesseractAllowlist !== null) { - $ocr->allowlist($tesseractAllowlist); - } - break; - } - } - - // Image Filter Function - $tesseractImageFilterFunc = function ($filter, $options = null) use ($curlResult, $curlSize, $ocr) { - $result = ''; - $img = imagecreatefromstring($curlResult); - if ( - $img !== false && (($options !== null && imagefilter($img, $filter, $options) === true) || - ($options === null && imagefilter($img, $filter) === true)) - ) { - ob_start(); - imagepng($img); - $imgData = ob_get_contents(); - ob_end_clean(); - $imgDataSize = strlen($imgData); - - $ocr->imageData($imgData, $imgDataSize); - imagedestroy($img); - - $result = $ocr->run(500); - } - - return $result; - }; - - // Image Scale Function - $tesseractImageScaleFunc = function ($scaleFunc) use ($curlResult, $ocr) { - $result = ''; - $srcImage = imagecreatefromstring($curlResult); - $srcWidth = imagesx($srcImage); - $srcHeight = imagesy($srcImage); - - $dstWidth = $scaleFunc($srcWidth); - $dstHeight = $scaleFunc($srcHeight); - $dstImage = imagecreatetruecolor($dstWidth, $dstHeight); - - imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, $dstWidth, $dstHeight, $srcWidth, $srcHeight); - - ob_start(); - imagepng($dstImage); - $imgData = ob_get_contents(); - ob_end_clean(); - $imgDataSize = strlen($imgData); - - imagedestroy($srcImage); - imagedestroy($dstImage); - - $ocr->imageData($imgData, $imgDataSize); - $result = $ocr->run(500); - return $result; - }; - - // filter: tesseract - if (in_array('tesseract', $filters) === true) { - $data['ocr']['tesseract'] = $ocr->run(500); - } - - // filter: tesseract.grayscale - if (in_array('tesseract.grayscale', $filters) === true) { - $data['ocr']['tesseract.grayscale'] = $tesseractImageFilterFunc(IMG_FILTER_GRAYSCALE); - } - - // filter: tesseract.double_scale - if (in_array('tesseract.double_scale', $filters) === true) { - $data['ocr']['tesseract.double_scale'] = $tesseractImageScaleFunc(function ($size) { - return $size * 2; - }); - } - - // filter: tesseract.half_scale - if (in_array('tesseract.half_scale', $filters) === true) { - $data['ocr']['tesseract.half_scale'] = $tesseractImageScaleFunc(function ($size) { - return $size / 2; - }); - } - - // filter: tesseract.edgedetect - if (in_array('tesseract.edgedetect', $filters) === true) { - $data['ocr']['tesseract.edgedetect'] = $tesseractImageFilterFunc(IMG_FILTER_EDGEDETECT); - } - - // filter: tesseract.mean_removal - if (in_array('tesseract.mean_removal', $filters) === true) { - $data['ocr']['tesseract.mean_removal'] = $tesseractImageFilterFunc(IMG_FILTER_MEAN_REMOVAL); - } - - // filter: tesseract.negate - if (in_array('tesseract.negate', $filters) === true) { - $data['ocr']['tesseract.negate'] = $tesseractImageFilterFunc(IMG_FILTER_NEGATE); - } - - // filter: tesseract.pixelate - if (in_array('tesseract.pixelate', $filters) === true) { - $data['ocr']['tesseract.pixelate'] = $tesseractImageFilterFunc(IMG_FILTER_PIXELATE, 3); - } - - // filter: keras - if (in_array('keras', $filters) === true) { - $cmd = '/usr/bin/python3 ' . base_path() . '/scripts/keras_oc.py ' . urlencode($url); - $command = escapeshellcmd($cmd); - $output = shell_exec($cmd); - if ($output !== null && strlen($output) > 0) { - $output = substr($output, (strpos($output, '----------START----------') + 25)); - } else { - $output = ''; - } - $data['ocr']['keras'] = $output; - } - - unlink($urlDownloadFilePath); - return $this->respondJson($data); - }//end if - - return $this->respondWithErrors(['url' => 'url is missing']); - } - - // $ffmpeg = FFMpeg\FFMpeg::create(); - - // // Load the input video - // $inputFile = $ffmpeg->open('input.mp4'); - - // // Split the video into individual frames - // $videoFrames = $inputFile->frames(); - // foreach ($videoFrames as $frame) { - // // Save the frame as a PNG - // $frame->save(new FFMpeg\Format\Video\PNG(), 'frame-' . $frame->getMetadata('pts') . '.png'); - - // // Pass the PNG to Tesseract for processing - // exec("tesseract frame-" . $frame->getMetadata('pts') . ".png output"); - // } - - // // Read the output from Tesseract - // $text = file_get_contents("output.txt"); - - // // Do something with the text from Tesseract - // echo $text; -} diff --git a/app/Http/Controllers/Api/ShortlinkController.php b/app/Http/Controllers/Api/ShortlinkController.php deleted file mode 100644 index a8d1c23..0000000 --- a/app/Http/Controllers/Api/ShortlinkController.php +++ /dev/null @@ -1,111 +0,0 @@ -middleware('auth:sanctum') - ->only(['store','update','destroy']); - } - - /** - * Display a listing of the resource. - * - * @param \Illuminate\Http\Request $request The endpoint request. - * @return \Illuminate\Http\Response - */ - public function index(Request $request) - { - list($collection, $total) = ShortlinkConductor::request($request); - - return $this->respondAsResource( - $collection, - ['isCollection' => true, - 'appendData' => ['total' => $total] - ], - function ($options) { - return $options['total'] === 0; - } - ); - } - - /** - * Display the specified resource. - * - * @param \Illuminate\Http\Request $request The endpoint request. - * @param \App\Models\Shortlink $shortlink The request shortlink. - * @return \Illuminate\Http\Response - */ - public function show(Request $request, Shortlink $shortlink) - { - if (ShortlinkConductor::viewable($shortlink) === true) { - return $this->respondAsResource(ShortlinkConductor::model($request, $shortlink)); - } - - return $this->respondForbidden(); - } - - /** - * Store a new media resource - * - * @param \App\Http\Requests\ShortlinkRequest $request The shortlink. - * @return \Illuminate\Http\Response - */ - public function store(ShortlinkRequest $request) - { - if (ShortlinkConductor::creatable() === true) { - $shortlink = Shortlink::create($request->all()); - - return $this->respondAsResource( - ShortlinkConductor::model($request, $shortlink), - ['respondCode' => HttpResponseCodes::HTTP_ACCEPTED] - ); - }//end if - - return $this->respondForbidden(); - } - - /** - * Update the media resource in storage. - * - * @param \App\Http\Requests\ShortlinkRequest $request The update request. - * @param \App\Models\Shortlink $shortlink The specified shortlink. - * @return \Illuminate\Http\Response - */ - public function update(ShortlinkRequest $request, Shortlink $shortlink) - { - if (ShortlinkConductor::updatable($shortlink) === true) { - $shortlink->update($request->all()); - return $this->respondAsResource(ShortlinkConductor::model($request, $shortlink)); - }//end if - - return $this->respondForbidden(); - } - - /** - * Remove the specified resource from storage. - * - * @param \App\Models\Shortlink $shortlink Specified shortlink. - * @return \Illuminate\Http\Response - */ - public function destroy(Shortlink $shortlink) - { - if (ShortlinkConductor::destroyable($shortlink) === true) { - $shortlink->delete(); - return $this->respondNoContent(); - } - - return $this->respondForbidden(); - } -} diff --git a/app/Http/Controllers/Api/UserController.php b/app/Http/Controllers/Api/UserController.php deleted file mode 100644 index 3cea08a..0000000 --- a/app/Http/Controllers/Api/UserController.php +++ /dev/null @@ -1,369 +0,0 @@ -middleware('auth:sanctum') - ->except([ - 'index', - 'show', - 'register', - 'exists', - 'forgotPassword', - 'resetPassword', - 'verifyEmail', - 'resendVerifyEmailCode', - 'eventList', - ]); - } - - /** - * Display a listing of the resource. - * - * @param \Illuminate\Http\Request $request The endpoint request. - * @return \Illuminate\Http\Response - */ - public function index(Request $request) - { - list($collection, $total) = UserConductor::request($request); - - return $this->respondAsResource( - $collection, - ['isCollection' => true, - 'appendData' => ['total' => $total] - ] - ); - } - - /** - * Store a newly created user in the database. - * - * @param \App\Http\Requests\UserRequest $request The endpoint request. - * @return \Illuminate\Http\Response - */ - public function store(UserRequest $request) - { - if (UserConductor::creatable() === true) { - $user = User::create($request->all()); - return $this->respondAsResource( - UserConductor::model($request, $user), - ['respondCode' => HttpResponseCodes::HTTP_CREATED] - ); - } else { - return $this->respondForbidden(); - } - } - - /** - * Display the specified user. - * - * @param \Illuminate\Http\Request $request The endpoint request. - * @param \App\Models\User $user The user model. - * @return \Illuminate\Http\Response - */ - public function show(Request $request, User $user) - { - if (UserConductor::viewable($user) === true) { - return $this->respondAsResource(UserConductor::model($request, $user)); - } - - return $this->respondForbidden(); - } - - /** - * Update the specified resource in storage. - * - * @param \App\Http\Requests\UserRequest $request The user update request. - * @param \App\Models\User $user The specified user. - * @return \Illuminate\Http\Response - */ - public function update(UserRequest $request, User $user) - { - if (UserConductor::updatable($user) === true) { - $input = []; - $updatable = ['first_name', 'last_name', 'email', 'phone', 'password', 'display_name']; - - if ($request->user()->hasPermission('admin/user') === true) { - $updatable = array_merge($updatable, ['email_verified_at']); - } - - $input = $request->only($updatable); - if (array_key_exists('password', $input) === true) { - $input['password'] = Hash::make($request->input('password')); - } - - $user->update($input); - - return $this->respondAsResource(UserConductor::model($request, $user)); - } - - return $this->respondForbidden(); - } - - /** - * Remove the user from the database. - * - * @param \App\Models\User $user The specified user. - * @return \Illuminate\Http\Response - */ - public function destroy(User $user) - { - if (UserConductor::destroyable($user) === true) { - $user->delete(); - return $this->respondNoContent(); - } - - return $this->respondForbidden(); - } - - /** - * Register a new user - * - * @param \App\Http\Requests\UserRegisterRequest $request The register user request. - * @return JsonResponse - */ - public function register(UserRegisterRequest $request): JsonResponse - { - try { - $userData = $request->only([ - 'first_name', - 'last_name', - 'email', - 'phone', - 'password', - 'display_name', - ]); - - $userData['password'] = Hash::make($userData['password']); - - $user = User::where('email', $request->input('email')) - ->whereNull('password') - ->first(); - - if ($user === null) { - $user = User::create($userData); - } else { - unset($userData['email']); - $user->update($userData); - }//end if - - $code = $user->codes()->create([ - 'action' => 'verify-email', - ]); - - dispatch((new SendEmailJob($user->email, new EmailVerify($user, $code->code))))->onQueue('mail'); - - return response()->json([ - 'message' => 'Check your email for a welcome code.' - ]); - } catch (\Exception $e) { - return response()->json([ - 'message' => 'A server error occurred. Please try again later' . $e - ], 500); - }//end try - } - - /** - * Generates a new reset password code - * - * @param \App\Http\Requests\UserForgotPasswordRequest $request The reset password request. - * @return \Illuminate\Http\Response - */ - public function forgotPassword(UserForgotPasswordRequest $request) - { - $user = User::where('email', $request->input('email'))->first(); - if ($user !== null) { - $user->codes()->where('action', 'reset-password')->delete(); - $code = $user->codes()->create([ - 'action' => 'reset-password' - ]); - - dispatch((new SendEmailJob($user->email, new ForgotPassword($user, $code->code))))->onQueue('mail'); - return $this->respondNoContent(); - } - - return $this->respondNotFound(); - } - - /** - * Resets a user password - * - * @param \App\Http\Requests\UserResetPasswordRequest $request The reset password request. - * @return \Illuminate\Http\Response - */ - public function resetPassword(UserResetPasswordRequest $request) - { - UserCode::clearExpired(); - - $code = UserCode::where('code', $request->input('code'))->where('action', 'reset-password')->first(); - if ($code !== null) { - $user = $code->user()->first(); - - $code->delete(); - $user->codes()->where('action', 'verify-email')->delete(); - - $user->password = Hash::make($request->input('password')); - - if ($user->email_verified_at === null) { - $user->email_verified_at = now(); - } - - $user->save(); - - dispatch((new SendEmailJob($user->email, new ChangedPassword($user))))->onQueue('mail'); - return $this->respondNoContent(); - } - - return $this->respondError([ - 'code' => 'The code was not found or has expired.' - ]); - } - - /** - * Verify an email code - * - * @param \App\Http\Requests\UserVerifyEmailRequest $request The verify email request. - * @return \Illuminate\Http\Response - */ - public function verifyEmail(UserVerifyEmailRequest $request) - { - UserCode::clearExpired(); - - $code = UserCode::where('code', $request->input('code'))->where('action', 'verify-email')->first(); - if ($code !== null) { - $user = $code->user()->first(); - $new_email = $code->data; - - if ($new_email === null) { - if ($user->email_verified_at === null) { - $user->email_verified_at = now(); - } - } else { - dispatch((new SendEmailJob($user->email, new ChangedEmail($user, $user->email, $new_email)))) - ->onQueue('mail'); - - $user->email = $new_email; - $user->email_verified_at = now(); - } - - $code->delete(); - $user->save(); - - return $this->respondNoContent(); - }//end if - - return $this->respondWithErrors([ - 'code' => 'The code was not found or has expired.' - ]); - } - - /** - * Resend a new verify email - * - * @param \App\Http\Requests\UserResendVerifyEmailRequest $request The resend verify email request. - * @return JsonResponse - */ - public function resendVerifyEmail(UserResendVerifyEmailRequest $request): JsonResponse - { - UserCode::clearExpired(); - - $user = User::where('email', $request->input('email'))->first(); - if ($user !== null) { - $code = $user->codes()->where('action', 'verify-email')->first(); - $code->regenerate(); - $code->save(); - - if ($code->data === null) { - dispatch((new SendEmailJob($user->email, new EmailVerify($user, $code->code))))->onQueue('mail'); - } else { - dispatch((new SendEmailJob($user->email, new ChangeEmailVerify($user, $code->code, $code->data)))) - ->onQueue('mail'); - } - } - - return response()->json(['message' => 'Verify email sent if user registered and required']); - } - - /** - * Resend verification email - * - * @param \App\Http\Requests\UserResendVerifyEmailRequest $request The resend user request. - * @return \Illuminate\Http\Response - */ - public function resendVerifyEmailCode(UserResendVerifyEmailRequest $request) - { - $user = User::where('email', $request->input('email'))->first(); - if ($user !== null) { - $user->codes()->where('action', 'verify-email')->delete(); - - if ($user->email_verified_at === null) { - $code = $user->codes()->create([ - 'action' => 'verify-email' - ]); - - dispatch((new SendEmailJob($user->email, new EmailVerify($user, $code->code))))->onQueue('mail'); - } - - return $this->respondNoContent(); - } - - return $this->respondNotFound(); - } - - /** - * Return a JSON event list of a user. - * - * @param Request $request The http request. - * @param User $user The specified user. - * @return JsonResponse - */ - public function eventList(Request $request, User $user): JsonResponse - { - if ( - $request->user() !== null && ( - $request->user() === $user || $request->user()->hasPermission('admin/events') === true - ) - ) { - $collection = $user->events; - $total = $collection->count(); - - $collection = EventConductor::collection($request, $collection); - return $this->respondAsResource( - $collection, - ['isCollection' => true, - 'appendData' => ['total' => $total] - ] - ); - } else { - return $this->respondForbidden(); - } - } -} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index f1406be..77ec359 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -8,6 +8,5 @@ use Illuminate\Routing\Controller as BaseController; class Controller extends BaseController { - use AuthorizesRequests; - use ValidatesRequests; + use AuthorizesRequests, ValidatesRequests; } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 7b83b74..494c050 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -19,8 +19,8 @@ class Kernel extends HttpKernel \Illuminate\Http\Middleware\HandleCors::class, \App\Http\Middleware\PreventRequestsDuringMaintenance::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, - // \App\Http\Middleware\TrimStrings::class, - // \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, + \App\Http\Middleware\TrimStrings::class, + \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, ]; /** @@ -40,19 +40,15 @@ class Kernel extends HttpKernel 'api' => [ // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, - \Illuminate\Routing\Middleware\ThrottleRequests::class . ':api', + \Illuminate\Routing\Middleware\ThrottleRequests::class.':api', \Illuminate\Routing\Middleware\SubstituteBindings::class, - // \App\Http\Middleware\ForceJsonResponse::class, - \App\Http\Middleware\UnmangleRequest::class, - 'useSanctumGuard', - \App\Http\Middleware\LogRequest::class, ], ]; /** * The application's middleware aliases. * - * Aliases may be used to conveniently assign middleware to routes and groups. + * Aliases may be used instead of class names to conveniently assign middleware to routes and groups. * * @var array */ @@ -63,11 +59,10 @@ class Kernel extends HttpKernel 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, - 'unmangle' => \App\Http\Middleware\UnmangleRequest::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class, 'signed' => \App\Http\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, - 'useSanctumGuard' => \App\Http\Middleware\UseSanctumGuard::class ]; } diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 9515a4a..d4ef644 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -3,21 +3,15 @@ namespace App\Http\Middleware; use Illuminate\Auth\Middleware\Authenticate as Middleware; +use Illuminate\Http\Request; class Authenticate extends Middleware { /** * Get the path the user should be redirected to when they are not authenticated. - * - * @param mixed $request Request. - * @return ?string */ - protected function redirectTo(mixed $request): ?string + protected function redirectTo(Request $request): ?string { - if ($request->expectsJson() === false) { - return route('login'); - } - - return null; + return $request->expectsJson() ? null : route('login'); } } diff --git a/app/Http/Middleware/ForceJsonResponse.php b/app/Http/Middleware/ForceJsonResponse.php deleted file mode 100644 index cdfa47e..0000000 --- a/app/Http/Middleware/ForceJsonResponse.php +++ /dev/null @@ -1,21 +0,0 @@ -headers->set('Accept', 'application/json'); - return $next($request); - } -} diff --git a/app/Http/Middleware/LogRequest.php b/app/Http/Middleware/LogRequest.php deleted file mode 100644 index 07e984c..0000000 --- a/app/Http/Middleware/LogRequest.php +++ /dev/null @@ -1,36 +0,0 @@ - 'apirequest', - 'path' => $request->path(), - ]); - - return $response; - } catch (\Error $e) { - report($e); - return $response; - } - } -} diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index 5ee6f4b..afc78c4 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -2,28 +2,25 @@ namespace App\Http\Middleware; -use Symfony\Component\HttpFoundation\Response; use App\Providers\RouteServiceProvider; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Symfony\Component\HttpFoundation\Response; class RedirectIfAuthenticated { /** * Handle an incoming request. * - * @param Request $request Request. - * @param \Closure $next Closure. - * @param string|null ...$guards Guards. - * @return Response + * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ public function handle(Request $request, Closure $next, string ...$guards): Response { - $guards = empty($guards) === true ? [null] : $guards; + $guards = empty($guards) ? [null] : $guards; foreach ($guards as $guard) { - if (Auth::guard($guard)->check() === true) { + if (Auth::guard($guard)->check()) { return redirect(RouteServiceProvider::HOME); } } diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index 3123f50..3391630 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -17,9 +17,12 @@ class TrustProxies extends Middleware /** * The headers that should be used to detect proxies. * - * @var integer + * @var int */ - // @codingStandardsIgnoreStart - protected $headers = (Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO | Request::HEADER_X_FORWARDED_AWS_ELB); - // @codingStandardsIgnoreEnd + protected $headers = + Request::HEADER_X_FORWARDED_FOR | + Request::HEADER_X_FORWARDED_HOST | + Request::HEADER_X_FORWARDED_PORT | + Request::HEADER_X_FORWARDED_PROTO | + Request::HEADER_X_FORWARDED_AWS_ELB; } diff --git a/app/Http/Middleware/UnmangleRequest.php b/app/Http/Middleware/UnmangleRequest.php deleted file mode 100644 index a903651..0000000 --- a/app/Http/Middleware/UnmangleRequest.php +++ /dev/null @@ -1,47 +0,0 @@ -all(); - - $string = $_SERVER['QUERY_STRING']; - $parts = explode('&', $string); - foreach ($parts as $part) { - $key = $part; - $splitPos = strpos($key, '='); - if ($splitPos !== false) { - $key = urldecode(substr($key, 0, $splitPos)); - } - - $replace_key = str_replace('.', '_', $key); - if (strpos($key, '.') !== false && array_key_exists($replace_key, $params) === true) { - $params[$key] = $params[$replace_key]; - unset($params[$replace_key]); - } - } - - $request->replace($params); - }//end if - - return $next($request); - } -} diff --git a/app/Http/Middleware/UseSanctumGuard.php b/app/Http/Middleware/UseSanctumGuard.php deleted file mode 100644 index 24a6c21..0000000 --- a/app/Http/Middleware/UseSanctumGuard.php +++ /dev/null @@ -1,24 +0,0 @@ - - */ - public function postRules(): array - { - return [ - 'type' => 'required|string', - ]; - } - - /** - * Get the validation rules that apply to PUT request. - * - * @return array - */ - public function putRules(): array - { - return [ - 'type' => 'string', - 'useragent' => 'string', - 'ip' => 'ipv4|ipv6', - 'session' => 'number', - ]; - } -} diff --git a/app/Http/Requests/ArticleRequest.php b/app/Http/Requests/ArticleRequest.php deleted file mode 100644 index 2ad76d7..0000000 --- a/app/Http/Requests/ArticleRequest.php +++ /dev/null @@ -1,46 +0,0 @@ - - */ - public function postRules(): array - { - return [ - 'slug' => 'required|string|min:6|unique:articles', - 'title' => 'required|string|min:6|max:255', - 'publish_at' => 'required|date', - 'user_id' => 'required|uuid|exists:users,id', - 'content' => 'required|string|min:6', - 'hero' => 'required|uuid|exists:media,id', - ]; - } - - /** - * Get the validation rules that apply to PUT request. - * - * @return array - */ - public function putRules(): array - { - return [ - 'slug' => [ - 'string', - 'min:6', - Rule::unique('articles')->ignoreModel($this->article), - ], - 'title' => 'string|min:6|max:255', - 'publish_at' => 'date', - 'user_id' => 'uuid|exists:users,id', - 'content' => 'string|min:6', - 'hero' => 'uuid|exists:media,id', - ]; - } -} diff --git a/app/Http/Requests/AuthLoginRequest.php b/app/Http/Requests/AuthLoginRequest.php deleted file mode 100644 index f450276..0000000 --- a/app/Http/Requests/AuthLoginRequest.php +++ /dev/null @@ -1,21 +0,0 @@ - - */ - public function rules(): array - { - return [ - 'email' => 'required|string|min:6|max:255', - 'password' => 'required|string|min:6', - ]; - } -} diff --git a/app/Http/Requests/BaseRequest.php b/app/Http/Requests/BaseRequest.php deleted file mode 100644 index ac1e009..0000000 --- a/app/Http/Requests/BaseRequest.php +++ /dev/null @@ -1,107 +0,0 @@ -isMethod('post') === true && method_exists($this, 'postAuthorize') === true) { - return $this->postAuthorize(); - } elseif ( - ( - request()->isMethod('put') === true || request()->isMethod('patch') === true - ) && method_exists($this, 'putAuthorize') === true - ) { - return $this->putAuthorize(); - } elseif (request()->isMethod('delete') === true && method_exists($this, 'destroyAuthorize') === true) { - return $this->deleteAuthorize(); - } - - return true; - } - - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function rules(): array - { - $rules = []; - - if (method_exists($this, 'baseRules') === true) { - $rules = $this->baseRules(); - } - - if (method_exists($this, 'postRules') === true && request()->isMethod('post') === true) { - $rules = $this->mergeRules($rules, $this->postRules()); - } elseif ( - method_exists($this, 'putRules') === true && ( - request()->isMethod('put') === true || request()->isMethod('patch') === true - ) - ) { - $rules = $this->mergeRules($rules, $this->putRules()); - } elseif (method_exists($this, 'destroyRules') === true && request()->isMethod('delete') === true) { - $rules = $this->mergeRules($rules, $this->destroyRules()); - } - - return $rules; - } - - /** - * Merge two collections of rules. - * - * @param array $collection1 The first collection of rules. - * @param array $collection2 The second collection of rules to merge. - * @return array - */ - private function mergeRules(array $collection1, array $collection2): array - { - $rules = []; - - foreach ($collection1 as $key => $ruleset) { - if (array_key_exists($key, $collection2) === true) { - if (is_string($collection1[$key]) === true && is_string($collection2[$key]) === true) { - $rules[$key] = $collection1[$key] . '|' . $collection2[$key]; - } else { - $key_ruleset = []; - - if (is_array($collection1[$key]) === true) { - $key_ruleset = $collection1[$key]; - } elseif (is_string($collection1[$key]) === true) { - $key_ruleset = explode('|', $collection1[$key]); - } - - if (is_array($collection2[$key]) === true) { - $key_ruleset = array_merge($key_ruleset, $collection2[$key]); - } elseif (is_string($collection2[$key]) === true) { - $key_ruleset = array_merge($key_ruleset, explode('|', $collection2[$key])); - } - - if (count($key_ruleset) > 0) { - $rules[$key] = $key_ruleset; - } - }//end if - } else { - $rules[$key] = $ruleset; - }//end if - }//end foreach - - foreach ($collection2 as $key => $ruleset) { - if (array_key_exists($key, $rules) === false) { - $rules[$key] = $collection2[$key]; - } - } - - return $rules; - } -} diff --git a/app/Http/Requests/ContactSendRequest.php b/app/Http/Requests/ContactSendRequest.php deleted file mode 100644 index fc9881e..0000000 --- a/app/Http/Requests/ContactSendRequest.php +++ /dev/null @@ -1,24 +0,0 @@ - - */ - public function rules(): array - { - return [ - 'name' => 'required|max:255', - 'email' => 'required|email|max:255', - 'content' => 'required|max:2000', - // 'captcha_token' => [new Recaptcha()], - ]; - } -} diff --git a/app/Http/Requests/EventRequest.php b/app/Http/Requests/EventRequest.php deleted file mode 100644 index e6eeb99..0000000 --- a/app/Http/Requests/EventRequest.php +++ /dev/null @@ -1,59 +0,0 @@ - - */ - public function baseRules(): array - { - return [ - 'title' => 'min:6', - 'location' => [ - Rule::in(['online', 'physical']), - ], - 'address' => 'string|nullable', - 'start_at' => 'date', - 'end_at' => 'date|after:start_date', - 'publish_at' => 'date|nullable', - 'status' => [ - Rule::in(['draft', 'soon', 'open', 'closed', 'cancelled', 'scheduled', 'full']), - ], - 'registration_type' => [ - Rule::in(['none', 'email', 'link', 'message']), - ], - 'registration_data' => [ - Rule::when(strcasecmp('email', $this->attributes->get('registration_type')) == 0, 'required|email'), - Rule::when(strcasecmp('link', $this->attributes->get('registration_type')) == 0, 'required|url'), - Rule::when(strcasecmp('message', $this->attributes->get('registration_type')) == 0, 'required|message'), - ], - 'hero' => 'uuid|exists:media,id', - 'location_url' => 'sometimes|string|max:255', - ]; - } - - /** - * Apply the additional POST base rules to this request - * - * @return array - */ - protected function postRules(): array - { - return [ - 'title' => 'required', - 'location' => 'required', - 'address' => 'required_if:location,physical', - 'start_at' => 'required', - 'end_at' => 'required', - 'status' => 'required', - 'registration_type' => 'required', - 'hero' => 'required', - ]; - } -} diff --git a/app/Http/Requests/MediaRequest.php b/app/Http/Requests/MediaRequest.php deleted file mode 100644 index 5becd25..0000000 --- a/app/Http/Requests/MediaRequest.php +++ /dev/null @@ -1,33 +0,0 @@ - [ - Rule::requiredIf(function () { - return request()->has('chunk') && request('chunk') != 1; - }), - 'string', - ], - 'name' => [ - Rule::requiredIf(function () { - return request()->has('chunk') && request('chunk') == 1; - }), - 'string', - ], - 'chunk' => 'required_with:chunk_count|integer|min:1|max:999|lte:chunk_count', - 'chunk_count' => 'required_with:chunk|integer|min:1', - ]; - } -} diff --git a/app/Http/Requests/ShortlinkRequest.php b/app/Http/Requests/ShortlinkRequest.php deleted file mode 100644 index 2a3b67c..0000000 --- a/app/Http/Requests/ShortlinkRequest.php +++ /dev/null @@ -1,36 +0,0 @@ - - */ - public function postRules(): array - { - return [ - 'code' => 'required|string|max:255|min:2|unique:shortlinks', - 'url' => 'required|string|max:255|min:2', - ]; - } - - /** - * Get the validation rules that apply to PUT request. - * - * @return array - */ - public function putRules(): array - { - $shortlink = $this->route('shortlink'); - - return [ - 'code' => ['required', 'string', 'max:255', 'min:2', Rule::unique('shortlinks')->ignore($shortlink->id)], - 'url' => 'required|string|max:255|min:2', - ]; - } -} diff --git a/app/Http/Requests/SubscriptionRequest.php b/app/Http/Requests/SubscriptionRequest.php deleted file mode 100644 index 7395fe8..0000000 --- a/app/Http/Requests/SubscriptionRequest.php +++ /dev/null @@ -1,46 +0,0 @@ - - */ - public function postRules(): array - { - return [ - 'email' => 'required|email|unique:subscriptions', - // 'captcha_token' => [new Recaptcha()], - ]; - } - - /** - * Get the validation rules that apply to the request. - * - * @return array - */ - public function destroyRules(): array - { - return [ - 'email' => 'required|email', - // 'captcha_token' => [new Recaptcha()], - ]; - } - - /** - * Get the custom error messages. - * - * @return array - */ - public function messages(): array - { - return [ - 'email.unique' => 'This email address has already subscribed', - ]; - } -} diff --git a/app/Http/Requests/UserForgotPasswordRequest.php b/app/Http/Requests/UserForgotPasswordRequest.php deleted file mode 100644 index c45d56f..0000000 --- a/app/Http/Requests/UserForgotPasswordRequest.php +++ /dev/null @@ -1,22 +0,0 @@ - - */ - public function rules(): array - { - return [ - 'email' => 'required|exists:users,email', - // 'captcha_token' => [new Recaptcha()], - ]; - } -} diff --git a/app/Http/Requests/UserRegisterRequest.php b/app/Http/Requests/UserRegisterRequest.php deleted file mode 100644 index 5557663..0000000 --- a/app/Http/Requests/UserRegisterRequest.php +++ /dev/null @@ -1,23 +0,0 @@ - - */ - public function rules(): array - { - return [ - 'display_name' => ['required','string','max:255', new Uniqueish('users')], - 'email' => 'required|string|email|max:255|unique:users', - 'password' => 'required|string|min:8', - ]; - } -} diff --git a/app/Http/Requests/UserRequest.php b/app/Http/Requests/UserRequest.php deleted file mode 100644 index bcaf651..0000000 --- a/app/Http/Requests/UserRequest.php +++ /dev/null @@ -1,111 +0,0 @@ - - */ - public function postRules(): array - { - $user = auth()->user(); - $isAdminUser = $user->hasPermission('admin/users'); - - return [ - 'first_name' => ( - $isAdminUser === true ? 'required_with:last_name,display_name,phone' : 'required' - ) . '|string|max:255|min:2', - 'last_name' => ( - $isAdminUser === true ? 'required_with:first_name,display_name,phone' : 'required' - ) . '|string|max:255|min:2', - 'display_name' => [ - $isAdminUser === true ? 'required_with:first_name,last_name,phone' : 'required', - 'string', - 'max:255', - new Uniqueish('users') - ], - 'email' => 'required|string|email|max:255|unique:users', - 'phone' => ['string', 'regex:/^(\+|00)?[0-9][0-9 \-\(\)\.]{7,32}$/'], - 'email_verified_at' => 'date' - ]; - } - - /** - * Get the validation rules that apply to PUT request. - * - * @return array - */ - public function putRules(): array - { - $user = auth()->user(); - $ruleUser = $this->route('user'); - $isAdminUser = $user->hasPermission('admin/users'); - - $requiredIfFieldsPresent = function (array $fields) use ($ruleUser): RequiredIf { - return new RequiredIf(function () use ($fields, $ruleUser) { - $input = $this->all(); - $values = Arr::only($input, $fields); - - foreach ($values as $key => $value) { - if ($value !== null && $value !== '') { - return true; - } - } - - $fields = array_diff($fields, array_keys($values)); - - foreach ($fields as $field) { - if ($ruleUser->$field !== '') { - return true; - } - } - - return false; - }); - }; - - return [ - 'first_name' => [ - 'sometimes', - $isAdminUser === true ? $requiredIfFieldsPresent(['last_name', 'display_name', 'phone']) : 'required', - 'string', - 'between:2,255', - ], - 'last_name' => [ - 'sometimes', - $isAdminUser === true ? $requiredIfFieldsPresent(['first_name', 'last_name', 'phone']) : 'required', - 'string', - 'between:2,255', - ], - 'display_name' => [ - 'sometimes', - $isAdminUser === true ? $requiredIfFieldsPresent(['first_name', 'display_name', 'phone']) : 'required', - 'string', - 'between:2,255', - (new Uniqueish('users', 'display_name'))->ignore($ruleUser->id) - ], - 'email' => [ - 'string', - 'email', - 'max:255', - Rule::unique('users')->ignore($ruleUser->id)->when( - $this->email !== $ruleUser->email, - function ($query) { - return $query->where('email', $this->email); - } - ), - ], - 'phone' => ['nullable', 'regex:/^(\+|00)?[0-9][0-9 \-\(\)\.]{7,32}$/'], - 'password' => "nullable|string|min:8" - ]; - } -} diff --git a/app/Http/Requests/UserResendVerifyEmailRequest.php b/app/Http/Requests/UserResendVerifyEmailRequest.php deleted file mode 100644 index 09e6442..0000000 --- a/app/Http/Requests/UserResendVerifyEmailRequest.php +++ /dev/null @@ -1,22 +0,0 @@ - - */ - public function rules(): array - { - return [ - 'email' => 'required|exists:users,email', - // 'captcha_token' => [new Recaptcha()], - ]; - } -} diff --git a/app/Http/Requests/UserResetPasswordRequest.php b/app/Http/Requests/UserResetPasswordRequest.php deleted file mode 100644 index 55141e5..0000000 --- a/app/Http/Requests/UserResetPasswordRequest.php +++ /dev/null @@ -1,23 +0,0 @@ - - */ - public function rules(): array - { - return [ - 'code' => 'required|digits:6', - 'password' => 'required|string|min:8', - // 'captcha_token' => [new Recaptcha()], - ]; - } -} diff --git a/app/Http/Requests/UserVerifyEmailRequest.php b/app/Http/Requests/UserVerifyEmailRequest.php deleted file mode 100644 index 29c017e..0000000 --- a/app/Http/Requests/UserVerifyEmailRequest.php +++ /dev/null @@ -1,22 +0,0 @@ - - */ - public function rules(): array - { - return [ - 'code' => 'required|digits:6', - // 'captcha_token' => [new Recaptcha()], - ]; - } -} diff --git a/app/Jobs/MediaWorkerJob.php b/app/Jobs/MediaWorkerJob.php deleted file mode 100644 index 69e1c8a..0000000 --- a/app/Jobs/MediaWorkerJob.php +++ /dev/null @@ -1,393 +0,0 @@ -mediaJob = $mediaJob; - } - - /** - * Execute the job. - * - * @return void - */ - public function handle(): void - { - $media = $this->mediaJob->media()->first(); - $newMedia = false; - $data = json_decode($this->mediaJob->data, true); - - try { - // FILE - if (array_key_exists('file', $data) === true) { - if (file_exists($data['file']) === false) { - $this->throwMediaJobFailure('temporary upload file no longer exists'); - } - - // convert HEIC files to JPG - $fileExtension = File::extension($data['file']); - if ($fileExtension === 'heic') { - $this->mediaJob->setStatusProcessing(0, 0, 'converting image'); - - // Get the path without the file name - $uploadedFileDirectory = dirname($data['file']); - - // Convert the HEIC file to JPG - $jpgFileName = pathinfo($data['file'], PATHINFO_FILENAME) . '.jpg'; - $jpgFilePath = $uploadedFileDirectory . '/' . $jpgFileName; - if (file_exists($jpgFilePath) === true) { - $this->throwMediaJobFailure('file already exists on server'); - } - - Image::make($data['file'])->save($jpgFilePath); - - // Update the uploaded file path and file name - unlink($data['file']); - $data['file'] = $jpgFileName; - }//end if - - // get security - $security = []; - if ($media === null) { - if (array_key_exists('security', $data) === true) { - $security = $data['security']; - } - } else { - $security['type'] = $media->security_type; - $security['data'] = $media->security_data; - } - - // get storage - $storage = ''; - if ($media === null) { - if (array_key_exists('storage', $data) === true) { - $storage = $data['storage']; - } - } else { - $storage = $media->storage; - } - - if ($storage === '') { - if (count($security) === 0 || $security['type'] === '') { - if (strpos($data['mime_type'], 'image/') === 0) { - $storage = 'local'; - } else { - $storage = 'cdn'; - } - } else { - $storage = 'private'; - } - } - - // Check if file already exists - $exists = Storage::disk($storage)->exists($data['name']); - if ($exists === true) { - if (array_key_exists('noreplace', $data) === true && isTrue($data['noreplace']) === true) { - $this->throwMediaJobFailure('file already exists on server'); - } - } - - if ($exists === true) { - $pathInfo = pathinfo($data['name']); - $basename = $pathInfo['filename']; - $extension = $pathInfo['extension']; - $index = 0; - - do { - $index++; - $data['name'] = $basename . '-' . $index . '.' . $extension; - } while (Storage::disk($storage)->exists($data['name']) === true); - } - - if ($media === null) { - $newMedia = true; - $media = new Media([ - 'user_id' => $this->mediaJob->user_id, - 'title' => $data['title'], - 'name' => $data['name'], - 'mime_type' => $data['mime_type'], - 'size' => $data['size'], - 'security_type' => $data['security']['type'], - 'security_data' => $data['security']['data'], - 'storage' => $storage, - ]); - }//end if - - $media->setStagingFile($data['file']); - } else { - if ($media === null) { - $this->throwMediaJobFailure('The media item no longer exists'); - } - }//end if - - if (array_key_exists('transform', $data) === true) { - $media->createStagingFile(); - - // Modifications - if (strpos($media->mime_type, 'image/') === 0) { - $modified = false; - $image = Image::make($media->getStagingFilePath()); - - // ROTATE - if (array_key_exists("rotate", $data['transform']) === true) { - $rotate = intval($data['transform']['rotate']); - if ($rotate !== 0) { - $this->mediaJob->setStatusProcessing(0, 0, 'rotating image'); - $image = $image->rotate($rotate); - $modified = true; - } - } - - // FLIP-H/V - if (array_key_exists('flip', $data['transform']) === true) { - if (stripos($data['transform']['flip'], 'h') !== false) { - $this->mediaJob->setStatusProcessing(0, 0, 'flipping image'); - $image = $image->flip('h'); - $modified = true; - } - - if (stripos($data['transform']['flip'], 'v') !== false) { - $this->mediaJob->setStatusProcessing(0, 0, 'flipping image'); - $image = $image->flip('v'); - $modified = true; - } - } - - // CROP - if (array_key_exists("crop", $data['transform']) === true) { - $cropData = $data['transform']['crop']; - $width = intval(arrayDefaultValue("width", $cropData, $image->getWidth())); - $height = intval(arrayDefaultValue("height", $cropData, $image->getHeight())); - $x = intval(arrayDefaultValue("x", $cropData, 0)); - $y = intval(arrayDefaultValue("y", $cropData, 0)); - - $this->mediaJob->setStatusProcessing(0, 0, 'cropping image'); - $image = $image->crop($width, $height, $x, $y); - $modified = true; - }//end if - - if ($modified === true) { - $image->save(); - } - } elseif (strpos($data['mime_type'], 'video/') === 0) { - $stagingFilePath = $media->getStagingFilePath(); - $ffmpeg = FFMpeg\FFMpeg::create(); - $video = $ffmpeg->open($stagingFilePath); - $format = $this->detectVideoFormat($stagingFilePath); - $modified = false; - - if ($format === null) { - $this->mediaJob->setStatusFailed('Unsupported video format'); - return; - } - - /** @var FFMpeg\Media\Video::filters */ - $filters = $video->filters(); - - // ROTATE - if (array_key_exists("rotate", $data['transform']) === true) { - $rotate = intval($data['transform']['rotate']); - $rotate = (($rotate % 360 + 360) % 360); // remove excess rotations - $rotate = intval(round($rotate / 90) * 90); // round to nearest 90% - - if ($rotate > 0) { - $this->mediaJob->setStatusProcessing(0, 0, 'rotating video'); - - if ($rotate === 90) { - $filters->rotate(FFMpeg\Filters\Video\RotateFilter::ROTATE_270); - $modified = true; - } elseif ($rotate === 180) { - $filters->rotate(FFMpeg\Filters\Video\RotateFilter::ROTATE_180); - $modified = true; - } elseif ($rotate === 270) { - $filters->rotate(FFMpeg\Filters\Video\RotateFilter::ROTATE_90); - $modified = true; - } - } - } - - // FLIP-H/V - if (array_key_exists('flip', $data['transform']) === true) { - if (stripos($data['transform']['flip'], 'h') !== false) { - $this->mediaJob->setStatusProcessing(0, 0, 'flipping video'); - $filters->hflip()->synchronize(); - $modified = true; - } - - if (stripos($data['transform']['flip'], 'v') !== false) { - $this->mediaJob->setStatusProcessing(0, 0, 'flipping video'); - $filters->vflip()->synchronize(); - $modified = true; - } - } - - // CROP - if (array_key_exists("crop", $data['transform']) === true) { - $cropData = $data['transform']['crop']; - $videoStream = $video->getStreams()->videos()->first(); - - $width = intval(arrayDefaultValue("width", $cropData, $videoStream->get('width'))); - $height = intval(arrayDefaultValue("height", $cropData, $videoStream->get('height'))); - $x = intval(arrayDefaultValue("x", $cropData, 0)); - $y = intval(arrayDefaultValue("y", $cropData, 0)); - - $cropDimension = new Dimension($width, $height); - - $this->mediaJob->setStatusProcessing(0, 0, 'cropping video'); - $filters->crop($cropDimension, $x, $y)->synchronize(); - $modified = true; - }//end if - - $tempFilePath = generateTempFilePath(pathinfo($stagingFilePath, PATHINFO_EXTENSION)); - if (method_exists($format, 'on') === true) { - $mediaJob = $this->mediaJob; - $format->on('progress', function ($video, $format, $percentage) use ($mediaJob) { - $mediaJob->setStatusProcessing($percentage, 100, 'transcoded'); - }); - } - - if ($modified === true) { - $video->save($format, $tempFilePath); - $media->changeStagingFile($tempFilePath); - } - }//end if - }//end if - - // Update attributes - if (array_key_exists('title', $data) === true) { - $media->title = $data['title']; - } - - // Relocate file (if requested) - if (array_key_exists('security', $data) === true && array_key_exists('type', $data['security']) === true) { - $media->security_type = $data['security']['type']; - $media->security_data = $data['security']['data']; - } - - if (array_key_exists('storage', $data) === true) { - if ($media->storage !== $data['storage']) { - $media->createStagingFile(); - Storage::disk($media->storage)->delete($media->name); - $media->storage = $data['storage']; - } - } - - // Finish media object - if ($media->hasStagingFile() === true) { - $this->mediaJob->setStatusProcessing(0, 0, 'transferring to cdn'); - $media->deleteFile(); - $media->saveStagingFile(true); - } - - $media->save(); - $this->mediaJob->media_id = $media->id; - $this->mediaJob->setStatusComplete(); - } catch (\Exception $e) { - if ($this->mediaJob->status !== 'failed') { - $this->mediaJob->setStatusFailed('Unexpected server error occurred'); - } - - if ($media !== null) { - $media->deleteStagingFile(); - if ($newMedia === true) { - $media->delete(); - } - } - - Log::error($e->getMessage() . "\n" . $e->getFile() . " - " . $e->getLine() . "\n" . $e->getTraceAsString()); - $this->fail($e); - }//end try - } - - /** - * Detects the format of a video using FFProbe - * - * @param string $videoPath The video file path. - * @return VideoInterface | null - */ - public function detectVideoFormat(string $videoPath): VideoInterface | null - { - $ffprobe = FFProbe::create(); - - $videoStream = $ffprobe - ->streams($videoPath) // Provide the path to the video file - ->videos() // Filter video streams - ->first(); - - $codecName = $videoStream->get('codec_name'); - - $codecToFormatClass = [ - 'h264' => 'FFMpeg\Format\Video\X264', - 'wmv2' => 'FFMpeg\Format\Video\WMV', - 'vp9' => 'FFMpeg\Format\Video\WebM', - 'theora' => 'FFMpeg\Format\Video\Ogg', - 'mpeg4' => 'FFMpeg\Format\Video\Mpeg4', - // Add more mappings as needed - ]; - - if (isset($codecToFormatClass[$codecName]) === false) { - Log::info("Unsupported codec: $codecName"); - return null; - } - - $formatClassName = $codecToFormatClass[$codecName]; - - if (class_exists($formatClassName) === false) { - Log::info("Format class does not exist: $formatClassName"); - return null; - } - - return new $formatClassName(); - } - - /** - * Set failure status of MediaJob and throw exception. - * - * @param string $error The failure message. - * @return void - */ - private function throwMediaJobFailure(string $error): void - { - $this->mediaJob->setStatusFailed($error); - throw new \Exception($error); - } -} diff --git a/app/Jobs/SendEmailJob.php b/app/Jobs/SendEmailJob.php deleted file mode 100644 index 89d7d1f..0000000 --- a/app/Jobs/SendEmailJob.php +++ /dev/null @@ -1,57 +0,0 @@ -to = $to; - $this->mailable = $mailable; - } - - /** - * Execute the job. - * - * @return void - */ - public function handle(): void - { - Mail::to($this->to)->send($this->mailable); - } -} diff --git a/app/Mail/ChangeEmailVerify.php b/app/Mail/ChangeEmailVerify.php deleted file mode 100644 index dc7618f..0000000 --- a/app/Mail/ChangeEmailVerify.php +++ /dev/null @@ -1,79 +0,0 @@ -user = $user; - $this->code = $code; - $this->new_email = $new_email; - } - - /** - * Get the message envelope. - * - * @return Illuminate\Mail\Mailables\Envelope - */ - public function envelope(): Envelope - { - return new Envelope( - subject: '👋🏻 Lets change your email!', - ); - } - - /** - * Get the message content definition. - * - * @return Illuminate\Mail\Mailables\Content - */ - public function content(): Content - { - return new Content( - view: 'emails.user.change_email_verify', - text: 'emails.user.change_email_verify_plain', - ); - } -} diff --git a/app/Mail/ChangedEmail.php b/app/Mail/ChangedEmail.php deleted file mode 100644 index ded99d1..0000000 --- a/app/Mail/ChangedEmail.php +++ /dev/null @@ -1,79 +0,0 @@ -user = $user; - $this->old_email = $old_email; - $this->new_email = $new_email; - } - - /** - * Get the message envelope. - * - * @return Illuminate\Mail\Mailables\Envelope - */ - public function envelope(): Envelope - { - return new Envelope( - subject: '👍 Your email has been changed!', - ); - } - - /** - * Get the message content definition. - * - * @return Illuminate\Mail\Mailables\Content - */ - public function content(): Content - { - return new Content( - view: 'emails.user.changed_email', - text: 'emails.user.changed_email_plain', - ); - } -} diff --git a/app/Mail/ChangedPassword.php b/app/Mail/ChangedPassword.php deleted file mode 100644 index ecc62c2..0000000 --- a/app/Mail/ChangedPassword.php +++ /dev/null @@ -1,61 +0,0 @@ -user = $user; - } - - /** - * Get the message envelope. - * - * @return Illuminate\Mail\Mailables\Envelope - */ - public function envelope(): Envelope - { - return new Envelope( - subject: '👍 Your password has been changed!', - ); - } - - /** - * Get the message content definition. - * - * @return Illuminate\Mail\Mailables\Content - */ - public function content(): Content - { - return new Content( - view: 'emails.user.changed_password', - text: 'emails.user.changed_password_plain', - ); - } -} diff --git a/app/Mail/Contact.php b/app/Mail/Contact.php deleted file mode 100644 index db4924e..0000000 --- a/app/Mail/Contact.php +++ /dev/null @@ -1,78 +0,0 @@ -name = $name; - $this->email = $email; - $this->content = $content; - } - - /** - * Get the message envelope. - * - * @return Illuminate\Mail\Mailables\Envelope - */ - public function envelope(): Envelope - { - return new Envelope( - subject: config('contact.contact_subject'), - ); - } - - /** - * Get the message content definition. - * - * @return Illuminate\Mail\Mailables\Content - */ - public function content(): Content - { - return new Content( - view: 'emails.user.contact', - text: 'emails.user.contact_plain', - ); - } -} diff --git a/app/Mail/EmailVerify.php b/app/Mail/EmailVerify.php deleted file mode 100644 index 4f23fd4..0000000 --- a/app/Mail/EmailVerify.php +++ /dev/null @@ -1,70 +0,0 @@ -user = $user; - $this->code = $code; - } - - /** - * Get the message envelope. - * - * @return Illuminate\Mail\Mailables\Envelope - */ - public function envelope(): Envelope - { - return new Envelope( - subject: '👋🏻 Welcome to STEMMechanics!', - ); - } - - /** - * Get the message content definition. - * - * @return Illuminate\Mail\Mailables\Content - */ - public function content(): Content - { - return new Content( - view: 'emails.user.email_verify', - text: 'emails.user.email_verify_plain', - ); - } -} diff --git a/app/Mail/ExceptionMail.php b/app/Mail/ExceptionMail.php deleted file mode 100644 index 1728ee2..0000000 --- a/app/Mail/ExceptionMail.php +++ /dev/null @@ -1,59 +0,0 @@ - - */ - public function attachments(): array - { - return []; - } -} diff --git a/app/Mail/ForgotPassword.php b/app/Mail/ForgotPassword.php deleted file mode 100644 index f182c43..0000000 --- a/app/Mail/ForgotPassword.php +++ /dev/null @@ -1,70 +0,0 @@ -user = $user; - $this->code = $code; - } - - /** - * Get the message envelope. - * - * @return Illuminate\Mail\Mailables\Envelope - */ - public function envelope(): Envelope - { - return new Envelope( - subject: '🤦 Forgot your password?', - ); - } - - /** - * Get the message content definition. - * - * @return Illuminate\Mail\Mailables\Content - */ - public function content(): Content - { - return new Content( - view: 'emails.user.forgot_password', - text: 'emails.user.forgot_password_plain', - ); - } -} diff --git a/app/Mail/SubscriptionConfirm.php b/app/Mail/SubscriptionConfirm.php deleted file mode 100644 index 3eca6dd..0000000 --- a/app/Mail/SubscriptionConfirm.php +++ /dev/null @@ -1,61 +0,0 @@ -email = $email; - } - - /** - * Get the message envelope. - * - * @return Illuminate\Mail\Mailables\Envelope - */ - public function envelope(): Envelope - { - return new Envelope( - subject: '🗞️ You\'re on the mailing list!', - ); - } - - /** - * Get the message content definition. - * - * @return Illuminate\Mail\Mailables\Content - */ - public function content(): Content - { - return new Content( - view: 'emails.user.subscription_confirm', - text: 'emails.user.subscription_confirm_plain', - ); - } -} diff --git a/app/Mail/SubscriptionUnsubscribed.php b/app/Mail/SubscriptionUnsubscribed.php deleted file mode 100644 index 552c4a4..0000000 --- a/app/Mail/SubscriptionUnsubscribed.php +++ /dev/null @@ -1,61 +0,0 @@ -email = $email; - } - - /** - * Get the message envelope. - * - * @return Illuminate\Mail\Mailables\Envelope - */ - public function envelope(): Envelope - { - return new Envelope( - subject: 'You have been unsubscribed', - ); - } - - /** - * Get the message content definition. - * - * @return Illuminate\Mail\Mailables\Content - */ - public function content(): Content - { - return new Content( - view: 'emails.user.subscription_unsubscribed', - text: 'emails.user.subscription_unsubscribed_plain', - ); - } -} diff --git a/app/Models/AnalyticsItemRequest.php b/app/Models/AnalyticsItemRequest.php deleted file mode 100644 index a130017..0000000 --- a/app/Models/AnalyticsItemRequest.php +++ /dev/null @@ -1,73 +0,0 @@ - - */ - protected $fillable = [ - 'type', - 'path' - ]; - - - /** - * Model Boot. - * - * @return void - */ - protected static function boot() - { - parent::boot(); - - static::creating(function (AnalyticsItemRequest $analytics) { - if (isset($analytics->session_id) !== true) { - $request = request(); - if ($request !== null) { - $session = AnalyticsSession::where('ip', $request->ip()) - ->where('useragent', $request->userAgent()) - ->where('ended_at', '>=', now()->subMinutes(30)) - ->first(); - if ($session === null) { - $session = AnalyticsSession::create([ - 'ip' => $request->ip(), - 'useragent' => $request->userAgent(), - 'ended_at' => now() - ]); - } else { - $session->update(['ended_at' => now()]); - } - - $analytics->session_id = $session->id; - } - }//end if - }); - } - - /** - * Return the Analytics Session model. - * - * @return BelongsTo - */ - public function session(): BelongsTo - { - return $this->belongsTo(AnalyticsSession::class, 'id', 'session_id'); - } -} diff --git a/app/Models/AnalyticsSession.php b/app/Models/AnalyticsSession.php deleted file mode 100644 index 3e7b653..0000000 --- a/app/Models/AnalyticsSession.php +++ /dev/null @@ -1,44 +0,0 @@ - - */ - protected $fillable = [ - 'ip', - 'useragent', - 'ended_at' - ]; - - /** - * Set the "useragent" attribute. - * - * @param mixed $value - * @return void - */ - public function setUseragentAttribute($value) - { - $this->attributes['useragent'] = $value !== null ? $value : ''; - } - - /** - * Returns the related requests for this session. - * - * @return Illuminate\Database\Eloquent\Relations\HasMany - */ - public function requests(): HasMany { - return $this->hasMany(AnalyticsItemRequest::class, 'session_id', 'id'); - } - -} diff --git a/app/Models/Article.php b/app/Models/Article.php deleted file mode 100644 index bf23035..0000000 --- a/app/Models/Article.php +++ /dev/null @@ -1,43 +0,0 @@ - - */ - protected $fillable = [ - 'title', - 'slug', - 'publish_at', - 'content', - 'user_id', - 'hero' - ]; - - - /** - * Get the article user - * - * @return Illuminate\Database\Eloquent\Relations\BelongsTo - */ - public function user(): BelongsTo - { - return $this->belongsTo(User::class); - } -} diff --git a/app/Models/Attachment.php b/app/Models/Attachment.php deleted file mode 100644 index 37848f8..0000000 --- a/app/Models/Attachment.php +++ /dev/null @@ -1,86 +0,0 @@ - - */ - protected $fillable = [ - 'media_id', - 'private', - ]; - - /** - * The default attributes. - * - * @var string[] - */ - protected $attributes = [ - 'private' => false, - ]; - - - /** - * Get the media for this attachment. - * - * @return BelongsTo - */ - public function media(): BelongsTo - { - return $this->belongsTo(Media::class); - } - - /** - * Get associated Media object. - * - * @return null|Media - */ - public function getMediaAttribute(): ?Media - { - $mediaId = '0'; - $media = null; - - if (Cache::has("attachment:{$this->id}:media") === true) { - $mediaId = Cache::get("attachment:{$this->id}:media"); - } else { - $media = $this->media()->first(); - if ($media === null) { - return null; - } - - $mediaId = $media->id; - Cache::put("attachment:{$this->id}:media", $mediaId, now()->addDays(28)); - } - - return Cache::remember("media:{$mediaId}", now()->addDays(28), function () use ($media) { - if ($media !== null) { - return $media; - } - - return $this->media()->first(); - }); - } - - /** - * Set the media for this item. - * - * @param Media $media The media model. - * @return void - */ - public function setMediaAttribute(Media $media): void - { - $this->media()->associate($media)->save(); - Cache::put("attachment:{$this->id}:media", $media->id, now()->addDays(28)); - } -} diff --git a/app/Models/Event.php b/app/Models/Event.php deleted file mode 100644 index 54c36e7..0000000 --- a/app/Models/Event.php +++ /dev/null @@ -1,51 +0,0 @@ - - */ - protected $fillable = [ - 'title', - 'location', - 'location_url', - 'address', - 'start_at', - 'end_at', - 'publish_at', - 'status', - 'registration_type', - 'registration_data', - 'hero', - 'content', - 'price', - 'ages', - 'open_at', - ]; - - - /** - * Get all the associated users. - * - * @return BelongsToMany - */ - public function users(): BelongsToMany - { - return $this->belongsToMany(User::class, 'event_user', 'event_id', 'user_id'); - } -} diff --git a/app/Models/EventUsers.php b/app/Models/EventUsers.php deleted file mode 100644 index 5ba5daa..0000000 --- a/app/Models/EventUsers.php +++ /dev/null @@ -1,45 +0,0 @@ - - */ - protected $fillable = [ - 'event_id', - 'user_id', - ]; - - - /** - * Get the event for this attachment. - * - * @return Illuminate\Database\Eloquent\Relations\BelongsTo - */ - public function event(): BelongsTo - { - return $this->belongsTo(Event::class); - } - - /** - * Get the user for this attachment. - * - * @return Illuminate\Database\Eloquent\Relations\BelongsTo - */ - public function user(): BelongsTo - { - return $this->belongsTo(User::class); - } -} diff --git a/app/Models/Gallery.php b/app/Models/Gallery.php deleted file mode 100644 index c453af8..0000000 --- a/app/Models/Gallery.php +++ /dev/null @@ -1,107 +0,0 @@ - - */ - protected $fillable = [ - 'media_id', - ]; - - - /** - * Boot the model. - * - * @return void - */ - protected static function boot(): void - { - parent::boot(); - - $clearCache = function ($gallery) { - Cache::forget("gallery:{$gallery->id}:media"); - }; - - static::saving($clearCache); - static::deleting($clearCache); - } - - /** - * Get gallery addendum model. - * - * @return Illuminate\Database\Eloquent\Relations\MorphTo Addenum model. - */ - public function addendum(): MorphTo - { - return $this->morphTo(); - } - - /** - * Get the media for this item. - * - * @return Illuminate\Database\Eloquent\Relations\BelongsTo The media model. - */ - public function media(): BelongsTo - { - return $this->belongsTo(Media::class); - } - - /** - * Get the media for this item. - * - * @return null|Media The media model. - */ - public function getMediaAttribute(): ?Media - { - $mediaId = '0'; - $media = null; - - if (Cache::has("gallery:{$this->id}:media") === true) { - $mediaId = Cache::get("gallery:{$this->id}:media"); - } else { - $media = $this->media()->first(); - if ($media === null) { - return null; - } - - $mediaId = $media->id; - Cache::put("gallery:{$this->id}:media", $mediaId, now()->addDays(28)); - } - - return Cache::remember("media:{$mediaId}", now()->addDays(28), function () use ($media) { - if ($media !== null) { - return $media; - } - - return $this->media()->first(); - }); - } - - /** - * Set the media for this item. - * - * @param Media $media The media model. - * @return void - */ - public function setMediaAttribute(Media $media): void - { - $this->media()->associate($media)->save(); - Cache::put("gallery:{$this->id}:media", $media->id, now()->addDays(28)); - } -} diff --git a/app/Models/Media.php b/app/Models/Media.php deleted file mode 100644 index 2bcb6e8..0000000 --- a/app/Models/Media.php +++ /dev/null @@ -1,1064 +0,0 @@ - - */ - protected $fillable = [ - 'title', - 'user_id', - 'mime_type', - 'security_type', - 'security_data', - 'storage', - 'description', - 'name', - 'size', - ]; - - /** - * The attributes that are appended. - * - * @var array - */ - protected $appends = [ - 'url', - ]; - - /** - * The default attributes. - * - * @var string[] - */ - protected $attributes = [ - 'storage' => 'cdn', - 'variants' => '[]', - 'description' => '', - 'dimensions' => '', - 'security_type' => '', - 'security_data' => '', - 'thumbnail' => '', - ]; - - /** - * The storage file list cache. - * - * @var array - */ - protected static $storageFileListCache = []; - - /** - * Object variant details. - * - * @var int[][][] - */ - protected static $objectVariants = [ - 'image' => [ - 'small' => ['width' => 300, 'height' => 225], - 'medium' => ['width' => 768, 'height' => 576], - 'large' => ['width' => 1024, 'height' => 768], - 'xlarge' => ['width' => 1536, 'height' => 1152], - 'xxlarge' => ['width' => 2048, 'height' => 1536], - 'scaled' => ['width' => 2560, 'height' => 1920] - ] - ]; - - /** - * Staging file path of asset for processing. - * - * @var string - */ - private $stagingFilePath = ""; - - - /** - * Model Boot - * - * @return void - */ - protected static function boot(): void - { - parent::boot(); - - $clearCache = function ($media) { - Cache::forget("media:{$media->id}"); - }; - - static::updating(function ($media) use ($clearCache) { - $clearCache($media); - }); - - static::deleting(function ($media) use ($clearCache) { - $clearCache($media); - $media->deleteFile(); - }); - } - - /** - * Get Object Variants. - * - * @param string $type The variant object to get. - * @return array The variant data. - */ - public static function getObjectVariants(string $type): array - { - if (isset(self::$objectVariants[$type]) === true) { - return self::$objectVariants[$type]; - } - - return []; - } - - /** - * Variants Get Mutator. - * - * @param mixed $value The value to mutate. - * @param boolean $raw Values are not run through urlencode. - * @return array|null The mutated value. - */ - public function getVariantsAttribute(mixed $value, bool $raw = false): array|null - { - if (is_string($value) === true) { - $decodedValue = json_decode($value, true); - - // Check if the decoded value is an array - if ($raw === false && is_array($decodedValue) === true) { - // Loop through the array and encode each value - foreach ($decodedValue as &$item) { - if (is_string($item) === true) { - $item = rawurlencode($item); - } - } - } - - return $decodedValue; - } - - return []; - } - - /** - * Variants Set Mutator. - * - * @param mixed $value The value to mutate. - * @return void - */ - public function setVariantsAttribute(mixed $value): void - { - if (is_array($value) !== true) { - $value = []; - } - - $this->attributes['variants'] = json_encode(($value ?? [])); - } - - /** - * Get previous variant. - * - * @param string $type The variant type. - * @param string $variant The initial variant. - * @return string The previous variant name (or ''). - */ - public function getPreviousVariant(string $type, string $variant): string - { - if (isset(self::$objectVariants[$type]) === false) { - return ''; - } - - $variants = self::$objectVariants[$type]; - $keys = array_keys($variants); - - $currentIndex = array_search($variant, $keys); - if ($currentIndex === false || $currentIndex === 0) { - return ''; - } - - return $keys[($currentIndex - 1)]; - } - - /** - * Get next variant. - * - * @param string $type The variant type. - * @param string $variant The initial variant. - * @return string The next variant name (or ''). - */ - public function getNextVariant(string $type, string $variant): string - { - if (isset(self::$objectVariants[$type]) === false) { - return ''; - } - - $variants = self::$objectVariants[$type]; - $keys = array_keys($variants); - - $currentIndex = array_search($variant, $keys); - if ($currentIndex === false || $currentIndex === (count($keys) - 1)) { - return ''; - } - - return $keys[($currentIndex + 1)]; - } - - /** - * Get variant URL. - * - * @param string $variant The variant to find. - * @param boolean $returnNearest Return the nearest variant if request is not found. - * @return string The URL. - */ - public function getVariantURL(string $variant, bool $returnNearest = true): string - { - $variants = $this->variants; - if (isset($variants[$variant]) === true) { - return self::getUrlPath(['name' => $variants[$variant]]); - } - - if ($returnNearest === true) { - $variantType = explode('/', $this->mime_type)[0]; - $previousVariant = $variant; - while (empty($previousVariant) === false) { - $previousVariant = $this->getPreviousVariant($variantType, $previousVariant); - if (empty($previousVariant) === false && isset($variants[$previousVariant]) === true) { - return self::getUrlPath(['name' => $variants[$previousVariant]]); - } - } - } - - return ''; - } - - /** - * Delete file and associated files with the modal. - * - * @return void - */ - public function deleteFile(): void - { - if ( - strlen($this->storage) > 0 && strlen($this->name) > 0 && - Storage::disk($this->storage)->exists($this->name) === true - ) { - Storage::disk($this->storage)->delete($this->name); - } - - $this->deleteThumbnail(); - $this->deleteVariants(); - $this->invalidateCFCache(); - } - - /** - * Invalidate Cloudflare Cache. - * - * @return void - */ - private function invalidateCFCache(): void - { - $zone_id = env("CLOUDFLARE_ZONE_ID"); - $api_key = env("CLOUDFLARE_API_KEY"); - if ($zone_id !== null && $api_key !== null && $this->url !== "") { - $urls = [$this->url]; - - foreach ($this->variants as $variant => $name) { - $urls[] = str_replace($this->name, $name, $this->url); - } - - $curl = curl_init(); - curl_setopt_array($curl, [ - CURLOPT_URL => "https://api.cloudflare.com/client/v4/zones/" . $zone_id . "/purge_cache", - CURLOPT_RETURNTRANSFER => true, - CURLOPT_CUSTOMREQUEST => "DELETE", - CURLOPT_POSTFIELDS => json_encode(["files" => $urls]), - CURLOPT_HTTPHEADER => [ - "Content-Type: application/json", - "Authorization: Bearer " . $api_key - ], - ]); - curl_exec($curl); - curl_close($curl); - }//end if - } - - /** - * Get URL path - * - * @param array $replacements Replace variables in URL. - * @return string - */ - public function getUrlPath(array $replacements = []): string - { - $url = config("filesystems.disks.$this->storage.url"); - - if (empty($replacements) !== true) { - foreach ($replacements as $key => $value) { - $placeholder = '{' . $key . '}'; - $url = str_replace($placeholder, $value, $url); - } - } - - // Remove any remaining {x} placeholders - $url = preg_replace('/\{[^}]+\}/', '', $url); - - return "$url"; - } - - /** - * Return the file URL - * - * @return string - */ - public function getUrlAttribute(): string - { - $url = self::getUrlPath([ - 'id' => rawurlencode($this->id), - 'name' => rawurlencode($this->name) - ]); - - return $url; - } - - /** - * Return the file owner - * - * @return BelongsTo - */ - public function user(): BelongsTo - { - return $this->belongsTo(User::class); - } - - /** - * Transform the media through the Media Job Queue - * - * @param array $transform The transform data. - * @return MediaJob - */ - public function transform(array $transform): MediaJob - { - $mediaJob = new MediaJob([ - 'media_id' => $this->media, - 'user_id' => auth()->user()?->id, - 'data' => json_encode(['transform' => $transform]), - ]); - - try { - MediaWorkerJob::dispatch($mediaJob)->onQueue('media'); - return $mediaJob; - } catch (\Exception $e) { - $this->error('Failed to transform media'); - throw $e; - }//end try - - return null; - } - - /** - * Get the server maximum upload size - * - * @return integer - */ - public static function getMaxUploadSize(): int - { - $sizes = [ - ini_get('upload_max_filesize'), - ini_get('post_max_size'), - ini_get('memory_limit') - ]; - - foreach ($sizes as &$size) { - $size = trim($size); - $last = strtolower($size[(strlen($size) - 1)]); - switch ($last) { - case 'g': - $size = (intval($size) * 1024); - // Size is in MB - fallthrough - case 'm': - $size = (intval($size) * 1024); - // Size is in KB - fallthrough - case 'k': - $size = (intval($size) * 1024); - // Size is in B - fallthrough - } - } - - return min($sizes); - } - - /** - * Generate a file name that is available within storage. - * - * @param string $fileName The proposed file name. - * @return string|boolean The available file name or false if failed. - */ - public static function generateUniqueFileName(string $fileName) - { - $index = 1; - $maxTries = 100; - $extension = pathinfo($fileName, PATHINFO_EXTENSION); - $fileName = static::sanitizeFilename(pathinfo($fileName, PATHINFO_FILENAME)); - - if ( - static::fileNameHasSuffix($fileName) === true || - static::fileExistsInStorage("$fileName.$extension") === true //|| - // Media::where('name', "$fileName.$extension")->where('status', 'not like', 'failed%')->exists() === true - ) { - $fileName .= '-'; - for ($i = 1; $i < $maxTries; $i++) { - $fileNameIndex = $fileName . $index; - if ( - static::fileExistsInStorage("$fileNameIndex.$extension") !== true && - Media::where('name', "$fileNameIndex.$extension") - // ->where('status', 'not like', 'Failed%') - ->exists() !== true - ) { - return "$fileNameIndex.$extension"; - } - - ++$index; - } - - return false; - } - - return "$fileName.$extension"; - } - - /** - * Determines if the file name exists in any of the storage disks. - * - * @param string $fileName The file name to check. - * @param boolean $ignoreCache Ignore the file list cache. - * @return boolean If the file exists on any storage disks. - */ - public static function fileExistsInStorage(string $fileName, bool $ignoreCache = false): bool - { - $disks = array_keys(Config::get('filesystems.disks')); - - if ($ignoreCache === false) { - if (count(static::$storageFileListCache) === 0) { - $disks = array_keys(Config::get('filesystems.disks')); - - foreach ($disks as $disk) { - try { - static::$storageFileListCache[$disk] = Storage::disk($disk)->allFiles(); - } catch (\Exception $e) { - Log::error("Cannot get a file list for storage device '$disk'. Error: " . $e->getMessage()); - continue; - } - } - } - - foreach (static::$storageFileListCache as $disk => $files) { - if (in_array($fileName, $files) === true) { - return true; - } - } - } else { - $disks = array_keys(Config::get('filesystems.disks')); - - foreach ($disks as $disk) { - try { - if (Storage::disk($disk)->exists($fileName) === true) { - return true; - } - } catch (\Exception $e) { - Log::error($e->getMessage()); - throw new \Exception("Cannot verify if file '$fileName' already exists in storage device '$disk'"); - } - } - }//end if - - return false; - } - - /** - * Test if the file name contains a special suffix. - * - * @param string $fileName The file name to test. - * @return boolean If the file name contains the special suffix. - */ - public static function fileNameHasSuffix(string $fileName): bool - { - $suffix = '/(-\d+x\d+|-scaled|-thumb)$/i'; - $fileNameWithoutExtension = pathinfo($fileName, PATHINFO_FILENAME); - - return preg_match($suffix, $fileNameWithoutExtension) === 1; - } - - /** - * Sanitize fileName for upload - * - * @param string $fileName Filename to sanitize. - * @return string - */ - private static function sanitizeFilename(string $fileName): string - { - /* - # file system reserved https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words - [<>:"/\\\|?*]| - - # control characters http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx - [\x00-\x1F]| - - # non-printing characters DEL, NO-BREAK SPACE, SOFT HYPHEN - [\x7F\xA0\xAD]| - - # URI reserved https://www.rfc-editor.org/rfc/rfc3986#section-2.2 - [#\[\]@!$&\'()+,;=]| - - # URL unsafe characters https://www.ietf.org/rfc/rfc1738.txt - [{}^\~`] - */ - - $fileName = preg_replace( - '~ - [<>:"/\\\|?*]| - [\x00-\x1F]| - [\x7F\xA0\xAD]| - [#\[\]@!$&\'()+,;=]| - [{}^\~`] - ~x', - '-', - $fileName - ); - - $fileName = ltrim($fileName, '.-'); - - $fileName = preg_replace([ - // "file name.zip" becomes "file-name.zip" - '/ +/', - // "file___name.zip" becomes "file-name.zip" - '/_+/', - // "file---name.zip" becomes "file-name.zip" - '/-+/' - ], '-', $fileName); - $fileName = preg_replace([ - // "file--.--.-.--name.zip" becomes "file.name.zip" - '/-*\.-*/', - // "file...name..zip" becomes "file.name.zip" - '/\.{2,}/' - ], '.', $fileName); - // lowercase for windows/unix interoperability http://support.microsoft.com/kb/100625 - $fileName = mb_strtolower($fileName, mb_detect_encoding($fileName)); - // ".file-name.-" becomes "file-name" - $fileName = trim($fileName, '.-'); - - $ext = pathinfo($fileName, PATHINFO_EXTENSION); - $fileName = mb_strcut( - pathinfo($fileName, PATHINFO_FILENAME), - 0, - (255 - ($ext !== '' ? strlen($ext) + 1 : 0)), - mb_detect_encoding($fileName) - ) . ($ext !== '' ? '.' . $ext : ''); - return $fileName; - } - - /** - * Get the Staging File path. - * - * @param boolean $create Create staging file if doesn't exist. - * @return string - */ - public function getStagingFilePath(bool $create = true): string - { - if ($this->stagingFilePath === "" && $create === true) { - $this->createStagingFile(); - } - - return $this->stagingFilePath; - } - - /** - * Set the Staging File for processing. - * - * @param string $path The path if the new staging file. - * @param boolean $overwrite Overwrite existing file. - * @return void - */ - public function setStagingFile(string $path, bool $overwrite = false): void - { - if ($this->stagingFilePath !== "") { - if ($overwrite === true) { - unlink($this->stagingFilePath); - } else { - // ignore request - return; - } - } - - $this->stagingFilePath = $path; - } - - /** - * Download temporary copy of the storage file for staging. - * - * @return boolean If download was successful. - */ - public function createStagingFile(): bool - { - if ($this->stagingFilePath === "") { - $readStream = Storage::disk($this->storage)->readStream($this->name); - $filePath = generateTempFilePath(pathinfo($this->name, PATHINFO_EXTENSION)); - - $writeStream = fopen($filePath, 'w'); - while (feof($readStream) !== true) { - fwrite($writeStream, fread($readStream, 8192)); - } - fclose($readStream); - fclose($writeStream); - - $this->stagingFilePath = $filePath; - }//end if - - return $this->stagingFilePath !== ""; - } - - /** - * Save the Staging File to storage - * - * @param boolean $delete Delete the existing staging file. - * @param boolean $silent Update the status field with the progress. - * @return void - */ - public function saveStagingFile(bool $delete = true, bool $silent = false): void - { - if ($this->stagingFilePath !== '') { - if (strlen($this->storage) > 0 && strlen($this->name) > 0) { - if (Storage::disk($this->storage)->exists($this->name) === true) { - Storage::disk($this->storage)->delete($this->name); - } - - /** @var Illuminate\Filesystem\FilesystemAdapter */ - $fileSystem = Storage::disk($this->storage); - $fileSystem->putFileAs('/', $this->stagingFilePath, $this->name); - } - - $this->generateThumbnail(); - $this->generateVariants(); - - if ($delete === true) { - $this->deleteStagingFile(); - } - }//end if - } - - /** - * Clean up temporary file. - * - * @return void - */ - public function deleteStagingFile(): void - { - if ($this->stagingFilePath !== "") { - unlink($this->stagingFilePath); - $this->stagingFilePath = ""; - } - } - - /** - * Change staging file, removing the old file if present - * - * @param string $newFile The new staging file. - * @return void - */ - public function changeStagingFile(string $newFile): void - { - if ($this->stagingFilePath !== "") { - unlink($this->stagingFilePath); - } - - $this->stagingFilePath = $newFile; - } - - /** - * Is a staging file present - * - * @return boolean - */ - public function hasStagingFile(): bool - { - return $this->stagingFilePath !== ""; - } - - /** - * Generate a Thumbnail for this media. - * - * @return boolean If generation was successful. - */ - public function generateThumbnail(): bool - { - $thumbnailWidth = 200; - $thumbnailHeight = 200; - - // delete existing thumbnail - if (strlen($this->thumbnail) !== 0) { - $path = pathinfo($this->thumbnail, PATHINFO_BASENAME); - if (strlen($path) > 0 && Storage::disk($this->storage)->exists($path) === true) { - Storage::disk($this->storage)->delete($path); - } - } - - $filePath = $this->getStagingFilePath(); - - $fileExtension = File::extension($this->name); - $tempImagePath = tempnam(sys_get_temp_dir(), 'thumb'); - $newFilename = pathinfo($this->name, PATHINFO_FILENAME) . "-" . uniqid() . "-thumb.webp"; - $success = false; - - if ($this->security_type === '') { - if (strpos($this->mime_type, 'image/') === 0) { - $image = Image::make($filePath); - $image->orientate(); - $image->resize($thumbnailWidth, $thumbnailHeight, function ($constraint) { - $constraint->aspectRatio(); - }); - $image->fit($thumbnailWidth, $thumbnailHeight); - $image->encode('webp', 75)->save($tempImagePath); - $success = true; - } elseif ($this->mime_type === 'application/pdf' && extension_loaded('imagick') === true) { - $pdfPreview = new \Imagick(); - $pdfPreview->setResolution(300, 300); - $pdfPreview->readImage($filePath . '[0]'); - $pdfPreview->setImageFormat('webp'); - $pdfPreview->thumbnailImage($thumbnailWidth, $thumbnailHeight, true); - file_put_contents($tempImagePath, $pdfPreview); - - $success = true; - } elseif ($this->mime_type === 'text/plain') { - $image = Image::canvas($thumbnailWidth, $thumbnailHeight, '#FFFFFF'); - - // Read the first few lines of the text file - $numLines = 5; - $text = file_get_contents($filePath); - $lines = explode("\n", $text); - $previewText = implode("\n", array_slice($lines, 0, $numLines)); - - // Center the text on the image - $fontSize = 8; - $textColor = '#000000'; // Black text color - - // Calculate the position to start drawing the text - $x = 10; // Left padding - $y = 10; // Top padding - - // Draw the text on the canvas with text wrapping - $lines = explode("\n", wordwrap($previewText, 30, "\n", true)); - foreach ($lines as $line) { - $image->text($line, $x, $y, function ($font) use ($fontSize, $textColor) { - $font->file(1); - $font->size($fontSize); - $font->color($textColor); - }); - - // Move to the next line - $y += ($fontSize + 4); // Add some vertical spacing between lines (adjust as needed) - } - - $image->encode('webp', 75)->save($tempImagePath); - - $success = true; - } elseif (strpos($this->mime_type, 'video/') === 0) { - $tempImagePath .= '.webp'; - - try { - $ffmpeg = FFMpeg::create(); - $video = $ffmpeg->open($filePath); - $frame = $video->frame(TimeCode::fromSeconds(5)); - $frame->save($tempImagePath); - } catch (\Exception $e) { - Log::error($e); - } - - $success = true; - }//end if - }//end if - - if ($success === true && file_exists($tempImagePath) === true) { - /** @var Illuminate\Filesystem\FilesystemAdapter */ - $fileSystem = Storage::disk($this->storage); - $fileSystem->putFileAs('/', new SplFileInfo($tempImagePath), $newFilename); - unlink($tempImagePath); - - $this->thumbnail = $this->getUrlPath(['name' => $newFilename]); - } else { - $iconExtension = 'unknown'; - if ($fileExtension !== '') { - $iconPath = public_path('assets/fileicons/' . $fileExtension . '.webp'); - if (file_exists($iconPath) === true) { - $iconExtension = $fileExtension; - } - } - - $this->thumbnail = asset('/assets/fileicons/' . $iconExtension . '.webp'); - } - - return $success; - } - - /** - * Delete Media Thumbnail from storage. - * - * @return void - */ - public function deleteThumbnail(): void - { - if (strlen($this->thumbnail) > 0) { - $path = pathinfo($this->thumbnail, PATHINFO_BASENAME); - - if (strlen($path) > 0 && Storage::disk($this->storage)->exists($path) === true) { - Storage::disk($this->storage)->delete($path); - $this->thumbnail = ''; // Clear the thumbnail property - } - } - } - - /** - * Generate variants for this media. - * - * @return void - */ - public function generateVariants(): void - { - // delete existing variants - if (is_array($this->variants) === true) { - foreach ($this->variants as $variantName => $variantFile) { - if (Storage::disk($this->storage)->exists($variantFile) === true) { - Storage::disk($this->storage)->delete($variantFile); - } - } - } - $this->variants = []; - - if ($this->security_type === '') { - if (strpos($this->mime_type, 'image/') === 0) { - // Generate additional image sizes - $sizes = Media::getObjectVariants('image'); - - // download original from CDN if no local file - $filePath = $this->getStagingFilePath(); - - $originalImage = Image::make($filePath); - - $imageSize = $originalImage->getSize(); - $isPortrait = $imageSize->getHeight() > $imageSize->getWidth(); - - // Swap width and height values for portrait images - foreach ($sizes as $variantName => &$size) { - if ($isPortrait === true) { - $temp = $size['width']; - $size['width'] = $size['height']; - $size['height'] = $temp; - } - } - - $dimensions = [$originalImage->getWidth(), $originalImage->getHeight()]; - $this->dimensions = implode('x', $dimensions); - - foreach ($sizes as $variantName => $size) { - $postfix = "{$size['width']}x{$size['height']}"; - if ($variantName === 'scaled') { - $postfix = 'scaled'; - } - - $newFilename = pathinfo($this->name, PATHINFO_FILENAME) . "-" . uniqid() . "-$postfix.webp"; - - // Get the largest available variant - if ($dimensions[0] >= $size['width'] && $dimensions[1] >= $size['height']) { - // Store the variant in the variants array - $variants[$variantName] = $newFilename; - - // Resize the image to the variant size if its dimensions are greater than the - // specified size - $image = clone $originalImage; - - $imageSize = $image->getSize(); - if ($imageSize->getWidth() > $size['width'] || $imageSize->getHeight() > $size['height']) { - $image->resize($size['width'], $size['height'], function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - }); - $image->resizeCanvas($size['width'], $size['height'], 'center', false, 'rgba(0,0,0,0)'); - } - - $image->orientate(); - - // Optimize and store image - $tempImagePath = tempnam(sys_get_temp_dir(), 'optimize'); - $image->encode('webp', 75)->save($tempImagePath); - /** @var Illuminate\Filesystem\FilesystemAdapter */ - $fileSystem = Storage::disk($this->storage); - $fileSystem->putFileAs('/', new SplFileInfo($tempImagePath), $newFilename); - unlink($tempImagePath); - }//end if - }//end foreach - - // Set missing variants to the largest available variant - foreach ($sizes as $variantName => $size) { - if (isset($variants[$variantName]) === false) { - $variants[$variantName] = $this->name; - } - } - - $this->variants = $variants; - }//end if - }//end if - } - - /** - * Delete the Media variants from storage. - * - * @return void - */ - public function deleteVariants(): void - { - if (strlen($this->name) > 0 && strlen($this->storage) > 0) { - foreach ($this->variants as $variantName => $fileName) { - Storage::disk($this->storage)->delete($fileName); - } - - $this->variants = []; - } - } - - /** - * Set Media status to OK - * - * @return void - */ - public function ok(): void - { - // $this->status = "OK"; - $this->save(); - } - - /** - * Set Media status to an error - * @param string $error The error to set. - * @return void - */ - public function error(string $error = ""): void - { - // $this->status = "Error" . ($error !== "" ? ": {$error}" : ""); - $this->save(); - } - - /** - * Set Media status - * @param string $status The status to set. - * @return void - */ - public function status(string $status = ""): void - { - // $this->status = "Info: " . $status; - $this->save(); - } - - /** - * Get the associated job models - * - * @return HasMany - */ - public function jobs(): HasMany - { - return $this->hasMany(MediaJob::class, 'media_id'); - } - - /** - * Get the recommended storage ID based on mime and security - * - * @param string $mime_type The file mime type. - * @param string $security_type The security requested. - * @return string - */ - public static function recommendedStorage(string $mime_type, string $security_type): string - { - if ($security_type === '') { - if (strpos($mime_type, 'image/') === 0) { - return('local'); - } else { - return('cdn'); - } - } - - return('private'); - } - - /** - * Verify the storage exists. May change the storage value. - * - * @param mixed $mime_type File mime type. - * @param mixed $security_type Requested security type. - * @param mixed $storage Reference to the requested storage type. - * @return integer Error code. - */ - public static function verifyStorage(mixed $mime_type, mixed $security_type, mixed &$storage): int - { - if ($storage === '') { - if ($security_type === '') { - if (strpos($mime_type, 'image/') === 0) { - $storage = 'local'; - } else { - $storage = 'cdn'; - } - } else { - $storage = 'private'; - } - } else { - $disks = config('filesystems.disks'); - if (array_key_exists($storage, $disks) === false) { - return Media::STORAGE_NOT_FOUND; - } - - if ($security_type !== '' && strcasecmp($storage, 'private') !== 0) { - return Media::STORAGE_INVALID_SECURITY; - } - } - - return Media::STORAGE_VALID; - } -} diff --git a/app/Models/MediaJob.php b/app/Models/MediaJob.php deleted file mode 100644 index 5ff16b0..0000000 --- a/app/Models/MediaJob.php +++ /dev/null @@ -1,239 +0,0 @@ - null, - 'media_id' => null, - 'status' => '', - 'status_text' => '', - 'progress' => 0, - 'progress_max' => 0, - 'data' => '', - ]; - - - /** - * Set MediaJob status to failed. - * - * @param string $statusText The failed reason. - * @return void - */ - public function setStatusFailed(string $statusText = ''): void - { - $this->setStatus('failed', $statusText, 0); - } - - /** - * Set MediaJob status to queued. - * - * @return void - */ - public function setStatusQueued(): void - { - $this->setStatus('queued', '', 0); - } - - /** - * Set MediaJob status to waiting. - * - * @return void - */ - public function setStatusWaiting(): void - { - $this->setStatus('waiting', '', 0); - } - - /** - * Set MediaJob status to processing. - * - * @param integer $progress The processing progress value. - * @param integer $progressMax The processing progress maximum value. - * @param string $statusText The processing status text. - * @return void - */ - public function setStatusProcessing(int $progress = 0, int $progressMax = 0, string $statusText = ''): void - { - if ($statusText === '') { - $statusText = $this->status_text; - } - - $this->setStatus('processing', $statusText, $progress, $progressMax); - } - - /** - * Set MediaJob status to complete. - * - * @return void - */ - public function setStatusComplete(): void - { - $this->setStatus('complete'); - } - - /** - * Set MediaJon status to invalid. - * - * @param string $text The status text. - * @return void - */ - public function setStatusInvalid(string $text = ''): void - { - $this->setStatus('invalid', $text); - } - - /** - * Set MediaJob status details. - * - * @param string $status The status string. - * @param string $text The status text. - * @param integer $progress The status progress value. - * @param integer $progress_max The status progress maximum value. - * @return void - */ - protected function setStatus(string $status, string $text = '', int $progress = 0, int $progress_max = 0): void - { - $this->status = $status; - $this->status_text = $text; - $this->progress = $progress; - $this->progress_max = $progress_max; - $this->save(); - } - - /** - * Process the MediaJob. - * - * @return void - */ - public function process(): void - { - $data = json_decode($this->data, true); - if ($data !== null) { - if (array_key_exists('chunks', $data) === true) { - if (array_key_exists('chunk_count', $data) === false) { - $this->setStatusInvalid('chunk_count is missing'); - return; - } - - if (array_key_exists('name', $data) === false) { - $this->setStatusInvalid('name is missing'); - return; - } - - $numChunks = count($data['chunks']); - $maxChunks = intval($data['chunk_count']); - if ($numChunks >= $maxChunks) { - // merge file and dispatch - $this->setStatusProcessing(0, $maxChunks, 'combining chunks'); - - $newFile = generateTempFilePath(pathinfo($data['name'], PATHINFO_EXTENSION)); - $failed = false; - - for ($index = 1; $index <= $maxChunks; $index++) { - if (array_key_exists($index, $data['chunks']) === false) { - $failed = `{$index} chunk is missing`; - } else { - $tempFileName = $data['chunks'][$index]; - - if ($failed === false) { - $chunkContents = file_get_contents($tempFileName); - if ($chunkContents === false) { - $failed = `{$index} chunk is empty`; - } else { - file_put_contents($newFile, $chunkContents, FILE_APPEND); - } - } - - unlink($tempFileName); - $this->setStatusProcessing($index, $maxChunks); - } - } - - unset($data['chunks']); - $this->data = json_encode($data); - - if ($failed !== false) { - $this->setStatusInvalid($failed); - } else { - $finfo = finfo_open(FILEINFO_MIME_TYPE); - $mime = finfo_file($finfo, $newFile); - finfo_close($finfo); - - $data['file'] = $newFile; - $data['size'] = filesize($newFile); - $data['mime_type'] = $mime; - - if ( - array_key_exists('storage', $data) === true && - array_key_exists('security_type', $data) === true && - array_key_exists('mime_type', $data) === true && - $data['mime_type'] !== "" - ) { - $error = Media::verifyStorage($data['mime_type'], $data['security_type'], $data['storage']); - switch ($error) { - case Media::STORAGE_VALID: - break; - case Media::STORAGE_MIME_MISSING: - $this->setStatusInvalid('The file type cannot be determined.'); - return; - case Media::STORAGE_NOT_FOUND: - $this->setStatusInvalid('Storage was not found.'); - return; - case Media::STORAGE_INVALID_SECURITY: - $this->setStatusInvalid('Storage invalid for security value.'); - return; - default: - $this->setStatusInvalid('Storage verification error occurred.'); - return; - } - } - - $this->data = json_encode($data); - $this->setStatusQueued(); - MediaWorkerJob::dispatch($this)->onQueue('media'); - }//end if - }//end if - } else { - $this->setStatusQueued(); - MediaWorkerJob::dispatch($this)->onQueue('media'); - }//end if - }//end if - } - - /** - * Return the job owner - * - * @return BelongsTo - */ - public function user(): BelongsTo - { - return $this->belongsTo(User::class); - } - - /** - * Return the media item - * - * @return BelongsTo - */ - public function media(): BelongsTo - { - return $this->belongsTo(Media::class); - } -} diff --git a/app/Models/Permission.php b/app/Models/Permission.php deleted file mode 100644 index 30321da..0000000 --- a/app/Models/Permission.php +++ /dev/null @@ -1,35 +0,0 @@ - - */ - protected $fillable = [ - 'permission', - 'user', - ]; - - - /** - * Get the User associated with this model - * - * @return Illuminate\Database\Eloquent\Relations\BelongsTo - */ - public function user(): BelongsTo - { - return $this->belongsTo(User::class); - } -} diff --git a/app/Models/Shortlink.php b/app/Models/Shortlink.php deleted file mode 100644 index e154129..0000000 --- a/app/Models/Shortlink.php +++ /dev/null @@ -1,37 +0,0 @@ - - */ - protected $fillable = [ - 'code', - 'url', - ]; -} diff --git a/app/Models/Subscription.php b/app/Models/Subscription.php deleted file mode 100644 index 73d94a8..0000000 --- a/app/Models/Subscription.php +++ /dev/null @@ -1,22 +0,0 @@ - - */ - protected $fillable = [ - 'email', - ]; -} diff --git a/app/Models/User.php b/app/Models/User.php index ea17138..4d7f70f 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -3,25 +3,14 @@ namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; - -use App\Traits\Uuids; -use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Relations\BelongsToMany; -use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; -use Illuminate\Support\Facades\Cache; use Laravel\Sanctum\HasApiTokens; -use OwenIt\Auditing\Contracts\Auditable; -class User extends Authenticatable implements Auditable +class User extends Authenticatable { - use HasApiTokens; - use HasFactory; - use Notifiable; - use Uuids; - use \OwenIt\Auditing\Auditable; + use HasApiTokens, HasFactory, Notifiable; /** * The attributes that are mass assignable. @@ -29,12 +18,9 @@ class User extends Authenticatable implements Auditable * @var array */ protected $fillable = [ - 'first_name', - 'last_name', + 'name', 'email', - 'phone', 'password', - 'display_name', ]; /** @@ -45,7 +31,6 @@ class User extends Authenticatable implements Auditable protected $hidden = [ 'password', 'remember_token', - 'permissions' ]; /** @@ -55,192 +40,6 @@ class User extends Authenticatable implements Auditable */ protected $casts = [ 'email_verified_at' => 'datetime', + 'password' => 'hashed', ]; - - // protected $hidden = [ - // 'permissions' - // ]; - - /** - * The attributes to append. - * - * @var string[] - */ - protected $appends = [ - 'permissions' - ]; - - /** - * The default attributes. - * - * @var string[] - */ - protected $attributes = [ - 'phone' => '', - ]; - - - /** - * Boot the model. - * - * @return void - */ - protected static function boot(): void - { - parent::boot(); - - $clearCache = function ($user) { - Cache::forget( - "user:{$user->id}", - "user:{$user->id}:permissions" - ); - }; - - static::saving($clearCache); - static::deleting($clearCache); - } - - /** - * Get the list of permissions of the user - * - * @return Illuminate\Database\Eloquent\Relations\HasMany - */ - public function permissions(): HasMany - { - return $this->hasMany(Permission::class); - } - - /** - * Get the permission attribute - * - * @return array - */ - public function getPermissionsAttribute(): array - { - $cacheKey = "user:{$this->id}:permissions"; - return Cache::remember($cacheKey, now()->addDays(28), function () { - return $this->permissions()->pluck('permission')->toArray(); - }); - } - - /** - * Set the permission attribute - * - * @param array $newPermissions The new permissions to set to the user. - * @return void - */ - public function setPermissionsAttribute(array $newPermissions): void - { - $existingPermissions = $this->permissions->pluck('permission')->toArray(); - - $this->revokePermission(array_diff($this->permissions, $newPermissions)); - $this->givePermission(array_diff($newPermissions, $this->permissions)); - - $cacheKey = "user:{$this->id}:permissions"; - Cache::delete($cacheKey); - } - - /** - * Test if user has permission - * - * @param string $permission Permission to test. - * @return boolean - */ - public function hasPermission(string $permission): bool - { - return in_array($permission, $this->permissions); - } - - /** - * Give permissions to the user - * - * @param string|array $permissions The permission(s) to give. - * @return Illuminate\Database\Eloquent\Collection - */ - public function givePermission($permissions): Collection - { - if (is_array($permissions) === false) { - $permissions = [$permissions]; - } - - $newPermissions = array_map(function ($permission) { - return ['permission' => $permission]; - }, array_diff($permissions, $this->permissions)); - - $cacheKey = "user:{$this->id}:permissions"; - Cache::forget($cacheKey); - - return $this->permissions()->createMany($newPermissions); - } - - - /** - * Revoke permissions from the user - * - * @param string|array $permissions The permission(s) to revoke. - * @return integer - */ - public function revokePermission($permissions): int - { - if (is_array($permissions) === false) { - $permissions = [$permissions]; - } - - $cacheKey = "user:{$this->id}:permissions"; - Cache::forget($cacheKey); - - return $this->permissions() - ->whereIn('permission', $permissions) - ->delete(); - } - - /** - * Get the list of files of the user - * - * @return HasMany - */ - public function media(): HasMany - { - return $this->hasMany(Media::class); - } - - /** - * Get the list of files of the user - * - * @return HasMany - */ - public function articles(): HasMany - { - return $this->hasMany(Article::class); - } - - /** - * Get associated user codes - * - * @return HasMany - */ - public function codes(): HasMany - { - return $this->hasMany(UserCode::class); - } - - /** - * Get the list of logins of the user - * - * @return HasMany - */ - public function logins(): HasMany - { - return $this->hasMany(UserLogins::class); - } - - /** - * Get the events associated with the user. - * - * @return BelongsToMany - */ - public function events(): BelongsToMany - { - return $this->belongsToMany(Event::class, 'event_user', 'user_id', 'event_id'); - } } diff --git a/app/Models/UserCode.php b/app/Models/UserCode.php deleted file mode 100644 index b5a48ba..0000000 --- a/app/Models/UserCode.php +++ /dev/null @@ -1,83 +0,0 @@ - - */ - protected $fillable = [ - 'action', - 'user_id', - 'data', - ]; - - - /** - * Boot function from Laravel. - * - * @return void - */ - protected static function boot(): void - { - parent::boot(); - static::creating(function ($model) { - UserCode::clearExpired(); - - if (empty($model->{'code'}) === true) { - while (true) { - $code = random_int(100000, 999999); - if (UserCode::where('code', $code)->count() === 0) { - $model->{'code'} = $code; - break; - } - } - } - }); - } - - /** - * Generate new code - * - * @return void - */ - public function regenerate(): void - { - while (true) { - $code = random_int(100000, 999999); - if (UserCode::where('code', $code)->count() === 0) { - $this->code = $code; - break; - } - } - } - - /** - * Clear expired user codes - * - * @return void - */ - public static function clearExpired(): void - { - UserCode::where('updated_at', '<=', now()->subDays(5))->delete(); - } - - /** - * Get associated user - * - * @return Illuminate\Database\Eloquent\Relations\BelongsTo - */ - public function user(): BelongsTo - { - return $this->belongsTo(User::class); - } -} diff --git a/app/Models/UserLogins.php b/app/Models/UserLogins.php deleted file mode 100644 index 10efe16..0000000 --- a/app/Models/UserLogins.php +++ /dev/null @@ -1,39 +0,0 @@ - - */ - protected $fillable = [ - 'user_id', - 'token', - 'login', - 'logout', - 'ip_address', - 'user_agent', - ]; - - - /** - * Get the file user - * - * @return Illuminate\Database\Eloquent\Relations\BelongsTo - */ - public function user(): BelongsTo - { - return $this->belongsTo(User::class); - } -} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 30a0c2d..452e6b6 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,16 +2,12 @@ namespace App\Providers; -use Illuminate\Http\Request; use Illuminate\Support\ServiceProvider; -use Illuminate\Support\Facades\Storage; class AppServiceProvider extends ServiceProvider { /** * Register any application services. - * - * @return void */ public function register(): void { @@ -20,34 +16,9 @@ class AppServiceProvider extends ServiceProvider /** * Bootstrap any application services. - * - * @return void */ public function boot(): void { - Request::macro('rename', function ($param, $newParam = null) { - if (is_array($param) === false) { - if ($newParam === null) { - return; - } - - $param = [$param => $newParam]; - } - - $paramArray = $this->all(); - foreach ($param as $oldParam => $newParam) { - if (isset($paramArray[$oldParam]) === true) { - $paramArray[$newParam] = $paramArray[$oldParam]; - unset($paramArray[$oldParam]); - } - } - - $this->replace($paramArray); - }); - - Storage::macro('public', function ($diskName) { - $public = config("filesystems.disks.{$diskName}.public", false); - return $public; - }); + // } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 1f84312..54756cd 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -13,14 +13,11 @@ class AuthServiceProvider extends ServiceProvider * @var array */ protected $policies = [ - // 'App\Models\Model' => 'App\Policies\ModelPolicy', + // ]; - /** * Register any authentication / authorization services. - * - * @return void */ public function boot(): void { diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php index 229284c..2be04f5 100644 --- a/app/Providers/BroadcastServiceProvider.php +++ b/app/Providers/BroadcastServiceProvider.php @@ -9,8 +9,6 @@ class BroadcastServiceProvider extends ServiceProvider { /** * Bootstrap any application services. - * - * @return void */ public function boot(): void { diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 95217e4..2d65aac 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -5,10 +5,7 @@ namespace App\Providers; use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; -use Illuminate\Queue\Events\JobProcessed; -use Illuminate\Support\Facades\Queue; use Illuminate\Support\Facades\Event; -use Illuminate\Support\Facades\Log; class EventServiceProvider extends ServiceProvider { @@ -23,11 +20,8 @@ class EventServiceProvider extends ServiceProvider ], ]; - /** * Register any events for your application. - * - * @return void */ public function boot(): void { @@ -36,8 +30,6 @@ class EventServiceProvider extends ServiceProvider /** * Determine if events and listeners should be automatically discovered. - * - * @return boolean */ public function shouldDiscoverEvents(): bool { diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 7113be9..1cf5f15 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -7,12 +7,11 @@ use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvi use Illuminate\Http\Request; use Illuminate\Support\Facades\RateLimiter; use Illuminate\Support\Facades\Route; -use Illuminate\Support\Str; class RouteServiceProvider extends ServiceProvider { /** - * The path to the "home" route for your application. + * The path to your application's "home" route. * * Typically, users are redirected here after authentication. * @@ -20,38 +19,14 @@ class RouteServiceProvider extends ServiceProvider */ public const HOME = '/home'; - /** * Define your route model bindings, pattern filters, and other route configuration. - * - * @return void */ public function boot(): void { - // RateLimiter::for('api', function (Request $request) { - // return Limit::perMinute(60)->by($request->user()?->id !== null ?: $request->ip()); - // }); - - $rateLimitEnabled = true; - /** @var \App\Models\User */ - $user = auth()->user(); - - if (app()->environment('testing') === true) { - $rateLimitEnabled = false; - } elseif ($user !== null && $user->hasPermission('admin/ratelimit') === true) { - // Admin users with the "admin/ratelimit" permission are not rate limited - $rateLimitEnabled = false; - } - - if ($rateLimitEnabled === true) { - RateLimiter::for('api', function (Request $request) { - return Limit::perMinute(800)->by(isset($request->user()->id) === true ?: $request->ip()); - }); - } else { - RateLimiter::for('api', function () { - return Limit::none(); - }); - } + RateLimiter::for('api', function (Request $request) { + return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); + }); $this->routes(function () { Route::middleware('api') @@ -61,30 +36,5 @@ class RouteServiceProvider extends ServiceProvider Route::middleware('web') ->group(base_path('routes/web.php')); }); - - Route::macro('apiAddendumResource', function ($addendum, $uri, $controller) { - $singularUri = Str::singular($uri); - $signularAddendum = Str::singular((strtolower($addendum))); - $pluralAddendum = Str::plural($signularAddendum); - - Route::get("{$uri}/{{$singularUri}}/{$pluralAddendum}", [$controller, "{$signularAddendum}Index"]) - ->name("{$singularUri}.{$signularAddendum}.index"); - - Route::post("{$uri}/{{$singularUri}}/{$pluralAddendum}", [$controller, "{$signularAddendum}Store"]) - ->name("{$singularUri}.{$signularAddendum}.store"); - - Route::match( - ['put', 'patch'], - "{$uri}/{{$singularUri}}/{$pluralAddendum}", - [$controller, "{$signularAddendum}Update"] - ) - ->name("{$singularUri}.{$signularAddendum}.update"); - - Route::delete( - "{$uri}/{{$singularUri}}/{$pluralAddendum}/{medium}", - [$controller,"{$signularAddendum}Delete"] - ) - ->name("{$singularUri}.{$signularAddendum}.destroy"); - }); } } diff --git a/app/Rules/Recaptcha.php b/app/Rules/Recaptcha.php deleted file mode 100644 index eb0f865..0000000 --- a/app/Rules/Recaptcha.php +++ /dev/null @@ -1,52 +0,0 @@ -post($endpoint['url'], [ - 'secret' => $endpoint['secret_key'], - 'response' => $value, - ])->json(); - - if ($response['success'] === true && $response['score'] > 0.5) { - return true; - } - - return false; - } - - /** - * Get the validation error message. - * - * @return string - */ - public function message(): string - { - return 'Captcha failed. Refresh the page and try again'; - } -} diff --git a/app/Rules/UniqueFileName.php b/app/Rules/UniqueFileName.php deleted file mode 100644 index 54f2f65..0000000 --- a/app/Rules/UniqueFileName.php +++ /dev/null @@ -1,41 +0,0 @@ -table = $table; - $this->column = $column; - } - - /** - * Set the ID of the record to be ignored. - * - * @param mixed $id The ID to ignore. - * @return App\Rules\Uniqueish - */ - public function ignore(mixed $id): static - { - $this->ignoreId = $id; - return $this; - } - - /** - * Determine if the validation rule passes. - * - * @param mixed $attribute Not used. - * @param mixed $value The value to compare. - * @return boolean - */ - public function passes(mixed $attribute, mixed $value): bool - { - $columnName = ($this->column ?? $attribute); - $similarValue = preg_replace('/[^A-Za-z]/', '', strtolower($value)); - - try { - $query = DB::table($this->table) - ->where($columnName, 'like', '%' . $similarValue . '%'); - - if ($this->ignoreId !== null) { - $query->where('id', '<>', $this->ignoreId); - } - - $query->whereRaw('LOWER(REGEXP_REPLACE(' . $columnName . ', \'[^A-Za-z0-9]\', \'\')) = ?', [$similarValue]); - $result = $query->first(); - } catch (\Illuminate\Database\QueryException $e) { - // Fall back to performing the regex replace in PHP - // $results = $query->get(); - $query = DB::table($this->table); - $results = $query->get(); - - foreach ($results as $result) { - $resultValue = preg_replace('/[^A-Za-z0-9]/', '', strtolower($result->{$columnName})); - if ($resultValue === $similarValue && $result->id !== $this->ignoreId) { - return false; // Value already exists in the table - } - } - return true; // Value does not exist in the table - }//end try - - return $result === null; - } - - /** - * Get the validation error message. - * - * @return string - */ - public function message(): string - { - return 'The :attribute is similar to one that already exists. Please choose another.'; - } -} diff --git a/app/Traits/HasAttachments.php b/app/Traits/HasAttachments.php deleted file mode 100644 index 040aa0b..0000000 --- a/app/Traits/HasAttachments.php +++ /dev/null @@ -1,98 +0,0 @@ -deleteAttachments(); - }); - } - - /** - * Get the attachments associated to this item. - * - * @return Collection - */ - public function getAttachments(): Collection - { - return Cache::remember($this->attachmentsCacheKey(), now()->addDays(28), function () { - return $this->attachments()->get(); - }); - } - - /** - * Add multiple attachments items to the model. - * - * @param array|string $ids The media ids to add. - * @param string $delimiter The split delimiter if $ids is a string. - * @param boolean $allowDuplicates Whether to allow duplicate media IDs or not. - * @return void - */ - public function addAttachments(array|string $ids, string $delimiter = ',', bool $allowDuplicates = false): void - { - if (is_array($ids) === false) { - $ids = explode($delimiter, $ids); - } - - $ids = array_map('trim', $ids); - $existingIds = $this->getAttachments()->pluck('media_id')->toArray(); - - $attachmentItems = []; - foreach ($ids as $id) { - if ($allowDuplicates === false && in_array($id, $existingIds) === true) { - continue; - } - - if (Media::where('id', $id)->exists() === true) { - $attachmentItems[] = ['media_id' => $id]; - } - } - - Cache::forget($this->attachmentsCacheKey()); - $this->attachments()->createMany($attachmentItems); - } - - /** - * Delete associated attachments. - * - * @return void - */ - public function deleteAttachments(): void - { - Cache::forget($this->attachmentsCacheKey()); - $this->morphMany(\App\Models\Attachment::class, 'addendum')->delete(); - } - - /** - * Get the article's attachments. - * - * @return Illuminate\Database\Eloquent\Relations\MorphMany The attachments items - */ - public function attachments(): MorphMany - { - return $this->morphMany(\App\Models\Attachment::class, 'addendum'); - } - - /** - * Return the attachment cache key. - * - * @return string - */ - private function attachmentsCacheKey(): string - { - return "attachments:{$this->getTable()}:{$this->id}"; - } -} diff --git a/app/Traits/HasGallery.php b/app/Traits/HasGallery.php deleted file mode 100644 index f2697b9..0000000 --- a/app/Traits/HasGallery.php +++ /dev/null @@ -1,88 +0,0 @@ -gallery()->delete(); - }); - } - - /** - * Add multiple gallery items to the model. - * - * @param array|string $ids The media ids to add. - * @param string $delimiter The split delimiter if $ids is a string. - * @param boolean $allowDuplicates Whether to allow duplicate media IDs or not. - * @return void - */ - public function galleryAddMany(array|string $ids, string $delimiter = ',', bool $allowDuplicates = false): void - { - if (is_array($ids) === false) { - $ids = explode($delimiter, $ids); - } - - $ids = array_map('trim', $ids); - $existingIds = $this->gallery()->pluck('media_id')->toArray(); - - $galleryItems = []; - foreach ($ids as $id) { - if ($allowDuplicates === false && in_array($id, $existingIds) === true) { - continue; - } - - $media = Media::find($id); - if ($media !== null) { - $galleryItems[] = ['media_id' => $id]; - } - } - - Cache::forget($this->galleryCacheKey()); - $this->gallery()->createMany($galleryItems); - } - - /** - * Get the article's gallery. - * - * @return Illuminate\Database\Eloquent\Relations\MorphMany The gallery items - */ - public function gallery(): MorphMany - { - return $this->morphMany(\App\Models\Gallery::class, 'addendum'); - } - - /** - * Get the article's gallery collection. - * - * @return Illuminate\Database\Eloquent\Collection The gallery collection - */ - public function getGallery(): Collection - { - return Cache::remember($this->galleryCacheKey(), now()->addDays(28), function () { - return $this->gallery()->get(); - }); - } - - /** - * Return the attachment cache key. - * - * @return string - */ - private function galleryCacheKey(): string - { - return "gallery:{$this->getTable()}:{$this->id}"; - } -} diff --git a/app/Traits/Uuids.php b/app/Traits/Uuids.php deleted file mode 100644 index a5053ee..0000000 --- a/app/Traits/Uuids.php +++ /dev/null @@ -1,42 +0,0 @@ -{$model->getKeyName()}) === true) { - $model->{$model->getKeyName()} = Str::uuid()->toString(); - } - }); - } - - /** - * Get the value indicating whether the IDs are incrementing. - * - * @return boolean - */ - public function getIncrementing(): bool - { - return false; - } - - /** - * Get the auto-incrementing key type. - * - * @return string - */ - public function getKeyType(): string - { - return 'string'; - } -} diff --git a/composer.json b/composer.json index d5fb7ba..8a3d72d 100644 --- a/composer.json +++ b/composer.json @@ -1,56 +1,35 @@ { "name": "laravel/laravel", "type": "project", - "description": "The Laravel Framework.", - "keywords": [ - "framework", - "laravel" - ], + "description": "The skeleton application for the Laravel framework.", + "keywords": ["laravel", "framework"], "license": "MIT", "require": { "php": "^8.1", - "doctrine/dbal": "^3.5", "guzzlehttp/guzzle": "^7.2", - "intervention/image": "^2.7", - "laravel/framework": "^10.12", - "laravel/sanctum": "^3.2", - "laravel/tinker": "^2.8", - "league/flysystem-aws-s3-v3": "^3.12", - "owen-it/laravel-auditing": "^13.1", - "php-ffmpeg/php-ffmpeg": "^1.1", - "square/square": "32.0.0.20231018", - "sunspikes/clamav-validator": "*", - "thiagoalessio/tesseract_ocr": "^2.12", - "vlucas/phpdotenv": "^5.5" + "laravel/framework": "^10.10", + "laravel/sanctum": "^3.3", + "laravel/tinker": "^2.8" }, "require-dev": { - "barryvdh/laravel-ide-helper": "^2.13", "fakerphp/faker": "^1.9.1", - "itsgoingd/clockwork": "^5.1", "laravel/pint": "^1.0", "laravel/sail": "^1.18", "mockery/mockery": "^1.4.4", - "nunomaduro/collision": "^7.1", - "phpunit/phpunit": "^10.1.3", + "nunomaduro/collision": "^7.0", + "phpunit/phpunit": "^10.1", "spatie/laravel-ignition": "^2.0" }, "autoload": { - "files": [ - "app/Helpers/Array.php", - "app/Helpers/Temp.php", - "app/Helpers/TypeValue.php" - ], "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", - "Database\\Seeders\\": "database/seeders/", - "Faker\\Provider\\": "faker/provider/" + "Database\\Seeders\\": "database/seeders/" } }, "autoload-dev": { "psr-4": { - "Tests\\": "tests/", - "Faker\\Provider\\": "faker/provider/" + "Tests\\": "tests/" } }, "scripts": { @@ -78,7 +57,8 @@ "preferred-install": "dist", "sort-packages": true, "allow-plugins": { - "pestphp/pest-plugin": true + "pestphp/pest-plugin": true, + "php-http/discovery": true } }, "minimum-stability": "stable", diff --git a/composer.lock b/composer.lock index 6215538..21290d9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,372 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bc423f0daa8803140c88ff8b5bf51259", + "content-hash": "9c491b8531eec05ba41a11d9276a5749", "packages": [ - { - "name": "apimatic/core", - "version": "0.3.2", - "source": { - "type": "git", - "url": "https://github.com/apimatic/core-lib-php.git", - "reference": "32238fb83ce9a3ebef38c726b497c0f218d6e6c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/apimatic/core-lib-php/zipball/32238fb83ce9a3ebef38c726b497c0f218d6e6c9", - "reference": "32238fb83ce9a3ebef38c726b497c0f218d6e6c9", - "shasum": "" - }, - "require": { - "apimatic/core-interfaces": "~0.1.0", - "apimatic/jsonmapper": "^3.1.1", - "ext-curl": "*", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "php": "^7.2 || ^8.0", - "php-jsonpointer/php-jsonpointer": "^3.0.2" - }, - "require-dev": { - "phan/phan": "5.4.2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Core\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Core logic and the utilities for the Apimatic's PHP SDK", - "homepage": "https://github.com/apimatic/core-lib-php", - "keywords": [ - "apimatic", - "core", - "corelib", - "php" - ], - "support": { - "issues": "https://github.com/apimatic/core-lib-php/issues", - "source": "https://github.com/apimatic/core-lib-php/tree/0.3.2" - }, - "time": "2023-07-11T09:30:32+00:00" - }, - { - "name": "apimatic/core-interfaces", - "version": "0.1.2", - "source": { - "type": "git", - "url": "https://github.com/apimatic/core-interfaces-php.git", - "reference": "183214195a79784c382a446795c46ca8c1f43cc1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/apimatic/core-interfaces-php/zipball/183214195a79784c382a446795c46ca8c1f43cc1", - "reference": "183214195a79784c382a446795c46ca8c1f43cc1", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "CoreInterfaces\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Definition of the behavior of apimatic/core, apimatic/unirest-php and Apimatic's PHP SDK", - "homepage": "https://github.com/apimatic/core-interfaces-php", - "keywords": [ - "apimatic", - "core", - "corelib", - "interface", - "php", - "unirest" - ], - "support": { - "issues": "https://github.com/apimatic/core-interfaces-php/issues", - "source": "https://github.com/apimatic/core-interfaces-php/tree/0.1.2" - }, - "time": "2023-04-04T06:40:52+00:00" - }, - { - "name": "apimatic/jsonmapper", - "version": "3.1.2", - "source": { - "type": "git", - "url": "https://github.com/apimatic/jsonmapper.git", - "reference": "6673a946c21f2ceeec0cb60d17541c11a22bc79d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/apimatic/jsonmapper/zipball/6673a946c21f2ceeec0cb60d17541c11a22bc79d", - "reference": "6673a946c21f2ceeec0cb60d17541c11a22bc79d", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^5.6 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "squizlabs/php_codesniffer": "^3.0.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "apimatic\\jsonmapper\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "christian.weiske@netresearch.de", - "homepage": "http://www.netresearch.de/", - "role": "Developer" - }, - { - "name": "Mehdi Jaffery", - "email": "mehdi.jaffery@apimatic.io", - "homepage": "http://apimatic.io/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes", - "support": { - "email": "mehdi.jaffery@apimatic.io", - "issues": "https://github.com/apimatic/jsonmapper/issues", - "source": "https://github.com/apimatic/jsonmapper/tree/3.1.2" - }, - "time": "2023-06-08T04:27:10+00:00" - }, - { - "name": "apimatic/unirest-php", - "version": "4.0.5", - "source": { - "type": "git", - "url": "https://github.com/apimatic/unirest-php.git", - "reference": "e16754010c16be5473289470f129d87a0f41b55e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/apimatic/unirest-php/zipball/e16754010c16be5473289470f129d87a0f41b55e", - "reference": "e16754010c16be5473289470f129d87a0f41b55e", - "shasum": "" - }, - "require": { - "apimatic/core-interfaces": "^0.1.0", - "ext-curl": "*", - "ext-json": "*", - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "phan/phan": "5.4.2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Unirest\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mashape", - "email": "opensource@mashape.com", - "homepage": "https://www.mashape.com", - "role": "Developer" - }, - { - "name": "APIMATIC", - "email": "opensource@apimatic.io", - "homepage": "https://www.apimatic.io", - "role": "Developer" - } - ], - "description": "Unirest PHP", - "homepage": "https://github.com/apimatic/unirest-php", - "keywords": [ - "client", - "curl", - "http", - "https", - "rest" - ], - "support": { - "email": "opensource@apimatic.io", - "issues": "https://github.com/apimatic/unirest-php/issues", - "source": "https://github.com/apimatic/unirest-php/tree/4.0.5" - }, - "time": "2023-04-25T14:19:45+00:00" - }, - { - "name": "aws/aws-crt-php", - "version": "v1.2.2", - "source": { - "type": "git", - "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "2f1dc7b7eda080498be96a4a6d683a41583030e9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/2f1dc7b7eda080498be96a4a6d683a41583030e9", - "reference": "2f1dc7b7eda080498be96a4a6d683a41583030e9", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5", - "yoast/phpunit-polyfills": "^1.0" - }, - "suggest": { - "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality." - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "AWS SDK Common Runtime Team", - "email": "aws-sdk-common-runtime@amazon.com" - } - ], - "description": "AWS Common Runtime for PHP", - "homepage": "https://github.com/awslabs/aws-crt-php", - "keywords": [ - "amazon", - "aws", - "crt", - "sdk" - ], - "support": { - "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.2" - }, - "time": "2023-07-20T16:49:55+00:00" - }, - { - "name": "aws/aws-sdk-php", - "version": "3.283.8", - "source": { - "type": "git", - "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "0f73ec85852312a6e971cfe2eebfd7c8091cca34" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0f73ec85852312a6e971cfe2eebfd7c8091cca34", - "reference": "0f73ec85852312a6e971cfe2eebfd7c8091cca34", - "shasum": "" - }, - "require": { - "aws/aws-crt-php": "^1.0.4", - "ext-json": "*", - "ext-pcre": "*", - "ext-simplexml": "*", - "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "guzzlehttp/promises": "^1.4.0 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", - "mtdowling/jmespath.php": "^2.6", - "php": ">=7.2.5", - "psr/http-message": "^1.0 || ^2.0" - }, - "require-dev": { - "andrewsville/php-token-reflection": "^1.4", - "aws/aws-php-sns-message-validator": "~1.0", - "behat/behat": "~3.0", - "composer/composer": "^1.10.22", - "dms/phpunit-arraysubset-asserts": "^0.4.0", - "doctrine/cache": "~1.4", - "ext-dom": "*", - "ext-openssl": "*", - "ext-pcntl": "*", - "ext-sockets": "*", - "nette/neon": "^2.3", - "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", - "psr/cache": "^1.0", - "psr/simple-cache": "^1.0", - "sebastian/comparator": "^1.2.3 || ^4.0", - "yoast/phpunit-polyfills": "^1.0" - }, - "suggest": { - "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", - "doctrine/cache": "To use the DoctrineCacheAdapter", - "ext-curl": "To send requests using cURL", - "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", - "ext-sockets": "To use client-side monitoring" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Aws\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Amazon Web Services", - "homepage": "http://aws.amazon.com" - } - ], - "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", - "homepage": "http://aws.amazon.com/sdkforphp", - "keywords": [ - "amazon", - "aws", - "cloud", - "dynamodb", - "ec2", - "glacier", - "s3", - "sdk" - ], - "support": { - "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", - "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.283.8" - }, - "time": "2023-10-19T19:26:52+00:00" - }, { "name": "brick/math", "version": "0.11.0", @@ -425,75 +61,6 @@ ], "time": "2023-01-15T23:15:59+00:00" }, - { - "name": "clue/socket-raw", - "version": "v1.6.0", - "source": { - "type": "git", - "url": "https://github.com/clue/socket-raw.git", - "reference": "91e9f619f6769f931454a9882c21ffd7623d06cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/clue/socket-raw/zipball/91e9f619f6769f931454a9882c21ffd7623d06cb", - "reference": "91e9f619f6769f931454a9882c21ffd7623d06cb", - "shasum": "" - }, - "require": { - "ext-sockets": "*", - "php": ">=5.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "Socket\\Raw\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering" - } - ], - "description": "Simple and lightweight OOP wrapper for PHP's low-level sockets extension (ext-sockets).", - "homepage": "https://github.com/clue/socket-raw", - "keywords": [ - "Socket", - "client", - "datagram", - "dgram", - "icmp", - "ipv6", - "server", - "stream", - "tcp", - "udg", - "udp", - "unix" - ], - "support": { - "issues": "https://github.com/clue/socket-raw/issues", - "source": "https://github.com/clue/socket-raw/tree/v1.6.0" - }, - "funding": [ - { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-04-14T14:58:06+00:00" - }, { "name": "dflydev/dot-access-data", "version": "v3.0.2", @@ -569,350 +136,6 @@ }, "time": "2022-10-27T11:44:00+00:00" }, - { - "name": "doctrine/cache", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "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 Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.2.0" - }, - "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%2Fcache", - "type": "tidelift" - } - ], - "time": "2022-05-20T20:07:39+00:00" - }, - { - "name": "doctrine/dbal", - "version": "3.7.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "5b7bd66c9ff58c04c5474ab85edce442f8081cb2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/5b7bd66c9ff58c04c5474ab85edce442f8081cb2", - "reference": "5b7bd66c9ff58c04c5474ab85edce442f8081cb2", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2", - "doctrine/cache": "^1.11|^2.0", - "doctrine/deprecations": "^0.5.3|^1", - "doctrine/event-manager": "^1|^2", - "php": "^7.4 || ^8.0", - "psr/cache": "^1|^2|^3", - "psr/log": "^1|^2|^3" - }, - "require-dev": { - "doctrine/coding-standard": "12.0.0", - "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.35", - "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.13", - "psalm/plugin-phpunit": "0.18.4", - "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.7.2", - "symfony/cache": "^5.4|^6.0", - "symfony/console": "^4.4|^5.4|^6.0", - "vimeo/psalm": "4.30.0" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\": "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": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "db2", - "dbal", - "mariadb", - "mssql", - "mysql", - "oci8", - "oracle", - "pdo", - "pgsql", - "postgresql", - "queryobject", - "sasql", - "sql", - "sqlite", - "sqlserver", - "sqlsrv" - ], - "support": { - "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.7.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%2Fdbal", - "type": "tidelift" - } - ], - "time": "2023-10-06T05:06:20+00:00" - }, - { - "name": "doctrine/deprecations", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", - "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", - "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.2" - }, - "time": "2023-09-27T20:04:15+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", - "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "conflict": { - "doctrine/common": "<2.9" - }, - "require-dev": { - "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.8.8", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^4.28" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "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": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" - ], - "support": { - "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/2.0.0" - }, - "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%2Fevent-manager", - "type": "tidelift" - } - ], - "time": "2022-10-12T20:59:15+00:00" - }, { "name": "doctrine/inflector", "version": "2.0.8", @@ -1209,53 +432,6 @@ ], "time": "2023-10-06T06:47:41+00:00" }, - { - "name": "evenement/evenement", - "version": "v3.0.2", - "source": { - "type": "git", - "url": "https://github.com/igorw/evenement.git", - "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", - "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", - "shasum": "" - }, - "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^9 || ^6" - }, - "type": "library", - "autoload": { - "psr-4": { - "Evenement\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - } - ], - "description": "Événement is a very simple event dispatching library for PHP", - "keywords": [ - "event-dispatcher", - "event-emitter" - ], - "support": { - "issues": "https://github.com/igorw/evenement/issues", - "source": "https://github.com/igorw/evenement/tree/v3.0.2" - }, - "time": "2023-08-08T05:53:35+00:00" - }, { "name": "fruitcake/php-cors", "version": "v1.3.0", @@ -1329,24 +505,24 @@ }, { "name": "graham-campbell/result-type", - "version": "v1.1.1", + "version": "v1.1.2", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831" + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", - "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "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.1" + "phpoption/phpoption": "^1.9.2" }, "require-dev": { - "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "type": "library", "autoload": { @@ -1375,7 +551,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" }, "funding": [ { @@ -1387,7 +563,7 @@ "type": "tidelift" } ], - "time": "2023-02-25T20:23:15+00:00" + "time": "2023-11-12T22:16:48+00:00" }, { "name": "guzzlehttp/guzzle", @@ -1794,102 +970,18 @@ ], "time": "2023-08-27T10:19:19+00:00" }, - { - "name": "intervention/image", - "version": "2.7.2", - "source": { - "type": "git", - "url": "https://github.com/Intervention/image.git", - "reference": "04be355f8d6734c826045d02a1079ad658322dad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Intervention/image/zipball/04be355f8d6734c826045d02a1079ad658322dad", - "reference": "04be355f8d6734c826045d02a1079ad658322dad", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "guzzlehttp/psr7": "~1.1 || ^2.0", - "php": ">=5.4.0" - }, - "require-dev": { - "mockery/mockery": "~0.9.2", - "phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15" - }, - "suggest": { - "ext-gd": "to use GD library based image processing.", - "ext-imagick": "to use Imagick based image processing.", - "intervention/imagecache": "Caching extension for the Intervention Image library" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - }, - "laravel": { - "providers": [ - "Intervention\\Image\\ImageServiceProvider" - ], - "aliases": { - "Image": "Intervention\\Image\\Facades\\Image" - } - } - }, - "autoload": { - "psr-4": { - "Intervention\\Image\\": "src/Intervention/Image" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Oliver Vogel", - "email": "oliver@intervention.io", - "homepage": "https://intervention.io/" - } - ], - "description": "Image handling and manipulation library with support for Laravel integration", - "homepage": "http://image.intervention.io/", - "keywords": [ - "gd", - "image", - "imagick", - "laravel", - "thumbnail", - "watermark" - ], - "support": { - "issues": "https://github.com/Intervention/image/issues", - "source": "https://github.com/Intervention/image/tree/2.7.2" - }, - "funding": [ - { - "url": "https://paypal.me/interventionio", - "type": "custom" - }, - { - "url": "https://github.com/Intervention", - "type": "github" - } - ], - "time": "2022-05-21T17:30:32+00:00" - }, { "name": "laravel/framework", - "version": "v10.30.1", + "version": "v10.31.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "7a2da50258c4d0f693b738d3f3c69b2693aea6c1" + "reference": "507ce9b28bce4b5e4140c28943092ca38e9a52e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/7a2da50258c4d0f693b738d3f3c69b2693aea6c1", - "reference": "7a2da50258c4d0f693b738d3f3c69b2693aea6c1", + "url": "https://api.github.com/repos/laravel/framework/zipball/507ce9b28bce4b5e4140c28943092ca38e9a52e4", + "reference": "507ce9b28bce4b5e4140c28943092ca38e9a52e4", "shasum": "" }, "require": { @@ -2078,7 +1170,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-11-01T13:52:17+00:00" + "time": "2023-11-07T13:48:30+00:00" }, { "name": "laravel/prompts", @@ -2139,16 +1231,16 @@ }, { "name": "laravel/sanctum", - "version": "v3.3.1", + "version": "v3.3.2", "source": { "type": "git", "url": "https://github.com/laravel/sanctum.git", - "reference": "338f633e6487e76b255470d3373fbc29228aa971" + "reference": "e1a272893bec13cf135627f7e156030b3afe1e60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/338f633e6487e76b255470d3373fbc29228aa971", - "reference": "338f633e6487e76b255470d3373fbc29228aa971", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/e1a272893bec13cf135627f7e156030b3afe1e60", + "reference": "e1a272893bec13cf135627f7e156030b3afe1e60", "shasum": "" }, "require": { @@ -2201,7 +1293,7 @@ "issues": "https://github.com/laravel/sanctum/issues", "source": "https://github.com/laravel/sanctum" }, - "time": "2023-09-07T15:46:33+00:00" + "time": "2023-11-03T13:42:14+00:00" }, { "name": "laravel/serializable-closure", @@ -2522,16 +1614,16 @@ }, { "name": "league/flysystem", - "version": "3.18.0", + "version": "3.19.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "015633a05aee22490495159237a5944091d8281e" + "reference": "1b2aa10f2326e0351399b8ce68e287d8e9209a83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/015633a05aee22490495159237a5944091d8281e", - "reference": "015633a05aee22490495159237a5944091d8281e", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1b2aa10f2326e0351399b8ce68e287d8e9209a83", + "reference": "1b2aa10f2326e0351399b8ce68e287d8e9209a83", "shasum": "" }, "require": { @@ -2596,7 +1688,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.18.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.19.0" }, "funding": [ { @@ -2608,86 +1700,20 @@ "type": "github" } ], - "time": "2023-10-20T17:59:40+00:00" - }, - { - "name": "league/flysystem-aws-s3-v3", - "version": "3.16.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "ded9ba346bb01cb9cc4cc7f2743c2c0e14d18e1c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/ded9ba346bb01cb9cc4cc7f2743c2c0e14d18e1c", - "reference": "ded9ba346bb01cb9cc4cc7f2743c2c0e14d18e1c", - "shasum": "" - }, - "require": { - "aws/aws-sdk-php": "^3.220.0", - "league/flysystem": "^3.10.0", - "league/mime-type-detection": "^1.0.0", - "php": "^8.0.2" - }, - "conflict": { - "guzzlehttp/guzzle": "<7.0", - "guzzlehttp/ringphp": "<1.1.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\Flysystem\\AwsS3V3\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "AWS S3 filesystem adapter for Flysystem.", - "keywords": [ - "Flysystem", - "aws", - "file", - "files", - "filesystem", - "s3", - "storage" - ], - "support": { - "issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues", - "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.16.0" - }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - } - ], - "time": "2023-08-30T10:14:57+00:00" + "time": "2023-11-07T09:04:28+00:00" }, { "name": "league/flysystem-local", - "version": "3.18.0", + "version": "3.19.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "e7381ef7643f658b87efb7dbe98fe538fb1bbf32" + "reference": "8d868217f9eeb4e9a7320db5ccad825e9a7a4076" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e7381ef7643f658b87efb7dbe98fe538fb1bbf32", - "reference": "e7381ef7643f658b87efb7dbe98fe538fb1bbf32", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/8d868217f9eeb4e9a7320db5ccad825e9a7a4076", + "reference": "8d868217f9eeb4e9a7320db5ccad825e9a7a4076", "shasum": "" }, "require": { @@ -2722,7 +1748,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem-local/issues", - "source": "https://github.com/thephpleague/flysystem-local/tree/3.18.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.19.0" }, "funding": [ { @@ -2734,7 +1760,7 @@ "type": "github" } ], - "time": "2023-10-19T20:07:13+00:00" + "time": "2023-11-06T20:35:28+00:00" }, { "name": "league/mime-type-detection", @@ -2893,72 +1919,6 @@ ], "time": "2023-10-27T15:32:31+00:00" }, - { - "name": "mtdowling/jmespath.php", - "version": "2.7.0", - "source": { - "type": "git", - "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/bbb69a935c2cbb0c03d7f481a238027430f6440b", - "reference": "bbb69a935c2cbb0c03d7f481a238027430f6440b", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "symfony/polyfill-mbstring": "^1.17" - }, - "require-dev": { - "composer/xdebug-handler": "^3.0.3", - "phpunit/phpunit": "^8.5.33" - }, - "bin": [ - "bin/jp.php" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "files": [ - "src/JmesPath.php" - ], - "psr-4": { - "JmesPath\\": "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" - } - ], - "description": "Declaratively specify how to extract elements from a JSON document", - "keywords": [ - "json", - "jsonpath" - ], - "support": { - "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.7.0" - }, - "time": "2023-08-25T10:54:48+00:00" - }, { "name": "nesbot/carbon", "version": "2.71.0", @@ -3355,251 +2315,18 @@ ], "time": "2023-02-08T01:06:31+00:00" }, - { - "name": "owen-it/laravel-auditing", - "version": "v13.5.1", - "source": { - "type": "git", - "url": "https://github.com/owen-it/laravel-auditing.git", - "reference": "8b9c5bd7d6e79ed63376a86b1861ab1606215801" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/owen-it/laravel-auditing/zipball/8b9c5bd7d6e79ed63376a86b1861ab1606215801", - "reference": "8b9c5bd7d6e79ed63376a86b1861ab1606215801", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/console": "^7.0|^8.0|^9.0|^10.0", - "illuminate/database": "^7.0|^8.0|^9.0|^10.0", - "illuminate/filesystem": "^7.0|^8.0|^9.0|^10.0", - "php": "^7.3|^8.0" - }, - "require-dev": { - "laravel/legacy-factories": "*", - "mockery/mockery": "^1.0", - "orchestra/testbench": "^5.0|^6.0|^7.0|^8.0", - "phpunit/phpunit": "^9.0" - }, - "suggest": { - "irazasyed/larasupport": "Needed to publish the package configuration in Lumen" - }, - "type": "package", - "extra": { - "branch-alias": { - "dev-master": "v13-dev" - }, - "laravel": { - "providers": [ - "OwenIt\\Auditing\\AuditingServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "OwenIt\\Auditing\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Antério Vieira", - "email": "anteriovieira@gmail.com" - }, - { - "name": "Raphael França", - "email": "raphaelfrancabsb@gmail.com" - }, - { - "name": "Morten D. Hansen", - "email": "morten@visia.dk" - } - ], - "description": "Audit changes of your Eloquent models in Laravel/Lumen", - "homepage": "http://laravel-auditing.com", - "keywords": [ - "Accountability", - "Audit", - "auditing", - "changes", - "eloquent", - "history", - "laravel", - "log", - "logging", - "lumen", - "observer", - "record", - "revision", - "tracking" - ], - "support": { - "issues": "https://github.com/owen-it/laravel-auditing/issues", - "source": "https://github.com/owen-it/laravel-auditing" - }, - "time": "2023-06-19T14:51:52+00:00" - }, - { - "name": "php-ffmpeg/php-ffmpeg", - "version": "v1.1.0", - "source": { - "type": "git", - "url": "https://github.com/PHP-FFMpeg/PHP-FFMpeg.git", - "reference": "eace6f174ff6d206ba648483ebe59760f7f6a0e1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-FFMpeg/PHP-FFMpeg/zipball/eace6f174ff6d206ba648483ebe59760f7f6a0e1", - "reference": "eace6f174ff6d206ba648483ebe59760f7f6a0e1", - "shasum": "" - }, - "require": { - "evenement/evenement": "^3.0", - "php": "^8.0 || ^8.1 || ^8.2", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "spatie/temporary-directory": "^2.0", - "symfony/cache": "^5.4 || ^6.0", - "symfony/process": "^5.4 || ^6.0" - }, - "require-dev": { - "mockery/mockery": "^1.5", - "phpunit/phpunit": "^9.5.10" - }, - "suggest": { - "php-ffmpeg/extras": "A compilation of common audio & video drivers for PHP-FFMpeg" - }, - "type": "library", - "autoload": { - "psr-4": { - "FFMpeg\\": "src/FFMpeg", - "Alchemy\\BinaryDriver\\": "src/Alchemy/BinaryDriver" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Romain Neutron", - "email": "imprec@gmail.com", - "homepage": "http://www.lickmychip.com/" - }, - { - "name": "Phraseanet Team", - "email": "info@alchemy.fr", - "homepage": "http://www.phraseanet.com/" - }, - { - "name": "Patrik Karisch", - "email": "patrik@karisch.guru", - "homepage": "http://www.karisch.guru" - }, - { - "name": "Romain Biard", - "email": "romain.biard@gmail.com", - "homepage": "https://www.strime.io/" - }, - { - "name": "Jens Hausdorf", - "email": "hello@jens-hausdorf.de", - "homepage": "https://jens-hausdorf.de" - }, - { - "name": "Pascal Baljet", - "email": "pascal@protone.media", - "homepage": "https://protone.media" - } - ], - "description": "FFMpeg PHP, an Object Oriented library to communicate with AVconv / ffmpeg", - "keywords": [ - "audio", - "audio processing", - "avconv", - "avprobe", - "ffmpeg", - "ffprobe", - "video", - "video processing" - ], - "support": { - "issues": "https://github.com/PHP-FFMpeg/PHP-FFMpeg/issues", - "source": "https://github.com/PHP-FFMpeg/PHP-FFMpeg/tree/v1.1.0" - }, - "time": "2022-12-09T13:57:05+00:00" - }, - { - "name": "php-jsonpointer/php-jsonpointer", - "version": "v3.0.2", - "source": { - "type": "git", - "url": "https://github.com/raphaelstolt/php-jsonpointer.git", - "reference": "4428f86c6f23846e9faa5a420c4ef14e485b3afb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/raphaelstolt/php-jsonpointer/zipball/4428f86c6f23846e9faa5a420c4ef14e485b3afb", - "reference": "4428f86c6f23846e9faa5a420c4ef14e485b3afb", - "shasum": "" - }, - "require": { - "php": ">=5.4" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^1.11", - "phpunit/phpunit": "4.6.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Rs\\Json": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Raphael Stolt", - "email": "raphael.stolt@gmail.com", - "homepage": "http://raphaelstolt.blogspot.com/" - } - ], - "description": "Implementation of JSON Pointer (http://tools.ietf.org/html/rfc6901)", - "homepage": "https://github.com/raphaelstolt/php-jsonpointer", - "keywords": [ - "json", - "json pointer", - "json traversal" - ], - "support": { - "issues": "https://github.com/raphaelstolt/php-jsonpointer/issues", - "source": "https://github.com/raphaelstolt/php-jsonpointer/tree/master" - }, - "time": "2016-08-29T08:51:01+00:00" - }, { "name": "phpoption/phpoption", - "version": "1.9.1", + "version": "1.9.2", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e" + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e", - "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", "shasum": "" }, "require": { @@ -3607,7 +2334,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "type": "library", "extra": { @@ -3649,7 +2376,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.1" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" }, "funding": [ { @@ -3661,56 +2388,7 @@ "type": "tidelift" } ], - "time": "2023-02-25T19:38:58+00:00" - }, - { - "name": "psr/cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" - }, - "time": "2021-02-03T23:26:27+00:00" + "time": "2023-11-12T21:59:55+00:00" }, { "name": "psr/clock", @@ -4339,16 +3017,16 @@ }, { "name": "ramsey/uuid", - "version": "4.7.4", + "version": "4.7.5", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "60a4c63ab724854332900504274f6150ff26d286" + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286", - "reference": "60a4c63ab724854332900504274f6150ff26d286", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", "shasum": "" }, "require": { @@ -4415,7 +3093,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.4" + "source": "https://github.com/ramsey/uuid/tree/4.7.5" }, "funding": [ { @@ -4427,373 +3105,20 @@ "type": "tidelift" } ], - "time": "2023-04-15T23:01:58+00:00" - }, - { - "name": "spatie/temporary-directory", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/temporary-directory.git", - "reference": "efc258c9f4da28f0c7661765b8393e4ccee3d19c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/efc258c9f4da28f0c7661765b8393e4ccee3d19c", - "reference": "efc258c9f4da28f0c7661765b8393e4ccee3d19c", - "shasum": "" - }, - "require": { - "php": "^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\TemporaryDirectory\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alex Vanderbist", - "email": "alex@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "Easily create, use and destroy temporary directories", - "homepage": "https://github.com/spatie/temporary-directory", - "keywords": [ - "php", - "spatie", - "temporary-directory" - ], - "support": { - "issues": "https://github.com/spatie/temporary-directory/issues", - "source": "https://github.com/spatie/temporary-directory/tree/2.2.0" - }, - "funding": [ - { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" - }, - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2023-09-25T07:13:36+00:00" - }, - { - "name": "square/square", - "version": "32.0.0.20231018", - "source": { - "type": "git", - "url": "https://github.com/square/square-php-sdk.git", - "reference": "773b5b360766fe9f280c5ef8de83a6a97f7a0555" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/square/square-php-sdk/zipball/773b5b360766fe9f280c5ef8de83a6a97f7a0555", - "reference": "773b5b360766fe9f280c5ef8de83a6a97f7a0555", - "shasum": "" - }, - "require": { - "apimatic/core": "~0.3.0", - "apimatic/core-interfaces": "~0.1.0", - "apimatic/unirest-php": "^4.0.0", - "ext-json": "*", - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "phan/phan": "5.4.2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Square\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Square Developer Platform", - "email": "developers@squareup.com", - "homepage": "https://squareup.com/developers" - } - ], - "description": "Use Square APIs to manage and run business including payment, customer, product, inventory, and employee management.", - "homepage": "https://squareup.com/developers", - "keywords": [ - "api", - "sdk", - "square" - ], - "support": { - "issues": "https://github.com/square/square-php-sdk/issues", - "source": "https://github.com/square/square-php-sdk/tree/32.0.0.20231018" - }, - "time": "2023-10-17T19:11:35+00:00" - }, - { - "name": "sunspikes/clamav-validator", - "version": "v2.7.0", - "source": { - "type": "git", - "url": "https://github.com/sunspikes/clamav-validator.git", - "reference": "0db18646b73afbd5094876f48a49e28a9a1426ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sunspikes/clamav-validator/zipball/0db18646b73afbd5094876f48a49e28a9a1426ed", - "reference": "0db18646b73afbd5094876f48a49e28a9a1426ed", - "shasum": "" - }, - "require": { - "ext-sockets": "*", - "illuminate/support": "~5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", - "illuminate/validation": "~5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", - "php": "^7.3|^8.0", - "xenolope/quahog": "^3.0" - }, - "require-dev": { - "mockery/mockery": "^1.5.0", - "phpunit/phpunit": "^9.5.10", - "roave/security-advisories": "dev-master", - "scrutinizer/ocular": "dev-master" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Sunspikes\\ClamavValidator\\ClamavValidatorServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Sunspikes\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Krishnaprasad MG", - "email": "sunspikes@gmail.com" - } - ], - "description": "Custom Laravel 5 anti-virus validator for file uploads.", - "homepage": "https://github.com/sunspikes/clamav-validator", - "keywords": [ - "clamav", - "laravel", - "validator", - "virus" - ], - "support": { - "issues": "https://github.com/sunspikes/clamav-validator/issues", - "source": "https://github.com/sunspikes/clamav-validator/tree/v2.7.0" - }, - "time": "2023-03-09T09:54:24+00:00" - }, - { - "name": "symfony/cache", - "version": "v6.3.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "6c1a3ea078c4d88ee892530945df63a87981b2da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/6c1a3ea078c4d88ee892530945df63a87981b2da", - "reference": "6c1a3ea078c4d88ee892530945df63a87981b2da", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/cache": "^2.0|^3.0", - "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3", - "symfony/var-exporter": "^6.2.10" - }, - "conflict": { - "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/var-dumper": "<5.4" - }, - "provide": { - "psr/cache-implementation": "2.0|3.0", - "psr/simple-cache-implementation": "1.0|2.0|3.0", - "symfony/cache-implementation": "1.1|2.0|3.0" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/dbal": "^2.13.1|^3.0", - "predis/predis": "^1.1|^2.0", - "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/filesystem": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Cache\\": "" - }, - "classmap": [ - "Traits/ValueWrapper.php" - ], - "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 extended PSR-6, PSR-16 (and tags) implementations", - "homepage": "https://symfony.com", - "keywords": [ - "caching", - "psr6" - ], - "support": { - "source": "https://github.com/symfony/cache/tree/v6.3.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": "2023-09-26T15:48:55+00:00" - }, - { - "name": "symfony/cache-contracts", - "version": "v3.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache-contracts.git", - "reference": "ad945640ccc0ae6e208bcea7d7de4b39b569896b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/ad945640ccc0ae6e208bcea7d7de4b39b569896b", - "reference": "ad945640ccc0ae6e208bcea7d7de4b39b569896b", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/cache": "^3.0" - }, - "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\\Cache\\": "" - } - }, - "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 caching", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.3.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" + "time": "2023-11-08T05:53:05+00:00" }, { "name": "symfony/console", - "version": "v6.3.4", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" + "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", - "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", + "url": "https://api.github.com/repos/symfony/console/zipball/0d14a9f6d04d4ac38a8cea1171f4554e325dae92", + "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92", "shasum": "" }, "require": { @@ -4854,7 +3179,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.3.4" + "source": "https://github.com/symfony/console/tree/v6.3.8" }, "funding": [ { @@ -4870,7 +3195,7 @@ "type": "tidelift" } ], - "time": "2023-08-16T10:10:12+00:00" + "time": "2023-10-31T08:09:35+00:00" }, { "name": "symfony/css-selector", @@ -5300,16 +3625,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.3.7", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "59d1837d5d992d16c2628cd0d6b76acf8d69b33e" + "reference": "ce332676de1912c4389222987193c3ef38033df6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/59d1837d5d992d16c2628cd0d6b76acf8d69b33e", - "reference": "59d1837d5d992d16c2628cd0d6b76acf8d69b33e", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ce332676de1912c4389222987193c3ef38033df6", + "reference": "ce332676de1912c4389222987193c3ef38033df6", "shasum": "" }, "require": { @@ -5357,7 +3682,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.7" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.8" }, "funding": [ { @@ -5373,20 +3698,20 @@ "type": "tidelift" } ], - "time": "2023-10-28T23:55:27+00:00" + "time": "2023-11-07T10:17:15+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.3.7", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "6d4098095f93279d9536a0e9124439560cc764d0" + "reference": "929202375ccf44a309c34aeca8305408442ebcc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6d4098095f93279d9536a0e9124439560cc764d0", - "reference": "6d4098095f93279d9536a0e9124439560cc764d0", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/929202375ccf44a309c34aeca8305408442ebcc1", + "reference": "929202375ccf44a309c34aeca8305408442ebcc1", "shasum": "" }, "require": { @@ -5470,7 +3795,7 @@ "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/v6.3.7" + "source": "https://github.com/symfony/http-kernel/tree/v6.3.8" }, "funding": [ { @@ -5486,7 +3811,7 @@ "type": "tidelift" } ], - "time": "2023-10-29T14:31:45+00:00" + "time": "2023-11-10T13:47:32+00:00" }, { "name": "symfony/mailer", @@ -6618,16 +4943,16 @@ }, { "name": "symfony/string", - "version": "v6.3.5", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339" + "reference": "13880a87790c76ef994c91e87efb96134522577a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/13d76d0fb049051ed12a04bef4f9de8715bea339", - "reference": "13d76d0fb049051ed12a04bef4f9de8715bea339", + "url": "https://api.github.com/repos/symfony/string/zipball/13880a87790c76ef994c91e87efb96134522577a", + "reference": "13880a87790c76ef994c91e87efb96134522577a", "shasum": "" }, "require": { @@ -6684,7 +5009,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.5" + "source": "https://github.com/symfony/string/tree/v6.3.8" }, "funding": [ { @@ -6700,7 +5025,7 @@ "type": "tidelift" } ], - "time": "2023-09-18T10:38:32+00:00" + "time": "2023-11-09T08:28:21+00:00" }, { "name": "symfony/translation", @@ -6877,16 +5202,16 @@ }, { "name": "symfony/uid", - "version": "v6.3.0", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "01b0f20b1351d997711c56f1638f7a8c3061e384" + "reference": "819fa5ac210fb7ddda4752b91a82f50be7493dd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/01b0f20b1351d997711c56f1638f7a8c3061e384", - "reference": "01b0f20b1351d997711c56f1638f7a8c3061e384", + "url": "https://api.github.com/repos/symfony/uid/zipball/819fa5ac210fb7ddda4752b91a82f50be7493dd9", + "reference": "819fa5ac210fb7ddda4752b91a82f50be7493dd9", "shasum": "" }, "require": { @@ -6931,7 +5256,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.3.0" + "source": "https://github.com/symfony/uid/tree/v6.3.8" }, "funding": [ { @@ -6947,20 +5272,20 @@ "type": "tidelift" } ], - "time": "2023-04-08T07:25:02+00:00" + "time": "2023-10-31T08:07:48+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.3.6", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97" + "reference": "81acabba9046550e89634876ca64bfcd3c06aa0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/999ede244507c32b8e43aebaa10e9fce20de7c97", - "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/81acabba9046550e89634876ca64bfcd3c06aa0a", + "reference": "81acabba9046550e89634876ca64bfcd3c06aa0a", "shasum": "" }, "require": { @@ -7015,7 +5340,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.3.6" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.8" }, "funding": [ { @@ -7031,130 +5356,7 @@ "type": "tidelift" } ], - "time": "2023-10-12T18:45:56+00:00" - }, - { - "name": "symfony/var-exporter", - "version": "v6.3.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/df1f8aac5751871b83d30bf3e2c355770f8f0691", - "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "symfony/var-dumper": "^5.4|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "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": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], - "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.3.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": "2023-08-16T18:14:47+00:00" - }, - { - "name": "thiagoalessio/tesseract_ocr", - "version": "2.13.0", - "source": { - "type": "git", - "url": "https://github.com/thiagoalessio/tesseract-ocr-for-php.git", - "reference": "232a8cb9d571992f9bd1e263f2f6909cf6c173a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thiagoalessio/tesseract-ocr-for-php/zipball/232a8cb9d571992f9bd1e263f2f6909cf6c173a1", - "reference": "232a8cb9d571992f9bd1e263f2f6909cf6c173a1", - "shasum": "" - }, - "require": { - "php": "^5.3 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/php-code-coverage": "^2.2.4 || ^9.0.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "thiagoalessio\\TesseractOCR\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "thiagoalessio", - "email": "thiagoalessio@me.com" - } - ], - "description": "A wrapper to work with Tesseract OCR inside PHP.", - "keywords": [ - "OCR", - "Tesseract", - "text recognition" - ], - "support": { - "irc": "irc://irc.freenode.net/tesseract-ocr-for-php", - "issues": "https://github.com/thiagoalessio/tesseract-ocr-for-php/issues", - "source": "https://github.com/thiagoalessio/tesseract-ocr-for-php" - }, - "time": "2023-10-05T21:14:48+00:00" + "time": "2023-11-08T10:42:36+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -7211,31 +5413,31 @@ }, { "name": "vlucas/phpdotenv", - "version": "v5.5.0", + "version": "v5.6.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", - "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", "shasum": "" }, "require": { "ext-pcre": "*", - "graham-campbell/result-type": "^1.0.2", - "php": "^7.1.3 || ^8.0", - "phpoption/phpoption": "^1.8", - "symfony/polyfill-ctype": "^1.23", - "symfony/polyfill-mbstring": "^1.23.1", - "symfony/polyfill-php80": "^1.23.1" + "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.4.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-filter": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "suggest": { "ext-filter": "Required to use the boolean validator." @@ -7247,7 +5449,7 @@ "forward-command": true }, "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "autoload": { @@ -7279,7 +5481,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" }, "funding": [ { @@ -7291,7 +5493,7 @@ "type": "tidelift" } ], - "time": "2022-10-16T01:01:54+00:00" + "time": "2023-11-12T22:43:29+00:00" }, { "name": "voku/portable-ascii", @@ -7424,344 +5626,9 @@ "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, "time": "2022-06-03T18:03:27+00:00" - }, - { - "name": "xenolope/quahog", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/jonjomckay/quahog.git", - "reference": "b3823659050cc54a160e8739d077c96d8830a2fa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jonjomckay/quahog/zipball/b3823659050cc54a160e8739d077c96d8830a2fa", - "reference": "b3823659050cc54a160e8739d077c96d8830a2fa", - "shasum": "" - }, - "require": { - "clue/socket-raw": "^1.3", - "php": ">=7.3" - }, - "require-dev": { - "mikey179/vfsstream": "^1.6", - "phpunit/phpunit": "^9.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Xenolope\\Quahog\\": "src/Quahog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonjo McKay", - "email": "jonjo@jonjomckay.com" - } - ], - "description": "A PHP client library for ClamAV clamd daemon", - "support": { - "issues": "https://github.com/jonjomckay/quahog/issues", - "source": "https://github.com/jonjomckay/quahog/tree/v3.0.0" - }, - "time": "2020-11-25T12:06:14+00:00" } ], "packages-dev": [ - { - "name": "barryvdh/laravel-ide-helper", - "version": "v2.13.0", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "81d5b223ff067a1f38e14c100997e153b837fe4a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/81d5b223ff067a1f38e14c100997e153b837fe4a", - "reference": "81d5b223ff067a1f38e14c100997e153b837fe4a", - "shasum": "" - }, - "require": { - "barryvdh/reflection-docblock": "^2.0.6", - "composer/class-map-generator": "^1.0", - "doctrine/dbal": "^2.6 || ^3", - "ext-json": "*", - "illuminate/console": "^8 || ^9 || ^10", - "illuminate/filesystem": "^8 || ^9 || ^10", - "illuminate/support": "^8 || ^9 || ^10", - "nikic/php-parser": "^4.7", - "php": "^7.3 || ^8.0", - "phpdocumentor/type-resolver": "^1.1.0" - }, - "require-dev": { - "ext-pdo_sqlite": "*", - "friendsofphp/php-cs-fixer": "^2", - "illuminate/config": "^8 || ^9 || ^10", - "illuminate/view": "^8 || ^9 || ^10", - "mockery/mockery": "^1.4", - "orchestra/testbench": "^6 || ^7 || ^8", - "phpunit/phpunit": "^8.5 || ^9", - "spatie/phpunit-snapshot-assertions": "^3 || ^4", - "vimeo/psalm": "^3.12" - }, - "suggest": { - "illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9|^10)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.12-dev" - }, - "laravel": { - "providers": [ - "Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Barryvdh\\LaravelIdeHelper\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.", - "keywords": [ - "autocomplete", - "codeintel", - "helper", - "ide", - "laravel", - "netbeans", - "phpdoc", - "phpstorm", - "sublime" - ], - "support": { - "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", - "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.13.0" - }, - "funding": [ - { - "url": "https://fruitcake.nl", - "type": "custom" - }, - { - "url": "https://github.com/barryvdh", - "type": "github" - } - ], - "time": "2023-02-04T13:56:40+00:00" - }, - { - "name": "barryvdh/reflection-docblock", - "version": "v2.1.1", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/ReflectionDocBlock.git", - "reference": "e6811e927f0ecc37cc4deaa6627033150343e597" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/e6811e927f0ecc37cc4deaa6627033150343e597", - "reference": "e6811e927f0ecc37cc4deaa6627033150343e597", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.14|^9" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Barryvdh": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "support": { - "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.1.1" - }, - "time": "2023-06-14T05:06:27+00:00" - }, - { - "name": "composer/class-map-generator", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/composer/class-map-generator.git", - "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/953cc4ea32e0c31f2185549c7d216d7921f03da9", - "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9", - "shasum": "" - }, - "require": { - "composer/pcre": "^2.1 || ^3.1", - "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" - }, - "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\ClassMapGenerator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Utilities to scan PHP code and generate class maps.", - "keywords": [ - "classmap" - ], - "support": { - "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.1.0" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2023-06-30T13:58:57+00:00" - }, - { - "name": "composer/pcre", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.1" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2023-10-11T07:11:09+00:00" - }, { "name": "fakerphp/faker", "version": "v1.23.0", @@ -7832,16 +5699,16 @@ }, { "name": "filp/whoops", - "version": "2.15.3", + "version": "2.15.4", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "c83e88a30524f9360b11f585f71e6b17313b7187" + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/c83e88a30524f9360b11f585f71e6b17313b7187", - "reference": "c83e88a30524f9360b11f585f71e6b17313b7187", + "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", "shasum": "" }, "require": { @@ -7891,7 +5758,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.15.3" + "source": "https://github.com/filp/whoops/tree/2.15.4" }, "funding": [ { @@ -7899,7 +5766,7 @@ "type": "github" } ], - "time": "2023-07-13T12:00:00+00:00" + "time": "2023-11-03T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -7952,86 +5819,18 @@ }, "time": "2020-07-09T08:09:16+00:00" }, - { - "name": "itsgoingd/clockwork", - "version": "v5.1.12", - "source": { - "type": "git", - "url": "https://github.com/itsgoingd/clockwork.git", - "reference": "c9dbdbb1f0efd19bb80f1080ef63f1b9b1bc3b1b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/itsgoingd/clockwork/zipball/c9dbdbb1f0efd19bb80f1080ef63f1b9b1bc3b1b", - "reference": "c9dbdbb1f0efd19bb80f1080ef63f1b9b1bc3b1b", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": ">=5.6" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Clockwork\\Support\\Laravel\\ClockworkServiceProvider" - ], - "aliases": { - "Clockwork": "Clockwork\\Support\\Laravel\\Facade" - } - } - }, - "autoload": { - "psr-4": { - "Clockwork\\": "Clockwork/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "itsgoingd", - "email": "itsgoingd@luzer.sk", - "homepage": "https://twitter.com/itsgoingd" - } - ], - "description": "php dev tools in your browser", - "homepage": "https://underground.works/clockwork", - "keywords": [ - "Devtools", - "debugging", - "laravel", - "logging", - "lumen", - "profiling", - "slim" - ], - "support": { - "issues": "https://github.com/itsgoingd/clockwork/issues", - "source": "https://github.com/itsgoingd/clockwork/tree/v5.1.12" - }, - "funding": [ - { - "url": "https://github.com/itsgoingd", - "type": "github" - } - ], - "time": "2022-12-13T00:04:12+00:00" - }, { "name": "laravel/pint", - "version": "v1.13.5", + "version": "v1.13.6", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "df105cf8ce7a8f0b8a9425ff45cd281a5448e423" + "reference": "3e3d2ab01c7d8b484c18e6100ecf53639c744fa7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/df105cf8ce7a8f0b8a9425ff45cd281a5448e423", - "reference": "df105cf8ce7a8f0b8a9425ff45cd281a5448e423", + "url": "https://api.github.com/repos/laravel/pint/zipball/3e3d2ab01c7d8b484c18e6100ecf53639c744fa7", + "reference": "3e3d2ab01c7d8b484c18e6100ecf53639c744fa7", "shasum": "" }, "require": { @@ -8042,13 +5841,13 @@ "php": "^8.1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.34.1", - "illuminate/view": "^10.26.2", - "laravel-zero/framework": "^10.1.2", + "friendsofphp/php-cs-fixer": "^3.38.0", + "illuminate/view": "^10.30.1", + "laravel-zero/framework": "^10.3.0", "mockery/mockery": "^1.6.6", "nunomaduro/larastan": "^2.6.4", "nunomaduro/termwind": "^1.15.1", - "pestphp/pest": "^2.20.0" + "pestphp/pest": "^2.24.2" }, "bin": [ "builds/pint" @@ -8084,7 +5883,7 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2023-10-26T09:26:10+00:00" + "time": "2023-11-07T17:59:57+00:00" }, { "name": "laravel/sail", @@ -8502,164 +6301,6 @@ }, "time": "2022-02-21T01:04:05+00:00" }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.7.3", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", - "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.13" - }, - "require-dev": { - "ext-tokenizer": "*", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.3" - }, - "time": "2023-08-12T11:01:26+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "1.24.2", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "bcad8d995980440892759db0c32acae7c8e79442" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bcad8d995980440892759db0c32acae7c8e79442", - "reference": "bcad8d995980440892759db0c32acae7c8e79442", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/annotations": "^2.0", - "nikic/php-parser": "^4.15", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", - "symfony/process": "^5.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.2" - }, - "time": "2023-09-26T12:28:12+00:00" - }, { "name": "phpunit/php-code-coverage", "version": "10.1.7", @@ -10306,16 +7947,16 @@ }, { "name": "symfony/yaml", - "version": "v6.3.3", + "version": "v6.3.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add" + "reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e23292e8c07c85b971b44c1c4b87af52133e2add", - "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add", + "url": "https://api.github.com/repos/symfony/yaml/zipball/3493af8a8dad7fa91c77fa473ba23ecd95334a92", + "reference": "3493af8a8dad7fa91c77fa473ba23ecd95334a92", "shasum": "" }, "require": { @@ -10358,7 +7999,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.3.3" + "source": "https://github.com/symfony/yaml/tree/v6.3.8" }, "funding": [ { @@ -10374,7 +8015,7 @@ "type": "tidelift" } ], - "time": "2023-07-31T07:08:24+00:00" + "time": "2023-11-06T10:58:05+00:00" }, { "name": "theseer/tokenizer", @@ -10436,5 +8077,5 @@ "php": "^8.1" }, "platform-dev": [], - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.3.0" } diff --git a/config/app.php b/config/app.php index ddfaa03..9207160 100644 --- a/config/app.php +++ b/config/app.php @@ -1,7 +1,7 @@ env('APP_TIMEZONE', 'UTC'), + 'timezone' => 'UTC', /* |-------------------------------------------------------------------------- @@ -141,7 +141,7 @@ return [ 'maintenance' => [ 'driver' => 'file', - // 'store' => 'redis', + // 'store' => 'redis', ], /* @@ -159,8 +159,6 @@ return [ /* * Package Service Providers... */ - Intervention\Image\ImageServiceProvider::class, - OwenIt\Auditing\AuditingServiceProvider::class, /* * Application Service Providers... @@ -184,7 +182,7 @@ return [ */ 'aliases' => Facade::defaultAliases()->merge([ - 'ImageIntervention' => Intervention\Image\Facades\Image::class, + // 'Example' => App\Facades\Example::class, ])->toArray(), ]; diff --git a/config/audit.php b/config/audit.php deleted file mode 100644 index 116a6bb..0000000 --- a/config/audit.php +++ /dev/null @@ -1,169 +0,0 @@ - env('AUDITING_ENABLED', true), - - /* - |-------------------------------------------------------------------------- - | Audit Implementation - |-------------------------------------------------------------------------- - | - | Define which Audit model implementation should be used. - | - */ - - 'implementation' => OwenIt\Auditing\Models\Audit::class, - - /* - |-------------------------------------------------------------------------- - | User Morph prefix & Guards - |-------------------------------------------------------------------------- - | - | Define the morph prefix and authentication guards for the User resolver. - | - */ - - 'user' => [ - 'morph_prefix' => 'user', - 'guards' => [ - 'web', - 'api' - ], - 'resolver' => OwenIt\Auditing\Resolvers\UserResolver::class - ], - - /* - |-------------------------------------------------------------------------- - | Audit Resolvers - |-------------------------------------------------------------------------- - | - | Define the User, IP Address, User Agent and URL resolver implementations. - | - */ - 'resolvers' => [ - 'ip_address' => OwenIt\Auditing\Resolvers\IpAddressResolver::class, - 'user_agent' => OwenIt\Auditing\Resolvers\UserAgentResolver::class, - 'url' => OwenIt\Auditing\Resolvers\UrlResolver::class, - ], - - /* - |-------------------------------------------------------------------------- - | Audit Events - |-------------------------------------------------------------------------- - | - | The Eloquent events that trigger an Audit. - | - */ - - 'events' => [ - 'created', - 'updated', - 'deleted', - 'restored' - ], - - /* - |-------------------------------------------------------------------------- - | Strict Mode - |-------------------------------------------------------------------------- - | - | Enable the strict mode when auditing? - | - */ - - 'strict' => false, - - /* - |-------------------------------------------------------------------------- - | Global exclude - |-------------------------------------------------------------------------- - | - | Have something you always want to exclude by default? - add it here. - | Note that this is overwritten (not merged) with local exclude - | - */ - - 'exclude' => [], - - /* - |-------------------------------------------------------------------------- - | Empty Values - |-------------------------------------------------------------------------- - | - | Should Audit records be stored when the recorded old_values & new_values - | are both empty? - | - | Some events may be empty on purpose. Use allowed_empty_values to exclude - | those from the empty values check. For example when auditing - | model retrieved events which will never have new and old values. - | - | - */ - - 'empty_values' => true, - 'allowed_empty_values' => [ - 'retrieved' - ], - - /* - |-------------------------------------------------------------------------- - | Audit Timestamps - |-------------------------------------------------------------------------- - | - | Should the created_at, updated_at and deleted_at timestamps be audited? - | - */ - - 'timestamps' => false, - - /* - |-------------------------------------------------------------------------- - | Audit Threshold - |-------------------------------------------------------------------------- - | - | Specify a threshold for the amount of Audit records a model can have. - | Zero means no limit. - | - */ - - 'threshold' => 0, - - /* - |-------------------------------------------------------------------------- - | Audit Driver - |-------------------------------------------------------------------------- - | - | The default audit driver used to keep track of changes. - | - */ - - 'driver' => 'database', - - /* - |-------------------------------------------------------------------------- - | Audit Driver Configurations - |-------------------------------------------------------------------------- - | - | Available audit drivers and respective configurations. - | - */ - - 'drivers' => [ - 'database' => [ - 'table' => 'audits', - 'connection' => null, - ], - ], - - /* - |-------------------------------------------------------------------------- - | Audit Console - |-------------------------------------------------------------------------- - | - | Whether console events should be audited (eg. php artisan db:seed). - | - */ - - 'console' => false, -]; diff --git a/config/broadcasting.php b/config/broadcasting.php index bc46200..2410485 100644 --- a/config/broadcasting.php +++ b/config/broadcasting.php @@ -36,7 +36,8 @@ return [ 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ - 'host' => env('PUSHER_HOST') === null ?: 'api-' . env('PUSHER_APP_CLUSTER', 'mt1') . '.pusher.com', + 'cluster' => env('PUSHER_APP_CLUSTER'), + 'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com', 'port' => env('PUSHER_PORT', 443), 'scheme' => env('PUSHER_SCHEME', 'https'), 'encrypted' => true, diff --git a/config/cache.php b/config/cache.php index daf5e68..d4171e2 100644 --- a/config/cache.php +++ b/config/cache.php @@ -52,6 +52,7 @@ return [ 'file' => [ 'driver' => 'file', 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), ], 'memcached' => [ @@ -105,6 +106,6 @@ return [ | */ - 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_cache_'), + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), ]; diff --git a/config/clamav.php b/config/clamav.php deleted file mode 100644 index c58c198..0000000 --- a/config/clamav.php +++ /dev/null @@ -1,69 +0,0 @@ - env('CLAMAV_PREFERRED_SOCKET', 'unix_socket'), - - /* - |-------------------------------------------------------------------------- - | Unix Socket - |-------------------------------------------------------------------------- - | This option defines the location to the unix socket-file. For example - | /var/run/clamav/clamd.ctl - */ - 'unix_socket' => env('CLAMAV_UNIX_SOCKET', '/var/run/clamav/clamd.ctl'), - - /* - |-------------------------------------------------------------------------- - | TCP Socket - |-------------------------------------------------------------------------- - | This option defines the TCP socket to the ClamAV instance. - */ - 'tcp_socket' => env('CLAMAV_TCP_SOCKET', 'tcp://127.0.0.1:3310'), - - /* - |-------------------------------------------------------------------------- - | Socket connect timeout - |-------------------------------------------------------------------------- - | This option defines the maximum time to wait in seconds for socket connection attempts before failure or timeout, - | default null = no limit. - */ - 'socket_connect_timeout' => env('CLAMAV_SOCKET_CONNECT_TIMEOUT', null), - - /* - |-------------------------------------------------------------------------- - | Socket read timeout - |-------------------------------------------------------------------------- - | This option defines the maximum time to wait in seconds for a read. - */ - 'socket_read_timeout' => env('CLAMAV_SOCKET_READ_TIMEOUT', 30), - - /* - |-------------------------------------------------------------------------- - | Throw exceptions instead of returning failures when scan fails. - |-------------------------------------------------------------------------- - | This makes it easier for a developer to find the source of a clamav - | failure, but an end user may only see a 500 error for the user - | if exceptions are not displayed. - */ - 'client_exceptions' => env('CLAMAV_CLIENT_EXCEPTIONS', false), - - /* - |-------------------------------------------------------------------------- - | Skip validation - |-------------------------------------------------------------------------- - | This skips the virus validation for current environment. - | - | Please note when true it won't connect to ClamAV and will skip the virus validation. - */ - 'skip_validation' => env('CLAMAV_SKIP_VALIDATION', false), -]; diff --git a/config/clockwork.php b/config/clockwork.php deleted file mode 100644 index 38f6107..0000000 --- a/config/clockwork.php +++ /dev/null @@ -1,416 +0,0 @@ - env('CLOCKWORK_ENABLE', null), - - /* - |------------------------------------------------------------------------------------------------------------------ - | Features - |------------------------------------------------------------------------------------------------------------------ - | - | You can enable or disable various Clockwork features here. Some features have additional settings (eg. slow query - | threshold for database queries). - | - */ - - 'features' => [ - - // Cache usage stats and cache queries including results - 'cache' => [ - 'enabled' => env('CLOCKWORK_CACHE_ENABLED', true), - - // Collect cache queries - 'collect_queries' => env('CLOCKWORK_CACHE_QUERIES', true), - - // Collect values from cache queries (high performance impact with a very high number of queries) - 'collect_values' => env('CLOCKWORK_CACHE_COLLECT_VALUES', false) - ], - - // Database usage stats and queries - 'database' => [ - 'enabled' => env('CLOCKWORK_DATABASE_ENABLED', true), - - // Collect database queries (high performance impact with a very high number of queries) - 'collect_queries' => env('CLOCKWORK_DATABASE_COLLECT_QUERIES', true), - - // Collect details of models updates (high performance impact with a lot of model updates) - 'collect_models_actions' => env('CLOCKWORK_DATABASE_COLLECT_MODELS_ACTIONS', true), - - // Collect details of retrieved models (very high performance impact with a lot of models retrieved) - 'collect_models_retrieved' => env('CLOCKWORK_DATABASE_COLLECT_MODELS_RETRIEVED', false), - - // Query execution time threshold in milliseconds after which the query will be marked as slow - 'slow_threshold' => env('CLOCKWORK_DATABASE_SLOW_THRESHOLD'), - - // Collect only slow database queries - 'slow_only' => env('CLOCKWORK_DATABASE_SLOW_ONLY', false), - - // Detect and report duplicate queries - 'detect_duplicate_queries' => env('CLOCKWORK_DATABASE_DETECT_DUPLICATE_QUERIES', false) - ], - - // Dispatched events - 'events' => [ - 'enabled' => env('CLOCKWORK_EVENTS_ENABLED', true), - - // Ignored events (framework events are ignored by default) - 'ignored_events' => [ - // App\Events\UserRegistered::class, - // 'user.registered' - ], - ], - - // Laravel log (you can still log directly to Clockwork with laravel log disabled) - 'log' => [ - 'enabled' => env('CLOCKWORK_LOG_ENABLED', true) - ], - - // Sent notifications - 'notifications' => [ - 'enabled' => env('CLOCKWORK_NOTIFICATIONS_ENABLED', true), - ], - - // Performance metrics - 'performance' => [ - // Allow collecting of client metrics. Requires separate clockwork-browser npm package. - 'client_metrics' => env('CLOCKWORK_PERFORMANCE_CLIENT_METRICS', true) - ], - - // Dispatched queue jobs - 'queue' => [ - 'enabled' => env('CLOCKWORK_QUEUE_ENABLED', true) - ], - - // Redis commands - 'redis' => [ - 'enabled' => env('CLOCKWORK_REDIS_ENABLED', true) - ], - - // Routes list - 'routes' => [ - 'enabled' => env('CLOCKWORK_ROUTES_ENABLED', false), - - // Collect only routes from particular namespaces (only application routes by default) - 'only_namespaces' => [ 'App' ] - ], - - // Rendered views - 'views' => [ - 'enabled' => env('CLOCKWORK_VIEWS_ENABLED', true), - - // Collect views including view data (high performance impact with a high number of views) - 'collect_data' => env('CLOCKWORK_VIEWS_COLLECT_DATA', false), - - // Use Twig profiler instead of Laravel events for apps using laravel-twigbridge (more precise, but does - // not support collecting view data) - 'use_twig_profiler' => env('CLOCKWORK_VIEWS_USE_TWIG_PROFILER', false) - ] - - ], - - /* - |------------------------------------------------------------------------------------------------------------------ - | Enable web UI - |------------------------------------------------------------------------------------------------------------------ - | - | Clockwork comes with a web UI accessible via http://your.app/clockwork. Here you can enable or disable this - | feature. You can also set a custom path for the web UI. - | - */ - - 'web' => env('CLOCKWORK_WEB', true), - - /* - |------------------------------------------------------------------------------------------------------------------ - | Enable toolbar - |------------------------------------------------------------------------------------------------------------------ - | - | Clockwork can show a toolbar with basic metrics on all responses. Here you can enable or disable this feature. - | Requires a separate clockwork-browser npm library. - | For installation instructions see https://underground.works/clockwork/#docs-viewing-data - | - */ - - 'toolbar' => env('CLOCKWORK_TOOLBAR', true), - - /* - |------------------------------------------------------------------------------------------------------------------ - | HTTP requests collection - |------------------------------------------------------------------------------------------------------------------ - | - | Clockwork collects data about HTTP requests to your app. Here you can choose which requests should be collected. - | - */ - - 'requests' => [ - // With on-demand mode enabled, Clockwork will only profile requests when the browser extension is open or you - // manually pass a "clockwork-profile" cookie or get/post data key. - // Optionally you can specify a "secret" that has to be passed as the value to enable profiling. - 'on_demand' => env('CLOCKWORK_REQUESTS_ON_DEMAND', false), - - // Collect only errors (requests with HTTP 4xx and 5xx responses) - 'errors_only' => env('CLOCKWORK_REQUESTS_ERRORS_ONLY', false), - - // Response time threshold in milliseconds after which the request will be marked as slow - 'slow_threshold' => env('CLOCKWORK_REQUESTS_SLOW_THRESHOLD'), - - // Collect only slow requests - 'slow_only' => env('CLOCKWORK_REQUESTS_SLOW_ONLY', false), - - // Sample the collected requests (e.g. set to 100 to collect only 1 in 100 requests) - 'sample' => env('CLOCKWORK_REQUESTS_SAMPLE', false), - - // List of URIs that should not be collected - 'except' => [ - '/horizon/.*', // Laravel Horizon requests - '/telescope/.*', // Laravel Telescope requests - '/_debugbar/.*', // Laravel DebugBar requests - ], - - // List of URIs that should be collected, any other URI will not be collected if not empty - 'only' => [ - // '/api/.*' - ], - - // Don't collect OPTIONS requests, mostly used in the CSRF pre-flight requests and are rarely of interest - 'except_preflight' => env('CLOCKWORK_REQUESTS_EXCEPT_PREFLIGHT', true) - ], - - /* - |------------------------------------------------------------------------------------------------------------------ - | Artisan commands collection - |------------------------------------------------------------------------------------------------------------------ - | - | Clockwork can collect data about executed artisan commands. Here you can enable and configure which commands - | should be collected. - | - */ - - 'artisan' => [ - // Enable or disable collection of executed Artisan commands - 'collect' => env('CLOCKWORK_ARTISAN_COLLECT', false), - - // List of commands that should not be collected (built-in commands are not collected by default) - 'except' => [ - // 'inspire' - ], - - // List of commands that should be collected, any other command will not be collected if not empty - 'only' => [ - // 'inspire' - ], - - // Enable or disable collection of command output - 'collect_output' => env('CLOCKWORK_ARTISAN_COLLECT_OUTPUT', false), - - // Enable or disable collection of built-in Laravel commands - 'except_laravel_commands' => env('CLOCKWORK_ARTISAN_EXCEPT_LARAVEL_COMMANDS', true) - ], - - /* - |------------------------------------------------------------------------------------------------------------------ - | Queue jobs collection - |------------------------------------------------------------------------------------------------------------------ - | - | Clockwork can collect data about executed queue jobs. Here you can enable and configure which queue jobs should - | be collected. - | - */ - - 'queue' => [ - // Enable or disable collection of executed queue jobs - 'collect' => env('CLOCKWORK_QUEUE_COLLECT', false), - - // List of queue jobs that should not be collected - 'except' => [ - // App\Jobs\ExpensiveJob::class - ], - - // List of queue jobs that should be collected, any other queue job will not be collected if not empty - 'only' => [ - // App\Jobs\BuggyJob::class - ] - ], - - /* - |------------------------------------------------------------------------------------------------------------------ - | Tests collection - |------------------------------------------------------------------------------------------------------------------ - | - | Clockwork can collect data about executed tests. Here you can enable and configure which tests should be - | collected. - | - */ - - 'tests' => [ - // Enable or disable collection of ran tests - 'collect' => env('CLOCKWORK_TESTS_COLLECT', false), - - // List of tests that should not be collected - 'except' => [ - // Tests\Unit\ExampleTest::class - ] - ], - - /* - |------------------------------------------------------------------------------------------------------------------ - | Enable data collection when Clockwork is disabled - |------------------------------------------------------------------------------------------------------------------ - | - | You can enable this setting to collect data even when Clockwork is disabled, e.g. for future analysis. - | - */ - - 'collect_data_always' => env('CLOCKWORK_COLLECT_DATA_ALWAYS', false), - - /* - |------------------------------------------------------------------------------------------------------------------ - | Metadata storage - |------------------------------------------------------------------------------------------------------------------ - | - | Configure how is the metadata collected by Clockwork stored. Two options are available: - | - files - A simple fast storage implementation storing data in one-per-request files. - | - sql - Stores requests in a sql database. Supports MySQL, PostgreSQL and SQLite. Requires PDO. - | - */ - - 'storage' => env('CLOCKWORK_STORAGE', 'files'), - - // Path where the Clockwork metadata is stored - 'storage_files_path' => env('CLOCKWORK_STORAGE_FILES_PATH', storage_path('clockwork')), - - // Compress the metadata files using gzip, trading a little bit of performance for lower disk usage - 'storage_files_compress' => env('CLOCKWORK_STORAGE_FILES_COMPRESS', false), - - // SQL database to use, can be a name of database configured in database.php or a path to a SQLite file - 'storage_sql_database' => env('CLOCKWORK_STORAGE_SQL_DATABASE', storage_path('clockwork.sqlite')), - - // SQL table name to use, the table is automatically created and updated when needed - 'storage_sql_table' => env('CLOCKWORK_STORAGE_SQL_TABLE', 'clockwork'), - - // Maximum lifetime of collected metadata in minutes, older requests will automatically be deleted, false to disable - 'storage_expiration' => env('CLOCKWORK_STORAGE_EXPIRATION', (60 * 24 * 7)), - - /* - |------------------------------------------------------------------------------------------------------------------ - | Authentication - |------------------------------------------------------------------------------------------------------------------ - | - | Clockwork can be configured to require authentication before allowing access to the collected data. This might be - | useful when the application is publicly accessible. Setting to true will enable a simple authentication with a - | pre-configured password. You can also pass a class name of a custom implementation. - | - */ - - 'authentication' => env('CLOCKWORK_AUTHENTICATION', false), - - // Password for the simple authentication - 'authentication_password' => env('CLOCKWORK_AUTHENTICATION_PASSWORD', 'VerySecretPassword'), - - /* - |------------------------------------------------------------------------------------------------------------------ - | Stack traces collection - |------------------------------------------------------------------------------------------------------------------ - | - | Clockwork can collect stack traces for log messages and certain data like database queries. Here you can set - | whether to collect stack traces, limit the number of collected frames and set further configuration. Collecting - | long stack traces considerably increases metadata size. - | - */ - - 'stack_traces' => [ - // Enable or disable collecting of stack traces - 'enabled' => env('CLOCKWORK_STACK_TRACES_ENABLED', true), - - // Limit the number of frames to be collected - 'limit' => env('CLOCKWORK_STACK_TRACES_LIMIT', 10), - - // List of vendor names to skip when determining caller, common vendors are automatically added - 'skip_vendors' => [ - // 'phpunit' - ], - - // List of namespaces to skip when determining caller - 'skip_namespaces' => [ - // 'Laravel' - ], - - // List of class names to skip when determining caller - 'skip_classes' => [ - // App\CustomLog::class - ] - - ], - - /* - |------------------------------------------------------------------------------------------------------------------ - | Serialization - |------------------------------------------------------------------------------------------------------------------ - | - | Clockwork serializes the collected data to json for storage and transfer. Here you can configure certain aspects - | of serialization. Serialization has a large effect on the cpu time and memory usage. - | - */ - - // Maximum depth of serialized multi-level arrays and objects - 'serialization_depth' => env('CLOCKWORK_SERIALIZATION_DEPTH', 10), - - // A list of classes that will never be serialized (e.g. a common service container class) - 'serialization_blackbox' => [ - \Illuminate\Container\Container::class, - \Illuminate\Foundation\Application::class, - \Laravel\Lumen\Application::class - ], - - /* - |------------------------------------------------------------------------------------------------------------------ - | Register helpers - |------------------------------------------------------------------------------------------------------------------ - | - | Clockwork comes with a "clock" global helper function. You can use this helper to quickly log something and to - | access the Clockwork instance. - | - */ - - 'register_helpers' => env('CLOCKWORK_REGISTER_HELPERS', true), - - /* - |------------------------------------------------------------------------------------------------------------------ - | Send headers for AJAX request - |------------------------------------------------------------------------------------------------------------------ - | - | When trying to collect data, the AJAX method can sometimes fail if it is missing required headers. For example, an - | API might require a version number using Accept headers to route the HTTP request to the correct codebase. - | - */ - - 'headers' => [ - // 'Accept' => 'application/vnd.com.whatever.v1+json', - ], - - /* - |------------------------------------------------------------------------------------------------------------------ - | Server timing - |------------------------------------------------------------------------------------------------------------------ - | - | Clockwork supports the W3C Server Timing specification, which allows for collecting a simple performance metrics - | in a cross-browser way. E.g. in Chrome, your app, database and timeline event timings will be shown in the Dev - | Tools network tab. This setting specifies the max number of timeline events that will be sent. Setting to false - | will disable the feature. - | - */ - - 'server_timing' => env('CLOCKWORK_SERVER_TIMING', 10) - -]; diff --git a/config/contact.php b/config/contact.php deleted file mode 100644 index 2fac29b..0000000 --- a/config/contact.php +++ /dev/null @@ -1,6 +0,0 @@ - env('CONTACT_ADDRESS'), - 'contact_subject' => env('CONTACT_SUBJECT'), -]; diff --git a/config/database.php b/config/database.php index 690645a..137ad18 100644 --- a/config/database.php +++ b/config/database.php @@ -58,7 +58,7 @@ return [ 'prefix_indexes' => true, 'strict' => true, 'engine' => null, - 'options' => extension_loaded('pdo_mysql') === true ? array_filter([ + 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], @@ -125,7 +125,7 @@ return [ 'options' => [ 'cluster' => env('REDIS_CLUSTER', 'redis'), - 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), ], 'default' => [ diff --git a/config/filesystems.php b/config/filesystems.php index c3b8430..e9d9dbd 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -32,43 +32,30 @@ return [ 'local' => [ 'driver' => 'local', - 'root' => storage_path('app/public'), - 'url' => env('APP_URL') . "/storage/{name}", - 'public' => true, - 'throw' => false, - ], - - 'cdn' => [ - 'driver' => 's3', - 'key' => env('AWS_PUBLIC_ACCESS_KEY_ID'), - 'secret' => env('AWS_PUBLIC_SECRET_ACCESS_KEY'), - 'region' => env('AWS_PUBLIC_DEFAULT_REGION'), - 'bucket' => env('AWS_PUBLIC_BUCKET'), - 'url' => env('AWS_PUBLIC_URL') . '/{name}', - 'endpoint' => env('AWS_PUBLIC_ENDPOINT'), - 'use_path_style_endpoint' => env('AWS_PUBLIC_USE_PATH_STYLE_ENDPOINT', false), - 'throw' => false, - 'public' => true, - 'options' => [ - 'ACL' => '', - ] - ], - - 'private' => [ - 'driver' => 'local', - 'root' => storage_path('app/private'), - 'url' => env('APP_URL_API') . '/media/{id}/download', - 'visibility' => 'private', + 'root' => storage_path('app'), 'throw' => false, ], 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), - 'url' => env('APP_URL') . '/storage/{name}', + '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, + ], + ], /* diff --git a/config/hashing.php b/config/hashing.php index bcd3be4..0e8a0bb 100644 --- a/config/hashing.php +++ b/config/hashing.php @@ -29,7 +29,8 @@ return [ */ 'bcrypt' => [ - 'rounds' => env('BCRYPT_ROUNDS', 10), + 'rounds' => env('BCRYPT_ROUNDS', 12), + 'verify' => true, ], /* @@ -47,6 +48,7 @@ return [ 'memory' => 65536, 'threads' => 1, 'time' => 4, + 'verify' => true, ], ]; diff --git a/config/image.php b/config/image.php deleted file mode 100644 index 2b1d2c3..0000000 --- a/config/image.php +++ /dev/null @@ -1,20 +0,0 @@ - 'gd' - -]; diff --git a/config/logging.php b/config/logging.php index d000835..c44d276 100644 --- a/config/logging.php +++ b/config/logging.php @@ -89,7 +89,7 @@ return [ 'handler_with' => [ 'host' => env('PAPERTRAIL_URL'), 'port' => env('PAPERTRAIL_PORT'), - 'connectionString' => 'tls://' . env('PAPERTRAIL_URL') . ':' . env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), ], 'processors' => [PsrLogMessageProcessor::class], ], diff --git a/config/mail.php b/config/mail.php index 566f0c1..d7416b1 100644 --- a/config/mail.php +++ b/config/mail.php @@ -36,6 +36,7 @@ return [ 'mailers' => [ 'smtp' => [ 'transport' => 'smtp', + 'url' => env('MAIL_URL'), 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), 'port' => env('MAIL_PORT', 587), 'encryption' => env('MAIL_ENCRYPTION', 'tls'), @@ -58,6 +59,7 @@ return [ 'postmark' => [ 'transport' => 'postmark', + // 'message_stream_id' => null, // 'client' => [ // 'timeout' => 5, // ], @@ -84,10 +86,6 @@ return [ 'log', ], ], - - 'office365mail' => [ - 'transport' => 'office365mail', - ], ], /* diff --git a/config/purify.php b/config/purify.php deleted file mode 100644 index 7bafb3b..0000000 --- a/config/purify.php +++ /dev/null @@ -1,87 +0,0 @@ - 'default', - - /* - |-------------------------------------------------------------------------- - | Config sets - |-------------------------------------------------------------------------- - | - | Here you may configure various sets of configuration for differentiated use of HTMLPurifier. - | A specific set of configuration can be applied by calling the "config($name)" method on - | a Purify instance. Feel free to add/remove/customize these attributes as you wish. - | - | Documentation: http://htmlpurifier.org/live/configdoc/plain.html - | - | Core.Encoding The encoding to convert input to. - | HTML.Doctype Doctype to use during filtering. - | HTML.Allowed The allowed HTML Elements with their allowed attributes. - | HTML.ForbiddenElements The forbidden HTML elements. Elements that are listed in this - | string will be removed, however their content will remain. - | CSS.AllowedProperties The Allowed CSS properties. - | AutoFormat.AutoParagraph Newlines are converted in to paragraphs whenever possible. - | AutoFormat.RemoveEmpty Remove empty elements that contribute no semantic information to the document. - | - */ - - 'configs' => [ - // @codingStandardsIgnoreStart - 'default' => [ - 'Core.Encoding' => 'utf-8', - 'HTML.Doctype' => 'HTML 4.01 Transitional', - 'HTML.Allowed' => 'h1,h2,h3,h4,h5,h6,b,strong,i,em,s,del,a[href|title],ul,ol,li,p[style],br,span,img[width|height|alt|src]', - 'HTML.ForbiddenElements' => '', - 'CSS.AllowedProperties' => 'font,font-size,font-weight,font-style,font-family,text-decoration,padding-left,color,background-color,text-align', - 'AutoFormat.AutoParagraph' => false, - 'AutoFormat.RemoveEmpty' => false, - ], - // @codingStandardsIgnoreEnd - - ], - - /* - |-------------------------------------------------------------------------- - | HTMLPurifier definitions - |-------------------------------------------------------------------------- - | - | Here you may specify a class that augments the HTML definitions used by - | HTMLPurifier. Additional HTML5 definitions are provided out of the box. - | When specifying a custom class, make sure it implements the interface: - | - | \Stevebauman\Purify\Definitions\Definition - | - | Note that these definitions are applied to every Purifier instance. - | - | Documentation: http://htmlpurifier.org/docs/enduser-customize.html - | - */ - - 'definitions' => Html5Definition::class, - - /* - |-------------------------------------------------------------------------- - | Serializer location - |-------------------------------------------------------------------------- - | - | The location where HTMLPurifier can store its temporary serializer files. - | The filepath should be accessible and writable by the web server. - | A good place for this is in the framework's own storage path. - | - */ - - 'serializer' => storage_path('app/purify'), - -]; diff --git a/config/queue.php b/config/queue.php index 25ea5a8..01c6b05 100644 --- a/config/queue.php +++ b/config/queue.php @@ -73,6 +73,22 @@ return [ ], + /* + |-------------------------------------------------------------------------- + | 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', 'mysql'), + 'table' => 'job_batches', + ], + /* |-------------------------------------------------------------------------- | Failed Queue Jobs diff --git a/config/sanctum.php b/config/sanctum.php index b75adb2..35d75b3 100644 --- a/config/sanctum.php +++ b/config/sanctum.php @@ -41,12 +41,27 @@ return [ |-------------------------------------------------------------------------- | | This value controls the number of minutes until an issued token will be - | considered expired. If this value is null, personal access tokens do - | not expire. This won't tweak the lifetime of first-party sessions. + | considered expired. This will override any values set in the token's + | "expires_at" attribute, but first-party sessions are not affected. | */ - 'expiration' => 40320, // 28 days + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Token Prefix + |-------------------------------------------------------------------------- + | + | Sanctum can prefix new tokens in order to take advantage of numerous + | security scanning initiatives maintained by open source platforms + | that notify developers if they commit tokens into repositories. + | + | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning + | + */ + + 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''), /* |-------------------------------------------------------------------------- @@ -60,8 +75,9 @@ return [ */ 'middleware' => [ - 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, + 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, + 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, ], ]; diff --git a/config/services.php b/config/services.php index 509e737..0ace530 100644 --- a/config/services.php +++ b/config/services.php @@ -30,4 +30,5 @@ return [ 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], + ]; diff --git a/config/session.php b/config/session.php index 1b99f22..8fed97c 100644 --- a/config/session.php +++ b/config/session.php @@ -128,7 +128,7 @@ return [ 'cookie' => env( 'SESSION_COOKIE', - Str::slug(env('APP_NAME', 'laravel'), '_') . '_session' + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' ), /* diff --git a/database/factories/ArticleFactory.php b/database/factories/ArticleFactory.php deleted file mode 100644 index 3fc95a9..0000000 --- a/database/factories/ArticleFactory.php +++ /dev/null @@ -1,31 +0,0 @@ - - */ -class ArticleFactory extends Factory -{ - /** - * Define the model's default state. - * - * @return array - */ - public function definition(): array - { - $publishDate = Carbon::parse($this->faker->dateTimeBetween('-1 month', '+1 month')); - - return [ - 'title' => $this->faker->sentence(), - 'slug' => $this->faker->slug(), - 'publish_at' => $publishDate, - 'content' => $this->faker->paragraphs(3, true), - 'user_id' => $this->faker->uuid(), - 'hero' => $this->faker->uuid(), - ]; - } -} diff --git a/database/factories/EventFactory.php b/database/factories/EventFactory.php deleted file mode 100644 index 285ca45..0000000 --- a/database/factories/EventFactory.php +++ /dev/null @@ -1,40 +0,0 @@ - - */ -class EventFactory extends Factory -{ - /** - * Define the model's default state. - * - * @return array - */ - public function definition(): array - { - $startDate = Carbon::parse($this->faker->dateTimeBetween('now', '+1 year')); - $endDate = Carbon::parse($this->faker->dateTimeBetween($startDate, '+1 year')); - $publishDate = Carbon::parse($this->faker->dateTimeBetween('-1 month', '+1 month')); - - return [ - 'title' => $this->faker->sentence(), - 'location' => $this->faker->randomElement(['online', 'physical']), - 'address' => $this->faker->address(), - 'start_at' => $startDate, - 'end_at' => $endDate, - 'publish_at' => $publishDate, - 'status' => $this->faker->randomElement(['draft', 'soon', 'open', 'closed', 'cancelled']), - 'registration_type' => $this->faker->randomElement(['none', 'email', 'link', 'message']), - 'registration_data' => $this->faker->sentence(), - 'hero' => $this->faker->uuid(), - 'content' => $this->faker->paragraphs(3, true), - 'price' => $this->faker->numberBetween(0, 150), - 'ages' => $this->faker->regexify('\d+(\+|\-\d+)?'), - ]; - } -} diff --git a/database/factories/MediaFactory.php b/database/factories/MediaFactory.php deleted file mode 100644 index e896c4a..0000000 --- a/database/factories/MediaFactory.php +++ /dev/null @@ -1,28 +0,0 @@ - - */ -class MediaFactory extends Factory -{ - /** - * Define the model's default state. - * - * @return array - */ - public function definition(): array - { - return [ - 'title' => $this->faker->sentence(), - 'name' => storage_path('app/public/') . $this->faker->slug() . '.' . $this->faker->fileExtension(), - 'mime_type' => $this->faker->mimeType(), - 'user_id' => $this->faker->uuid(), - 'size' => $this->faker->numberBetween(1000, 1000000), - ]; - } -} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index c874bda..cde014a 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -3,6 +3,7 @@ namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; +use Illuminate\Support\Facades\Hash; use Illuminate\Support\Str; /** @@ -10,6 +11,8 @@ use Illuminate\Support\Str; */ class UserFactory extends Factory { + protected static ?string $password; + /** * Define the model's default state. * @@ -17,23 +20,12 @@ class UserFactory extends Factory */ public function definition(): array { - $faker = \Faker\Factory::create(); - $faker->addProvider(new \Faker\Provider\CustomInternetProvider($faker)); - - $first_name = $faker->firstName(); - $last_name = $faker->lastName(); - - $display_name = $first_name . ' ' . $last_name; - return [ - 'first_name' => $first_name, - 'last_name' => $last_name, - 'email' => $faker->safeEmail(), + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), 'email_verified_at' => now(), - 'phone' => $faker->phoneNumber(), - 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'password' => static::$password ??= Hash::make('password'), 'remember_token' => Str::random(10), - 'display_name' => $display_name, ]; } diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php index 53656a4..444fafb 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -12,15 +12,11 @@ return new class extends Migration public function up(): void { Schema::create('users', function (Blueprint $table) { - $table->uuid('id')->primary(); - $table->string('username')->unique(); - $table->string('password')->nullable(); - $table->boolean('enabled')->default(true); - $table->string('first_name'); - $table->string('last_name'); - $table->string('email'); + $table->id(); + $table->string('name'); + $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); - $table->string('phone')->nullable(); + $table->string('password'); $table->rememberToken(); $table->timestamps(); }); diff --git a/database/migrations/2014_10_12_100000_create_password_resets_table.php b/database/migrations/2014_10_12_100000_create_password_resets_table.php deleted file mode 100644 index 4f42fe6..0000000 --- a/database/migrations/2014_10_12_100000_create_password_resets_table.php +++ /dev/null @@ -1,28 +0,0 @@ -string('email')->index(); - $table->string('token'); - $table->timestamp('created_at')->nullable(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('password_resets'); - } -}; diff --git a/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php index 29db28a..e828ad8 100644 --- a/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php +++ b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php @@ -13,7 +13,7 @@ return new class extends Migration { Schema::create('personal_access_tokens', function (Blueprint $table) { $table->id(); - $table->uuidMorphs('tokenable'); + $table->morphs('tokenable'); $table->string('name'); $table->string('token', 64)->unique(); $table->text('abilities')->nullable(); diff --git a/database/migrations/2022_12_28_113117_create_posts_table.php b/database/migrations/2022_12_28_113117_create_posts_table.php deleted file mode 100644 index 8c3a230..0000000 --- a/database/migrations/2022_12_28_113117_create_posts_table.php +++ /dev/null @@ -1,33 +0,0 @@ -uuid('id')->primary(); - $table->string('slug', 255)->unique(); - $table->string('title', 255); - $table->timestamp('publish_at')->nullable()->useCurrent(); - $table->uuid('user_id'); - $table->uuid('hero'); - $table->text('content'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('posts'); - } -}; diff --git a/database/migrations/2022_12_30_105153_create_media_table.php b/database/migrations/2022_12_30_105153_create_media_table.php deleted file mode 100644 index 7f9209c..0000000 --- a/database/migrations/2022_12_30_105153_create_media_table.php +++ /dev/null @@ -1,33 +0,0 @@ -uuid('id')->primary(); - $table->uuid('user_id'); - $table->string('title'); - $table->string('name'); - $table->string('mime'); - $table->string('permission')->nullable(); - $table->bigInteger('size'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('media'); - } -}; diff --git a/database/migrations/2022_12_30_110049_create_permissions_table.php b/database/migrations/2022_12_30_110049_create_permissions_table.php deleted file mode 100644 index 5977404..0000000 --- a/database/migrations/2022_12_30_110049_create_permissions_table.php +++ /dev/null @@ -1,31 +0,0 @@ -uuid('id')->primary(); - $table->string('permission'); - $table->uuid('user_id'); - $table->timestamps(); - - $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('permissions'); - } -}; diff --git a/database/migrations/2023_01_01_103251_create_events_table.php b/database/migrations/2023_01_01_103251_create_events_table.php deleted file mode 100644 index 211be9c..0000000 --- a/database/migrations/2023_01_01_103251_create_events_table.php +++ /dev/null @@ -1,38 +0,0 @@ -uuid('id')->primary(); - $table->string('title'); - $table->string('location'); - $table->string('address')->nullable(); - $table->timestamp('start_at')->useCurrent(); - $table->timestamp('end_at')->useCurrent(); - $table->timestamp('publish_at')->useCurrent()->nullable(); - $table->string('status')->default('draft'); - $table->string('registration_type'); - $table->string('registration_data')->nullable(); - $table->uuid('hero'); - $table->text('content')->nullable(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('events'); - } -}; diff --git a/database/migrations/2023_01_021_050482_create_subscriptions_table.php b/database/migrations/2023_01_021_050482_create_subscriptions_table.php deleted file mode 100644 index 635ff85..0000000 --- a/database/migrations/2023_01_021_050482_create_subscriptions_table.php +++ /dev/null @@ -1,29 +0,0 @@ -uuid('id')->primary(); - $table->string('email'); - $table->timestamp('confirmed_at')->nullable(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('subscriptions'); - } -}; diff --git a/database/migrations/2023_01_05_043106_create_jobs_table.php b/database/migrations/2023_01_05_043106_create_jobs_table.php deleted file mode 100644 index 6098d9b..0000000 --- a/database/migrations/2023_01_05_043106_create_jobs_table.php +++ /dev/null @@ -1,32 +0,0 @@ -bigIncrements('id'); - $table->string('queue')->index(); - $table->longText('payload'); - $table->unsignedTinyInteger('attempts'); - $table->unsignedInteger('reserved_at')->nullable(); - $table->unsignedInteger('available_at'); - $table->unsignedInteger('created_at'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('jobs'); - } -}; diff --git a/database/migrations/2023_01_05_112154_create_user_codes_table.php b/database/migrations/2023_01_05_112154_create_user_codes_table.php deleted file mode 100644 index dfae89e..0000000 --- a/database/migrations/2023_01_05_112154_create_user_codes_table.php +++ /dev/null @@ -1,33 +0,0 @@ -id(); - $table->char('code', 6)->unique(); - $table->string('action'); - $table->string('data')->nullable(); - $table->uuid('user_id'); - $table->timestamps(); - - $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('user_codes'); - } -}; diff --git a/database/migrations/2023_01_08_045958_create_audits_table.php b/database/migrations/2023_01_08_045958_create_audits_table.php deleted file mode 100644 index 42669aa..0000000 --- a/database/migrations/2023_01_08_045958_create_audits_table.php +++ /dev/null @@ -1,43 +0,0 @@ -create('audits', function (Blueprint $table) { - - $morphPrefix = Config::get('audit.user.morph_prefix', 'user'); - - $table->bigIncrements('id'); - $table->string($morphPrefix . '_type')->nullable(); - $table->uuid($morphPrefix . '_id')->nullable(); - $table->string('event'); - $table->uuidMorphs('auditable'); - $table->text('old_values')->nullable(); - $table->text('new_values')->nullable(); - $table->text('url')->nullable(); - $table->ipAddress('ip_address')->nullable(); - $table->string('user_agent', 1023)->nullable(); - $table->string('tags')->nullable(); - $table->timestamps(); - - $table->index([$morphPrefix . '_id', $morphPrefix . '_type']); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::connection(config('audit.drivers.database.connection', config('database.default')))->drop('audits'); - } -}; diff --git a/database/migrations/2023_01_08_050847_create_user_logins_table.php b/database/migrations/2023_01_08_050847_create_user_logins_table.php deleted file mode 100644 index 3752181..0000000 --- a/database/migrations/2023_01_08_050847_create_user_logins_table.php +++ /dev/null @@ -1,35 +0,0 @@ -uuid('id')->primary(); - $table->uuid('user_id'); - $table->string('token'); - $table->timestamp('login')->nullable(); - $table->timestamp('logout')->nullable(); - $table->ipAddress('ip_address')->nullable(); - $table->string('user_agent', 1023)->nullable(); - $table->timestamps(); - - $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('user_logins'); - } -}; diff --git a/database/migrations/2023_01_24_080416_create_analytics_table.php b/database/migrations/2023_01_24_080416_create_analytics_table.php deleted file mode 100644 index 3c5bb9a..0000000 --- a/database/migrations/2023_01_24_080416_create_analytics_table.php +++ /dev/null @@ -1,31 +0,0 @@ -id(); - $table->string('type'); - $table->string('attribute'); - $table->text('useragent'); - $table->string('ip'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('analytics'); - } -}; diff --git a/database/migrations/2023_02_24_023054_create_attachments_table.php b/database/migrations/2023_02_24_023054_create_attachments_table.php deleted file mode 100644 index 54b8441..0000000 --- a/database/migrations/2023_02_24_023054_create_attachments_table.php +++ /dev/null @@ -1,31 +0,0 @@ -id(); - $table->uuid('media_id'); - $table->uuidMorphs('attachable'); - $table->timestamps(); - - $table->foreign('media_id')->references('id')->on('media')->onDelete('cascade'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('attachments'); - } -}; diff --git a/database/migrations/2023_02_28_090609_add_price_to_events_table.php b/database/migrations/2023_02_28_090609_add_price_to_events_table.php deleted file mode 100644 index 5fdc902..0000000 --- a/database/migrations/2023_02_28_090609_add_price_to_events_table.php +++ /dev/null @@ -1,28 +0,0 @@ -string('price')->default(""); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('events', function (Blueprint $table) { - $table->dropColumn('price'); - }); - } -}; diff --git a/database/migrations/2023_03_01_075334_add_ages_to_events_table.php b/database/migrations/2023_03_01_075334_add_ages_to_events_table.php deleted file mode 100644 index 22f0ceb..0000000 --- a/database/migrations/2023_03_01_075334_add_ages_to_events_table.php +++ /dev/null @@ -1,28 +0,0 @@ -string('ages')->default(""); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('events', function (Blueprint $table) { - $table->dropColumn('ages'); - }); - } -}; diff --git a/database/migrations/2023_04_05_222458_update_media_table.php b/database/migrations/2023_04_05_222458_update_media_table.php deleted file mode 100644 index 9a7ee94..0000000 --- a/database/migrations/2023_04_05_222458_update_media_table.php +++ /dev/null @@ -1,55 +0,0 @@ -whereNull('mime')->update(['mime' => '']); - DB::table('media')->whereNull('permission')->update(['permission' => '']); - - Schema::table('media', function (Blueprint $table) { - $table->string('storage')->default("cdn"); - $table->string('description')->default(""); - $table->string('status')->default(""); - $table->string('dimensions')->default(""); - $table->text('variants'); - - $table->bigInteger('size')->default(0)->change(); - $table->string('permission')->default("")->nullable(false)->change(); - - $table->string('mime')->default("")->nullable(false)->change(); - }); - - Schema::table('media', function(Blueprint $table) { - $table->renameColumn('mime', 'mime_type'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('media', function (Blueprint $table) { - $table->bigInteger('size')->change(); - $table->string('mime_type')->nullable(true)->change(); - $table->string('permission')->nullable(true)->change(); - - $table->renameColumn('mime_type', 'mime'); - - $table->dropColumn('status'); - $table->dropColumn('dimensions'); - $table->dropColumn('variants'); - $table->dropColumn('description'); - $table->dropColumn('storage'); - }); - } -}; diff --git a/database/migrations/2023_04_18_111723_update_no_nullable_phone_on_users_table.php b/database/migrations/2023_04_18_111723_update_no_nullable_phone_on_users_table.php deleted file mode 100644 index 67d11ce..0000000 --- a/database/migrations/2023_04_18_111723_update_no_nullable_phone_on_users_table.php +++ /dev/null @@ -1,31 +0,0 @@ -whereNull('phone')->update(['phone' => '']); - - Schema::table('users', function (Blueprint $table) { - $table->string('phone')->default("")->nullable(false)->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('users', function (Blueprint $table) { - $table->string('phone')->nullable(true)->change(); - }); - } -}; diff --git a/database/migrations/2023_04_18_113354_add_display_name_to_users_table.php b/database/migrations/2023_04_18_113354_add_display_name_to_users_table.php deleted file mode 100644 index da2d613..0000000 --- a/database/migrations/2023_04_18_113354_add_display_name_to_users_table.php +++ /dev/null @@ -1,36 +0,0 @@ -string('display_name')->default(""); - }); - - // Update existing rows with display_name - DB::table('users')->select('id', 'username')->orderBy('id')->chunk(100, function ($users) { - foreach ($users as $user) { - DB::table('users')->where('id', $user->id)->update(['display_name' => $user->username]); - } - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('users', function (Blueprint $table) { - $table->dropColumn('display_name'); - }); - } -}; diff --git a/database/migrations/2023_04_19_122711_drop_subscriptions_table.php b/database/migrations/2023_04_19_122711_drop_subscriptions_table.php deleted file mode 100644 index 0ca3633..0000000 --- a/database/migrations/2023_04_19_122711_drop_subscriptions_table.php +++ /dev/null @@ -1,29 +0,0 @@ -uuid('id')->primary(); - $table->string('email'); - $table->timestamp('confirmed_at')->nullable(); - $table->timestamps(); - }); - } -}; diff --git a/database/migrations/2023_04_25_235615_update_posts_table.php b/database/migrations/2023_04_25_235615_update_posts_table.php deleted file mode 100644 index aac9dd7..0000000 --- a/database/migrations/2023_04_25_235615_update_posts_table.php +++ /dev/null @@ -1,31 +0,0 @@ -select('id', 'permission')->where('permission', 'admin/posts')->update(['permission' => 'admin/articles']); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::rename('articles', 'posts'); - - // Update permissions to use posts instead of articles - DB::table('permissions')->select('id', 'permission')->where('permission', 'admin/articles')->update(['permission' => 'admin/posts']); - } -}; diff --git a/database/migrations/2023_05_01_045630_update_analytics_table.php b/database/migrations/2023_05_01_045630_update_analytics_table.php deleted file mode 100644 index 502672f..0000000 --- a/database/migrations/2023_05_01_045630_update_analytics_table.php +++ /dev/null @@ -1,72 +0,0 @@ -bigInteger('session')->nullable(false); - $table->string('attribute')->default('')->change(); - }); - - DB::table('analytics') - ->where('type', 'pageview') - ->update(['type' => 'apirequest']); - - // Set first session - $session = 0; - - do { - $rows = DB::table('analytics') - ->whereNull('session') - ->orWhere('session', 0) - ->orderBy('created_at', 'asc') - ->limit(1) - ->get(); - - if($rows->isEmpty()) { - break; - } - - $sessionRow = $rows->first(); - DB::table('analytics')->where('id', $sessionRow->id)->update(['session' => ++$session]); - $lastSessionUpdate = $sessionRow->created_at; - - do { - $sameSessionRows = DB::table('analytics') - ->whereNull('session') - ->orWhere('session', 0) - ->where('useragent', $sessionRow->useragent) - ->where('created_at', '<=', date('Y-m-d H:i:s', strtotime('30 minutes', strtotime($lastSessionUpdate)))) - ->orderBy('created_at', 'desc') - ->get(); - - if($sameSessionRows->isEmpty()) { - break; - } - - $ids = $sameSessionRows->pluck('id')->toArray(); - DB::table('analytics')->whereIn('id', $ids)->update(['session' => $session]); - $lastSessionUpdate = $sameSessionRows->first()->created_at; - } while(true); - } while(true); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('analytics', function (Blueprint $table) { - $table->dropColumn('session'); - }); - } -}; diff --git a/database/migrations/2023_05_04_071954_remove_username_from_users_table.php b/database/migrations/2023_05_04_071954_remove_username_from_users_table.php deleted file mode 100644 index aa0df58..0000000 --- a/database/migrations/2023_05_04_071954_remove_username_from_users_table.php +++ /dev/null @@ -1,31 +0,0 @@ -dropColumn('username'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('users', function (Blueprint $table) { - $table->string('username')->unique(); - }); - - DB::table('users')->update(['username' => DB::raw('display_name')]); - } -}; diff --git a/database/migrations/2023_05_06_080418_create_shortlinks_table.php b/database/migrations/2023_05_06_080418_create_shortlinks_table.php deleted file mode 100644 index 7c6f3fd..0000000 --- a/database/migrations/2023_05_06_080418_create_shortlinks_table.php +++ /dev/null @@ -1,29 +0,0 @@ -id(); - $table->string('code', 4)->unique(); - $table->string('url'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('shortlinks'); - } -}; diff --git a/database/migrations/2023_05_06_082705_add_counter_to_shortlinks_table.php b/database/migrations/2023_05_06_082705_add_counter_to_shortlinks_table.php deleted file mode 100644 index 3c73bb5..0000000 --- a/database/migrations/2023_05_06_082705_add_counter_to_shortlinks_table.php +++ /dev/null @@ -1,28 +0,0 @@ -bigInteger('used')->default(0); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('shortlinks', function (Blueprint $table) { - $table->dropColumn('used'); - }); - } -}; diff --git a/database/migrations/2023_05_08_021929_update_users_table.php b/database/migrations/2023_05_08_021929_update_users_table.php deleted file mode 100644 index 497de63..0000000 --- a/database/migrations/2023_05_08_021929_update_users_table.php +++ /dev/null @@ -1,30 +0,0 @@ -string('first_name')->default('')->change(); - $table->string('last_name')->default('')->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('users', function (Blueprint $table) { - $table->string('first_name')->nullable(false)->change(); - $table->string('last_name')->nullable(false)->change(); - }); - } -}; diff --git a/database/migrations/2023_05_09_003156_add_location_url_to_events.php b/database/migrations/2023_05_09_003156_add_location_url_to_events.php deleted file mode 100644 index e33f9e8..0000000 --- a/database/migrations/2023_05_09_003156_add_location_url_to_events.php +++ /dev/null @@ -1,28 +0,0 @@ -string('location_url')->default(''); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('events', function (Blueprint $table) { - $table->dropColumn('location_url'); - }); - } -}; diff --git a/database/migrations/2023_05_11_032859_add_private_to_attachments_table.php b/database/migrations/2023_05_11_032859_add_private_to_attachments_table.php deleted file mode 100644 index 2efac94..0000000 --- a/database/migrations/2023_05_11_032859_add_private_to_attachments_table.php +++ /dev/null @@ -1,28 +0,0 @@ -boolean('private')->default(false); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('attachments', function (Blueprint $table) { - $table->dropColumn('private'); - }); - } -}; diff --git a/database/migrations/2023_05_11_033621_create_event_users_table.php b/database/migrations/2023_05_11_033621_create_event_users_table.php deleted file mode 100644 index ab3cdbd..0000000 --- a/database/migrations/2023_05_11_033621_create_event_users_table.php +++ /dev/null @@ -1,32 +0,0 @@ -id(); - $table->uuid('event_id'); - $table->uuid('user_id'); - $table->timestamps(); - - $table->foreign('event_id')->references('id')->on('events')->onDelete('cascade'); - $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('event_users'); - } -}; diff --git a/database/migrations/2023_05_24_000000_rename_password_resets_table.php b/database/migrations/2023_05_24_000000_rename_password_resets_table.php deleted file mode 100644 index f0ad375..0000000 --- a/database/migrations/2023_05_24_000000_rename_password_resets_table.php +++ /dev/null @@ -1,24 +0,0 @@ -id(); - $table->text('useragent'); - $table->string('ip'); - $table->timestamps(); - $table->timestamp('ended_at')->nullable(); - }); - - Schema::create('analytics_requests', function (Blueprint $table) { - $table->id(); - $table->bigInteger('session_id')->unsigned(); - $table->string('type'); - $table->string('path'); - $table->timestamps(); - - $table->foreign('session_id')->references('id')->on('analytics_sessions')->onDelete('cascade'); - }); - - // Migrate old analytics table - $analytics = DB::table('analytics') - ->select( - 'session', - DB::raw('MAX(useragent) as useragent'), - DB::raw('MAX(ip) as ip'), - DB::raw('MIN(created_at) as created_at'), - DB::raw('MIN(updated_at) as updated_at')) - ->groupBy('session') - ->get(); - foreach ($analytics as $sessionItem) { - $ip = $sessionItem->ip; - $useragent = $sessionItem->useragent; - $session_id = $sessionItem->session; - $created_at = $sessionItem->created_at; - $updated_at = $sessionItem->updated_at; - - // Create a new row in analytics_sessions - $new_session_id = DB::table('analytics_sessions')->insertGetId([ - 'id' => $session_id, - 'useragent' => $useragent, - 'ip' => $ip, - 'created_at' => $created_at, - 'updated_at' => $updated_at - ]); - - $requests = DB::table('analytics')->where('session', $session_id)->select('type', 'attribute', 'created_at', 'updated_at')->get(); - $ended_at = $sessionItem->created_at; - - foreach($requests as $requestItem) { - if($ended_at < $requestItem->created_at) { - $ended_at = $requestItem->created_at; - } - - DB::table('analytics_requests')->insert([ - 'session_id' => $new_session_id, - 'type' => $requestItem->type, - 'path' => $requestItem->attribute, - 'created_at' => $requestItem->created_at, - 'updated_at' => $requestItem->updated_at, - ]); - } - - DB::table('analytics_sessions')->where('id', $new_session_id)->update(['ended_at' => $ended_at]); - } - - Schema::dropIfExists('analytics'); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::create('analytics', function (Blueprint $table) { - $table->id(); - $table->bigInteger('session')->nullable(false); - $table->string('type'); - $table->string('attribute')->default(''); - $table->text('useragent'); - $table->string('ip'); - $table->timestamps(); - }); - - $sessions = DB::table('analytics_sessions')->get(); - foreach ($sessions as $session) { - $requests = DB::table('analytics_requests')->where('session_id', $session->id)->get(); - foreach($requests as $request) { - DB::table('analytics')->insert([ - 'session' => $session->id, - 'type' => $request->type, - 'attribute' => $request->path, - 'ip' => $session->ip, - 'useragent' => $session->useragent, - 'created_at' => $request->created_at, - 'updated_at' => $request->updated_at, - ]); - } - } - - Schema::dropIfExists('analytics_requests'); - Schema::dropIfExists('analytics_sessions'); - } -}; diff --git a/database/migrations/2023_06_22_233236_add_open_at_to_events.php b/database/migrations/2023_06_22_233236_add_open_at_to_events.php deleted file mode 100644 index 9089877..0000000 --- a/database/migrations/2023_06_22_233236_add_open_at_to_events.php +++ /dev/null @@ -1,28 +0,0 @@ -timestamp('open_at')->useCurrent(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('events', function (Blueprint $table) { - $table->dropColumn('open_at'); - }); - } -}; diff --git a/database/migrations/2023_07_16_095623_create_galleries_table.php b/database/migrations/2023_07_16_095623_create_galleries_table.php deleted file mode 100644 index c503ac3..0000000 --- a/database/migrations/2023_07_16_095623_create_galleries_table.php +++ /dev/null @@ -1,32 +0,0 @@ -uuid('id')->primary(); - $table->uuid('media_id'); - $table->uuidMorphs('addendum'); - $table->timestamps(); - - $table->foreign('media_id')->references('id')->on('media')->onDelete('cascade'); - - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('galleries'); - } -}; diff --git a/database/migrations/2023_07_19_041445_update_attachments_table.php b/database/migrations/2023_07_19_041445_update_attachments_table.php deleted file mode 100644 index bc7d022..0000000 --- a/database/migrations/2023_07_19_041445_update_attachments_table.php +++ /dev/null @@ -1,36 +0,0 @@ -renameColumn('attachable_type', 'addendum_type'); - }); - - Schema::table('attachments', function (Blueprint $table) { - $table->renameColumn('attachable_id', 'addendum_id'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('attachments', function (Blueprint $table) { - $table->renameColumn('addendum_type', 'attachable_type'); - }); - - Schema::table('attachments', function (Blueprint $table) { - $table->renameColumn('addendum_id', 'attachable_id'); - }); - } -}; diff --git a/database/migrations/2023_07_24_022737_update_useragent_nullable_in_analytics_analytics_sessions_table.php b/database/migrations/2023_07_24_022737_update_useragent_nullable_in_analytics_analytics_sessions_table.php deleted file mode 100644 index 537b4b7..0000000 --- a/database/migrations/2023_07_24_022737_update_useragent_nullable_in_analytics_analytics_sessions_table.php +++ /dev/null @@ -1,28 +0,0 @@ -text('useragent')->nullable()->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('analytics_sessions', function (Blueprint $table) { - $table->text('useragent')->change(); - }); - } -}; diff --git a/database/migrations/2023_07_26_235416_add_thumbnail_to_media_table.php b/database/migrations/2023_07_26_235416_add_thumbnail_to_media_table.php deleted file mode 100644 index 5550159..0000000 --- a/database/migrations/2023_07_26_235416_add_thumbnail_to_media_table.php +++ /dev/null @@ -1,28 +0,0 @@ -string('thumbnail')->default(''); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('media', function (Blueprint $table) { - $table->dropColumn('thumbnail'); - }); - } -}; diff --git a/database/migrations/2023_08_29_211400_create_media_jobs_table.php b/database/migrations/2023_08_29_211400_create_media_jobs_table.php deleted file mode 100644 index e51e30d..0000000 --- a/database/migrations/2023_08_29_211400_create_media_jobs_table.php +++ /dev/null @@ -1,36 +0,0 @@ -uuid('id')->primary(); - $table->timestamps(); - $table->uuid('user_id')->nullable(); - $table->uuid('media_id')->nullable(); // Add a foreign key for the media model - $table->string('status'); - $table->string('status_text'); - $table->text('data'); - $table->integer('progress')->default(0); // Add a column for job progress - - $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); - $table->foreign('media_id')->references('id')->on('media')->onDelete('cascade'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('media_jobs'); - } -}; diff --git a/database/migrations/2023_08_31_224314_remove_status_and_update_media_table.php b/database/migrations/2023_08_31_224314_remove_status_and_update_media_table.php deleted file mode 100644 index 04efdc4..0000000 --- a/database/migrations/2023_08_31_224314_remove_status_and_update_media_table.php +++ /dev/null @@ -1,37 +0,0 @@ -where('status', '<>', 'OK')->delete(); - - // Remove the 'status' column from the 'media' table - Schema::table('media', function (Blueprint $table) { - $table->dropColumn('status'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - // Add the 'status' column back with a default value of an empty string - Schema::table('media', function (Blueprint $table) { - $table->string('status')->default(''); - }); - - // Update the 'status' column of all rows to 'OK' - DB::table('media')->update(['status' => 'OK']); - } -}; diff --git a/database/migrations/2023_09_01_025739_update_analytics_requests_table.php b/database/migrations/2023_09_01_025739_update_analytics_requests_table.php deleted file mode 100644 index 8dede6f..0000000 --- a/database/migrations/2023_09_01_025739_update_analytics_requests_table.php +++ /dev/null @@ -1,28 +0,0 @@ -text('path')->change(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('analytics_requests', function (Blueprint $table) { - $table->string('path')->change(); - }); - } -}; diff --git a/database/migrations/2023_09_01_025916_update_location_url_events_table.php b/database/migrations/2023_09_01_025916_update_location_url_events_table.php deleted file mode 100644 index ba13695..0000000 --- a/database/migrations/2023_09_01_025916_update_location_url_events_table.php +++ /dev/null @@ -1,30 +0,0 @@ -text('location_url')->change(); - }); - - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('events', function (Blueprint $table) { - $table->string('location_url')->change(); - }); - - } -}; diff --git a/database/migrations/2023_09_10_085850_add_progress_max_to_media_jobs_table.php b/database/migrations/2023_09_10_085850_add_progress_max_to_media_jobs_table.php deleted file mode 100644 index 74aec2b..0000000 --- a/database/migrations/2023_09_10_085850_add_progress_max_to_media_jobs_table.php +++ /dev/null @@ -1,28 +0,0 @@ -integer('progress_max')->default(0); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('media_jobs', function (Blueprint $table) { - $table->dropColumn('progress_max'); - }); - } -}; diff --git a/database/migrations/2023_09_25_053320_rename_permission_column_in_media_table.php b/database/migrations/2023_09_25_053320_rename_permission_column_in_media_table.php deleted file mode 100644 index c864ff1..0000000 --- a/database/migrations/2023_09_25_053320_rename_permission_column_in_media_table.php +++ /dev/null @@ -1,44 +0,0 @@ -renameColumn('permission', 'security_data'); - }); - - Schema::table('media', function (Blueprint $table) { - $table->string('security_type')->default(""); - }); - - DB::table('media') - ->where('security_data', '!=', '') - ->update(['security_type' => 'permission']); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - DB::table('media') - ->where('security_type', '!=', 'permission') - ->update(['security_data' => '']); - - Schema::table('media', function (Blueprint $table) { - $table->renameColumn('security_data', 'permission'); - }); - - Schema::table('media', function (Blueprint $table) { - $table->dropColumn('security_type'); - }); - } -}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index d3eee24..a9f4519 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -3,10 +3,7 @@ namespace Database\Seeders; // use Illuminate\Database\Console\Seeds\WithoutModelEvents; - -use Carbon\Carbon; use Illuminate\Database\Seeder; -use Illuminate\Support\Facades\Hash; class DatabaseSeeder extends Seeder { @@ -15,16 +12,11 @@ class DatabaseSeeder extends Seeder */ public function run(): void { - \App\Models\User::factory(40)->create(); + // \App\Models\User::factory(10)->create(); - \App\Models\User::factory()->create([ - 'display_name' => 'James Collins', - 'first_name' => 'James', - 'last_name' => 'Collins', - 'email' => 'james@stemmechanics.com.au', - 'email_verified_at' => Carbon::now(), - 'phone' => '0400 130 190', - 'password' => Hash::make('password@12') - ]); + // \App\Models\User::factory()->create([ + // 'name' => 'Test User', + // 'email' => 'test@example.com', + // ]); } } diff --git a/faker/provider/CustomInternetProvider.php b/faker/provider/CustomInternetProvider.php deleted file mode 100644 index 2594fc2..0000000 --- a/faker/provider/CustomInternetProvider.php +++ /dev/null @@ -1,16 +0,0 @@ -userName(); - while (strlen($username) < $minLength) { - $username .= $this->randomNumber(); - } - return $username; - } -} diff --git a/import-meta.ts b/import-meta.ts deleted file mode 100644 index e7708dd..0000000 --- a/import-meta.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface ImportMetaExtras extends ImportMeta { - env: { - APP_URL: string; - [key: string]: string; - }; -} diff --git a/package-lock.json b/package-lock.json index 989d08b..b44c2fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,335 +4,25 @@ "requires": true, "packages": { "": { - "dependencies": { - "@tiptap/extension-highlight": "^2.1.8", - "@tiptap/extension-image": "^2.0.3", - "@tiptap/extension-link": "^2.0.3", - "@tiptap/extension-subscript": "^2.0.3", - "@tiptap/extension-superscript": "^2.1.8", - "@tiptap/extension-text-align": "^2.0.3", - "@tiptap/extension-underline": "^2.0.3", - "@tiptap/pm": "^2.0.3", - "@tiptap/starter-kit": "^2.1.8", - "@tiptap/vue-3": "^2.0.3", - "@vitejs/plugin-vue": "^4.4.0", - "dompurify": "^3.0.4", - "dotenv": "^16.0.3", - "pinia": "^2.0.28", - "pinia-plugin-persistedstate": "^3.2.0", - "sass": "^1.69.5", - "vue": "^3.3.7", - "vue-router": "^4.2.2" - }, "devDependencies": { - "@ls-lint/ls-lint": "^2.2.2", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "@typescript-eslint/parser": "^6.9.1", - "eslint": "^8.52.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-jsdoc": "^46.6.0", - "eslint-plugin-vue": "^9.18.1", - "knip": "^2.38.6", + "autoprefixer": "^10.4.16", + "axios": "^1.1.2", "laravel-vite-plugin": "^0.8.0", - "lodash": "^4.17.19", - "postcss": "^8.4.27", - "prettier": "3.0.3", - "rollup-plugin-analyzer": "^4.0.0", - "ts-node": "^10.9.1", - "typescript": "^5.0.4", - "unocss": "^0.57.1", - "vite": "^4.4.7", - "vite-plugin-compression2": "^0.11.0", - "vitest": "^0.34.3" + "postcss": "^8.4.31", + "tailwindcss": "^3.3.5", + "vite": "^4.0.0" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@antfu/install-pkg": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.1.1.tgz", - "integrity": "sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==", - "dev": true, - "dependencies": { - "execa": "^5.1.1", - "find-up": "^5.0.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@antfu/utils": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.6.tgz", - "integrity": "sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/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/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@ericcornelissen/bash-parser": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@ericcornelissen/bash-parser/-/bash-parser-0.5.2.tgz", - "integrity": "sha512-4pIMTa1nEFfMXitv7oaNEWOdM+zpOZavesa5GaiWTgda6Zk32CFGxjUp/iIaN0PwgUW1yTq/fztSjbpE8SLGZQ==", - "dev": true, - "dependencies": { - "array-last": "^1.1.1", - "babylon": "^6.9.1", - "compose-function": "^3.0.3", - "deep-freeze": "0.0.1", - "filter-iterator": "0.0.1", - "filter-obj": "^1.1.0", - "has-own-property": "^0.1.0", - "identity-function": "^1.0.0", - "is-iterable": "^1.1.0", - "iterable-lookahead": "^1.0.0", - "lodash.curry": "^4.1.1", - "magic-string": "^0.16.0", - "map-obj": "^2.0.0", - "object-pairs": "^0.1.0", - "object-values": "^1.0.0", - "reverse-arguments": "^1.0.0", - "shell-quote-word": "^1.0.1", - "to-pascal-case": "^1.0.0", - "unescape-js": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.40.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.40.1.tgz", - "integrity": "sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg==", - "dev": true, - "dependencies": { - "comment-parser": "1.4.0", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" - }, - "engines": { - "node": ">=16" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@esbuild/android-arm": { @@ -342,6 +32,7 @@ "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "android" @@ -357,6 +48,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "android" @@ -372,6 +64,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "android" @@ -387,6 +80,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -402,6 +96,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -417,6 +112,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "freebsd" @@ -432,6 +128,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "freebsd" @@ -447,6 +144,7 @@ "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "linux" @@ -462,6 +160,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -477,6 +176,7 @@ "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "linux" @@ -492,6 +192,7 @@ "cpu": [ "loong64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -507,6 +208,7 @@ "cpu": [ "mips64el" ], + "dev": true, "optional": true, "os": [ "linux" @@ -522,6 +224,7 @@ "cpu": [ "ppc64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -537,6 +240,7 @@ "cpu": [ "riscv64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -552,6 +256,7 @@ "cpu": [ "s390x" ], + "dev": true, "optional": true, "os": [ "linux" @@ -567,6 +272,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -582,6 +288,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "netbsd" @@ -597,6 +304,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "openbsd" @@ -612,6 +320,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "sunos" @@ -627,6 +336,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -642,6 +352,7 @@ "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "win32" @@ -657,6 +368,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -665,171 +377,6 @@ "node": ">=12" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "dev": true - }, - "node_modules/@iconify/utils": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.11.tgz", - "integrity": "sha512-M/w3PkN8zQYXi8N6qK/KhnYMfEbbb6Sk8RZVn8g+Pmmu5ybw177RpsaGwpziyHeUsu4etrexYSWq3rwnIqzYCg==", - "dev": true, - "dependencies": { - "@antfu/install-pkg": "^0.1.1", - "@antfu/utils": "^0.7.5", - "@iconify/types": "^2.0.0", - "debug": "^4.3.4", - "kolorist": "^1.8.0", - "local-pkg": "^0.4.3" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -865,35 +412,17 @@ "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==" + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@ls-lint/ls-lint": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@ls-lint/ls-lint/-/ls-lint-2.2.2.tgz", - "integrity": "sha512-gdolCgwveSHZczfKtoVFkf+NZJjd7KRQs9QnLVEiMFEJLK4H7nBrZuC/ASl/AYMZvFmtCocRt3d5E0UF/34vCQ==", - "cpu": [ - "x64", - "arm64", - "s390x" - ], - "dev": true, - "os": [ - "darwin", - "linux", - "win32" - ], - "bin": { - "ls-lint": "bin/cli.js" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@nodelib/fs.scandir": { @@ -931,1832 +460,17 @@ "node": ">= 8" } }, - "node_modules/@npmcli/map-workspaces": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz", - "integrity": "sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==", - "dev": true, - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", - "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pnpm/constants": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@pnpm/constants/-/constants-7.1.1.tgz", - "integrity": "sha512-31pZqMtjwV+Vaq7MaPrT1EoDFSYwye3dp6BiHIGRJmVThCQwySRKM7hCvqqI94epNkqFAAYoWrNynWoRYosGdw==", - "dev": true, - "engines": { - "node": ">=16.14" - }, - "funding": { - "url": "https://opencollective.com/pnpm" - } - }, - "node_modules/@pnpm/core-loggers": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@pnpm/core-loggers/-/core-loggers-9.0.4.tgz", - "integrity": "sha512-P5IiCwLbYy/vlCDTxEMReB67NVs1Y4ip6iIEM3Y1fbxm0JbPMWTUMKGf2fy7eqGDF3/Vuxk5H7o/A4II6SWzMA==", - "dev": true, - "dependencies": { - "@pnpm/types": "9.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "funding": { - "url": "https://opencollective.com/pnpm" - }, - "peerDependencies": { - "@pnpm/logger": "^5.0.0" - } - }, - "node_modules/@pnpm/error": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/error/-/error-5.0.2.tgz", - "integrity": "sha512-0TEm+tWNYm+9uh6DSKyRbv8pv/6b4NL0PastLvMxIoqZbBZ5Zj1cYi332R9xsSUi31ZOsu2wpgn/bC7DA9hrjg==", - "dev": true, - "dependencies": { - "@pnpm/constants": "7.1.1" - }, - "engines": { - "node": ">=16.14" - }, - "funding": { - "url": "https://opencollective.com/pnpm" - } - }, - "node_modules/@pnpm/fetching-types": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@pnpm/fetching-types/-/fetching-types-5.0.0.tgz", - "integrity": "sha512-o9gdO1v8Uc5P2fBBuW6GSpfTqIivQmQlqjQJdFiQX0m+tgxlrMRneIg392jZuc6fk7kFqjLheInlslgJfwY+4Q==", - "dev": true, - "dependencies": { - "@zkochan/retry": "^0.2.0", - "node-fetch": "3.0.0-beta.9" - }, - "engines": { - "node": ">=16.14" - }, - "funding": { - "url": "https://opencollective.com/pnpm" - } - }, - "node_modules/@pnpm/graceful-fs": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@pnpm/graceful-fs/-/graceful-fs-3.2.0.tgz", - "integrity": "sha512-vRoXJxscDpHak7YE9SqCkzfrayn+Lw+YueOeHIPEqkgokrHeYgYeONoc2kGh0ObHaRtNSsonozVfJ456kxLNvA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.11" - }, - "engines": { - "node": ">=16.14" - }, - "funding": { - "url": "https://opencollective.com/pnpm" - } - }, - "node_modules/@pnpm/logger": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@pnpm/logger/-/logger-5.0.0.tgz", - "integrity": "sha512-YfcB2QrX+Wx1o6LD1G2Y2fhDhOix/bAY/oAnMpHoNLsKkWIRbt1oKLkIFvxBMzLwAEPqnYWguJrYC+J6i4ywbw==", - "dev": true, - "dependencies": { - "bole": "^5.0.0", - "ndjson": "^2.0.0" - }, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/@pnpm/npm-package-arg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pnpm/npm-package-arg/-/npm-package-arg-1.0.0.tgz", - "integrity": "sha512-oQYP08exi6mOPdAZZWcNIGS+KKPsnNwUBzSuAEGWuCcqwMAt3k/WVCqVIXzBxhO5sP2b43og69VHmPj6IroKqw==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": ">=14.6" - } - }, - "node_modules/@pnpm/npm-resolver": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@pnpm/npm-resolver/-/npm-resolver-17.0.0.tgz", - "integrity": "sha512-XCeFga+Am3rsTO+8IIuIPb6VsZ+iCiv5QJW61YDl4XuiqoyCFzNyGgGfv05n45lIfK0Gg1jA2ewlo0LpGelCUw==", - "dev": true, - "dependencies": { - "@pnpm/core-loggers": "9.0.4", - "@pnpm/error": "5.0.2", - "@pnpm/fetching-types": "5.0.0", - "@pnpm/graceful-fs": "3.2.0", - "@pnpm/resolve-workspace-range": "5.0.1", - "@pnpm/resolver-base": "11.0.0", - "@pnpm/types": "9.4.0", - "@zkochan/retry": "^0.2.0", - "encode-registry": "^3.0.1", - "load-json-file": "^6.2.0", - "lru-cache": "^10.0.1", - "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "p-memoize": "4.0.1", - "parse-npm-tarball-url": "^3.0.0", - "path-temp": "^2.1.0", - "ramda": "npm:@pnpm/ramda@0.28.1", - "rename-overwrite": "^4.0.3", - "semver": "^7.5.4", - "ssri": "10.0.5", - "version-selector-type": "^3.0.0" - }, - "engines": { - "node": ">=16.14" - }, - "funding": { - "url": "https://opencollective.com/pnpm" - }, - "peerDependencies": { - "@pnpm/logger": "^5.0.0" - } - }, - "node_modules/@pnpm/npm-resolver/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/@pnpm/resolve-workspace-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@pnpm/resolve-workspace-range/-/resolve-workspace-range-5.0.1.tgz", - "integrity": "sha512-yQ0pMthlw8rTgS/C9hrjne+NEnnSNevCjtdodd7i15I59jMBYciHifZ/vjg0NY+Jl+USTc3dBE+0h/4tdYjMKg==", - "dev": true, - "dependencies": { - "semver": "^7.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "funding": { - "url": "https://opencollective.com/pnpm" - } - }, - "node_modules/@pnpm/resolver-base": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@pnpm/resolver-base/-/resolver-base-11.0.0.tgz", - "integrity": "sha512-oxfjO8Ie6aBQPXSqOWGJP9s0xj9Z4cbRI7fK63WKhjwmNH4CTrSfikRL2o4FoXo2APAbJEUp2lCxx+86dq2tUg==", - "dev": true, - "dependencies": { - "@pnpm/types": "9.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "funding": { - "url": "https://opencollective.com/pnpm" - } - }, - "node_modules/@pnpm/types": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@pnpm/types/-/types-9.4.0.tgz", - "integrity": "sha512-IRDuIuNobLRQe0UyY2gbrrTzYS46tTNvOEfL6fOf0Qa8NyxUzeXz946v7fQuQE3LSBf8ENBC5SXhRmDl+mBEqA==", - "dev": true, - "engines": { - "node": ">=16.14" - }, - "funding": { - "url": "https://opencollective.com/pnpm" - } - }, - "node_modules/@pnpm/workspace.pkgs-graph": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@pnpm/workspace.pkgs-graph/-/workspace.pkgs-graph-2.0.10.tgz", - "integrity": "sha512-iGZZ23li6Ya68kHx3oaWPCN4JMzJ0njmmmWDRxUcHkc+nxtxTwpEM/FRl7yG1nBo39YwX2XTtou22h2nKipHnw==", - "dev": true, - "dependencies": { - "@pnpm/npm-package-arg": "^1.0.0", - "@pnpm/npm-resolver": "17.0.0", - "@pnpm/resolve-workspace-range": "5.0.1", - "ramda": "npm:@pnpm/ramda@0.28.1" - }, - "engines": { - "node": ">=16.14" - }, - "funding": { - "url": "https://opencollective.com/pnpm" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.23", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", - "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true }, - "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==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@remirror/core-constants": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-2.0.2.tgz", - "integrity": "sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==" - }, - "node_modules/@remirror/core-helpers": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@remirror/core-helpers/-/core-helpers-3.0.0.tgz", - "integrity": "sha512-tusEgQJIqg4qKj6HSBUFcyRnWnziw3neh4T9wOmsPGHFC3w9kl5KSrDb9UAgE8uX6y32FnS7vJ955mWOl3n50A==", - "dependencies": { - "@remirror/core-constants": "^2.0.2", - "@remirror/types": "^1.0.1", - "@types/object.omit": "^3.0.0", - "@types/object.pick": "^1.3.2", - "@types/throttle-debounce": "^2.1.0", - "case-anything": "^2.1.13", - "dash-get": "^1.0.2", - "deepmerge": "^4.3.1", - "fast-deep-equal": "^3.1.3", - "make-error": "^1.3.6", - "object.omit": "^3.0.0", - "object.pick": "^1.3.0", - "throttle-debounce": "^3.0.1" - } - }, - "node_modules/@remirror/types": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@remirror/types/-/types-1.0.1.tgz", - "integrity": "sha512-VlZQxwGnt1jtQ18D6JqdIF+uFZo525WEqrfp9BOc3COPpK4+AWCgdnAWL+ho6imWcoINlGjR/+3b6y5C1vBVEA==", - "dependencies": { - "type-fest": "^2.19.0" - } - }, - "node_modules/@remirror/types/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz", - "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@snyk/github-codeowners": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@snyk/github-codeowners/-/github-codeowners-1.1.0.tgz", - "integrity": "sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==", - "dev": true, - "dependencies": { - "commander": "^4.1.1", - "ignore": "^5.1.8", - "p-map": "^4.0.0" - }, - "bin": { - "github-codeowners": "dist/cli.js" - }, - "engines": { - "node": ">=8.10" - } - }, - "node_modules/@tiptap/core": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.1.12.tgz", - "integrity": "sha512-ZGc3xrBJA9KY8kln5AYTj8y+GDrKxi7u95xIl2eccrqTY5CQeRu6HRNM1yT4mAjuSaG9jmazyjGRlQuhyxCKxQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-blockquote": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.1.12.tgz", - "integrity": "sha512-Qb3YRlCfugx9pw7VgLTb+jY37OY4aBJeZnqHzx4QThSm13edNYjasokbX0nTwL1Up4NPTcY19JUeHt6fVaVVGg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-bold": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.1.12.tgz", - "integrity": "sha512-AZGxIxcGU1/y6V2YEbKsq6BAibL8yQrbRm6EdcBnby41vj1WziewEKswhLGmZx5IKM2r2ldxld03KlfSIlKQZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.1.12.tgz", - "integrity": "sha512-gAGi21EQ4wvLmT7klgariAc2Hf+cIjaNU2NWze3ut6Ku9gUo5ZLqj1t9SKHmNf4d5JG63O8GxpErqpA7lHlRtw==", - "dependencies": { - "tippy.js": "^6.3.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-bullet-list": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.1.12.tgz", - "integrity": "sha512-vtD8vWtNlmAZX8LYqt2yU9w3mU9rPCiHmbp4hDXJs2kBnI0Ju/qAyXFx6iJ3C3XyuMnMbJdDI9ee0spAvFz7cQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-code": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.1.12.tgz", - "integrity": "sha512-CRiRq5OTC1lFgSx6IMrECqmtb93a0ZZKujEnaRhzWliPBjLIi66va05f/P1vnV6/tHaC3yfXys6dxB5A4J8jxw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-code-block": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.1.12.tgz", - "integrity": "sha512-RXtSYCVsnk8D+K80uNZShClfZjvv1EgO42JlXLVGWQdIgaNyuOv/6I/Jdf+ZzhnpsBnHufW+6TJjwP5vJPSPHA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-document": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.1.12.tgz", - "integrity": "sha512-0QNfAkCcFlB9O8cUNSwTSIQMV9TmoEhfEaLz/GvbjwEq4skXK3bU+OQX7Ih07waCDVXIGAZ7YAZogbvrn/WbOw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-dropcursor": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.1.12.tgz", - "integrity": "sha512-0tT/q8nL4NBCYPxr9T0Brck+RQbWuczm9nV0bnxgt0IiQXoRHutfPWdS7GA65PTuVRBS/3LOco30fbjFhkfz/A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-floating-menu": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.1.12.tgz", - "integrity": "sha512-uo0ydCJNg6AWwLT6cMUJYVChfvw2PY9ZfvKRhh9YJlGfM02jS4RUG/bJBts6R37f+a5FsOvAVwg8EvqPlNND1A==", - "dependencies": { - "tippy.js": "^6.3.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-gapcursor": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.1.12.tgz", - "integrity": "sha512-zFYdZCqPgpwoB7whyuwpc8EYLYjUE5QYKb8vICvc+FraBUDM51ujYhFSgJC3rhs8EjI+8GcK8ShLbSMIn49YOQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-hard-break": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.1.12.tgz", - "integrity": "sha512-nqKcAYGEOafg9D+2cy1E4gHNGuL12LerVa0eS2SQOb+PT8vSel9OTKU1RyZldsWSQJ5rq/w4uIjmLnrSR2w6Yw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-heading": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.1.12.tgz", - "integrity": "sha512-MoANP3POAP68Ko9YXarfDKLM/kXtscgp6m+xRagPAghRNujVY88nK1qBMZ3JdvTVN6b/ATJhp8UdrZX96TLV2w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-highlight": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.1.12.tgz", - "integrity": "sha512-buen31cYPyiiHA2i0o2i/UcjRTg/42mNDCizGr1OJwvv3AELG3qOFc4Y58WJWIvWNv+1Dr4ZxHA3GNVn0ANWyg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-history": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.1.12.tgz", - "integrity": "sha512-6b7UFVkvPjq3LVoCTrYZAczt5sQrQUaoDWAieVClVZoFLfjga2Fwjcfgcie8IjdPt8YO2hG/sar/c07i9vM0Sg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.1.12.tgz", - "integrity": "sha512-RRuoK4KxrXRrZNAjJW5rpaxjiP0FJIaqpi7nFbAua2oHXgsCsG8qbW2Y0WkbIoS8AJsvLZ3fNGsQ8gpdliuq3A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-image": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.1.12.tgz", - "integrity": "sha512-VCgOTeNLuoR89WoCESLverpdZpPamOd7IprQbDIeG14sUySt7RHNgf2AEfyTYJEHij12rduvAwFzerPldVAIJg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-italic": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.1.12.tgz", - "integrity": "sha512-/XYrW4ZEWyqDvnXVKbgTXItpJOp2ycswk+fJ3vuexyolO6NSs0UuYC6X4f+FbHYL5VuWqVBv7EavGa+tB6sl3A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-link": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.1.12.tgz", - "integrity": "sha512-Sti5hhlkCqi5vzdQjU/gbmr8kb578p+u0J4kWS+SSz3BknNThEm/7Id67qdjBTOQbwuN07lHjDaabJL0hSkzGQ==", - "dependencies": { - "linkifyjs": "^4.1.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-list-item": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.1.12.tgz", - "integrity": "sha512-Gk7hBFofAPmNQ8+uw8w5QSsZOMEGf7KQXJnx5B022YAUJTYYxO3jYVuzp34Drk9p+zNNIcXD4kc7ff5+nFOTrg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-ordered-list": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.1.12.tgz", - "integrity": "sha512-tF6VGl+D2avCgn9U/2YLJ8qVmV6sPE/iEzVAFZuOSe6L0Pj7SQw4K6AO640QBob/d8VrqqJFHCb6l10amJOnXA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-paragraph": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.1.12.tgz", - "integrity": "sha512-hoH/uWPX+KKnNAZagudlsrr4Xu57nusGekkJWBcrb5MCDE91BS+DN2xifuhwXiTHxnwOMVFjluc0bPzQbkArsw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-strike": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.1.12.tgz", - "integrity": "sha512-HlhrzIjYUT8oCH9nYzEL2QTTn8d1ECnVhKvzAe6x41xk31PjLMHTUy8aYjeQEkWZOWZ34tiTmslV1ce6R3Dt8g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-subscript": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-subscript/-/extension-subscript-2.1.12.tgz", - "integrity": "sha512-tb1jysEvf4SIiXwEOgDTXiyrG39RVNHvn/zsGMg5wy5t9qUp9m1k7kKYTH084ktuKDAPQonCcpn3hwc+ngTFzg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-superscript": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-superscript/-/extension-superscript-2.1.12.tgz", - "integrity": "sha512-ek6L+DNsrjiJieArlgTvQt1VfJ56d8V19WAPW/ciRhq88YRlTEY9nSO3QuUCSUO1nGmE5OWQpgrsiW/XZbONVw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-text": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.1.12.tgz", - "integrity": "sha512-rCNUd505p/PXwU9Jgxo4ZJv4A3cIBAyAqlx/dtcY6cjztCQuXJhuQILPhjGhBTOLEEL4kW2wQtqzCmb7O8i2jg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-text-align": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.1.12.tgz", - "integrity": "sha512-siMlwrkgVrAxxgmZn8GOc75J7UZi2CVrP9vDHkUPPyKm/fjssYekXwGCEk4Vswii1BbOh2gt+MDsRkeYRGyDlQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-underline": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.1.12.tgz", - "integrity": "sha512-NwwdhFT8gDD0VUNLQx85yFBhP9a8qg8GPuxlGzAP/lPTV8Ubh3vSeQ5N9k2ZF/vHlEvnugzeVCbmYn7wf8vn1g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/pm": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.1.12.tgz", - "integrity": "sha512-Q3MXXQABG4CZBesSp82yV84uhJh/W0Gag6KPm2HRWPimSFELM09Z9/5WK9RItAYE0aLhe4Krnyiczn9AAa1tQQ==", - "dependencies": { - "prosemirror-changeset": "^2.2.0", - "prosemirror-collab": "^1.3.0", - "prosemirror-commands": "^1.3.1", - "prosemirror-dropcursor": "^1.5.0", - "prosemirror-gapcursor": "^1.3.1", - "prosemirror-history": "^1.3.0", - "prosemirror-inputrules": "^1.2.0", - "prosemirror-keymap": "^1.2.0", - "prosemirror-markdown": "^1.10.1", - "prosemirror-menu": "^1.2.1", - "prosemirror-model": "^1.18.1", - "prosemirror-schema-basic": "^1.2.0", - "prosemirror-schema-list": "^1.2.2", - "prosemirror-state": "^1.4.1", - "prosemirror-tables": "^1.3.0", - "prosemirror-trailing-node": "^2.0.2", - "prosemirror-transform": "^1.7.0", - "prosemirror-view": "^1.28.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, - "node_modules/@tiptap/starter-kit": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.1.12.tgz", - "integrity": "sha512-+RoP1rWV7rSCit2+3wl2bjvSRiePRJE/7YNKbvH8Faz/+AMO23AFegHoUFynR7U0ouGgYDljGkkj35e0asbSDA==", - "dependencies": { - "@tiptap/core": "^2.1.12", - "@tiptap/extension-blockquote": "^2.1.12", - "@tiptap/extension-bold": "^2.1.12", - "@tiptap/extension-bullet-list": "^2.1.12", - "@tiptap/extension-code": "^2.1.12", - "@tiptap/extension-code-block": "^2.1.12", - "@tiptap/extension-document": "^2.1.12", - "@tiptap/extension-dropcursor": "^2.1.12", - "@tiptap/extension-gapcursor": "^2.1.12", - "@tiptap/extension-hard-break": "^2.1.12", - "@tiptap/extension-heading": "^2.1.12", - "@tiptap/extension-history": "^2.1.12", - "@tiptap/extension-horizontal-rule": "^2.1.12", - "@tiptap/extension-italic": "^2.1.12", - "@tiptap/extension-list-item": "^2.1.12", - "@tiptap/extension-ordered-list": "^2.1.12", - "@tiptap/extension-paragraph": "^2.1.12", - "@tiptap/extension-strike": "^2.1.12", - "@tiptap/extension-text": "^2.1.12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, - "node_modules/@tiptap/vue-3": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@tiptap/vue-3/-/vue-3-2.1.12.tgz", - "integrity": "sha512-yAcfmWw/9jtIUbhb0uGQVI9NoPYgHRasX2sAGWnm9Al+0aJktgmQ3mLCifXfXfjyEbeMF0p2L6Ul8tO7eho7aQ==", - "dependencies": { - "@tiptap/extension-bubble-menu": "^2.1.12", - "@tiptap/extension-floating-menu": "^2.1.12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0", - "vue": "^3.0.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/chai": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.9.tgz", - "integrity": "sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg==", - "dev": true - }, - "node_modules/@types/chai-subset": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.4.tgz", - "integrity": "sha512-CCWNXrJYSUIojZ1149ksLl3AN9cmZ5djf+yUoVVV+NuYrtydItQVlL2ZDqyC6M6O9LWRnVf8yYDxbXHO2TfQZg==", - "dev": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", - "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.8.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", - "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", - "devOptional": true, - "dependencies": { - "undici-types": "~5.25.1" - } - }, - "node_modules/@types/object.omit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/object.omit/-/object.omit-3.0.2.tgz", - "integrity": "sha512-BxWU36cMP+FKD3OLFluQaj2cBev2sx2LJaHELuphHwnleq+xnEhTmuYYYx4pOT/1U/ZoR6B+RdvxWh2FD6lGGA==" - }, - "node_modules/@types/object.pick": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/object.pick/-/object.pick-1.3.3.tgz", - "integrity": "sha512-qZqHmdGEALeSATMB1djT1S5szv6Wtpb7DKpHrt2XG4iyKlV7C2Xk8GmDXr1KXakOqUfX6ohw7ceruYt4NVmB1Q==" - }, - "node_modules/@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", - "dev": true - }, - "node_modules/@types/throttle-debounce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz", - "integrity": "sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", - "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/type-utils": "6.9.1", - "@typescript-eslint/utils": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", - "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", - "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", - "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/utils": "6.9.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", - "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", - "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", - "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", - "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.9.1", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@unocss/astro": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-0.57.1.tgz", - "integrity": "sha512-KNaqN/SGM/uz1QitajIkzNEw0jy9Zx9Wp8fl4GhfGYEMAN2+M4cuvBZRmlb6cLctSXmSAJQDG91ivbD1JijGnw==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1", - "@unocss/reset": "0.57.1", - "@unocss/vite": "0.57.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/@unocss/cli": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-0.57.1.tgz", - "integrity": "sha512-wKuOaygrPNzDm5L7+2SfHsIi3knJrAQ8nH6OasVqB+bGDz6ybDlULV7wvUco6Os72ydh7YbWC2/WpqFii8U/3w==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@rollup/pluginutils": "^5.0.5", - "@unocss/config": "0.57.1", - "@unocss/core": "0.57.1", - "@unocss/preset-uno": "0.57.1", - "cac": "^6.7.14", - "chokidar": "^3.5.3", - "colorette": "^2.0.20", - "consola": "^3.2.3", - "fast-glob": "^3.3.1", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "perfect-debounce": "^1.0.0" - }, - "bin": { - "unocss": "bin/unocss.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/cli/node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@unocss/config": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.57.1.tgz", - "integrity": "sha512-mbuVO0mH1PX7rEkViMNWb3jG1ji7TUydo2DdnMHhJE+dOrGtnQzhzXGlAd4qqel1fnt/VWuOyZKwJA3QO6VCtg==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1", - "unconfig": "^0.3.11" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/core": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.57.1.tgz", - "integrity": "sha512-cqQW/4gCuk+bFMPg9lBanuRNQ9Lx1l4PpMN/6uKxI5WROpq7ce/Xb4uGvAxKLh3ITtFSpXs2cLfsy7QD6cVD/Q==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/extractor-arbitrary-variants": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.57.1.tgz", - "integrity": "sha512-9s+azHhBnwjxm46TsD1RY0krDAwOR8tcw58Vtl3emd6C0VQsAOdoprt7UHE7GEXMvDVq7nMf8lAT0BM0LteW3w==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/inspector": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-0.57.1.tgz", - "integrity": "sha512-qV7ta7iHGX2EpZJ4IWY/05kgyhKFeWlvVJbrOnGsaH8gVt33T/43YAhB/8K5GIXBXIwkhwk13iB13nlg2gSheg==", - "dev": true, - "dependencies": { - "@unocss/rule-utils": "0.57.1", - "gzip-size": "^6.0.0", - "sirv": "^2.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/postcss": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-0.57.1.tgz", - "integrity": "sha512-DexrV+v/qkVh6t660rXigNr2Y6lON8jxD1z2KVk2bjHKhFflF6q6seps6d/MquyLJI1mXF2uANTeFAeL2q6evw==", - "dev": true, - "dependencies": { - "@unocss/config": "0.57.1", - "@unocss/core": "0.57.1", - "@unocss/rule-utils": "0.57.1", - "css-tree": "^2.3.1", - "fast-glob": "^3.3.1", - "magic-string": "^0.30.5", - "postcss": "^8.4.31" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/@unocss/postcss/node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@unocss/preset-attributify": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-0.57.1.tgz", - "integrity": "sha512-pvGQHaqBlB0jQysWhNbcKLOGrkj8b53k0sAa9LYxQjD1fa8t/dwbuMpZv4twX+gysF0vBhxRoWBPLH1/S6zRZg==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-icons": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-0.57.1.tgz", - "integrity": "sha512-ve4jC6yREfS0mv97DCld9xLjMuiSCcsQPKucdtpUfCjLMqtGd1ZGGdFv02Q+92NkW7HDfgj+izEw1SKh9695Ow==", - "dev": true, - "dependencies": { - "@iconify/utils": "^2.1.11", - "@unocss/core": "0.57.1", - "ofetch": "^1.3.3" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-mini": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-0.57.1.tgz", - "integrity": "sha512-v9ZsIUGDfZNXbIrOc7zrBp+RFbFFGSQN/vKIf761js4fJ31j6lan4pPQPGcY17xHConkI1HJT/+yb/UVJaAcHw==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1", - "@unocss/extractor-arbitrary-variants": "0.57.1", - "@unocss/rule-utils": "0.57.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-tagify": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-0.57.1.tgz", - "integrity": "sha512-GV8knxnsOVH/XiG2KB+mVZeEJqr0PZvvkSTPftGPbjttoKVZ+28Y5q9/qezH7p4W6RYVAAK+3qHHy5wWZosiMw==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-typography": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-0.57.1.tgz", - "integrity": "sha512-C4cqCiGW0OSoSXsVQKgfLulYxY5C8M40f+a8VtBlAaEaN6eSlEt+catXb0chF9T2mvz/b87b0PahPvPwJdDf1Q==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1", - "@unocss/preset-mini": "0.57.1" - } - }, - "node_modules/@unocss/preset-uno": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-0.57.1.tgz", - "integrity": "sha512-0+DKZiowYjYzq2swJzQA2dhqDvLJdm0Y437ITzc2GzZMKGUUuNi+w2v3/SzwkpkRd9zTB9/YaOIJVfdrx6ZOXQ==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1", - "@unocss/preset-mini": "0.57.1", - "@unocss/preset-wind": "0.57.1", - "@unocss/rule-utils": "0.57.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-web-fonts": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-0.57.1.tgz", - "integrity": "sha512-9DCIMlBRaGrljLmeciH4WqP+uRx2z2nLxvrvEmGbpJJpMn2H4higR5Zu5tDyKYGr9QBl9vXdWgib+43OSswkqA==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1", - "ofetch": "^1.3.3" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-wind": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-0.57.1.tgz", - "integrity": "sha512-5UairNahUXNDe9AggPtTCodyPjl6NgPCsiEB22LVgN20UjBXjaqzN5wUe1OgtpLoAUaSk0KI7eLWhnWbTbST3A==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1", - "@unocss/preset-mini": "0.57.1", - "@unocss/rule-utils": "0.57.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/reset": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-0.57.1.tgz", - "integrity": "sha512-f/ofoudjFN/HMtv1XV5phP58pOmNruBhr0GbVdBNylyieMQkFHowA7iSemChnC/fTbCcY6oSOAcFl4n9AefjdA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/rule-utils": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-0.57.1.tgz", - "integrity": "sha512-Hdicz7YORZx7SHICldzOGjPNeJwk/Xhy3cycqiPbg6nB6d639bpgZn5BsbDzHCPKpguwDomUqTZS6+C3s7tUVg==", - "dev": true, - "dependencies": { - "@unocss/core": "^0.57.1", - "magic-string": "^0.30.5" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/rule-utils/node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@unocss/scope": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/scope/-/scope-0.57.1.tgz", - "integrity": "sha512-ZAzg6lLGwKNQGCvJXEie3TvGztkAyajEFqygu0mjtHb+CmDql4iAjoygs+3dnRI5hSDwfMYFrJ2azX26+2CsoA==", - "dev": true - }, - "node_modules/@unocss/transformer-attributify-jsx": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.57.1.tgz", - "integrity": "sha512-ohgSEwm2j98ltPWl1zRPvZhRjQPpd7qZtgoROTQh6n2W7wEO1SlnYjgBBz+pGuo2dkfBN5NjuZJ93AEjS10Ysw==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-attributify-jsx-babel": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx-babel/-/transformer-attributify-jsx-babel-0.57.1.tgz", - "integrity": "sha512-EOCPB8OGmhroAuFU0i0W5p6GmJpx6mAkP4KmsqVLd4QMgw+8aXkG7SKyLnxQZnekM0/dSo0TcpVGeGrZaUNgvQ==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-compile-class": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-0.57.1.tgz", - "integrity": "sha512-z0WZN6hbgpyBm2xqIrojqEjpQMhiyzHRbaBjWzI/6ieHWoFo5ajIwnReaFUEfJRNruLTd7/9hFDZdRXRPhttFw==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-directives": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-0.57.1.tgz", - "integrity": "sha512-rIk3XEU2NywEJUOkngBSmJfvS3IVgxkkqgMvuIqz8ZDbwWhepuMxsiI0QR3ypkipGr/eKK5DJ7eK0OVlo6FPFA==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1", - "@unocss/rule-utils": "0.57.1", - "css-tree": "^2.3.1" - } - }, - "node_modules/@unocss/transformer-variant-group": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-0.57.1.tgz", - "integrity": "sha512-qwydzn2Lqz/8zW6UUXdORaUl8humsG8ll74LN/z8cjEsqtXZkVdkV0l6Brpp9Xp/XPbKwO+II+KH3/1LGwXSzQ==", - "dev": true, - "dependencies": { - "@unocss/core": "0.57.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/vite": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-0.57.1.tgz", - "integrity": "sha512-kEBDvGgQNkX2n87S6Ao5seyFb1kuWZ5p96dGOS7VFpD7HvR5xholkJXaVhUK9/exCldjLExbo5UtVlbxFLUFYg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@rollup/pluginutils": "^5.0.5", - "@unocss/config": "0.57.1", - "@unocss/core": "0.57.1", - "@unocss/inspector": "0.57.1", - "@unocss/scope": "0.57.1", - "@unocss/transformer-directives": "0.57.1", - "chokidar": "^3.5.3", - "fast-glob": "^3.3.1", - "magic-string": "^0.30.5" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0" - } - }, - "node_modules/@unocss/vite/node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@vitejs/plugin-vue": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.4.0.tgz", - "integrity": "sha512-xdguqb+VUwiRpSg+nsc2HtbAUSGak25DXYvpQQi4RVU1Xq1uworyoH/md9Rfd8zMmPR/pSghr309QNcftUVseg==", - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vitest/expect": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz", - "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==", - "dev": true, - "dependencies": { - "@vitest/spy": "0.34.6", - "@vitest/utils": "0.34.6", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz", - "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==", - "dev": true, - "dependencies": { - "@vitest/utils": "0.34.6", - "p-limit": "^4.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/snapshot": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz", - "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==", - "dev": true, - "dependencies": { - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot/node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@vitest/spy": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz", - "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==", - "dev": true, - "dependencies": { - "tinyspy": "^2.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz", - "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==", - "dev": true, - "dependencies": { - "diff-sequences": "^29.4.3", - "loupe": "^2.3.6", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.7.tgz", - "integrity": "sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==", - "dependencies": { - "@babel/parser": "^7.23.0", - "@vue/shared": "3.3.7", - "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.7.tgz", - "integrity": "sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==", - "dependencies": { - "@vue/compiler-core": "3.3.7", - "@vue/shared": "3.3.7" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.7.tgz", - "integrity": "sha512-7pfldWy/J75U/ZyYIXRVqvLRw3vmfxDo2YLMwVtWVNew8Sm8d6wodM+OYFq4ll/UxfqVr0XKiVwti32PCrruAw==", - "dependencies": { - "@babel/parser": "^7.23.0", - "@vue/compiler-core": "3.3.7", - "@vue/compiler-dom": "3.3.7", - "@vue/compiler-ssr": "3.3.7", - "@vue/reactivity-transform": "3.3.7", - "@vue/shared": "3.3.7", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.5", - "postcss": "^8.4.31", - "source-map-js": "^1.0.2" - } - }, - "node_modules/@vue/compiler-sfc/node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.7.tgz", - "integrity": "sha512-TxOfNVVeH3zgBc82kcUv+emNHo+vKnlRrkv8YvQU5+Y5LJGJwSNzcmLUoxD/dNzv0bhQ/F0s+InlgV0NrApJZg==", - "dependencies": { - "@vue/compiler-dom": "3.3.7", - "@vue/shared": "3.3.7" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", - "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" - }, - "node_modules/@vue/reactivity": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.7.tgz", - "integrity": "sha512-cZNVjWiw00708WqT0zRpyAgduG79dScKEPYJXq2xj/aMtk3SKvL3FBt2QKUlh6EHBJ1m8RhBY+ikBUzwc7/khg==", - "dependencies": { - "@vue/shared": "3.3.7" - } - }, - "node_modules/@vue/reactivity-transform": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.7.tgz", - "integrity": "sha512-APhRmLVbgE1VPGtoLQoWBJEaQk4V8JUsqrQihImVqKT+8U6Qi3t5ATcg4Y9wGAPb3kIhetpufyZ1RhwbZCIdDA==", - "dependencies": { - "@babel/parser": "^7.23.0", - "@vue/compiler-core": "3.3.7", - "@vue/shared": "3.3.7", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.5" - } - }, - "node_modules/@vue/reactivity-transform/node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.7.tgz", - "integrity": "sha512-LHq9du3ubLZFdK/BP0Ysy3zhHqRfBn80Uc+T5Hz3maFJBGhci1MafccnL3rpd5/3wVfRHAe6c+PnlO2PAavPTQ==", - "dependencies": { - "@vue/reactivity": "3.3.7", - "@vue/shared": "3.3.7" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.7.tgz", - "integrity": "sha512-PFQU1oeJxikdDmrfoNQay5nD4tcPNYixUBruZzVX/l0eyZvFKElZUjW4KctCcs52nnpMGO6UDK+jF5oV4GT5Lw==", - "dependencies": { - "@vue/runtime-core": "3.3.7", - "@vue/shared": "3.3.7", - "csstype": "^3.1.2" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.7.tgz", - "integrity": "sha512-UlpKDInd1hIZiNuVVVvLgxpfnSouxKQOSE2bOfQpBuGwxRV/JqqTCyyjXUWiwtVMyeRaZhOYYqntxElk8FhBhw==", - "dependencies": { - "@vue/compiler-ssr": "3.3.7", - "@vue/shared": "3.3.7" - }, - "peerDependencies": { - "vue": "3.3.7" - } - }, - "node_modules/@vue/shared": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.7.tgz", - "integrity": "sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==" - }, - "node_modules/@zkochan/retry": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@zkochan/retry/-/retry-0.2.0.tgz", - "integrity": "sha512-WhB+2B/ZPlW2Xy/kMJBrMbqecWXcbDDgn0K0wKBAgO2OlBTz1iLJrRWduo+DGGn0Akvz1Lu4Xvls7dJojximWw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@zkochan/rimraf": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@zkochan/rimraf/-/rimraf-2.1.3.tgz", - "integrity": "sha512-mCfR3gylCzPC+iqdxEA6z5SxJeOgzgbwmyxanKriIne5qZLswDe/M43aD3p5MNzwzXRhbZg/OX+MpES6Zk1a6A==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.10" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/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" @@ -2765,69 +479,64 @@ "node": ">= 8" } }, - "node_modules/are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", - "dev": true, - "engines": { - "node": ">=14" - } - }, "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==", + "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/array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "is-number": "^4.0.0" + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/axios": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true, - "bin": { - "babylon": "bin/babylon.js" + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/balanced-match": { @@ -2840,26 +549,11 @@ "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/bole": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/bole/-/bole-5.0.9.tgz", - "integrity": "sha512-35GeBG6T7GW9VmLDF2IoKAtFCqMjmmq1uICbsICI0pID7ZAyUKlf7dg1wpXmn9GcMKHtg0S19CPMU5yfY3tv+g==", - "dev": true, - "dependencies": { - "fast-safe-stringify": "^2.0.7", - "individual": "^3.0.0" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2874,6 +568,7 @@ "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" }, @@ -2881,106 +576,72 @@ "node": ">=8" } }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/case-anything": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", - "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==", - "engines": { - "node": ">=12.13" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=4" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 6" } }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "node_modules/caniuse-lite": { + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, "funding": [ { "type": "individual", @@ -3007,6 +668,7 @@ "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" }, @@ -3014,49 +676,18 @@ "node": ">= 6" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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": { - "color-name": "~1.1.4" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.8" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -3066,86 +697,12 @@ "node": ">= 6" } }, - "node_modules/comment-parser": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.0.tgz", - "integrity": "sha512-QLyTNiZ2KDOibvFPlZ6ZngVsZ/0gYnE6uTXi5aoDg8ed3AkJAz4sEje3Y8a29hQ1s6A99MZXe47fLAXQ1rTqaw==", - "dev": true, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==", - "dev": true, - "dependencies": { - "arity-n": "^1.0.4" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -3158,223 +715,38 @@ "node": ">=4" } }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/dash-get": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dash-get/-/dash-get-1.0.2.tgz", - "integrity": "sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==" - }, - "node_modules/data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "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": ">= 6" + "node": ">=0.4.0" } }, - "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/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-freeze": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", - "integrity": "sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==", + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "optional": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defu": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.3.tgz", - "integrity": "sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==", + "node_modules/electron-to-chromium": { + "version": "1.4.582", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.582.tgz", + "integrity": "sha512-89o0MGoocwYbzqUUjc+VNpeOFSOK9nIdC5wY4N+PVUarUK0MtjyTjks75AZS2bW4Kl8MdewdFsWaH0jLy+JNoA==", "dev": true }, - "node_modules/destr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.2.tgz", - "integrity": "sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==", - "dev": true - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dompurify": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.6.tgz", - "integrity": "sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==" - }, - "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/easy-table": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.2.0.tgz", - "integrity": "sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "optionalDependencies": { - "wcwidth": "^1.0.1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/encode-registry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/encode-registry/-/encode-registry-3.0.1.tgz", - "integrity": "sha512-6qOwkl1g0fv0DN3Y3ggr2EaZXN71aoAqPp3p/pVaWSBSIo+YjLOWN61Fva43oVyQNPf7kgm8lkudzlzojwE2jw==", - "dev": true, - "dependencies": { - "mem": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/esbuild": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -3407,258 +779,19 @@ "@esbuild/win32-x64": "0.18.20" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-jsdoc": { - "version": "46.8.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.8.2.tgz", - "integrity": "sha512-5TSnD018f3tUJNne4s4gDWQflbsgOycIKEUBoCLn6XtBMgNHxQFmV8vVxUtiPxAQq8lrX85OaSG/2gnctxw9uQ==", - "dev": true, - "dependencies": { - "@es-joy/jsdoccomment": "~0.40.1", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.0", - "debug": "^4.3.4", - "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "is-builtin-module": "^3.2.1", - "semver": "^7.5.4", - "spdx-expression-parse": "^3.0.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-vue": { - "version": "9.18.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.18.1.tgz", - "integrity": "sha512-7hZFlrEgg9NIzuVik2I9xSnJA5RsmOfueYgsUGUokEDLJ1LHtxO0Pl4duje1BriZ/jDWb+44tcIlC3yi0tdlZg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.1.1", - "postcss-selector-parser": "^6.0.13", - "semver": "^7.5.4", - "vue-eslint-parser": "^9.3.1", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=6" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "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/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3683,24 +816,6 @@ "node": ">= 6" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true - }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -3710,36 +825,11 @@ "reusify": "^1.0.4" } }, - "node_modules/fetch-blob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-2.1.2.tgz", - "integrity": "sha512-YKqtUDwqLyfyMnmbw8XD6Q8j9i/HggKtPEI+pZ1+8bvheBu78biSmNaXWusx1TauGqtUUGx/cBb1mKdq2rLYow==", - "dev": true, - "engines": { - "node": "^10.17.0 || >=12.3.0" - }, - "peerDependenciesMeta": { - "domexception": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3747,85 +837,51 @@ "node": ">=8" } }, - "node_modules/filter-iterator": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/filter-iterator/-/filter-iterator-0.0.1.tgz", - "integrity": "sha512-v4lhL7Qa8XpbW3LN46CEnmhGk3eHZwxfNl5at20aEkreesht4YKb/Ba3BUIbnPhAC/r3dmu7ABaGk6MAvh2alA==", - "dev": true - }, - "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">=0.10.0" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "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": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=10" + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" + "type": "patreon", + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fs.realpath": { @@ -3838,6 +894,7 @@ "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": [ @@ -3847,44 +904,30 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "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==", "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3902,200 +945,18 @@ "node": ">=10.13.0" } }, - "node_modules/glob/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==", + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.4" } }, - "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dev": true, - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-own-property": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-own-property/-/has-own-property-0.1.0.tgz", - "integrity": "sha512-14qdBKoonU99XDhWcFKZTShK+QV47qU97u8zzoVo9cL5TZ3BmBHXogItSt9qJjR0KUMFRhcCW8uGIGl8nkl7Aw==", - "dev": true - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/identity-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/identity-function/-/identity-function-1.0.0.tgz", - "integrity": "sha512-kNrgUK0qI+9qLTBidsH85HjDLpZfrrS0ElquKKe/fJFdB3D7VeKdXXEvOPDUHSHOzdZKCAAaQIWWyp0l2yq6pw==", - "dev": true - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/individual": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/individual/-/individual-3.0.0.tgz", - "integrity": "sha512-rUY5vtT748NMRbEMrTNiFfy29BgGZwGXUi2NFUVMWQrogSLzlJvQV9eeMWi+g1aVaQ53tpyLAQtd5x/JH0Nh1g==", - "dev": true - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4112,16 +973,11 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, "node_modules/is-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" }, @@ -4129,53 +985,32 @@ "node": ">=8" } }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" + "hasown": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { - "node": ">=8" + "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" }, @@ -4183,95 +1018,13 @@ "node": ">=0.10.0" } }, - "node_modules/is-iterable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-iterable/-/is-iterable-1.1.1.tgz", - "integrity": "sha512-EdOZCr0NsGE00Pot+x1ZFx9MJK3C6wy91geZpXwvwexDLJvA4nzYyZf7r+EIwSeVsOLDdBz7ATg9NqKTzuNYuQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "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.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/iterable-lookahead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/iterable-lookahead/-/iterable-lookahead-1.0.0.tgz", - "integrity": "sha512-hJnEP2Xk4+44DDwJqUQGdXal5VbyeWLaPyDl2AQc242Zr7iqz4DgpQOrEzglWVMGHMDCkguLHEKxd1+rOsmgSQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "node": ">=0.12.0" } }, "node_modules/jiti": { @@ -4283,185 +1036,6 @@ "jiti": "bin/jiti.js" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/knip": { - "version": "2.38.6", - "resolved": "https://registry.npmjs.org/knip/-/knip-2.38.6.tgz", - "integrity": "sha512-FUkcSx0VGmRQ70rQzcygZrP3FPpoFS5CFp7sONGclB+HIIA6DJ11u1MZXmh0XsXewgeIm9guCkAD6xoO4i/hWA==", - "dev": true, - "dependencies": { - "@ericcornelissen/bash-parser": "^0.5.2", - "@npmcli/map-workspaces": "^3.0.4", - "@pkgjs/parseargs": "0.11.0", - "@pnpm/logger": "5.0.0", - "@pnpm/workspace.pkgs-graph": "2.0.10", - "@snyk/github-codeowners": "^1.1.0", - "chalk": "^5.2.0", - "easy-table": "^1.2.0", - "fast-glob": "^3.2.12", - "globby": "^13.1.3", - "jiti": "1.21.0", - "js-yaml": "^4.1.0", - "micromatch": "^4.0.5", - "minimist": "^1.2.8", - "pretty-ms": "^8.0.0", - "strip-json-comments": "^5.0.0", - "summary": "^2.1.0", - "typescript": "^5.0.2", - "zod": "3.22.4", - "zod-validation-error": "1.5.0" - }, - "bin": { - "knip": "dist/cli.js" - }, - "engines": { - "node": ">=16.17.0 <17 || >=18.6.0" - } - }, - "node_modules/knip/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/knip/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/knip/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/knip/node_modules/strip-json-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", - "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true - }, "node_modules/laravel-vite-plugin": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.8.1.tgz", @@ -4478,17 +1052,13 @@ "vite": "^3.0.0 || ^4.0.0" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, "node_modules/lines-and-columns": { @@ -4497,189 +1067,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "node_modules/linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/linkifyjs": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.1.tgz", - "integrity": "sha512-zFN/CTVmbcVef+WaDXT63dNzzkfRBKT1j464NJQkV7iSgJU0sLBus9W0HBwnXK13/hf168pbrx/V/bjEHOXNHA==" - }, - "node_modules/load-json-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", - "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^5.0.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/load-json-file/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.curry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", - "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/magic-string": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.16.0.tgz", - "integrity": "sha512-c4BEos3y6G2qO0B9X7K0FVLOPT9uGrjYwYRLFmDqyl5YMboUviyecnXWp94fJTSMwPw2/sf+CEYt5AGpmklkkQ==", - "dev": true, - "dependencies": { - "vlq": "^0.2.1" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/markdown-it": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", - "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, - "node_modules/mem": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", - "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", - "dev": true, - "dependencies": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/mem?sponsor=1" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4702,13 +1089,25 @@ "node": ">=8.6" } }, - "node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "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": ">=8" + "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/minimatch": { @@ -4723,55 +1122,22 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mlly": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", - "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, "dependencies": { - "acorn": "^8.10.0", - "pathe": "^1.1.1", - "pkg-types": "^1.0.3", - "ufo": "^1.3.0" + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" } }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, "funding": [ { "type": "github", @@ -4785,141 +1151,46 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/ndjson": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", - "integrity": "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==", - "dev": true, - "dependencies": { - "json-stringify-safe": "^5.0.1", - "minimist": "^1.2.5", - "readable-stream": "^3.6.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "ndjson": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-fetch": { - "version": "3.0.0-beta.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.0.0-beta.9.tgz", - "integrity": "sha512-RdbZCEynH2tH46+tj0ua9caUHVWrd/RHnRfvly2EVdqGmI3ndS1Vn/xjm5KuGejDt2RNDQsVRLPNd2QPwcewVg==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^3.0.1", - "fetch-blob": "^2.1.1" - }, - "engines": { - "node": "^10.17 || >=12.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/node-fetch-native": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.4.0.tgz", - "integrity": "sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==", + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-pairs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-pairs/-/object-pairs-0.1.0.tgz", - "integrity": "sha512-3ECr6K831I4xX/Mduxr9UC+HPOz/d6WKKYj9p4cmC8Lg8p7g8gitzsxNX5IWlSIgFWN/a4JgrJaoAMKn20oKwA==", - "dev": true - }, - "node_modules/object-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/object-values/-/object-values-1.0.0.tgz", - "integrity": "sha512-+8hwcz/JnQ9EpLIXzN0Rs7DLsBpJNT/xYehtB/jU93tHYr5BFEO8E+JGQNOSqE7opVzz5cGksKFHt7uUJVLSjQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/object.omit": { + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-3.0.0.tgz", - "integrity": "sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==", - "dependencies": { - "is-extendable": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ofetch": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.3.3.tgz", - "integrity": "sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, - "dependencies": { - "destr": "^2.0.1", - "node-fetch-native": "^1.4.0", - "ufo": "^1.3.0" + "engines": { + "node": ">= 6" } }, "node_modules/once": { @@ -4931,210 +1202,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onetime/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/orderedmap": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", - "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==" - }, - "node_modules/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-memoize": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-4.0.1.tgz", - "integrity": "sha512-km0sP12uE0dOZ5qP+s7kGVf07QngxyG0gS8sYFvFWhqlgzOsSy+m71aUejf/0akxj5W7gE//2G74qTv6b4iMog==", - "dev": true, - "dependencies": { - "mem": "^6.0.1", - "mimic-fn": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/p-memoize?sponsor=1" - } - }, - "node_modules/p-memoize/node_modules/mem": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-6.1.1.tgz", - "integrity": "sha512-Ci6bIfq/UgcxPTYa8dQQ5FY3BzKkT894bwXWXxC/zqs0XgMO2cT20CGkOqda7gZNkmK5VP4x89IGZ6K7hfbn3Q==", - "dev": true, - "dependencies": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sindresorhus/mem?sponsor=1" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-ms": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", - "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-npm-tarball-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-npm-tarball-url/-/parse-npm-tarball-url-3.0.0.tgz", - "integrity": "sha512-InpdgIdNe5xWMEUcrVQUniQKwnggBtJ7+SCwh7zQAZwbbIYZV9XdgJyhtmDSSvykFyQXoe4BINnzKTfCwWLs5g==", - "dev": true, - "dependencies": { - "semver": "^6.1.0" - }, - "engines": { - "node": ">=8.15" - } - }, - "node_modules/parse-npm-tarball-url/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -5144,82 +1211,23 @@ "node": ">=0.10.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-temp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-temp/-/path-temp-2.1.0.tgz", - "integrity": "sha512-cMMJTAZlion/RWRRC48UbrDymEIt+/YSD/l8NqjneyDw2rDOBQcP5yRkMB4CYGn47KMhZvbblBP7Z79OsMw72w==", - "dev": true, - "dependencies": { - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=8.15" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -5227,79 +1235,29 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pinia": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz", - "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", - "dependencies": { - "@vue/devtools-api": "^6.5.0", - "vue-demi": ">=0.14.5" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "@vue/composition-api": "^1.4.0", - "typescript": ">=4.4.4", - "vue": "^2.6.14 || ^3.3.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/pinia-plugin-persistedstate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.0.tgz", - "integrity": "sha512-tZbNGf2vjAQcIm7alK40sE51Qu/m9oWr+rEgNm/2AWr1huFxj72CjvpQcIQzMknDBJEkQznCLAGtJTIcLKrKdw==", - "peerDependencies": { - "pinia": "^2.0.0" - } - }, - "node_modules/pinia/node_modules/vue-demi": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", - "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" } }, "node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -5323,6 +1281,90 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, "node_modules/postcss-selector-parser": { "version": "6.0.13", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", @@ -5336,256 +1378,17 @@ "node": ">=4" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, - "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-ms": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", - "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", - "dev": true, - "dependencies": { - "parse-ms": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/prosemirror-changeset": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz", - "integrity": "sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==", - "dependencies": { - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-collab": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", - "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", - "dependencies": { - "prosemirror-state": "^1.0.0" - } - }, - "node_modules/prosemirror-commands": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz", - "integrity": "sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-dropcursor": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz", - "integrity": "sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" - } - }, - "node_modules/prosemirror-gapcursor": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz", - "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==", - "dependencies": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" - } - }, - "node_modules/prosemirror-history": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.2.tgz", - "integrity": "sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==", - "dependencies": { - "prosemirror-state": "^1.2.2", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.31.0", - "rope-sequence": "^1.3.0" - } - }, - "node_modules/prosemirror-inputrules": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.2.1.tgz", - "integrity": "sha512-3LrWJX1+ULRh5SZvbIQlwZafOXqp1XuV21MGBu/i5xsztd+9VD15x6OtN6mdqSFI7/8Y77gYUbQ6vwwJ4mr6QQ==", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-keymap": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz", - "integrity": "sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==", - "dependencies": { - "prosemirror-state": "^1.0.0", - "w3c-keyname": "^2.2.0" - } - }, - "node_modules/prosemirror-markdown": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.11.2.tgz", - "integrity": "sha512-Eu5g4WPiCdqDTGhdSsG9N6ZjACQRYrsAkrF9KYfdMaCmjIApH75aVncsWYOJvEk2i1B3i8jZppv3J/tnuHGiUQ==", - "dependencies": { - "markdown-it": "^13.0.1", - "prosemirror-model": "^1.0.0" - } - }, - "node_modules/prosemirror-menu": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz", - "integrity": "sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==", - "dependencies": { - "crelt": "^1.0.0", - "prosemirror-commands": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-state": "^1.0.0" - } - }, - "node_modules/prosemirror-model": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.3.tgz", - "integrity": "sha512-tgSnwN7BS7/UM0sSARcW+IQryx2vODKX4MI7xpqY2X+iaepJdKBPc7I4aACIsDV/LTaTjt12Z56MhDr9LsyuZQ==", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-schema-basic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.2.tgz", - "integrity": "sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw==", - "dependencies": { - "prosemirror-model": "^1.19.0" - } - }, - "node_modules/prosemirror-schema-list": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.3.0.tgz", - "integrity": "sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.7.3" - } - }, - "node_modules/prosemirror-state": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", - "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.27.0" - } - }, - "node_modules/prosemirror-tables": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.3.4.tgz", - "integrity": "sha512-z6uLSQ1BLC3rgbGwZmpfb+xkdvD7W/UOsURDfognZFYaTtc0gsk7u/t71Yijp2eLflVpffMk6X0u0+u+MMDvIw==", - "dependencies": { - "prosemirror-keymap": "^1.1.2", - "prosemirror-model": "^1.8.1", - "prosemirror-state": "^1.3.1", - "prosemirror-transform": "^1.2.1", - "prosemirror-view": "^1.13.3" - } - }, - "node_modules/prosemirror-trailing-node": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.7.tgz", - "integrity": "sha512-8zcZORYj/8WEwsGo6yVCRXFMOfBo0Ub3hCUvmoWIZYfMP26WqENU0mpEP27w7mt8buZWuGrydBewr0tOArPb1Q==", - "dependencies": { - "@remirror/core-constants": "^2.0.2", - "@remirror/core-helpers": "^3.0.0", - "escape-string-regexp": "^4.0.0" - }, - "peerDependencies": { - "prosemirror-model": "^1.19.0", - "prosemirror-state": "^1.4.2", - "prosemirror-view": "^1.31.2" - } - }, - "node_modules/prosemirror-transform": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.8.0.tgz", - "integrity": "sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==", - "dependencies": { - "prosemirror-model": "^1.0.0" - } - }, - "node_modules/prosemirror-view": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.32.1.tgz", - "integrity": "sha512-9SnB4HBgRczzTyIMZLPE1iszegL04hNfUyS8uPtP1RPxNM2NTCiIs8KwNsJU4nbZO9rxJTwVTv7Jm3zU4CR78A==", - "dependencies": { - "prosemirror-model": "^1.16.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } + "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/queue-microtask": { "version": "1.2.3", @@ -5607,63 +1410,20 @@ } ] }, - "node_modules/ramda": { - "name": "@pnpm/ramda", - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@pnpm/ramda/-/ramda-0.28.1.tgz", - "integrity": "sha512-zcAG+lvU0fMziNeGXpPyCyCJYp5ZVrPElEE4t14jAmViaihohocZ+dDkcRIyAomox8pQsuZnv1EyHR+pOhmUWw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "pify": "^2.3.0" } }, "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" }, @@ -5671,26 +1431,21 @@ "node": ">=8.10.0" } }, - "node_modules/rename-overwrite": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/rename-overwrite/-/rename-overwrite-4.0.3.tgz", - "integrity": "sha512-e1zOWZh4Lauz5DcLMC8j4eoOHPIrZkAVpiocE9SkDE1ZrGMW+W88LR1Y2YjD1DFgOYfJWqSsK6JKsRfuRH+tbQ==", + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "@zkochan/rimraf": "^2.1.2", - "fs-extra": "10.1.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=12.10" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/reusify": { @@ -5703,51 +1458,11 @@ "node": ">=0.10.0" } }, - "node_modules/reverse-arguments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/reverse-arguments/-/reverse-arguments-1.0.0.tgz", - "integrity": "sha512-/x8uIPdTafBqakK0TmPNJzgkLP+3H+yxpUJhCQHsLBg1rYEVNR2D8BRYNWQhVBjyOd7oo1dZRVzIkwMY2oqfYQ==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "3.29.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -5759,20 +1474,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-analyzer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-analyzer/-/rollup-plugin-analyzer-4.0.0.tgz", - "integrity": "sha512-LL9GEt3bkXp6Wa19SNR5MWcvHNMvuTFYg+eYBZN2OIFhSWN+pEJUQXEKu5BsOeABob3x9PDaLKW7w5iOJnsESQ==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/rope-sequence": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", - "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==" - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5796,439 +1497,112 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/sass": { - "version": "1.69.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", - "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", - "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/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote-word": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/shell-quote-word/-/shell-quote-word-1.0.1.tgz", - "integrity": "sha512-lT297f1WLAdq0A4O+AknIFRP6kkiI3s8C913eJ0XqBxJbZPGWUNkRQk2u8zk4bEAjUJ5i+fSLwB6z1HzeT+DEg==", - "dev": true - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sirv": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", - "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", "dev": true, "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "dev": true - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/std-env": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", - "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", - "dev": true - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" }, "engines": { "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.fromcodepoint": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string.fromcodepoint/-/string.fromcodepoint-0.2.1.tgz", - "integrity": "sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==", - "dev": true - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", - "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", - "dev": true, - "dependencies": { - "acorn": "^8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/summary": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/summary/-/summary-2.1.0.tgz", - "integrity": "sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==", - "dev": true - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/throttle-debounce": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", - "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/tinybench": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", - "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", - "dev": true - }, - "node_modules/tinypool": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", - "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz", - "integrity": "sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tippy.js": { - "version": "6.3.7", - "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", - "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", - "dependencies": { - "@popperjs/core": "^2.9.0" - } - }, - "node_modules/to-no-case": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-1.0.2.tgz", - "integrity": "sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==", - "dev": true - }, - "node_modules/to-pascal-case": { + "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-pascal-case/-/to-pascal-case-1.0.0.tgz", - "integrity": "sha512-QGMWHqM6xPrcQW57S23c5/3BbYb0Tbe9p+ur98ckRnGDwD4wbbtDiYI38CfmMKNB5Iv0REjs5SNDntTwvDxzZA==", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", "dev": true, "dependencies": { - "to-space-case": "^1.0.0" + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" } }, "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" }, @@ -6236,248 +1610,40 @@ "node": ">=8.0" } }, - "node_modules/to-regex-range/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==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/to-space-case": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-1.0.0.tgz", - "integrity": "sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA==", - "dev": true, - "dependencies": { - "to-no-case": "^1.0.0" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "node_modules/ufo": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz", - "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==", + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, - "node_modules/unconfig": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.3.11.tgz", - "integrity": "sha512-bV/nqePAKv71v3HdVUn6UefbsDKQWRX+bJIkiSm0+twIds6WiD2bJLWWT3i214+J/B4edufZpG2w7Y63Vbwxow==", + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "@antfu/utils": "^0.7.6", - "defu": "^6.1.2", - "jiti": "^1.20.0", - "mlly": "^1.4.2" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", - "devOptional": true - }, - "node_modules/unescape-js": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unescape-js/-/unescape-js-1.1.4.tgz", - "integrity": "sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g==", - "dev": true, - "dependencies": { - "string.fromcodepoint": "^0.2.1" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unocss": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/unocss/-/unocss-0.57.1.tgz", - "integrity": "sha512-xLsyJ8+T1/Ux93yrqOvuQy268wF5rSzydlsbqZ5EVfi01PxYyydez3nycPqbyPZientkJ0Yohzd5aBqmZgku3A==", - "dev": true, - "dependencies": { - "@unocss/astro": "0.57.1", - "@unocss/cli": "0.57.1", - "@unocss/core": "0.57.1", - "@unocss/extractor-arbitrary-variants": "0.57.1", - "@unocss/postcss": "0.57.1", - "@unocss/preset-attributify": "0.57.1", - "@unocss/preset-icons": "0.57.1", - "@unocss/preset-mini": "0.57.1", - "@unocss/preset-tagify": "0.57.1", - "@unocss/preset-typography": "0.57.1", - "@unocss/preset-uno": "0.57.1", - "@unocss/preset-web-fonts": "0.57.1", - "@unocss/preset-wind": "0.57.1", - "@unocss/reset": "0.57.1", - "@unocss/transformer-attributify-jsx": "0.57.1", - "@unocss/transformer-attributify-jsx-babel": "0.57.1", - "@unocss/transformer-compile-class": "0.57.1", - "@unocss/transformer-directives": "0.57.1", - "@unocss/transformer-variant-group": "0.57.1", - "@unocss/vite": "0.57.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "bin": { + "update-browserslist-db": "cli.js" }, "peerDependencies": { - "@unocss/webpack": "0.57.1", - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "@unocss/webpack": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" + "browserslist": ">= 4.21.0" } }, "node_modules/util-deprecate": { @@ -6486,40 +1652,11 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/validate-npm-package-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/version-selector-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/version-selector-type/-/version-selector-type-3.0.0.tgz", - "integrity": "sha512-PSvMIZS7C1MuVNBXl/CDG2pZq8EXy/NW2dHIdm3bVP5N0PC8utDK8ttXLXj44Gn3J0lQE3U7Mpm1estAOd+eiA==", - "dev": true, - "dependencies": { - "semver": "^7.3.2" - }, - "engines": { - "node": ">=10.13" - } - }, "node_modules/vite": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dev": true, "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", @@ -6570,38 +1707,6 @@ } } }, - "node_modules/vite-node": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz", - "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.4.0", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-compression2": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/vite-plugin-compression2/-/vite-plugin-compression2-0.11.0.tgz", - "integrity": "sha512-U6oEyRXZD26BynOgD/tStNTbQOLPt96aQNj/gdJTicKVYCQCdlV7QdmSF7VEhSyjiS59pQRhiMBu/uajprxWLA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.2" - } - }, "node_modules/vite-plugin-full-reload": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.0.5.tgz", @@ -6615,360 +1720,19 @@ "vite": "^2 || ^3 || ^4" } }, - "node_modules/vitest": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz", - "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==", - "dev": true, - "dependencies": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.34.6", - "@vitest/runner": "0.34.6", - "@vitest/snapshot": "0.34.6", - "@vitest/spy": "0.34.6", - "@vitest/utils": "0.34.6", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.10", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.7.0", - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", - "vite-node": "0.34.6", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", - "happy-dom": "*", - "jsdom": "*", - "playwright": "*", - "safaridriver": "*", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true - }, - "node_modules/vue": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.7.tgz", - "integrity": "sha512-YEMDia1ZTv1TeBbnu6VybatmSteGOS3A3YgfINOfraCbf85wdKHzscD6HSS/vB4GAtI7sa1XPX7HcQaJ1l24zA==", - "dependencies": { - "@vue/compiler-dom": "3.3.7", - "@vue/compiler-sfc": "3.3.7", - "@vue/runtime-dom": "3.3.7", - "@vue/server-renderer": "3.3.7", - "@vue/shared": "3.3.7" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-eslint-parser": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz", - "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/vue-router": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", - "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", - "dependencies": { - "@vue/devtools-api": "^6.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "optional": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true, "engines": { - "node": ">=12" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-validation-error": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-1.5.0.tgz", - "integrity": "sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw==", - "dev": true, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "zod": "^3.18.0" + "node": ">= 14" } } } diff --git a/package.json b/package.json index bd014a0..06260b9 100644 --- a/package.json +++ b/package.json @@ -1,53 +1,16 @@ { "private": true, + "type": "module", "scripts": { "dev": "vite", - "build": "vite build", - "lint": "eslint \"**/*.{js,jsx,.vue}\" --ignore-path .gitignore", - "format": "prettier . --write", - "test": "vitest", - "knip": "knip", - "ls-lint": "npx @ls-lint/ls-lint" + "build": "vite build" }, "devDependencies": { - "@ls-lint/ls-lint": "^2.2.2", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "@typescript-eslint/parser": "^6.9.1", - "eslint": "^8.52.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-jsdoc": "^46.6.0", - "eslint-plugin-vue": "^9.18.1", - "knip": "^2.38.6", + "autoprefixer": "^10.4.16", + "axios": "^1.1.2", "laravel-vite-plugin": "^0.8.0", - "lodash": "^4.17.19", - "postcss": "^8.4.27", - "prettier": "3.0.3", - "rollup-plugin-analyzer": "^4.0.0", - "ts-node": "^10.9.1", - "typescript": "^5.0.4", - "unocss": "^0.57.1", - "vite": "^4.4.7", - "vite-plugin-compression2": "^0.11.0", - "vitest": "^0.34.3" - }, - "dependencies": { - "@tiptap/extension-highlight": "^2.1.8", - "@tiptap/extension-image": "^2.0.3", - "@tiptap/extension-link": "^2.0.3", - "@tiptap/extension-subscript": "^2.0.3", - "@tiptap/extension-superscript": "^2.1.8", - "@tiptap/extension-text-align": "^2.0.3", - "@tiptap/extension-underline": "^2.0.3", - "@tiptap/pm": "^2.0.3", - "@tiptap/starter-kit": "^2.1.8", - "@tiptap/vue-3": "^2.0.3", - "@vitejs/plugin-vue": "^4.4.0", - "dompurify": "^3.0.4", - "dotenv": "^16.0.3", - "pinia": "^2.0.28", - "pinia-plugin-persistedstate": "^3.2.0", - "sass": "^1.69.5", - "vue": "^3.3.7", - "vue-router": "^4.2.2" + "postcss": "^8.4.31", + "tailwindcss": "^3.3.5", + "vite": "^4.0.0" } } diff --git a/phpcs.xml b/phpcs.xml deleted file mode 100644 index d90c3c1..0000000 --- a/phpcs.xml +++ /dev/null @@ -1,119 +0,0 @@ - - - STEMMechanics Coding Standards - - app - config - resources - routes - tests - - */database/* - */cache/* - */lang/* - */*.js - */*.css - */*.xml - */*.blade.php - */autoload.php - */storage/* - */docs/* - */vendor/* - */migrations/* - public/index.php - - - - - - - - - - - - */tests/* - */data/* - - - - - - - - - - - - - - - - - - error - - - - - error - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml index 8df6492..f112c0c 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,30 +1,31 @@ - - - - ./tests/Unit - - - ./tests/Feature - - - - - - - - - - - - - - - - - - - ./app - - + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + diff --git a/public/.htaccess b/public/.htaccess index 19f7a27..3aec5e2 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -3,31 +3,8 @@ Options -MultiViews -Indexes - - - - Header set Content-Disposition "attachment" - - - - RewriteEngine On - # Block access to .git directory - RewriteRule .*\.git/.* - [L,R=404] - - # Force HTTPS - RewriteCond %{HTTPS} !=on - RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] - - # Support shortlinks - RewriteCond %{HTTP_HOST} ^(www\.)?stemmech\.com\.au$ [NC] - RewriteRule ^(.*)$ shortlink.php?code=$1 [L,QSA] - - # Add www subdomain if missing - RewriteCond %{HTTP_HOST} ^stemmechanics.com.au$ [NC] - RewriteRule (.*) https://www.stemmechanics.com.au/$1 [R=301,L] - # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] @@ -37,31 +14,8 @@ RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] - # Pass to media handler if the media request has query - #RewriteCond %{REQUEST_FILENAME} -f - #RewriteCond %{QUERY_STRING} . - #RewriteRule ^uploads/(.+)\.(jpe?g|png)$ media.php?url=uploads/$1.$2 [NC,QSA,L] - - # AddEncoding allows you to have certain browsers uncompress information on the fly. - AddEncoding gzip .gz - - #Serve gzip compressed CSS files if they exist and the client accepts gzip. - RewriteCond %{HTTP:Accept-encoding} gzip - RewriteCond %{REQUEST_FILENAME}\.gz -s - RewriteRule ^(.*)\.css $1\.css\.gz [QSA] - - # Serve gzip compressed JS files if they exist and the client accepts gzip. - RewriteCond %{HTTP:Accept-encoding} gzip - RewriteCond %{REQUEST_FILENAME}\.gz -s - RewriteRule ^(.*)\.js $1\.js\.gz [QSA] - - # Serve correct content types, and prevent mod_deflate double gzip. - RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1] - RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1] - # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] - diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png deleted file mode 100644 index 2085bddabe5a0c2785ddc13a624a076984ab0f28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20338 zcmdR0(|0F6u>aP!-L2hjZQHhO+ve8T+O}=mwr#t2e=qm`4fkO(lSv+OP9`}spP3{= zURDea8XFn_0KiFz3oHKPz5fv;_`gw!2&ka= zO;^j5soTj%&YCqRC8D_do1vES2@8cR`8kt|j6IEXj_XfPy1|I5tu zG(0Um{Y!6?D|_nc)XY@4ZEs#vef>BzBxE=)qw(l)Z*OncZobBDG3TeNM&r-t37=02 zozAAiA;v7j|O)*_gIXOfBer7h92zAT)~J~ zc6N5h<>lr6oD>qgs6H{g=;Jdkc!;3F?$J?`$zrJjg7^IxdH3mtG|g%LM{~zbw^ycU zK}3uFbG5?Gw`X*JO>8`9$n@0IRgOl3>C|eQQ;Et;Ru^}J>MsC^F;7-BmlbX_EcYjE zrB=%{B|E!2l&}vP=Q(75P80=f9MPMvukXZP8VyEJBWEj>-%LzOPFGDU-G%a06UxM9 zXJ=vD1@}X6;3~6(Jo<_tEcEwfCE4xZGkMl%vueAsTgO9;L?GXPHp^SKJ*7|x2<#A= z1{;ct$=oMXfA5u*m38GcV94e0etBtoA+As+I#OHL!?@6G3mEuRvak}{Z`bc}4Nj0} zlH+J;)z{ULvbiCgvoQpIegfx_s>=)L;%7z1!v$(4_yNIzEKAkVQ#`&(?tTmk2_RSAVVmV|f)F@NK@qokh`$+v6FOpMK z=-=y;kJSx~PDH@OgV0Wu(3ThCla}_zoXr7kggLK`vb}b^gXf3dXt8tq{L3kwTD z6XWB8k&%&txeX91Dk>gUO`2wymCODJC>7miGqYbfZg|=y%H^F;;6}9ysGo4)1sl^> z8JWBvyD}5~f!uuq6I!>=Pvm?*{LoNWA_6>~31NQ`I67Jr6xULr47~|`k%oq{i*+_w z=boo7C`dW#_AX|**x7M2xIOL--8EVFO;(sc>!^F^wVEfNDr&mh(eQJ`%AHyI%In-P zt&Y1ZQEhP1jAv1jF%lS=WDEJwBZgapSOkE8sIULo3Pz5{aT+Q&gj5eao3EZ-PglR) zR(sXK_yqN*wT;dEa4dnl`&@ol!fZ+N0G{g|oQ@;_c9OvFv+g8cBq|%Ur3*X!8XDd@ zT29n81$^olW4R;8cBnl|69z`=_!<4!D%A<&@FZSVjaFSlE54~Iw6d});Pwi`vHjd~ zTwJbbhR-vKwdN;^&}X)55w^Lxc_inbHIMu|(??(Kb2{U9n6`6sbJqymx4p#t-(Yd7 z_~&y@Pwj0r<$vI>B?AwMk)*qEP35CglIlL99}kp7MN}-1U=7Lqi%zJgRI4}7J`NKJ zy0cSKc&5xzZ48)H)>qYs;IUEL_pUoiYT6#Au^jvnD)Rq|Sn;_wJ~+G{?J5pc>vYh> z;BgfL8FB?CcIoO0dX$!w9LH-7i*Fkm*4~((kIc-}IbG(u zsjJoh5;2#?l}t|9i{840lk*&3`ucA$A#O^Jq2bs(sZ*4`hw|Zb_Ice zg$2j^$uqpY3Sxp;bKd(lY6;0Mu zVEv|RIvUFo?e&sZRz}^Bq9ojhUj@#u^?qCF7K_bJi|}Ge`Sv|@U9nNlikCS0Ad9n*-Z^QUO2<|^EoMmz@rRBKzi z3m+3x7;smvs>QmnHT9xhDW|2yrFq+H#1QjfzJ{<92bl~!a|jsBfcs12G;4%mb?Nj3 z6LSNk{)6L`YGq(!M?3AOw+NRCI&HT`CWe^BjTUOaB=R*pqmz)3Fl_XviG6&AMRnnU z%k5f`PS@Mo+`-`uAW(*AEe1~-R<;rcIJ;!@B1>dMNOcp%`x)gI4law{Ki99cfMeH)Sj zusW7fcMWVj6k&flnDY&4}rIG{PulrH-0+5q$EO00C zaet*8%w!jCE7Yma@uwz6{+dpvOGVt(6;_o8k|0(E1haL$YWLV80Q*EW;)^<|;j0vX>zkrq@jLFPjFaRVf_d#|^|24e7{y4I$q?rxqg5NzMBJ9^+ZeO{!Sp*o~_+Vz2J>*{{@ zirW~UK3+2Ui|X=3_d~=IN>N*BwjaWAdg}iLrCtSF_GSjneDnIxTJSk%t04U&Ue_;d zb6xztWamamtHc0z;Qi>WR=d3cB@8dx51;hQZ2;^#XUX;*`ULgm|3WjSc>ZX4#ShBTY7_Pix zsZ2>?fr_deIPV@ZMu|LezFO9vtsB#iayO&_?{^Y&5P00h=9+Tz4p zk%5T`8qfTKlPNB{{r+INN{3pNMuXSE(@LxfR~`~R%f%~ErnxP~2i9GtZXiOi$@fE)pv0e3<780TEV`Oh+h;3{hO@iIGwMl&IOjg3kNaz(R&?mK#Ce zmvMF&^zflDVxRdc2*#xFWLERzST+V?uM0zOSO?cSdO(y0HYjXbQOL4WD-Dp$^=``M*qi@A&iw7U{qc=?_W9@nbimMwM$`_B< zU|>ZkE7e;M)1PlOpS(8fMsl>;uY0|6ylb-*sU9)aTvv}^J>2$vl746-+%Dv)EtRlvQEwA44Jf7Q#BcL3S%z@``f0A}(Z_705ns zi%3Zi&yTk)5Z1C|8rP}DC&p6fo`h%rTp>AunB`Nh%;Z;PEQ|Ls@*)`RfM|O>cmMO_ z4`yf{nzG);M#Gf<=p*)O7x6!FuCBKDT6Cw zITtGS;%vbS?jj{MvmUbBFs?WDxO{Ym44nT2>i{qP*PXNuCrM9=8cb^TQHsJ ze)pJ+R+-=oU4MtAzg&SK1HkG9ku+kyeoYw63f_@O%5X{zg?Jq9Pb;R3Zqz{Vd_HC< zs|NPM>ZT_ri|&7>sH(PB`>WFb&>x+o+EZYNr)Fe%%t84FX+t^GIiC;yj^y-=lNH6w ztFKpF@J15J_S+d?w(URU919UT2(mXsqjtS#oK;QA}5vQLt9Erg@ zh%26B8(k1VI=v?PMN6CojXGCbN6`Wt=(%rSU$^%O%88pH97?N~h)fmVeZy{OlvYk{ z-=Xh+t{I@UE?hr43M%IA_=;6U``I~mUfx&8q^uB)1jH&JVwucxYzU<=@6HQ%vV6-` zA?s=+nlLphpq!W?R>buzzchbyn8U5HKksO-fFaH8YZ(yE6(i-`U|RgB)B@G@=~T&GDo4 zj<@Z);6)68lJ*&Zm`}Y+G@r_ui1?_ku6_o%b(0bk8{xcLv^AuFo1e6yQLD21_YMPm zvH8@<`>;p1vdQ?HV4-e{F83KFr>02_wnmKe>c|TcF(Slc`TaD-#74XymrQYU^ZQGC z8`1%}6?x~0btLMg;(MonGNJ_h6I5t44XQN6#a%n;NE?(O;7Pei(#f7IZQE>-A)Mwo z1uYvC7L)UXmK=&$iZ^4Ey>0@v7#D~72~5t$mmE31ue0Uw@NP<{<3BZnpBtHOUb}-U z+6+MU@yuLEc{=XXg@1 zBw2rrkeN((1b;5KW#2qFHbWSxsj2rf?7E=_Rx^p_$i!@{v>$Fx<@nD-aGZY-n?e+C z?d$(4<3HR~`KV$GOE|(^qXn*p#4|D(O58m-86&X@R*uOCq=&okBExPp$(xQRb&Fgq zgI#mFGk6NiXcimw?UNS5!x3G?2Nen7p~F(mD<#*#Vg*aq`!nkc%2S@Jj4mIK_fRq~ zCuI58NOMe&X?{K87KDT=!hP;vpc98nDurj zLFWDo6^{f21mIN2Y3o^|8f#yJaNVc{hZgvmD`c)(Pi z(A-0#rj9=ynQmT`RQ^4S))*uApG#9Y;t8OxG00=Rs+!=)!Si_J^LSCBaMn=s=Z0KG zs?3v3ei~Bflp54W5fRt7H_{*&Xvud{GSf*82O{5tj~l)Za9e3BS0@NLXJ{b(No;cR z5+->xs@wiW>)GNG5=8R98dm3F`eU_rBjD@J*KCnd90v7J>C%|Sa$^xt$|@QX*oBNv zMlM0o%CxOsCL$q8wXUbVx||-LkVC=*5R8(X9*NnSp9_#A%L6tQLkjTp$}wGCK8(xA znb2@>JU|jDpaso4ZaY3N;9`w!5Y0%g*1B>HC(}VC3Y1epMSt4z_(0+g@`c&%HfexW zE@?qzQ^UAV$d&Xs;s}`KSF8otiQk`y%(%EXk#fWlAysPEo?NiFuM9238B#qtFOI zj&nYhCihM91qMc`j`8?@zH)(p z!|H1tcWUvtX1ihN`yhUeUPyovp#}ojy8`AD4~hVoCkGi?hdWxQ4{q57_w&mJGuqsg zdzFJG8a{ixb{}V0}n_J|AG&%JKS(>wfXlYzghFs?@IJ4_2-~Q-`-E@Q|goQit2sk z-58nCO#$j0@y>;Oy(;{KMr{1-W=$6594a4>%bG3$xU8*>DUCm}(xR3TWMytQ+m|M1 zh;!ff6J#4oCHo)Ci(Vh)pnRu z;BodQGL)2Xw~$oQ|4flp$Sc}3xdDY^(-)+S44(Arn^^fBrrvp>zVhHeNsOqgA1QYA z3AESV)y-`t&^9fCPyykS^6xm;4lf7S(4gx(XkWERBn0#6$i=+-ZEt}TMrwF$>@XM~9OT+=!aF)VQDchuI z=;$$nIpxsqPL2)pl%-}l?S0nPR~Ov}QApK8sP4q@`gb0%f4a7J+u4BUsxa5qj25zs zn-NF11O(`wC9!cyW^47qp6(YDv&uuacZ!RTejvr8F*sUw$oTkna7JgepE4H*g#(5- z=Hx?`iF+tPo$8LQXHQWwd)G_P@}BXs8BNAt)ZM%Uv`ZCgn*4e}j6)7v_Tox)C%;Od9;dx)?v%9>H_WRtL?^BZN4G)ASW(GQ< zthn$O%}PfpJjP%Vy{^D0f&G0kmY8KoV)8^Wgk@r{%pS4nGeyItAbb4k0u{5@T#_th zX`hoSLSfHqb@qFo`TyX@jyD-R_5};jUSE?Y%`8ZtCUEhB^6KjR!G<|SRCZz(BvA)! z@9#?wCKm2sp!U;g1m4$OktAx$*0=8ZYYAOQm|$PqtlIV_8WG!#Ht;JI~Z-_F`KVSOg7<* z+e`=E$)f6do>kZzyUF$+p$~|`6~-5Uvj#(06N7=hJeH{G`oTVHabB(Z@)HG@5|`}# zDJ?ALfspWeCDG{Tt;J_bswBjs`OL#tfKxe>+}jF#DV60((5+x*LXuN1V3V*n(g0Jj z-W;P>Y;>!Q`WHmalW8lHM{e9v(CW@xfFfdImO_Y`0hbz9L-o#`>-7{}U8st;H>he! zSc7KZ_^RbPM|d6#M{ClsRSu8WiX+bMKV7W+;GC>wMT#(_fZ^lg-?7UI_6r-ud*WU@ z2^+4O-J-wkA&Z!xIU5DdLcYD}He+?^>_*fw^cRrig(63|cYS|<*gfAiN&;#+?<0|r zci9))Eg{7dDz;pa2GgkcX}YfhVg#A zFFe$AQ>Oe)p1Uguv-s)eafaTmX2Rk?g^;y^`qDKrk;tx|KD@Y=td@mO@XbooBNQDW zhxxZAL;JL6X?N4Pv=}138Kf_6Dt!N3APIFzZdjk+95+%7@HjU{DUaY2K z5{3vdZAIy+L)e;K^ff=@m^suhJcwye|KJFt#lAsWY)B2~Y48gqrP3tm*+_yFqKP-bQYD5kT);B!&@}nd1 z@q%CUxhYsaHkntCc2VYi#af@no^D+%M;Jv|=-O+eMQoXe|6B5wq4>ojI9{jCq-OAo zr8)iZ_O@0=ztws~$NqvDSU*@$m>mu>B^Z*@X|mXVzhtkSE1CbAn`HJ1pV@qt0Forl z74IbbjrH^SFq6nHO28Y1Av|Ql`EFbgC|g8z+8!Xh*DYEv z7_0~eH9L?O39PM>q=Hira(502d=a9hk!QEy-|y{=c>n-b40GV&LtuoZ^M(IdYcTtY z3*Z=B8xrAgA7#LAfltBA>Fo3|pRRf^KfY{B0&4i=W-juQtw5mV9=n z1AeahD&Cps9F{rIl1i^9i^}zy_~O@|F^e^!#;@Mu`(97P2b6|uKkiUxLfc1`gQKH+ zIr+E&4R1CDF)^}*{-%HM@g`dew5b4#Iyg%)8?bUV`%q#f=*TqqP}b>Tu{%|PBwW(qrDDmo zDCO|@be3cmL>-Jxhu^AL4h3lYm`+=Pyky|TG&y& zy>2Nk=hImRW%CMt|Fg$GSWL)yM0HdH;v?G1`P(PiUe#R)d4ZNJu#}yBtpXhSv-+Bk z&mEvG_*LHz2%2vjj*@axBG*yb-CIQ^cqK`XgUT@NzW&+$Aa5Z{zxhbH1q=w~O^vRI z{GVlO8>)k33fJ0QF2rYBZECi^T8rm6pnAEBkw)& z+Dub3ZY)kpZfAvBl(#)!WQM>CM&DfGs;=xfG53n>cLW3Z-PGc$s#w<6*Z7N^@}O4! z2OJfov0L^Z~ zL$x?z=1K;*OJkN-a@h^6=&+}DNPW9{vsz8AIn2LLrZIIYC-k(e$^#1n#Y$1l|08PZ zcsDark%+6ytFvaVlZEgK(LRJO{37XPV#!R=h&FJ|)=6Or$<9}L^>Ws6%>jyo#`~REXlqfZ{(USo@k8xGO*j&7eg-K&Tu*j521ijX!nYk zex;?Z+8%V?aCNO+tdG6hIw9~XKm9lc&&?(0rPI5^gA4MiI&(p`R4~H80{f!uu)b0f2y(rni<{0P-={*TJatXeC`{V!*)R@6jysqb&2xouF&ko`)|4d3HUYnfV5&s!4yPh8Yp1BFUKgwPoQZ$O|{| zscC58px_E3R-}u*gNR1gmXcHXThY)_rDmpfIKDmx+;qWU;qP)z)-Y+kd$qYO#vAKc z?0jBP#}`-Yn`g>UMu5tWpLUVi3{1QDo^=Elf}Bmmb|K2#LdC}E<% zrs9aj>v?>myc@lVGH|I(S862c-o3m`^7?YK64Ff4J6vzheeC)qR(d_~WZkWuQOSFe zh4f2LcevejLyYd=thB(qwdn;9_1)G1a5KGsy1SThEEWv9TBF{F+dhOs;YzakQ{XO^ zXVr3iiQ1qpYFfR!Jpes+xPt0OBB;rVB4%73IpXc8#p@IrNg!;)#L!G^tnbDhU$@WreWSBnlO|ku29q z4|;au=hl=i`M-c_$DP^lNtmb=3hE-yclg{Nm}VyBs_!Q*{PWU=@=U_zEQY~g>kmNCl!6noa zbc2tOEF?W3L2DD#-oPju>HY$+_Hxg$!UT-SO{3bvh3&OUL80qn+e@ z@5~QZ&-;fTNl9UI`KAJ{cdqH`8}8#fR6;xjh%^xB$V~{9nL0W9)**BJewF#TiD@?b zFS%1n>yg#>pP(Ni7m=9l2CFl*pmM2%9AXh&6S%--Dv>p{Lm-Sv_a`2T<3Whsf=w_3P2vz zbY*)3duFm3rhc@m=VZRNI2~9@im_fk1`utr;XgrG1ywiej|bSt&fxxuMu_uhWCFkC zFwGT$I!e+}m;JdM>#Y+?$EM%JVsU^53wye{ZBR{8n_FfPqoD2z*RGrOeN_P|%r`y~ z7h(6kgvE=E1mcB}AMjN83FyiVT{8Q)->tM{-20ughl&q1R;00aV+pn>k3xL#w4Zt2 z>vKe0^yB=i7`T7E%9{BN<%bH2= zX3Z&T_U%K%s5_np{e*nBhNTY~?NDJ$!OI6zKIambr!WR=6G7%_mk8;G!%dslMG2ey z^e+t~t$op0P{lx>4E;c8J4>ePgckCA9?VRUUEFC#)AJB3EFo5!7~#(D?5fD zGBGaw!N+tejRr|jB^muU8f|ybY+!}>91IoWW`^olW+}}UQjbdClC@&gB#2cl>_eLx ze&9Pt__M!zJ>!FZrB-0B=R66bY7OtNgpqRKviVHtK00|NOLPix)gCoUpXo(*7#&f(Q=alJrjGWl5Az^k??ULKE+gjP|I2KFV)Q z1zj>6Qxh&Oa|Uss$M0aKGURy#tZlvVjlG<@VB}0~kp2G1h6QZLaOZqWFh=VF>p~~j zXVyc15jq*19j32PsKEr`s8xSt1e2(4c9ZqZghWR39X>IuXgzrCbZdl%o4@-H^}qb9 zc2{L^oIFHrkG;KX#bu?#ONQvX_-lGz0uG5-yaHdDNSKp!y)N)P-_}Y zrC#p7bk^8+T^1OK{8pZ)0!v_2bS(dTQeaS3wWxo5$X#9J&Z%H#a@*(LqRmT-M&rTa zOpt`K+nJp|*7>Vps|YSgxG(9oC*}>6!7|xqhJWF(-_&^=xPjz!J2QVJ?{&E>@Fh4i zl<~c_9)1?8Ep&6;yNzgwhABXYr$hI|V)?NE z>XF8jKQn8J>LP0z@uGHppvTTx*^dbq7RHeIKmMG%+n> z&U9V1i+Xat$72(7(p&Ex2;z`WRDJq141Vz_#7?GRdQM|64f?K&R$2MAW7pXOOCH=6p9-kZTTdX2bB)c8E^z!deW3$e?zyHX*K zLC3SdU|DV?LG$BZU9L5#8Lf<)V3r7>V^y0eEFzv^3TX^kduIE7znS?}hPS+VPEZ8@}hebOPPmw7RmEAVZGNE#ugX~=JaO-Y6Mb8(n3iF8f%qgAXe5H zfInRt)rjbOyNd&;li2aELC|)&QO^Q#t);zA_V~KHg@5W?N-+=EI8a7<-Ooc16sdM$@wug|S@4V=AxZ3d1fUh(8eSe}(*2J*mdmJLs zlK@Mi7?h08;+GDMYKn8=;B?I{7gkKvE>n|9-G5o-4G$S!WAR^VKD0i;_k7p}ZOj+p z3_C=&QA3+;Ies_?tUTyWs_LpnG@keumY_ePPz8o6{rW_&%hCjx@r6Q zVYkuzJZRBFQ%^;C{jbO~O1p?rIaqxs{>!<}tOiWg`OQe;fF_A0Ew;PU$jGQ?fN{Eo zL09JxF8DmSjS&d)S-z_V`q$#f@0rr88Ov6_vc>kDgZBkpvglD} z8raKE4uj7z+#hjm9wJbeHw;6g_6mfRWdchZPxrL(SibMnrF4(gpUZ|WuOHv#vFiN4 zJ%8tTDJdP`AuZrpmlk$8VNib@`z0$7?R6x8LHn4oW`U}LY@AvB-x5Wj9hXaS6#);` zg30aJh3OgE230bcJwD%W&{OfmX5@zWx}BU>pq5{y3eg!nR`bYG4*;9Th4`GcwOZ(Q zKf3%0^wclo!!LE6{a&?&H&_1~=B}oVPuhHO6>Qj9;K|V_Gc>i_d?iwB>`O&Kr?9<{ zNGi``HX2-k!}tjQw(qHyEqFfGdkD*n#3-h%m)(KYPa?hGt=wQvW>BjzJ$RoN9lDkN zq8Y78S>wS_I7aC9m#)8BmIl=W+!-JSCe+eThJ4Sw8 z-FQ0%g)w(=X=>euk0-Nf!$!!DgaA;hUIaUQ%iKz2u&x&TCqXGGg@R*hMKk8Zw7ebO* z9}0kdhi1_OKDun=Uwjov6tQ{_@_g~+fO}|>qrW{VA%cvZHOk>syNTHDr1sGa*&ES9 zdyyCZxW{Or?bwOmdSELjWzx!W1C^ayaOwSlkCaj=-i+@55@tPJxBW1By{UF}-jK)D zozLrGl=ceZ*yLJpHbYMI+RQtIp}n+kRQJbm$u;99a-|GZdt{j^z9)GxSu|w`aA4sii04YsRcmQ z1kf}g2ku!2rzJLtXnwxEav}~!5GZNs3GiG#U$=PiJxfAfsLZFC!P>Yo;u4Yc^$AGd z1j)*hz=z7%=Zfu0`Gp3+`k_TNUz_8B5xuZi1)4JAw{hPo1V15P#WEvq?_el?kV&b0 zb5rfcs_MI8z5&oN+(i~D-kiqT|0`669209K{q+x_YdqU;42;;Z%)qtn{Iv`Z$2N@6tavKYp|59T(jQz zYc(@7a4%OOg~B>O1QmZ8)GD4ZTn5q;?cA=>OXRo?5ZU3KgD3*|ea9F(r&b z>+qX#F$Yy^{uk>nRYRd`$<2ueV>uN#^gewK<0A_kDye!hQgAHLo}PgsjhlXb%cd_m zL_qeeKXz8#B~*X{ITAk=O<<-YDP*p$ON&VJk&@C=l3H=$&NGg@2yGVcΛps4wd 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 OK{TGOelF{r5}E*ly5V~O diff --git a/public/assets/community-discord.webp b/public/assets/community-discord.webp deleted file mode 100644 index c308ce7e30a024c6c4f3bc39d27069a746c5d902..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22412 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 Pg9|?AA6C9SjxYcKb(Tjr diff --git a/public/assets/community-facebook.webp b/public/assets/community-facebook.webp deleted file mode 100644 index 556ac9abb037d33d56cea8eeb89bfbe8e723ce5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35152 zcmV(_K-9ldNk&FUi2wjsMM6+kP&gnwi2wkQ_yL^(D!c-a0X~sHnn|UjqM|7>d`Peo z31bQRe9f3Dzz38!Ra2d0a&Nu=r~Zr6gOmJf`tRaBZGXkx=fMBt^H}O{IY0CLX8%<6 z5dNqBJI}AzpYKPh|J^U$Pk1l=9=1QYdVqgp|3m-(vA_41*n`en|F5(M_+S0rl>VR} z|M&F1WBXI+>&l z{-4NymH+4ZgnnuLJN@_fz8O9v{-2c<7Gy=a}3a2{ukMo$l$l`B=s=jAIz8PpL_XMrRjmtxu)s8&a<=TfZw^ zc1Dulh0vhUI*NiCqr}Y4=Mq)q23W7~9zyPYyC&e)aj@-qktLa!NYl^@s*9&c)J80ap`ssD)R9 zUG!0EG9##cxWGl^);2f8;fk!MjFf-=(GlrmG9Vwl4*btX6WMipF_E zMUg;kW8Wa$J`BDPH=JCFm|Jd=(jTS(2leTjiQ@K#V1UA~! zdmf>ml$Q{Cm-esZXW8K~a+TCYS~c7vdJR6nCjKTMt};!mwwlXZ`7i+XF}&xM`Z4{u z-@nPMNv>vf5^kKZA~QYaMWH-sm86-~bfj%#_G2_ShrMdED=};+f5Fk{ z>VxWm-c*|`T3Bqi#X}Miqd&*QmWfuhjQIee^ped4x?q*9L_A0j2D{Y%Eon6ZKtKhH_bz12L zDDGmsmYQz?J2EX8;Y^OKj0x(HU`AoTkEUDNDn4y~1mX(F_G9LRWm({j4&?@^Pb@elD`h)Km2pY-nZ{dI&-g zeT~rFDriXbn&=V$su`V-oFqQ1imtPb);zit59_R*=s>w)2fF1!Qie&&Qltljfu9v< z)agzH=k1xgHM=t5IqMu7gZ@|{2|#=amQBPNx0DMVuL#xt#rmQ1pCn-%s$zM<7-C8W zwzzuB>e;r%oF3kg-XxMqAtWIPLJ))uQY2QFp|jF}B!<)XVFfXIC;H%~Y9YJRly~G; zvtoN;>TZ>KMX?rqRP+t|Aw#F~eA9!bXOnAX&^*;sh=lFntqkIN9tnt@E!J$fMsJF) zRTLQll*GPR9Z=;hlIyzh=Ty3~Ur%!3b7W1Dk1c1Qoid`8fwWj-Vs(8lJ^(G%c?h|c zyme9WROSlOz1`(@kR5OrQ1|sv-7)7J_y^|FlQd=VAE!Ig>}mpaehaStZ=*B%#`puM zcYK&vATH&_sI}SU`!;2tvdB_i`#JRA(fSAe!iXFZN)K(<3v?z8G+ zccV7|M0Rk!9Oc0$`Ysp9d9`ybJh6ClDZBnQa9rt08hbTGZX6ZG*(^^NqJQTdTmP*6 zM?$DG>mjS8+!n%L%wkgoD;wy5?Vxu9Afvck0POumq9DIRKQq7--IAgwCV^!2S*qtXfL=giq(V?QD zyha4G{uAi4YU#gW$?7O>;i7<_m6pCn=J7q++l*QM zFOEU@vF}{MDpAWPH7(!g&EkyIw@I}vPz2vC-X~37h9x^Fi0lk#dQdBjaA5|2R|DMYn^y5 z-+H`^i5mX|_z;AZ+P)fgZ(}IRgaMI*&l_|8@c+I1(xl@BgxlV3)7__S@la%4Kn&3@ zc!Mnf`1y zieQG*xP|n?&|xN9|Zql%4soea;o#VC+o zmWD~*w#at-Tk27%n)pe|Q6vy{es}}2i4C;A2Y^I+&^#belRlHbJ6qiu`L%J>ZY1|; zy*$s%9L?&cM+x1c2ppS>%eTva#jJg*}R&@+hF- z#Y&XIN0OHR=aWdtX(Ee1sgah zVcK?829L)HEK(+CSM?q_tv`rD5G1ShMo=lZ<2ndRDN}dyng5+ymP8Xd-REZCueeh& zu#knWoj>t!uriFsN{{leRL=eXl%Bf+OW-f-Gb~j_e|G*3JDJo;AK3@^HbuFMo(8}k zq1Zwd?HcJ0dzpBV!Va8ho{BRO@qMS*d*ptv0uNt%b{1oZi5<{gnVb?R>gw;3A5cLx z#93Q}G_eE(&VMA)0`a`ftNv*g(CKb+nrK20ZFzgK0vLJ32k5;V**i4KFT7V{Jc+Q{ zsb^Jntvn$7RMD+XNDpT}rb|b{F1R+F%jH!ITA+}Ke%szx+=QXObTy!f?N;L5kIys+ zB(`ChGXcuy#oh{ybDA#l;rk?Ki@-&{-3)e4&Nari#>8t)CxhOR;cV%3G~`w21)6o> zs<P_fop>KtmxZOJ6>mP#pwgC^(cZD{E2;Kiqm#9W2PK{S7p!ZynJ@ivojb zIr_$NIy~?2dv~O*8(V zs{Hcsw1}^4gN0H=QGalq^!qAK_9B9uiJpTS*0Kf3A#|&~L%ZNMi^8}-Ge5|QV5~R4 z@UN?5IyiniUWGGuG_5)@PePaH7=LhX*`VZMYr3;vXItwF8QZU|MI7vDy@dx6;TQSE z8DJ+~4j#AoJCTTj-wc+Z?2Et~i3CP^E5nibU|QEyO}^=y(%QMqX4Jj4S@)+?`e7e? z=Z%#4=4k~yqk4Ca`kQ#pMcNIIVW7pGk!la0K580LTsUi7 zqe)=<<4xK4Eg8a-atX{u`&qalkVsEwv*`x)N!u?(_@4f98(aXxS(+7%r~8fxMCd*CJrhwAH#|DDu+f*FyJ zjq!~_#t(AsZ-f^K1%FWl=hnT_7;^7MCvPr>K`1ShO9N00E}c{T#S^;QFmtl95i_nX zn>Ni5B^~j8t|h+O1wNTH6Q$F%@b^)!#^ed6LzO54&k2?HZ{rLnWm1}J7Sq>%kWTu( z_zS)eoAp61c54b;?rPKRdHu`Cf%CV`kH@FR1n1>Vd>$0JcR`y&39z=eK9?hTw9~Bb5RW=MjAfI$QhK?D#ia>m`=nZyj2LR)m1hNXPtgKQ?; zM54(g939pHWVkk8EYgUbZzeJM4m9JD3xa|-cUY$Alr<7>DA*gyal%4GS$BA~=z zshhkVonr|hHKkCxpgRJ(c3;?7^!Ka0uw{$^Voqj9^UDOhHaIj}P^<^KC%Nj>vc@e1 zIoLy#0tWx+ytt#-&9j040RH$wIgop@b|N?|IeY%8vYfP{dVT0 zv!6&JKgcH=b{VhX^97I#nTLo9A%jwo zfL6;DajgLxPAXKYPP~gd(Er)I|U( z^<6C$1%=}6RRHl0`)r7f6k(5;n}g3H#e(3rpuP~@^MiCXP9K}B$-p`%FlJ+?kV z2Wn=^7q%W(4n_04e(^3Jfgpbbn%wS3!H%${LYb+#?17d=5Odz0H=qQcBDS@Rlwf;^ zl{(`|WPMI^#w)C5Q^vJ?te0#1mA z0PFtk5YO0L^kSfTH;NJG*aThYY*tv*kx-KYvk&X0pimovQw%xLbG;r^%tCc9Vyt!0 zkyZ~E9j^IXJ>v}QZ>sOhaE6x!fj$mxtEIKBh7CBTjSp_GSxfhFIwPa@^gi6GgfHq}w3vLGr zO@XhAq#`~^1X)u^Qok!lQcxQHdHNQ-F!dL9IGQz&o_gwdt%l?Cz!KC0<2INHe2^}z zYINa0^>(Wd!i*(?-z@0%eQ4Y_fuUNW5BI`Y?pPh*Eh3((q~slmDocP`gt_p~88pHt z*K(rj#3(E%mkzy|mb7-q!=7Z(JE@3Uxn2k0M8@a7M&_I2@p=)qNuQ<%nNm#ws*Si} zC9DnIexnl0D|hw2=;5$JMYuLyo*Um~C{JTHT?w_8!4>clOCdSPrOA z5*4hRAw-CA^MB0Akj4l)CQq3<-f*A{{OrLktBb~onlriq36@fO86Q6fi-dlO{Dxv{ zV>UKF&;>%yL}Ey>wf7(EUXUyx(Yi+ig}iblgKOPeZ0z}w0Pq}`%BNg$gT?$n$vIZ) zoM2f)J$2@S_lNu#`ovA(V&>#y){HE+HGltW8hdbIPCE1J{{Ga&GrZJigNLV`rJ)cJpCtejsPjhdAX9lp(pClWs#QS9_(m8rNYG?~P(HH{kGBGPOb z)O-0v>IYOgmH*kHDX%L@xD-@{z*0ujkFP)9uMd350T(HuKoGhq5)KF~c=><$*?%uF zQf%npWoT(aeCX|+;E(;l0lH>BOh-tzn>&!)wSAVo{>mdHs|iKzoHARpj8l8b9O?Rx ztBF1j$mU7)4ffj$&Im7fieQ*RvrCJhBA~i^z7gbK_GBx|ry~=KD&00MN6>5BTGnYf z3z(lr0(kdb%XheyBzZS96xTg8;r=8N;go!{XOd8~>C68LK8o~9wDm+m#6!GCc}i5Y zr(qhX@m2P{9p@x$Uh4T~Q~HzljN_6ZQpH9=+7Y`IQ4ohN%}Vv*tA0}{4$=*Wyz$`t z*-ywy9YN5$UCNO29sS)-G$cf6v~ zeo?`h8CIi7tc@?GEW3L|(M%##WevV8z1FN+1qV3Rp!y;rk9IfAVv9#nWT19q@3dHU zcQrueHyq#9VIyulK>>btUMD@9ej(8mG=^qiKXi7ShqwE(9P6|(_(Ay*0tHwh`U^Nh zW_xa}^g(#U8rs&}d7-m5Ysu;AA%K4^a!kfQxbD7ZR1~j!lfwzFH5olcoAG%}`hh^~ zj8B#06=$03xFex?+zo|$R9Dg?G*fS1Q3m#K?FKv*?AArl8kI5̌|V=dJ>tJguD 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�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 diff --git a/public/assets/community-mastodon.webp b/public/assets/community-mastodon.webp deleted file mode 100644 index f580d131a9fdd2af0e952945ad805ce68ccda9e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32456 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 diff --git a/public/assets/community-minecraft.webp b/public/assets/community-minecraft.webp deleted file mode 100644 index c41e61c05ff84a6111e346c9773d5cec20db8af6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35916 zcmV(pK=8j(Nk&FQi~s;vMM6+kP&gnsi~s;|!2+EDD!c;80X~sHnoA|4IijMI9UCwb z31@7CZr54<^h^y}HI||>I{z>{&*@k#LBV0LEbGVQUzVf=x9WZp*Kl{=`~Ods~D@YMP6a)G%Ab~-ly&} zwfdGtLm0;IEm`+|SHJujcJcxbxZ?(nx4!H&v6zGZHc8dXl+=7pRE-TRXe`j{;&5*H zkG+EwjZM;4HSuM=@jUD4%RRO(E#~J*FLcKz^xmD5I|T9n;Eo4Z%=96~VH^(KUgH1Y z!Q<}mi*c9jK$%|5rb0K;?6TJ)t7_uLBtm7dBpDazyr(6FVi8(l+&3VEjy3$K|-=#R{Bb2t~e*HsTvJ+gMyn`79(} zF)*ckWYvOwrssC0+wYc7Gy^S2TQP3`5$XlOP#TbTDYgFb(5iZlJt-gOhQ4VbI2I}P zV2sfam|2Yd+E|F^svfgA6&qoA1}FVzAaHEdlZ;~&#!_1z9#$Y z>aXfI{sk}pV0dxt-CRBsy^~7Eg;MVX@?vxPqrU&IGVsnWK6WWc>u$8_Xi&WI-kSiZ z5ri-GXA4yv_5~Rc_SF&9m{gOLJ&xRj0vSMG7Hv=lEfsINt#h#^3i9|3QNoKl^lVz< z-tj&A0N^!P(|6`)YkqPrp#?DnP5ny_v(LL#lg_9+I55HdOpmBlb~;a8HsL)XWB6xQ zJ|WjRTPbV*p}qMa$K03Mml+0fb3Olc-+GqTUy)ye#Kd*dUlItZ%D(Wq52{-sea@zW zB($r?>;56t?K$nTd(>Pqt-`m}ggNAW>rMT)j7->WUb80>`pVBr#Oqm*dXgV?nl6bx z%DDJ?WR5Rp=0H#iQ$UZB4Pj3;xQ-Aqkgde7yo+gq50EQTJZfkYL&l0O4YF3VkOUu= zPb6YF7!q)c5TX4%r#2^JgO5q9?{#h(zF`gzk!eBCsv!?^ ze|h@#?2_ggkZ$B3Z*8Hy{;tE(i{96DQd0BI2%F6WP#>u8a=+_gZ~3cg8(xR+4sg*w z$QU$Cr5yxL$THlg0z5j9?Kw`bfU8e}i4?nVv@g5$f#aDWNzdu?t;l z(~`}1E+1__FZ34%lFLHd7@cKH#JL4Xr8v>48I9M%Rn=Qc=W4CP@$kVJMvzPz{`>pn z)5b)8g(RE<#$FkPYFqHr!UBWb9(P6cw^yB5o1x|~%r+~+FY*bJfa{bfkL!Se33Z#d z*=*A;9&FnrAon=$S==6i(Log-Ka;Q}C$f`*bu7AF9gr|ZINWT;;x+;(jD9@~faz~f z-0Yvlx_1GIj`Nf{}3%8AvXwQ4M}mrl(20LgCPy^-Pf=criGO|Dqz)Kx5t+uvGN{B%+ClmR}Q{VKcj>rOOQ6eGxr0$R)P zQn!RaYA5cI6lkc3(r4m@_&TW^)-NvpaPZI#CYh{ln;_Kpa4LLCL}`+i8XE?O66LD)Wx3`gMQk>sEsAzyIJ$p3_?lgKK}y*XRrF2?WVc#SL%wnYLgSD}TKeYI2ag zvn)T;0fT^|sCjYI8p{w^G)O~{ih7|ou&X)Q1wPyjo@KT(OO8A3`gpTA@0yV;oc~qd z%t-$6TW`|X`_*+hx4|2$na1ai@tuQW@i$RufV_0D`X)^^SR0LnM@gjr|+j{-y>To z&|nintjGg0ve19Xk=e;RvLY8WuH=xIn~B|SzGwpE){KOd26bdFL<$L;w^SDa5y_K* zaFr8m4B1c44JJzLD${6w_65rhYs_PDL|*UjHYKI;@rA7W>bkAr|5y}fP@@`B0W}r)m9b!@x%J{X-F9c^h37Ll-WW5o_n4#M) zMngp-Q{$25paByGC1Xei2c_$0XuukiNt_<+XrdL0cdbk=5GpGaW?e8A`JF~3H<9>( zd%)cjQnhuQLQwEm@rGbh+k?7B)AXk$wH1Sq6h%8gH4|a#e%zl!6Lxx_LOKI?gzWAv z!ichF_uL>B0oe!JlO|xH!@Xffem`9FCtU&EQ>t!Bhd?LXb=6dhW3JxyJf)L=ii_|l=GnoLb8KQ zUCkA7Ht2OxG8P0YgAWU_l>eR#)eeZ^ zxv3SjQ_4kKTaB$r2DP8i;)zg>lp~ltBcis-{oZTantny7=UU`E$77lbJ-e3LsL{oW z54(VEG6#4iVJh2betMKHP}PO7ZF6HL zgXMSae3=;?UTRQ9B%a|yz&+X^ICI>F0Id;{!!d~+f0+ySm07dUsSzE#a&j!=Fg1QT zkQe!K zmb=C>CNlW;oPaJ@6IG< zJ2+h-M{GDL0jLfbcED)Sdd05AHkUo$ETrh8tLc)Zvxsu0NSWE|y@eq`+3Ux59^dX- zl_{Uk45#1($&o#s)I}<^4qkIN-X|( zzg|2u+Y~*L()BcELeXGNiH*4U2@Wd-LLKh?OZvNx=8lu~2wedp_nK_b{WUcWd}zvK zULrWth_>*h-tSB3Kb|bzsbwN7`D_kUl#ENyZx=VrjX~TKV3seSKIW$B><5 z-=XZ!rifn4V5EiGvOsllC0Z-TCpLN`26W^JmBJ^mifiJOq69o)o*0H@yB4{Ix`H}l zarH9D_Su!7G0YQC21g?XIRt~u>X)e9M2_)?djjyRXWP0@0jYd9pf+faS)YG=-~u=Ik!0MyPe{^@SZ4n38Q6WSYYB(gDpJR- z4RWXd1>e`HGs97?ixEgWdPdDU^D9bu3g1XKX@Mja3I4>85op$x0<+_Hn;( z`~?xspuVidN*a#G?pN(mbs*TVgGXohd|+FO&ad^E>j-#KN61I=gKlv~;_46$}} zyI`~X*WV@hludVr5F3+QGilI!g9)eIH*y9#D_44S>Q|fN*8~K`5iyt)cdOL!J0Df~5TAG1i;KCox}V~$pxqqSq1xXU^{$mwlwQ^Y5j^5Ru0x-aNpx zUH1bVt^B2N=OP@!(ez(M9_41c)WX34Tlq14j=?ew?NHUh#tm_3>5eq~z^X0CuMv21 z5;0%NSFEbQw9-5G82iTWMG_|<8Tj@69zz1SBFPY>d#Lc_uT>^oR?Ln{_e2=tI|SK1 zqH$8DtY6Ok!vV%W5}t{9^hzvYO9wYOr9MS0Tf|J)R#1?xo4Ug(ievJ;vGxO~zd^M5 zA+tjh9F@>do#WCv1p)+>SsQgJk4-#7Us;c&*Q4@C>4{VNb^^uM%g+!b($;4p9y258 zzbz*=)Y+T#EU&#kWKS_-2zs9sefk}JV@B<;N-lV+Gaio_NSTTlv_ai+;QKr8Vis09EoScN9@;O^X5i4IjkZHG3U>e3Fp8kjzz*>z}7VS|@#JZdVJOtElR#Pum{yr3TvA3tiAY^oQ9 z-`(9sdhq|5nBY??3Q|w=U8V^mgI|vH4v`H5r_wcjHTbeOH%)8rb$>uG7BUBrP3Dbx zSs(_)o8VGSw~hukG4qW4yNbiyDfLKUFC^RW_7w@WZjDZw?hw>Ag#J1atz|zuS=3x{ zF#EFch7kx$4AIFe?V&mqr8zp9wc7&gbbG!Yhl|jAHlg{e|04Q-w~Lq0W+sFDLrK$q zsi~el+7)Hr{UnU#H^Er%62yI7(Ga=i+O7|@X*@L5d00wX!~?LwVczjSNe+0y?Tx_% z40`5?#5irLyTLc8{aODJ{rNw&&d=76VaMY#lijb9#G$B^e~1ogKbM+2!idJ(%Ag4* zu8$l`OR)6+Q^1Ku(l?tx27km%QFU)5`&bE>^_3sGeK88zuD+6aO>NW-}R6+*_y^1N+VY+$gd+eIugKFefA~JV;1G+2+Hl zWPwo|&x};Vg%Cnq&(xPwyUP4kwJx&&y8ifmDLu(q}nu8jIcai#}HZi1m1kHw$mC?~Ic@(5~cmzyrvs z+mTlc`w3dl3GDQhC!>f=wz@rWD@8y1Hy4AY17G@RP)op#5Ax;xb5f8;u7l~fd&(NQ zI?v)~mw0DfY+Su(jN+WlGfG~pU12VZ0ljX)`QCM-(?#k>FMuM^7r!}?ZAS4n_edTPv(PCg{ z+S3(=O^-!Cs28Gfda{|+R8Mi7Oc^`U|IxGp)OoW%VHbQAd+n=&th*smt^Y|v#saO( z(sX(i6D7B7I_^kujzkAepasowVM5r+3T zuE#hf30!C)V!5fH0l!~4Jro6=BZUJR9Kb)au);9sssl#J4IJUzP*g%Ot1Dr3M%OauJqae*mQTzIEkBaF#Q;hl6#~x^S z(vQ}fWq4Zu_ot`wG2UF8SG^$q8ynC4cqB10RnqG|62<8ZGbvD$UwoRD<3Y^RKAqG} z{2#7HiH7&8#3k-HJuSM}v)QszyHW^bWR8g|@F2>Roj;{FB2Jad>oiD8mm(5$TBvc7 z@cbgFFEZYirxMT~&fB%0?}a!L>*1RF+f?cO!|w{uHKsK3r*Pq)blx!A3?T!4RfMBm z0%-pc^QJjB^Z`k9q}&X0T79bfE>jpcnvsjQeihPAqj1nx-)z4SQf&AEvagM2MK6K~P7 zo3

+Jx>k<(7+vDg_&T6_fbg^c&iI@7~JpQRxv!{5wPzUea|&l+q&5YsdVvL>1=x z9sCuMkmeaCS)0x0?Z>F-v~cI(Ns8mYLOCzljER=!qER&Sh8LQ%5$0uSx4d0{^`c%@ zgNGAchx@~!Lc-veaRTX2v3dBu9{FkI8Y)30bf8{k{>w@T2>L4GKDAC+Tsg7(gr}qt zBTZrDB7TvjwmDT@{}^EbWN8^YTj)fNHH=O^HhZdl=C7_Kz_4yg#t!H(p3#Xp9o@ho z@3#!UD(L-?5VKbW&Kjm+3=+fOv;Qu6Ozbbr$u;Mgcm0CwuUdhPyMoPwBV})H40DbJHFSR`i8s z@N07EMF!p0;XnR3Pg)l%x{w3GMS!7&LsS(!a%#by9ic51MZ1G}q;j%`FG&1Tp%1H( z1gud9Y7=-Pv&B)(d7Xhwf5*+UANzB?YNfi>?hpipv`J56k&bI8fF0ZO0P;XF9Ig$} z;Ro9+qldW82_*X?9m%g*>i&NFULpB$v~Y*cSsy7nJ2rbQDapF1-}0aDb60HG)!iyZ zzyDTQf41+Yj#J6Yi)2S&pA$s;)P9-7nI&QnGQ@vWkB!wwaz~&x2Nhvi ztR8y`E=Q|bQE}GvU(_^xbA{*;^rD17DP-Y3;}T;X&1lVdo7rB?QC+nh;4tN=r+OTtXXXB&XgqOxRXKK)K zZiAD2`@ut0M0L9r{UZi)HR#4_HFS@KV!W*|8Kt(=H8SEH&nYSPm^Xt;V6WjYMJ;bA$T0>f(pXxlAoWlAsWpq411x;bV|0qZPh5O~0NAR)OG6)0$ zIJ}Z^Y1k8^7wc2e2jyN0|NrFz@M7R_ML6PO^MPPIiF18lcbP-Oj#}h_``j5mFR!M% zbLU2qZcAywWmc%OD>zU!jm$K7YES;Rt+ ztAmX^d;_o7S%rWv?a-7N>*LDLvsDvi708 zC>*oHfyFzNr@maS2j=EtHXHUxfAMl|-jtQKkC$Y&>;MG`@iE&6;n(vMXSkvlsb7hJ z$<|iP`+K{Cj>OnI-ho*7c|u|E`O z-Vcr$YQAiEs#NMMyX{`i!6?8v@o75sy$-0_a``zdJvePZyVa?2vte}$eE&4I=fH!w za{sa#<0rNzsxStizwKfI?IOu&CJ#@cg3K-!e~G|2KaO7M&qNm$ov`PLu{k9Bmc>I0WyyM~~?%=wsl+K-BQ~FLcgj?$9zmgmR&9F6>PTN5BZ}D#t zUQ;%%ZDs;5?P1;qogwO8i(p+N-Jg&ii=EH>9bsL@-%f457ut)o4(x8Em~>L(QQH?eOUYn4f=Bk}!XQu{Qrz7X{1ViL zW}Q{M5;V@-B_j&Zn^70_5!Msn8#tMXMHXUqo_KRQpztROb?UQ%AqP{tLfq$LIQTZXviT!Wci9kl!bX zQWkp2P>aA7j1p`Y1VTC6+k-?yQqDE7%td^=zYt`l3(FH0f?YDcjUl!gQ?zTU4ne|~ z;-dg@fQTvJM-x+2$*09iW1?&T007kQ+!piSN+c;9R&zi>Ne;iS*)}@16}8yOQOP=KG`y+IX6TqU6+py*C9&!ak-TTN)hM=Ea#fjM&G~NFfV4c;HL~@S zr-3{vt5ItE7$eFp%cQrnB>SA5`Yd>NCt_}3qA%E&w}MA0o_-$29==2FU=lzn5IKy6 zOuBuc&g~`&oawuLQ&YWqfTYVlFfa9OQ(V+752A0(nxw_5Ih6c+={JJ0w)mJ>>xphB zAoAmm^#<~)7! z29kA&u^|Yx0B7$w&Xk0&QEILE)ov2nraop{UYDersFgxy&f?ty1|e+H^pho6g}#`~ zriJz!%+W?!;zTD8r6=it|MENC_;iX$5nyu|=xzH;q(HcV+AnL?CDOWg=d9Agx+A@f>fB5rq``)=k9C#wdOPCOv*rGDgO3hfRk4@x9EM8FvULT9y#Do5duEsn=En8#^Y+Zu@VRFLNRR-D%Lv#?ZqiAT8O*vm65 z&Zk&s)P7R=#z%~N=DTwh0tZL7R9t9?^yf;H8U;Z!3!rpb5Q%)K%Bpv4#;S&PPBS&@ z34OG@|MU>jvM3BOm#3F4^h30?!=ej@;smOVOIWF666PjAl^T zOvw_(`N>~OTHd$=eDJ%L+`(9hdfeoCvPb;VB|5Pst_KHKcmIeAYo#K}Nk6J}C@3?j zRb^;Zj@m?*4%=dByFN;tqv{r0-A&4TpE6LVj9(6;fs&MdkgcM2^G%VsB}tUXV#t3$ z1oWf-eW;{RvMCw{iw5p&sOesZJ$=5`4lHrSfljBBl4La-(>pBo>^Hqs&|T9>LbzpKxZSH1tI5djlp(jlIhVCN$&cVDFEIQ74|!q6X9A%hhT4;AfJR(Y(%b2JV0HQ_SFRsIM#Lysm!1q=JYw18s;>@|A zJ^_1HBE;4XPoVOaciDihkLn`9&#$$(vZCIpE0gk=EUfS)6htb9IRS8j)p&x(f-E7+G!6)5+CsO~p?wz( z&0CT_kKW>(GhQNxW2ae(lvyx`?68LhnDV1my8OQ~Q<3b2td?4r7@CB(r;kB8kIl;? zBTF3>8~9yd75oZ@Y*@e_)OO|+4;=@hMHVU{k}K_RJC3kWQ^O&@qkl{3K67tB+6xyI zD+1BD_U=2lDU<7T`T@y^P%U2;9?kS;99kC#*Kj4(*#7`esizDYu0j^n2072FTX39xuXk z%Uk{5tUp(ix)jzIgQ$zRVBtjF_^xfD1rxg-XFq@%g!?&5~alea6HYezE#4A4&C9b}`vJ*>t2(8s6UONZ3<*Rj) z5JQXlLC@sV$=cdRs~ca`Cbjy0x|yxj_ZQ8?jrox&#_h3{8*%0CV(hR@C&mCZ?w|^g z3S0VWo)q5^Sks9@DQG$`pkW**6Aw#g=zGjlEOVnC z8hyAX_8*zgs)5ElFcHvKA61{#{VHL|jpk33a_YhQFc_ZP->bQk&?paN*R4PQf4{>K z7g|MQa= zIPdYC+6!yyD|X}~O}qFd6+D@)iHU#Wc@KxFWKgLv4U0zC6 z(R_8{-1|XiGd+y(;P<1~_a}IGG!{taV1Mx8s^xM;2;k~I0#wy(`#n3(XR51C)pH4( z{xv|SL{;2(4P-~tw)j~*BECfbfd4Fl_-xUkaXrT2hY*Ln^FieCBzG>0}KhFOM#FuY-E_b$vY@CBKtmH;4oeep}-H)q^>2N#`_`ON0Mo zhgTJ}m%Zx427@B>!N3wdP`~-p#h4iatZ+d(6>N1VdrnAjYpA!tVi8nrBz9)mLC>N=0II?T-R^+4ZWsk%x4s|Lp0_uUA6`CHn zIAvFVaXHVkPw)O06c>XbgIf#WnismdJ@IOzxlP6!IQIdo7(bCubxD{%&PE(??*8>U zd)K7zREq}umt7@BRa5>Ma2YcVZOGGNX~F_Yeela9RW&gi#Fz$5Bix)+Y?BhH{;JraueA0=U6C-( zqJ5z1+YB)W>8+207TGeKOLZgwEnOa{-Sq9q*B7{Laqve3<;2YT%P!C`=g8U3$(oBB zZc)zDwRjloYJhQG)mdXJ5zN*lxI%mNOse5@rX9jPhI0WLhx~JMt5OGTf&i|c^e@(d zO1qsQhoOSyQ4Ee+>+WMDP5;k!egvOfs?k|fSm5@kLXu@mDUpcBNr@`{rU(lojK?!w zo)1<$PrW+HeoBcPR^zzC?e#L@6EC5|Cb;i-8siGbxeqzMtLHsR_3S6nt5&@W!d4o)GmMWG)UxmJmlTn4BMCX$g`F9e zMG5#(-V%l1A->7`0nIDP+d?fj7WI+?GzxG0AcuPWlsQafPY)`@0Tbr>mxrwmd^de$ zIKx=pFD8japP2Ss*^?28PVP|UmK$5TCCF>ADdU_pYt$8x{mz54vE`TK^LX`r{a<$R z$?rDxug8{$P=Yq`ZISp)?MvQu61r~?irk(G#;tsU^S;S9=d=)xFTHdkWP@V6^JU><(M^$}b`TB0v3S zS*ThYobCx4{(P3UO>{?a4v-is&P4^SwA;wkH&vr@@SSoCD9Qc>U4kf67I!hxECu?fr44Tu{lvLIH5P$O!F$*62>s0&=hX zQS(l@I{bgVF?S1`0eQs)fohv3vj=L9>B!gq>bj@O8^Nh%)@f(fGz1Ro+I)sH60=4C zAf1=%?O5t)0K%*23YpDW5k+EXf7^$PXkqx2%aT$%^ajJ!7-_bbS1;rN)C0PtF`b&~ z1aP+aV)M!i{5tZ!{uU_L6Sa0WTCAzx_rNNN+kH?!;zkQd`navkT8Vb~WS#BGSB4ia zCU`wGSc=P9TZF?v#A*^8Yu{h>A>1(a)Z)$Tqw}<{ZKYn$3;00?4R8NKXgpxPgt%gV(6|XFzK!)`BsV=XDlTqxJxB-yg7(l25q} zMq#o|-g<8^h5x$B%Ii;GBdE!PUdmJ=mwV&9aLKip3%7x8kMqeL?yhFbTfx>jLnt<= zx)J`keDD46MJbxn|3G=nE0=f_(Mw(Cj_SzE_#FF}xRU=N!9PXUZq;{$O5PS%&8W=x zDMFYJZ(15J58w2dFPYB`tX>wtbesp)!Z|r}FMnb#1*aUg5ZLtR%-JR;m=13|9&)wT z1XcRQbuDfsQRmiYVdV7A(?fT`c^zSyj7(9`{5&1NR>WE)Ubx~j3g?1X;HCqf$l4`2 z@L=ES1b==bJ+lszrHGBA~nt96b1$V@W{z*D8*fbj~cp_k|aIF7_FR_xv+)>%w$# z@I~aGnsHFZRA+Z@sK}kQO>#>~i8y5WDzJh(bwL9V2!SyS0gkT&{m=!Aa}yTxah3JQ zM^j1o@C|B-DKU#y3WK;opdsGcWCjPT?!?qCAFkI0on)58B+IWJO#%YVfe@E^y8D(V zUAP<4M4Kr34SF0$auh>Z$1G9{)p{&HBcOaJgNPkWT=v5zijzB$g+Jo*y%sG>lpQ@H zr4}sg-8?m5)X%!voVk7BW4<`t-7m*e^{go?s=+B-^-NjdkX*hEpUfdL%)T5rmQkF^ zoU3BpCS{LXlI1>lA#T*dEKG1$#4Ytdn^U`+wTUDPzu*4O8zWQ0l>u;jA*>Nv?w=#_ zF~iaMS5z{B>}vG8!biuIAo2dEoAl~13!cMGv^|(`_pMHir5+XD%Tr~~?5?s(J=^5omf_u!ps$EcxV=5>5}Yyc;&HXitDUVj4anvqzPXyZK+b~Tb$?awK3E0o zIq{ATS@!RxG{yB^Bd<>2%1rd~Pjz`ZL5Kzy%>30X_!NbO^wG%@cWyW0t$V4WHMK3P zT&;uoR$qZy`P^EMYA`c&>6%_(cgs~|B6_rIoMZu&OYUkYL_r0e)Z(8rEC8?h{Z=er zB*6&UJ5eH2B?w3s6KRK$+7Vq#o-d`tejS2s7B0T+$& zqOPHh`P_?=namqGKU7T0d;#INwE)Mz%#w+F{31uKutFWtb~}6!sBYd(WYbhbR-W+w z2KZx&ak&4!O&y?&oMti~FJNUrISDCY;}I;So?v%>|HF3=^$&;GF~+vWI`e`opBdyK z2Ww8V?(q>;g9{PIy=XtoDt#Ig5GEQ}1SE!?QIY3?1lNVCj2C+E$klI=acceS`#AOx z+(J>e7e)OP%tgO^*hIEC9Hu=s){I~8d3XpivD?N8H#0@!Ro(|M!Wi|g_MKrvC&R+W z|4bwg0LYZ|@~p8tQSM_)mr*_x%w;$y>y{APj!i5W>#>y-^=G!M2iVDapQ{q@^df+n z&Q-k@$|hNr;>3AR&c0HnP!~}7z&O*=w5=x!Vehu~MeW3gO8E%qcu;!cX+J_ykDaaW+W|!>mKF(_B@<;@KqBoYZ$^& z(43hCRAUUUaNJGz1o0ZV-8>mlG{<-%&F^_d4_MLIi1$&u>>V1EjtRB)5ztW+ zNGLdPWt2o1V0&b?1~_e7-oO9F!kLZRxMUmRm5-_#ZFU?ZwZ121kRU;Gx>kGV(yqC8 z_2s4T*pAp+bu)H(h+chxSRO^HCQ`T`DzbgWidZwc<64~gtQ1M%9Rz@FvUYNXNqyo-9&N(oOXCJD>=}@x|dPeZc)IxoVvn272+{lC$xU zj!-tN(O&YXrZA1QnJziNUTf$XYNQIsPZynsM_)?b2;bLwk@uCiJaeOQXE;PUG>+LP zs19El28KG}jk!a@RdBGrBmcqgS3|EK6SbIX1ck}{ubS6G#S$+8JuTxdl%WV6h=rhR z)*o8u!QqA#jq5ebSr44ebDT$?)S$kn&y)kh0Y&^H2$fR}4M7@~3H`e3{e0CX9h8wLkI~{if&s=*3 zXH8aOBfzkGADoXtRh$cvAm)b{)j@gVX?2t<*}gOd%!^afipb#PPr;ZqVMbS@*C-S$ zh!KY+5=z4IFVcU2q!{3rqTzki51uM2Vt{FPwD25lomYdU6as$r7mTRpv-hs*nC!U{6pc`dX$JTitT1JVCS);`NRElC z+>2|lxF4Zewb|*0cjTyO;LJ zq8nt>=2-O;iOu`EIu5J;H$l>lBmz3slF5qWH&%E&OE<@e0{%;TR3fWAy3{jMo?_ofe9}A|9telY{`bp2Pblc#pPD4d#91S~oiYVfvaYsjr+tVdu^S(BPM- z6YjG}l6kGR=uczC@7!Ut=J{ehFn;oj7N95wVicdR($Kmx@l=z5f|V(A`_<_O^`3=5B=L*W^9kU$*k- zup9ZOK`v*oNr!bvz#R8TE^CR!@?$nGoZ<`gLJ)1))3RdTFZ(H_{KzT!itFl#37$=P zge_%|wy!fZBXl0en=Sg_PwkJhv2vSnx%QbiK-hG&@U=k$?*_zXD*Y zfp(_TVge{HVzc48>_klvQ;iiw^$urkqA!ECs<3A7tjpouo^G6X@WkpgxJ0capf?_0 zF!$U<_qw{c+InjobxiK5xScuQ((EY`)GgPiKm8&ycfHuC0}hc93}HiOd51o^5iUg- z<~DdW-bTU+2y7W8BXU(WJNWsWB;cgJU@%xHzJ}74zVRO=dC;Z_2D20rT$bwj;W^Ev%h`ynYGbZIuZZUW#IlNe1PFkJc zUa@wkY_sva;%+A9dfoEhI4tX&|2kbu(a7DfQR@-R=4-#xX)wxY|BzQtDPY!{{zS61 zplWu>sO$aOlDPi2%|kEdEZur3llZ(Jtq4-TMkyJlU|)ii-xi0KeuJ(6WkjD?2P6IM z=)Ge^L~f=FS32Aa(W3pI)$9U$l1eU{-?2n^pSD zY~-f?jZf}L>nu&=^b?Hk9^{IKajmn?LFzM;a`P7%8eGxEM30905?PH5mqphV zhZynjRD~a=eyVqF_zsNePW}}4W$cIc5+8aX7W#Mz@6z-KEuSx!b7$>Np6t2IAyIg@ z;e&W%BR*(z$&?&x<`w;$%>S5z-$V;P4qV(NYVC! z^u14TQSaAG5U!$yz~(&3`CfX?8Exe?mH&Q&4OKx`qzDxj_t@$3c|ZvJW|Pj|x2X2P zEDqj(n6*8Xt_K$3b}W6`0hv2O*FJ7U|E`D=3W?#j9Jy7?jwcKf;n@+}!M>RWv2bsP z?#!W9=|&xw7<+~0Yx3q8#nct0Jsv^^8-*~UO?n;0n)W=}3_E=QwVAe3)tho_WrA&% zyTgqsPMm4-O2U!c1KE&n4)>;>RRqDzJqb%_iThff%P!X@r1CYv-i2S*wb=P%oPTV; z4|aeWjV{`q+>=(DN`MHFC=`YMz$>YAId{H4u&+X4YdTrvp_>c#SY^#0a*hQ!n3+;0 zcxe76TjI@8V+PNU-3?0=WRGLF1eqY(9!vUFkg94crz(PG4Cv6u`%m|i`Q;uSKHR9? z`Z|yGv}x+t&%@~M{hYtR_;owY+5Kfq?v?;6K-9nXO3txtc1j1+f#5C95AiX@*Jj3j zl*uH+X;t+VuN1md^l{fGoCig1oDCQGEH7|JSe&yUsur&RewqTjaobX?2R3DfSI^JkT{W+nXs~ab3{k0(7m5%bS5)06E^a7!uA~ z`9BYAYWc&Nk<^^wj`8w&xnwXEFQxq$fh0_4?aE_j$^zh(CYUII`9GU6nKJFy?JP1O z0&LPPkRdbD0KWtiqHk+knqP%PV?k)H_8PnDHyFTwT@gQ{DLXG$8fH`MC^;hdy-fts zN|@O79b&Lj%J`QBZ`SCfF zyZ|4je%7=yj5`4hN~Bs6lnlJNM>>&dem5r~S#xemobBckBo<`Uu~?aso~yJG;RxJl zsh?H}Pz0LO$PDNUGzx(|WCbvc;WYW-kA8qO{IjK6G_aEd&rcV>x#jXD2@0w(HzE|` zEvt{V;nZQN5>zD=m8g=eYLEue78poV7;#%E8$*@vw%;3{8PsQ*^>lnpmOX`qKs;Wf zDOVe~XF|WV>l<{KTg@g9Y9nWOlMX1b{sZTG+BK+^ zkB_(cZ7R~E2O7k?UXG>wC^d}l%$~n%vPrAIcj2s-=v?L(t>DBA9J&&P6N``#ct+~D zzlw?dl+Tpan(9F9`;PpU@6r1LnQfNp{%Sbali^W+L%BHFc0^n_9d1{Q{9{Ds;yX_d ze@6CmyzK2keJV_D&@%NHTCBIGOW`ir2={!Wx|u0O2n9=Co8Q_$ts7%5)VuPOPvrDO z=hGI43Djwx-4qT#f~llCf$;i&^N9fk_0S;)Rvz>^B@+QnA9o0Ut^E}Cz7dfSZDm%s zf_y88j1j~c%MmW$>>4I;3o0SNtZXbRnj7VtHy0&k4|Zf<90mg3!Hf@}9)T#zHT&YR zPuwwvH+?C6-&|GRFR?_m?xaZpCXdIcIzIQ{=E2|eeIs|I21d40$WT{6lAfZu{d1zX zVuiptIUw1WLJYb+FH6y75?*vzY#rNHE9P1$Orb^1hv>@{Di7^`m~<-mz_#L$H2scc zbyoI7@|61NRcpJv&%-9q*jCok=wa^TK~U1pRW$;sj@#8o|5;a?n^D%jwD2mawY}Q!k3=W-5(LIWjkvFvdQ@8gB-+6rbS@&px-T5MBw!8OX)w3Jv&aE-Q$mhUJ zbB}CtzLc9k6G^l)wZ{(;BW8%1RUxm>Ds0>pEsdyTkZ1`%WU@%5RQfh)J>x zjq{Ky8QI zH>~Ko$A=ZehW~90^A&xhnFaG->KbK5@Zv5IXnR;z@8d-u*SPTCi{jp@EaH8H>%-BU z1D)EZz{{t!W-4A!gEvfcIbpA9t7voqJ!^br-dI$o7`f4myAlL(PXDL{YM*JTEI|jQ zy7p)ojGCGiO!-3*tVlC}ZbMOli{UA(t-)xdN&Q;+(o zXl0e#J3w5@V)X8~acuL{zfr^Mrl`CZ4ew3Q`VfEPr@EvqcKk2b|Lb?enFCpq6 zA#dWE6l@JF`FzOw47E`)e>joGol*iEq9J8LJrVh$96+xuy9t^$sy{VBRo5MHLU~5Sd<uXvp~JFs%w$%|TZbmV38vW5S%XldIT$eJlM^7n(6KnhwlN}V6KGa6#|9mqpuO%UM5j%1OP8hd4Shc*5Rs<8P=sE$)+K{buYesZ7 z_?vQS`PduID-=FQIOx1O^Gkn!*BaAN&?mPfXd-$j0QUuA=fQU5cY=UUt}0qQyB}Tv z$*inXQ2fd4C0CO$OfXUd;|o~iUH)J@$h(l`mYWMd=?#esK$akJD910r zZ`kC!)D0zKbo&fGSFWj*l|3BhG3I1bp1s3Ow$73rG_ppLozcWd*Pvdu-Nsm>6@KBY zUi9?EuIbd0Nl2Y`@5@8RQB7*8&Yq!s#V9_zC~=bT{Q(n<&zAQP)IFZ?ARLVSTeVh# zCg_>Tkz1Lt{^O4fOAc~28AkP-1&iCe(`W=g4HU2JB=J||jtVxmhye~seBzsloP|8g zm#;1K>|3}8`bmr;(2CJ*4@t)s3Bvw9jn4JK3Gt#LDeJJs*6z?xmzr!lZsfEI`tHTN z15c-lVNBggpE$G&ee+S5oVy0{M#W?jLRyr}E7lms3i|l{Ox}q;+761a`dZOkOsn z^ak-(k+^p+O`$#A9S!IMPb}U|IZZIG9?mmYI8l6FLxrVI{n)Z}S|6`gd1U;Z?a&Pa z=^{(4*lodjud-9m*nf$doIes*Z8O;n(teRepP>*91)PNdp`AhqJxj9JOx3VL5UVLKZ5; zv1K04@^RqOsNygx#eSycCIIMR6N3q*2u!&yILom0V`(_~d>|<4;CzW_WrE}4A8I5y zh{B6#*(O}R@~VZ02_N7YuH{wfXm$+F0}vrgnv<8ARF}|iGubYXv9G07O5+f!Pm{IJ zT5|lK%MA#SHP37ye|AWw!_zMk4F?dYlM7Z6b|BkoaeIrHW7v;~I>Yv4o90^^_Y zi=5O?KsgN#((H!kJy(u2kT51XFci$nryM)FUj&=CG+gn_3!TMyI^%uwJh>GYj;G8U7e>E~7Z_5$|X7qu)|i z%q7{EgI*SG3MD{RNlj0E$K`rhGtmF@Xr7xBufpuXt^$(_bQ8$?M4#pnHKq7CYYDRdYMGaUykPT!%Fk_idS6NnOH$AHJZsVQDq z(zG04{mq+q(GkVdigV*5uorsm-Wrl=8*>#&WJC5-A+XYDBZX6be`Q)+vBZ>Doghjn zkE~J;4tRZ!+jXm^|Ic{(dy8VeW<7Uk@D$O;_xHB&Q^x0EJ#>Km@5m|Ys0NJ;bwdpA z^)BJ`cQb-d4m;!Yxe^@)+A<3 z)?c%3@9Cca+{2O=oJ|Pp`+O-376ncP1K)6Pu{b(eW+QigboNye4N-O4m3ZUylP-#& zwXWnw$&}P1upZW;;x;@TsxT5-}EY)BA|$}p_kmiK6;FgxX4YnRE0*oqjjHk;xVM;;LPz{LHIdpq51Zc+8816EAZR6kh5x#Nrjw^$FtyKdSbp6|(}{5@A!P<{TK z5h>gK;g29Kxn7x-DlR=SHE(nmS&1QlN^N(la1$-HDQ)v+Bu3RC$ci@Icm!YGBflJ| zNUhm$gIfAJQV6W5Ix1pT@?sy*AU1HfT;)wwqNv%+?#t%Ht~v<2=86mel}?7UG}{eM z8j%7L1(9JROBRW)8%yVpmt|ft@nf!JRCTeKM}X4HscuGqsXmPGD=kha07_myUo)>O zrK-;CY=aR^Pcm;eL`)kxNKLG1#M;lRUiwo3W~nuRn-&70USeBFe-<$U;kCb$GV5{t zuR&N96En9DT0Pdvmc{Z8Je85m)RxVa8%saxx*+zCVWSI;xN< z!qTnIzUEo9j`sZNm?T=q^Aw?~g8T%Tn9bh%cIiRq`lPkG<9q9ZG%B!?U+lPud~u2L zqqh2S>DL?6=6S99)WJAgJ>K=|U6#k1w->G`ei&hJlVXP^E->X(elskIsq>M!`Ar3RRSxh;Q(u$)4sDjVX( zQBv@vl0%8h9^<=K1aupgGg=z;wjE-VR>laH#$D5k{?>``Cf@w`4M|pyWBn@%aP#nM zl}N7}-vNg$ozc%SaTE66aYY<2i#9yo(NL&baqoyHV)J>5PPIZj+5=)A)Mo4gVdTC*dVX$8YX&QD%ZR`zL!DtPf!&n=X=&f;2K1dS`=c|Qx`ngtg?NDK6?FM zGsdo{trV`*0!)5N5#-B?C@P zP9`-3fiSKpb3|db008q}lnU&yi(F9IXW8OCTEP=f7=)!K3B@797|sDQ5JEZnD}ky^ z5iyoAc3i$T^DQZf?wtrNI!@1#SFX`?N3!=gNN+zIGKr5rB}ps{6&-C`DYBVIAg`h0 z>;M1CFI~o5+YDbNoCu0JYG4=}3*2zJ*#H}-xZE{7nE|>{ zChPRw;}680@iwwsllWLA=czQu?Zg|$(iK!Yss;)&k(D+GlyCq`I6TcM$d$v*#inII z{4QHyjtDe9oVX1~;KQZUWPbXn0000XMpbtTG>ac6GjF)b0hU7&+X(JCqHcloKrh5( z@{LyWa^`Urp5jreSyCp9Tg@9iE6upvF&|4Ge-Y_C3giBW65!4|`ADm3Xz;5IkYe%` z&_1^F53)H2fP5}WY&ZMIsfW_cjTTtQ03nYhHG@now7_P9`2p7Zw9UsH##e2TfQ_6; z%yUfXg7&EZKt&8MC!iy6`_4uJ4FX{@KYtk~z-53)+RK<$=shD57jx7aJ`$_Z`W z^in}LCYVM%r0LQluU0ad*YS%`Fbg>)-3T#{X(Roi?s##OC)t;OspWwbSCkwLOjfji zTafRvC=)|d7nLS(P8Y@1{gAcsE4EkqNdj{{>rB($M|PBbI9@i#FT4vfxHs9cC=WL# zYVwppUsG72%c;P#v>ct9xdzHP!^CcQ0T;jd!l#@87`>BXip2JOfruu~+rLhN(SHgq z(ZDx&kp8A$GhRIa*Eb%1o2~3c3{`bh8&VT1V3%j|ERC@98>ygXfO!0p5s91| z?I%(%pq;vy#@0n-1{+!EUeRbrQ}19yqUuMTW&O+lF&A>Rt$Tn&h+Cj`DI^6Oa4%?$ z7Td3h2+H_4~8p)D^`d{(H2Ox}2@NLmXl60kjM}a(&r+50EYBn}zQ&|S)tptA= zC5A}%z{=^mfei}?z<>z`_Cj8!rtU^J7_1nCQ4l-lE;~Oc#=t^7_}<4nvrSmcFpLRj zM)t~hgr*277kFzkGpAx`G@t|+KKEnOm2-O2HTHV*g7%kdgPeNz)t%Iin6slf+0u&) zt}A1>7UI>s0qO>3R(#ovNvT)}b2^S-*w4^LV)@>04;2d-_EKAP)2ZJik{nk@ojI;a z%YkcD-J=@0_a$hftlxf`YM^F-b2ZxNx_Qp(luok31&?-JWEyuMguWrt`L0RoeB!db zZ2MK6Lh!vXHRl!CQwk={kaq`S37QJr;Pa068^KM6xd{1XkRta4 z8plNT7V%L^{NbT3yJm%qFp1pz5}!Toep->x1Rz&z%=_dQH!_uV>=xg}Zd|`c2;wFF znEN0KQ&SI8=J@@CwL|MT*h(or@o{pBH3f$e&snj*VmxQ%!}KTOEP(FXG@5CVBFmmlvIrap!SmTm@@hxK!c z_0HwEaxH0JT^KrEJHW&OHy4p^iVe1dco^8H!S|T6Q&a&{-XDr!mZ(h+JSs1dRXD$s zjhdF6QHgrasiS7w`hk@=+>(ufNjGOsM7G>t93DNuUn9|fx=+)r54@Qq3Eu|q|DB!B z1e@J*F}vFMNIO93I+IM#Pq?=VNgD7K(RugR$!)pU?UjytH+f-oYU}|X1gw_(oEbNE zpJzwt-IzhSn?w59WCl$%H#G@6vnI9FhEW4Xdsan$9S25q*q0a-wxpjr&~67g&_g4} zSW58ra>>@$=d1MPXY`b-^uDPOv9>BALuie<=|4jnV}g2ii)MtC0lCHR{&)x>IaYIbiN=g_n}b9>Z{L?2T|6-s!0OlD;_D!9lc8%8!aHgRaM|Sq@I~v z3aTSmEV1)bhMU0dwVaI?ni;GWTiM)P2l^GD?D^~fkfu{p177`6It z_LF|fnenu7U0cHS!(ptrY4hGSsO_@^TD{NIX%*5E#Wgc2%< zO3=zOeDhg|6(^k(CP;4Gs=t(>G_3{0KEGXw3vOF0bH8H=qFS_;!OIG8h@xZT4{19DbP2K`b7DQBc=ggp2KH^PmE{E2)-Q zMt`_tS2y<5wE_B1OrKJ?g6XE^oBc)a;|!janZB%~v|&rbJP{LKnC;~kpvGRc8QCN= z(}=?|ZSgqCy#~Dga>KhSNZrJ)-6@`3 z$`*t9X}w)x0QidWN5rlxI=zhk1`wg^4hW=U2dA&?zGRD$+gQ?C9NT@}*DXS(tPpqC z{Dyo<{<<#Bu(b6E9^#F*`7KO)s!0^s|2g?bJ1?PBvoU`QTnK=`eo;_+Cc&k%z1}J2 zduV%Wf^_3i%2aZVwn-LyZA;rdpi>5xR@5FbhMQ)#!#yTp1v6e}6mzZq=VOeJcaR#! zlng-p!iTe`rw26xeIs*Jd&U0< zG4)$O5@KUx=SNE|g)^wN#4RBk=jT;y+s3;tszTrM>V_S{;}w)!zA^<+=%^8rSFqQF zT-a5Rac9D^B1(JxE+38j+mXo5qV_V>LTW$_z}cY}npq@7G*bDtlX#N#p;}-JN%u(# zRAp&jXYDr6Bf_TpY?vz4HyDKYOH8Cw$CTTEz1Fg2veiU}!rFYXNi%?aqQI_pd{KT4 zdhz`r;hw@%d9LZ5)edy!H!B+jN(fqhex+3>e!e7`HqSU#`{DdJyo(B3_Fp1IMgO+& z^oy*7Ss$)*f!{Us?v;=VzwH!62JFhAZx1GdVOR(fcQct$W zP!p9)Aj2^%RXUIsC3939B5uYO>fneKj0(g?xXNwc-Bma!veDNMHM%^hw+Eu!y1{|G zS+Riv5IjE!In{jS!rnsj?6Rnqj+^b8lE<@(JWy5?Ha3fMY<^&adNdB)QzZwxE{Cynv9fsH5{JX~|wVFBj4ey>X zAAIsHvs#ORQ-Px!_>FG{MXfBA>y&@yag0LmCO(U&I+33Y)<9TmqK6b0^j4T$De{j< z05X(qQ3t~4`WUd@tg%If=88xF2$11gwC{)`y0y$s*cG2Oc_R|CE6?5^(ieGpAz0&bjo8)nIee;7EqZwCtoDv@F$Vn%A z^^HySHP(Gi%})p`!k$E8o@QS9#)DaxPn90p!Gs(j7mF1xePwcdE~)8iAsvqd6?iOW z5!z+Y_wzqV@qkxFe$*rB3z}m`BI0P)EgOcl+KS3*OmW$u(*?$&W1vdxbT)tkXk^Y> z&?iPTu9_MHm!nT$@lme{s!)tk8$H}Z1=r>`u)dYYJ^<6FSFe5gZl=Cl&D71LC6$(dLOIN9;ozV}=Xn6>xPN<%Z92mq= zMGxV6zOdKzZB;jv8c{{tm`BOuGUizsI=^?a&>m@jTB^1|>npSc_9Jr-G_Y(+KO^NToXF6;u?G#acve4GHCKr~mpN#DFDDBF_*mlN z5bGxvHWV4+ehg*?=xTXi&6qRXI>UQg)Wj0;fjgBK)l=2fTWsQ*^MTw{eOv8>h4<7Dtbp8aO55!_uki8ci=^SWH^&7%mPa{XKKFsv zS!8v@D5+RRoec2Zs_^q|u|$c&q?IG6WrfA`O9g;E26e(`wMdE6H}Mv7Pos5&x}E17 zjDEvZWe6%r#EAVgB1IC|XfQUidsIfJXIO-vC(kE7!x5OY+fH5(F^_lZ8U{=1b5&|IpW z*UW&Tc8#0$Q>4O$Q`rvp#4QmeO!ORmiHqK@so)B23L>_dZqUcU837Vx8kU!mdD%l= zuXL+Jp!f#HD>raMX@-izJ8_o0us)*wjQ*Jgl3fR4ZL$ya`#JTz-;a5KDtlgHx=XcV&j>iEp!mgEfUOxeMbZE9womC7ZP}WUYb501tc)qJtSGZCyg5Cag6)Z$K z>}$^o6+D`P-GYwa`wqsdxXgSp8y5G>a|ntA*^E=HvGlXuhIupU@K@O8=izpw_!vQf z;-1`QbfJ$|Z%!-H-4s+%U?YCV#>VcfmZ$xChg*?mIhFt1AR@Q#R_NWhJVS9w(NI@~ zjmZcwBR&4OtJ&XchcU>?1j62U>!waAef2eRM*Y zDJo9Z5Lzby^Ud+Qj+(WTvFxrDp(wf8`8^OGXPm>AEm5kV6#G^vH#MD!KCg`un}|;h zmm?~CC&7TJ+H%^Y$a{4mdxmx@koVK~!F$z*FiKG!<|48fu8}5yEYV4oh6<+&+v!}S zQTI;p;g?OWp+^z27sRp}?S%0}+_nmX9;G~q3>%_q(I_(Evn#BVf8M~FR9%gJxJF!+ zC~-l=wI6-N&l*2`vQl0IL;1?EUse9+;O1}q`)Czcc9k936l{!SY!Z!mdK{XFK|J0> zY>q&Ph~|+?PY_jZjhN@%r~2Q#+!pcxjG{^l6V%fIr0)CdraxxF*)z9bik8lRC^vF& zIt7+78G+|P7El{CjoQARWA_1Q38AEF;7Bd9KZe&>TuXo~>A9sX<$J3%I9$~*=_~M$ z6RVP1RilML^8AicGYr|5jI!j8uB6tC%&@}dOq~U>7szspZOc)j%+?sjLXz>k{>l4Gqh})jUHLybMg6vx z8WEydd510=yDzfzPaStrD4=Yv@r88^|H?{sNlNvs3TyX9VRqV8n59A=qsdlezc~@* z#T=+WBNiFyKsXAXDJc}I3V+i#u3}YTnXO>mb>JrIYQ|)`Av@YX zVzDY&;yiQvJm1lo?;w0K$RIqM7&n0Eb;HUwqO0hiR+HQ={T^DYwn}`a)QN289*4ry zHE2;jjSi;B>=`8&u>+Brv;2QW#)$kj+>&H`(zChnZ z3f`MOl8tJ-t}*<9>HU2f@z%s{H6l^ee0vBoT5p+$h_1S{a-za=;6n4L&q#cnAosxP zQDA3V(XB(xh;c%DaBeSYzctT$?+lj7IGE~YLNNgd` zPS-yNfY~aYQ1i6c>6*7K1%K%~NxYoSTizE`?GlD~95Z18VF671Q8(G}eYa6Ln=por z*JnSw)SikLnKAL{e7#7fduUPj8KTfdWoP;_NCH1{zN9qBvRTAVKwx_ zYs9+QOlr0)*8P{(&LAOuK6HffCzl@X%6ljHj2S}l%5dowZxo;QHt25QGYlPX@oe!S z4KA9Ojx}H_#^E*L)X&YUIp-N}Ks2<&+gh7zun_&Gx%*-E;k)ZEs_~Oa{j-+xwhPUs zSf~3M#j93WvQ&Vn#lJ$pM3Sj@@hQZRjD=Y$QwzEGdfP-bw-#{w1oe8t*Od@6FR*X- zZ=7kMh}Fu)&UQ^6%_yQ4Lz-Msdx?2sD`0ji!o|`Q=om8$l}%HMK)sNnZFDBdJxHR$ zu(apv^;%Enou1bn&Oz-17lL9r++-5jtnf)Hd)2L;Na@g#_5>CfGzx{m9#i>Ib)t>E zl&@dPcx}&yaZ@;_q8y3{%T|I0mn^u(Z4h#$cG`4oJFUo~4VgGd9TBZl<*L$-VXb9|%1AXDbb z$enJf_6~@d*2G;@IKio=3}XQFig9%t@b)@8-&M>-_&ervhgheWyPXkW(Cr(l!Sf1m z=^Z8vdhvo`9t{PV4EeQ5gJKV=jmDeScPXM%wt5g!d)^=87mxieIg|GBk8K= zFe1}Zy{6*{nIK!mfB7UqS^N373l5U1b>C7B;b|2;6Q$oM>;xd`&(iB0 zDPKaTETPmWlQfyQAu}@n@2!JvcKEzJqEu_3qXzZEnSjPAn8w=laR0u!Ek;{}qyn7SqFdsh<5y*? zowY<1u!TKV^>6qqy*+ZpKs|UeW}~P*x2#r3|T!o8%#|}TsWBo zf##}C3@+)6NZ8^H@SJ4KEzeg4R{u|fQd%UqR8;0e)ApGjak$C`5eT2v@~>gt61bn#OjPA=Nu}75X~%vBua2uEyvS0sACShreg^RgL$*DqWr&Hcj}9OwdkUu zU(ka2%GN}esA3!syOC3wPzPr9lgGS%Q7Mi{+kP@RUQ2Wh>p zA!>H!)HNVFrl-BUuzXni{H^0;b&t83!|iM6B7jDvFiGZwf!G$SyFCF7-D?+j-#@i&9;Wta9@7?u4+SI4gyAZL_Ei{k#VcNroHj z95o7m1J<|U*Os1Tl>k{#YY>~A9Vs^P|4~-9o$M*T_DStcg6!<0eUCi_B_Q78A(@o6 z_TS;3TuRHYM0Lrg7`bfbg!6r(sQg4WNVvqawu?psF2D7(f@U3~R$8mXRY}#_G=&`0 zol{0qF2#SAAsEy!)%l|AM!g+9TDCoXY^|}yAIU{sDp448Aq#$0~Q>6lKFC z0CclbPSIx@eSpIsf_+QUC5;Hn%&E9>qAaw7x3rI0sZFG+-9nRnp=b4EqjRM2Wxg10 zi<9PQVhN5n3#z=)SSi9HWy2$1iuTTqheCb5Q=mW)!XLQZ!8rZ7RKLHDMEUvub`?(7 zwZwP1o}JykpY9G4n{(Y{u8bX|NF`Et+6h^a>gkI9$mn2w9FGFOzrieF@{U|2b7qW1 z&YGUJp_9_na8dz19gEbc$5x3BR##5No8Tor0kSk0WdeA#p627@J&pPo=Tio z^yBz%9uMt0nj=(ZAYsM+Iz6#d3d45$QWxCNEw63v{4bWb=`u;Py}}`OX=1}STqM`< zmJ4*q>Xh*jFgPV7IcT^qJXk6#c!ge+;)rSpYrL)!FAl!UgOl5RDe!Pd-WPZ%Whwv@ zEU5;3s`!EBZLlL6{DEcPxQl9jE)eyWOJ`djRYTV3haV-J$0qdaoReg!S6{UNsP1}p zbG&?MT=DLvMT?JYX6XJf`TZd0o$NZa%;0& z=27S&wR5nYfOJ-$$ek%`3+D(}8mB0uq`Qt#gA`N5NzsZBV1AYBZ(dTaDK)AMTcnX+ z^BjF32@rH(0;9v$3-cppm&tEc`hb@7olG9oqrj47HPfBokRaT#|Axj?j3XRU?&oj6 zmR_L4h6|GEW`-kL8F*}dg< zt+~htmrYOed~zD(C5PfR%Zcj%em5{?N)@zR*v0V(iH0E8M_kB-Sw9BQ&`~5LO63OB z+a6NZ%X41d?i{SZg1Fzg_q~;2yS+0}Grh$ND8myz-w!#pUHb~aUVSCYMqX@X4@tsY z6#}j~Bvnwx1^wF$U%qTT;{&ih?WQ7ex#qFMc8UTKk(!9`kIYDkJ~w)PoMv zn}EYEmY>7^^xf+xbOw-sn+AeqF&L-J$g`#J_sJMEuxJv-lSf1Ba2X4sQ43zS*W~OL z|F1qs_g#6AA+xAuE7=msTLX&F_vEQwuFDLiY2qEkkGc-+$D2x0v$u*JK`LkWk`+OQ z|DD)*y;v2Fh3J%IE_surJdHByh>P}|#uH04YWpHsx8$wRoQ4%UcM;Bfiq4tWeu!X+-ORWOflIE!S7(n!Rj_D+iA($&9;< zKXjT-Ri$sDgdAPL~1kwb?0PbD4ysI9}_-J3nbGIQj#le70IK{x1067`L2Pu(Ur zry*7zcIrYq&tE7b4|(USamsPly;rVGQ?beS3G@D7+55f4q#laaO5^u3a>f8@rFJd2 z=D=-+4olDoD6S^(G}I<;EPpb!6}|`$2Z|m(Zcw~AjZ2LSyFkxfNFGqhz8`6s?-lS? zBG7;*hsiP{7zbrRQMAvdX<5SHMCi&b_)MgQP-U&d@jfaZsSE-3ZDOY|&D`hh6?!Gj zjkLUdg@5QEmJCf+PFc}oN>{ATYmreX4p0<319)}Q>LVx{NV?8w$)#u{u^=f(!?@W3v7mVyJazRqaWvoo-{$1Nd-vw96;qr^7vx=N1CJ=`#NlWsFOqQADaWDZrL z^w|H4xuoIk$tD>+JSIghz(lO&8TkiDEmvvVoYi(; zxZqoW9q&+-rTscsYcna#{_N1cTV?3vH-SLg0KGrhTQ;>nn+jw3135Dz9fZCYDqRlQ z^Y^fMhMSc<%d4fsR0pw)TtyMR8SBt*F37c(+~9^s z-WC61NkN&J{6CWhw!h2nq=c-Y;%Ke`Y*SdSgCwiMKF|7vy#q1)ZC5X}7&=fSGvN^m zniCU5F*u=Mk4EoEgymgOmBB~498iLw8+cqA3iASRvuAhS946;?Yed*Qg?c-7Z8t3W z6vvQH_yw<+nh+i-w%zbFMo3eAgW@Y{F4(XGSKb&Gb}1ZBit?@Z1!(t);dsIU!(n>( z^P8^CemS$F>VEiZPSi|Hw z$oUC*XJQWbJ5ceI20b~F@zlgx8m@PQLzQbt+n8Zr&P;LJrKxMaPV)6W=JpBPYHEdI z2B0<~u_ykzce%-cexKcdj?C_mi1%;Exif2wJn_wBgz?%M=#j180K53aw6wEO18nL|;k;wECV*UBT(j*pRVsZBGaSq~+*AJ)TKSX|jBorD)-}S$vElnb|H_+6%IYjVkgyhOL+mBi90$7e=K_!ApGQ(1N5>~1cu zwR`_0{u#PoKzwflhomE6bfTYce5RZhr7_e+C<@^XJxeTdpRHG@jyE>PJIcv=C% z=RW^ylv@@L$y6AylRby62j&c(BcsM)34afEJeMFRVmo>m`8)*Kgp=4v(Iu>x!)P(p@lAVc|8p_qpK$ z{#`a$lBoQA`=WOm&jH!VWNbW{@#*o$_mcBh`)51Sq^3*X-)^2(n}xc!!9LH;1vY1; zqH3*4|0xXf3y6p>;nAx9co;jCe?Z9C(&EOGs)JUWNVxT-*Y<=WzJtGDD@ro9g=A?!T#msK+2Ry!@P|*))?T}ix zmA+TN`2mTka`8$IfwDwA7piv2E_IN6a9RI3eF2QO98|+i&DW@w0rdTR9491C^7H(i zxXS;L5aAeWVY_Hxo&(k|EjxVVlZ{NQuQ%Q^G1mD0*I51msVL($m2 z?qs@V_;SaMk#DU9R&m6k^!Df|%gZ)AhR*1yly5P9unQkr?9sO~+Q9pTs@wE$4?nAKqB9t#>ElNYF=nijpW}_ z4p7-KkZPhPKXZQLE$3sfw;KOp3{Q8{^9dc7_KVjf&K0Ug>BI-ZXFd7-v`J-{ zhO5#9m7yja*DD)s&sLTlqK5(C<#h*AzK8b#?$aC{UR-r5z2S@akl)^k9BWa6X!jYP zNpd?S5V&3b%R$w>vXY%W{a2d2m1bsoGhb3=5sg2dZOixv zhc{{m%`lG5Q)erttT+T;Td>3|2;1baiu6kP5%^&;Be(iVcaPC6mM5#}mRp>2NmRzG zN2w;ngN_vsB=>M09$b^oQWU6ctQE{Op@tCeB6n#n&Y_8|@3&je;g|8e+=kG)l;0m# z`r<|hys6sOw^mt(G<)BAFdsIZt>-1_D^mbFixVtIjQ$CeYBG*yQNY*?2M5q-C|wd6@-mQOiYuGzT86>FLmvRh`vhXdS{77A(m8%q ziM7yKs~biJ{&-4!6!xSy9<6-h{eYYKS^Re+M{;<@4w%? z!T0X-K_`60?s#XKTV~6oTax2)g*`o6d= z9wB#zYP2{W^1oNpzkMSC5b?)$-@U2Q#*Qei-L6d)x-&bLCJllBuK|1DE8)?d2(m4t z0+SuMH-M!z-s9+dDXT9olbRZ%TO4}CU<)_Aa$1!`G{^sHCRTCBkq5OGwrsd7iE$0? zHN30$oS{1E0N`+?`JyaE4f0n8cuF!y4vQpr)TNKq*koYY?N|S18s&gd+X*>WbO5d;@8mg|-LH*38^PXi@tW~Jm~JT!pk3oGPlNct zvjG?f@;h!tWU#6o5JsTacE?cZSDw}7_y(dLmRlHpxs)-dFv<mKco#W!NBYsf{Hh$d^h&HoJSHcwB^;pp8M`%Av4!5RXA(fCG&{zOM<>WvG2ujF|Ej=g4%e!MK0B)IQZv==mXgL@`=Y9~oy>wS{gcX% z0>YdyIUj$0B^PHyu&J`+1C_q_l)0kpW)rfY=eito=sVKXSQgp!K*FZ$+oRY~CI}SA z6%4uWbup(Or3_H}=2TuqFF4j5T@fm%b*6`F0USw{;!3{K9OgmoBT;E5_y1p{OjiCI z4g^_?-DT;<881_|+d?nsk%;~3;Cfolef9wo4DIv8XqIMt#hCuU9qdtrW`Z)&_N2Sr zVCsEdsf?w|ebVsY)PpE2{CQa|xiavoS^i2LK@4OCp*PYXQzl0UciE{+n^)vE=097Q zd<&ZYFPm(WhBH{WQN_*^qNxZ>D|bQm^I>CYJFxmaNY;xJfOp8hEat@loL5bcrcT3G z+|0%}rJ6;Fj@nL@lK?@=j8QM}Q-ouLOnc!JNiR!Ph5X(SpOIioR1GAWYVY%`6_#Lv zm~_KI7aHr@HCX z@@jGlDLNs1>jKkR7N^+}V?qfBoiIJ7 z(&ywxm#)j5=h|=gs?%IY@#+xQEJ}_UY$Vgb6IrmJrNvpHNl*D`Jm)gXA&U#RN^O|P z%j8+P2_Lt~@q|!=uxK`fcYh9y2?-NQyE`msbEcaagYr=zu8-Sdd*InxFkho*lyl@w zI|9FDwJd>(cF1l?_k+V5-l%UBBII2~*X%TZWPhRLr_%N!Bs_c(ogz$i(8a#YJXe)8 zLALqb0WPFA{*~BeyhSt#?Lx%0mX+Eb7oKM_T`h`kRk9*CUkAptHXz#Vzx{8$`ZoXK z0bATjtMLG>z$AAjb9t2m@4N9a5S}5&K=|E~QS^*VV62qC5-+{v8F7!*7w5dw0mB{+ z$f7eFZ)M5;C+w%@ObdLKcZG6COs2rY8N!L`|#KLI+_!gHQ|5DkUM> zn6%;T1BV$tw!{6sUcKxFCm|KOTs2TQo2^u|U38xzt%jwKmc<~1F^Mq2k+fgHmAL|K z6e@RC?(2QuU7?>qujBuwt8J%1=PXo*TQqDd^0#cKKPjUlNqU+fQ?3)9A{(qh5=(kpcR!yv{7m}-o z@#!K0SX5FvlLr7Bf$_b|#DM4$!BMjWJc;D;WFIx?Qz>Cl6o4-lx2bc!3o`zv@~x zY}y$KTAbR)oBU++#ZNHo>~^oIV_)^)gjX9PTYk@BXcg;Lz{~MB+`U5}R>f3v+BV3t zu-(M`J~@q}DWd-7ifciGXWXYeK`@nM^R+=bAp^umo&TbY?Efs~K1dlHKUaEBwrq() z;?LP65s?26A(h%bc+j>juQ=B|u!dD`Z$<>(?5(zBf9&&K9&+-cCGGpwJMjCV{EEgN zcH{%$f$t&u3TOo+zy?Lo!t7)xoF~51egng|>JDW-2ir|fBvJvocmpQ>UT@MsXJ4oV zHh>SwIVOJ!Z&QM)ek2LzaW24|vC=VAh7SGN)eWnxxOav0~V+strdl|S7hYc;j{{4%$ zKHzDap=G+L8fq?$yT#E7xEBTAX4{@JnF5DC->Cp$8Bi~OA=lz~zdCO1tN zyNSsB;FmhOm_Riw62}W_+B9fZZUwj9RiE+L+w^cWNz5q{@n0$`JFF0Y-+_eNJ-qI} z-9A*HBMJ(#HUzY{4f`}l5Qvr{n(F}4uzUBj6W6`8)RB=3Zx$68bK}+8^o+_3a)J*5 zr)L~yq!I)jj6a(52VfL1>1dOw1d;H;>6;w85d*mQc9HKDVdLf)34~>-FEN1V3gh}) zTrd9DgNNw(AZs>Gtl=|2ZdB~=-^TzFzIJpgp^BgYkLO|{8*h05VqI&VMTkF+15cjJ zun=b`%R}A+=xis_fm%)ILLO}N7F`>xcBWc2+LUr)P=jg{wC(}TEPt(pWFvti5N{lcX9d`^MGp5OcPLXQ_|?RJnRgQfxSRJD zA{FOd@dN? z51ARqOk|U-PRH38X>~nw1LLbeSd+fg`fNiq*e3L`a;R$2lCallzmGOefcvEFpIgBi z7>9=j8STFZ$6sVNc)-i6-)EjLYM6wdwKZzY`wM=8@~AL7hxz&^=nhT_{F47?xGe(_w>~Tq07bV zyY#Fcy*`+%$c)n|il-7d8d8g*nWg}-?64*pvYhOSXGJFwMcB<4T;V_yzFC_V@B}RU z;{d@mBa8~X7JVix8|^}FY2Z*d$W(XHRh<9M+5`aP=nya;Wq?2YVtS=*m-0jz?E`QR z(1YxeyIncou~*!cW9i*EhoV9h2u!J6<~`ReJ~Oz8c2EaJ4Swa1d3IO^IhS{trO%_t zsN#(=R2s^M+L#>lOVCOJj)y<!n?8=l?H$I&j1lb^cE?E~g{0?(*HAYP!>F_VtAo zhncq1+@oP`D|skcot!(83Zx0|O`2W3D?}-IyME65bDo4dDNB;49k-2#Nt_*)=>v9& zRk-LVc5nDfQm_^iasu!aQkQG0E9-ZLIj@=205^r(*M08b4<+U>pBwhyFcoPv*P}=O zDhd>r_QavmQt-%N&A;zy04qG897ZrEQ88w;n>Bvw0EnioFWWjyK-B`8!#J=5Pn@Ut zKAeF*24SIOoq^;kd^eOylR#&L2&C0g&`?MTC%N%roh0qC#3{u+K_7|mvIj7L2pRwY E0QcS)3IG5A diff --git a/public/assets/community-youtube.webp b/public/assets/community-youtube.webp deleted file mode 100644 index 7fa02c04f69bcaea333801ec4af942bfb6077531..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11242 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%0D2jS+l`B0_T{1 zVr_Oh(1ne6Rc9DZ#$(Ba6#2Vgmr(MiwE!2#i%a^ zpmxlCC7*L58p5qsS7P9Uw*Xo?1T-_cN~jKPQ9Ey{`H^$Z9hNYX*} zMAR!E{KN1m&q-+4-dzwtP1%IU_H4LH0k-Dyh1e`_q-%Mgvk7;85!_Y3>WxheZ1qgz|1_|I@IMf%HTE*6 xN)Tc*+rWIVY>iP5_FWMGE>z+phP8NxeoSoT^~d+e*xeq*(U%1 diff --git a/public/assets/fileicons/.htaccess b/public/assets/fileicons/.htaccess deleted file mode 100644 index 05d0416..0000000 --- a/public/assets/fileicons/.htaccess +++ /dev/null @@ -1,3 +0,0 @@ -RewriteEngine on -RewriteCond %{REQUEST_FILENAME} !-f -RewriteRule \.png$ unknown.png [L] \ No newline at end of file diff --git a/public/assets/fileicons/doc.webp b/public/assets/fileicons/doc.webp deleted file mode 100644 index de67c0b089cf19738e54e38a2bccc5e0351b3c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4172 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 P`u*#Kjn^ZL-oSqW(nvD{ diff --git a/public/assets/fileicons/jpeg.webp b/public/assets/fileicons/jpeg.webp deleted file mode 100644 index 21ba151ea77a1304a3c690e84715866c9daa08ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3430 zcmZu!2Q=JE+y5haZ^5n>t`g|rm zL3Gixdi1qQLe%}p_nz;b?|t8ydCr_?&isDo_dN5=IWs0VVK7@p0I<-}GBP((vZMn5 zfaTmsWEbPwEhF7|asXgVy6!P8r)XIA+DR7c0rsh^_8_>q-@&PZF;!(A)BYBafYuD+ z`SFpg!Va?`A&?$ zJNpr5aiosW1&tllFT)eDGj`HHZpoZI6T# +wrbII2A#R5soE3W|Db+z;BNF>uxj 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 N3##Ts$nRgme*h8G6vqGn diff --git a/public/assets/fileicons/mov.webp b/public/assets/fileicons/mov.webp deleted file mode 100644 index 3651241fa1a1935db8b8bc9e63f5ec275671a562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3782 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 diff --git a/public/assets/fileicons/pdf.webp b/public/assets/fileicons/pdf.webp deleted file mode 100644 index a654e4d0bafa9bbe5fc80d48d9159b37fe33e0be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3730 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 MJ?>a5{09L150=sYoB#j- diff --git a/public/assets/fileicons/sb3.webp b/public/assets/fileicons/sb3.webp deleted file mode 100644 index 6d11fff203e49770418e2782e821a6b9631a3259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9218 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 diff --git a/public/assets/fileicons/txt.webp b/public/assets/fileicons/txt.webp deleted file mode 100644 index 170d5464ec0ab62c650436d14dc00f95a8782bb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3078 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 ZOrS8`V4t-87XhT^0RUi@-3<{=;6LA~>No%Z diff --git a/public/assets/fileicons/unknown.webp b/public/assets/fileicons/unknown.webp deleted file mode 100644 index 72bdfb1db3d4edefbcbd0ab7e451fb85426f84e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2856 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 diff --git a/public/assets/fileicons/xls.webp b/public/assets/fileicons/xls.webp deleted file mode 100644 index 3d8c782a0312f0f4d175c6aa9dca902938c9a5d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3484 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 diff --git a/public/assets/fileicons/xml.webp b/public/assets/fileicons/xml.webp deleted file mode 100644 index bbbbf7891134e9fc9f3e950e3173e2cb79018d91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3780 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 diff --git a/public/assets/fileicons/zip.webp b/public/assets/fileicons/zip.webp deleted file mode 100644 index 55f60e3d2e744c149a46645f4af0a747308bad4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2936 zcmZvac|6qL8pprJ?q?@7ib={|ma;as7+Zzv7iAekV;^M=F~(L%3?XGOF4-qj3?V`a zS!UWuW9(}T*|%Y?dfnIWckg}uUgvrKIOp{|@AG-i`CPVu!EXNn0CuLvHrH&l?RfwI z5IjgG%darHU}HW80sua&35u$wWnK9MsY*gg2EMF8(Y<}HHtI>fsIEj&L+mu~v_4)c z8&1HC!qR2B4tIAXOB*)jrq%}+!ZrR?KphsMq;21e<1;y5Kc>0Y3Dqc2L8q+a#@)we zLdmZIV41yg6UeR_Py~9!p*$}7a#m)TZJZ_u-+Ud|G!5q1TnF>nz+1>2A0mB#MM(s( zsiOkCI?XYve@ChFvEBax}{{)O8-Ol`{#kRZ= zv!BRpj~X{v&fl_T$nA?T|K665BKYZ^>W4jNZY6T82Ik{^oR5C2_p(YRBeHP^ z+_hOCpSUMN4Q1WV^LyI9-xYH#wrf)j9d>1->Vth3dPXBlz@6#Kz*=yuEFoHpmn~o` zRW*m!`3{7tFI8@3T&>sq~_;Yl7-3YuSm_ej-gKss0DV6i7DIv(;IS`7j zT(;@&LtYa2JSMF*h$lkHVfCeN7WbbcghlK2L~_U|LiHQZyb#GB4h6`YZ4eLW-tp?# zu*QP+$QzA&;Wqa862JZE?UWU7`5>}Vw}5~*ZFV4eXESvw6-}Q$_N5;H4!jTXGqldjJsmd9cGIQ8qw?oziEygn^LDB2o=M3Qa4}&jr;g8D>75%ZuG`#Y3k(N<4 z;4T+Z`&-Mv7u>YCUsY}K`)Wy+p_pGh+`$)urIs)6Hk?c@i$`I=QuWIS@XDB;M z*3AUI_XB+b2P%IPbkf6`tkkZ>6a({fb>dqGWPMEB+fLl*cBqP# zl5T_H%16iGuenZ;Fu0sVx?jqP!Kmn=iTaL%2aq7k1jbH{zD532Pizp=@}uVVzq5#o z!u-4^mbp8Jiz40Yztpx0ITL-&|7b4>{}m#gwnB;Y=n-U8gE@|@J4mI5jR9p%4;>Qz z^f&eFEyD`KbcATRE6q`n1dcL*k(w2|?v~k6dd`{ifmI+_$qDQfr>a2zijC#FStC~< z9cA5f1bWgx@#O3{TrcUTC*I6yOY4wZXBU~U@FqtI`j+==(plFiJNs8XUK$J7vQwPh zt@pY|)18MOSk5(xNl_4Pi<63dGIhedn{$?Cfhf19qNrP^m9U!H%@ zq+V|HwnG^YD@)~^K(3t89N%X=pgDQWygK1&UaxSFvItMim7p|(r=Nd&Sb?6+TF?I9 z{`&pFnl8ML<{OOZI>_qKj zw3usRYQ8AbcapaLurH3bB(deQFdMVt{AU#_$S9vT(w&9Q7rWCEz7q09e?6>1>` zE2y*hMup~39hKSnm4ilU04UlTD{zZjfUbS_QA4}~29GJhWCtQ!ii%1F<)>v;q}sZ` zQpRU2wNLGuR0b#H*5(>|JnQ8Dpe_hej;T8tQVOuwEn|TD#8N=sR}tWm8$udqg(wT9Qx@=qNosSz(De zmHf4Or|i5&@v9;*SL1f-1k>$fkv(xMon~@%8EU!{LI2mf^Al16mG}`7x~o&D^wU60 zS|rrW7Rr}p-Z$HY?m0RVAD<^&gF&p0TOw&ShN5CV>0UxVQoCKQ!Ix!(6jb*=-iQ;Y zg?C$jNw8kSp{`$4jY|}VMnqSh;}-SEHpx=K!ZvEed`fzCgngV~=7TcxbDg((x+x&a zhHyb;MMG$x5375Ho%sny!js^o6EOR0$7IIHiaVBiM5RA=*dx2T)x<+ z>a~}umaX-@lw$Kn1Q+(2Wx~UVD964+mbisozH)Y3JpQ?xpv4lh|I(_JE}wUC{wM#} z!|oTLWB%H=%>_ZQn?0jf*Ds#PEyk3y+8SC&Ng&#^35N-5?nEv{%1Aa;-ZhJ&=MYb}q*Jin9`C?sxYJfuKk#)@T^s9AQ$(K2G?(t@^>-CD_u z5B&AA&JO;1p - - - - -image/svg+xml - - - - - - - - - diff --git a/public/assets/home-discord.webp b/public/assets/home-discord.webp deleted file mode 100644 index 21152ed9ede066f5952bf5212d136ad1cc5a0692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30750 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 diff --git a/public/assets/home-green-screen.webp b/public/assets/home-green-screen.webp deleted file mode 100644 index c11db4678d77b96f98234736efa6853255ffd0a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30930 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

E6-gZ{rY1vvyddnkqi}Q-HQrAiG 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ð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 F006Mpz6xic!?u7NZu9~3R&2}VIq&@) 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 diff --git a/public/assets/home-minecraft-address.webp b/public/assets/home-minecraft-address.webp deleted file mode 100644 index f20581f83c1c8c57237dcdad04a20f81cec85578..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898 zcmWIYbaSg>W?%?+bqWXzuu#YYvIVRe<}zw&Fh?@j^;*qvU#h%lp}`4;1%jQKc@GQE zDcoa!y~C7CaKSvrTj{?T-!T4ST>Jn0|KZz>xB2h3AM6k057@K* z&#pO8!~B8&;QZTb;}2e3d+0$J-~5@3k~pDwL-?k1LL8k;LCbgDcKCSt>#x6c`{UPN ze+^^2@VFdu^YyedC%^OdB*opcb>?b~7<}E*Z{o@rMMt1?z(ryx#SlpPFZ8IALes-5WpEPEa&qd-YOKb zGN5#KTF%YQaW6kSJlxL5ka}6oXQmP3fxo}MzrUA!WoOaT)02usSL;dMW&OgyaN*FJ z1_lO}D~11_2rW1(cWTlkAGQT2H-Bc=Exf)_ZOVmpB>tA+3@YBoM9E^>XqHVBa~R6m?&ztYx9K`<0;#oH} zYYdpxcN}0{_I1Cy+$jr(i@PPdW`#v@s-EpLs`~0TgJJp!<=}3)K*jr!F~J+x?zTB; z5VKRdDIivG*&36HkJuunOnk05^JAV%#-TTEUu~DgOBW>R2khJ(xpqtPx=l;MYvmi% zFBZA%`~JhR&~<{Qf69|}YW@u^D)Xx)uO^0EZS+tt?LOPaz`(#Y*CX-bcY%xre)pfu z4&rS$kT6jZdPW-6K5eNVLAcyZtQw0nDWLpX2$nVjXg;TbbqOOxWMERF=fNgJyV zZFp8vc=gTg>#eIAt?MV{dYH)^NVqV;#nRW2hx1aHenptfxjw7Cv#UN#R5-xE003ph BuWkSU diff --git a/public/assets/home-minecraft-edu.webp b/public/assets/home-minecraft-edu.webp deleted file mode 100644 index 322feb1c6fe26121772675608223e8968a1bc8d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7002 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 diff --git a/public/assets/home-minecraft.webp b/public/assets/home-minecraft.webp deleted file mode 100644 index 6d16944133d53e32bfde2418cdc51425db5ec0e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14380 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 diff --git a/public/assets/logo.webp b/public/assets/logo.webp deleted file mode 100644 index 298577466bae0a7fbf2d395cd77c7e9d5dc20fe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8838 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 I000000CrXCtpET3 diff --git a/public/assets/sad-monster.webp b/public/assets/sad-monster.webp deleted file mode 100644 index b23e1820067f9383ea8795863561c9b43c352906..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33432 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

rT=eqCzH*` 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 diff --git a/public/assets/vareal.webp b/public/assets/vareal.webp deleted file mode 100644 index 068572fbbab8b548ec7684501dec73aec7181b4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38496 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 kq9Ppk<h($ diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png deleted file mode 100644 index 2a25ed2454912b85876d8be0b54a32ae34db222b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 683 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&Rm5z$EJF;uvBf zn4BO{^5Fmf|2@Z!9b0pPFE}9Jfx|Q9%`+Wk0s{k`)55~`Z@c$W^m?BCi{Q&wvMUOn ze>=H7KmLArU|?c>*3>;SeXqV)-Z6*Qe1GqL`Rm-rUdQjh_m}q)x0%E33rfc>+*vrY zxi|9p*T2SluCKcvdG6%d)aviw&W5fsn#9=GnGPepFcleNP6;* z$NJ&?F|5)bUjBV;{eFFH#g{J!ZS6EQ+f~_$cf+ISKP1v_cbukQ*lz` zL;2J1-_P$6GWDN%vhHTV-}mx-qIH3Bw%)nfZTi#uY%0o2UWHDG6BA%$eim=HKJEAJ zyDw!o&u;&5*M8rtkLf8}m;N(+Q~7E7`^i5&*PZ;HZ@9euR*fl z`~UiXul*zaIQLk6xcaDf+nK*R)p)|^8yeXBKd19K`ul3z%{TPh>iH%0>l1$HGF(2) zksPsUgUQkVKZDPnIPu}Xy-9)OKjx*9jW!AllLg-WKYT{#`1F52lX->Os~v?-d`w74 zXj+kyV8Q-Go~>v{gVoQ*HwFrArwsQoZd}Na$Kb=@wwg)Opf$_DQOD#CL%^zv?qvrg zI{S6L^Lon2u`w|*aoyivf8A-);gcz8X>~u}-rm01Li9o?6T`f%r+02_?+6AZ6i-(_ Jmvv4FO#nj!FcJU& diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png deleted file mode 100644 index 4f2893cc2bfd2ebb7bc6be37fa7ff1fbdff02990..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1587 zcmV-32F&@1P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$^ok>JNR9Fe^R((uUR}??5Eq#Ro zrBKWG&oD+#AZgbg~!Dy%AAk*P8oq|f{ zbW8AKv%vf);s;m}u(d!-X>0B0-Mw|MgM!2mvSbM-Il1SZd(Sz)d)_(cJ%CA?%)tL4 z17&4p+^noD5kiO>3-9dNv!{=>Kib}?4x^%?#5$cWYk7VV<)oZTRNdVLK~u#1maCT) zI&I%-jYf0B(^-6E{It6%(k8$Ae}1BE`AtUlC6fFQk%+c6Hy`cuJU`+&F)>jn3=*9Z z28zzoG~N99HwVy_8%osHHRxt}TQ`~+mv|>PH@AX}8-#7U$%`R7nJA`}^SP zl}4yPaSSe;JA?A1D@8}D4|Z8BmS)EG<>0^_E2eud4!w2)?&-|jIWPI{_V-Ws>kbO4 z2w43ZPas{IY6%HlKP6*X1WTc{KY60O$JlZhp{AzB6crQKdR^X_a`D{BMoo7|nnABO z$NIMm+f-~l#h;dGHk)T$Z;{us*=!wSM^;38C-mw~;OEPS%>Ispd-v8F3ku4tQW`zx zo&I@hg9U-tqHKyQ3NA*y>Y|0W!$QuVukI(d!)hQfFt8BcEELzk86J;^SRBp|3BktX zySEicgQC-HHk(Eu5cul#dLuC=#OLz``K#V&Nk~feI=HXW_UK_pve9T9%v<(m?5Z`Z z8$v_H)S3F<;bD&kYLyzK?@%7oHSS;a%-RD0QId+UE-%+{oK7E~v<#@+FN5t{Hp8Il zDX=-NSIgMCR_)_1*!0RRF!JJ|zFh)VyThgT_lbZ-xr-nnF&c{YErHUw9dPW(DcQWt zoDDMByEeuNixHSrB9X8noK89xD{MA9Yt#auLTy1g09YshM~bp%n<;H@*hG${ywvMl&zP3J@g^G z_x?sO^s5^zgZ(qC25pL^@8+)iZ8tuBHCp95eosxoQ^T;BzL%w|gB603;x^w&P*9f&`3)lAmRaM2?x^}HG1#s7~SWmGEIgpcPvw`Js;=Uyo z4i+9D6zK^-l+&f7@XI6}Na4|jYrAVdHF002ovPDHLkV1iX`*d71? diff --git a/public/favicon.ico b/public/favicon.ico index 45023b3453e7e3fe2874adeb9f142b5ccde2a7be..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 15406 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 Yy9e4m(C&eD543xr-2?3&XbTVg4@8qP#{d8T diff --git a/public/media.php b/public/media.php deleted file mode 100644 index c27bb45..0000000 --- a/public/media.php +++ /dev/null @@ -1,83 +0,0 @@ - 0 && strpos($_GET['url'], 'uploads/') === 0 && is_file($filepath)) { - if(isset($_GET['size'])) { - $availableSizes = ['thumb', 'small', 'medium', 'large', 'xlarge']; // we ignore full as its the original file - $requestedSize = strtolower($_GET['size']); - $requestedSizeIndex = array_search($requestedSize, $availableSizes); - - // Loop through the array from the requested size index - if($requestedSizeIndex !== false) { - for ($i = $requestedSizeIndex; $i < count($availableSizes); $i++) { - $sizePath = pathinfo($filepath, PATHINFO_DIRNAME) . '/' . pathinfo($filepath, PATHINFO_FILENAME) . "-$availableSizes[$i]." . pathinfo($filepath, PATHINFO_EXTENSION); - if (file_exists($sizePath)) { - $filepath = $sizePath; - break; - } - } - } - - // Output the original image to the browser - header('Content-Type: '. mime_content_type($filepath)); - header('Content-Disposition: inline; filename=' . pathinfo($filepath, PATHINFO_FILENAME) . '.' . pathinfo($filepath, PATHINFO_EXTENSION)); - readfile($filepath); - } else { - $newWidth = (isset($_GET['w']) ? intval($_GET['w']) : -1); - $newHeight = (isset($_GET['h']) ? intval($_GET['h']) : -1); - - if($newWidth != -1 || $newHeight != -1) { - $image = imagecreatefromstring(file_get_contents($filepath)); - - $width = imagesx($image); - $height = imagesy($image); - - $aspectRatio = $width / $height; - - if($newWidth == -1) { - $newWidth = intval($newHeight * $aspectRatio); - } - - if($newHeight == -1) { - $newHeight = intval($newWidth / $aspectRatio); - } - - $newImage = imagecreatetruecolor($newWidth, $newHeight); - imagecopyresampled($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); - - // Output the resized image to the browser - $mime_type = mime_content_type($_GET['url']); - header('Content-Type: ' . $mime_type); - switch($mime_type) { - case "image/jpeg": - imagejpeg($newImage); - break; - case "image/gif": - imagegif($newImage); - break; - case "image/png": - imagepng($newImage); - break; - } - imagedestroy($newImage); - - // Clean up the image resources - imagedestroy($image); - } else { - // Output the original image to the browser - header('Content-Type: '. mime_content_type($filepath)); - header('Content-Disposition: inline; filename=' . pathinfo($filepath, PATHINFO_FILENAME) . '.' . pathinfo($filepath, PATHINFO_EXTENSION)); - readfile($filepath); - } - } -} else { - // Return a 404 error - header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found"); - exit; -} diff --git a/public/shortlink.php b/public/shortlink.php deleted file mode 100644 index 54bbaaf..0000000 --- a/public/shortlink.php +++ /dev/null @@ -1,51 +0,0 @@ -load(); - -$dbHost = $_ENV['DB_HOST']; -$dbPort = $_ENV['DB_PORT']; -$dbName = $_ENV['DB_DATABASE']; -$dbUser = $_ENV['DB_USERNAME']; -$dbPass = $_ENV['DB_PASSWORD']; - -// create connection -$conn = new mysqli($dbHost, $dbUser, $dbPass, $dbName, $dbPort); - -// check connection -if ($conn->connect_error) { - die("Connection failed: " . $conn->connect_error); -} - -// get code from URL -$code = $_SERVER['REQUEST_URI']; -$code = trim($code, '/'); -if (($pos = strpos($code, '?')) !== false) { - $code = substr($code, 0, $pos); -} - -// lookup code in database -$sql = "SELECT url, used FROM shortlinks WHERE code = ?"; -$stmt = $conn->prepare($sql); -$stmt->bind_param("s", $code); -$stmt->execute(); -$result = $stmt->get_result(); - -// if code is found, redirect to URL and update 'used' column -if ($result->num_rows > 0) { - $row = $result->fetch_assoc(); - $url = $row["url"]; - $used = $row["used"] + 1; - $updateSql = "UPDATE shortlinks SET used = $used WHERE code = ?"; - $stmt = $conn->prepare($updateSql); - $stmt->bind_param("s", $code); - $stmt->execute(); - header("Location: " . $url); - exit(); -} else { - // if code is not found, redirect to default URL - header("Location: https://www.stemmechanics.com.au/"); - exit(); -} diff --git a/resources/css/app.scss b/resources/css/app.scss deleted file mode 100644 index 9d6f68a..0000000 --- a/resources/css/app.scss +++ /dev/null @@ -1,230 +0,0 @@ -*, -:after, -:before { - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - border: 0 solid #e5e7eb; -} -html { - overflow: -moz-scrollbars-vertical; - overflow-y: auto; - background-color: #f3f4f6; -} -html, -body { - font-family: Poppins, Roboto, "Open Sans", ui-sans-serif, system-ui, - sans-serif; - font-size: 1rem; - color: #000; - width: 100%; - min-height: 100vh; - min-width: 100%; - overflow-x: hidden; - line-height: 1.5; - margin: 0; -} -h1, -h2, -h3, -p { - margin: 0; -} -p + p, -p + ul, -ul + p { - margin-top: 1rem; -} -ol, -ul { - list-style: none; - margin: 0; - padding: 0; -} -small { - display: inline-block; -} -.small { - font-size: smaller; -} -.x-small { - font-size: x-small; -} -.list-decimal, -.list-disc, -.list-circle { - margin-left: 2.5rem; -} -.list-decimal li, -.list-disc li, -.list-circle li { - margin-top: 0.5rem; -} -a:not([role="button"]) { - color: #0284c7; -} -a:not([role="button"]):hover { - color: #0ea5e9; -} -a[role="button"] { - text-decoration: inherit; -} -a { - text-decoration: none; -} -input:disabled { - background-color: rgba(243, 244, 246); -} -input[type="submit"]:disabled { - background-color: rgba(209, 213, 219); -} -input { - font-family: Poppins, Roboto, "Open Sans", ui-sans-serif, system-ui, - sans-serif; -} -.scrollbar-width-none { - scrollbar-width: none; -} -.scrollbar-width-none::-webkit-scrollbar { - display: none; -} -.bg-center { - background-position: center; -} -.whitespace-nowrap { - white-space: nowrap; -} -.spin { - animation: rotate 1s infinite linear; -} -.text-xxs { - font-size: 0.6rem; - line-height: 0.75rem; -} -.text-bold { - font-weight: bold; -} -.sm-html .ProseMirror { - outline: none; -} -.sm-html hr { - border-top: 1px solid #aaa; - margin: 1.5rem 0; -} -.sm-html pre { - padding: 0 1rem; - line-height: 1rem; -} -.sm-html blockquote { - border-left: 4px solid #ddd; - margin-left: 1rem; - padding-left: 1rem; -} -.sm-html p.info, -.sm-html p.success, -.sm-html p.warning, -.sm-html p.danger { - display: flex; - border-radius: 0.5rem; - padding: 0.5rem 1rem 0.5rem 0.75rem; - margin: 0.5rem; - font-size: 80%; -} -.sm-html p.info::before, -.sm-html p.success::before, -.sm-html p.warning::before, -.sm-html p.danger::before { - display: inline-block; - width: 1.5rem; - height: 1.5rem; - margin-right: 0.5rem; - margin-top: 0.1rem; - flex-shrink: 0; -} -.sm-html p.info { - border: 1px solid rgba(14, 165, 233, 1); - background-color: rgba(14, 165, 233, 0.25); -} -.sm-html p.info::before { - color: rgba(14, 165, 233, 1); - content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M11,17H13V11H11V17Z' fill='rgba(14,165,233,1)' /%3E%3C/svg%3E"); -} -.sm-html p.success { - border: 1px solid rgba(22, 163, 74, 1); - background-color: rgba(22, 163, 74, 0.25); -} -.sm-html p.success::before { - color: rgba(22, 163, 74, 1); - content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M12 2C6.5 2 2 6.5 2 12S6.5 22 12 22 22 17.5 22 12 17.5 2 12 2M12 20C7.59 20 4 16.41 4 12S7.59 4 12 4 20 7.59 20 12 16.41 20 12 20M16.59 7.58L10 14.17L7.41 11.59L6 13L10 17L18 9L16.59 7.58Z' fill='rgba(22,163,74,1)' /%3E%3C/svg%3E"); -} -.sm-html p.warning, -div.warning { - border: 1px solid rgba(202, 138, 4, 1); - background-color: rgba(250, 204, 21, 0.25); -} -.sm-html p.warning::before { - color: rgba(202, 138, 4, 1); - content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M12,2L1,21H23M12,6L19.53,19H4.47M11,10V14H13V10M11,16V18H13V16' fill='rgba(202,138,4,1)' /%3E%3C/svg%3E"); -} -.sm-html p.danger { - border: 1px solid rgba(220, 38, 38, 1); - background-color: rgba(220, 38, 38, 0.25); -} -.sm-html p.danger::before { - color: rgba(220, 38, 38, 1); - content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M8.27,3L3,8.27V15.73L8.27,21H15.73L21,15.73V8.27L15.73,3M8.41,7L12,10.59L15.59,7L17,8.41L13.41,12L17,15.59L15.59,17L12,13.41L8.41,17L7,15.59L10.59,12L7,8.41' fill='rgba(220,38,38,1)' /%3E%3C/svg%3E"); -} -.sm-html img { - display: block; - margin: 1rem auto; - max-height: 100%; - max-width: 100%; -} -.sm-html ul { - list-style: disc; - margin: 1rem 2rem; -} -.sm-html ol { - list-style: decimal; - margin: 1rem 2rem; -} -.sm-html ul li, -.sm-html ol li { - margin-bottom: 0.25rem; -} -.sm-editor::-webkit-scrollbar { - background-color: transparent; - width: 16px; -} -.sm-editor::-webkit-scrollbar-thumb { - background-color: #aaa; - border: 4px solid transparent; - border-radius: 8px; - background-clip: padding-box; -} -.selected-checked { - border: 3px solid rgba(2, 132, 199, 1); - position: relative; -} -.selected-checked::after { - display: block; - position: absolute; - border: 1px solid white; - height: 1.5rem; - width: 1.5rem; - background-color: rgba(2, 132, 199, 1); - top: -0.4rem; - right: -0.4rem; - content: ""; - background-position: center; - background-repeat: no-repeat; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M21,7L9,19L2.712,12.712L5.556,9.892L9.029,13.358L18.186,4.189L21,7Z' fill='rgba(255,255,255,1)' /%3E%3C/svg%3E"); -} -@keyframes rotate { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js index e69de29..846d350 100644 --- a/resources/js/bootstrap.js +++ b/resources/js/bootstrap.js @@ -0,0 +1,32 @@ +/** + * We'll load the axios HTTP library which allows us to easily issue requests + * to our Laravel back-end. This library automatically handles sending the + * CSRF token as a header based on the value of the "XSRF" token cookie. + */ + +import axios from 'axios'; +window.axios = axios; + +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; + +/** + * Echo exposes an expressive API for subscribing to channels and listening + * for events that are broadcast by Laravel. Echo and event broadcasting + * allows your team to easily build robust real-time web applications. + */ + +// import Echo from 'laravel-echo'; + +// import Pusher from 'pusher-js'; +// window.Pusher = Pusher; + +// window.Echo = new Echo({ +// broadcaster: 'pusher', +// key: import.meta.env.VITE_PUSHER_APP_KEY, +// cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? 'mt1', +// wsHost: import.meta.env.VITE_PUSHER_HOST ? import.meta.env.VITE_PUSHER_HOST : `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`, +// wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80, +// wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443, +// forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https', +// enabledTransports: ['ws', 'wss'], +// }); diff --git a/resources/js/components/SMArticleCard.vue b/resources/js/components/SMArticleCard.vue deleted file mode 100644 index bfceecf..0000000 --- a/resources/js/components/SMArticleCard.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - diff --git a/resources/js/components/SMAttachments.vue b/resources/js/components/SMAttachments.vue deleted file mode 100644 index a2c93bb..0000000 --- a/resources/js/components/SMAttachments.vue +++ /dev/null @@ -1,193 +0,0 @@ - - - diff --git a/resources/js/components/SMCard.vue b/resources/js/components/SMCard.vue deleted file mode 100644 index 76d777b..0000000 --- a/resources/js/components/SMCard.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - - - diff --git a/resources/js/components/SMCheckbox.vue b/resources/js/components/SMCheckbox.vue deleted file mode 100644 index c13697b..0000000 --- a/resources/js/components/SMCheckbox.vue +++ /dev/null @@ -1,248 +0,0 @@ - - - - - diff --git a/resources/js/components/SMControl.vue b/resources/js/components/SMControl.vue deleted file mode 100644 index 91c2a21..0000000 --- a/resources/js/components/SMControl.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - - - diff --git a/resources/js/components/SMDialog.ts b/resources/js/components/SMDialog.ts deleted file mode 100644 index 3af256a..0000000 --- a/resources/js/components/SMDialog.ts +++ /dev/null @@ -1,124 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { - AllowedComponentProps, - Component, - defineComponent, - shallowReactive, - VNodeProps, - watch, -} from "vue"; - -export interface DialogInstance { - comp?: any; - dialog: Component; - wrapper: string; - props: unknown; - resolve: (data: unknown) => void; -} -const dialogRefs = shallowReactive([]); - -export default defineComponent({ - name: "SMDialogList", - template: ` -

-
- -
-
- `, - data() { - const dialogRefList = dialogRefs; - - return { - name: "default", - transitionAttrs: {}, - dialogRefList, - }; - }, -}); - -/** - * Closes last opened dialog, resolving the promise with the return value of the dialog, or with the given - * data if any. - * @param {unknown} data The dialog return value. - */ -export function closeDialog(data?: unknown) { - if (dialogRefs.length <= 1) { - document.getElementsByTagName("html")[0].style.overflow = ""; - document.getElementsByTagName("body")[0].style.overflow = ""; - } - - const lastDialog = dialogRefs.pop(); - if (data === undefined && lastDialog.comp && lastDialog.comp.returnValue) { - data = lastDialog.comp.returnValue(); - } - if (lastDialog && data !== undefined) { - lastDialog.resolve(data); - } -} - -/** - * Extracts the type of props from a component definition. - */ -type PropsType = C extends new (...args: any) => any - ? Omit< - InstanceType["$props"], - keyof VNodeProps | keyof AllowedComponentProps - > - : never; - -/** - * Extracts the return type of the dialog from the setup function. - */ -type BindingReturnType = C extends new ( - ...args: any -) => any - ? InstanceType extends { returnValue: () => infer Y } - ? Y - : never - : never; - -/** - * Extracts the return type of the dialog either from the setup method or from the methods. - */ -type ReturnType = BindingReturnType; - -/** - * Opens a dialog. - * @param {Component} dialog The dialog you want to open. - * @param {PropsType} props The props to be passed to the dialog. - * @param {string} wrapper The dialog wrapper you want the dialog to open into. - * @returns {Promise} A promise that resolves when the dialog is closed - */ -export function openDialog( - dialog: C, - props?: PropsType, - wrapper: string = "default", -): Promise> { - if (dialogRefs.length === 0) { - document.getElementsByTagName("html")[0].style.overflow = "hidden"; - document.getElementsByTagName("body")[0].style.overflow = "hidden"; - } - - return new Promise((resolve) => { - dialogRefs.push({ - dialog, - props, - wrapper, - resolve, - }); - - window.setTimeout(() => { - const autofocusElement = document.querySelector( - "[autofocus]", - ) as HTMLInputElement; - if (autofocusElement) { - autofocusElement.focus(); - } - }, 10); - }); -} diff --git a/resources/js/components/SMDropdown.vue b/resources/js/components/SMDropdown.vue deleted file mode 100644 index df45afb..0000000 --- a/resources/js/components/SMDropdown.vue +++ /dev/null @@ -1,225 +0,0 @@ - - - - - diff --git a/resources/js/components/SMEditor.vue b/resources/js/components/SMEditor.vue deleted file mode 100644 index 4c51209..0000000 --- a/resources/js/components/SMEditor.vue +++ /dev/null @@ -1,936 +0,0 @@ - - - - - diff --git a/resources/js/components/SMEventCard.vue b/resources/js/components/SMEventCard.vue deleted file mode 100644 index d9f11d3..0000000 --- a/resources/js/components/SMEventCard.vue +++ /dev/null @@ -1,269 +0,0 @@ - - - - - diff --git a/resources/js/components/SMFileLink.vue b/resources/js/components/SMFileLink.vue deleted file mode 100644 index b450d6b..0000000 --- a/resources/js/components/SMFileLink.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - diff --git a/resources/js/components/SMForm.vue b/resources/js/components/SMForm.vue deleted file mode 100644 index 728667b..0000000 --- a/resources/js/components/SMForm.vue +++ /dev/null @@ -1,79 +0,0 @@ - - - diff --git a/resources/js/components/SMFormError.vue b/resources/js/components/SMFormError.vue deleted file mode 100644 index 04e1c93..0000000 --- a/resources/js/components/SMFormError.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/resources/js/components/SMHTML.vue b/resources/js/components/SMHTML.vue deleted file mode 100644 index 53b2444..0000000 --- a/resources/js/components/SMHTML.vue +++ /dev/null @@ -1,72 +0,0 @@ - - - diff --git a/resources/js/components/SMHeader.vue b/resources/js/components/SMHeader.vue deleted file mode 100644 index 95aecc3..0000000 --- a/resources/js/components/SMHeader.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - - - diff --git a/resources/js/components/SMImage.vue b/resources/js/components/SMImage.vue deleted file mode 100644 index 4fe5e13..0000000 --- a/resources/js/components/SMImage.vue +++ /dev/null @@ -1,64 +0,0 @@ - - - - - diff --git a/resources/js/components/SMImageGallery.vue b/resources/js/components/SMImageGallery.vue deleted file mode 100644 index f027e0a..0000000 --- a/resources/js/components/SMImageGallery.vue +++ /dev/null @@ -1,364 +0,0 @@ - - - - - diff --git a/resources/js/components/SMImageStack.vue b/resources/js/components/SMImageStack.vue deleted file mode 100644 index ad5bf96..0000000 --- a/resources/js/components/SMImageStack.vue +++ /dev/null @@ -1,80 +0,0 @@ - - - - - diff --git a/resources/js/components/SMInput copy.vue b/resources/js/components/SMInput copy.vue deleted file mode 100644 index b38d1ac..0000000 --- a/resources/js/components/SMInput copy.vue +++ /dev/null @@ -1,882 +0,0 @@ - - - - - diff --git a/resources/js/components/SMInput.vue b/resources/js/components/SMInput.vue deleted file mode 100644 index 557fce0..0000000 --- a/resources/js/components/SMInput.vue +++ /dev/null @@ -1,315 +0,0 @@ - - - - - diff --git a/resources/js/components/SMInputAttachments.vue b/resources/js/components/SMInputAttachments.vue deleted file mode 100644 index b08df28..0000000 --- a/resources/js/components/SMInputAttachments.vue +++ /dev/null @@ -1,202 +0,0 @@ - - - - - diff --git a/resources/js/components/SMInputFile.vue b/resources/js/components/SMInputFile.vue deleted file mode 100644 index b38d1ac..0000000 --- a/resources/js/components/SMInputFile.vue +++ /dev/null @@ -1,882 +0,0 @@ - - - - - diff --git a/resources/js/components/SMLoading.vue b/resources/js/components/SMLoading.vue deleted file mode 100644 index 918f5eb..0000000 --- a/resources/js/components/SMLoading.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - - - diff --git a/resources/js/components/SMMastHead.vue b/resources/js/components/SMMastHead.vue deleted file mode 100644 index cb6f3d2..0000000 --- a/resources/js/components/SMMastHead.vue +++ /dev/null @@ -1,103 +0,0 @@ - - - - - diff --git a/resources/js/components/SMNavbar.vue b/resources/js/components/SMNavbar.vue deleted file mode 100644 index 7831020..0000000 --- a/resources/js/components/SMNavbar.vue +++ /dev/null @@ -1,717 +0,0 @@ - - - - - diff --git a/resources/js/components/SMPageFooter.vue b/resources/js/components/SMPageFooter.vue deleted file mode 100644 index 6aadace..0000000 --- a/resources/js/components/SMPageFooter.vue +++ /dev/null @@ -1,645 +0,0 @@ - - - diff --git a/resources/js/components/SMPageStatus.vue b/resources/js/components/SMPageStatus.vue deleted file mode 100644 index 84a23f4..0000000 --- a/resources/js/components/SMPageStatus.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - diff --git a/resources/js/components/SMPagination.vue b/resources/js/components/SMPagination.vue deleted file mode 100644 index 744946d..0000000 --- a/resources/js/components/SMPagination.vue +++ /dev/null @@ -1,210 +0,0 @@ - - - diff --git a/resources/js/components/SMRange.vue b/resources/js/components/SMRange.vue deleted file mode 100644 index 5ecc5ca..0000000 --- a/resources/js/components/SMRange.vue +++ /dev/null @@ -1,876 +0,0 @@ - - - - - diff --git a/resources/js/components/SMSelectFile.vue b/resources/js/components/SMSelectFile.vue deleted file mode 100644 index 6f24b23..0000000 --- a/resources/js/components/SMSelectFile.vue +++ /dev/null @@ -1,653 +0,0 @@ - - - - - diff --git a/resources/js/components/SMSocialIcons.vue b/resources/js/components/SMSocialIcons.vue deleted file mode 100644 index ce0d576..0000000 --- a/resources/js/components/SMSocialIcons.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - diff --git a/resources/js/components/SMTab.vue b/resources/js/components/SMTab.vue deleted file mode 100644 index f9e686c..0000000 --- a/resources/js/components/SMTab.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - diff --git a/resources/js/components/SMTabGroup.vue b/resources/js/components/SMTabGroup.vue deleted file mode 100644 index 940c4db..0000000 --- a/resources/js/components/SMTabGroup.vue +++ /dev/null @@ -1,87 +0,0 @@ - - - diff --git a/resources/js/components/SMTable.vue b/resources/js/components/SMTable.vue deleted file mode 100644 index 4864cde..0000000 --- a/resources/js/components/SMTable.vue +++ /dev/null @@ -1,193 +0,0 @@ - - - - - diff --git a/resources/js/components/SMToast.vue b/resources/js/components/SMToast.vue deleted file mode 100644 index 3587f71..0000000 --- a/resources/js/components/SMToast.vue +++ /dev/null @@ -1,151 +0,0 @@ - - - diff --git a/resources/js/components/SMToastList.vue b/resources/js/components/SMToastList.vue deleted file mode 100644 index 6ba4bc9..0000000 --- a/resources/js/components/SMToastList.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/resources/js/components/dialogs/SMDialogChangePassword.vue b/resources/js/components/dialogs/SMDialogChangePassword.vue deleted file mode 100644 index 6556d55..0000000 --- a/resources/js/components/dialogs/SMDialogChangePassword.vue +++ /dev/null @@ -1,121 +0,0 @@ - - - diff --git a/resources/js/components/dialogs/SMDialogConfirm.vue b/resources/js/components/dialogs/SMDialogConfirm.vue deleted file mode 100644 index 65ec69a..0000000 --- a/resources/js/components/dialogs/SMDialogConfirm.vue +++ /dev/null @@ -1,130 +0,0 @@ - - - diff --git a/resources/js/components/dialogs/SMDialogMedia.vue b/resources/js/components/dialogs/SMDialogMedia.vue deleted file mode 100644 index cc0e831..0000000 --- a/resources/js/components/dialogs/SMDialogMedia.vue +++ /dev/null @@ -1,1642 +0,0 @@ - - - - - diff --git a/resources/js/components/dialogs/SMDialogProgress.vue b/resources/js/components/dialogs/SMDialogProgress.vue deleted file mode 100644 index 1681ad8..0000000 --- a/resources/js/components/dialogs/SMDialogProgress.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - diff --git a/resources/js/extensions/danger.ts b/resources/js/extensions/danger.ts deleted file mode 100644 index 921ad9e..0000000 --- a/resources/js/extensions/danger.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { mergeAttributes, Node } from "@tiptap/core"; - -export interface DangerOptions { - HTMLAttributes: Record; -} - -declare module "@tiptap/core" { - interface Commands { - danger: { - /** - * Toggle a paragraph - */ - setDanger: () => ReturnType; - toggleDanger: () => ReturnType; - }; - } -} - -export const Danger = Node.create({ - name: "danger", - - priority: 1000, - - addOptions() { - return { - HTMLAttributes: { class: "danger" }, - }; - }, - - group: "block", - - content: "inline*", - - parseHTML() { - return [{ tag: "p", class: "danger" }]; - }, - - renderHTML({ HTMLAttributes }) { - return [ - "p", - mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), - 0, - ]; - }, - - addCommands() { - return { - setDanger: - () => - ({ commands }) => { - return commands.setNode(this.name); - }, - toggleDanger: - () => - ({ commands }) => { - return commands.toggleNode(this.name, "paragraph"); - }, - }; - }, -}); diff --git a/resources/js/extensions/info.ts b/resources/js/extensions/info.ts deleted file mode 100644 index 80868dc..0000000 --- a/resources/js/extensions/info.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { mergeAttributes, Node } from "@tiptap/core"; - -export interface InfoOptions { - HTMLAttributes: Record; -} - -declare module "@tiptap/core" { - interface Commands { - info: { - /** - * Toggle a paragraph - */ - setInfo: () => ReturnType; - toggleInfo: () => ReturnType; - }; - } -} - -export const Info = Node.create({ - name: "info", - - priority: 1000, - - addOptions() { - return { - HTMLAttributes: { class: "info" }, - }; - }, - - group: "block", - - content: "inline*", - - parseHTML() { - return [{ tag: "p", class: "info" }]; - }, - - renderHTML({ HTMLAttributes }) { - return [ - "p", - mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), - 0, - ]; - }, - - addCommands() { - return { - setInfo: - () => - ({ commands }) => { - return commands.setNode(this.name); - }, - toggleInfo: - () => - ({ commands }) => { - return commands.toggleNode(this.name, "paragraph"); - }, - }; - }, -}); diff --git a/resources/js/extensions/small.ts b/resources/js/extensions/small.ts deleted file mode 100644 index 29ccd37..0000000 --- a/resources/js/extensions/small.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { mergeAttributes, Node } from "@tiptap/core"; - -export interface SmallOptions { - HTMLAttributes: Record; -} - -declare module "@tiptap/core" { - interface Commands { - small: { - /** - * Set a small mark - */ - setSmall: () => ReturnType; - /** - * Toggle a small mark - */ - toggleSmall: () => ReturnType; - }; - } -} - -export const Small = Node.create({ - name: "small", - group: "block", - content: "inline*", - - addOptions() { - return { - HTMLAttributes: { class: "small" }, - }; - }, - - parseHTML() { - return [{ tag: "p.small", priority: 100 }]; - }, - - renderHTML({ HTMLAttributes }) { - return [ - "p", - mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), - 0, - ]; - }, - - addCommands() { - return { - setSmall: - () => - ({ commands }) => { - return commands.setNode(this.name); - }, - toggleSmall: - () => - ({ commands }) => { - return commands.toggleNode(this.name, "paragraph"); - }, - }; - }, -}); diff --git a/resources/js/extensions/success.ts b/resources/js/extensions/success.ts deleted file mode 100644 index a7997fe..0000000 --- a/resources/js/extensions/success.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { mergeAttributes, Node } from "@tiptap/core"; - -export interface SuccessOptions { - HTMLAttributes: Record; -} - -declare module "@tiptap/core" { - interface Commands { - success: { - /** - * Toggle a paragraph - */ - setSuccess: () => ReturnType; - toggleSuccess: () => ReturnType; - }; - } -} - -export const Success = Node.create({ - name: "success", - - priority: 1000, - - addOptions() { - return { - HTMLAttributes: { class: "success" }, - }; - }, - - group: "block", - - content: "inline*", - - parseHTML() { - return [{ tag: "p", class: "success" }]; - }, - - renderHTML({ HTMLAttributes }) { - return [ - "p", - mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), - 0, - ]; - }, - - addCommands() { - return { - setSuccess: - () => - ({ commands }) => { - return commands.setNode(this.name); - }, - toggleSuccess: - () => - ({ commands }) => { - return commands.toggleNode(this.name, "paragraph"); - }, - }; - }, -}); diff --git a/resources/js/extensions/warning.ts b/resources/js/extensions/warning.ts deleted file mode 100644 index 58e9d6c..0000000 --- a/resources/js/extensions/warning.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { mergeAttributes, Node } from "@tiptap/core"; - -export interface WarningOptions { - HTMLAttributes: Record; -} - -declare module "@tiptap/core" { - interface Commands { - warning: { - /** - * Toggle a paragraph - */ - setWarning: () => ReturnType; - toggleWarning: () => ReturnType; - }; - } -} - -export const Warning = Node.create({ - name: "warning", - - priority: 1000, - - addOptions() { - return { - HTMLAttributes: { class: "warning" }, - }; - }, - - group: "block", - - content: "inline*", - - parseHTML() { - return [{ tag: "p", class: "warning" }]; - }, - - renderHTML({ HTMLAttributes }) { - return [ - "p", - mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), - 0, - ]; - }, - - addCommands() { - return { - setWarning: - () => - ({ commands }) => { - return commands.setNode(this.name); - }, - toggleWarning: - () => - ({ commands }) => { - return commands.toggleNode(this.name, "paragraph"); - }, - }; - }, -}); diff --git a/resources/js/helpers/api.ts b/resources/js/helpers/api.ts deleted file mode 100644 index e2f6ffa..0000000 --- a/resources/js/helpers/api.ts +++ /dev/null @@ -1,476 +0,0 @@ -import { useUserStore } from "../store/UserStore"; -import { useApplicationStore } from "../store/ApplicationStore"; -import { useCacheStore } from "../store/CacheStore"; -import { ImportMetaExtras } from "../../../import-meta"; - -interface ApiProgressData { - loaded: number; - total: number; -} - -interface ApiCallbackData { - status: number; - statusText: string; - url: string; - headers: unknown; - data: unknown; -} - -type ApiProgressCallback = (progress: ApiProgressData) => void; -type ApiResultCallback = (data: ApiCallbackData) => void; - -export interface ApiOptions { - url: string; - params?: object; - method?: string; - headers?: HeadersInit; - body?: string | object | FormData | ArrayBuffer | Blob; - signal?: AbortSignal | null; - progress?: ApiProgressCallback; - callback?: ApiResultCallback; - chunk?: string; -} - -export interface ApiResponse { - status: number; - message: string; - data: unknown; - json?: Record; -} - -const apiDefaultHeaders = { - Accept: "application/json", - "Content-Type": "application/json;charset=UTF-8", -}; - -export const api = { - timeout: 8000, - baseUrl: (import.meta as ImportMetaExtras).env.APP_URL_API, - - send: function (options: ApiOptions) { - return new Promise((resolve, reject) => { - let url = this.baseUrl + options.url; - - if (options.params) { - let params = ""; - - for (const [key, value] of Object.entries(options.params)) { - const placeholder = `{${key}}`; - if (url.includes(placeholder)) { - url = url.replace( - placeholder, - encodeURIComponent(value), - ); - } else { - params += `&${encodeURIComponent( - key, - )}=${encodeURIComponent(value)}`; - } - } - - url = url.replace(/{(.*?)}/g, "$1"); - if (params.length > 0) { - url += (url.includes("?") ? "" : "?") + params.substring(1); - } - } - - options.headers = { - ...apiDefaultHeaders, - ...(options.headers || {}), - }; - - const userStore = useUserStore(); - if (userStore.id) { - options.headers["Authorization"] = `Bearer ${userStore.token}`; - } - - options.method = options.method.toUpperCase() || "GET"; - - if (options.body && typeof options.body === "object") { - if (options.body instanceof FormData) { - if ( - Object.prototype.hasOwnProperty.call( - options.headers, - "Content-Type", - ) - ) { - // remove the "Content-Type" key from the headers object - delete options.headers["Content-Type"]; - } - - if (options.method != "POST") { - options.body.append("_method", options.method); - options.method = "POST"; - } - } else if ( - options.body instanceof Blob || - options.body instanceof ArrayBuffer - ) { - // do nothing, let XHR handle these types of bodies without a Content-Type header - } else { - options.body = JSON.stringify(options.body); - options.headers["Content-Type"] = "application/json"; - } - } - - if ( - (options.method == "POST" || - options.method == "PUT" || - options.method == "PATCH") && - options.progress - ) { - const xhr = new XMLHttpRequest(); - - xhr.upload.onprogress = function (event) { - if (event.lengthComputable) { - options.progress({ - loaded: event.loaded, - total: event.total, - }); - } - }; - - xhr.open(options.method, url); - for (const header in options.headers) { - xhr.setRequestHeader(header, options.headers[header]); - } - xhr.onload = function () { - const result = { - status: xhr.status, - statusText: xhr.statusText, - url: url, - headers: {}, - data: "", - }; - - const headersString = xhr.getAllResponseHeaders(); - const headersArray = headersString.trim().split("\n"); - headersArray.forEach((header) => { - const [name, value] = header.trim().split(":"); - result.headers[name] = value.trim(); - }); - - if ( - xhr.response && - result.headers["content-type"] == "application/json" - ) { - try { - result.data = JSON.parse(xhr.response); - } catch (error) { - result.data = xhr.response; - } - } else { - result.data = xhr.response; - } - - useApplicationStore().unavailable = false; - if (xhr.status < 300) { - if (options.callback) { - options.callback(result); - } else { - resolve(result); - } - - return; - } else { - if (xhr.status == 503) { - useApplicationStore().unavailable = true; - } - - if (options.callback) { - options.callback(result); - } else { - reject(result); - } - - return; - } - }; - - try { - xhr.send(options.body as XMLHttpRequestBodyInit); - } catch (e) { - console.log(e); - } - } else { - const fetchOptions: RequestInit = { - method: options.method.toUpperCase() || "GET", - headers: options.headers, - signal: options.signal || null, - }; - - if ( - (typeof options.body == "string" && - options.body.length > 0) || - options.body instanceof FormData - ) { - fetchOptions.body = options.body; - } - - if (fetchOptions.method == "GET" && options.callback) { - const cache = useCacheStore().getCacheByUrl(url); - if (cache != null) { - options.callback(cache); - } - } - - fetch(url, fetchOptions) - .then(async (response) => { - let data: string | object = ""; - if (response.headers.get("content-length") !== "0") { - if ( - response && - response.headers.get("content-type") == null - ) { - try { - data = response.json - ? await response.json() - : {}; - } catch (error) { - try { - data = response.text - ? await response.text() - : ""; - } catch (error) { - data = ""; - } - } - } else { - data = - response && response.json - ? await response.json() - : {}; - } - } - - const result = { - status: response.status, - statusText: response.statusText, - url: response.url, - headers: response.headers, - data: data, - }; - - useApplicationStore().unavailable = false; - if (response.status >= 300) { - if (response.status === 503) { - useApplicationStore().unavailable = true; - } - - if (options.callback) { - options.callback(result); - } else { - reject(result); - } - - return; - } - - if (options.callback) { - if (fetchOptions.method == "GET") { - const modified = useCacheStore().updateCache( - url, - result, - ); - - if (modified == false) { - return; - } - } - - options.callback(result); - return; - } - - resolve(result); - }) - .catch((error) => { - // Handle any errors thrown during the fetch process - const { response, ...rest } = error; - const result = { - ...rest, - response: response && response.json(), - }; - - if (options.callback) { - options.callback(result); - } else { - reject(result); - } - - return; - }); - } - }); - }, - - get: async function (options: ApiOptions | string): Promise { - let apiOptions = {} as ApiOptions; - - if (typeof options == "string") { - apiOptions.url = options; - } else { - apiOptions = options; - } - - apiOptions.method = "GET"; - return await this.send(apiOptions); - }, - - post: async function (options: ApiOptions | string): Promise { - let apiOptions = {} as ApiOptions; - - if (typeof options == "string") { - apiOptions.url = options; - } else { - apiOptions = options; - } - - apiOptions.method = "POST"; - return await this.send(apiOptions); - }, - - put: async function (options: ApiOptions | string): Promise { - let apiOptions = {} as ApiOptions; - - if (typeof options == "string") { - apiOptions.url = options; - } else { - apiOptions = options; - } - - apiOptions.method = "PUT"; - return await this.send(apiOptions); - }, - - delete: async function ( - options: ApiOptions | string, - ): Promise { - let apiOptions = {} as ApiOptions; - - if (typeof options == "string") { - apiOptions.url = options; - } else { - apiOptions = options; - } - - apiOptions.method = "DELETE"; - return await this.send(apiOptions); - }, - - chunk: async function (options: ApiOptions | string): Promise { - let apiOptions = {} as ApiOptions; - - // setup api options - if (typeof options == "string") { - apiOptions.url = options; - } else { - apiOptions = options; - } - - // set method to post by default - if (!Object.prototype.hasOwnProperty.call(apiOptions, "method")) { - apiOptions.method = "POST"; - } - - // check for chunk option - if ( - Object.prototype.hasOwnProperty.call(apiOptions, "chunk") && - Object.prototype.hasOwnProperty.call(apiOptions, "body") && - apiOptions.body instanceof FormData - ) { - if (apiOptions.body.has(apiOptions.chunk)) { - const file = apiOptions.body.get(apiOptions.chunk); - - if (file instanceof File) { - const chunkSize = 2 * 1024 * 1024; - let chunk = 0; - let chunkCount = 1; - let job_id = -1; - - if (file.size > chunkSize) { - chunkCount = Math.ceil(file.size / chunkSize); - } - - let result = null; - for (chunk = 0; chunk < chunkCount; chunk++) { - const offset = chunk * chunkSize; - const fileChunk = file.slice( - offset, - offset + chunkSize, - ); - - const chunkFormData = new FormData(); - if (job_id == -1) { - for (const [field, value] of apiOptions.body) { - chunkFormData.append(field, value); - } - - chunkFormData.append("name", file.name); - chunkFormData.append("size", file.size.toString()); - chunkFormData.append("mime_type", file.type); - } else { - chunkFormData.append("job_id", job_id.toString()); - } - - chunkFormData.set(apiOptions.chunk, fileChunk); - chunkFormData.append("chunk", (chunk + 1).toString()); - chunkFormData.append( - "chunk_count", - chunkCount.toString(), - ); - - const chunkOptions = { - method: apiOptions.method, - url: apiOptions.url, - params: apiOptions.params || {}, - body: chunkFormData, - headers: apiOptions.headers || {}, - progress: (progressEvent) => { - if ( - Object.prototype.hasOwnProperty.call( - apiOptions, - "progress", - ) - ) { - apiOptions.progress({ - loaded: - chunk * chunkSize + - progressEvent.loaded, - total: file.size, - }); - } - }, - }; - - result = await this.send(chunkOptions); - job_id = result.data.media_job.id; - } - - return result; - } - } - } - - return await this.send(apiOptions); - }, -}; - -/** - * Get an api result data as type. - * @param result The api result object. - * @param defaultValue The default data to return if no result exists. - * @returns Data object. - */ -export function getApiResultData( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - result: any, - defaultValue: T | null = null, -): T | null { - if (!result || !Object.prototype.hasOwnProperty.call(result, "data")) { - return defaultValue; - } - - const data = result.data as T; - return data instanceof Object ? data : defaultValue; -} diff --git a/resources/js/helpers/api.types.ts b/resources/js/helpers/api.types.ts deleted file mode 100644 index c8c110c..0000000 --- a/resources/js/helpers/api.types.ts +++ /dev/null @@ -1,190 +0,0 @@ -export type Booleanish = boolean | "true" | "false"; - -export type EmptyObject = { [key: string]: never }; - -export interface SessionRequest { - id: number; - session_id: number; - type: string; - path: string; - created_at: string; - updated_at: string; -} - -export interface Session { - id: number; - ip: string; - useragent: string; - created_at: string; - updated_at: string; - ended_at: string; - requests?: SessionRequest[]; -} - -export interface SessionCollection { - sessions: Session[]; - total: number; -} - -export interface SessionRequestCollection { - session: Session; -} - -export interface Event { - id: string; - title: string; - hero: Media; - content: string; - start_at: string; - end_at: string; - publish_at: string; - location: string; - location_url: string; - address: string; - status: string; - registration_type: string; - registration_data: string; - price: string; - ages: string; - attachments: Array; - created_at: string; - updated_at: string; -} - -export interface EventResponse { - event: Event; -} - -export interface EventCollection { - events: Event[]; - total: number; -} - -export interface Media { - id: string; - user_id: string; - title: string; - name: string; - mime_type: string; - security_type: string; - size: number; - storage: string; - url: string; - thumbnail: string; - description: string; - dimensions: string; - variants: { [key: string]: string }; - created_at: string; - updated_at: string; - jobs: Array; -} - -export interface MediaResponse { - medium: Media; -} - -export interface MediaCollection { - media: Array; - total: number; -} - -export interface MediaJob { - id: string; - media_id: string; - user_id: string; - status: string; - status_text: string; - progress: number; - progress_max: number; -} - -export interface MediaJobResponse { - media_job: MediaJob; -} - -export interface Article { - id: string; - title: string; - slug: string; - user_id: string; - user: User; - content: string; - publish_at: string; - hero: Media; - gallery: Array; - attachments: Array; -} - -export interface Article { - id: string; - title: string; - slug: string; - user: User; - content: string; - publish_at: string; - hero: Media; - attachments: Array; - created_at: string; - updated_at: string; -} - -export interface ArticleResponse { - article: Article; -} - -export interface ArticleCollection { - articles: Array
; - total: number; -} - -export interface User { - id: string; - username: string; - email: string; - first_name: string; - last_name: string; - phone: string; - display_name: string; -} - -export interface UserResponse { - user: User; -} - -export interface UserCollection { - users: Array; - total: number; -} - -export interface LoginResponse { - user: User; - token: string; -} - -export interface LogsDiscordResponse { - log: { - output: string; - error: string; - }; -} - -export interface Shortlink { - id: number; - code: string; - url: string; - used: number; -} - -export interface ShortlinkCollection { - shortlinks: Array; - total: number; -} - -export interface ShortlinkResponse { - shortlink: Shortlink; -} - -export interface ApiInfo { - version: string; - max_upload_size: number; -} diff --git a/resources/js/helpers/array.ts b/resources/js/helpers/array.ts deleted file mode 100644 index 10d1667..0000000 --- a/resources/js/helpers/array.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Test if array has a match using basic search (* means anything) - * - * @param {Array} arr The array to search. - * @param {string} str The string to find. - * @returns {boolean} if the array has the string. - */ -export const arrayHasBasicMatch = ( - arr: Array, - str: string -): boolean => { - let matches = false; - - arr.every((elem) => { - elem = elem.replace(/[|\\{}()[\]^$+?.]/g, "\\$&"); - const regex = new RegExp("^" + elem.replace("*", ".*?") + "$", "i"); - if (str.match(regex)) { - matches = true; - } - return !matches; - }); - - return matches; -}; diff --git a/resources/js/helpers/datetime.ts b/resources/js/helpers/datetime.ts deleted file mode 100644 index 7b6e9f7..0000000 --- a/resources/js/helpers/datetime.ts +++ /dev/null @@ -1,462 +0,0 @@ -export class SMDate { - date: Date | null = null; - dayString: string[] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; - - fullDayString: string[] = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - ]; - - monthString: string[] = [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - ]; - - fullMonthString: string[] = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ]; - - constructor( - dateOrString: string | Date = "", - options: { format?: string; utc?: boolean } = {}, - ) { - this.date = null; - - if (typeof dateOrString === "string") { - if (dateOrString.length > 0) { - this.parse(dateOrString, options); - } - } else if ( - dateOrString instanceof Date && - !Number.isNaN(dateOrString.getTime()) - ) { - this.date = dateOrString; - } - } - - /** - * Parse a string date into a Date object - * @param {string} dateString The date string. - * @param {object} options (optional) Options object. - * @param {string} options.format (optional) The format of the date string. - * @param {boolean} options.utc (optional) The date string is UTC. - * @returns {SMDate} SMDate object. - */ - public parse( - dateString: string, - { format = "dmy", utc = false } = {}, - ): SMDate { - const now = new Date(); - let time = ""; - - if (dateString.toLowerCase() === "now") { - this.date = now; - return this; - } - - // Cache regular expressions - const isoDateRegex = - /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,10})?Z$/i; - const timeRegex = - /^(\d+)(?::(\d+))?(?::(\d+))? ?(am?|a\.m\.|pm?|p\.m\.)?$/i; - - // Test if the dateString is in ISO 8601 - if (isoDateRegex.test(dateString)) { - format = "YMd"; - [dateString, time] = dateString.split("T"); - time = time.slice(0, -8); - } - - // Split the date string into an array of components based on the length of each date component - const components = dateString.split(/[ /-]/); - - const [day, month, year] = - format === "dmy" - ? components - : format === "mdy" - ? [components[1], components[0], components[2]] - : [components[2], components[1], components[0]]; - - if (year === undefined || year.length === 3 || year.length >= 5) { - return this; - } - - // numeric - for (const component of [day, month, year]) { - if (isNaN(parseInt(component))) { - return this; - } - } - - const parsedDay = parseInt(day.padStart(2, "0"), 10); - const parsedMonth = this.getMonthAsNumber(month); - const parsedYear = parseInt(year.padStart(4, "20"), 10); - let parsedHours: number = 0, - parsedMinutes: number = 0, - parsedSeconds: number = 0; - - if (time.length == 0 && components.length > 3) { - time = components.slice(3).join(" "); - } - const parsedTime = timeRegex.exec(time); - if (time && parsedTime) { - const [_, hourStr, minuteStr, secondStr, ampm] = parsedTime; - parsedHours = parseInt(hourStr); - parsedMinutes = parseInt(minuteStr || "0"); - parsedSeconds = parseInt(secondStr || "0"); - - if (parsedHours < 0 || parsedHours > 23) { - return this; - } - - if (ampm) { - if (/pm/i.test(ampm) && parsedHours < 12) { - parsedHours += 12; - } else if (/am/i.test(ampm) && parsedHours === 12) { - parsedHours = 0; - } - } - - if ( - parsedMinutes < 0 || - parsedMinutes > 59 || - parsedSeconds < 0 || - parsedSeconds > 59 - ) { - return this; - } - - time = `${parsedHours.toString().padStart(2, "0")}:${parsedMinutes - .toString() - .padStart(2, "0")}:${parsedSeconds - .toString() - .padStart(2, "0")}`; - } else { - time = "00:00:00"; - } - - const date = utc - ? new Date( - Date.UTC( - parsedYear, - parsedMonth - 1, - parsedDay, - parsedHours, - parsedMinutes, - parsedSeconds, - ), - ) - : new Date( - parsedYear, - parsedMonth - 1, - parsedDay, - parsedHours, - parsedMinutes, - parsedSeconds, - ); - - if (isNaN(date.getTime())) { - return this; - } - - if (utc) { - const isoDate = date.toISOString(); - const checkYear = parseInt(isoDate.substring(0, 4), 10); - const checkMonth = parseInt(isoDate.substring(5, 7), 10); - const checkDay = new Date(isoDate).getUTCDate(); - const checkHours = parseInt(isoDate.substring(11, 13), 10); - const checkMinutes = parseInt(isoDate.substring(14, 16), 10); - const checkSeconds = parseInt(isoDate.substring(17, 19), 10); - if ( - checkYear !== parsedYear || - checkMonth !== parsedMonth || - checkDay !== parsedDay || - checkHours !== parsedHours || - checkMinutes !== parsedMinutes || - checkSeconds !== parsedSeconds - ) { - return this; - } - } else { - if ( - date.getFullYear() !== parsedYear || - date.getMonth() + 1 !== parsedMonth || - date.getDate() !== parsedDay || - date.getHours() !== parsedHours || - date.getMinutes() !== parsedMinutes || - date.getSeconds() !== parsedSeconds - ) { - return this; - } - } - - this.date = date; - return this; - } - - /** - * Format the date to a string. - * @param {string} format The format to return. - * @param {object} options (optional) Function options. - * @param {boolean} options.utc (optional) Format the date to be as UTC instead of local. - * @returns {string} The formatted date. - */ - public format(format: string, options: { utc?: boolean } = {}): string { - if (this.date == null) { - return ""; - } - - let result = format; - - let year: string, - month: string, - date: string, - day: number, - hour: string, - min: string, - sec: string; - if (options.utc) { - const isoDate = this.date.toISOString(); - year = isoDate.substring(0, 4); - month = isoDate.substring(5, 7); - date = isoDate.substring(8, 10); - day = new Date(isoDate).getUTCDay(); - hour = isoDate.substring(11, 13); - min = isoDate.substring(14, 16); - sec = isoDate.substring(17, 19); - } else { - year = this.date.getFullYear().toString(); - month = (this.date.getMonth() + 1).toString(); - date = this.date.getDate().toString(); - day = this.date.getDay(); - hour = this.date.getHours().toString(); - min = this.date.getMinutes().toString(); - sec = this.date.getSeconds().toString(); - } - - const apm = parseInt(hour, 10) >= 12 ? "pm" : "am"; - /* eslint-disable indent */ - const apmhours = ( - parseInt(hour, 10) > 12 - ? parseInt(hour, 10) - 12 - : parseInt(hour, 10) == 0 - ? 12 - : parseInt(hour, 10) - ).toString(); - /* eslint-enable indent */ - - // year - result = result.replace(/\byy\b/g, year.slice(-2)); - result = result.replace(/\byyyy\b/g, year); - - // month - result = result.replace(/\bM\b/g, month); - result = result.replace(/\bMM\b/g, (0 + month).slice(-2)); - result = result.replace( - /\bMMM\b/g, - this.monthString[parseInt(month) - 1], - ); - result = result.replace( - /\bMMMM\b/g, - this.fullMonthString[parseInt(month) - 1], - ); - - // day - result = result.replace(/\bd\b/g, date); - result = result.replace(/\bdd\b/g, (0 + date).slice(-2)); - result = result.replace(/\bEEE\b/g, this.dayString[day]); - result = result.replace(/\bEEEE\b/g, this.fullDayString[day]); - - // hour - result = result.replace(/\bH\b/g, hour); - result = result.replace(/\bHH\b/g, (0 + hour).slice(-2)); - result = result.replace(/\bh\b/g, apmhours); - result = result.replace(/\bhh\b/g, (0 + apmhours).slice(-2)); - - // min - result = result.replace(/\bm\b/g, min); - result = result.replace(/\bmm\b/g, (0 + min).slice(-2)); - - // sec - result = result.replace(/\bs\b/g, sec); - result = result.replace(/\bss\b/g, (0 + sec).slice(-2)); - - // am/pm - result = result.replace(/\baa\b/g, apm); - result = result.replace(/\bAA\b/g, apm.toUpperCase()); - - return result; - } - - /** - * Return a relative date string from now. - * @returns {string} A relative date string. - */ - public relative(): string { - if (this.date === null) { - return ""; - } - - const now = new Date(); - let dif = Math.round((now.getTime() - this.date.getTime()) / 1000); - const format = dif < 0 ? "in %" : "% ago"; - dif = Math.abs(dif); - - if (dif < 60) { - return "Just now"; - } else if (dif < 3600) { - const v = Math.round(dif / 60); - return format.replace("%", `${v} min${v != 1 ? "s" : ""}`); - } else if (dif < 86400) { - const v = Math.round(dif / 3600); - return format.replace("%", `${v} hour${v != 1 ? "s" : ""}`); - } else if (dif < 604800) { - const v = Math.round(dif / 86400); - return format.replace("%", `${v} day${v != 1 ? "s" : ""}`); - } else if (dif < 2419200) { - const v = Math.round(dif / 604800); - return format.replace("%", `${v} week${v != 1 ? "s" : ""}`); - } else { - return ( - this.monthString[this.date.getMonth()] + - " " + - this.date.getDate() + - ", " + - this.date.getFullYear() - ); - } - } - - /** - * If the date is before the passed date. - * @param {Date|SMDate} d (optional) The date to check. If none, use now - * @returns {boolean} If the date is before the passed date. - */ - public isBefore(d: Date | SMDate = new SMDate("now")): boolean { - const otherDate = d instanceof SMDate ? d.date : d; - if (otherDate == null) { - return false; - } - - if (this.date == null) { - return true; - } - - return otherDate > this.date; - } - - /** - * If the date is after the passed date. - * @param {Date|SMDate} d (optional) The date to check. If none, use now - * @returns {boolean} If the date is after the passed date. - */ - public isAfter(d: Date | SMDate = new SMDate("now")): boolean { - const otherDate = d instanceof SMDate ? d.date : d; - if (otherDate == null) { - return false; - } - - if (this.date == null) { - return true; - } - - return otherDate < this.date; - } - - /** - * Return a month number from a string or a month number or month name - * @param {string} monthString The month string as number or name - * @returns {number} The month number - */ - private getMonthAsNumber(monthString: string): number { - const months = this.fullMonthString.map((month) => month.toLowerCase()); - - const shortMonths = months.map((month) => month.slice(0, 3)); - const monthIndex = months.indexOf(monthString.toLowerCase()); - if (monthIndex !== -1) { - return monthIndex + 1; - } - const shortMonthIndex = shortMonths.indexOf(monthString.toLowerCase()); - if (shortMonthIndex !== -1) { - return shortMonthIndex + 1; - } - const monthNumber = parseInt(monthString, 10); - if (!isNaN(monthNumber) && monthNumber >= 1 && monthNumber <= 12) { - return monthNumber; - } - - return 0; - } - - /** - * Test if the current date is valid. - * @returns {boolean} If the current date is valid. - */ - public isValid(): boolean { - return this.date !== null; - } - - /** - * Return a string with only the first occurrence of characters - * @param {string} str The string to modify. - * @param {string} characters The characters to use to test. - * @returns {string} A string that only contains the first occurrence of the characters. - */ - private onlyFirstOccurrence( - str: string, - characters: string = "dMy", - ): string { - let findCharacters = characters.split(""); - const replaceRegex = new RegExp("[^" + characters + "]", "g"); - let result = ""; - - str = str.replace(replaceRegex, ""); - if (str.length > 0) { - str.split("").forEach((strChar) => { - if ( - findCharacters.length > 0 && - findCharacters.includes(strChar) - ) { - result += strChar; - - const index = findCharacters.findIndex( - (findChar) => findChar === strChar, - ); - if (index !== -1) { - findCharacters = findCharacters - .slice(0, index) - .concat(findCharacters.slice(index + 1)); - } - } - }); - } - - return result; - } -} diff --git a/resources/js/helpers/debounce.ts b/resources/js/helpers/debounce.ts deleted file mode 100644 index 3200e6e..0000000 --- a/resources/js/helpers/debounce.ts +++ /dev/null @@ -1,27 +0,0 @@ -type DebounceCallback = (...args: unknown[]) => void; -type DebounceResult = (...args: unknown[]) => void; - -/** - * Call a function after a delay once. - * - * @param {Function} fn The function to call. - * @param {number} delay The delay before calling function. - * @returns {void} - */ -export const debounce = ( - fn: DebounceCallback, - delay: number -): DebounceResult => { - let timeoutID: NodeJS.Timeout | null = null; - return (...args) => { - if (timeoutID != null) { - clearTimeout(timeoutID); - } - - // eslint-disable-next-line @typescript-eslint/no-this-alias - const that = this; - timeoutID = setTimeout(function () { - fn.apply(that, args); - }, delay); - }; -}; diff --git a/resources/js/helpers/form.ts b/resources/js/helpers/form.ts deleted file mode 100644 index 3f132cb..0000000 --- a/resources/js/helpers/form.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { ApiResponse } from "./api"; -import { - createValidationResult, - defaultValidationResult, - ValidationObject, - ValidationResult, -} from "./validate"; - -type FormObjectValidateFunction = (item?: string | null) => Promise; -type FormObjectLoadingFunction = (state?: boolean) => boolean; -type FormObjectMessageFunction = ( - message?: string, - type?: string, - icon?: string, -) => void; -type FormObjectErrorFunction = (message: string) => void; -type FormObjectApiErrorsFunction = ( - apiErrors: ApiResponse, - callback?: (error: string, status: number) => void, -) => void; - -export interface FormObject { - validate: FormObjectValidateFunction; - loading: FormObjectLoadingFunction; - message: FormObjectMessageFunction; - error: FormObjectErrorFunction; - apiErrors: FormObjectApiErrorsFunction; - _loading: boolean; - _message: string; - _messageType: string; - _messageIcon: string; - controls: { [key: string]: FormControlObject }; -} - -const defaultFormObject: FormObject = { - validate: async function (item = null) { - const keys = item ? [item] : Object.keys(this.controls); - let valid = true; - - await Promise.all( - keys.map(async (key) => { - if ( - typeof this.controls[key] == "object" && - Object.keys(this.controls[key]).includes("validation") - ) { - const validationResult = await this.controls[ - key - ].validation.validator.validate(this.controls[key].value); - this.controls[key].validation.result = validationResult; - - if (!validationResult.valid) { - valid = false; - } - } - }), - ); - - return valid; - }, - loading: function (state = undefined) { - if (state !== undefined) { - this._loading = state; - } - - return this._loading; - }, - message: function (message = "", type = "", icon = "") { - this._message = message; - - if (type.length > 0) { - this._messageType = type; - } - if (icon.length > 0) { - this._messageIcon = icon; - } - }, - error: function (message = "") { - if (message == "") { - this.message(""); - } else { - this.message(message, "error", "alert-circle-outline"); - } - }, - apiErrors: function ( - apiResponse: ApiResponse, - callback?: (error: string, status: number) => void, - ) { - let foundKeys = false; - - if ( - apiResponse.data && - typeof apiResponse.data === "object" && - "errors" in apiResponse.data - ) { - const errors = apiResponse.data.errors as Record; - Object.keys(errors).forEach((key) => { - if ( - typeof this.controls[key] === "object" && - Object.keys(this.controls[key]).includes("validation") - ) { - foundKeys = true; - this.controls[key].validation.result = - createValidationResult(false, errors[key]); - } - }); - } - - if (foundKeys == false) { - const errorMessage = - (apiResponse?.json?.message as string) || - "An unknown server error occurred.\nPlease try again later."; - - if (callback) { - callback(errorMessage, apiResponse.status); - } else { - this.error(errorMessage); - } - } - }, - controls: {}, - - _loading: false, - _message: "", - _messageType: "primary", - _messageIcon: "", -}; - -/** - * Create a new Form object. - * @param {Record} controls The controls included in the form. - * @returns {FormObject} Returns a form object. - */ -export const Form = ( - controls: Record, -): FormObject => { - const form = { ...defaultFormObject }; - form.controls = controls; - - form._loading = false; - form._message = ""; - form._messageType = "primary"; - form._messageIcon = ""; - - return form; -}; - -interface FormControlValidation { - validator: ValidationObject; - result: ValidationResult; -} - -const getDefaultFormControlValidation = (): FormControlValidation => { - return { - validator: { - validate: async (): Promise => { - return defaultValidationResult; - }, - }, - result: defaultValidationResult, - }; -}; - -type FormControlClearValidations = () => void; -type FormControlSetValidation = ( - valid: boolean, - message?: string | Array, -) => void; -type FormControlIsValid = () => boolean; - -export interface FormControlObject { - value: unknown; - validate: () => Promise; - validation: FormControlValidation; - clearValidations: FormControlClearValidations; - setValidationResult: FormControlSetValidation; - isValid: FormControlIsValid; -} - -/** - * Create a new form control object. - * @param {string} value The control name. - * @param {ValidationObject | null} validator The control validation rules. - * @returns {FormControlObject} The form control object. - */ -export const FormControl = ( - value: unknown = "", - validator: ValidationObject | null = null, -): FormControlObject => { - return { - value: value, - validation: - validator == null - ? getDefaultFormControlValidation() - : { - validator: validator, - result: defaultValidationResult, - }, - clearValidations: function () { - this.validation.result = defaultValidationResult; - }, - setValidationResult: function ( - valid: boolean, - message?: string | Array, - ) { - this.validation.result = createValidationResult(valid, message); - }, - validate: async function () { - if (this.validation.validator) { - this.validation.result = - await this.validation.validator.validate(this.value); - - return this.validation.result; - } - - return defaultValidationResult; - }, - isValid: function () { - return this.validation.result.valid; - }, - }; -}; diff --git a/resources/js/helpers/image.ts b/resources/js/helpers/image.ts deleted file mode 100644 index 48cee62..0000000 --- a/resources/js/helpers/image.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { ImportMetaExtras } from "../../../import-meta"; -import { urlStripAttributes } from "./url"; - -type ImageLoadCallback = (url: string) => void; - -export const imageLoad = ( - url: string, - callback: ImageLoadCallback, - postfix = "size=thumb" -) => { - if ( - url.startsWith((import.meta as ImportMetaExtras).env.APP_URL) === true - ) { - callback(urlStripAttributes(url) + "?" + postfix); - const tmp = new Image(); - tmp.onload = function () { - callback(url); - }; - tmp.src = url; - } else { - // Image is not one we control - callback(url); - } -}; - -export const imageSize = (size: string, url: string) => { - const availableSizes = [ - "thumb", - "small", - "medium", - "large", - "xlarge", - "xxlarge", - ]; - if (availableSizes.includes(size)) { - if ( - url.startsWith((import.meta as ImportMetaExtras).env.APP_URL) === - true || - url.startsWith("/") === true - ) { - return `${url}?size=${size}`; - } - } - - return url; -}; - -// Thumb 150 x 150 -export const imageThumb = (url: string) => { - return imageSize("thumb", url); -}; - -// Small 300 x 300 -export const imageSmall = (url: string) => { - return imageSize("small", url); -}; - -// Small 640 x 640 -export const imageMedium = (url: string) => { - return imageSize("medium", url); -}; - -// Large 1024 x 1024 -export const imageLarge = (url: string) => { - return imageSize("large", url); -}; - -// Large 1536 x 1536 -export const imageXLarge = (url: string) => { - return imageSize("xlarge", url); -}; - -// Large 2560 x 2560 -export const imageXXLarge = (url: string) => { - return imageSize("xxlarge", url); -}; - -// Full size -export const imageFull = (url: string) => { - return imageSize("full", url); -}; diff --git a/resources/js/helpers/media.ts b/resources/js/helpers/media.ts deleted file mode 100644 index bcca2c9..0000000 --- a/resources/js/helpers/media.ts +++ /dev/null @@ -1,309 +0,0 @@ -import { ImportMetaExtras } from "../../../import-meta"; -import { Media, MediaJob } from "./api.types"; -import { strCaseCmp, toTitleCase } from "./string"; - -export const mediaGetVariantUrl = ( - media: Media, - variant = "scaled", -): string => { - if (!media) { - return ""; - } - - // If the variant is 'original', return the media url - if (variant === "original") { - return media.url; - } - - // If the variant key exists in media.variants, return the corresponding variant URL - if (media.variants && media.variants[variant]) { - return media.url.replace(media.name, media.variants[variant]); - } - - // If the variant key does not exist, return the 'scaled' variant - return media.variants && media.variants["scaled"] - ? media.url.replace(media.name, media.variants["scaled"]) - : media.url; -}; - -/** - * Convert a Media URL to a user friendly URL - * @param {Media|string} mediaOrString Media object or URL string - * @returns {string} User friendly URL - */ -export const mediaGetWebURL = (mediaOrString: Media | string): string => { - const webUrl = (import.meta as ImportMetaExtras).env.APP_URL; - const apiUrl = (import.meta as ImportMetaExtras).env.APP_URL_API; - - let url = - typeof mediaOrString === "string" - ? mediaOrString - : (mediaOrString as Media).url; - - // If the input is a string, use it as the URL directly - if (typeof mediaOrString === "string") { - return url; - } - - // Is the URL an API request? - if (url.startsWith(apiUrl)) { - const fileUrlPath = url.substring(apiUrl.length); - const fileUrlParts = fileUrlPath.split("/"); - - if ( - fileUrlParts.length >= 4 && - fileUrlParts[0].length === 0 && - strCaseCmp("media", fileUrlParts[1]) === true && - strCaseCmp("download", fileUrlParts[3]) === true - ) { - url = webUrl + "/file/" + fileUrlParts[2]; - } - } - - return url; -}; - -/** - * Check if a mime matches. - * @param {string} mimeExpected The mime expected. - * @param {string} mimeToCheck The mime to check. - * @returns {boolean} The mimeToCheck matches mimeExpected. - */ -export const mimeMatches = ( - mimeExpected: string, - mimeToCheck: string, -): boolean => { - if (mimeExpected.length == 0) { - mimeExpected = "*"; - } - - const escapedExpectation = mimeExpected.replace( - /[.*+?^${}()|[\]\\]/g, - "\\$&", - ); - const pattern = escapedExpectation.replace(/\\\*/g, ".*"); - const regex = new RegExp(`^${pattern}$`); - - return regex.test(mimeToCheck); -}; - -/** - * MediaGetThumbnailCallback Type - */ -export type mediaGetThumbnailCallback = (url: string) => void; - -/** - * Get Media/File Thumbnail. - * @param {Media|File} media The Media/File object. - * @param {string|null} useVariant The variable to use. - * @param {mediaGetThumbnailCallback|null} callback Callback with the thumbnail. Required when passing File. - * @returns {string} The thumbnail url. - */ -export const mediaGetThumbnail = ( - media: Media | File, - useVariant: string | null = "", - callback: mediaGetThumbnailCallback | null = null, -): string => { - let url: string = ""; - - if (media) { - if (media instanceof File) { - if (callback != null) { - if (mimeMatches("image/*", media.type) == true) { - const reader = new FileReader(); - - reader.onload = function (e) { - callback(e.target.result.toString()); - }; - - reader.readAsDataURL(media); - return ""; - } - } - } else { - if ( - useVariant && - useVariant != "" && - useVariant != null && - media.variants && - media.variants[useVariant] - ) { - url = media.url.replace(media.name, media.variants[useVariant]); - } else if (media.thumbnail && media.thumbnail.length > 0) { - url = media.thumbnail; - } else if (media.variants && media.variants["thumb"]) { - url = media.url.replace(media.name, media.variants["thumb"]); - } - } - - if (url === "") { - url = "/assets/fileicons/unknown.webp"; - } - } - - if (callback != null) { - callback(url); - return ""; - } - - return url; -}; - -/** - * Check if the media is currently busy. - * @param {Media} media The media item to check. - * @returns {boolean} If the media is busy. - */ -export const mediaIsBusy = (media: Media): boolean => { - let busy = false; - - if (media.jobs) { - media.jobs.forEach((item) => { - if ( - item.status != "invalid" && - item.status != "complete" && - item.status != "failed" - ) { - busy = true; - } - }); - } - - return busy; -}; - -interface MediaStatus { - busy: boolean; - status: string; - status_text: string; - progress: number; -} - -/** - * Get the current Media status - * @param {Media} media The media item to check. - * @returns {MediaStatus} The media status. - */ -export const getMediaStatus = (media: Media): MediaStatus => { - const status = { - busy: false, - status: "", - status_text: "", - progress: 0, - }; - - if (media.jobs) { - for (const item of media.jobs) { - if ( - item.status != "invalid" && - item.status != "complete" && - item.status != "failed" - ) { - status.busy = true; - status.status = item.status; - status.status_text = item.status_text; - status.progress = item.progress; - break; - } - } - } - - return status; -}; - -/** - * Get the current Media status Text - * @param {Media} media The media item to check. - * @returns {string} Human readable string. - */ -export const getMediaStatusText = (media: Media): string => { - let status = ""; - - if (media.jobs.length > 0) { - if ( - media.jobs[0].status != "invalid" && - media.jobs[0].status != "failed" && - media.jobs[0].status != "complete" - ) { - if (media.jobs[0].status_text != "") { - status = toTitleCase(media.jobs[0].status_text); - } else { - status = toTitleCase(media.jobs[0].status); - } - - if (media.jobs[0].progress_max != 0) { - status += ` ${Math.floor( - (media.jobs[0].progress / media.jobs[0].progress_max) * 100, - )}%`; - } - } - } - - return status; -}; - -export interface MediaParams { - id?: string; - user_id?: string; - title?: string; - name?: string; - mime_type?: string; - permission?: string; - size?: number; - storage?: string; - url?: string; - thumbnail?: string; - description?: string; - dimensions?: string; - variants?: { [key: string]: string }; - created_at?: string; - updated_at?: string; - jobs?: Array; -} - -export interface MediaJobParams { - id?: string; - media_id?: string; - user_id?: string; - status?: string; - status_text?: string; - progress?: number; - progress_max?: number; -} - -export const createMediaItem = (params?: MediaParams): Media => { - const media = { - id: params.id || "", - user_id: params.user_id || "", - title: params.title || "", - name: params.name || "", - mime_type: params.mime_type || "", - permission: params.permission || "", - size: params.size !== undefined ? params.size : 0, - storage: params.storage || "", - url: params.url || "", - thumbnail: params.thumbnail || "", - description: params.description || "", - dimensions: params.dimensions || "", - variants: params.variants || {}, - created_at: params.created_at || "", - updated_at: params.updated_at || "", - jobs: params.jobs || [], - }; - - return media; -}; - -export const createMediaJobItem = (params?: MediaJobParams): MediaJob => { - const job = { - id: params.id || "", - media_id: params.media_id || "", - user_id: params.user_id || "", - status: params.status || "", - status_text: params.status_text || "", - progress: params.progress || 0, - progress_max: params.progress_max || 0, - }; - - return job; -}; diff --git a/resources/js/helpers/object.ts b/resources/js/helpers/object.ts deleted file mode 100644 index efa73a2..0000000 --- a/resources/js/helpers/object.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Sort a objects properties alphabetically - * - * @param {Record} obj The object to sort - * @returns {Record} The object sorted - */ -export const sortProperties = ( - obj: Record -): Record => { - // convert object into array - const sortable: [string, unknown][] = []; - for (const key in obj) - if (Object.prototype.hasOwnProperty.call(obj, key)) - sortable.push([key, obj[key]]); // each item is an array in format [key, value] - - // sort items by value - sortable.sort(function (a, b) { - const x = String(a[1]).toLowerCase(), - y = String(b[1]).toLowerCase(); - return x < y ? -1 : x > y ? 1 : 0; - }); - - const sortedObj: Record = {}; - sortable.forEach((item) => { - sortedObj[item[0]] = item[1]; - }); - - return sortedObj; // array in format [ [ key1, val1 ], [ key2, val2 ], ... ] -}; diff --git a/resources/js/helpers/seo.ts b/resources/js/helpers/seo.ts deleted file mode 100644 index 38df10d..0000000 --- a/resources/js/helpers/seo.ts +++ /dev/null @@ -1,53 +0,0 @@ -export interface SEOTags { - title: string; - description: string; - keywords: string[]; - robots: { - index: boolean; - follow: boolean; - }; - url: string; - image: string; -} - -export const updateSEOTags = (tags: SEOTags): void => { - const updateTag = ( - tag: string, - queryAttribName: string, - queryAttribValue: string, - updateAttribName: string, - updateAttribValue: string - ) => { - const existingTag = document.querySelector( - `${tag}[${queryAttribName}="${queryAttribValue}"]` - ); - if (existingTag) { - existingTag.setAttribute(updateAttribName, updateAttribValue); - } else { - const metaTag = document.createElement(tag); - metaTag.setAttribute(queryAttribName, queryAttribValue); - metaTag.setAttribute(updateAttribName, updateAttribValue); - document.head.appendChild(metaTag); - } - }; - - const robotsIndexValue = tags.robots.index ? "index" : "noindex"; - const robotsFollowValue = tags.robots.follow ? "follow" : "nofollow"; - const robotsValue = `${robotsIndexValue}, ${robotsFollowValue}`; - - document.title = `STEMMechanics | ${tags.title}`; - updateTag("meta", "name", "description", "content", tags.description); - updateTag("meta", "name", "keywords", "content", tags.keywords.join(", ")); - updateTag("meta", "name", "robots", "content", robotsValue); - updateTag("link", "rel", "canonical", "href", tags.url); - updateTag("meta", "property", "og:title", "content", tags.title); - updateTag( - "meta", - "property", - "og:description", - "content", - tags.description - ); - updateTag("meta", "property", "og:image", "content", tags.image); - updateTag("meta", "property", "og:url", "content", tags.url); -}; diff --git a/resources/js/helpers/square.ts b/resources/js/helpers/square.ts deleted file mode 100644 index 2897706..0000000 --- a/resources/js/helpers/square.ts +++ /dev/null @@ -1,36 +0,0 @@ -const appId = "sandbox-sq0idb-FYI93DDPJk0wJvaU0ye4MQ"; -const locationId = "LQ0C6GMZEWVQ0"; -const square = null; - -export const initCard = (): Object => { - const scriptSrc = "https://sandbox.web.squarecdn.com/v1/square.js"; - if (!document.querySelector(`script[src="${scriptSrc}"]`)) { - const script = document.createElement("script"); - script.type = "text/javascript"; - script.src = scriptSrc; - script.onload = async () => { - if (!window.Square) { - console.log("Square failed to load properly"); - } - - let payments; - try { - payments = window.Square.payments(appId, locationId); - } catch (e) { - console.log("Square: Missing credentials", e); - return; - } - - let card; - try { - card = await payments.card(); - await card.attach("#card-container"); - } catch (e) { - console.error("Initializing Card failed", e); - return; - } - }; - - document.head.appendChild(script); - } -}; diff --git a/resources/js/helpers/string.ts b/resources/js/helpers/string.ts deleted file mode 100644 index 282c9c4..0000000 --- a/resources/js/helpers/string.ts +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Transforms a string to title case. - * @param {string} str The string to transform. - * @returns {string} A string transformed to title case. - */ -export const toTitleCase = (str: string): string => { - // Replace underscores and hyphens with spaces - str = str.replace(/[_-]+/g, " "); - - // Capitalize the first letter of each word and make the rest lowercase - str = str.replace(/\b\w+\b/g, (txt) => { - return txt.charAt(0).toUpperCase() + txt.slice(1).toLowerCase(); - }); - - // Replace "cdn" with "CDN" - str = str.replace(/\bCdn\b/gi, "CDN"); - - return str; -}; - -/** - * Convert a string to a excerpt. - * @param {string} txt The text to convert. - * @param {number} maxLen (optional) The maximum length of the excerpt. - * @param {boolean} strip (optional) Strip HTML tags from the text. - * @param stripHtml - * @returns {string} The excerpt. - */ -export function excerpt( - txt: string, - maxLen: number = 150, - stripHtml: boolean = true, -): string { - if (stripHtml) { - txt = txt.replace(/<[^>]+>/g, "").replace(/ /g, " "); - } - - const words = txt.trim().split(/\s+/); - let curLen = 0; - const excerptWords: string[] = []; - - for (const word of words) { - if (curLen + word.length + 1 > maxLen) { - break; - } - curLen += word.length + 1; - excerptWords.push(word); - } - - let excerpt = excerptWords.join(" "); - if (curLen < txt.length) { - excerpt += "..."; - } - - return excerpt; -} - -/** - * String HTML tags from text. - * @param {string} txt The text to strip tags. - * @returns {string} The stripped text. - */ -export const stripHtmlTags = (txt: string): string => { - return txt.replace(/<(p|br)([ /]*?>|[ /]+.*?>)|<[a-zA-Z/][^>]+(>|$)/g, " "); -}; - -/** - * Replace HTML entities with real characters. - * @param {string} txt The text to transform. - * @returns {string} Transformed text - */ -export const replaceHtmlEntities = (txt: string): string => { - const translate_re = /&(nbsp|amp|quot|lt|gt);/g; - - return txt.replace(translate_re, function (match, entity) { - switch (entity) { - case "nbsp": - return " "; - case "amp": - return "&"; - case "quot": - return '"'; - case "lt": - return "<"; - case "gt": - return ">"; - default: - return match; - } - }); -}; - -/** - * Convert a string to a number, ignoring items like dollar signs, etc. - * @param {string} str The string to convert to a number - * @returns {number} A number with the minimum amount of decimal places (or 0) - */ -export const stringToNumber = (str: string): number => { - str = str.replace(/[^\d.-]/g, ""); - const num = parseFloat(str); - return isNaN(num) ? 0 : Number(num.toFixed(2)); -}; - -/** - * Convert a number or string to a price (0 or 0.00). - * @param {number|string} numOrString The number of string to convert to a price. - * @returns {string} The converted result. - */ -export const toPrice = (numOrString: number | string): string => { - const num = - typeof numOrString === "string" - ? stringToNumber(numOrString) - : numOrString; - return num.toFixed(num % 1 === 0 ? 0 : 2); -}; - -/** - * Compare 2 strings case insensitive - * @param {string} string1 The first string for comparison. - * @param {string} string2 The second string for comparison. - * @returns {boolean} If the strings match. - */ -export const strCaseCmp = (string1: string, string2: string): boolean => { - if (string1 !== undefined && string2 !== undefined) { - return string1.toLowerCase() === string2.toLowerCase(); - } - - return false; -}; diff --git a/resources/js/helpers/transition.ts b/resources/js/helpers/transition.ts deleted file mode 100644 index 7230a89..0000000 --- a/resources/js/helpers/transition.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { Ref } from "vue"; - -/** - * Return the browser transiton end name. - * - * @returns {string} The browser transition end name. - */ -const transitionEndEventName = (): string => { - const el = document.createElement("div"), - transitions: Record = { - transition: "transitionend", - OTransition: "otransitionend", - MozTransition: "transitionend", - WebkitTransition: "webkitTransitionEnd", - }; - - for (const i in transitions) { - if ( - Object.prototype.hasOwnProperty.call(transitions, i) && - el.style[i] !== undefined - ) { - return transitions[i]; - } - } - - return ""; -}; - -/** - * Wait for the element to render as Promise - * - * @param elem The - * @returns - */ -const waitForElementRender = (elem: Ref): Promise => { - return new Promise((resolve) => { - if (document.contains(elem.value)) { - return resolve(elem.value as HTMLElement); - } - - /* eslint-disable @typescript-eslint/no-explicit-any */ - const MutationObserver = - window.MutationObserver || - (window as any).WebKitMutationObserver || - (window as any).MozMutationObserver; - /* eslint-enable @typescript-eslint/no-explicit-any */ - const observer = new MutationObserver(() => { - if (document.contains(elem.value)) { - resolve(elem.value); - observer.disconnect(); - } - }); - - observer.observe(document.body, { - childList: true, - subtree: true, - }); - }); -}; - -/** - * Run the enter transition on a element. - * - * @param {Ref} elem The element to run the enter transition. - * @param {string} transition The transition name. - * @returns {void} - */ -export const transitionEnter = (elem: Ref, transition: string): void => { - waitForElementRender(elem) - .then((e: HTMLElement) => { - window.setTimeout(() => { - e.classList.replace( - transition + "-enter-from", - transition + "-enter-active" - ); - const transitionName = transitionEndEventName(); - e.addEventListener( - transitionName, - () => { - e.classList.replace( - transition + "-enter-active", - transition + "-enter-to" - ); - }, - false - ); - }, 1); - }) - .catch(() => { - /* empty */ - }); -}; - -/** - * Run the exit transition on a element then call a callback. - * - * @param {Ref} elem The element to run the enter transition. - * @param {string} transition The transition name. - * @param {TransitionLeaveCallback|null} callback The callback to run after the transition finishes. - * @returns {void} - */ -type TransitionLeaveCallback = () => void; - -export const transitionLeave = ( - elem: Ref, - transition: string, - callback: TransitionLeaveCallback | null = null -): void => { - elem.value.classList.remove(transition + "-enter-to"); - elem.value.classList.add(transition + "-leave-from"); - window.setTimeout(() => { - elem.value.classList.replace( - transition + "-leave-from", - transition + "-leave-active" - ); - const transitionName = transitionEndEventName(); - elem.value.addEventListener( - transitionName, - () => { - elem.value.classList.replace( - transition + "-leave-active", - transition + "-leave-to" - ); - if (callback) { - callback(); - } - }, - false - ); - }, 1); -}; diff --git a/resources/js/helpers/types.ts b/resources/js/helpers/types.ts deleted file mode 100644 index 940aa0e..0000000 --- a/resources/js/helpers/types.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Test if target is a boolean - * @param {unknown} target The varible to test - * @returns {boolean} If the varible is a boolean type - */ -export function isBool(target: unknown): boolean { - return typeof target === "boolean"; -} - -/** - * Test if target is a number - * @param {unknown} target The varible to test - * @returns {boolean} If the varible is a number type - */ -export function isNumber(target: unknown): boolean { - return typeof target === "number"; -} - -/** - * Test if target is an object - * @param {unknown} target The varible to test - * @returns {boolean} If the varible is a object type - */ -export function isObject(target: unknown): boolean { - return typeof target === "object" && target !== null; -} - -/** - * Test if target is a string - * @param {unknown} target The varible to test - * @returns {boolean} If the varible is a string type - */ -export function isString(target: unknown): boolean { - return typeof target === "string" && target !== null; -} - -/** - * Convert bytes to a human readable string. - * @param {number} bytes The bytes to convert. - * @param {number} decimalPlaces The number of places to force. - * @returns {string} The bytes in human readable string. - */ -export const bytesReadable = ( - bytes: number, - decimalPlaces: number = undefined, -): string => { - if (Number.isNaN(bytes)) { - return "0 Bytes"; - } - - if (Math.abs(bytes) < 1024) { - return bytes + " Bytes"; - } - - const units = ["KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; - let u = -1; - const r = 10 ** 1; - let tempBytes = bytes; - - while ( - Math.round(Math.abs(tempBytes) * r) / r >= 1024 && - u < units.length - 1 - ) { - tempBytes /= 1024; - ++u; - } - - if (decimalPlaces === undefined) { - return tempBytes.toFixed(2).replace(/\.?0+$/, "") + " " + units[u]; - } - - return tempBytes.toFixed(decimalPlaces) + " " + units[u]; -}; diff --git a/resources/js/helpers/url.ts b/resources/js/helpers/url.ts deleted file mode 100644 index 2941407..0000000 --- a/resources/js/helpers/url.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { RouteLocationNormalizedLoaded, Router } from "vue-router"; - -export const urlStripAttributes = (url: string): string => { - const urlObject = new URL(url); - urlObject.search = ""; - urlObject.hash = ""; - return urlObject.toString(); -}; - -export const urlMatches = ( - fullUrl: string, - testPath: string | string[], -): boolean | number => { - // Remove query string and fragment identifier from both URLs - const urlWithoutParams = fullUrl.split(/[?#]/)[0]; - - if (Array.isArray(testPath)) { - // Iterate over the array of test paths and return the index of the first matching path - for (let i = 0; i < testPath.length; i++) { - const pathWithoutParams = testPath[i].split(/[?#]/)[0]; - // Remove trailing slashes from both URLs - const trimmedUrl = urlWithoutParams.replace(/\/$/, ""); - const trimmedPath = pathWithoutParams.replace(/\/$/, ""); - // Check if both URLs contain a domain and port - const hasDomainAndPort = - /^https?:\/\/[^/]+\//.test(trimmedUrl) && - /^https?:\/\/[^/]+\//.test(trimmedPath); - - if (hasDomainAndPort) { - // Do a full test with both URLs - if (trimmedUrl === trimmedPath) { - return i; - } - } else { - // Remove the domain and test the paths - const urlWithoutDomain = trimmedUrl.replace( - /^https?:\/\/[^/]+/, - "", - ); - const pathWithoutDomain = trimmedPath.replace( - /^https?:\/\/[^/]+/, - "", - ); - if (urlWithoutDomain === pathWithoutDomain) { - return i; - } - } - } - // If no matching path is found, return false - return false; - } else { - const pathWithoutParams = testPath.split(/[?#]/)[0]; - // Remove trailing slashes from both URLs - const trimmedUrl = urlWithoutParams.replace(/\/$/, ""); - const trimmedPath = pathWithoutParams.replace(/\/$/, ""); - // Check if both URLs contain a domain and port - const hasDomainAndPort = - /^https?:\/\/[^/]+\//.test(trimmedUrl) && - /^https?:\/\/[^/]+\//.test(trimmedPath); - - if (hasDomainAndPort) { - // Do a full test with both URLs - return trimmedUrl === trimmedPath; - } else { - // Remove the domain and test the paths - const urlWithoutDomain = trimmedUrl.replace( - /^https?:\/\/[^/]+/, - "", - ); - const pathWithoutDomain = trimmedPath.replace( - /^https?:\/\/[^/]+/, - "", - ); - return urlWithoutDomain === pathWithoutDomain; - } - } -}; - -interface Params { - [key: string]: string; -} - -export const updateRouterParams = (router: Router, params: Params): void => { - const query = { ...router.currentRoute.value.query }; - - Object.entries(params).forEach(([key, value]) => { - if (value === "") { - if (key in params) { - delete query[key]; - } - } else { - query[key] = value; - } - }); - - router.push({ query }); -}; - -export const getRouterParam = ( - route: RouteLocationNormalizedLoaded, - param: string, - defaultValue: string = "", -): string => { - if (route.query[param] !== undefined) { - const val = route.query[param]; - - if (Array.isArray(val) == true) { - if (val.length > 0) { - return val[0]; - } - - return defaultValue; - } - - return val.toString(); - } - - return defaultValue; -}; - -export const extractFileNameFromUrl = (url: string): string => { - const matches = url.match(/\/([^/]+\.[^/]+)$/); - if (!matches) { - return ""; - } - const fileName = matches[1]; - return fileName; -}; - -export const addQueryParam = ( - url: string, - name: string, - value: string, -): string => { - const urlObject = new URL(url); - const queryParams = new URLSearchParams(urlObject.search); - - if (queryParams.has(name)) { - queryParams.set(name, value); - } else { - // Add the new query parameter - queryParams.append(name, value); - } - - urlObject.search = queryParams.toString(); - return urlObject.toString(); -}; diff --git a/resources/js/helpers/utils.ts b/resources/js/helpers/utils.ts deleted file mode 100644 index b2e7bd6..0000000 --- a/resources/js/helpers/utils.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { useUserStore } from "../store/UserStore"; -import { extractFileNameFromUrl } from "./url"; - -/** - * Tests if an object or string is empty. - * @param {unknown} value The object or string. - * @returns {boolean} If the object or string is empty. - */ -export const isEmpty = (value: unknown): boolean => { - if (typeof value === "string") { - return value.trim().length === 0; - } else if ( - value instanceof File || - value instanceof Blob || - value instanceof Map || - value instanceof Set - ) { - return value.size === 0; - } else if (value instanceof FormData) { - return [...value.entries()].length === 0; - } else if (typeof value === "object") { - return !value || Object.keys(value).length === 0; - } - - return false; -}; - -/** - * Returns the file extension - * @param {string} fileName The filename with extension. - * @returns {string} The file extension. - */ -export const getFileExtension = (fileName: string): string => { - if (fileName.includes(".")) { - return fileName.split(".").pop(); - } - - return ""; -}; - -/** - * Returns a url to a file type icon based on file name. - * @param {string} fileName The filename with extension. - * @returns {string} The url to the file type icon. - */ -export const getFileIconImagePath = (fileName: string): string => { - const ext = getFileExtension(fileName); - if (ext.length > 0) { - return `/assets/fileicons/${ext}.webp`; - } - - return "/assets/fileicons/unknown.webp"; -}; - -/** - * Returns a url to a file preview icon based on file url. - * @param {string} url The url of the file. - * @returns {string} The url to the file preview icon. - */ -export const getFilePreview = (url: string): string => { - const ext = getFileExtension(extractFileNameFromUrl(url)); - if (ext.length > 0) { - if (/(gif|jpe?g|png)/i.test(ext)) { - return `${url}?size=thumb`; - } - - return `/assets/fileicons/${ext}.webp`; - } - - return "/assets/fileicons/unknown.webp"; -}; - -/** - * Clamps a number between 2 numbers. - * @param {number} n The number to clamp. - * @param {number} min The minimum allowable number. - * @param {number} max The maximum allowable number. - * @returns {number} The clamped number. - */ -export const clamp = (n: number, min: number, max: number): number => { - if (n < min) return min; - if (n > max) return max; - return n; -}; - -type RandomIDVerifyCallback = (id: string) => boolean; - -/** - * Generate a random ID. - * @param {string} prefix Any prefix to add to the ID. - * @param {number} length The length of the ID string (default = 6). - * @param {RandomIDVerifyCallback|null} callback Callback that if returns true generates a ID string. - * @returns {string} A random string. - */ -export const generateRandomId = ( - prefix: string = "", - length: number = 6, - callback: RandomIDVerifyCallback | null = null, -): string => { - let randomId = ""; - const letters = - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; - - do { - randomId = prefix; - for (let i = 0; i < length; i++) { - randomId += letters.charAt( - Math.floor(Math.random() * letters.length), - ); - } - } while (callback != null ? callback(randomId) : false); - - return randomId; -}; - -/** - * Generate a random element ID. - * @param {string} prefix Any prefix to add to the ID. - * @param {number} length The length of the ID string (default = 6). - * @returns {string} A random string non-existent in the document. - */ -export const generateRandomElementId = ( - prefix: string = "", - length: number = 6, -): string => { - return generateRandomId(prefix, length, (s) => { - return document.getElementById(s) != null; - }); -}; - -/** - * Return if the current user has a permission. - * @param {string} permission The permission to check. - * @returns {boolean} If the user has the permission. - */ -export const userHasPermission = (permission: string): boolean => { - const userStore = useUserStore(); - return userStore.permissions && userStore.permissions.includes(permission); -}; - -/** - * Convert File Name to Title - * @param {string} fileName The filename with extension. - * @returns {string} The title. - */ -export const convertFileNameToTitle = (fileName: string): string => { - // Remove file extension - fileName = fileName.replace(/\.[^/.]+$/, ""); - - // Replace underscores with space - fileName = fileName.replace(/_/g, " "); - - // Replace dashes that are not surrounded by spaces with space - fileName = fileName.replace(/(? { - return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test( - uuid - ); -}; - -/** - * Generates a random UUID. - * - * @returns {string} A random UUID. - */ -export const randomUUID = (): string => { - return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => { - const r = (Math.random() * 16) | 0; - const v = c === "x" ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); -}; diff --git a/resources/js/helpers/validate.ts b/resources/js/helpers/validate.ts deleted file mode 100644 index 5904830..0000000 --- a/resources/js/helpers/validate.ts +++ /dev/null @@ -1,978 +0,0 @@ -import { bytesReadable } from "../helpers/types"; -import { SMDate } from "./datetime"; -import { isEmpty } from "../helpers/utils"; - -export interface ValidationObject { - validate: (value: unknown) => Promise; -} - -export interface ValidationResult { - valid: boolean; - invalidMessages: Array; -} - -export const defaultValidationResult: ValidationResult = { - valid: true, - invalidMessages: [], -}; - -export const createValidationResult = ( - valid: boolean, - message: string | Array = "" -) => { - if (typeof message == "string") { - message = [message]; - } - - return { - valid: valid, - invalidMessages: message, - }; -}; - -/** - * Validation Min - */ -const VALIDATION_MIN_TYPE = ["String", "Number"]; -type ValidationMinType = (typeof VALIDATION_MIN_TYPE)[number]; - -interface ValidationMinOptions { - min: number; - type?: ValidationMinType; - invalidMessage?: string | ((options: ValidationMinOptions) => string); -} - -interface ValidationMinObject extends ValidationMinOptions { - validate: (value: string) => Promise; -} - -const defaultValidationMinOptions: ValidationMinOptions = { - min: 1, - type: "String", - invalidMessage: (options: ValidationMinOptions) => { - return options.type == "String" - ? `Required to be at least ${options.min} characters.` - : `Required to be at least ${options.min}.`; - }, -}; - -export function Min( - minOrOptions: number | ValidationMinOptions, - options?: ValidationMinOptions -); -export function Min(options: ValidationMinOptions): ValidationMinObject; - -/** - * Validate field length or number is at minimum or higher/larger - * - * @param minOrOptions minimum number or options data - * @param options options data - * @returns ValidationMinObject - */ -export function Min( - minOrOptions: number | ValidationMinOptions, - options?: ValidationMinOptions -): ValidationMinObject { - if (typeof minOrOptions === "number") { - options = { ...defaultValidationMinOptions, ...(options || {}) }; - options.min = minOrOptions; - } else { - options = { ...defaultValidationMinOptions, ...(minOrOptions || {}) }; - } - - return { - ...options, - validate: function (value: string): Promise { - return Promise.resolve({ - valid: - this.type == "String" - ? value.toString().length >= this.min - : parseInt(value) >= this.min, - invalidMessages: [ - typeof this.invalidMessage === "string" - ? this.invalidMessage - : this.invalidMessage(this), - ], - }); - }, - }; -} - -/** - * Validation Max - */ -const VALIDATION_MAX_TYPE = ["String", "Number"]; -type ValidationMaxType = (typeof VALIDATION_MAX_TYPE)[number]; - -interface ValidationMaxOptions { - max: number; - type?: ValidationMaxType; - invalidMessage?: string | ((options: ValidationMaxOptions) => string); -} - -interface ValidationMaxObject extends ValidationMaxOptions { - validate: (value: string) => Promise; -} - -const defaultValidationMaxOptions: ValidationMaxOptions = { - max: 1, - type: "String", - invalidMessage: (options: ValidationMaxOptions) => { - return options.type == "String" - ? `Required to be less than ${options.max + 1} characters.` - : `Required to be less than ${options.max + 1}.`; - }, -}; - -export function Max( - maxOrOptions: number | ValidationMaxOptions, - options?: ValidationMaxOptions -): ValidationMaxObject; -export function Max(options: ValidationMaxOptions): ValidationMaxObject; - -/** - * Validate field length or number is at maximum or smaller - * - * @param maxOrOptions maximum number or options data - * @param options options data - * @returns ValidationMaxObject - */ -export function Max( - maxOrOptions: number | ValidationMaxOptions, - options?: ValidationMaxOptions -): ValidationMaxObject { - if (typeof maxOrOptions === "number") { - options = { ...defaultValidationMaxOptions, ...(options || {}) }; - options.max = maxOrOptions; - } else { - options = { ...defaultValidationMaxOptions, ...(maxOrOptions || {}) }; - } - - return { - ...options, - validate: function (value: string): Promise { - return Promise.resolve({ - valid: - this.type == "String" - ? value.toString().length <= this.max - : parseInt(value) <= this.max, - invalidMessages: [ - typeof this.invalidMessage === "string" - ? this.invalidMessage - : this.invalidMessage(this), - ], - }); - }, - }; -} - -/** - * Validation Length - */ -interface ValidationLengthOptions { - length: number; - invalidMessage?: string | ((options: ValidationLengthOptions) => string); -} - -interface ValidationLengthObject extends ValidationLengthOptions { - validate: (value: string) => Promise; -} - -const defaultValidationLengthOptions: ValidationLengthOptions = { - length: 1, - invalidMessage: (options: ValidationLengthOptions) => { - return `Required to be ${options.length} characters.`; - }, -}; - -export function Length( - lengthOrOptions: number | ValidationLengthOptions, - options?: ValidationLengthOptions -): ValidationLengthObject; -export function Length( - options: ValidationLengthOptions -): ValidationLengthObject; - -/** - * Validate field length - * - * @param lengthOrOptions string length or options data - * @param options options data - * @returns ValidationLengthObject - */ -export function Length( - lengthOrOptions: number | ValidationLengthOptions, - options?: ValidationLengthOptions -): ValidationLengthObject { - if (typeof lengthOrOptions === "number") { - options = { ...defaultValidationLengthOptions, ...(options || {}) }; - options.length = lengthOrOptions; - } else { - options = { - ...defaultValidationLengthOptions, - ...(lengthOrOptions || {}), - }; - } - - return { - ...options, - validate: function (value: string): Promise { - return Promise.resolve({ - valid: value.toString().length == this.length, - invalidMessages: [ - typeof this.invalidMessage === "string" - ? this.invalidMessage - : this.invalidMessage(this), - ], - }); - }, - }; -} - -/** - * PASSWORD - */ -interface ValidationPasswordOptions { - invalidMessage?: string | ((options: ValidationPasswordOptions) => string); -} - -interface ValidationPasswordObject extends ValidationPasswordOptions { - validate: (value: string) => Promise; -} - -const defaultValidationPasswordOptions: ValidationPasswordOptions = { - invalidMessage: - "Your password needs to have at least a letter, a number and a special character.", -}; - -/** - * Validate field is in a valid password format - * - * @param options options data - * @returns ValidationPasswordObject - */ -export function Password( - options?: ValidationPasswordOptions -): ValidationPasswordObject { - options = { ...defaultValidationPasswordOptions, ...(options || {}) }; - - return { - ...options, - validate: function (value: string): Promise { - return Promise.resolve({ - valid: /(?=.*[A-Za-z])(?=.*\d)(?=.*[.@$!%*#?&])[A-Za-z\d.@$!%*#?&]{1,}$/.test( - value - ), - invalidMessages: [ - typeof this.invalidMessage === "string" - ? this.invalidMessage - : this.invalidMessage(this), - ], - }); - }, - }; -} - -/** - * EMAIL - */ -interface ValidationEmailOptions { - invalidMessage?: string | ((options: ValidationEmailOptions) => string); -} - -interface ValidationEmailObject extends ValidationEmailOptions { - validate: (value: string) => Promise; -} - -const defaultValidationEmailOptions: ValidationEmailOptions = { - invalidMessage: "Your email is not in a supported format.", -}; - -/** - * Validate field is in a valid Email format - * - * @param options options data - * @returns ValidationEmailObject - */ -export function Email(options?: ValidationEmailOptions): ValidationEmailObject { - options = { ...defaultValidationEmailOptions, ...(options || {}) }; - - return { - ...options, - validate: function (value: string): Promise { - return Promise.resolve({ - valid: - value.length == 0 || - /^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$/.test(value), - invalidMessages: [ - typeof this.invalidMessage === "string" - ? this.invalidMessage - : this.invalidMessage(this), - ], - }); - }, - }; -} - -/** - * PHONE - */ -interface ValidationPhoneOptions { - invalidMessage?: string | ((options: ValidationPhoneOptions) => string); -} - -interface ValidationPhoneObject extends ValidationPhoneOptions { - validate: (value: string) => Promise; -} - -const defaultValidationPhoneOptions: ValidationPhoneOptions = { - invalidMessage: "Your Phone number is not in a supported format.", -}; - -/** - * Validate field is in a valid Phone format - * - * @param options options data - * @returns ValidationPhoneObject - */ -export function Phone(options?: ValidationPhoneOptions): ValidationPhoneObject { - options = { ...defaultValidationPhoneOptions, ...(options || {}) }; - - return { - ...options, - validate: function (value: string): Promise { - return Promise.resolve({ - valid: - value.length == 0 || - /^(\+|00)?[0-9][0-9 \-().]{7,32}$/.test(value), - invalidMessages: [ - typeof this.invalidMessage === "string" - ? this.invalidMessage - : this.invalidMessage(this), - ], - }); - }, - }; -} - -/** - * NUMBER - */ -interface ValidationNumberOptions { - invalidMessage?: string | ((options: ValidationNumberOptions) => string); -} - -interface ValidationNumberObject extends ValidationNumberOptions { - validate: (value: string) => Promise; -} - -const defaultValidationNumberOptions: ValidationNumberOptions = { - invalidMessage: "Must be a number.", -}; - -/** - * Validate field is in a valid Whole number format - * - * @param options options data - * @returns ValidationNumberObject - */ -export function Number( - options?: ValidationNumberOptions -): ValidationNumberObject { - options = { ...defaultValidationNumberOptions, ...(options || {}) }; - - return { - ...options, - validate: function (value: string): Promise { - return Promise.resolve({ - valid: value.length == 0 || /^0?\d+$/.test(value), - invalidMessages: [ - typeof this.invalidMessage === "string" - ? this.invalidMessage - : this.invalidMessage(this), - ], - }); - }, - }; -} - -/** - * DATE - */ -interface ValidationDateOptions { - before?: string | ((value: string) => string); - after?: string | ((value: string) => string); - invalidMessage?: string | ((options: ValidationDateOptions) => string); - invalidBeforeMessage?: - | string - | ((options: ValidationDateOptions) => string); - invalidAfterMessage?: string | ((options: ValidationDateOptions) => string); -} - -interface ValidationDateObject extends ValidationDateOptions { - validate: (value: string) => Promise; -} - -const defaultValidationDateOptions: ValidationDateOptions = { - before: "", - after: "", - invalidMessage: "Must be a valid date.", - invalidBeforeMessage: (options: ValidationDateOptions) => { - return `Must be a date before ${options.before}.`; - }, - invalidAfterMessage: (options: ValidationDateOptions) => { - return `Must be a date after ${options.after}.`; - }, -}; - -/** - * Validate field is in a valid Date format - * - * @param options options data - * @returns ValidationDateObject - */ -export function Date(options?: ValidationDateOptions): ValidationDateObject { - options = { ...defaultValidationDateOptions, ...(options || {}) }; - - return { - ...options, - validate: function (value: string): Promise { - let valid = true; - let invalidMessageType = "invalidMessage"; - - const parsedDate = new SMDate(value); - - if (parsedDate.isValid() == true) { - const beforeDate = new SMDate( - typeof (options["before"] = options?.before || "") === - "function" - ? options.before(value) - : options.before - ); - const afterDate = new SMDate( - typeof (options["after"] = options?.after || "") === - "function" - ? options.after(value) - : options.after - ); - if ( - beforeDate.isValid() == true && - parsedDate.isBefore(beforeDate) == false - ) { - valid = false; - invalidMessageType = "invalidBeforeMessage"; - } - if ( - afterDate.isValid() == true && - parsedDate.isAfter(afterDate) == false - ) { - valid = false; - invalidMessageType = "invalidAfterMessage"; - } - } else { - valid = false; - } - - return Promise.resolve({ - valid: valid, - invalidMessages: [ - typeof this[invalidMessageType] === "string" - ? this[invalidMessageType] - : this[invalidMessageType](this), - ], - }); - }, - }; -} - -/** - * TIME - */ -interface ValidationTimeOptions { - before?: string | ((value: string) => string); - after?: string | ((value: string) => string); - invalidMessage?: string | ((options: ValidationTimeOptions) => string); - invalidBeforeMessage?: - | string - | ((options: ValidationTimeOptions) => string); - invalidAfterMessage?: string | ((options: ValidationTimeOptions) => string); -} - -interface ValidationTimeObject extends ValidationTimeOptions { - validate: (value: string) => Promise; -} - -const defaultValidationTimeOptions: ValidationTimeOptions = { - before: "", - after: "", - invalidMessage: "Must be a valid time.", - invalidBeforeMessage: (options: ValidationTimeOptions) => { - return `Must be a time before ${options.before}.`; - }, - invalidAfterMessage: (options: ValidationTimeOptions) => { - return `Must be a time after ${options.after}.`; - }, -}; - -/** - * Validate field is in a valid Time format - * - * @param options options data - * @returns ValidationTimeObject - */ -export function Time(options?: ValidationTimeOptions): ValidationTimeObject { - options = { ...defaultValidationTimeOptions, ...(options || {}) }; - - return { - ...options, - validate: function (value: string): Promise { - let valid = true; - let invalidMessageType = "invalidMessage"; - - const parsedTime = new SMDate(value); - if (parsedTime.isValid() == true) { - const beforeTime = new SMDate( - typeof (options["before"] = options?.before || "") === - "function" - ? options.before(value) - : options.before - ); - const afterTime = new SMDate( - typeof (options["after"] = options?.after || "") === - "function" - ? options.after(value) - : options.after - ); - - if ( - beforeTime.isValid() == true && - parsedTime.isBefore(beforeTime) == false - ) { - valid = false; - invalidMessageType = "invalidBeforeMessage"; - } - if ( - afterTime.isValid() == true && - parsedTime.isAfter(afterTime) == false - ) { - valid = false; - invalidMessageType = "invalidAfterMessage"; - } - } else { - valid = false; - } - - return Promise.resolve({ - valid: valid, - invalidMessages: [ - typeof this[invalidMessageType] === "string" - ? this[invalidMessageType] - : this[invalidMessageType](this), - ], - }); - }, - }; -} - -/** - * DATETIME - */ -interface ValidationDateTimeOptions { - before?: string | ((value: string) => string); - after?: string | ((value: string) => string); - invalidMessage?: string | ((options: ValidationDateTimeOptions) => string); - invalidBeforeMessage?: - | string - | ((options: ValidationDateTimeOptions) => string); - invalidAfterMessage?: - | string - | ((options: ValidationDateTimeOptions) => string); -} - -interface ValidationDateTimeObject extends ValidationDateTimeOptions { - validate: (value: string) => Promise; -} - -const defaultValidationDateTimeOptions: ValidationDateTimeOptions = { - before: "", - after: "", - invalidMessage: "Must be a valid date and time.", - invalidBeforeMessage: (options: ValidationDateTimeOptions) => { - return `Must be a date/time before ${options.before}.`; - }, - invalidAfterMessage: (options: ValidationDateTimeOptions) => { - return `Must be a date/time after ${options.after}.`; - }, -}; - -/** - * Validate field is in a valid Date format - * - * @param options options data - * @returns ValidationDateObject - */ -export function DateTime( - options?: ValidationDateTimeOptions -): ValidationDateTimeObject { - options = { ...defaultValidationDateTimeOptions, ...(options || {}) }; - - return { - ...options, - validate: function (value: string): Promise { - let valid = true; - let invalidMessageType = "invalidMessage"; - - const parsedDate = new SMDate(value); - - if (parsedDate.isValid() == true) { - const beforeDate = new SMDate( - typeof (options["before"] = options?.before || "") === - "function" - ? options.before(value) - : options.before - ); - const afterDate = new SMDate( - typeof (options["after"] = options?.after || "") === - "function" - ? options.after(value) - : options.after - ); - if ( - beforeDate.isValid() == true && - parsedDate.isBefore(beforeDate) == false - ) { - valid = false; - invalidMessageType = "invalidBeforeMessage"; - } - if ( - afterDate.isValid() == true && - parsedDate.isAfter(afterDate) == false - ) { - valid = false; - invalidMessageType = "invalidAfterMessage"; - } - } else { - valid = false; - } - - return Promise.resolve({ - valid: valid, - invalidMessages: [ - typeof this[invalidMessageType] === "string" - ? this[invalidMessageType] - : this[invalidMessageType](this), - ], - }); - }, - }; -} - -/** - * CUSTOM - */ -type ValidationCustomCallback = (value: string) => Promise; - -interface ValidationCustomOptions { - callback: ValidationCustomCallback; - invalidMessage?: string | ((options: ValidationCustomOptions) => string); -} - -interface ValidationCustomObject extends ValidationCustomOptions { - validate: (value: string) => Promise; -} - -const defaultValidationCustomOptions: ValidationCustomOptions = { - callback: async () => { - return true; - }, - invalidMessage: "This field is invalid.", -}; - -export function Custom( - callbackOrOptions: ValidationCustomCallback | ValidationCustomOptions, - options?: ValidationCustomOptions -); -export function Custom( - options: ValidationCustomOptions -): ValidationCustomObject; - -/** - * Validate field is in a valid Custom format - * - * @param callbackOrOptions - * @param options options data - * @returns ValidationCustomObject - */ -export function Custom( - callbackOrOptions: ValidationCustomCallback | ValidationCustomOptions, - options?: ValidationCustomOptions -): ValidationCustomObject { - if (typeof callbackOrOptions === "function") { - options = { ...defaultValidationCustomOptions, ...(options || {}) }; - options.callback = callbackOrOptions; - } else { - options = { - ...defaultValidationCustomOptions, - ...(callbackOrOptions || {}), - }; - } - - return { - ...options, - validate: async function (value: string): Promise { - const validateResult = { - valid: true, - invalidMessages: [ - typeof this.invalidMessage === "string" - ? this.invalidMessage - : this.invalidMessage(this), - ], - }; - - const callbackResult = - typeof this.callback === "function" - ? await this.callback(value) - : true; - - if (typeof callbackResult === "string") { - if (callbackResult.length > 0) { - validateResult.valid = false; - validateResult.invalidMessages = [callbackResult]; - } - } else if (callbackResult !== true) { - validateResult.valid = false; - } - - return validateResult; - }, - }; -} - -/** - * And - * - * @param list - */ -export const And = (list: Array) => { - return { - list: list, - validate: async function (value: string) { - const validationResult: ValidationResult = { - valid: true, - invalidMessages: [], - }; - - await Promise.all( - this.list.map(async (item: ValidationObject) => { - const validationItemResult = await item.validate(value); - if (validationItemResult.valid == false) { - validationResult.valid = false; - validationResult.invalidMessages = - validationResult.invalidMessages.concat( - validationItemResult.invalidMessages - ); - } - }) - ); - - return validationResult; - }, - }; -}; - -/** - * Required - */ -interface ValidationRequiredOptions { - invalidMessage?: string | ((options: ValidationRequiredOptions) => string); -} - -interface ValidationRequiredObject extends ValidationRequiredOptions { - validate: (value: string) => Promise; -} - -const defaultValidationRequiredOptions: ValidationRequiredOptions = { - invalidMessage: "This field is required.", -}; - -/** - * Validate field contains value - * - * @param options options data - * @returns ValidationRequiredObject - */ -export function Required( - options?: ValidationRequiredOptions -): ValidationRequiredObject { - options = { ...defaultValidationRequiredOptions, ...(options || {}) }; - - return { - ...options, - validate: function (value: unknown): Promise { - return Promise.resolve({ - valid: !isEmpty(value), - invalidMessages: [ - typeof this.invalidMessage === "string" - ? this.invalidMessage - : this.invalidMessage(this), - ], - }); - }, - }; -} - -/** - * Required If - */ -type ValidationRequiredIfCheck = boolean | Array; - -interface ValidationRequiredIfOptions { - check: ValidationRequiredIfCheck; - invalidMessage?: - | string - | ((options: ValidationRequiredIfOptions) => string); -} - -interface ValidationRequiredIfObject extends ValidationRequiredIfOptions { - validate: (value: string) => Promise; -} - -const defaultValidationRequiredIfOptions: ValidationRequiredIfOptions = { - check: true, - invalidMessage: "This field is required.", -}; - -/** - * Validate field contains value - * - * @param checkOrOptions - * @param options options data - * @returns ValidationRequiredIfObject - */ -export function RequiredIf( - checkOrOptions: boolean | Array | ValidationRequiredIfOptions, - options?: ValidationRequiredIfOptions -): ValidationRequiredIfObject { - if ( - typeof checkOrOptions === "boolean" || - Array.isArray(checkOrOptions) === true - ) { - options = { ...defaultValidationRequiredIfOptions, ...(options || {}) }; - options.check = checkOrOptions; - } else { - options = { - ...defaultValidationRequiredIfOptions, - ...(checkOrOptions || {}), - }; - } - - options = { ...defaultValidationRequiredIfOptions, ...(options || {}) }; - - return { - ...options, - validate: function (value: unknown): Promise { - return Promise.resolve({ - valid: Array.isArray(value) - ? value.every((item) => !!item) - : value == true, - invalidMessages: [ - typeof this.invalidMessage === "string" - ? this.invalidMessage - : this.invalidMessage(this), - ], - }); - }, - }; -} - -/** - * Url - */ -interface ValidationUrlOptions { - invalidMessage?: string | ((options: ValidationUrlOptions) => string); -} - -interface ValidationUrlObject extends ValidationUrlOptions { - validate: (value: string) => Promise; -} - -const defaultValidationUrlOptions: ValidationUrlOptions = { - invalidMessage: "Not a supported Url format.", -}; - -/** - * Validate field is in a valid Email format - * - * @param options options data - * @returns ValidationEmailObject - */ -export function Url(options?: ValidationUrlOptions): ValidationUrlObject { - options = { ...defaultValidationUrlOptions, ...(options || {}) }; - - return { - ...options, - validate: function (value: string): Promise { - return Promise.resolve({ - valid: - value.length > 0 - ? /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*(:\d+)?([/?#][^\s]*)?$/.test( - value - ) - : true, - invalidMessages: [ - typeof this.invalidMessage === "string" - ? this.invalidMessage - : this.invalidMessage(this), - ], - }); - }, - }; -} - -/** - * FileSize - */ -interface ValidationFileSizeOptions { - size: number; - invalidMessage?: string | ((options: ValidationFileSizeOptions) => string); -} - -interface ValidationFileSizeObject extends ValidationFileSizeOptions { - validate: (value: File) => Promise; -} - -const defaultValidationFileSizeOptions: ValidationFileSizeOptions = { - size: 1024 * 1024 * 1024, // 1 Mb - invalidMessage: (options) => { - return `The file size must be less than ${bytesReadable(options.size)}`; - }, -}; - -/** - * Validate file is equal or less than size. - * - * @param options options data - * @returns ValidationEmailObject - */ -export function FileSize( - options?: ValidationFileSizeOptions -): ValidationFileSizeObject { - options = { ...defaultValidationFileSizeOptions, ...(options || {}) }; - - return { - ...options, - validate: function (value: File): Promise { - const isValid = - value instanceof File ? value.size < options.size : true; - - return Promise.resolve({ - valid: isValid, - invalidMessages: [ - typeof this.invalidMessage === "string" - ? this.invalidMessage - : this.invalidMessage(this), - ], - }); - }, - }; -} diff --git a/resources/js/lib/prism.js b/resources/js/lib/prism.js deleted file mode 100644 index 1608998..0000000 --- a/resources/js/lib/prism.js +++ /dev/null @@ -1,25 +0,0 @@ -/* PrismJS 1.29.0 -https://prismjs.com/download.html#themes=prism&languages=markup+clike+javascript+bash+c+javadoclike+js-extras+json+json5+log+markup-templating+objectivec+perl+php+phpdoc+php-extras+python+regex+sql+swift+typoscript+yaml */ -var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); -Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; -Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; -Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; -!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",a={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},n={bash:a,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:a}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:n},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:n.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},a.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=n.variable[1].inside,i=0;i>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean; -!function(e){function n(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(t,a,r,o){if(t.language===a){var c=t.tokenStack=[];t.code=t.code.replace(r,(function(e){if("function"==typeof o&&!o(e))return e;for(var r,i=c.length;-1!==t.code.indexOf(r=n(a,i));)++i;return c[i]=e,r})),t.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(t,a){if(t.language===a&&t.tokenStack){t.grammar=e.languages[a];var r=0,o=Object.keys(t.tokenStack);!function c(i){for(var u=0;u=o.length);u++){var g=i[u];if("string"==typeof g||g.content&&"string"==typeof g.content){var l=o[r],s=t.tokenStack[l],f="string"==typeof g?g:g.content,p=n(a,l),k=f.indexOf(p);if(k>-1){++r;var m=f.substring(0,k),d=new e.Token(a,e.tokenize(s,t.grammar),"language-"+a,s),h=f.substring(k+p.length),v=[];m&&v.push.apply(v,c([m])),v.push(d),h&&v.push.apply(v,c([h])),"string"==typeof g?i.splice.apply(i,[u,1].concat(v)):g.content=v}}else g.content&&c(g.content)}return i}(t.tokens)}}}})}(Prism); -!function(e){var a=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,n=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:a,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];e.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:a,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(a){/<\?/.test(a.code)&&e.languages["markup-templating"].buildPlaceholders(a,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(a){e.languages["markup-templating"].tokenizePlaceholders(a,"php")}))}(Prism); -!function(a){var e=a.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(e,"addSupport",{value:function(e,n){"string"==typeof e&&(e=[e]),e.forEach((function(e){!function(e,n){var t="doc-comment",r=a.languages[e];if(r){var o=r[t];if(o||(o=(r=a.languages.insertBefore(e,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[t]),o instanceof RegExp&&(o=r[t]={pattern:o}),Array.isArray(o))for(var i=0,s=o.length;i/g,(function(){return"(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*"})),e)}a.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+a.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),a.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+a.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),a.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),a.languages.insertBefore("javascript","keyword",{imports:{pattern:e("(\\bimport\\b\\s*)(?:(?:\\s*,\\s*(?:\\*\\s*as\\s+|\\{[^{}]*\\}))?|\\*\\s*as\\s+|\\{[^{}]*\\})(?=\\s*\\bfrom\\b)"),lookbehind:!0,inside:a.languages.javascript},exports:{pattern:e("(\\bexport\\b\\s*)(?:\\*(?:\\s*as\\s+)?(?=\\s*\\bfrom\\b)|\\{[^{}]*\\})"),lookbehind:!0,inside:a.languages.javascript}}),a.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),a.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),a.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:e("(\\.\\s*)#?"),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],r=0;r.]/,email:{pattern:/(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,lookbehind:!0,alias:"url"},"ip-address":{pattern:/\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/,alias:"constant"},"mac-address":{pattern:/\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,alias:"constant"},domain:{pattern:/(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,lookbehind:!0,alias:"constant"},uuid:{pattern:/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,alias:"constant"},hash:{pattern:/\b(?:[a-f0-9]{32}){1,2}\b/i,alias:"constant"},"file-path":{pattern:/\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,lookbehind:!0,greedy:!0,alias:"string"},date:{pattern:RegExp("\\b\\d{4}[-/]\\d{2}[-/]\\d{2}(?:T(?=\\d{1,2}:)|(?=\\s\\d{1,2}:))|\\b\\d{1,4}[-/ ](?:\\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\\d{2,4}T?\\b|\\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\\s{1,2}\\d{1,2}\\b","i"),alias:"number"},time:{pattern:/\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,alias:"number"},boolean:/\b(?:false|null|true)\b/i,number:{pattern:/(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,lookbehind:!0},operator:/[;:?<=>~/@!$%&+\-|^(){}*#]/,punctuation:/[\[\].,]/}; -Prism.languages.objectivec=Prism.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete Prism.languages.objectivec["class-name"],Prism.languages.objc=Prism.languages.objectivec; -!function(e){var n="(?:\\((?:[^()\\\\]|\\\\[^])*\\)|\\{(?:[^{}\\\\]|\\\\[^])*\\}|\\[(?:[^[\\]\\\\]|\\\\[^])*\\]|<(?:[^<>\\\\]|\\\\[^])*>)";e.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp("\\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp("\\b(?:m|qr)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","([a-zA-Z0-9])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2",n].join("|")+")[msixpodualngc]*"),greedy:!0},{pattern:RegExp("(^|[^-])\\b(?:s|tr|y)(?![a-zA-Z0-9])\\s*(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\2)[^\\\\]|\\\\[^])*\\2(?:(?!\\2)[^\\\\]|\\\\[^])*\\2","([a-zA-Z0-9])(?:(?!\\3)[^\\\\]|\\\\[^])*\\3(?:(?!\\3)[^\\\\]|\\\\[^])*\\3",n+"\\s*"+n].join("|")+")[msixpodualngcer]*"),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}}(Prism); -!function(a){var e="(?:\\b[a-zA-Z]\\w*|[|\\\\[\\]])+";a.languages.phpdoc=a.languages.extend("javadoclike",{parameter:{pattern:RegExp("(@(?:global|param|property(?:-read|-write)?|var)\\s+(?:"+e+"\\s+)?)\\$\\w+"),lookbehind:!0}}),a.languages.insertBefore("phpdoc","keyword",{"class-name":[{pattern:RegExp("(@(?:global|package|param|property(?:-read|-write)?|return|subpackage|throws|var)\\s+)"+e),lookbehind:!0,inside:{keyword:/\b(?:array|bool|boolean|callback|double|false|float|int|integer|mixed|null|object|resource|self|string|true|void)\b/,punctuation:/[|\\[\]()]/}}]}),a.languages.javadoclike.addSupport("php",a.languages.phpdoc)}(Prism); -Prism.languages.insertBefore("php","variable",{this:{pattern:/\$this\b/,alias:"keyword"},global:/\$(?:GLOBALS|HTTP_RAW_POST_DATA|_(?:COOKIE|ENV|FILES|GET|POST|REQUEST|SERVER|SESSION)|argc|argv|http_response_header|php_errormsg)\b/,scope:{pattern:/\b[\w\\]+::/,inside:{keyword:/\b(?:parent|self|static)\b/,punctuation:/::|\\/}}}); -Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; -!function(a){var e={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},n=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,t="(?:[^\\\\-]|"+n.source+")",s=RegExp(t+"-"+t),i={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"};a.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:s,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":e,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:n}},"special-escape":e,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":i}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; -Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp('(^|[^"#])(?:"(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^(])|[^\\\\\r\n"])*"|"""(?:\\\\(?:\\((?:[^()]|\\([^()]*\\))*\\)|[^(])|[^\\\\"]|"(?!""))*""")(?!["#])'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp('(^|[^"#])(#+)(?:"(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|\r\n|[^#])|[^\\\\\r\n])*?"|"""(?:\\\\(?:#+\\((?:[^()]|\\([^()]*\\))*\\)|[^#])|[^\\\\])*?""")\\2'),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp("#(?:(?:elseif|if)\\b(?:[ \t]*(?:![ \t]*)?(?:\\b\\w+\\b(?:[ \t]*\\((?:[^()]|\\([^()]*\\))*\\))?|\\((?:[^()]|\\([^()]*\\))*\\))(?:[ \t]*(?:&&|\\|\\|))?)+|(?:else|endif)\\b)"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift})); -!function(E){var n=/\b(?:ACT|ACTIFSUB|CARRAY|CASE|CLEARGIF|COA|COA_INT|CONSTANTS|CONTENT|CUR|EDITPANEL|EFFECT|EXT|FILE|FLUIDTEMPLATE|FORM|FRAME|FRAMESET|GIFBUILDER|GMENU|GMENU_FOLDOUT|GMENU_LAYERS|GP|HMENU|HRULER|HTML|IENV|IFSUB|IMAGE|IMGMENU|IMGMENUITEM|IMGTEXT|IMG_RESOURCE|INCLUDE_TYPOSCRIPT|JSMENU|JSMENUITEM|LLL|LOAD_REGISTER|NO|PAGE|RECORDS|RESTORE_REGISTER|TEMPLATE|TEXT|TMENU|TMENUITEM|TMENU_LAYERS|USER|USER_INT|_GIFBUILDER|global|globalString|globalVar)\b/;E.languages.typoscript={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:= \t]|(?:^|[^= \t])[ \t]+)\/\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|[^"'])#.*/,lookbehind:!0,greedy:!0}],function:[{pattern://,inside:{string:{pattern:/"[^"\r\n]*"|'[^'\r\n]*'/,inside:{keyword:n}},keyword:{pattern:/INCLUDE_TYPOSCRIPT/}}},{pattern:/@import\s*(?:"[^"\r\n]*"|'[^'\r\n]*')/,inside:{string:/"[^"\r\n]*"|'[^'\r\n]*'/}}],string:{pattern:/^([^=]*=[< ]?)(?:(?!\]\n).)*/,lookbehind:!0,inside:{function:/\{\$.*\}/,keyword:n,number:/^\d+$/,punctuation:/[,|:]/}},keyword:n,number:{pattern:/\b\d+\s*[.{=]/,inside:{operator:/[.{=]/}},tag:{pattern:/\.?[-\w\\]+\.?/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:|]/,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/},E.languages.tsconfig=E.languages.typoscript}(Prism); -!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); diff --git a/resources/js/main.js b/resources/js/main.js deleted file mode 100644 index f8497d1..0000000 --- a/resources/js/main.js +++ /dev/null @@ -1,12 +0,0 @@ -import Router from "@/router"; -import { createPinia } from "pinia"; -import piniaPluginPersistedstate from "pinia-plugin-persistedstate"; -import { createApp } from "vue"; -import App from "./views/App.vue"; -import "uno.css"; -import "../css/app.scss"; - -const pinia = createPinia(); -pinia.use(piniaPluginPersistedstate); - -createApp(App).use(pinia).use(Router).mount("#app"); diff --git a/resources/js/router/index.js b/resources/js/router/index.js deleted file mode 100644 index 19a54f3..0000000 --- a/resources/js/router/index.js +++ /dev/null @@ -1,619 +0,0 @@ -import { useUserStore } from "@/store/UserStore"; -import { createRouter, createWebHistory } from "vue-router"; -import { api } from "../helpers/api"; -import { useApplicationStore } from "../store/ApplicationStore"; -import { updateSEOTags } from "../helpers/seo"; - -export const routes = [ - { - path: "/", - name: "home", - meta: { - title: "Home", - description: - "STEMMechanics, a family-run company based in Cairns, Queensland, creates fantastic STEM-focused programs and activities that are both entertaining and educational.", - }, - component: () => import("@/views/Home.vue"), - }, - { - path: "/blog", - name: "blog", - meta: { - title: "Blog", - }, - component: () => import(/* webpackPrefetch: true */ "@/views/Blog.vue"), - }, - { - path: "/article", - redirect: "/blog", - children: [ - { - path: ":slug", - name: "article", - component: () => import("@/views/Article.vue"), - }, - ], - }, - { - path: "/workshops", - name: "workshops", - meta: { - title: "Workshops", - }, - component: () => - import(/* webpackPreload: true */ "@/views/Workshops.vue"), - }, - { - path: "/event", - redirect: "/workshops", - children: [ - { - path: ":id", - name: "event", - component: () => import("@/views/Event.vue"), - }, - ], - }, - { - path: "/verify-email", - name: "verify-email", - meta: { - title: "Verify Email", - }, - component: () => import("@/views/EmailVerify.vue"), - }, - { - path: "/resend-verify-email", - name: "resend-verify-email", - meta: { - title: "Resend Verification Email", - }, - component: () => import("@/views/ResendEmailVerify.vue"), - }, - { - path: "/reset-password", - name: "reset-password", - meta: { - title: "Reset Password", - }, - component: () => import("@/views/ResetPassword.vue"), - }, - { - path: "/privacy", - name: "privacy", - meta: { - title: "Privacy Policy", - }, - component: () => import("@/views/Privacy.vue"), - }, - { - path: "/rules", - name: "rules", - meta: { - title: "Rules", - }, - component: () => import("@/views/Rules.vue"), - }, - { - path: "/community", - name: "community", - meta: { - title: "Community", - }, - component: () => import("@/views/Community.vue"), - }, - { - path: "/minecraft", - children: [ - { - path: "", - name: "minecraft", - meta: { - title: "Minecraft", - }, - component: () => import("@/views/Minecraft.vue"), - }, - { - path: "curve", - name: "minecraft-curve", - meta: { - title: "Minecraft Curve", - }, - component: () => import("@/views/MinecraftCurve.vue"), - }, - ], - }, - { - path: "/login", - name: "login", - meta: { - title: "Login", - middleware: "guest", - }, - component: () => - import(/* webpackPrefetch: true */ "@/views/Login.vue"), - }, - { - path: "/logout", - name: "logout", - meta: { - title: "Logout", - }, - component: () => import("@/views/Logout.vue"), - }, - { - path: "/contact", - name: "contact", - meta: { - title: "Contact", - }, - component: () => - import(/* webpackPrefetch: true */ "@/views/Contact.vue"), - }, - { - path: "/conduct", - redirect: { name: "code-of-conduct" }, - }, - { - path: "/code-of-conduct", - name: "code-of-conduct", - meta: { - title: "Code of Conduct", - }, - component: () => import("@/views/CodeOfConduct.vue"), - }, - { - path: "/terms", - redirect: { name: "terms-and-conditions" }, - }, - { - path: "/terms-and-conditions", - name: "terms-and-conditions", - meta: { - title: "Terms and Conditions", - }, - component: () => import("@/views/TermsAndConditions.vue"), - }, - { - path: "/register", - name: "register", - meta: { - title: "Register", - }, - component: () => - import(/* webpackPrefetch: true */ "@/views/Register.vue"), - }, - { - path: "/dashboard", - children: [ - { - path: "", - name: "dashboard", - meta: { - title: "Dashboard", - middleware: "authenticated", - }, - component: () => - import( - /* webpackPrefetch: true */ "@/views/dashboard/Dashboard.vue" - ), - }, - { - path: "analytics", - children: [ - { - path: "", - name: "dashboard-analytics-list", - meta: { - title: "Analytics", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/AnalyticsList.vue"), - }, - { - path: ":id", - name: "dashboard-analytics-item", - meta: { - title: "Analytics Session", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/AnalyticsItem.vue"), - }, - ], - }, - { - path: "articles", - children: [ - { - path: "", - name: "dashboard-article-list", - meta: { - title: "Articles", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/ArticleList.vue"), - }, - { - path: "create", - name: "dashboard-article-create", - meta: { - title: "Create Article", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/ArticleEdit.vue"), - }, - { - path: ":id", - name: "dashboard-article-edit", - meta: { - title: "Edit Article", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/ArticleEdit.vue"), - }, - ], - }, - { - path: "events", - children: [ - { - path: "", - name: "dashboard-event-list", - meta: { - title: "Events", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/EventList.vue"), - }, - { - path: "create", - name: "dashboard-event-create", - meta: { - title: "Create Event", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/EventEdit.vue"), - }, - { - path: ":id", - name: "dashboard-event-edit", - meta: { - title: "Event", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/EventEdit.vue"), - }, - ], - }, - { - path: "details", - name: "dashboard-account-details", - meta: { - title: "Account Details", - middleware: "authenticated", - }, - component: () => import("@/views/dashboard/UserEdit.vue"), - }, - { - path: "users", - children: [ - { - path: "", - name: "dashboard-user-list", - meta: { - title: "Users", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/UserList.vue"), - }, - { - path: "create", - name: "dashboard-user-create", - meta: { - title: "Create User", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/UserEdit.vue"), - }, - { - path: ":id", - name: "dashboard-user-edit", - meta: { - title: "Edit User", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/UserEdit.vue"), - }, - ], - }, - { - path: "media", - children: [ - { - path: "", - name: "dashboard-media-list", - meta: { - title: "Media", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/MediaList.vue"), - }, - { - path: "create", - name: "dashboard-media-create", - meta: { - title: "Upload Media", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/MediaEdit.vue"), - }, - { - path: ":id", - name: "dashboard-media-edit", - meta: { - title: "Edit Media", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/MediaEdit.vue"), - }, - ], - }, - { - path: "shortlinks", - children: [ - { - path: "", - name: "dashboard-shortlink-list", - meta: { - title: "Shortlink", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/ShortlinkList.vue"), - }, - { - path: "create", - name: "dashboard-shortlink-create", - meta: { - title: "Create Shortlink", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/ShortlinkEdit.vue"), - }, - { - path: ":id", - name: "dashboard-shortlink-edit", - meta: { - title: "Edit Shortlink", - middleware: "authenticated", - }, - component: () => - import("@/views/dashboard/ShortlinkEdit.vue"), - }, - ], - }, - { - path: "discord-bot-logs", - name: "dashboard-discord-bot-logs", - meta: { - title: "Discord Bot Logs", - middleware: "authenticated", - }, - component: () => import("@/views/dashboard/DiscordBotLogs.vue"), - }, - ], - }, - { - path: "/forgot-password", - name: "forgot-password", - meta: { - title: "Forgot Password", - }, - component: () => import("@/views/ForgotPassword.vue"), - }, - { - path: "/file/:id", - name: "file", - meta: { - title: "File", - }, - component: () => import("@/views/File.vue"), - }, - { - path: "/cart", - name: "cart", - meta: { - title: "Cart", - }, - component: () => import("@/views/Cart.vue"), - }, - { - path: "/:catchAll(.*)", - name: "not-found", - meta: { - title: "Page not found", - hideInEditor: true, - }, - component: () => import("@/views/404.vue"), - }, -]; - -const router = createRouter({ - history: createWebHistory(), - routes, - scrollBehavior() { - return { top: 0 }; - }, -}); - -// export let activeRoutes = []; - -router.beforeEach(async (to, from, next) => { - const userStore = useUserStore(); - const applicationStore = useApplicationStore(); - - applicationStore.hydrated = false; - applicationStore.clearDynamicTitle(); - - if (applicationStore.pageLoaderTimeout !== 0) { - window.clearTimeout(applicationStore.pageLoaderTimeout); - applicationStore.pageLoaderTimeout = window.setTimeout(() => { - const pageLoadingElem = document.getElementById("sm-page-loading"); - if (pageLoadingElem !== null) { - pageLoadingElem.style.display = "flex"; - } - }, 0); - } - - if (to.meta.middleware == "authenticated") { - if (userStore.id) { - api.get({ - url: "/me", - }) - .then((res) => { - userStore.setUserDetails(res.data.user); - }) - .catch((err) => { - console.log(err); - if (err.status == 401) { - userStore.clearUser(); - - window.location.href = `/login?redirect=${to.fullPath}`; - } - }); - } - - if (!userStore.id) { - next({ - name: "login", - query: { redirect: encodeURIComponent(to.fullPath) }, - }); - - return; - } - } - - api.post({ - url: "/analytics", - body: { - type: "pageview", - path: to.fullPath, - }, - }).catch(() => { - /* empty */ - }); - - next(); -}); - -router.afterEach((to, from) => { - const applicationStore = useApplicationStore(); - - if (from.name !== undefined) { - document.body.classList.remove(`page-${from.name}`); - } - document.body.classList.add(`page-${to.name}`); - - window.setTimeout(() => { - const getMetaValue = (tag, defaultValue = "") => { - const getMeta = (obj, tag) => { - const tagHierarchy = tag.split("."); - - const nearestWithMeta = obj.matched - .slice() - .reverse() - .reduce( - (acc, r) => acc || (r.meta && r.meta[tagHierarchy[0]]), - null, - ); - if (nearestWithMeta) { - let result = nearestWithMeta; - for (let i = 1; i < tagHierarchy.length; i++) { - result = result[tagHierarchy[i]]; - if (!result) break; - } - if (result !== undefined) return result; - } - - return null; - }; - - const nearestMeta = getMeta(to, tag); - if (nearestMeta == null) { - const previousMeta = getMeta(from, tag); - if (previousMeta == null) { - return defaultValue; - } - - return previousMeta; - } - return nearestMeta; - }; - - updateSEOTags({ - title: getMetaValue("title"), - description: getMetaValue("description"), - keywords: getMetaValue("keywords", []), - robots: { - index: getMetaValue( - "robots.index", - !to.meta.middleware - ? true - : to.meta.middleware != "authenticated", - ), - follow: getMetaValue( - "robots.follow", - !to.meta.middleware - ? true - : to.meta.middleware != "authenticated", - ), - }, - url: getMetaValue("url", to.path), - image: getMetaValue("image", ""), - }); - }, 10); - - window.setTimeout(() => { - const autofocusElement = document.querySelector("[autofocus]"); - if (autofocusElement) { - autofocusElement.focus(); - } - - const hash = window.location.hash; - if (hash) { - const target = document.querySelector(hash); - if (target) { - target.scrollIntoView(); - } - } - }, 10); - - if (applicationStore.pageLoaderTimeout !== 0) { - window.clearTimeout(applicationStore.pageLoaderTimeout); - applicationStore.pageLoaderTimeout = 0; - } - - const pageLoadingElem = document.getElementById("sm-page-loading"); - if (pageLoadingElem !== null) { - pageLoadingElem.style.display = "none"; - } - - applicationStore.hydrated = true; -}); - -export default router; diff --git a/resources/js/store/ApplicationStore.ts b/resources/js/store/ApplicationStore.ts deleted file mode 100644 index ff3ea03..0000000 --- a/resources/js/store/ApplicationStore.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { defineStore } from "pinia"; - -type ApplicationStoreEventKeyUpCallback = (event: KeyboardEvent) => boolean; -type ApplicationStoreEventKeyPressCallback = (event: KeyboardEvent) => boolean; - -export interface ApplicationStore { - hydrated: boolean; - unavailable: boolean; - dynamicTitle: string; - eventKeyUpStack: ApplicationStoreEventKeyUpCallback[]; - eventKeyPressStack: ApplicationStoreEventKeyPressCallback[]; - pageLoaderTimeout: number; - _addedListener: boolean; -} - -export const useApplicationStore = defineStore({ - id: "application", - state: (): ApplicationStore => ({ - hydrated: false, - unavailable: false, - dynamicTitle: "", - eventKeyUpStack: [], - eventKeyPressStack: [], - pageLoaderTimeout: 0, - _addedListener: false, - }), - - actions: { - async setDynamicTitle(title: string) { - this.$state.dynamicTitle = title; - document.title = `STEMMechanics | ${title}`; - }, - - clearDynamicTitle() { - this.$state.dynamicTitle = ""; - }, - - addKeyUpListener(callback: ApplicationStoreEventKeyUpCallback) { - this.eventKeyUpStack.push(callback); - - if (!this._addedListener) { - document.addEventListener("keyup", (event: KeyboardEvent) => { - this.eventKeyUpStack.every( - (item: ApplicationStoreEventKeyUpCallback) => { - const result = item(event); - if (result) { - return false; - } - - return true; - }, - ); - }); - } - }, - - removeKeyUpListener(callback: ApplicationStoreEventKeyUpCallback) { - this.eventKeyUpStack = this.eventKeyUpStack.filter( - (item: ApplicationStoreEventKeyUpCallback) => item !== callback, - ); - }, - - addKeyPressListener(callback: ApplicationStoreEventKeyPressCallback) { - this.eventKeyPressStack.push(callback); - - if (!this._addedListener) { - document.addEventListener( - "keypress", - (event: KeyboardEvent) => { - this.eventKeyPressStack.every( - (item: ApplicationStoreEventKeyPressCallback) => { - const result = item(event); - if (result) { - return false; - } - - return true; - }, - ); - }, - ); - } - }, - - removeKeyPressListener( - callback: ApplicationStoreEventKeyPressCallback, - ) { - this.eventKeyPressStack = this.eventKeyPressStack.filter( - (item: ApplicationStoreEventKeyPressCallback) => - item !== callback, - ); - }, - }, -}); diff --git a/resources/js/store/CacheStore.ts b/resources/js/store/CacheStore.ts deleted file mode 100644 index b43a808..0000000 --- a/resources/js/store/CacheStore.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { DefineStoreOptions, defineStore } from "pinia"; - -interface CacheItem { - url: string; - data: unknown; -} - -export const useCacheStore = defineStore({ - id: "cache", - state: () => ({ - cache: [] as CacheItem[], - }), - - actions: { - // Method to retrieve cached JSON data based on a URL - getCacheByUrl(url: string) { - const cachedItem = this.cache.find((item) => item.url === url); - return cachedItem ? cachedItem.data : null; - }, - - // Method to update the cache with new data and check for modifications - updateCache(url: string, newData: unknown): boolean { - const index = this.cache.findIndex((item) => item.url === url); - - if (index !== -1) { - // If the URL is already in the cache, check for modifications - const existingData = this.cache[index].data; - - if (JSON.stringify(existingData) === JSON.stringify(newData)) { - // Data is not modified, return false - return false; - } else { - // Data is modified, update the cache - this.cache[index].data = newData; - return true; - } - } else { - // If the URL is not in the cache, add it - this.cache.push({ url, data: newData }); - return true; - } - }, - - // Method to clear the cache for a specific URL - clearCacheByUrl(url: string) { - const index = this.cache.findIndex((item) => item.url === url); - if (index !== -1) { - this.cache.splice(index, 1); - } - }, - - // Method to clear the entire cache - clearCache() { - this.cache = []; - }, - }, - - persist: true, -} as DefineStoreOptions & { - persist?: boolean; -}); diff --git a/resources/js/store/ToastStore.ts b/resources/js/store/ToastStore.ts deleted file mode 100644 index 27008a8..0000000 --- a/resources/js/store/ToastStore.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { defineStore } from "pinia"; - -export interface ToastOptions { - id?: number; - title?: string; - content: string; - type?: string; - loader?: boolean; -} - -export interface ToastItem { - id: number; - title: string; - content: string; - type: string; - loader: boolean; -} - -export interface ToastStore { - toasts: ToastItem[]; -} - -export const defaultToastItem: ToastItem = { - id: 0, - title: "", - content: "", - type: "primary", - loader: false, -}; - -export const useToastStore = defineStore({ - id: "toasts", - state: (): ToastStore => ({ - toasts: [], - }), - - actions: { - addToast(toast: ToastOptions): number { - while ( - !toast.id || - toast.id == 0 || - this.toasts.find((item: ToastItem) => item.id === toast.id) - ) { - toast.id = - Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1; - } - - toast.title = toast.title || defaultToastItem.title; - toast.type = toast.type || defaultToastItem.type; - - this.toasts.push(toast); - return toast.id; - }, - - clearToast(id: number): void { - this.toasts = this.toasts.filter( - (item: ToastItem) => item.id !== id - ); - }, - - updateToast(id: number, updatedFields: Partial): void { - const toastToUpdate = this.toasts.find( - (item: ToastItem) => item.id === id - ); - - if (toastToUpdate) { - toastToUpdate.title = - updatedFields.title || toastToUpdate.title; - toastToUpdate.content = - updatedFields.content || toastToUpdate.content; - toastToUpdate.type = updatedFields.type || toastToUpdate.type; - if ( - Object.prototype.hasOwnProperty.call( - updatedFields, - "loader" - ) - ) { - toastToUpdate.loader = updatedFields.loader; - } - } - }, - }, -}); diff --git a/resources/js/store/UserStore.ts b/resources/js/store/UserStore.ts deleted file mode 100644 index 7186682..0000000 --- a/resources/js/store/UserStore.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { defineStore, DefineStoreOptions } from "pinia"; - -export interface UserDetails { - id: string; - username: string; - first_name: string; - last_name: string; - display_name: string; - email: string; - phone: string; - permissions: string[]; -} - -export interface UserState { - id: string; - token: string; - username: string; - firstName: string; - lastName: string; - displayName: string; - email: string; - phone: string; - permissions: string[]; -} - -export const useUserStore = defineStore({ - id: "user", - state: (): UserState => { - return { - id: "", - token: "", - username: "", - firstName: "", - lastName: "", - displayName: "", - email: "", - phone: "", - permissions: [], - }; - }, - - actions: { - async setUserDetails(user: UserDetails) { - this.$state.id = user.id; - this.$state.username = user.username; - this.$state.firstName = user.first_name; - this.$state.lastName = user.last_name; - this.$state.displayName = user.display_name; - this.$state.email = user.email; - this.$state.phone = user.phone; - this.$state.permissions = user.permissions || []; - }, - - async setUserToken(token: string) { - this.$state.token = token; - }, - - clearUser() { - this.$state.id = null; - this.$state.token = null; - this.$state.username = null; - this.$state.firstName = null; - this.$state.lastName = null; - this.$state.displayName = null; - this.$state.email = null; - this.$state.phone = null; - this.$state.permissions = []; - }, - }, - - persist: true, -} as DefineStoreOptions & { persist?: boolean }); diff --git a/resources/js/tests/datetime.test.ts b/resources/js/tests/datetime.test.ts deleted file mode 100644 index 01d4d12..0000000 --- a/resources/js/tests/datetime.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { expect, describe, it } from "vitest"; -import { SMDate } from "../helpers/datetime"; - -describe("format()", () => { - it("should return an empty string when the first argument is not a Date object", () => { - const result = new SMDate("not a date").format("yyyy-MM-dd"); - expect(result).toEqual(""); - }); - - it("should format the date correctly", () => { - const date = new Date("2022-02-19T12:34:56"); - const result = new SMDate(date).format("yyyy-MM-dd HH:mm:ss"); - expect(result).toEqual("2022-02-19 12:34:56"); - }); - - it("should handle single-digit month and day", () => { - const date = new Date("2022-01-01T00:00:00"); - const result = new SMDate(date).format("yy-M-d"); - expect(result).toEqual("22-1-1"); - }); - - it("should handle day of week and month name abbreviations", () => { - const date = new Date("2022-03-22T00:00:00"); - const result = new SMDate(date).format("EEE, MMM dd, yyyy"); - expect(result).toEqual("Tue, Mar 22, 2022"); - }); - - it("should handle 12-hour clock with am/pm", () => { - const date = new Date("2022-01-01T12:34:56"); - const result = new SMDate(date).format("hh:mm:ss aa"); - expect(result).toEqual("12:34:56 pm"); - }); -}); diff --git a/resources/js/tests/string.test.ts b/resources/js/tests/string.test.ts deleted file mode 100644 index 53620e2..0000000 --- a/resources/js/tests/string.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { expect, describe, it } from "vitest"; -import { toTitleCase } from "../helpers/string"; - -describe("toTitleCase()", () => { - it("should return a converted title case string", () => { - const result = toTitleCase("titlecase"); - expect(result).toEqual("Titlecase"); - }); - - it("should return a converted title case string and spaces", () => { - const result = toTitleCase("titlecase_and_more"); - expect(result).toEqual("Titlecase And More"); - }); -}); diff --git a/resources/js/tests/validate.test.ts b/resources/js/tests/validate.test.ts deleted file mode 100644 index 64003b4..0000000 --- a/resources/js/tests/validate.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { expect, describe, it } from "vitest"; -import { Email } from "../helpers/validate"; - -describe("Email()", () => { - it("should return valid=false when an invalid email address is passed to the validate function", async () => { - const v = Email(); - const result = await v.validate("invalid email"); - expect(result.valid).toBe(false); - }); - - it("should return valid=false when an invalid email address is passed to the validate function", async () => { - const v = Email(); - const result = await v.validate("fake@outlook"); - expect(result.valid).toBe(false); - }); - - it("should return valid=true when an valid email address is passed to the validate function", async () => { - const v = Email(); - const result = await v.validate("fake@outlook.com"); - expect(result.valid).toBe(true); - }); - - it("should return valid=true when an valid email address is passed to the validate function", async () => { - const v = Email(); - const result = await v.validate("fake@outlook.com.au"); - expect(result.valid).toBe(true); - }); -}); diff --git a/resources/js/views/404.vue b/resources/js/views/404.vue deleted file mode 100644 index 7e8e8a3..0000000 --- a/resources/js/views/404.vue +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/resources/js/views/App.vue b/resources/js/views/App.vue deleted file mode 100644 index afbc6af..0000000 --- a/resources/js/views/App.vue +++ /dev/null @@ -1,44 +0,0 @@ - - - diff --git a/resources/js/views/Article.vue b/resources/js/views/Article.vue deleted file mode 100644 index 4e0885a..0000000 --- a/resources/js/views/Article.vue +++ /dev/null @@ -1,163 +0,0 @@ - - - diff --git a/resources/js/views/Blog.vue b/resources/js/views/Blog.vue deleted file mode 100644 index d4aae24..0000000 --- a/resources/js/views/Blog.vue +++ /dev/null @@ -1,167 +0,0 @@ - - - - - diff --git a/resources/js/views/Cart.vue b/resources/js/views/Cart.vue deleted file mode 100644 index 476cc04..0000000 --- a/resources/js/views/Cart.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/resources/js/views/CodeOfConduct.vue b/resources/js/views/CodeOfConduct.vue deleted file mode 100644 index 5bb3dbd..0000000 --- a/resources/js/views/CodeOfConduct.vue +++ /dev/null @@ -1,150 +0,0 @@ - - - diff --git a/resources/js/views/Community.vue b/resources/js/views/Community.vue deleted file mode 100644 index c729776..0000000 --- a/resources/js/views/Community.vue +++ /dev/null @@ -1,130 +0,0 @@ - - - - - diff --git a/resources/js/views/Contact.vue b/resources/js/views/Contact.vue deleted file mode 100644 index 570db09..0000000 --- a/resources/js/views/Contact.vue +++ /dev/null @@ -1,50 +0,0 @@ - - - diff --git a/resources/js/views/EmailVerify.vue b/resources/js/views/EmailVerify.vue deleted file mode 100644 index 6b2bd64..0000000 --- a/resources/js/views/EmailVerify.vue +++ /dev/null @@ -1,101 +0,0 @@ - - - diff --git a/resources/js/views/Event.vue b/resources/js/views/Event.vue deleted file mode 100644 index c8a3add..0000000 --- a/resources/js/views/Event.vue +++ /dev/null @@ -1,357 +0,0 @@ - - - diff --git a/resources/js/views/File.vue b/resources/js/views/File.vue deleted file mode 100644 index 2f00f1d..0000000 --- a/resources/js/views/File.vue +++ /dev/null @@ -1,193 +0,0 @@ - - - diff --git a/resources/js/views/ForgotPassword.vue b/resources/js/views/ForgotPassword.vue deleted file mode 100644 index 1b352c1..0000000 --- a/resources/js/views/ForgotPassword.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - diff --git a/resources/js/views/Home.vue b/resources/js/views/Home.vue deleted file mode 100644 index eb25a8c..0000000 --- a/resources/js/views/Home.vue +++ /dev/null @@ -1,385 +0,0 @@ - - - - - diff --git a/resources/js/views/Login.vue b/resources/js/views/Login.vue deleted file mode 100644 index 8f6092c..0000000 --- a/resources/js/views/Login.vue +++ /dev/null @@ -1,104 +0,0 @@ - - - diff --git a/resources/js/views/Logout.vue b/resources/js/views/Logout.vue deleted file mode 100644 index 7b83740..0000000 --- a/resources/js/views/Logout.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - diff --git a/resources/js/views/Minecraft.vue b/resources/js/views/Minecraft.vue deleted file mode 100644 index 8c7ac9b..0000000 --- a/resources/js/views/Minecraft.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - diff --git a/resources/js/views/MinecraftCurve.vue b/resources/js/views/MinecraftCurve.vue deleted file mode 100644 index 544b02e..0000000 --- a/resources/js/views/MinecraftCurve.vue +++ /dev/null @@ -1,1104 +0,0 @@ - - - - - diff --git a/resources/js/views/Privacy.vue b/resources/js/views/Privacy.vue deleted file mode 100644 index 1fd2d53..0000000 --- a/resources/js/views/Privacy.vue +++ /dev/null @@ -1,359 +0,0 @@ - - - diff --git a/resources/js/views/Register.vue b/resources/js/views/Register.vue deleted file mode 100644 index d0605dc..0000000 --- a/resources/js/views/Register.vue +++ /dev/null @@ -1,127 +0,0 @@ - - - diff --git a/resources/js/views/ResendEmailVerify.vue b/resources/js/views/ResendEmailVerify.vue deleted file mode 100644 index 9bf6618..0000000 --- a/resources/js/views/ResendEmailVerify.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - diff --git a/resources/js/views/ResetPassword.vue b/resources/js/views/ResetPassword.vue deleted file mode 100644 index c352885..0000000 --- a/resources/js/views/ResetPassword.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - diff --git a/resources/js/views/Rules.vue b/resources/js/views/Rules.vue deleted file mode 100644 index 60715e0..0000000 --- a/resources/js/views/Rules.vue +++ /dev/null @@ -1,55 +0,0 @@ - - - diff --git a/resources/js/views/TermsAndConditions.vue b/resources/js/views/TermsAndConditions.vue deleted file mode 100644 index 1396e03..0000000 --- a/resources/js/views/TermsAndConditions.vue +++ /dev/null @@ -1,589 +0,0 @@ - - - diff --git a/resources/js/views/Workshops.vue b/resources/js/views/Workshops.vue deleted file mode 100644 index 65772af..0000000 --- a/resources/js/views/Workshops.vue +++ /dev/null @@ -1,256 +0,0 @@ - - - - - diff --git a/resources/js/views/dashboard/AnalyticsItem.vue b/resources/js/views/dashboard/AnalyticsItem.vue deleted file mode 100644 index 48fbe70..0000000 --- a/resources/js/views/dashboard/AnalyticsItem.vue +++ /dev/null @@ -1,71 +0,0 @@ - - - - - diff --git a/resources/js/views/dashboard/AnalyticsList.vue b/resources/js/views/dashboard/AnalyticsList.vue deleted file mode 100644 index 112ea03..0000000 --- a/resources/js/views/dashboard/AnalyticsList.vue +++ /dev/null @@ -1,199 +0,0 @@ - - -