@spacemade/ui 0.0.1
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/README.md +705 -0
- package/app.sh +806 -0
- package/cmd.sh +152 -0
- package/docs/cms-quickstart.md +206 -0
- package/docs/gallery-quickstart.md +24 -0
- package/docs/gpu-marketplace-quickstart.md +27 -0
- package/docs/metaverse-quickstart.md +25 -0
- package/docs/migration-plan.md +41 -0
- package/docs/modules.md +34 -0
- package/docs/nft-quickstart.md +26 -0
- package/docs/simple-cms-quickstart.md +22 -0
- package/middleware.ts +77 -0
- package/next-env.d.ts +6 -0
- package/next.config.ts +39 -0
- package/package.json +92 -0
- package/public/android-chrome-192x192.png +0 -0
- package/public/android-chrome-512x512.png +0 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/images/default-profile/1.png +0 -0
- package/public/images/default-profile/2.png +0 -0
- package/public/images/default-profile/3.png +0 -0
- package/public/images/default-profile/4.png +0 -0
- package/public/images/default-profile/5.png +0 -0
- package/public/images/default-profile/6.png +0 -0
- package/public/images/default-profile/7.png +0 -0
- package/public/images/defaults/Login-Person-Icon-dark.svg +13 -0
- package/public/images/defaults/Login-Person-Icon.svg +16 -0
- package/public/images/defaults/default-avatar.png +0 -0
- package/public/images/defaults/image-not-available.jpg +0 -0
- package/public/images/icons/amazon-icon.jpg +0 -0
- package/public/images/icons/azure-icon.png +0 -0
- package/public/images/icons/google-icon.jpg +0 -0
- package/public/site.webmanifest +1 -0
- package/scripts/crud-scaffold/bin/crud-scaffold.mjs +23 -0
- package/scripts/crud-scaffold/src/api/index.mjs +666 -0
- package/scripts/crud-scaffold/src/app/patches.mjs +355 -0
- package/scripts/crud-scaffold/src/core/fields.mjs +165 -0
- package/scripts/crud-scaffold/src/core/utils.mjs +161 -0
- package/scripts/crud-scaffold/src/frontend/index.mjs +1078 -0
- package/scripts/crud-scaffold/src/generator.mjs +103 -0
- package/scripts/crud-scaffold/src/templates/.gitkeep +1 -0
- package/scripts/crud-scaffold/src/utils/generator-utils.mjs +35 -0
- package/scripts/defs/cms-definition.mjs +1393 -0
- package/scripts/defs/gallery-definition.mjs +171 -0
- package/scripts/defs/gpu-definition.mjs +174 -0
- package/scripts/defs/metaverse-definition.mjs +170 -0
- package/scripts/defs/nft-definition.mjs +191 -0
- package/scripts/defs/simple-cms-definition.mjs +141 -0
- package/scripts/generate-cms-install-system.mjs +4 -0
- package/scripts/generate-gallery-system.mjs +4 -0
- package/scripts/generate-gpu-marketplace-system.mjs +4 -0
- package/scripts/generate-metaverse-system.mjs +4 -0
- package/scripts/generate-nft-system.mjs +4 -0
- package/scripts/generate-simple-cms-system.mjs +4 -0
- package/scripts/link-core.mjs +72 -0
- package/scripts/spacemade.mjs +446 -0
- package/scripts/test-generate-app.mjs +60 -0
- package/src/components/Dashboard/DashboardList.tsx +70 -0
- package/src/components/Dashboard/dashboardLayout.tsx +57 -0
- package/src/components/admin/nav/AdminLeftNav.tsx +168 -0
- package/src/components/auth/AuthBootstrap.tsx +47 -0
- package/src/components/auth/auth-card-shell.tsx +23 -0
- package/src/components/auth/forgot-password-form-template.tsx +37 -0
- package/src/components/auth/form/ForgotForm.tsx +146 -0
- package/src/components/auth/form/ResetPasswordForm.tsx +122 -0
- package/src/components/auth/form/SignInForm.tsx +139 -0
- package/src/components/auth/form/SignUpForm.tsx +166 -0
- package/src/components/auth/form/UpdateForm.tsx +165 -0
- package/src/components/auth/login-form-template.tsx +45 -0
- package/src/components/billing/CardBrandIcon.tsx +126 -0
- package/src/components/billing/block/BillingDetailsCard.tsx +120 -0
- package/src/components/billing/block/BillingHistory.tsx +143 -0
- package/src/components/billing/block/PlanDetails.tsx +138 -0
- package/src/components/billing/modal/UpdateCardDetailsModal.tsx +451 -0
- package/src/components/billing/modal/UpdatePlanModal.tsx +194 -0
- package/src/components/category/modal/UpdateCategoryModal.tsx +170 -0
- package/src/components/category/table/CategoryTable.tsx +137 -0
- package/src/components/common/Icons/BrainCircuitIcon.tsx +14 -0
- package/src/components/common/Icons/MagnifyingGlassChartIcon.tsx +14 -0
- package/src/components/common/Icons/PeopleGroupIcon.tsx +14 -0
- package/src/components/common/Icons/ScrewdriverWrenchIcon.tsx +14 -0
- package/src/components/common/Icons/SendMessageIcon.tsx +15 -0
- package/src/components/common/Icons/ShareIcon.tsx +22 -0
- package/src/components/common/Icons/XTwitterIcon.tsx +14 -0
- package/src/components/common/Image/OptimizedImage.tsx +17 -0
- package/src/components/common/SettingsPanel.tsx +119 -0
- package/src/components/common/badge/Badge.tsx +69 -0
- package/src/components/common/blocks/BackgroundImageBlock.tsx +43 -0
- package/src/components/common/blocks/Carousel.tsx +59 -0
- package/src/components/common/blocks/CodeSnippet.tsx +46 -0
- package/src/components/common/blocks/InfinityScrollWrapper.tsx +43 -0
- package/src/components/common/blocks/SplitBlock.tsx +47 -0
- package/src/components/common/blocks/TopImageBlock.tsx +39 -0
- package/src/components/common/button/Button.tsx +49 -0
- package/src/components/common/button/ButtonWithActions.tsx +71 -0
- package/src/components/common/button/DropdownButton.tsx +61 -0
- package/src/components/common/button/ScrollDownArrow.tsx +23 -0
- package/src/components/common/button/SharerActionBox.tsx +248 -0
- package/src/components/common/button/UserButton.tsx +209 -0
- package/src/components/common/contact/ContactForm.tsx +214 -0
- package/src/components/common/cta/Cta.tsx +18 -0
- package/src/components/common/dialog/ConversationFullscreenModal.tsx +95 -0
- package/src/components/common/dialog/DeleteDialog.tsx +90 -0
- package/src/components/common/dialog/MobileFiltersDrawer.tsx +60 -0
- package/src/components/common/dialog/RenameDialog.tsx +128 -0
- package/src/components/common/faq/FAQSection.tsx +119 -0
- package/src/components/common/filters/NameSearch.tsx +87 -0
- package/src/components/common/footer/SmallFooter.tsx +62 -0
- package/src/components/common/forms/AdvanceAccordion.tsx +154 -0
- package/src/components/common/forms/CheckBox.tsx +29 -0
- package/src/components/common/forms/DateTimePicker.tsx +101 -0
- package/src/components/common/forms/Dropzone.tsx +278 -0
- package/src/components/common/forms/EmailTagInput.tsx +67 -0
- package/src/components/common/forms/FieldAssistantBar.tsx +32 -0
- package/src/components/common/forms/HTMLEditor.tsx +48 -0
- package/src/components/common/forms/IconPicker.tsx +129 -0
- package/src/components/common/forms/Input.tsx +362 -0
- package/src/components/common/forms/InputColor.tsx +36 -0
- package/src/components/common/forms/RadioInputs.tsx +62 -0
- package/src/components/common/forms/Select.tsx +214 -0
- package/src/components/common/forms/SimpleTagsInput.tsx +89 -0
- package/src/components/common/forms/TagInput.tsx +111 -0
- package/src/components/common/forms/Textarea.tsx +99 -0
- package/src/components/common/forms/ToggleButton.tsx +67 -0
- package/src/components/common/forms/UserInvitePicker.tsx +600 -0
- package/src/components/common/header/AppPageTitle.tsx +34 -0
- package/src/components/common/header/SubtitleAccordion.tsx +63 -0
- package/src/components/common/home/block/GetStarted.tsx +17 -0
- package/src/components/common/home/block/Hero.tsx +33 -0
- package/src/components/common/home/block/InstallShortcut.tsx +41 -0
- package/src/components/common/home/block/MarketplaceBlock.tsx +34 -0
- package/src/components/common/home/block/OriginStoryBanner.tsx +17 -0
- package/src/components/common/home/block/OsirusCTABlock.tsx +21 -0
- package/src/components/common/home/block/PromoFeatureSlider.tsx +260 -0
- package/src/components/common/layout/DetailHero.tsx +87 -0
- package/src/components/common/layout/SideNavLayout.tsx +1016 -0
- package/src/components/common/layout/account/AccountLayout.tsx +99 -0
- package/src/components/common/layout/admin/AdminLayout.tsx +17 -0
- package/src/components/common/layout/explore/ExploreLayout.tsx +23 -0
- package/src/components/common/layout/explore/ExploreLayoutContent.tsx +20 -0
- package/src/components/common/layout/explore/ExploreLayoutFilters.tsx +28 -0
- package/src/components/common/loading/LoadingScreen.tsx +86 -0
- package/src/components/common/loading/Spinner.tsx +12 -0
- package/src/components/common/state/InvalidInviteCard.tsx +32 -0
- package/src/components/common/table/TableFilter.tsx +205 -0
- package/src/components/common/table/TableHeader.tsx +33 -0
- package/src/components/common/table/TablePaging.tsx +190 -0
- package/src/components/common/table/TablePagingButton.tsx +64 -0
- package/src/components/common/table/TablePagingInput.tsx +79 -0
- package/src/components/common/useUrlSelectedModel.ts +7 -0
- package/src/components/docs/DocsSitePreviewPage.tsx +122 -0
- package/src/components/docs/block/DocsPageDetailBlock.tsx +333 -0
- package/src/components/docs/block/DocsSidebarTopContent.tsx +8 -0
- package/src/components/docs/block/DocsSitePagesBlock.tsx +81 -0
- package/src/components/docs/block/DocsSitesBlock.tsx +35 -0
- package/src/components/docs/modal/CreateDocsSiteModal.tsx +132 -0
- package/src/components/docs/table/DocsPagesTable.tsx +163 -0
- package/src/components/docs/table/DocsSitesTable.tsx +109 -0
- package/src/components/groups/block/GroupInitialAvatar.tsx +53 -0
- package/src/components/groups/grid/OrgGroupMembersGrid.tsx +253 -0
- package/src/components/groups/modal/AddGroupModal.tsx +138 -0
- package/src/components/groups/modal/OrgGroupMembersModal.tsx +171 -0
- package/src/components/groups/modal/OrgGroupPermissionsModal.tsx +184 -0
- package/src/components/groups/table/OrgGroupsTable.tsx +470 -0
- package/src/components/head/DefaultMetadata.tsx +135 -0
- package/src/components/head/PageSeo.tsx +198 -0
- package/src/components/hoc/WithAuth.tsx +82 -0
- package/src/components/hoc/WithCustomerIO.tsx +48 -0
- package/src/components/hoc/WithGTM.tsx +31 -0
- package/src/components/hoc/WithGlobalContext.tsx +30 -0
- package/src/components/hoc/WithReCaptcha.tsx +31 -0
- package/src/components/hoc/WithStripe.tsx +68 -0
- package/src/components/layout/SidebarSizer.tsx +63 -0
- package/src/components/layout/app-left-nav.tsx +31 -0
- package/src/components/layout/app-main-layout.tsx +39 -0
- package/src/components/layout/site-footer.tsx +11 -0
- package/src/components/layout/site-header.tsx +19 -0
- package/src/components/marketplace/card/ProductCard.tsx +178 -0
- package/src/components/media/blocks/MediaAttachmentsList.tsx +79 -0
- package/src/components/media/blocks/MediaDetails.tsx +139 -0
- package/src/components/media/blocks/MediaGrid.tsx +245 -0
- package/src/components/media/form/MediaMiniForm.tsx +105 -0
- package/src/components/media/form/UpdateMediaForm.tsx +209 -0
- package/src/components/media/items/CircleMediaPicker.tsx +76 -0
- package/src/components/media/items/MediaAttachmentLinks.tsx +98 -0
- package/src/components/media/items/MediaDocumentPreview.tsx +43 -0
- package/src/components/media/items/MediaFileIcon.tsx +30 -0
- package/src/components/media/items/MediaPickerBox.tsx +94 -0
- package/src/components/media/items/MediaPickerButton.tsx +37 -0
- package/src/components/media/items/MediaSourcePreview.tsx +35 -0
- package/src/components/media/modal/AddMediaModal.tsx +237 -0
- package/src/components/media/modal/MediaAttachmentsModal.tsx +113 -0
- package/src/components/media/modal/MediaBulkDeleteWarningModal.tsx +142 -0
- package/src/components/media/modal/MediaDeleteWarningModal.tsx +98 -0
- package/src/components/media/modal/MediaPickerModal.tsx +201 -0
- package/src/components/media/table/MediaTable.tsx +340 -0
- package/src/components/media/table/MediaTableActions.tsx +130 -0
- package/src/components/media/table/MediaTableFilter.tsx +163 -0
- package/src/components/modules/module-card-grid.tsx +19 -0
- package/src/components/modules/module-page.tsx +27 -0
- package/src/components/modules/resource-page.tsx +15 -0
- package/src/components/nav/AdminMobileMenu.tsx +228 -0
- package/src/components/nav/AppTopNav.tsx +53 -0
- package/src/components/nav/MobileMenu.tsx +132 -0
- package/src/components/nav/TopNav.tsx +137 -0
- package/src/components/openapi/DeleteTokenModal.tsx +72 -0
- package/src/components/openapi/actions/ApiTokenActionsMenu.tsx +141 -0
- package/src/components/openapi/actions/ApiTokenCreateModal.tsx +107 -0
- package/src/components/openapi/actions/ApiTokenEditModal.tsx +168 -0
- package/src/components/orgs/OrgCreateModal.tsx +126 -0
- package/src/components/orgs/OrgJumpRedirect.tsx +150 -0
- package/src/components/page/SiteContentPage.tsx +129 -0
- package/src/components/post/accordion/FilterPostCategoriesAccordion.tsx +126 -0
- package/src/components/post/block/FeaturedProductCard.tsx +31 -0
- package/src/components/post/block/FeaturedProviderCard.tsx +51 -0
- package/src/components/post/block/InTheNews.tsx +77 -0
- package/src/components/post/block/PostCardsGrid.tsx +56 -0
- package/src/components/post/block/PostContent.tsx +128 -0
- package/src/components/post/block/PostDetailPage.tsx +95 -0
- package/src/components/post/block/PostList.tsx +111 -0
- package/src/components/post/block/PostNextAndPrevButtons.tsx +78 -0
- package/src/components/post/block/PostPeopleAlsoReadBlock.tsx +69 -0
- package/src/components/post/block/PostRelatedCards.tsx +43 -0
- package/src/components/post/card/FeaturedPostCard.tsx +107 -0
- package/src/components/post/card/InTheNewsCard.tsx +162 -0
- package/src/components/post/card/PostCard.tsx +125 -0
- package/src/components/post/card/RelatedPostCard.tsx +115 -0
- package/src/components/post/form/UpdatePostForm.tsx +639 -0
- package/src/components/post/modal/CreatePostModal.tsx +115 -0
- package/src/components/post/modal/PreviewPostModal.tsx +82 -0
- package/src/components/post/nav/BlogCategoriesSideNav.tsx +55 -0
- package/src/components/post/table/PostsTable.tsx +284 -0
- package/src/components/pricing/block/AddOnRow.tsx +78 -0
- package/src/components/pricing/block/CompletePurchase.tsx +546 -0
- package/src/components/pricing/block/PlanPicker.tsx +76 -0
- package/src/components/pricing/card/PricingCard.tsx +291 -0
- package/src/components/pricing/form/AddBillingInformationForm.tsx +212 -0
- package/src/components/pricing/form/AddPaymentMethodForm.tsx +252 -0
- package/src/components/pricing/form/CouponCodeForm.tsx +118 -0
- package/src/components/pricing/form/StripePaymentForm.tsx +106 -0
- package/src/components/product/block/ProductScreenshot.tsx +22 -0
- package/src/components/product/block/ProductScreenshotPreview.tsx +46 -0
- package/src/components/product/button/MediaScreenshotPicker.tsx +72 -0
- package/src/components/product/form/UpdateProductForm.tsx +718 -0
- package/src/components/product/modal/CreateProductModal.tsx +128 -0
- package/src/components/product/modal/UpdateProductCouponModal.tsx +227 -0
- package/src/components/product/modal/UpdateProductPlanModal.tsx +291 -0
- package/src/components/product/modal/UpdateProductVersionModal.tsx +236 -0
- package/src/components/product/table/ProductCouponsTable.tsx +100 -0
- package/src/components/product/table/ProductPlansTable.tsx +118 -0
- package/src/components/product/table/ProductVersionsAdminTable.tsx +103 -0
- package/src/components/product/table/ProductVersionsTable.tsx +111 -0
- package/src/components/product/table/ProductsTable.tsx +133 -0
- package/src/components/projects/ProjectFilesCard.tsx +134 -0
- package/src/components/projects/ProjectItemOptionButton.tsx +112 -0
- package/src/components/projects/ProjectPickerNav.tsx +440 -0
- package/src/components/projects/ProjectQuickCreateModal.tsx +159 -0
- package/src/components/projects/ProjectSidebarList.tsx +183 -0
- package/src/components/projects/actions/ProjectActionsMenu.tsx +77 -0
- package/src/components/projects/actions/ProjectCreateModal.tsx +577 -0
- package/src/components/projects/actions/ProjectEditModal.tsx +345 -0
- package/src/components/projects/actions/ProjectFileGrid.tsx +153 -0
- package/src/components/projects/actions/ProjectFilesModal.tsx +259 -0
- package/src/components/projects/actions/ProjectFilesPicker.tsx +31 -0
- package/src/components/projects/actions/ProjectFilesUploadModal.tsx +181 -0
- package/src/components/projects/actions/ProjectInstructions.tsx +160 -0
- package/src/components/projects/actions/RenameProjectModal.tsx +120 -0
- package/src/components/projects/actions/index.tsx +98 -0
- package/src/components/projects/block/HeaderProjectImagePicker.tsx +52 -0
- package/src/components/projects/permission/ProjectPermissionInviteModal.tsx +181 -0
- package/src/components/projects/permission/ProjectUserPermission.tsx +170 -0
- package/src/components/projects/postByCategory.tsx +118 -0
- package/src/components/projects/projectFileHistory.tsx +48 -0
- package/src/components/projects/table/ProjectTable.tsx +365 -0
- package/src/components/provider/BuildspecForm.tsx +288 -0
- package/src/components/provider/CreateProviderModal.tsx +210 -0
- package/src/components/provider/FeaturedProviders.tsx +137 -0
- package/src/components/provider/ProviderConnectModal.tsx +324 -0
- package/src/components/provider/form/UpdateProviderForm.tsx +449 -0
- package/src/components/provider/table/ProvidersTable.tsx +144 -0
- package/src/components/providers/ProviderFeaturesSideNav.tsx +52 -0
- package/src/components/settings/SettingsLayout.tsx +14 -0
- package/src/components/settings/SettingsSidebarNav.tsx +53 -0
- package/src/components/settings/settingsNav.ts +96 -0
- package/src/components/site/modal/UpdateSiteModal.tsx +134 -0
- package/src/components/site/table/SiteTable.tsx +198 -0
- package/src/components/starter/list-panel.tsx +12 -0
- package/src/components/starter/starter-overview.tsx +32 -0
- package/src/components/starter/stats-grid.tsx +20 -0
- package/src/components/storage/VectorStoreFileDeleteButton.tsx +71 -0
- package/src/components/storage/actions/VectorStoreActionsMenu.tsx +70 -0
- package/src/components/storage/actions/VectorStoreEditModal.tsx +220 -0
- package/src/components/storage/actions/VectorStoreFileActions.tsx +61 -0
- package/src/components/storage/actions/index.tsx +76 -0
- package/src/components/storage/addStorageModal.tsx +552 -0
- package/src/components/storage/table/vectorStoreTable.tsx +461 -0
- package/src/components/storage/vectorFilesModal.tsx +209 -0
- package/src/components/storage/vectorStoreFileGrid.tsx +384 -0
- package/src/components/tag/modal/UpdateTagModal.tsx +192 -0
- package/src/components/tag/table/TagTable.tsx +138 -0
- package/src/components/user/block/BadgesBlock.tsx +26 -0
- package/src/components/user/form/ChangePasswordForm.tsx +119 -0
- package/src/components/user/form/ProfileForm.tsx +168 -0
- package/src/components/user/grid/UserGrid.tsx +475 -0
- package/src/components/user/modal/AddUserModal.tsx +165 -0
- package/src/components/user/modal/UpdateUserDetailsModal.tsx +319 -0
- package/src/components/user/modal/UpgradeUserLimitModal.tsx +123 -0
- package/src/components/user/modal/UserPermissionsModal.tsx +251 -0
- package/src/components/user/table/UserTable.tsx +202 -0
- package/src/config/app.ts +16 -0
- package/src/config/modules.ts +100 -0
- package/src/config/navigation.ts +28 -0
- package/src/config/runtime.ts +3 -0
- package/src/context/CheckoutContext.tsx +123 -0
- package/src/context/ProjectContext.tsx +123 -0
- package/src/context/RouterContext.tsx +127 -0
- package/src/context/UIContext.tsx +47 -0
- package/src/context/UserAuthContext.tsx +26 -0
- package/src/context/VectorStoreContext.tsx +51 -0
- package/src/context/index.ts +2 -0
- package/src/data/bootstrap-icons.json +2080 -0
- package/src/data/bootstrap.ts +196 -0
- package/src/data/bootstrapIcons.ts +28 -0
- package/src/enum/AppEnvironments.ts +4 -0
- package/src/enum/HTTPErrorStatus.ts +10 -0
- package/src/helpers/api/index.ts +123 -0
- package/src/helpers/constants/index.ts +4 -0
- package/src/helpers/constants/messages.ts +1 -0
- package/src/helpers/constants/regex.ts +10 -0
- package/src/helpers/constants/stripe.ts +1 -0
- package/src/helpers/constants/system-agent.ts +12 -0
- package/src/helpers/data-transform/bytesToSize.ts +8 -0
- package/src/helpers/data-transform/dropzone.ts +116 -0
- package/src/helpers/data-transform/filterUtils.ts +21 -0
- package/src/helpers/data-transform/index.ts +4 -0
- package/src/helpers/data-transform/operations.ts +3 -0
- package/src/helpers/data-transform/paging.ts +24 -0
- package/src/helpers/data-transform/stringCaseTransform.ts +34 -0
- package/src/helpers/date/index.ts +149 -0
- package/src/helpers/error/formErrorHandler.tsx +38 -0
- package/src/helpers/images/assets.ts +32 -0
- package/src/helpers/images/defaultProfileImage.ts +21 -0
- package/src/helpers/images/fileType.ts +123 -0
- package/src/helpers/images/index.ts +3 -0
- package/src/helpers/navigation/routeScroll.ts +29 -0
- package/src/helpers/pageScreenshot.ts +176 -0
- package/src/helpers/permissions/index.ts +292 -0
- package/src/helpers/providers/providerFeatures.ts +29 -0
- package/src/helpers/sharer/index.ts +44 -0
- package/src/helpers/sitemap/sitemap-utils.ts +50 -0
- package/src/helpers/slugUtils/index.ts +39 -0
- package/src/helpers/sonicVoices.ts +22 -0
- package/src/helpers/string/index.ts +93 -0
- package/src/helpers/theme/colors.ts +27 -0
- package/src/helpers/types/api.ts +22 -0
- package/src/helpers/types/customer-io.ts +47 -0
- package/src/helpers/types/data-layer.ts +25 -0
- package/src/helpers/types/index.ts +4 -0
- package/src/helpers/types/nav.ts +13 -0
- package/src/helpers/types/page-props.ts +31 -0
- package/src/helpers/types/select-option.ts +4 -0
- package/src/helpers/types/utils.ts +7 -0
- package/src/helpers/url/index.ts +26 -0
- package/src/hooks/auth/useAccountStore.ts +69 -0
- package/src/hooks/auth/useAuthStore.ts +162 -0
- package/src/hooks/category/useCategoryStore.ts +71 -0
- package/src/hooks/index.ts +17 -0
- package/src/hooks/media/useMediaStore.ts +46 -0
- package/src/hooks/post/usePostStore.ts +64 -0
- package/src/hooks/post/usePostUtils.ts +27 -0
- package/src/hooks/product/useProductPlanStore.ts +73 -0
- package/src/hooks/product/useProductStore.ts +64 -0
- package/src/hooks/product/useProductVersionStore.ts +57 -0
- package/src/hooks/site/useSiteStore.ts +53 -0
- package/src/hooks/tag/useTagStore.ts +65 -0
- package/src/hooks/utils/useAutosizeTextArea.ts +20 -0
- package/src/hooks/utils/useCountries.ts +25 -0
- package/src/hooks/utils/useGA4DataLayer.ts +25 -0
- package/src/hooks/utils/useNavOptions.ts +241 -0
- package/src/hooks/utils/useSearchAndFilterCommon.ts +78 -0
- package/src/hooks/utils/useTrackingEvents.ts +65 -0
- package/src/lib/app-paths.ts +19 -0
- package/src/lib/auth.ts +42 -0
- package/src/lib/next-router.ts +164 -0
- package/src/lib/routes.ts +36 -0
- package/src/lib/security.ts +19 -0
- package/src/pages/404.tsx +104 -0
- package/src/pages/500.tsx +26 -0
- package/src/pages/_app.tsx +87 -0
- package/src/pages/_document.tsx +26 -0
- package/src/pages/account/verify.tsx +178 -0
- package/src/pages/admin/activity/[activityId].tsx +77 -0
- package/src/pages/admin/activity/bans.tsx +197 -0
- package/src/pages/admin/activity/index.tsx +207 -0
- package/src/pages/admin/activity/settings.tsx +189 -0
- package/src/pages/admin/categories/index.tsx +61 -0
- package/src/pages/admin/coupons/index.tsx +38 -0
- package/src/pages/admin/entitlements/index.tsx +646 -0
- package/src/pages/admin/index.tsx +65 -0
- package/src/pages/admin/media/[id]/index.tsx +55 -0
- package/src/pages/admin/media/index.tsx +62 -0
- package/src/pages/admin/orgs/[orgId]/[name].tsx +1 -0
- package/src/pages/admin/orgs/index.tsx +256 -0
- package/src/pages/admin/plans/index.tsx +26 -0
- package/src/pages/admin/posts/[id].tsx +80 -0
- package/src/pages/admin/posts/index.tsx +63 -0
- package/src/pages/admin/products/[id].tsx +71 -0
- package/src/pages/admin/products/index.tsx +62 -0
- package/src/pages/admin/profile/index.tsx +26 -0
- package/src/pages/admin/providers/[id].tsx +77 -0
- package/src/pages/admin/providers/index.tsx +63 -0
- package/src/pages/admin/tags/index.tsx +58 -0
- package/src/pages/admin/users/[userId]/[name].tsx +1 -0
- package/src/pages/admin/users/index.tsx +295 -0
- package/src/pages/admin/versions/[id].tsx +211 -0
- package/src/pages/admin/versions/index.tsx +25 -0
- package/src/pages/blog/[postSlug].tsx +106 -0
- package/src/pages/blog/c/[categorySlug]/index.tsx +126 -0
- package/src/pages/blog/index.tsx +37 -0
- package/src/pages/cart/[productPlanSlug].tsx +631 -0
- package/src/pages/checkout/[productPlanSlug].tsx +368 -0
- package/src/pages/docs/index.tsx +24 -0
- package/src/pages/docs/sites/[siteId]/[siteName]/index.tsx +67 -0
- package/src/pages/docs/sites/[siteId]/[siteName]/pages/[pagesId].tsx +79 -0
- package/src/pages/docs/sites/[siteId]/[siteName]/pages/index.tsx +67 -0
- package/src/pages/docs/sites/[siteId]/[siteName]/preview/[[...slug]].tsx +7 -0
- package/src/pages/forgot.tsx +46 -0
- package/src/pages/groups/[groupId]/[name].tsx +337 -0
- package/src/pages/groups/index.tsx +62 -0
- package/src/pages/healthcheck.tsx +7 -0
- package/src/pages/index.tsx +309 -0
- package/src/pages/login.tsx +75 -0
- package/src/pages/marketplace/[slug].tsx +171 -0
- package/src/pages/marketplace/index.tsx +92 -0
- package/src/pages/openapi/index.tsx +77 -0
- package/src/pages/openapi/tokens/index.tsx +128 -0
- package/src/pages/org/[name]/settings.tsx +14 -0
- package/src/pages/org/[name]/token/index.tsx +109 -0
- package/src/pages/pricing.tsx +242 -0
- package/src/pages/projects/[projectId]/[name]/files/index.tsx +121 -0
- package/src/pages/projects/[projectId]/[name]/index.tsx +305 -0
- package/src/pages/projects/[projectId]/[name]/permission/index.tsx +143 -0
- package/src/pages/projects/[projectId]/token/index.tsx +120 -0
- package/src/pages/projects/index.tsx +129 -0
- package/src/pages/providers/[name].tsx +512 -0
- package/src/pages/providers/index.tsx +472 -0
- package/src/pages/reset.tsx +69 -0
- package/src/pages/settings/billing/index.tsx +41 -0
- package/src/pages/settings/index.tsx +133 -0
- package/src/pages/settings/organizations/[orgId]/invite/index.tsx +162 -0
- package/src/pages/settings/organizations/[orgId]/settings/index.tsx +98 -0
- package/src/pages/settings/organizations/[orgId]/token/index.tsx +109 -0
- package/src/pages/settings/organizations/index.tsx +148 -0
- package/src/pages/settings/organizations/new/index.tsx +252 -0
- package/src/pages/settings/profile/change-password.tsx +26 -0
- package/src/pages/settings/profile/index.tsx +103 -0
- package/src/pages/settings/profile/org-profile.tsx +127 -0
- package/src/pages/settings/profile/profile.tsx +26 -0
- package/src/pages/settings/sites/index.tsx +85 -0
- package/src/pages/settings/subscriptions/index.tsx +76 -0
- package/src/pages/settings/tokens/index.tsx +149 -0
- package/src/pages/signup/index.tsx +83 -0
- package/src/pages/signup/verify.tsx +138 -0
- package/src/pages/sites/[siteId]/[siteName]/[[...slug]].tsx +103 -0
- package/src/pages/sites/[siteId]/[siteName]/pages/[pageId].tsx +243 -0
- package/src/pages/sites/[siteId]/[siteName]/pages/index.tsx +140 -0
- package/src/pages/sites/host/[[...slug]].tsx +75 -0
- package/src/pages/storage/[vectorStoreId]/[name].tsx +653 -0
- package/src/pages/storage/index.tsx +526 -0
- package/src/pages/update/index.tsx +109 -0
- package/src/pages/update/verify.tsx +121 -0
- package/src/pages/users/[userId]/[name].tsx +791 -0
- package/src/pages/users/index.tsx +152 -0
- package/src/sass/app.scss +59 -0
- package/src/sass/base/_animations.scss +70 -0
- package/src/sass/base/_borders.scss +78 -0
- package/src/sass/base/_custom-backgrounds.scss +107 -0
- package/src/sass/base/_interactions.scss +35 -0
- package/src/sass/base/_main.scss +239 -0
- package/src/sass/base/_positions.scss +111 -0
- package/src/sass/base/_sizes.scss +120 -0
- package/src/sass/base/_typography.scss +184 -0
- package/src/sass/components/_accordion.scss +63 -0
- package/src/sass/components/_ad.scss +44 -0
- package/src/sass/components/_avatar.scss +18 -0
- package/src/sass/components/_badge.scss +6 -0
- package/src/sass/components/_button.scss +53 -0
- package/src/sass/components/_checkbox.scss +52 -0
- package/src/sass/components/_circle-media-picker.scss +32 -0
- package/src/sass/components/_code-snipped.scss +50 -0
- package/src/sass/components/_date-time-picker.scss +796 -0
- package/src/sass/components/_dialog.scss +27 -0
- package/src/sass/components/_gradients.scss +7 -0
- package/src/sass/components/_group-detail.scss +620 -0
- package/src/sass/components/_input.scss +567 -0
- package/src/sass/components/_menu.scss +31 -0
- package/src/sass/components/_modal.scss +273 -0
- package/src/sass/components/_popover.scss +29 -0
- package/src/sass/components/_rich-content.scss +531 -0
- package/src/sass/components/_spinner.scss +71 -0
- package/src/sass/components/_swagger.scss +7 -0
- package/src/sass/components/_swiper.scss +16 -0
- package/src/sass/components/_switch.scss +46 -0
- package/src/sass/components/_table.scss +39 -0
- package/src/sass/components/_tabs.scss +38 -0
- package/src/sass/components/_tag-input.scss +28 -0
- package/src/sass/components/_toast.scss +26 -0
- package/src/sass/components/_tooltip.scss +31 -0
- package/src/sass/layout/_base.scss +937 -0
- package/src/sass/layout/_footer.scss +148 -0
- package/src/sass/layout/_hero.scss +33 -0
- package/src/sass/layout/_nav.scss +77 -0
- package/src/sass/layout/_news-card-grid.scss +507 -0
- package/src/sass/utilities/_mixins.scss +21 -0
- package/src/sass/utilities/_sizes.scss +137 -0
- package/src/sass/utilities/_utils.scss +23 -0
- package/src/sass/utilities/_variables.scss +115 -0
- package/src/store/hooks.ts +5 -0
- package/src/store/hydrate.ts +1 -0
- package/src/store/model/activity.model.ts +52 -0
- package/src/store/model/address.model.ts +9 -0
- package/src/store/model/apiToken.model.ts +26 -0
- package/src/store/model/category.model.ts +20 -0
- package/src/store/model/entityStatus.model.ts +25 -0
- package/src/store/model/index.ts +25 -0
- package/src/store/model/invoice.model.ts +37 -0
- package/src/store/model/media.model.ts +70 -0
- package/src/store/model/org-group-permission.model.ts +16 -0
- package/src/store/model/org-group.model.ts +14 -0
- package/src/store/model/org-membership.model.ts +23 -0
- package/src/store/model/org.model.ts +13 -0
- package/src/store/model/page.model.ts +33 -0
- package/src/store/model/post.model.ts +60 -0
- package/src/store/model/product-coupon.model.ts +42 -0
- package/src/store/model/product-feature-entitlement.ts +40 -0
- package/src/store/model/product-feature.ts +29 -0
- package/src/store/model/product-plan.model.ts +120 -0
- package/src/store/model/product-version.model.ts +24 -0
- package/src/store/model/product.model.ts +91 -0
- package/src/store/model/project-file.model.ts +18 -0
- package/src/store/model/project-user-permission.model.ts +41 -0
- package/src/store/model/project.model.ts +48 -0
- package/src/store/model/provider.model.ts +118 -0
- package/src/store/model/purchase.model.ts +19 -0
- package/src/store/model/site-crawl-job.model.ts +31 -0
- package/src/store/model/site-page.model.ts +37 -0
- package/src/store/model/site.model.ts +15 -0
- package/src/store/model/subscription.model.ts +60 -0
- package/src/store/model/tag.model.ts +18 -0
- package/src/store/model/user-permission.model.ts +21 -0
- package/src/store/model/user.model.ts +97 -0
- package/src/store/model/vector-store-file.model.ts +40 -0
- package/src/store/model/vector-store.model.ts +41 -0
- package/src/store/slice/api/accountApiSlice.ts +92 -0
- package/src/store/slice/api/accountSlice.ts +57 -0
- package/src/store/slice/api/activityApiSlice.ts +218 -0
- package/src/store/slice/api/apiTokenSlice.ts +153 -0
- package/src/store/slice/api/authApiSlice.ts +220 -0
- package/src/store/slice/api/base-domain-api.ts +19 -0
- package/src/store/slice/api/billingUnitTypesApiSlice.ts +45 -0
- package/src/store/slice/api/bootstrapIconApiSlice.ts +36 -0
- package/src/store/slice/api/categoriesApiSlice.ts +101 -0
- package/src/store/slice/api/fontawesomeApiSlice.ts +43 -0
- package/src/store/slice/api/invoiceApiSlice.ts +37 -0
- package/src/store/slice/api/leadApiSlice.ts +48 -0
- package/src/store/slice/api/mediaApiSlice.ts +276 -0
- package/src/store/slice/api/orgApiSlice.ts +185 -0
- package/src/store/slice/api/orgGroupApiSlice.ts +146 -0
- package/src/store/slice/api/pageApiSlice.ts +111 -0
- package/src/store/slice/api/paymentApiSlice.ts +27 -0
- package/src/store/slice/api/postApiSlice.ts +369 -0
- package/src/store/slice/api/productCouponsApiSlice.ts +101 -0
- package/src/store/slice/api/productFeaturesApiSlice.ts +93 -0
- package/src/store/slice/api/productPlansApiSlice.ts +142 -0
- package/src/store/slice/api/productSubscriptionsApiSlice.ts +156 -0
- package/src/store/slice/api/productVersionsApiSlice.ts +116 -0
- package/src/store/slice/api/productsApiSlice.ts +169 -0
- package/src/store/slice/api/projectApiSlice.ts +135 -0
- package/src/store/slice/api/projectFileApiSlice.ts +152 -0
- package/src/store/slice/api/projectUserPermissionApiSlice.ts +153 -0
- package/src/store/slice/api/providerApiSlice.ts +259 -0
- package/src/store/slice/api/providerSettingApiSlice.ts +174 -0
- package/src/store/slice/api/siteApiSlice.ts +93 -0
- package/src/store/slice/api/stripeApiSlice.ts +114 -0
- package/src/store/slice/api/tagsApiSlice.ts +96 -0
- package/src/store/slice/api/userApiSlice.ts +305 -0
- package/src/store/slice/api/vectorStoreApiSlice.ts +119 -0
- package/src/store/slice/api/vectorStoreFileApiSlice.ts +127 -0
- package/src/store/store.ts +130 -0
- package/src/types/bootstrap.ts +30 -0
- package/tsconfig.json +103 -0
package/cmd.sh
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
ENV_FILE="${ENV_FILE:-${ROOT_DIR}/.env}"
|
|
6
|
+
|
|
7
|
+
args=("$@")
|
|
8
|
+
|
|
9
|
+
load_env() {
|
|
10
|
+
if [[ -f "$ENV_FILE" ]]; then
|
|
11
|
+
while IFS='=' read -r key value; do
|
|
12
|
+
[[ -z "${key:-}" ]] && continue
|
|
13
|
+
[[ "$key" =~ ^# ]] && continue
|
|
14
|
+
|
|
15
|
+
key="$(echo -e "${key}" | tr -d '[:space:]')"
|
|
16
|
+
value="$(echo -e "${value:-}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
|
|
17
|
+
|
|
18
|
+
[[ -z "$key" ]] && continue
|
|
19
|
+
[[ "$key" =~ [^A-Za-z0-9_]+ ]] && continue
|
|
20
|
+
|
|
21
|
+
export "$key"="$value"
|
|
22
|
+
done < "$ENV_FILE"
|
|
23
|
+
fi
|
|
24
|
+
}
|
|
25
|
+
load_env
|
|
26
|
+
|
|
27
|
+
usage() {
|
|
28
|
+
cat <<'EOFUSAGE'
|
|
29
|
+
Usage: ./cmd.sh <command> [args]
|
|
30
|
+
|
|
31
|
+
General:
|
|
32
|
+
init cms [--force] Generate the default CMS install system scaffold
|
|
33
|
+
init simple-cms [--force] Generate the simple CMS scaffold
|
|
34
|
+
init gallery [--force] Generate the image gallery scaffold
|
|
35
|
+
init nft [--force] Generate the NFT marketplace scaffold
|
|
36
|
+
init gpu [--force] Generate the GPU marketplace scaffold
|
|
37
|
+
init metaverse [--force] Generate the metaverse hosting scaffold
|
|
38
|
+
init all [--force] Run all product scaffolds
|
|
39
|
+
migrate <product> Run product migrations from api/lib/<product>/migrations
|
|
40
|
+
help Show this help output
|
|
41
|
+
EOFUSAGE
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
run_generator() {
|
|
45
|
+
local script_name="${1:-}"
|
|
46
|
+
local extra_arg="${2:-}"
|
|
47
|
+
cd "$ROOT_DIR"
|
|
48
|
+
|
|
49
|
+
if [[ "$extra_arg" == "--force" ]]; then
|
|
50
|
+
npm run "$script_name" -- --force
|
|
51
|
+
else
|
|
52
|
+
npm run "$script_name"
|
|
53
|
+
fi
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
init() {
|
|
57
|
+
local mode="${1:-cms}"
|
|
58
|
+
local extra_arg="${2:-}"
|
|
59
|
+
|
|
60
|
+
case "$mode" in
|
|
61
|
+
cms)
|
|
62
|
+
run_generator "generate:cms" "$extra_arg"
|
|
63
|
+
;;
|
|
64
|
+
simple-cms)
|
|
65
|
+
run_generator "generate:simple-cms" "$extra_arg"
|
|
66
|
+
;;
|
|
67
|
+
gallery)
|
|
68
|
+
run_generator "generate:gallery" "$extra_arg"
|
|
69
|
+
;;
|
|
70
|
+
nft)
|
|
71
|
+
run_generator "generate:nft" "$extra_arg"
|
|
72
|
+
;;
|
|
73
|
+
gpu)
|
|
74
|
+
run_generator "generate:gpu" "$extra_arg"
|
|
75
|
+
;;
|
|
76
|
+
metaverse)
|
|
77
|
+
run_generator "generate:metaverse" "$extra_arg"
|
|
78
|
+
;;
|
|
79
|
+
all)
|
|
80
|
+
run_generator "generate:cms" "$extra_arg"
|
|
81
|
+
run_generator "generate:simple-cms" "$extra_arg"
|
|
82
|
+
run_generator "generate:gallery" "$extra_arg"
|
|
83
|
+
run_generator "generate:nft" "$extra_arg"
|
|
84
|
+
run_generator "generate:gpu" "$extra_arg"
|
|
85
|
+
run_generator "generate:metaverse" "$extra_arg"
|
|
86
|
+
;;
|
|
87
|
+
*)
|
|
88
|
+
echo "Unknown init mode: $mode" >&2
|
|
89
|
+
echo "Use one of: cms, simple-cms, gallery, nft, gpu, metaverse, all" >&2
|
|
90
|
+
exit 1
|
|
91
|
+
;;
|
|
92
|
+
esac
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
docker_compose_available() {
|
|
96
|
+
command -v docker-compose >/dev/null 2>&1
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
docker_api_is_running() {
|
|
100
|
+
docker_compose_available && docker-compose ps -q api >/dev/null 2>&1 && [[ -n "$(docker-compose ps -q api)" ]]
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
migrate() {
|
|
104
|
+
local product="${1:-}"
|
|
105
|
+
|
|
106
|
+
if [[ -z "$product" ]]; then
|
|
107
|
+
echo "Missing product name. Example: ./cmd.sh migrate simple-cms" >&2
|
|
108
|
+
exit 1
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
if [[ ! "$product" =~ ^[a-z0-9][a-z0-9-]*$ ]]; then
|
|
112
|
+
echo "Invalid product name: $product" >&2
|
|
113
|
+
exit 1
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
local migration_path="lib/${product}/migrations"
|
|
117
|
+
local migration_dir="${ROOT_DIR}/api/${migration_path}"
|
|
118
|
+
|
|
119
|
+
if [[ ! -d "$migration_dir" ]]; then
|
|
120
|
+
echo "No migrations found at api/${migration_path}" >&2
|
|
121
|
+
exit 1
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
cd "$ROOT_DIR"
|
|
125
|
+
|
|
126
|
+
if docker_api_is_running; then
|
|
127
|
+
docker-compose exec -T api npx sequelize db:migrate --migrations-path "$migration_path"
|
|
128
|
+
return
|
|
129
|
+
fi
|
|
130
|
+
|
|
131
|
+
cd "${ROOT_DIR}/api"
|
|
132
|
+
npx sequelize db:migrate --migrations-path "$migration_path"
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
main() {
|
|
136
|
+
local cmd="${1:-}"
|
|
137
|
+
shift || true
|
|
138
|
+
load_env
|
|
139
|
+
|
|
140
|
+
case "$cmd" in
|
|
141
|
+
init) init "$@" ;;
|
|
142
|
+
migrate) migrate "$@" ;;
|
|
143
|
+
help|-h|--help|"") usage ;;
|
|
144
|
+
*)
|
|
145
|
+
echo "Unknown command: $cmd" >&2
|
|
146
|
+
usage
|
|
147
|
+
exit 1
|
|
148
|
+
;;
|
|
149
|
+
esac
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
main "$@"
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# CMS Quickstart
|
|
2
|
+
|
|
3
|
+
This guide is for using `appstudio` as the base repo for a CMS-focused admin product.
|
|
4
|
+
|
|
5
|
+
The main `README.md` stays generic on purpose. This file is the product-specific quickstart for a CMS-style control plane.
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
Build an Admin app that can:
|
|
10
|
+
|
|
11
|
+
- sell plans
|
|
12
|
+
- launch subscribed products as deployments
|
|
13
|
+
- connect deployments to core sites
|
|
14
|
+
- handle backups
|
|
15
|
+
- support operations teams
|
|
16
|
+
|
|
17
|
+
## Recommended Domain Models
|
|
18
|
+
|
|
19
|
+
Start with these product models on top of the App Studio core:
|
|
20
|
+
|
|
21
|
+
- `DeploymentTemplate`
|
|
22
|
+
- `Deployment`
|
|
23
|
+
- `DeploymentJob`
|
|
24
|
+
- `DeploymentBackup`
|
|
25
|
+
|
|
26
|
+
## Suggested Responsibilities
|
|
27
|
+
|
|
28
|
+
### `Deployment`
|
|
29
|
+
|
|
30
|
+
Use for the primary customer-owned launch record for a subscribed product.
|
|
31
|
+
|
|
32
|
+
Suggested fields:
|
|
33
|
+
|
|
34
|
+
- `id`
|
|
35
|
+
- `orgId`
|
|
36
|
+
- `projectId`
|
|
37
|
+
- `siteId`
|
|
38
|
+
- `productId`
|
|
39
|
+
- `productPlanId`
|
|
40
|
+
- `subscriptionId`
|
|
41
|
+
- `providerId`
|
|
42
|
+
- `deploymentSpecKey`
|
|
43
|
+
- `deploymentValues`
|
|
44
|
+
- `name`
|
|
45
|
+
- `slug`
|
|
46
|
+
- `status`
|
|
47
|
+
- `templateId`
|
|
48
|
+
- `runtimeKey`
|
|
49
|
+
- `ownerUserId`
|
|
50
|
+
- `createdAt`
|
|
51
|
+
- `updatedAt`
|
|
52
|
+
|
|
53
|
+
### Product Deployment Metadata
|
|
54
|
+
|
|
55
|
+
Use the core product layer to store reusable deployment metadata. This follows the older cloud app pattern where catalog/product versions hold `resourceUrl`, `resourceSpec`, and `resourceParams`, while deployments hold only runtime selection and values.
|
|
56
|
+
|
|
57
|
+
Until `ProductVersion` exists in App Studio, store provider-specific deployment options in `Product.formSpecs`.
|
|
58
|
+
|
|
59
|
+
For example:
|
|
60
|
+
|
|
61
|
+
- CMS on AWS can save a deployment option with `providerKey: aws`, `specFormat: cloudformation`, and a `resourceUrl` pointing at the CloudFormation template.
|
|
62
|
+
- CMS on Google can save a deployment option with `providerKey: google`, `specFormat: terraform`, and Terraform source/module metadata.
|
|
63
|
+
- CMS on Azure can save a deployment option with `providerKey: azure`, `specFormat: terraform`, `script`, or a future Azure-native format.
|
|
64
|
+
|
|
65
|
+
Example `formSpecs` value:
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
[
|
|
69
|
+
{
|
|
70
|
+
"key": "aws-cloudformation",
|
|
71
|
+
"label": "AWS CloudFormation",
|
|
72
|
+
"providerKey": "aws",
|
|
73
|
+
"specFormat": "cloudformation",
|
|
74
|
+
"resourceUrl": "s3://templates/cms/cloudformation.yaml"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"key": "google-terraform",
|
|
78
|
+
"label": "Google Terraform",
|
|
79
|
+
"providerKey": "google",
|
|
80
|
+
"specFormat": "terraform",
|
|
81
|
+
"resourceUrl": "git::https://example.com/cms/terraform/google.git"
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Deployments should not pass template/buildspec blobs through URLs or launch requests. The launch request should pass IDs plus the selected `deploymentSpecKey` and runtime `deploymentValues`.
|
|
87
|
+
|
|
88
|
+
### `DeploymentTemplate`
|
|
89
|
+
|
|
90
|
+
Use for deployment blueprints or starter site definitions.
|
|
91
|
+
|
|
92
|
+
Suggested fields:
|
|
93
|
+
|
|
94
|
+
- `id`
|
|
95
|
+
- `name`
|
|
96
|
+
- `slug`
|
|
97
|
+
- `description`
|
|
98
|
+
- `version`
|
|
99
|
+
- `isActive`
|
|
100
|
+
|
|
101
|
+
### `DeploymentJob`
|
|
102
|
+
|
|
103
|
+
Use for async deployment creation and operational jobs.
|
|
104
|
+
|
|
105
|
+
Suggested fields:
|
|
106
|
+
|
|
107
|
+
- `id`
|
|
108
|
+
- `deploymentId`
|
|
109
|
+
- `productId`
|
|
110
|
+
- `subscriptionId`
|
|
111
|
+
- `providerId`
|
|
112
|
+
- `deploymentSpecKey`
|
|
113
|
+
- `jobType`
|
|
114
|
+
- `status`
|
|
115
|
+
- `payload`
|
|
116
|
+
- `startedAt`
|
|
117
|
+
- `finishedAt`
|
|
118
|
+
- `errorMessage`
|
|
119
|
+
|
|
120
|
+
### `DeploymentBackup`
|
|
121
|
+
|
|
122
|
+
Use for backup and restore tracking.
|
|
123
|
+
|
|
124
|
+
Suggested fields:
|
|
125
|
+
|
|
126
|
+
- `id`
|
|
127
|
+
- `deploymentId`
|
|
128
|
+
- `backupType`
|
|
129
|
+
- `storageKey`
|
|
130
|
+
- `status`
|
|
131
|
+
- `createdAt`
|
|
132
|
+
|
|
133
|
+
## Recommended API Areas
|
|
134
|
+
|
|
135
|
+
Create API routes such as:
|
|
136
|
+
|
|
137
|
+
- `api/pages/api/cms-templates/index.ts`
|
|
138
|
+
- `api/pages/api/cms-deployments/index.ts`
|
|
139
|
+
- `api/pages/api/cms-deployments/launchable-products.ts`
|
|
140
|
+
- `api/pages/api/cms-deployment-jobs/index.ts`
|
|
141
|
+
- `api/pages/api/cms-backups/index.ts`
|
|
142
|
+
|
|
143
|
+
## Generator
|
|
144
|
+
|
|
145
|
+
App Studio includes a generator script for the default CMS install system scaffold.
|
|
146
|
+
|
|
147
|
+
Run:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
npm run generate:cms
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
This creates starter files for:
|
|
154
|
+
|
|
155
|
+
- API models
|
|
156
|
+
- services
|
|
157
|
+
- controllers
|
|
158
|
+
- API route handlers
|
|
159
|
+
- frontend store placeholders
|
|
160
|
+
- starter product pages
|
|
161
|
+
|
|
162
|
+
Use overwrite mode when you intentionally want to regenerate:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
npm run generate:cms -- --force
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Recommended UI Areas
|
|
169
|
+
|
|
170
|
+
The app picker should show `Deployments` as the top-level app entry, matching the `/storage` pattern. The related CMS routes remain available inside the generated deployments area:
|
|
171
|
+
|
|
172
|
+
- `/templates`
|
|
173
|
+
- `/deployments`
|
|
174
|
+
- `/deployment-jobs`
|
|
175
|
+
- `/backups`
|
|
176
|
+
|
|
177
|
+
Deployment detail pages should expose quick actions for Templates, Deployment Jobs, and Backups. Those actions can be wired to deployment-scoped views later.
|
|
178
|
+
|
|
179
|
+
## Deployment Flow
|
|
180
|
+
|
|
181
|
+
Typical lifecycle:
|
|
182
|
+
|
|
183
|
+
1. Customer signs up.
|
|
184
|
+
2. Customer creates an org.
|
|
185
|
+
3. Customer picks a product or plan.
|
|
186
|
+
4. Billing creates an active subscription.
|
|
187
|
+
5. The deployment UI calls `/cms-deployments/launchable-products` to list subscribed product plans that do not yet have a `Deployment`.
|
|
188
|
+
6. Customer selects one subscribed product and one provider/deployment option, such as AWS/CloudFormation or Google/Terraform.
|
|
189
|
+
7. System creates a `Deployment` with `productId`, `productPlanId`, `subscriptionId`, `providerId`, `deploymentSpecKey`, and `deploymentValues`, then queues a `DeploymentJob`.
|
|
190
|
+
8. Provisioning marks the deployment ready and links it to a core `Site`.
|
|
191
|
+
9. Customer manages domains through the site layer and manages backups/settings through the deployment layer.
|
|
192
|
+
|
|
193
|
+
## Billing Mapping
|
|
194
|
+
|
|
195
|
+
Map Stripe entitlements to CMS-specific limits such as:
|
|
196
|
+
|
|
197
|
+
- `deployment_limit`
|
|
198
|
+
- `cms_template_limit`
|
|
199
|
+
- `backup_retention_days`
|
|
200
|
+
|
|
201
|
+
## Recommendation
|
|
202
|
+
|
|
203
|
+
Keep this as a product-layer guide.
|
|
204
|
+
|
|
205
|
+
- `README.md` stays generic for all Admin products
|
|
206
|
+
- `docs/cms-quickstart.md` stays specific for CMS products
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Gallery Quickstart
|
|
2
|
+
|
|
3
|
+
Use this when you want an art gallery product where users type prompts, generate images, and organize those images into galleries.
|
|
4
|
+
|
|
5
|
+
Suggested models:
|
|
6
|
+
|
|
7
|
+
- `Gallery`
|
|
8
|
+
- `GalleryImage`
|
|
9
|
+
- `ImageGeneration`
|
|
10
|
+
- `PromptTemplate`
|
|
11
|
+
- `GalleryShareLink`
|
|
12
|
+
|
|
13
|
+
Suggested workflows:
|
|
14
|
+
|
|
15
|
+
- prompt for image generation
|
|
16
|
+
- review outputs
|
|
17
|
+
- move images into galleries
|
|
18
|
+
- share galleries publicly
|
|
19
|
+
|
|
20
|
+
Generate the scaffold with:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
./cmd.sh init gallery
|
|
24
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# GPU Marketplace Quickstart
|
|
2
|
+
|
|
3
|
+
Use this when you want to build a marketplace where home GPU owners list devices online and renters consume them as provider-backed capacity.
|
|
4
|
+
|
|
5
|
+
Suggested models:
|
|
6
|
+
|
|
7
|
+
- `GpuHost`
|
|
8
|
+
- `GpuDevice`
|
|
9
|
+
- `GpuListing`
|
|
10
|
+
- `GpuBooking`
|
|
11
|
+
- `GpuProviderAdapter`
|
|
12
|
+
|
|
13
|
+
Suggested workflows:
|
|
14
|
+
|
|
15
|
+
- onboard GPU hosts
|
|
16
|
+
- register GPU devices
|
|
17
|
+
- publish listings with hourly pricing
|
|
18
|
+
- create renter bookings
|
|
19
|
+
- expose listings as provider inventory for the parent Osirus app
|
|
20
|
+
|
|
21
|
+
Generate the scaffold with:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
./cmd.sh init gpu
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Use domains and proxy routing later to direct renters or provider traffic into the correct host endpoints.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Metaverse Quickstart
|
|
2
|
+
|
|
3
|
+
Use this when you want to build a company that hosts and manages virtual worlds and their item inventories.
|
|
4
|
+
|
|
5
|
+
Suggested models:
|
|
6
|
+
|
|
7
|
+
- `World`
|
|
8
|
+
- `WorldItem`
|
|
9
|
+
- `WorldInstance`
|
|
10
|
+
- `WorldDomain`
|
|
11
|
+
- `WorldDeployJob`
|
|
12
|
+
|
|
13
|
+
Suggested workflows:
|
|
14
|
+
|
|
15
|
+
- create hosted worlds
|
|
16
|
+
- deploy and update worlds
|
|
17
|
+
- attach domains to worlds
|
|
18
|
+
- manage world items and assets
|
|
19
|
+
- track hosting lifecycle by world
|
|
20
|
+
|
|
21
|
+
Generate the scaffold with:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
./cmd.sh init metaverse
|
|
25
|
+
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Migration Plan
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Build `appstudio` as the reusable starter while keeping `osirus-ai` free to continue as a product implementation.
|
|
6
|
+
|
|
7
|
+
## Sequence
|
|
8
|
+
|
|
9
|
+
1. Extract shared configuration:
|
|
10
|
+
- app identity
|
|
11
|
+
- navigation
|
|
12
|
+
- enabled modules
|
|
13
|
+
- billing defaults
|
|
14
|
+
2. Extract core backend domains:
|
|
15
|
+
- auth
|
|
16
|
+
- user
|
|
17
|
+
- org
|
|
18
|
+
- project
|
|
19
|
+
- provider
|
|
20
|
+
- product
|
|
21
|
+
- subscription
|
|
22
|
+
- invoice
|
|
23
|
+
3. Extract core frontend surfaces:
|
|
24
|
+
- auth pages
|
|
25
|
+
- account/settings
|
|
26
|
+
- admin shell
|
|
27
|
+
- projects
|
|
28
|
+
- providers
|
|
29
|
+
- billing
|
|
30
|
+
4. Gate AI features behind module registration.
|
|
31
|
+
5. Port AI features one module at a time when needed.
|
|
32
|
+
|
|
33
|
+
## First Success Criteria
|
|
34
|
+
|
|
35
|
+
The first successful bootstrap should:
|
|
36
|
+
|
|
37
|
+
- sign in and sign up users
|
|
38
|
+
- manage orgs and projects
|
|
39
|
+
- manage providers
|
|
40
|
+
- show pricing and checkout flows
|
|
41
|
+
- run without chat, search, images, video, or speech enabled
|
package/docs/modules.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# App Studio Modules
|
|
2
|
+
|
|
3
|
+
## Core Modules
|
|
4
|
+
|
|
5
|
+
These should exist in every generated application:
|
|
6
|
+
|
|
7
|
+
- `auth`
|
|
8
|
+
- `users`
|
|
9
|
+
- `orgs`
|
|
10
|
+
- `projects`
|
|
11
|
+
- `providers`
|
|
12
|
+
- `billing`
|
|
13
|
+
- `media`
|
|
14
|
+
- `admin`
|
|
15
|
+
|
|
16
|
+
## Optional Modules
|
|
17
|
+
|
|
18
|
+
These should be installable only when a product needs them:
|
|
19
|
+
|
|
20
|
+
- `ai-chat`
|
|
21
|
+
- `ai-search`
|
|
22
|
+
- `ai-images`
|
|
23
|
+
- `ai-video`
|
|
24
|
+
- `ai-speech`
|
|
25
|
+
- `ai-agents`
|
|
26
|
+
- `vector-store`
|
|
27
|
+
- `cms`
|
|
28
|
+
|
|
29
|
+
## Module Rules
|
|
30
|
+
|
|
31
|
+
- Core modules must not depend on optional AI modules.
|
|
32
|
+
- Optional modules may depend on core modules.
|
|
33
|
+
- Product branding and homepage content belong outside modules.
|
|
34
|
+
- Seed data should be split into core data and product-specific data.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# NFT Quickstart
|
|
2
|
+
|
|
3
|
+
Use this when you want an NFT gallery or marketplace product with collections, minted items, and listings.
|
|
4
|
+
|
|
5
|
+
Suggested models:
|
|
6
|
+
|
|
7
|
+
- `NftCollection`
|
|
8
|
+
- `NftItem`
|
|
9
|
+
- `MintJob`
|
|
10
|
+
- `WalletAccount`
|
|
11
|
+
- `MarketplaceListing`
|
|
12
|
+
- `RoyaltyProfile`
|
|
13
|
+
|
|
14
|
+
Suggested workflows:
|
|
15
|
+
|
|
16
|
+
- create collections
|
|
17
|
+
- add token items
|
|
18
|
+
- mint to blockchain
|
|
19
|
+
- connect wallets
|
|
20
|
+
- list items for sale
|
|
21
|
+
|
|
22
|
+
Generate the scaffold with:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
./cmd.sh init nft
|
|
26
|
+
```
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Simple CMS Quickstart
|
|
2
|
+
|
|
3
|
+
Use this when you want lightweight file publishing on top of the core `Site` system instead of a full deployment product.
|
|
4
|
+
|
|
5
|
+
Suggested models:
|
|
6
|
+
|
|
7
|
+
- `Site` from the core app
|
|
8
|
+
- `AppFile`
|
|
9
|
+
- `AppFileRevision`
|
|
10
|
+
|
|
11
|
+
Suggested workflows:
|
|
12
|
+
|
|
13
|
+
- create sites with the core site tools
|
|
14
|
+
- create app files under sites
|
|
15
|
+
- publish and unpublish files
|
|
16
|
+
- manage domains through the site layer
|
|
17
|
+
|
|
18
|
+
Generate the scaffold with:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
./cmd.sh init simple-cms
|
|
22
|
+
```
|
package/middleware.ts
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { NextRequest } from 'next/server'
|
|
2
|
+
import { NextResponse } from 'next/server'
|
|
3
|
+
|
|
4
|
+
import { readSessionFromRequest, isAuthenticatedSession } from './src/lib/auth'
|
|
5
|
+
import { getAppBasePath, isInsideAppBasePath, stripAppBasePath } from './src/lib/app-paths'
|
|
6
|
+
import { canAccessRouteModule } from './src/lib/security'
|
|
7
|
+
import { isRouteAllowed } from './src/lib/routes'
|
|
8
|
+
import type { ModuleKey } from './src/config/modules'
|
|
9
|
+
|
|
10
|
+
const publicRoutes = new Set(['/', '/pricing'])
|
|
11
|
+
|
|
12
|
+
const routeToModule: Array<{ prefix: string; key: ModuleKey }> = [
|
|
13
|
+
{ prefix: '/activity', key: 'activity' },
|
|
14
|
+
{ prefix: '/addresses', key: 'addresses' },
|
|
15
|
+
{ prefix: '/forms', key: 'forms' },
|
|
16
|
+
{ prefix: '/invoices', key: 'invoices' },
|
|
17
|
+
{ prefix: '/media', key: 'media' },
|
|
18
|
+
{ prefix: '/orgs', key: 'orgs' },
|
|
19
|
+
{ prefix: '/posts', key: 'posts' },
|
|
20
|
+
{ prefix: '/products', key: 'products' },
|
|
21
|
+
{ prefix: '/projects', key: 'projects' },
|
|
22
|
+
{ prefix: '/providers', key: 'providers' },
|
|
23
|
+
{ prefix: '/purchases', key: 'purchases' },
|
|
24
|
+
{ prefix: '/settings', key: 'settings' },
|
|
25
|
+
{ prefix: '/sites', key: 'sites' },
|
|
26
|
+
{ prefix: '/subscriptions', key: 'subscriptions' },
|
|
27
|
+
{ prefix: '/tags', key: 'tags' },
|
|
28
|
+
{ prefix: '/tickets', key: 'tickets' },
|
|
29
|
+
{ prefix: '/usage', key: 'usage' },
|
|
30
|
+
{ prefix: '/users', key: 'users' },
|
|
31
|
+
{ prefix: '/admin', key: 'admin' },
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
export function middleware(request: NextRequest) {
|
|
35
|
+
const { pathname } = request.nextUrl
|
|
36
|
+
const appBasePath = getAppBasePath()
|
|
37
|
+
|
|
38
|
+
if (
|
|
39
|
+
pathname.startsWith('/_next') ||
|
|
40
|
+
pathname.startsWith('/api') ||
|
|
41
|
+
pathname === '/favicon.ico'
|
|
42
|
+
) {
|
|
43
|
+
return NextResponse.next()
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (appBasePath && pathname === '/') {
|
|
47
|
+
return NextResponse.redirect(new URL(appBasePath, request.url))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (!isInsideAppBasePath(pathname)) {
|
|
51
|
+
return NextResponse.next()
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const appPathname = stripAppBasePath(pathname)
|
|
55
|
+
const session = readSessionFromRequest(request)
|
|
56
|
+
const matchedRoute = routeToModule.find(
|
|
57
|
+
(item) => appPathname === item.prefix || appPathname.startsWith(`${item.prefix}/`)
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
if (matchedRoute && !isAuthenticatedSession(session) && !publicRoutes.has(appPathname)) {
|
|
61
|
+
return NextResponse.redirect(new URL('/?auth=required', request.url))
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (isRouteAllowed(appPathname)) {
|
|
65
|
+
if (matchedRoute && !canAccessRouteModule(session, matchedRoute.key)) {
|
|
66
|
+
return NextResponse.redirect(new URL('/?denied=1', request.url))
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return NextResponse.next()
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return NextResponse.redirect(new URL('/', request.url))
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export const config = {
|
|
76
|
+
matcher: ['/((?!.*\\..*).*)'],
|
|
77
|
+
}
|
package/next-env.d.ts
ADDED
package/next.config.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { NextConfig } from 'next'
|
|
2
|
+
import path from 'path'
|
|
3
|
+
|
|
4
|
+
const apiOrigin = (() => {
|
|
5
|
+
const envApiUrl =
|
|
6
|
+
process.env.NEXT_PUBLIC_API_URL ||
|
|
7
|
+
process.env.NEXT_PUBLIC_API_HOST
|
|
8
|
+
|
|
9
|
+
if (envApiUrl) {
|
|
10
|
+
return envApiUrl.replace(/\/+$/, '')
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const apiHost = process.env.API_HOST || 'api'
|
|
14
|
+
const apiPort = process.env.API_PORT || '3001'
|
|
15
|
+
return `http://${apiHost}:${apiPort}`
|
|
16
|
+
})()
|
|
17
|
+
|
|
18
|
+
const nextConfig: NextConfig = {
|
|
19
|
+
reactStrictMode: true,
|
|
20
|
+
transpilePackages: ['@spacemade/ui', '@spacemade/api'],
|
|
21
|
+
async rewrites() {
|
|
22
|
+
return [
|
|
23
|
+
{
|
|
24
|
+
source: '/api/:path*',
|
|
25
|
+
destination: `${apiOrigin}/api/:path*`,
|
|
26
|
+
},
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
env: {
|
|
30
|
+
NEXT_PUBLIC_APP_ENV: process.env.APP_ENV,
|
|
31
|
+
},
|
|
32
|
+
sassOptions: {
|
|
33
|
+
includePaths: [path.join(process.cwd(), 'src', 'sass')],
|
|
34
|
+
quietDeps: true,
|
|
35
|
+
silenceDeprecations: ['import', 'global-builtin', 'color-functions'],
|
|
36
|
+
},
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export default nextConfig
|