@stacksjs/defaults 0.70.57 → 0.70.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/Actions/AI/AskAction.ts +40 -0
- package/app/Actions/AI/SummaryAction.ts +40 -0
- package/app/Actions/Auth/AuthUserAction.ts +13 -0
- package/app/Actions/Auth/CreateTokenAction.ts +64 -0
- package/app/Actions/Auth/DisableTwoFactorAction.ts +37 -0
- package/app/Actions/Auth/EnableTwoFactorAction.ts +37 -0
- package/app/Actions/Auth/GenerateAuthenticationAction.ts +51 -0
- package/app/Actions/Auth/GenerateRegistrationAction.ts +53 -0
- package/app/Actions/Auth/GenerateTwoFactorSecretAction.ts +26 -0
- package/app/Actions/Auth/ListTokensAction.ts +30 -0
- package/app/Actions/Auth/LoginAction.ts +73 -0
- package/app/Actions/Auth/LogoutAction.ts +16 -0
- package/app/Actions/Auth/LogoutAllAction.ts +28 -0
- package/app/Actions/Auth/RefreshTokenAction.ts +39 -0
- package/app/Actions/Auth/RegisterAction.ts +57 -0
- package/app/Actions/Auth/ResendVerificationAction.ts +24 -0
- package/app/Actions/Auth/RevokeTokenAction.ts +43 -0
- package/app/Actions/Auth/TestAbilitiesAction.ts +61 -0
- package/app/Actions/Auth/VerifyAuthenticationAction.ts +94 -0
- package/app/Actions/Auth/VerifyEmailAction.ts +25 -0
- package/app/Actions/Auth/VerifyRegistrationAction.ts +59 -0
- package/app/Actions/Auth/VerifyTwoFactorLoginAction.ts +57 -0
- package/app/Actions/Billable/CheckoutAction.ts +25 -0
- package/app/Actions/Buddy/BuddyBrowseAction.ts +34 -0
- package/app/Actions/Buddy/BuddyCancelAction.ts +32 -0
- package/app/Actions/Buddy/BuddyCommitAction.ts +25 -0
- package/app/Actions/Buddy/BuddyGitHubConnectAction.ts +40 -0
- package/app/Actions/Buddy/BuddyGitHubDisconnectAction.ts +19 -0
- package/app/Actions/Buddy/BuddyProcessAction.ts +65 -0
- package/app/Actions/Buddy/BuddyProcessStreamAction.ts +128 -0
- package/app/Actions/Buddy/BuddyPushAction.ts +21 -0
- package/app/Actions/Buddy/BuddyRepoOpenAction.ts +44 -0
- package/app/Actions/Buddy/BuddyRepoValidateAction.ts +35 -0
- package/app/Actions/Buddy/BuddySettingsAction.ts +21 -0
- package/app/Actions/Buddy/BuddySettingsUpdateAction.ts +46 -0
- package/app/Actions/Buddy/BuddyStateAction.ts +28 -0
- package/app/Actions/Buddy/BuddyTitleAction.ts +49 -0
- package/app/Actions/Buddy/CommandsAction.ts +802 -0
- package/app/Actions/Buddy/JobCancelAction.ts +32 -0
- package/app/Actions/Buddy/JobRetryAction.ts +49 -0
- package/app/Actions/Buddy/JobsListAction.ts +141 -0
- package/app/Actions/Buddy/ScheduleListAction.ts +52 -0
- package/app/Actions/Buddy/VersionsAction.ts +12 -0
- package/app/Actions/Cms/AuthorDestroyAction.ts +21 -0
- package/app/Actions/Cms/AuthorIndexAction.ts +14 -0
- package/app/Actions/Cms/AuthorShowAction.ts +19 -0
- package/app/Actions/Cms/AuthorStoreAction.ts +20 -0
- package/app/Actions/Cms/AuthorUpdateAction.ts +24 -0
- package/app/Actions/Cms/CategorizableDestroyAction.ts +16 -0
- package/app/Actions/Cms/CategorizableIndexAction.ts +14 -0
- package/app/Actions/Cms/CategorizableShowAction.ts +16 -0
- package/app/Actions/Cms/CategorizableStoreAction.ts +42 -0
- package/app/Actions/Cms/CategorizableUpdateAction.ts +38 -0
- package/app/Actions/Cms/CommentDestroyAction.ts +16 -0
- package/app/Actions/Cms/CommentIndexAction.ts +17 -0
- package/app/Actions/Cms/CommentShowAction.ts +16 -0
- package/app/Actions/Cms/CommentStoreAction.ts +39 -0
- package/app/Actions/Cms/CommentUpdateAction.ts +37 -0
- package/app/Actions/Cms/PageDestroyAction.ts +16 -0
- package/app/Actions/Cms/PageIndexAction.ts +14 -0
- package/app/Actions/Cms/PageStoreAction.ts +31 -0
- package/app/Actions/Cms/PageUpdateAction.ts +27 -0
- package/app/Actions/Cms/PostDestroyAction.ts +17 -0
- package/app/Actions/Cms/PostIndexAction.ts +14 -0
- package/app/Actions/Cms/PostShowAction.ts +16 -0
- package/app/Actions/Cms/PostStoreAction.ts +37 -0
- package/app/Actions/Cms/PostUpdateAction.ts +32 -0
- package/app/Actions/Cms/PostViewsUpdateAction.ts +34 -0
- package/app/Actions/Cms/RssFeedAction.ts +59 -0
- package/app/Actions/Cms/SitemapAction.ts +60 -0
- package/app/Actions/Cms/TaggableDestroyAction.ts +16 -0
- package/app/Actions/Cms/TaggableIndexAction.ts +14 -0
- package/app/Actions/Cms/TaggableShowAction.ts +16 -0
- package/app/Actions/Cms/TaggableStoreAction.ts +36 -0
- package/app/Actions/Cms/TaggableUpdateAction.ts +37 -0
- package/app/Actions/Commerce/CouponDestroyAction.ts +18 -0
- package/app/Actions/Commerce/CouponIndexAction.ts +16 -0
- package/app/Actions/Commerce/CouponShowAction.ts +18 -0
- package/app/Actions/Commerce/CouponStoreAction.ts +21 -0
- package/app/Actions/Commerce/CouponUpdateAction.ts +31 -0
- package/app/Actions/Commerce/CustomerDestroyAction.ts +16 -0
- package/app/Actions/Commerce/CustomerIndexAction.ts +15 -0
- package/app/Actions/Commerce/CustomerShowAction.ts +18 -0
- package/app/Actions/Commerce/CustomerStoreAction.ts +29 -0
- package/app/Actions/Commerce/CustomerUpdateAction.ts +27 -0
- package/app/Actions/Commerce/DriverDestroyAction.ts +18 -0
- package/app/Actions/Commerce/GiftCardDestroyAction.ts +18 -0
- package/app/Actions/Commerce/GiftCardIndexAction.ts +16 -0
- package/app/Actions/Commerce/GiftCardShowAction.ts +18 -0
- package/app/Actions/Commerce/GiftCardStatsAction.ts +30 -0
- package/app/Actions/Commerce/GiftCardStoreAction.ts +35 -0
- package/app/Actions/Commerce/GiftCardUpdateAction.ts +26 -0
- package/app/Actions/Commerce/GiftCardUpdateBalanceAction.ts +36 -0
- package/app/Actions/Commerce/OrderDestroyAction.ts +18 -0
- package/app/Actions/Commerce/OrderExportAction.ts +15 -0
- package/app/Actions/Commerce/OrderIndexAction.ts +15 -0
- package/app/Actions/Commerce/OrderShowAction.ts +18 -0
- package/app/Actions/Commerce/OrderStoreAction.ts +32 -0
- package/app/Actions/Commerce/OrderUpdateAction.ts +34 -0
- package/app/Actions/Commerce/PaymentDestroyAction.ts +16 -0
- package/app/Actions/Commerce/PaymentFetchStatsAction.ts +31 -0
- package/app/Actions/Commerce/PaymentIndexAction.ts +15 -0
- package/app/Actions/Commerce/PaymentMonthlyTrendsAction.ts +21 -0
- package/app/Actions/Commerce/PaymentShowAction.ts +17 -0
- package/app/Actions/Commerce/PaymentStoreAction.ts +24 -0
- package/app/Actions/Commerce/PaymentUpdateAction.ts +35 -0
- package/app/Actions/Commerce/PrintDeviceDestroyAction.ts +18 -0
- package/app/Actions/Commerce/PrintDeviceIndexAction.ts +14 -0
- package/app/Actions/Commerce/PrintDeviceShowAction.ts +17 -0
- package/app/Actions/Commerce/PrintDeviceStoreAction.ts +27 -0
- package/app/Actions/Commerce/PrintDeviceUpdateAction.ts +27 -0
- package/app/Actions/Commerce/Product/ManufacturerDestroyAction.ts +20 -0
- package/app/Actions/Commerce/Product/ManufacturerIndexAction.ts +16 -0
- package/app/Actions/Commerce/Product/ManufacturerShowAction.ts +18 -0
- package/app/Actions/Commerce/Product/ManufacturerStoreAction.ts +14 -0
- package/app/Actions/Commerce/Product/ProductCategoryIndexAction.ts +16 -0
- package/app/Actions/Commerce/Product/ProductCategoryStoreAction.ts +16 -0
- package/app/Actions/Commerce/Product/ProductDestroyAction.ts +16 -0
- package/app/Actions/Commerce/Product/ProductIndexAction.ts +14 -0
- package/app/Actions/Commerce/Product/ProductManufacturerDestroyAction.ts +18 -0
- package/app/Actions/Commerce/Product/ProductManufacturerIndexAction.ts +14 -0
- package/app/Actions/Commerce/Product/ProductManufacturerShowAction.ts +16 -0
- package/app/Actions/Commerce/Product/ProductManufacturerStoreAction.ts +14 -0
- package/app/Actions/Commerce/Product/ProductManufacturerUpdateAction.ts +18 -0
- package/app/Actions/Commerce/Product/ProductShowAction.ts +18 -0
- package/app/Actions/Commerce/Product/ProductStoreAction.ts +17 -0
- package/app/Actions/Commerce/Product/ProductUnitDestroyAction.ts +18 -0
- package/app/Actions/Commerce/Product/ProductUnitIndexAction.ts +14 -0
- package/app/Actions/Commerce/Product/ProductUnitShowAction.ts +18 -0
- package/app/Actions/Commerce/Product/ProductUnitStoreAction.ts +15 -0
- package/app/Actions/Commerce/Product/ProductUpdateAction.ts +17 -0
- package/app/Actions/Commerce/Product/ProductVariantDestroyAction.ts +18 -0
- package/app/Actions/Commerce/Product/ProductVariantIndexAction.ts +14 -0
- package/app/Actions/Commerce/Product/ProductVariantShowAction.ts +17 -0
- package/app/Actions/Commerce/Product/ProductVariantStoreAction.ts +14 -0
- package/app/Actions/Commerce/Product/ProductVariantUpdateAction.ts +16 -0
- package/app/Actions/Commerce/ReceiptDestroyAction.ts +18 -0
- package/app/Actions/Commerce/ReceiptIndexAction.ts +14 -0
- package/app/Actions/Commerce/ReceiptShowAction.ts +18 -0
- package/app/Actions/Commerce/ReceiptStoreAction.ts +28 -0
- package/app/Actions/Commerce/ReceiptUpdateAction.ts +30 -0
- package/app/Actions/Commerce/ReviewIndexAction.ts +14 -0
- package/app/Actions/Commerce/ReviewShowAction.ts +16 -0
- package/app/Actions/Commerce/ReviewStoreAction.ts +26 -0
- package/app/Actions/Commerce/ReviewUpdateAction.ts +28 -0
- package/app/Actions/Commerce/Shipping/DeliveryRouteDestroyAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DeliveryRouteIndexAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/DeliveryRouteShowAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DeliveryRouteStoreAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/DeliveryRouteUpdateAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DigitalDeliveryDestroyAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DigitalDeliveryIndexAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/DigitalDeliveryShowAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DigitalDeliveryStoreAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DigitalDeliveryUpdateAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DriverIndexAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/DriverShowAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DriverStoreAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/DriverUpdateAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/LicenseKeyDestroyAction.ts +20 -0
- package/app/Actions/Commerce/Shipping/LicenseKeyIndexAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/LicenseKeyShowAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/LicenseKeyStoreAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/LicenseKeyUpdateAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/ShippingMethodDestroyAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingMethodIndexAction.ts +14 -0
- package/app/Actions/Commerce/Shipping/ShippingMethodShowAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingMethodStoreAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingMethodUpdateAction.ts +15 -0
- package/app/Actions/Commerce/Shipping/ShippingRateDestroyAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingRateIndexAction.ts +14 -0
- package/app/Actions/Commerce/Shipping/ShippingRateShowAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingRateStoreAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingRateUpdateAction.ts +17 -0
- package/app/Actions/Commerce/Shipping/ShippingZoneDestroyAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingZoneIndexAction.ts +14 -0
- package/app/Actions/Commerce/Shipping/ShippingZoneShowAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingZoneStoreAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingZoneUpdateAction.ts +15 -0
- package/app/Actions/Commerce/TaxRateDestroyAction.ts +16 -0
- package/app/Actions/Commerce/TaxRateIndexAction.ts +14 -0
- package/app/Actions/Commerce/TaxRateShowAction.ts +17 -0
- package/app/Actions/Commerce/TaxRateStoreAction.ts +24 -0
- package/app/Actions/Commerce/TaxRateUpdateAction.ts +24 -0
- package/app/Actions/Commerce/WaitlistProductAnalyticsAction.ts +29 -0
- package/app/Actions/Commerce/WaitlistProductDestroyAction.ts +16 -0
- package/app/Actions/Commerce/WaitlistProductIndexAction.ts +14 -0
- package/app/Actions/Commerce/WaitlistProductQuantityDistributionAction.ts +32 -0
- package/app/Actions/Commerce/WaitlistProductShowAction.ts +16 -0
- package/app/Actions/Commerce/WaitlistProductStatusAction.ts +37 -0
- package/app/Actions/Commerce/WaitlistProductStoreAction.ts +27 -0
- package/app/Actions/Commerce/WaitlistProductTimeSeriesAction.ts +25 -0
- package/app/Actions/Commerce/WaitlistProductUpdateAction.ts +29 -0
- package/app/Actions/Commerce/WaitlistRestaurantDashboardAction.ts +29 -0
- package/app/Actions/Commerce/WaitlistRestaurantDestroyAction.ts +16 -0
- package/app/Actions/Commerce/WaitlistRestaurantIndexAction.ts +14 -0
- package/app/Actions/Commerce/WaitlistRestaurantShowAction.ts +16 -0
- package/app/Actions/Commerce/WaitlistRestaurantStoreAction.ts +31 -0
- package/app/Actions/Commerce/WaitlistRestaurantUpdateAction.ts +33 -0
- package/app/Actions/ContactAction.ts +72 -0
- package/app/Actions/Dashboard/Actions/CreateAction.ts +11 -0
- package/app/Actions/Dashboard/Actions/GetActionCount.ts +12 -0
- package/app/Actions/Dashboard/Actions/GetActions.ts +19 -0
- package/app/Actions/Dashboard/Analytics/BlogAnalyticsAction.ts +58 -0
- package/app/Actions/Dashboard/Analytics/BrowserAnalyticsAction.ts +42 -0
- package/app/Actions/Dashboard/Analytics/CommerceAnalyticsAction.ts +64 -0
- package/app/Actions/Dashboard/Analytics/CountryAnalyticsAction.ts +41 -0
- package/app/Actions/Dashboard/Analytics/DeviceAnalyticsAction.ts +58 -0
- package/app/Actions/Dashboard/Analytics/EventAnalyticsAction.ts +90 -0
- package/app/Actions/Dashboard/Analytics/MarketingAnalyticsAction.ts +76 -0
- package/app/Actions/Dashboard/Analytics/PageAnalyticsAction.ts +45 -0
- package/app/Actions/Dashboard/Analytics/ReferrerAnalyticsAction.ts +72 -0
- package/app/Actions/Dashboard/Analytics/SalesAnalyticsAction.ts +73 -0
- package/app/Actions/Dashboard/Analytics/WebAnalyticsAction.ts +114 -0
- package/app/Actions/Dashboard/Auth/MeAction.ts +84 -0
- package/app/Actions/Dashboard/BuddyDashboardAction.ts +34 -0
- package/app/Actions/Dashboard/Ci/RepoRunJobsAction.ts +60 -0
- package/app/Actions/Dashboard/Ci/RepoRunsAction.ts +67 -0
- package/app/Actions/Dashboard/Ci/RunnerHistoryAction.ts +58 -0
- package/app/Actions/Dashboard/Ci/StatusAction.ts +73 -0
- package/app/Actions/Dashboard/Ci/failure-notifier.ts +214 -0
- package/app/Actions/Dashboard/Ci/runner-pressure-monitor.ts +259 -0
- package/app/Actions/Dashboard/Cloud/CloudIndexAction.ts +61 -0
- package/app/Actions/Dashboard/Commands/CreateCommand.ts +11 -0
- package/app/Actions/Dashboard/Commands/GetAverageCommandTime.ts +12 -0
- package/app/Actions/Dashboard/Commands/GetCommandCount.ts +12 -0
- package/app/Actions/Dashboard/Commands/GetCommandSuccessRate.ts +12 -0
- package/app/Actions/Dashboard/Commands/GetCommands.ts +12 -0
- package/app/Actions/Dashboard/Commerce/CommerceCouponsAction.ts +48 -0
- package/app/Actions/Dashboard/Commerce/CommerceCustomersAction.ts +48 -0
- package/app/Actions/Dashboard/Commerce/CommerceDashboardAction.ts +98 -0
- package/app/Actions/Dashboard/Commerce/CommerceDeliveryAction.ts +65 -0
- package/app/Actions/Dashboard/Commerce/CommerceGiftCardsAction.ts +48 -0
- package/app/Actions/Dashboard/Commerce/CommerceOrdersAction.ts +51 -0
- package/app/Actions/Dashboard/Commerce/CommercePaymentsAction.ts +59 -0
- package/app/Actions/Dashboard/Commerce/CommerceProductsAction.ts +50 -0
- package/app/Actions/Dashboard/Commerce/CommerceTaxesAction.ts +46 -0
- package/app/Actions/Dashboard/Commerce/PosIndexAction.ts +57 -0
- package/app/Actions/Dashboard/Commerce/ReviewIndexAction.ts +51 -0
- package/app/Actions/Dashboard/Content/AuthorIndexAction.ts +51 -0
- package/app/Actions/Dashboard/Content/CategoryIndexAction.ts +27 -0
- package/app/Actions/Dashboard/Content/CommentIndexAction.ts +41 -0
- package/app/Actions/Dashboard/Content/ContentDashboardAction.ts +54 -0
- package/app/Actions/Dashboard/Content/FileIndexAction.ts +24 -0
- package/app/Actions/Dashboard/Content/PageIndexAction.ts +25 -0
- package/app/Actions/Dashboard/Content/PostIndexAction.ts +102 -0
- package/app/Actions/Dashboard/Content/SeoIndexAction.ts +17 -0
- package/app/Actions/Dashboard/Content/TagIndexAction.ts +23 -0
- package/app/Actions/Dashboard/CreateDnsRecords.ts +11 -0
- package/app/Actions/Dashboard/CreateMailbox.ts +11 -0
- package/app/Actions/Dashboard/DashboardActivityAction.ts +58 -0
- package/app/Actions/Dashboard/DashboardHealthAction.ts +52 -0
- package/app/Actions/Dashboard/DashboardHomeAction.ts +83 -0
- package/app/Actions/Dashboard/DashboardStatsAction.ts +48 -0
- package/app/Actions/Dashboard/Data/AccessTokenIndexAction.ts +65 -0
- package/app/Actions/Dashboard/Data/ActivityIndexAction.ts +28 -0
- package/app/Actions/Dashboard/Data/DataDashboardAction.ts +67 -0
- package/app/Actions/Dashboard/Data/SubscriberIndexAction.ts +48 -0
- package/app/Actions/Dashboard/Data/TeamIndexAction.ts +43 -0
- package/app/Actions/Dashboard/Data/UserIndexAction.ts +48 -0
- package/app/Actions/Dashboard/Deployments/CreateDeployment.ts +11 -0
- package/app/Actions/Dashboard/Deployments/GetAverageDeploymentTime.ts +15 -0
- package/app/Actions/Dashboard/Deployments/GetDeployScript.ts +12 -0
- package/app/Actions/Dashboard/Deployments/GetDeploymentCount.ts +12 -0
- package/app/Actions/Dashboard/Deployments/GetDeploymentLiveTerminalOutput.ts +12 -0
- package/app/Actions/Dashboard/Deployments/GetDeployments.ts +20 -0
- package/app/Actions/Dashboard/Deployments/GetRecentDeployments.ts +12 -0
- package/app/Actions/Dashboard/Deployments/UpdateDeployScript.ts +11 -0
- package/app/Actions/Dashboard/GetDnsRecords.ts +12 -0
- package/app/Actions/Dashboard/GetEmailInboxes.ts +12 -0
- package/app/Actions/Dashboard/GetProjects.ts +13 -0
- package/app/Actions/Dashboard/GetRecentCommits.ts +13 -0
- package/app/Actions/Dashboard/Inbox/InboxIndexAction.ts +144 -0
- package/app/Actions/Dashboard/Inbox/InboxShowAction.ts +89 -0
- package/app/Actions/Dashboard/Infrastructure/CommandIndexAction.ts +18 -0
- package/app/Actions/Dashboard/Infrastructure/DnsIndexAction.ts +101 -0
- package/app/Actions/Dashboard/Infrastructure/EnvironmentIndexAction.ts +67 -0
- package/app/Actions/Dashboard/Infrastructure/InsightsAction.ts +29 -0
- package/app/Actions/Dashboard/Infrastructure/LogIndexAction.ts +50 -0
- package/app/Actions/Dashboard/Infrastructure/MailboxIndexAction.ts +85 -0
- package/app/Actions/Dashboard/Infrastructure/PermissionIndexAction.ts +54 -0
- package/app/Actions/Dashboard/Infrastructure/RequestIndexAction.ts +44 -0
- package/app/Actions/Dashboard/Infrastructure/ServerIndexAction.ts +101 -0
- package/app/Actions/Dashboard/Jobs/CreateJob.ts +11 -0
- package/app/Actions/Dashboard/Jobs/GetAverageJobTime.ts +12 -0
- package/app/Actions/Dashboard/Jobs/GetJobHistory.ts +12 -0
- package/app/Actions/Dashboard/Jobs/GetJobs.ts +11 -0
- package/app/Actions/Dashboard/Jobs/GetJobsPerMinute.ts +12 -0
- package/app/Actions/Dashboard/Jobs/JobIndexAction.ts +136 -0
- package/app/Actions/Dashboard/Jobs/JobRetryAction.ts +23 -0
- package/app/Actions/Dashboard/Jobs/JobStatsAction.ts +49 -0
- package/app/Actions/Dashboard/Kanban/BoardDestroyAction.ts +84 -0
- package/app/Actions/Dashboard/Kanban/BoardShowAction.ts +215 -0
- package/app/Actions/Dashboard/Kanban/BoardStoreAction.ts +98 -0
- package/app/Actions/Dashboard/Kanban/BoardUpdateAction.ts +96 -0
- package/app/Actions/Dashboard/Kanban/BoardsIndexAction.ts +81 -0
- package/app/Actions/Dashboard/Kanban/BoardsReorderAction.ts +80 -0
- package/app/Actions/Dashboard/Kanban/CardAssigneesSyncAction.ts +103 -0
- package/app/Actions/Dashboard/Kanban/CardCommentDestroyAction.ts +33 -0
- package/app/Actions/Dashboard/Kanban/CardCommentStoreAction.ts +82 -0
- package/app/Actions/Dashboard/Kanban/CardDestroyAction.ts +48 -0
- package/app/Actions/Dashboard/Kanban/CardLabelsSyncAction.ts +103 -0
- package/app/Actions/Dashboard/Kanban/CardShowAction.ts +122 -0
- package/app/Actions/Dashboard/Kanban/CardStoreAction.ts +112 -0
- package/app/Actions/Dashboard/Kanban/CardUpdateAction.ts +91 -0
- package/app/Actions/Dashboard/Kanban/CardsReorderAction.ts +148 -0
- package/app/Actions/Dashboard/Kanban/ColumnDestroyAction.ts +59 -0
- package/app/Actions/Dashboard/Kanban/ColumnStoreAction.ts +94 -0
- package/app/Actions/Dashboard/Kanban/ColumnUpdateAction.ts +89 -0
- package/app/Actions/Dashboard/Kanban/ColumnsReorderAction.ts +85 -0
- package/app/Actions/Dashboard/Kanban/LabelDestroyAction.ts +41 -0
- package/app/Actions/Dashboard/Kanban/LabelStoreAction.ts +70 -0
- package/app/Actions/Dashboard/Kanban/LabelUpdateAction.ts +83 -0
- package/app/Actions/Dashboard/Kanban/UsersListAction.ts +36 -0
- package/app/Actions/Dashboard/Library/CreateComponent.ts +11 -0
- package/app/Actions/Dashboard/Library/CreateFunction.ts +11 -0
- package/app/Actions/Dashboard/Library/DependencyIndexAction.ts +92 -0
- package/app/Actions/Dashboard/Library/GetAverageReleaseTime.ts +12 -0
- package/app/Actions/Dashboard/Library/GetComponents.ts +24 -0
- package/app/Actions/Dashboard/Library/GetComponentsDownloadCount.ts +12 -0
- package/app/Actions/Dashboard/Library/GetDownloadCount.ts +12 -0
- package/app/Actions/Dashboard/Library/GetFunctions.ts +22 -0
- package/app/Actions/Dashboard/Library/GetFunctionsDownloadCount.ts +12 -0
- package/app/Actions/Dashboard/Library/GetReleaseCount.ts +12 -0
- package/app/Actions/Dashboard/Library/GetReleases.ts +28 -0
- package/app/Actions/Dashboard/Library/PackageIndexAction.ts +26 -0
- package/app/Actions/Dashboard/Marketing/CampaignIndexAction.ts +45 -0
- package/app/Actions/Dashboard/Marketing/ListIndexAction.ts +43 -0
- package/app/Actions/Dashboard/Marketing/SocialPostIndexAction.ts +47 -0
- package/app/Actions/Dashboard/Models/GetModels.ts +39 -0
- package/app/Actions/Dashboard/Models/GetSubscriberCount.ts +12 -0
- package/app/Actions/Dashboard/Models/GetUserCount.ts +12 -0
- package/app/Actions/Dashboard/Models/ModelShowAction.ts +131 -0
- package/app/Actions/Dashboard/Models/ModelsIndexAction.ts +169 -0
- package/app/Actions/Dashboard/Notifications/CreateNotification.ts +11 -0
- package/app/Actions/Dashboard/Notifications/GetAverageNotificationTime.ts +12 -0
- package/app/Actions/Dashboard/Notifications/GetNotificationCount.ts +12 -0
- package/app/Actions/Dashboard/Notifications/GetNotificationDeliveryRate.ts +12 -0
- package/app/Actions/Dashboard/Notifications/GetNotificationHistory.ts +12 -0
- package/app/Actions/Dashboard/Notifications/GetNotifications.ts +12 -0
- package/app/Actions/Dashboard/Notifications/NotificationDashboardAction.ts +43 -0
- package/app/Actions/Dashboard/Queries/QueryIndexAction.ts +22 -0
- package/app/Actions/Dashboard/Queue/QueueRetryFailedAction.ts +22 -0
- package/app/Actions/Dashboard/Queue/QueueStatsAction.ts +98 -0
- package/app/Actions/Dashboard/Queue/QueueWorkersAction.ts +46 -0
- package/app/Actions/Dashboard/Rbac/PermissionDestroyAction.ts +33 -0
- package/app/Actions/Dashboard/Rbac/PermissionStoreAction.ts +53 -0
- package/app/Actions/Dashboard/Rbac/PermissionsIndexAction.ts +34 -0
- package/app/Actions/Dashboard/Rbac/RoleDestroyAction.ts +35 -0
- package/app/Actions/Dashboard/Rbac/RolePermissionsShowAction.ts +45 -0
- package/app/Actions/Dashboard/Rbac/RolePermissionsSyncAction.ts +63 -0
- package/app/Actions/Dashboard/Rbac/RoleStoreAction.ts +58 -0
- package/app/Actions/Dashboard/Rbac/RolesIndexAction.ts +36 -0
- package/app/Actions/Dashboard/Rbac/UserRolesShowAction.ts +40 -0
- package/app/Actions/Dashboard/Rbac/UserRolesSyncAction.ts +65 -0
- package/app/Actions/Dashboard/Rbac/UsersListAction.ts +39 -0
- package/app/Actions/Dashboard/Realtime/RealtimeStatsAction.ts +50 -0
- package/app/Actions/Dashboard/Releases/ReleaseIndexAction.ts +21 -0
- package/app/Actions/Dashboard/Requests/GetAverageRequestTime.ts +12 -0
- package/app/Actions/Dashboard/Requests/GetRequestCount.ts +12 -0
- package/app/Actions/Dashboard/Requests/GetRequestSuccessRate.ts +12 -0
- package/app/Actions/Dashboard/Requests/GetRequests.ts +12 -0
- package/app/Actions/Dashboard/Search/GlobalSearchAction.ts +26 -0
- package/app/Actions/Dashboard/ServiceHealthAction.ts +243 -0
- package/app/Actions/Dashboard/Settings/MailSettingsGetAction.ts +20 -0
- package/app/Actions/Dashboard/Settings/MailSettingsUpdateAction.ts +10 -0
- package/app/Actions/Dashboard/Settings/SettingsIndexAction.ts +40 -0
- package/app/Actions/Dashboard/Settings/UpdateAiConfig.ts +27 -0
- package/app/Actions/Dashboard/Settings/UpdateAnalyticsConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateAppConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateCacheConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateCliConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateCloudConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateDatabaseConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateDnsConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateDocsConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateEmailConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateEnvConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateErrorsConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateFileSystemsConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateGitConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateHashingConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateLibraryConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateLoggerConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateNotificationConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdatePaymentConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdatePortsConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateQueueConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateSearchEngineConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateSecurityConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateServicesConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateStorageConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateTeamConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateUiConfig.ts +11 -0
- package/app/Actions/HealthAction.ts +112 -0
- package/app/Actions/InstallAction.ts +83 -0
- package/app/Actions/Locale/SetLocaleAction.ts +51 -0
- package/app/Actions/LogAction.ts +42 -0
- package/app/Actions/Logs/LogFetchStatsAction.ts +50 -0
- package/app/Actions/Logs/LogIndexOrmAction.ts +13 -0
- package/app/Actions/Logs/LogShowOrmAction.ts +17 -0
- package/app/Actions/Logs/LogStoreOrmAction.ts +16 -0
- package/app/Actions/Logs/LogUpdateOrmAction.ts +20 -0
- package/app/Actions/Monitoring/ErrorDestroyAction.ts +25 -0
- package/app/Actions/Monitoring/ErrorGroupAction.ts +21 -0
- package/app/Actions/Monitoring/ErrorIgnoreAction.ts +25 -0
- package/app/Actions/Monitoring/ErrorIndexAction.ts +14 -0
- package/app/Actions/Monitoring/ErrorResolveAction.ts +25 -0
- package/app/Actions/Monitoring/ErrorShowAction.ts +19 -0
- package/app/Actions/Monitoring/ErrorStatsAction.ts +14 -0
- package/app/Actions/Monitoring/ErrorTimelineAction.ts +14 -0
- package/app/Actions/Monitoring/ErrorUnresolveAction.ts +25 -0
- package/app/Actions/NotifyUser.ts +10 -0
- package/app/Actions/Password/PasswordResetAction.ts +54 -0
- package/app/Actions/Password/SendPasswordResetEmailAction.ts +66 -0
- package/app/Actions/Password/VerifyResetTokenAction.ts +27 -0
- package/app/Actions/Payment/CancelSubscriptionAction.ts +20 -0
- package/app/Actions/Payment/CreateCheckoutAction.ts +28 -0
- package/app/Actions/Payment/CreateInvoiceSubscription.ts +18 -0
- package/app/Actions/Payment/CreatePaymentIntentAction.ts +31 -0
- package/app/Actions/Payment/CreateSetupIntentAction.ts +20 -0
- package/app/Actions/Payment/CreateSubscriptionAction.ts +23 -0
- package/app/Actions/Payment/DeleteDefaultPaymentAction.ts +18 -0
- package/app/Actions/Payment/FetchActiveSubscriptionAction.ts +18 -0
- package/app/Actions/Payment/FetchDefaultPaymentMethodAction.ts +18 -0
- package/app/Actions/Payment/FetchPaymentCustomerAction.ts +18 -0
- package/app/Actions/Payment/FetchPaymentMethodsAction.ts +18 -0
- package/app/Actions/Payment/FetchProductAction.ts +15 -0
- package/app/Actions/Payment/FetchTransactionHistoryAction.ts +18 -0
- package/app/Actions/Payment/FetchUserSubscriptionsAction.ts +18 -0
- package/app/Actions/Payment/SetDefaultPaymentAction.ts +20 -0
- package/app/Actions/Payment/SetUserDefaultPaymentAction.ts +20 -0
- package/app/Actions/Payment/StorePaymentMethodAction.ts +20 -0
- package/app/Actions/Payment/StoreTransactionAction.ts +20 -0
- package/app/Actions/Payment/UpdateCustomerAction.ts +24 -0
- package/app/Actions/Payment/UpdateDefaultPaymentMethodAction.ts +18 -0
- package/app/Actions/Payment/UpdateSubscriptionAction.ts +22 -0
- package/app/Actions/Queue/FetchQueuesAction.ts +14 -0
- package/app/Actions/README.md +61 -0
- package/app/Actions/Realtime/FetchWebsocketsAction.ts +14 -0
- package/app/Actions/RobotsAction.ts +61 -0
- package/app/Actions/SendWelcomeEmail.ts +40 -0
- package/app/Actions/SitemapAction.ts +234 -0
- package/app/Actions/Storefront/AddToCartAction.ts +153 -0
- package/app/Actions/Storefront/CheckoutContactAction.ts +50 -0
- package/app/Actions/Storefront/CheckoutShippingAction.ts +61 -0
- package/app/Actions/Storefront/GetCartAction.ts +58 -0
- package/app/Actions/Storefront/PlaceOrderAction.ts +195 -0
- package/app/Actions/Storefront/SubmitReviewAction.ts +140 -0
- package/app/Actions/Storefront/UpdateCartItemAction.ts +83 -0
- package/app/Actions/Storefront/_shipping.ts +64 -0
- package/app/Actions/SubscriberEmailAction.ts +60 -0
- package/app/Actions/TestErrorAction.ts +163 -0
- package/app/Actions/UnsubscribeAction.ts +107 -0
- package/app/Actions/UploadTestAction.ts +57 -0
- package/app/Broadcasts/OrderShipped.ts +57 -0
- package/app/Commands/Inspire.ts +57 -0
- package/app/Commands/README.md +84 -0
- package/app/Commands.ts +38 -0
- package/app/Controllers/ComingSoonController.ts +9 -0
- package/app/Controllers/QueryController.ts +373 -0
- package/app/Events.ts +14 -0
- package/app/Gates.ts +107 -0
- package/app/Jobs/ExampleJob.ts +20 -0
- package/app/Jobs/ExampleTwoJob.ts +12 -0
- package/app/Jobs/PruneModelsJob.ts +61 -0
- package/app/Jobs/PruneQueryLogsJob.ts +51 -0
- package/app/Jobs/README.md +79 -0
- package/app/Jobs/SendCampaignJob.ts +201 -0
- package/app/Jobs/SendEmailJob.ts +52 -0
- package/app/Jobs/SendPasswordResetEmailJob.ts +44 -0
- package/app/Jobs/SyncSearchIndexJob.ts +64 -0
- package/app/Listener.ts +84 -0
- package/app/Listeners/Console.ts +22 -0
- package/app/Listeners/README.md +47 -0
- package/app/Mail/OrderConfirmation.ts +60 -0
- package/app/Mail/SubscriptionConfirmation.ts +41 -0
- package/app/Middleware/Abilities.ts +53 -0
- package/app/Middleware/Api.ts +26 -0
- package/app/Middleware/Auth.ts +59 -0
- package/app/Middleware/Can.ts +68 -0
- package/app/Middleware/Compress.ts +213 -0
- package/app/Middleware/Cors.ts +320 -0
- package/app/Middleware/Csrf.ts +224 -0
- package/app/Middleware/EnsureEmailIsVerified.ts +28 -0
- package/app/Middleware/Env.ts +24 -0
- package/app/Middleware/EnvDevelopment.ts +19 -0
- package/app/Middleware/EnvLocal.ts +19 -0
- package/app/Middleware/EnvNotDevelopment.ts +19 -0
- package/app/Middleware/EnvNotLocal.ts +19 -0
- package/app/Middleware/EnvNotProduction.ts +19 -0
- package/app/Middleware/EnvNotStaging.ts +19 -0
- package/app/Middleware/EnvProduction.ts +19 -0
- package/app/Middleware/EnvStaging.ts +19 -0
- package/app/Middleware/Guest.ts +25 -0
- package/app/Middleware/Logger.ts +20 -0
- package/app/Middleware/Maintenance.ts +36 -0
- package/app/Middleware/Permission.ts +42 -0
- package/app/Middleware/README.md +48 -0
- package/app/Middleware/Role.ts +42 -0
- package/app/Middleware/Signed.ts +31 -0
- package/app/Middleware/Team.ts +36 -0
- package/app/Middleware/Throttle.ts +96 -0
- package/app/Middleware.ts +35 -0
- package/app/Models/Activity.ts +94 -0
- package/app/Models/Board.ts +103 -0
- package/app/Models/BoardColumn.ts +87 -0
- package/app/Models/Campaign.ts +239 -0
- package/app/Models/CampaignSend.ts +107 -0
- package/app/Models/Card.ts +117 -0
- package/app/Models/CardComment.ts +68 -0
- package/app/Models/Comment.ts +108 -0
- package/app/Models/Content/Author.ts +104 -0
- package/app/Models/Content/Page.ts +99 -0
- package/app/Models/Content/Post.ts +144 -0
- package/app/Models/Deployment.ts +116 -0
- package/app/Models/EmailList.ts +126 -0
- package/app/Models/EmailListSubscriber.ts +91 -0
- package/app/Models/Error.ts +70 -0
- package/app/Models/FailedJob.ts +62 -0
- package/app/Models/Job.ts +63 -0
- package/app/Models/Label.ts +66 -0
- package/app/Models/Log.ts +110 -0
- package/app/Models/Notification.ts +118 -0
- package/app/Models/PaymentMethod.ts +98 -0
- package/app/Models/PaymentProduct.ts +91 -0
- package/app/Models/PaymentTransaction.ts +78 -0
- package/app/Models/README.md +31 -0
- package/app/Models/Release.ts +89 -0
- package/app/Models/Request.ts +114 -0
- package/app/Models/SocialPost.ts +136 -0
- package/app/Models/Subscriber.ts +89 -0
- package/app/Models/SubscriberEmail.ts +55 -0
- package/app/Models/Subscription.ts +153 -0
- package/app/Models/Tag.ts +82 -0
- package/app/Models/Team.ts +72 -0
- package/app/Models/User.ts +134 -0
- package/app/Models/commerce/Cart.ts +139 -0
- package/app/Models/commerce/CartItem.ts +137 -0
- package/app/Models/commerce/Category.ts +105 -0
- package/app/Models/commerce/Coupon.ts +181 -0
- package/app/Models/commerce/Customer.ts +132 -0
- package/app/Models/commerce/DeliveryRoute.ts +93 -0
- package/app/Models/commerce/DigitalDelivery.ts +105 -0
- package/app/Models/commerce/Driver.ts +97 -0
- package/app/Models/commerce/GiftCard.ts +191 -0
- package/app/Models/commerce/LicenseKey.ts +87 -0
- package/app/Models/commerce/LoyaltyPoint.ts +107 -0
- package/app/Models/commerce/LoyaltyReward.ts +124 -0
- package/app/Models/commerce/Manufacturer.ts +84 -0
- package/app/Models/commerce/Order.ts +142 -0
- package/app/Models/commerce/OrderItem.ts +51 -0
- package/app/Models/commerce/Payment.ts +163 -0
- package/app/Models/commerce/PrintDevice.ts +117 -0
- package/app/Models/commerce/Product.ts +148 -0
- package/app/Models/commerce/ProductUnit.ts +107 -0
- package/app/Models/commerce/ProductVariant.ts +106 -0
- package/app/Models/commerce/Receipt.ts +128 -0
- package/app/Models/commerce/Review.ts +140 -0
- package/app/Models/commerce/ShippingMethod.ts +97 -0
- package/app/Models/commerce/ShippingRate.ts +74 -0
- package/app/Models/commerce/ShippingZone.ts +111 -0
- package/app/Models/commerce/TaxRate.ts +114 -0
- package/app/Models/commerce/Transaction.ts +126 -0
- package/app/Models/commerce/WaitlistProduct.ts +149 -0
- package/app/Models/commerce/WaitlistRestaurant.ts +187 -0
- package/app/Models/realtime/Websocket.ts +77 -0
- package/app/Notifications/README.md +31 -0
- package/app/Notifications/Welcome.ts +32 -0
- package/app/Policies/PostPolicy.ts +131 -0
- package/app/README.md +23 -0
- package/app/Routes.ts +47 -0
- package/app/Scheduler.ts +28 -0
- package/app/Storefront/CartCookie.ts +109 -0
- package/package.json +3 -2
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# What are Listeners
|
|
2
|
+
|
|
3
|
+
Currently, only one specific kind of listener is allowed: `Console.ts`.
|
|
4
|
+
|
|
5
|
+
## Get Started
|
|
6
|
+
|
|
7
|
+
A simple example of how Console listeners work. _For a closer look, take a peak at the [Console.ts](./Console.ts) file._
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
export default function (cli: CLI) {
|
|
11
|
+
// Listen to the `inspire:three` command
|
|
12
|
+
cli.on('inspire:three', () => {
|
|
13
|
+
console.log('not yet implemented...')
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
// Listen to the default command
|
|
17
|
+
cli.on('inspire:!', () => {
|
|
18
|
+
// Do something
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
// Listen to unknown commands
|
|
22
|
+
cli.on('inspire:*', () => {
|
|
23
|
+
console.error('Invalid command: %s', cli.args.join(' '))
|
|
24
|
+
process.exit(1)
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 🚜 Contributing
|
|
30
|
+
|
|
31
|
+
Please review the [Contributing Guide](https://github.com/stacksjs/contributing) for details.
|
|
32
|
+
|
|
33
|
+
## 🏝 Community
|
|
34
|
+
|
|
35
|
+
For help, discussion about best practices, or any other conversation that would benefit from being searchable:
|
|
36
|
+
|
|
37
|
+
[Discussions on GitHub](https://github.com/stacksjs/stacks/discussions)
|
|
38
|
+
|
|
39
|
+
For casual chit-chat with others using this package:
|
|
40
|
+
|
|
41
|
+
[Join the Stacks Discord Server](https://discord.gg/stacksjs)
|
|
42
|
+
|
|
43
|
+
## 📄 License
|
|
44
|
+
|
|
45
|
+
The MIT License (MIT). Please see [LICENSE](../../LICENSE.md) for more information.
|
|
46
|
+
|
|
47
|
+
Made with 💙
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { config } from '@stacksjs/config'
|
|
2
|
+
import { mail, template } from '@stacksjs/email'
|
|
3
|
+
|
|
4
|
+
export interface OrderConfirmationItem {
|
|
5
|
+
name: string
|
|
6
|
+
qty: number
|
|
7
|
+
lineTotal: number
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface OrderConfirmationOptions {
|
|
11
|
+
to: string
|
|
12
|
+
orderId: number | string
|
|
13
|
+
customerName?: string
|
|
14
|
+
items: OrderConfirmationItem[]
|
|
15
|
+
subtotal: number
|
|
16
|
+
shipping: number
|
|
17
|
+
total: number
|
|
18
|
+
shippingAddress?: string
|
|
19
|
+
/** Absolute URL the receipt CTA should link to (e.g. `/orders/123`). */
|
|
20
|
+
orderUrl: string
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Send the post-checkout receipt email.
|
|
25
|
+
*
|
|
26
|
+
* Uses `resources/emails/order-confirmation.stx` for the layout. The
|
|
27
|
+
* template renders the items table, totals, and a "View your order"
|
|
28
|
+
* CTA back to the storefront. Failures bubble up as rejected
|
|
29
|
+
* promises — the calling action should `.catch()` so a mailer
|
|
30
|
+
* outage doesn't fail the order.
|
|
31
|
+
*/
|
|
32
|
+
export async function sendOrderConfirmation(options: OrderConfirmationOptions): Promise<void> {
|
|
33
|
+
const appName = config.app.name || 'PetStore'
|
|
34
|
+
const fromAddress = config.email.from?.address || 'hello@stacksjs.com'
|
|
35
|
+
|
|
36
|
+
const { html, text } = await template('order-confirmation', {
|
|
37
|
+
variables: {
|
|
38
|
+
orderId: options.orderId,
|
|
39
|
+
orderUrl: options.orderUrl,
|
|
40
|
+
customerName: options.customerName || 'there',
|
|
41
|
+
items: options.items,
|
|
42
|
+
subtotal: options.subtotal,
|
|
43
|
+
shipping: options.shipping,
|
|
44
|
+
total: options.total,
|
|
45
|
+
shippingAddress: options.shippingAddress || '',
|
|
46
|
+
appName,
|
|
47
|
+
},
|
|
48
|
+
subject: `Your ${appName} order #${options.orderId} is confirmed`,
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
await mail.send({
|
|
52
|
+
to: [options.to],
|
|
53
|
+
from: { name: appName, address: fromAddress },
|
|
54
|
+
subject: `Your ${appName} order #${options.orderId} is confirmed`,
|
|
55
|
+
html,
|
|
56
|
+
text,
|
|
57
|
+
})
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export default sendOrderConfirmation
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { config } from '@stacksjs/config'
|
|
2
|
+
import { mail, template } from '@stacksjs/email'
|
|
3
|
+
import { url } from '@stacksjs/router'
|
|
4
|
+
|
|
5
|
+
export interface SubscriptionConfirmationOptions {
|
|
6
|
+
to: string
|
|
7
|
+
subscriberUuid: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Send a subscription confirmation email with an unsubscribe link.
|
|
12
|
+
*
|
|
13
|
+
* Uses the `resources/emails/subscription-confirmation.stx` template.
|
|
14
|
+
*/
|
|
15
|
+
export async function sendSubscriptionConfirmation(options: SubscriptionConfirmationOptions): Promise<void> {
|
|
16
|
+
const { to, subscriberUuid } = options
|
|
17
|
+
|
|
18
|
+
const appName = config.app.name || 'Stacks'
|
|
19
|
+
const unsubscribeUrl = url('email.unsubscribe', { token: subscriberUuid })
|
|
20
|
+
|
|
21
|
+
const { html, text } = await template('subscription-confirmation', {
|
|
22
|
+
variables: {
|
|
23
|
+
email: to,
|
|
24
|
+
unsubscribeUrl,
|
|
25
|
+
},
|
|
26
|
+
subject: `Welcome to ${appName}!`,
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
await mail.send({
|
|
30
|
+
to: [to],
|
|
31
|
+
from: {
|
|
32
|
+
name: config.email.from?.name || appName,
|
|
33
|
+
address: config.email.from?.address || 'hello@stacksjs.com',
|
|
34
|
+
},
|
|
35
|
+
subject: `Welcome to ${appName}!`,
|
|
36
|
+
html,
|
|
37
|
+
text,
|
|
38
|
+
})
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export default sendSubscriptionConfirmation
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { HttpError } from '@stacksjs/error-handling'
|
|
2
|
+
import { Middleware } from '@stacksjs/router'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Token Abilities Middleware
|
|
6
|
+
*
|
|
7
|
+
* This middleware checks if the current token has the required abilities/scopes.
|
|
8
|
+
* Must be used after the 'auth' middleware.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* - Add 'abilities:read,write' middleware to routes that require specific abilities
|
|
12
|
+
* - The abilities are passed as a comma-separated string after the colon
|
|
13
|
+
*
|
|
14
|
+
* Example:
|
|
15
|
+
* route.get('/admin', 'AdminAction').middleware('auth').middleware('abilities:admin')
|
|
16
|
+
* route.post('/posts', 'CreatePostAction').middleware('auth').middleware('abilities:posts:create')
|
|
17
|
+
*/
|
|
18
|
+
export default new Middleware({
|
|
19
|
+
name: 'abilities',
|
|
20
|
+
priority: 2, // Run after auth middleware
|
|
21
|
+
|
|
22
|
+
async handle(request) {
|
|
23
|
+
// Get the required abilities from middleware parameters
|
|
24
|
+
// This would be passed like 'abilities:read,write'
|
|
25
|
+
const requiredAbilities = request._middlewareParams?.abilities?.split(',') || []
|
|
26
|
+
|
|
27
|
+
if (requiredAbilities.length === 0) {
|
|
28
|
+
// No abilities required, pass through
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Get the current access token
|
|
33
|
+
const token = request._currentAccessToken
|
|
34
|
+
|
|
35
|
+
if (!token) {
|
|
36
|
+
throw new HttpError(401, 'Unauthenticated.')
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const tokenAbilities: string[] = token.abilities || []
|
|
40
|
+
|
|
41
|
+
// Wildcard grants all permissions
|
|
42
|
+
if (tokenAbilities.includes('*')) {
|
|
43
|
+
return
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Check if token has ALL required abilities
|
|
47
|
+
for (const ability of requiredAbilities) {
|
|
48
|
+
if (!tokenAbilities.includes(ability.trim())) {
|
|
49
|
+
throw new HttpError(403, `Missing required ability: ${ability.trim()}`)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
})
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { HttpError } from '@stacksjs/error-handling'
|
|
2
|
+
import { Middleware } from '@stacksjs/router'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* API Middleware
|
|
6
|
+
*
|
|
7
|
+
* Validates that the request includes a valid API key or meets
|
|
8
|
+
* API-specific requirements (Accept header, rate limiting prefix, etc.).
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* route.group({ middleware: 'api' }, () => {
|
|
12
|
+
* route.get('/data', 'DataAction')
|
|
13
|
+
* })
|
|
14
|
+
*/
|
|
15
|
+
export default new Middleware({
|
|
16
|
+
name: 'api',
|
|
17
|
+
priority: 1,
|
|
18
|
+
|
|
19
|
+
async handle(request) {
|
|
20
|
+
// Ensure the request accepts JSON
|
|
21
|
+
const accept = request.headers.get('accept') || ''
|
|
22
|
+
if (!accept.includes('application/json') && !accept.includes('*/*')) {
|
|
23
|
+
throw new HttpError(406, 'This endpoint only serves JSON responses. Set Accept: application/json.')
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
})
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { HttpError } from '@stacksjs/error-handling'
|
|
2
|
+
import { Middleware } from '@stacksjs/router'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Authentication Middleware
|
|
6
|
+
*
|
|
7
|
+
* Validates the bearer token from the request and ensures
|
|
8
|
+
* the user is authenticated before proceeding.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* route.get('/dashboard', 'DashboardAction').middleware('auth')
|
|
12
|
+
* route.group({ middleware: 'auth' }, () => { ... })
|
|
13
|
+
*/
|
|
14
|
+
function extractBearerToken(request: any): string | null {
|
|
15
|
+
if (typeof request.bearerToken === 'function') {
|
|
16
|
+
const t = request.bearerToken()
|
|
17
|
+
if (t)
|
|
18
|
+
return t
|
|
19
|
+
}
|
|
20
|
+
const authHeader
|
|
21
|
+
= (typeof request.header === 'function' && request.header('authorization'))
|
|
22
|
+
|| request.headers?.get?.('authorization')
|
|
23
|
+
|| request.headers?.get?.('Authorization')
|
|
24
|
+
if (typeof authHeader === 'string' && authHeader.startsWith('Bearer '))
|
|
25
|
+
return authHeader.substring(7)
|
|
26
|
+
return null
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export default new Middleware({
|
|
30
|
+
name: 'Auth',
|
|
31
|
+
priority: 1,
|
|
32
|
+
|
|
33
|
+
async handle(request) {
|
|
34
|
+
const { Auth } = await import('@stacksjs/auth')
|
|
35
|
+
|
|
36
|
+
const bearerToken = extractBearerToken(request)
|
|
37
|
+
|
|
38
|
+
if (!bearerToken)
|
|
39
|
+
throw new HttpError(401, 'Unauthorized. No token provided.')
|
|
40
|
+
|
|
41
|
+
const isValid = await Auth.validateToken(bearerToken)
|
|
42
|
+
if (!isValid)
|
|
43
|
+
throw new HttpError(401, 'Unauthorized. Invalid token.')
|
|
44
|
+
|
|
45
|
+
const user = await Auth.getUserFromToken(bearerToken)
|
|
46
|
+
if (user) {
|
|
47
|
+
Auth.setUser(user)
|
|
48
|
+
;request._authenticatedUser = user
|
|
49
|
+
// Do NOT overwrite `request.user` — `enhanceRequest` declared
|
|
50
|
+
// it as an async function (`user(): Promise<UserModel | undefined>`)
|
|
51
|
+
// and downstream action code reaches for `await request.user()`.
|
|
52
|
+
// Replacing the function with a User object made every caller
|
|
53
|
+
// throw "user is not a function" post-auth. Read from
|
|
54
|
+
// `_authenticatedUser` via `request.user()` instead — the helper
|
|
55
|
+
// prefers the stamped value before falling back to a token
|
|
56
|
+
// lookup. See stacksjs/stacks#1860 M-9.
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
})
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { AuthorizationException, authorize } from '@stacksjs/auth'
|
|
2
|
+
import { HttpError } from '@stacksjs/error-handling'
|
|
3
|
+
import { Middleware } from '@stacksjs/router'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Authorization Gate Middleware
|
|
7
|
+
*
|
|
8
|
+
* This middleware checks if the current user is authorized to perform an action
|
|
9
|
+
* using the Gate system. Must be used after the 'auth' middleware.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* - Add 'can:ability' middleware to routes that require specific authorization
|
|
13
|
+
* - Add 'can:ability,modelParam' to authorize against a route model
|
|
14
|
+
*
|
|
15
|
+
* Examples:
|
|
16
|
+
* route.get('/settings', 'SettingsAction').middleware('auth').middleware('can:edit-settings')
|
|
17
|
+
* route.put('/posts/:post', 'UpdatePostAction').middleware('auth').middleware('can:update,post')
|
|
18
|
+
* route.delete('/posts/:post', 'DeletePostAction').middleware('auth').middleware('can:delete,post')
|
|
19
|
+
*/
|
|
20
|
+
export default new Middleware({
|
|
21
|
+
name: 'can',
|
|
22
|
+
priority: 3, // Run after auth and abilities middleware
|
|
23
|
+
|
|
24
|
+
async handle(request) {
|
|
25
|
+
// Get the ability and optional model parameter from middleware params
|
|
26
|
+
// Format: 'can:ability' or 'can:ability,modelParam'
|
|
27
|
+
const params = request._middlewareParams?.can?.split(',') || []
|
|
28
|
+
|
|
29
|
+
if (params.length === 0) {
|
|
30
|
+
// No ability specified, pass through (should this be an error?)
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const ability = params[0]?.trim()
|
|
35
|
+
const modelParam = params[1]?.trim()
|
|
36
|
+
|
|
37
|
+
if (!ability) {
|
|
38
|
+
throw new HttpError(500, 'Authorization middleware requires an ability parameter')
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Get the authenticated user
|
|
42
|
+
const user = request.user || request._user || null
|
|
43
|
+
|
|
44
|
+
// Prepare arguments for the gate check
|
|
45
|
+
const args: any[] = []
|
|
46
|
+
|
|
47
|
+
// If a model parameter is specified, get it from route params
|
|
48
|
+
if (modelParam) {
|
|
49
|
+
const routeParams = request.params || {}
|
|
50
|
+
const model = routeParams[modelParam]
|
|
51
|
+
|
|
52
|
+
if (model) {
|
|
53
|
+
args.push(model)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Perform the authorization check
|
|
58
|
+
try {
|
|
59
|
+
await authorize(ability, user, ...args)
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error instanceof AuthorizationException) {
|
|
63
|
+
throw new HttpError(error.status || 403, error.message)
|
|
64
|
+
}
|
|
65
|
+
throw error
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
})
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { brotliCompressSync, constants as zlibConstants } from 'node:zlib'
|
|
2
|
+
import { Buffer } from 'node:buffer'
|
|
3
|
+
import { Middleware } from '@stacksjs/router'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Response Compression Middleware
|
|
7
|
+
*
|
|
8
|
+
* Compresses outgoing response bodies with brotli or gzip when the
|
|
9
|
+
* client advertises support via `Accept-Encoding`. The middleware
|
|
10
|
+
* runs at the *end* of the chain — by the time it executes, the
|
|
11
|
+
* action has already produced a response and stored it on the
|
|
12
|
+
* request via `_response`. (We intercept by patching the response
|
|
13
|
+
* after the chain ends — see implementation note below.)
|
|
14
|
+
*
|
|
15
|
+
* IMPORTANT — middleware shape mismatch:
|
|
16
|
+
* The Stacks middleware runner only invokes `handle()` for
|
|
17
|
+
* pre-action gating; it has no post-response hook. To compress
|
|
18
|
+
* the *outgoing* response, this middleware therefore acts as a
|
|
19
|
+
* marker — its real work is implemented as a *response wrapper*
|
|
20
|
+
* that the router applies whenever the `compress` middleware is
|
|
21
|
+
* attached (see Compress.applyToResponse below).
|
|
22
|
+
*
|
|
23
|
+
* In practice, calling code uses the exported `applyCompression()`
|
|
24
|
+
* helper directly:
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* import { applyCompression } from '@stacksjs/middleware/Compress'
|
|
29
|
+
*
|
|
30
|
+
* const response = await action.handle(req)
|
|
31
|
+
* return applyCompression(req, response)
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* Compression decisions:
|
|
35
|
+
* - **Skip** if response already has `content-encoding` set.
|
|
36
|
+
* - **Skip** if body smaller than 1 KB — overhead exceeds savings.
|
|
37
|
+
* - **Skip** for already-compressed content types (image/*, video/*,
|
|
38
|
+
* audio/*, application/zip, gzip, octet-stream).
|
|
39
|
+
* - **Skip** SSE / WebSocket upgrades (`text/event-stream`).
|
|
40
|
+
* - **Prefer brotli** when `br` is offered. Brotli typically
|
|
41
|
+
* achieves ~20% better ratios than gzip on HTML/JSON/CSS/JS at
|
|
42
|
+
* comparable CPU cost — well worth the swap when the client
|
|
43
|
+
* supports it.
|
|
44
|
+
* - **Fall back to gzip** for `gzip` clients (universal support).
|
|
45
|
+
*
|
|
46
|
+
* Headers always added when compressed:
|
|
47
|
+
* - `Content-Encoding: br | gzip`
|
|
48
|
+
* - `Vary: Accept-Encoding` (so caches segment by encoding)
|
|
49
|
+
*
|
|
50
|
+
* `Content-Length` is rewritten to the compressed size.
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
/** Body must exceed this threshold (bytes) to warrant compression. */
|
|
54
|
+
const MIN_COMPRESS_BYTES = 1024
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Content-types that are already compressed (or untouchable). Re-running
|
|
58
|
+
* gzip/brotli over them gains nothing and wastes CPU.
|
|
59
|
+
*
|
|
60
|
+
* Pattern matched as `startsWith` against the lowercased content-type
|
|
61
|
+
* (sans parameters). Intentionally conservative — we'd rather miss a
|
|
62
|
+
* compression opportunity than corrupt a binary stream by double-encoding.
|
|
63
|
+
*/
|
|
64
|
+
const SKIP_CONTENT_TYPE_PREFIXES = [
|
|
65
|
+
'image/',
|
|
66
|
+
'video/',
|
|
67
|
+
'audio/',
|
|
68
|
+
'application/zip',
|
|
69
|
+
'application/gzip',
|
|
70
|
+
'application/x-gzip',
|
|
71
|
+
'application/x-bzip2',
|
|
72
|
+
'application/x-brotli',
|
|
73
|
+
'application/octet-stream',
|
|
74
|
+
// SSE / streaming pipelines must not be buffered for compression.
|
|
75
|
+
'text/event-stream',
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
/** Parse the q-weighted Accept-Encoding header into a preference set. */
|
|
79
|
+
function pickEncoding(acceptEncoding: string | null): 'br' | 'gzip' | null {
|
|
80
|
+
if (!acceptEncoding) return null
|
|
81
|
+
// We don't fully implement q-value parsing — it's overkill for the
|
|
82
|
+
// brotli-vs-gzip choice. We just check for token presence.
|
|
83
|
+
const lc = acceptEncoding.toLowerCase()
|
|
84
|
+
// Brotli first because it ratios better on text — typical 20% smaller
|
|
85
|
+
// than gzip on HTML/JSON. CPU cost per byte is similar at default
|
|
86
|
+
// quality on Node's libbrotli.
|
|
87
|
+
if (lc.includes('br')) return 'br'
|
|
88
|
+
if (lc.includes('gzip')) return 'gzip'
|
|
89
|
+
return null
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Heuristic: is this content type worth compressing? */
|
|
93
|
+
function shouldCompressContentType(contentType: string | null): boolean {
|
|
94
|
+
if (!contentType) return true // unknown → assume text-like
|
|
95
|
+
const ct = (contentType.toLowerCase().split(';')[0] ?? '').trim()
|
|
96
|
+
for (const prefix of SKIP_CONTENT_TYPE_PREFIXES) {
|
|
97
|
+
if (ct.startsWith(prefix)) return false
|
|
98
|
+
}
|
|
99
|
+
return true
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Compress a Response if (a) the client supports an encoding, (b) the
|
|
104
|
+
* body is large enough, and (c) the content type isn't already
|
|
105
|
+
* compressed. Returns the original Response unchanged when any of
|
|
106
|
+
* those conditions don't hold.
|
|
107
|
+
*
|
|
108
|
+
* Buffers the entire body in memory — appropriate for the typical
|
|
109
|
+
* JSON/HTML response sizes we're targeting (KB to single-digit MB).
|
|
110
|
+
* For multi-MB streamed responses, the middleware should be skipped
|
|
111
|
+
* (the SSE / event-stream check above handles the most common case).
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```ts
|
|
115
|
+
* const response = Response.json({ users: [...] })
|
|
116
|
+
* return await applyCompression(request, response)
|
|
117
|
+
* // → response with `Content-Encoding: br` and a brotli-compressed body
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
export async function applyCompression(request: Request, response: Response): Promise<Response> {
|
|
121
|
+
// Already encoded — leave it alone. Re-encoding would corrupt the
|
|
122
|
+
// body, and the client already knows what to expect.
|
|
123
|
+
if (response.headers.get('content-encoding')) return response
|
|
124
|
+
|
|
125
|
+
// No body or non-text content streams (SSE, etc.) — skip.
|
|
126
|
+
if (!response.body) return response
|
|
127
|
+
|
|
128
|
+
const contentType = response.headers.get('content-type')
|
|
129
|
+
if (!shouldCompressContentType(contentType)) return response
|
|
130
|
+
|
|
131
|
+
const encoding = pickEncoding(request.headers.get('accept-encoding'))
|
|
132
|
+
if (!encoding) return response
|
|
133
|
+
|
|
134
|
+
// Buffer the body. We need the full payload to compress synchronously
|
|
135
|
+
// (Bun.gzipSync / brotliCompressSync) AND to know the post-compression
|
|
136
|
+
// length for the Content-Length header.
|
|
137
|
+
const bodyBuf = Buffer.from(await response.arrayBuffer())
|
|
138
|
+
if (bodyBuf.byteLength < MIN_COMPRESS_BYTES) {
|
|
139
|
+
// Body too small — re-emit as a fresh Response since we already
|
|
140
|
+
// consumed `response.body` above.
|
|
141
|
+
return new Response(bodyBuf, {
|
|
142
|
+
status: response.status,
|
|
143
|
+
statusText: response.statusText,
|
|
144
|
+
headers: response.headers,
|
|
145
|
+
})
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
let compressed: Buffer
|
|
149
|
+
if (encoding === 'br') {
|
|
150
|
+
// Brotli quality 5 is the sweet spot for dynamic responses:
|
|
151
|
+
// quality 11 (max) is ~10× slower for ~5% smaller output.
|
|
152
|
+
// 5 is also the Express compression-middleware default.
|
|
153
|
+
compressed = brotliCompressSync(bodyBuf, {
|
|
154
|
+
params: {
|
|
155
|
+
[zlibConstants.BROTLI_PARAM_QUALITY]: 5,
|
|
156
|
+
},
|
|
157
|
+
})
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
// Bun.gzipSync is significantly faster than node:zlib.gzipSync
|
|
161
|
+
// for typical response sizes — used here in preference to
|
|
162
|
+
// node:zlib for the gzip path. Brotli has no Bun-native API yet
|
|
163
|
+
// (as of writing) so we use node:zlib for that branch.
|
|
164
|
+
compressed = Buffer.from(Bun.gzipSync(bodyBuf))
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const newHeaders = new Headers(response.headers)
|
|
168
|
+
newHeaders.set('Content-Encoding', encoding)
|
|
169
|
+
newHeaders.set('Content-Length', String(compressed.byteLength))
|
|
170
|
+
// Caches MUST key on Accept-Encoding once we vary the body by it,
|
|
171
|
+
// otherwise a gzip-only proxy serves a brotli body to a gzip-only
|
|
172
|
+
// client and the response is undecodable.
|
|
173
|
+
const existingVary = newHeaders.get('Vary')
|
|
174
|
+
if (existingVary) {
|
|
175
|
+
if (!/\baccept-encoding\b/i.test(existingVary)) {
|
|
176
|
+
newHeaders.set('Vary', `${existingVary}, Accept-Encoding`)
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
newHeaders.set('Vary', 'Accept-Encoding')
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return new Response(compressed, {
|
|
184
|
+
status: response.status,
|
|
185
|
+
statusText: response.statusText,
|
|
186
|
+
headers: newHeaders,
|
|
187
|
+
})
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Marker middleware. The router inspects the route middleware list for
|
|
192
|
+
* `compress` and, when present, runs `applyCompression()` on the final
|
|
193
|
+
* response. The middleware's `handle` is intentionally a no-op:
|
|
194
|
+
* compression must run *after* the action, but the standard middleware
|
|
195
|
+
* pipeline runs *before* it.
|
|
196
|
+
*
|
|
197
|
+
* @example
|
|
198
|
+
* ```ts
|
|
199
|
+
* route.get('/api/large.json', 'Actions/LargePayload').middleware('compress')
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
export default new Middleware({
|
|
203
|
+
name: 'compress',
|
|
204
|
+
// Run last in the pre-action chain so the marker stamp lands close
|
|
205
|
+
// to the action — the post-action wrapper picks it up by name.
|
|
206
|
+
priority: 100,
|
|
207
|
+
|
|
208
|
+
async handle(request) {
|
|
209
|
+
// Stamp the request so the post-response wrapper knows to compress.
|
|
210
|
+
// This is read by the router's response-finalization step.
|
|
211
|
+
;request._compress = true
|
|
212
|
+
},
|
|
213
|
+
})
|