From 22fb12db5b93032671f4c7540cfb6f341f2869f9 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Sat, 30 Nov 2024 02:02:13 -0800 Subject: [PATCH 001/539] push Co-authored-by: Louis Escher --- packages/studiocms/package.json | 9 +- .../studiocms_auth/src/routes/signup.astro | 4 +- .../src/BetaFeedback.astro | 141 -- packages/studiocms_core/package.json | 5 +- .../studiocms_core/src/helpers/routemap.ts | 96 +- packages/studiocms_core/src/helpers/urlGen.ts | 4 +- .../src/schemas/config/dashboard.ts | 9 - .../src/schemas/config/index.ts | 5 + .../src/schemas/config/unocss.ts | 73 - .../src/schemas/plugins/index.ts | 138 ++ .../src/types/sideBarLinkType.ts | 8 +- packages/studiocms_dashboard/package.json | 9 +- .../src/components/BaseHead.astro | 6 +- .../src/components/CrumbStack.astro | 29 - .../src/components/DashboardButtons.astro | 20 - .../src/components/Footer.astro | 75 - .../src/components/Header.astro | 71 +- .../src/components/Layout.astro | 14 +- .../src/components/PageListTable.astro | 68 - .../src/components/SideBar.astro | 70 - .../src/components/SideBarFooter.astro | 21 - .../src/components/SideBarMenu.astro | 241 ---- .../src/components/ThemeManager.astro | 64 - .../src/components/ThemeToggleButton.astro | 161 --- .../src/components/WebVitalPanel.astro | 56 - .../studiocms_dashboard/src/integration.ts | 167 +-- .../{api => studiocms_api}/LiveRender.astro | 0 .../{api => studiocms_api}/config/admin.ts | 0 .../{api => studiocms_api}/config/site.ts | 0 .../{api => studiocms_api}/firstTimeSetup.ts | 0 .../{api => studiocms_api}/pages/create.ts | 0 .../{api => studiocms_api}/pages/delete.ts | 0 .../{api => studiocms_api}/pages/edit.ts | 0 .../studiocms_dashboard/src/uno.config.ts | 39 - .../src/utils/addAPIRoutes.ts | 74 + packages/studiocms_ui/package.json | 4 +- .../src/components/Checkbox.astro | 4 +- .../src/components/SearchSelect.astro | 46 +- .../studiocms_ui/src/components/Select.astro | 44 +- .../studiocms_ui/src/components/User.astro | 3 +- packages/studiocms_ui/src/utils/Icon.astro | 47 +- packages/studiocms_ui/src/utils/iconType.ts | 3 + pnpm-lock.yaml | 1216 +---------------- pnpm-workspace.yaml | 10 +- www/docs/ec.config.mjs | 4 +- www/docs/src/styles/starlight.css | 13 +- www/docs/typedoc.config.ts | 1 - 47 files changed, 493 insertions(+), 2579 deletions(-) delete mode 100644 packages/studiocms_betaresources/src/BetaFeedback.astro delete mode 100644 packages/studiocms_core/src/schemas/config/unocss.ts create mode 100644 packages/studiocms_core/src/schemas/plugins/index.ts delete mode 100644 packages/studiocms_dashboard/src/components/CrumbStack.astro delete mode 100644 packages/studiocms_dashboard/src/components/DashboardButtons.astro delete mode 100644 packages/studiocms_dashboard/src/components/Footer.astro delete mode 100644 packages/studiocms_dashboard/src/components/PageListTable.astro delete mode 100644 packages/studiocms_dashboard/src/components/SideBar.astro delete mode 100644 packages/studiocms_dashboard/src/components/SideBarFooter.astro delete mode 100644 packages/studiocms_dashboard/src/components/SideBarMenu.astro delete mode 100644 packages/studiocms_dashboard/src/components/ThemeManager.astro delete mode 100644 packages/studiocms_dashboard/src/components/ThemeToggleButton.astro delete mode 100644 packages/studiocms_dashboard/src/components/WebVitalPanel.astro rename packages/studiocms_dashboard/src/routes/{api => studiocms_api}/LiveRender.astro (100%) rename packages/studiocms_dashboard/src/routes/{api => studiocms_api}/config/admin.ts (100%) rename packages/studiocms_dashboard/src/routes/{api => studiocms_api}/config/site.ts (100%) rename packages/studiocms_dashboard/src/routes/{api => studiocms_api}/firstTimeSetup.ts (100%) rename packages/studiocms_dashboard/src/routes/{api => studiocms_api}/pages/create.ts (100%) rename packages/studiocms_dashboard/src/routes/{api => studiocms_api}/pages/delete.ts (100%) rename packages/studiocms_dashboard/src/routes/{api => studiocms_api}/pages/edit.ts (100%) delete mode 100644 packages/studiocms_dashboard/src/uno.config.ts create mode 100644 packages/studiocms_dashboard/src/utils/addAPIRoutes.ts create mode 100644 packages/studiocms_ui/src/utils/iconType.ts diff --git a/packages/studiocms/package.json b/packages/studiocms/package.json index b8d010e99e..08ef2897e8 100644 --- a/packages/studiocms/package.json +++ b/packages/studiocms/package.json @@ -87,14 +87,7 @@ "shiki": "catalog:studiocms-renderer", "@shikijs/transformers": "catalog:studiocms-renderer", - "@cloudinary/url-gen": "catalog:studiocms-imagehandler", - - "@matthiesenxyz/astrolace": "catalog:studiocms-shared", - "@matthiesenxyz/unocss-preset-daisyui": "catalog:studiocms-shared", - "@unocss/astro": "catalog:studiocms-shared", - "@unocss/reset": "catalog:studiocms-shared", - "daisyui": "catalog:studiocms-shared", - "unocss": "catalog:studiocms-shared" + "@cloudinary/url-gen": "catalog:studiocms-imagehandler" }, "peerDependencies": { "@astrojs/db": "catalog:min", diff --git a/packages/studiocms_auth/src/routes/signup.astro b/packages/studiocms_auth/src/routes/signup.astro index f9f0503da8..d3c7ddc516 100644 --- a/packages/studiocms_auth/src/routes/signup.astro +++ b/packages/studiocms_auth/src/routes/signup.astro @@ -30,7 +30,7 @@ const { } = Config; const { - authLinks: { loginAPI, loginURL }, + authLinks: { registerAPI, loginURL }, } = StudioCMSRoutes; const { SHOW_OAUTH } = await authEnvCheck(providers); @@ -55,7 +55,7 @@ if (usernameAndPassword && SHOW_OAUTH) { { usernameAndPassword && ( -
+ diff --git a/packages/studiocms_betaresources/src/BetaFeedback.astro b/packages/studiocms_betaresources/src/BetaFeedback.astro deleted file mode 100644 index 6c00ceb0c6..0000000000 --- a/packages/studiocms_betaresources/src/BetaFeedback.astro +++ /dev/null @@ -1,141 +0,0 @@ ---- -import { Alert, Button, Dialog, Divider, Icon, Input, Textarea } from 'astrolace:components'; -import alertOctogramOutline from '@studiocms/assets/svgs/alert-octagram-outline.svg'; -import check2Circle from '@studiocms/assets/svgs/check2-circle.svg'; -import exclamationOctagon from '@studiocms/assets/svgs/exclamation-octagon.svg'; -import { FEEDBACK_FORM, MAILSERVICE } from './betafeedbackvars'; - -const formAction = `${MAILSERVICE}/${FEEDBACK_FORM}`; ---- - - -
- Give feedback about the beta version of the StudioCMS Dashboard directly to the Github Repository Issues. Your feedback will help us improve StudioCMS. -
- - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- -
- -
- -
- - -

-
- - - -

-
-
- - \ No newline at end of file diff --git a/packages/studiocms_core/package.json b/packages/studiocms_core/package.json index a3b194ad89..e300de0ad6 100644 --- a/packages/studiocms_core/package.json +++ b/packages/studiocms_core/package.json @@ -46,6 +46,7 @@ }, "type": "module", "dependencies": { + "@studiocms/ui": "workspace:*", "@studiocms/robotstxt": "workspace:*", "astro-integration-kit": "catalog:", "@markdoc/markdoc": "catalog:studiocms-renderer", @@ -56,9 +57,7 @@ "remark-rehype": "catalog:studiocms-core", "mdast-util-to-hast": "catalog:studiocms-core", "@matthiesenxyz/astrodtsbuilder": "catalog:studiocms-shared", - "@matthiesenxyz/integration-utils": "catalog:studiocms-shared", - - "@matthiesenxyz/astrolace": "catalog:studiocms-shared" + "@matthiesenxyz/integration-utils": "catalog:studiocms-shared" }, "peerDependencies": { "@astrojs/db": "catalog:min", diff --git a/packages/studiocms_core/src/helpers/routemap.ts b/packages/studiocms_core/src/helpers/routemap.ts index f7f361b628..4267ce4125 100644 --- a/packages/studiocms_core/src/helpers/routemap.ts +++ b/packages/studiocms_core/src/helpers/routemap.ts @@ -7,72 +7,68 @@ const { dashboardConfig: { dashboardRouteOverride }, } = Config; -export async function getSluggedRoute(url: string, slug: string): Promise { - return await urlGenFactory(true, url + slug, dashboardRouteOverride); +export function getSluggedRoute(url: string, slug: string): string { + return urlGenFactory(true, url + slug, dashboardRouteOverride); } -export async function getEditRoute(slug: string): Promise { - return await getSluggedRoute('edit/pages/', slug); +export function getEditRoute(slug: string): string { + return getSluggedRoute('edit/pages/', slug); } -export async function getDeleteRoute(slug: string): Promise { - return await getSluggedRoute('delete/pages/', slug); +export function getDeleteRoute(slug: string): string { + return getSluggedRoute('delete/pages/', slug); } -export async function makeNonDashboardRoute(route?: string | undefined): Promise { - return await urlGenFactory(false, route); +export function makeNonDashboardRoute(route?: string | undefined): string { + return urlGenFactory(false, route); } -export async function makeDashboardRoute(route?: string | undefined): Promise { - return await urlGenFactory(true, route, dashboardRouteOverride); +export function makeDashboardRoute(route?: string | undefined): string { + return urlGenFactory(true, route, dashboardRouteOverride); } -export async function makeAPIDashboardRoute(route: string): Promise { - return await urlGenFactory(true, `api/${route}`, dashboardRouteOverride); -} - -export async function makeStudioCMSAPIRoute(route: string): Promise { - return await urlGenFactory(false, `studiocms_api/${route}`); +export function makeStudioCMSAPIRoute(route: string): string { + return urlGenFactory(false, `studiocms_api/${route}`); } export const StudioCMSRoutes = { mainLinks: { - baseSiteURL: await makeNonDashboardRoute(), - dashboardIndex: await makeDashboardRoute(), - userProfile: await makeDashboardRoute('profile/'), - pageNew: await makeDashboardRoute('new/page/'), - pageEdit: await makeDashboardRoute('page-list/'), - siteConfiguration: await makeDashboardRoute('configuration/'), - configurationAdmins: await makeDashboardRoute('configuration/admins/'), + baseSiteURL: makeNonDashboardRoute(), + dashboardIndex: makeDashboardRoute(), + userProfile: makeDashboardRoute('profile/'), + pageNew: makeDashboardRoute('new/page/'), + pageEdit: makeDashboardRoute('page-list/'), + siteConfiguration: makeDashboardRoute('configuration/'), + configurationAdmins: makeDashboardRoute('configuration/admins/'), }, authLinks: { - loginURL: await makeDashboardRoute('login'), - logoutURL: await makeDashboardRoute('logout'), - signupURL: await makeDashboardRoute('signup'), - loginAPI: await makeStudioCMSAPIRoute('auth/login'), // /studiocms_api/auth/login - logoutAPI: await makeStudioCMSAPIRoute('auth/logout'), // /studiocms_api/auth/logout - registerAPI: await makeStudioCMSAPIRoute('auth/register'), // /studiocms_api/auth/register - githubIndex: await makeStudioCMSAPIRoute('auth/github'), // /studiocms_api/auth/github - githubCallback: await makeStudioCMSAPIRoute('auth/github/callback'), // /studiocms_api/auth/github/callback - discordIndex: await makeStudioCMSAPIRoute('auth/discord'), // /studiocms_api/auth/discord - discordCallback: await makeStudioCMSAPIRoute('auth/discord/callback'), // /studiocms_api/auth/discord/callback - googleIndex: await makeStudioCMSAPIRoute('auth/google'), // /studiocms_api/auth/google - googleCallback: await makeStudioCMSAPIRoute('auth/google/callback'), // /studiocms_api/auth/google/callback - auth0Index: await makeStudioCMSAPIRoute('auth/auth0'), // /studiocms_api/auth/auth0 - auth0Callback: await makeStudioCMSAPIRoute('auth/auth0/callback'), // /studiocms_api/auth/auth0/callback + loginURL: makeDashboardRoute('login'), + logoutURL: makeDashboardRoute('logout'), + signupURL: makeDashboardRoute('signup'), + loginAPI: makeStudioCMSAPIRoute('auth/login'), // /studiocms_api/auth/login + logoutAPI: makeStudioCMSAPIRoute('auth/logout'), // /studiocms_api/auth/logout + registerAPI: makeStudioCMSAPIRoute('auth/register'), // /studiocms_api/auth/register + githubIndex: makeStudioCMSAPIRoute('auth/github'), // /studiocms_api/auth/github + githubCallback: makeStudioCMSAPIRoute('auth/github/callback'), // /studiocms_api/auth/github/callback + discordIndex: makeStudioCMSAPIRoute('auth/discord'), // /studiocms_api/auth/discord + discordCallback: makeStudioCMSAPIRoute('auth/discord/callback'), // /studiocms_api/auth/discord/callback + googleIndex: makeStudioCMSAPIRoute('auth/google'), // /studiocms_api/auth/google + googleCallback: makeStudioCMSAPIRoute('auth/google/callback'), // /studiocms_api/auth/google/callback + auth0Index: makeStudioCMSAPIRoute('auth/auth0'), // /studiocms_api/auth/auth0 + auth0Callback: makeStudioCMSAPIRoute('auth/auth0/callback'), // /studiocms_api/auth/auth0/callback }, endpointLinks: { partials: { - livePreviewBox: await makeAPIDashboardRoute('liverender'), // /studiocms_api/render/preview + livePreviewBox: makeStudioCMSAPIRoute('dashboard/liverender'), // /studiocms_api/dashboard/liverender }, config: { - siteConfig: await makeAPIDashboardRoute('config/site'), // /studiocms_api/config/site - adminConfig: await makeAPIDashboardRoute('config/admin'), // /studiocms_api/config/admin + siteConfig: makeStudioCMSAPIRoute('dashboard/config/site'), // /studiocms_api/dashboard/config/site + adminConfig: makeStudioCMSAPIRoute('dashboard/config/admin'), // /studiocms_api/dashboard/config/admin }, pages: { - createPages: await makeAPIDashboardRoute('pages/create'), // /studiocms_api/pages/create - editPages: await makeAPIDashboardRoute('pages/edit'), // /studiocms_api/pages/edit - deletePages: await makeAPIDashboardRoute('pages/delete'), // /studiocms_api/pages/delete + createPages: makeStudioCMSAPIRoute('dashboard/pages/create'), // /studiocms_api/dashboard/pages/create + editPages: makeStudioCMSAPIRoute('dashboard/pages/edit'), // /studiocms_api/dashboard/pages/edit + deletePages: makeStudioCMSAPIRoute('dashboard/pages/delete'), // /studiocms_api/dashboard/pages/delete }, }, }; @@ -84,7 +80,7 @@ const defaultDashboardPageLinks: SideBarLink[] = [ href: StudioCMSRoutes.mainLinks.baseSiteURL, text: 'View Site', minPermissionLevel: 'unknown', - icon: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik04IDBhOCA4IDAgMSAwIDAgMTZBOCA4IDAgMCAwIDggME0yLjA0IDQuMzI2Yy4zMjUgMS4zMjkgMi41MzIgMi41NCAzLjcxNyAzLjE5Yy40OC4yNjMuNzkzLjQzNC43NDMuNDg0cS0uMTIxLjEyLS4yNDIuMjM0Yy0uNDE2LjM5Ni0uNzg3Ljc0OS0uNzU4IDEuMjY2Yy4wMzUuNjM0LjYxOC44MjQgMS4yMTQgMS4wMTdjLjU3Ny4xODggMS4xNjguMzggMS4yODYuOTgzYy4wODIuNDE3LS4wNzUuOTg4LS4yMiAxLjUyYy0uMjE1Ljc4Mi0uNDA2IDEuNDguMjIgMS40OGMxLjUtLjUgMy43OTgtMy4xODYgNC01Yy4xMzgtMS4yNDMtMi0yLTMuNS0yLjVjLS40NzgtLjE2LS43NTUuMDgxLS45OS4yODRjLS4xNzIuMTUtLjMyMi4yNzktLjUxLjIxNmMtLjQ0NS0uMTQ4LTIuNS0yLTEuNS0yLjVjLjc4LS4zOS45NTItLjE3MSAxLjIyNy4xODJjLjA3OC4wOTkuMTYzLjIwOC4yNzMuMzE4Yy42MDkuMzA0LjY2Mi0uMTMyLjcyMy0uNjMzYy4wMzktLjMyMi4wODEtLjY3MS4yNzctLjg2N2MuNDM0LS40MzQgMS4yNjUtLjc5MSAyLjAyOC0xLjEyYy43MTItLjMwNiAxLjM2NS0uNTg3IDEuNTc5LS44OEE3IDcgMCAxIDEgMi4wNCA0LjMyN1oiLz48L3N2Zz4=', + icon: 'globe-alt', type: 'link', }, { @@ -92,7 +88,7 @@ const defaultDashboardPageLinks: SideBarLink[] = [ href: StudioCMSRoutes.mainLinks.dashboardIndex, text: 'Dashboard', minPermissionLevel: 'visitor', - icon: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik02IDF2M0gxVjF6TTEgMGExIDEgMCAwIDAtMSAxdjNhMSAxIDAgMCAwIDEgMWg1YTEgMSAwIDAgMCAxLTFWMWExIDEgMCAwIDAtMS0xem0xNCAxMnYzaC01di0zem0tNS0xYTEgMSAwIDAgMC0xIDF2M2ExIDEgMCAwIDAgMSAxaDVhMSAxIDAgMCAwIDEtMXYtM2ExIDEgMCAwIDAtMS0xek02IDh2N0gxVjh6TTEgN2ExIDEgMCAwIDAtMSAxdjdhMSAxIDAgMCAwIDEgMWg1YTEgMSAwIDAgMCAxLTFWOGExIDEgMCAwIDAtMS0xem0xNC02djdoLTVWMXptLTUtMWExIDEgMCAwIDAtMSAxdjdhMSAxIDAgMCAwIDEgMWg1YTEgMSAwIDAgMCAxLTFWMWExIDEgMCAwIDAtMS0xeiIvPjwvc3ZnPg==', + icon: 'home', type: 'link', }, { @@ -100,7 +96,7 @@ const defaultDashboardPageLinks: SideBarLink[] = [ href: StudioCMSRoutes.mainLinks.userProfile, text: 'User Profile', minPermissionLevel: 'visitor', - icon: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDE2IDE2Ij48ZyBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xMSA2YTMgMyAwIDEgMS02IDBhMyAzIDAgMCAxIDYgMCIvPjxwYXRoIGQ9Ik0yIDBhMiAyIDAgMCAwLTIgMnYxMmEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJWMmEyIDIgMCAwIDAtMi0yem0xMiAxYTEgMSAwIDAgMSAxIDF2MTJhMSAxIDAgMCAxLTEgMXYtMWMwLTEtMS00LTYtNHMtNiAzLTYgNHYxYTEgMSAwIDAgMS0xLTFWMmExIDEgMCAwIDEgMS0xeiIvPjwvZz48L3N2Zz4=', + icon: 'user', type: 'link', }, { @@ -108,7 +104,7 @@ const defaultDashboardPageLinks: SideBarLink[] = [ href: StudioCMSRoutes.mainLinks.pageNew, text: 'Create New Page', minPermissionLevel: 'editor', - icon: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDE2IDE2Ij48ZyBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xNS41MDIgMS45NGEuNS41IDAgMCAxIDAgLjcwNkwxNC40NTkgMy42OWwtMi0yTDEzLjUwMi42NDZhLjUuNSAwIDAgMSAuNzA3IDBsMS4yOTMgMS4yOTN6bS0xLjc1IDIuNDU2bC0yLTJMNC45MzkgOS4yMWEuNS41IDAgMCAwLS4xMjEuMTk2bC0uODA1IDIuNDE0YS4yNS4yNSAwIDAgMCAuMzE2LjMxNmwyLjQxNC0uODA1YS41LjUgMCAwIDAgLjE5Ni0uMTJsNi44MTMtNi44MTR6Ii8+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMSAxMy41QTEuNSAxLjUgMCAwIDAgMi41IDE1aDExYTEuNSAxLjUgMCAwIDAgMS41LTEuNXYtNmEuNS41IDAgMCAwLTEgMHY2YS41LjUgMCAwIDEtLjUuNWgtMTFhLjUuNSAwIDAgMS0uNS0uNXYtMTFhLjUuNSAwIDAgMSAuNS0uNUg5YS41LjUgMCAwIDAgMC0xSDIuNUExLjUgMS41IDAgMCAwIDEgMi41eiIvPjwvZz48L3N2Zz4=', + icon: 'plus', type: 'link', }, { @@ -116,7 +112,7 @@ const defaultDashboardPageLinks: SideBarLink[] = [ href: StudioCMSRoutes.mainLinks.pageEdit, text: 'Edit Pages', minPermissionLevel: 'editor', - icon: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik0xMi4xNDYuMTQ2YS41LjUgMCAwIDEgLjcwOCAwbDMgM2EuNS41IDAgMCAxIDAgLjcwOGwtMTAgMTBhLjUuNSAwIDAgMS0uMTY4LjExbC01IDJhLjUuNSAwIDAgMS0uNjUtLjY1bDItNWEuNS41IDAgMCAxIC4xMS0uMTY4ek0xMS4yMDcgMi41TDEzLjUgNC43OTNMMTQuNzkzIDMuNUwxMi41IDEuMjA3em0xLjU4NiAzTDEwLjUgMy4yMDdMNCA5LjcwN1YxMGguNWEuNS41IDAgMCAxIC41LjV2LjVoLjVhLjUuNSAwIDAgMSAuNS41di41aC4yOTN6bS05Ljc2MSA1LjE3NWwtLjEwNi4xMDZsLTEuNTI4IDMuODIxbDMuODIxLTEuNTI4bC4xMDYtLjEwNkEuNS41IDAgMCAxIDUgMTIuNVYxMmgtLjVhLjUuNSAwIDAgMS0uNS0uNVYxMWgtLjVhLjUuNSAwIDAgMS0uNDY4LS4zMjUiLz48L3N2Zz4=', + icon: 'pencil-square', type: 'link', }, { @@ -124,7 +120,7 @@ const defaultDashboardPageLinks: SideBarLink[] = [ href: StudioCMSRoutes.mainLinks.siteConfiguration, text: 'Site Configuration', minPermissionLevel: 'admin', - icon: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik03LjA2OC43MjdjLjI0My0uOTcgMS42Mi0uOTcgMS44NjQgMGwuMDcxLjI4NmEuOTYuOTYgMCAwIDAgMS42MjIuNDM0bC4yMDUtLjIxMWMuNjk1LS43MTkgMS44ODgtLjAzIDEuNjEzLjkzMWwtLjA4LjI4NGEuOTYuOTYgMCAwIDAgMS4xODcgMS4xODdsLjI4My0uMDgxYy45Ni0uMjc1IDEuNjUuOTE4LjkzMSAxLjYxM2wtLjIxMS4yMDVhLjk2Ljk2IDAgMCAwIC40MzQgMS42MjJsLjI4Ni4wNzFjLjk3LjI0My45NyAxLjYyIDAgMS44NjRsLS4yODYuMDcxYS45Ni45NiAwIDAgMC0uNDM0IDEuNjIybC4yMTEuMjA1Yy43MTkuNjk1LjAzIDEuODg4LS45MzEgMS42MTNsLS4yODQtLjA4YS45Ni45NiAwIDAgMC0xLjE4NyAxLjE4N2wuMDgxLjI4M2MuMjc1Ljk2LS45MTggMS42NS0xLjYxMy45MzFsLS4yMDUtLjIxMWEuOTYuOTYgMCAwIDAtMS42MjIuNDM0bC0uMDcxLjI4NmMtLjI0My45Ny0xLjYyLjk3LTEuODY0IDBsLS4wNzEtLjI4NmEuOTYuOTYgMCAwIDAtMS42MjItLjQzNGwtLjIwNS4yMTFjLS42OTUuNzE5LTEuODg4LjAzLTEuNjEzLS45MzFsLjA4LS4yODRhLjk2Ljk2IDAgMCAwLTEuMTg2LTEuMTg3bC0uMjg0LjA4MWMtLjk2LjI3NS0xLjY1LS45MTgtLjkzMS0xLjYxM2wuMjExLS4yMDVhLjk2Ljk2IDAgMCAwLS40MzQtMS42MjJsLS4yODYtLjA3MWMtLjk3LS4yNDMtLjk3LTEuNjIgMC0xLjg2NGwuMjg2LS4wNzFhLjk2Ljk2IDAgMCAwIC40MzQtMS42MjJsLS4yMTEtLjIwNWMtLjcxOS0uNjk1LS4wMy0xLjg4OC45MzEtMS42MTNsLjI4NC4wOGEuOTYuOTYgMCAwIDAgMS4xODctMS4xODZsLS4wODEtLjI4NGMtLjI3NS0uOTYuOTE4LTEuNjUgMS42MTMtLjkzMWwuMjA1LjIxMWEuOTYuOTYgMCAwIDAgMS42MjItLjQzNHpNMTIuOTczIDguNUg4LjI1bC0yLjgzNCAzLjc3OUE0Ljk5OCA0Ljk5OCAwIDAgMCAxMi45NzMgOC41bTAtMWE0Ljk5OCA0Ljk5OCAwIDAgMC03LjU1Ny0zLjc3OWwyLjgzNCAzLjc4ek01LjA0OCAzLjk2N2wtLjA4Ny4wNjV6bS0uNDMxLjM1NUE0Ljk4IDQuOTggMCAwIDAgMy4wMDIgOGMwIDEuNDU1LjYyMiAyLjc2NSAxLjYxNSAzLjY3OEw3LjM3NSA4em0uMzQ0IDcuNjQ2bC4wODcuMDY1eiIvPjwvc3ZnPg==', + icon: 'cog-6-tooth', type: 'link', }, ]; @@ -143,7 +139,7 @@ const customDashboardDropdown = { href: '', text: 'Integration Configs', minPermissionLevel: 'editor', - icon: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik0zLjExMiAzLjY0NUExLjUgMS41IDAgMCAxIDQuNjA1IDJIN2EuNS41IDAgMCAxIC41LjV2LjM4MmMwIC42OTYtLjQ5NyAxLjE4Mi0uODcyIDEuNDY5YS41LjUgMCAwIDAtLjExNS4xMThsLS4wMTIuMDI1TDYuNSA0LjV2LjAwM2wuMDAzLjAxcS4wMDUuMDE1LjAzNi4wNTNhLjkuOSAwIDAgMCAuMjcuMTk0QzcuMDkgNC45IDcuNTEgNSA4IDVjLjQ5MiAwIC45MTItLjEgMS4xOS0uMjRhLjkuOSAwIDAgMCAuMjcxLS4xOTRhLjIuMiAwIDAgMCAuMDM5LS4wNjN2LS4wMDlsLS4wMTItLjAyNWEuNS41IDAgMCAwLS4xMTUtLjExOGMtLjM3NS0uMjg3LS44NzItLjc3My0uODcyLTEuNDY5VjIuNUEuNS41IDAgMCAxIDkgMmgyLjM5NWExLjUgMS41IDAgMCAxIDEuNDkzIDEuNjQ1TDEyLjY0NSA2LjVoLjIzN2MuMTk1IDAgLjQyLS4xNDcuNjc1LS40OGMuMjEtLjI3NC41MjgtLjUyLjk0My0uNTJjLjU2OCAwIC45NDcuNDQ3IDEuMTU0Ljg2MkMxNS44NzcgNi44MDcgMTYgNy4zODcgMTYgOHMtLjEyMyAxLjE5My0uMzQ2IDEuNjM4Yy0uMjA3LjQxNS0uNTg2Ljg2Mi0xLjE1NC44NjJjLS40MTUgMC0uNzMzLS4yNDYtLjk0My0uNTJjLS4yNTUtLjMzMy0uNDgtLjQ4LS42NzUtLjQ4aC0uMjM3bC4yNDMgMi44NTVBMS41IDEuNSAwIDAgMSAxMS4zOTUgMTRIOWEuNS41IDAgMCAxLS41LS41di0uMzgyYzAtLjY5Ni40OTctMS4xODIuODcyLTEuNDY5YS41LjUgMCAwIDAgLjExNS0uMTE4bC4wMTItLjAyNWwuMDAxLS4wMDZ2LS4wMDNhLjIuMiAwIDAgMC0uMDM5LS4wNjRhLjkuOSAwIDAgMC0uMjctLjE5M0M4LjkxIDExLjEgOC40OSAxMSA4IDExcy0uOTEyLjEtMS4xOS4yNGEuOS45IDAgMCAwLS4yNzEuMTk0YS4yLjIgMCAwIDAtLjAzOS4wNjN2LjAwM2wuMDAxLjAwNmwuMDEyLjAyNWMuMDE2LjAyNy4wNS4wNjguMTE1LjExOGMuMzc1LjI4Ny44NzIuNzczLjg3MiAxLjQ2OXYuMzgyYS41LjUgMCAwIDEtLjUuNUg0LjYwNWExLjUgMS41IDAgMCAxLTEuNDkzLTEuNjQ1TDMuMzU2IDkuNWgtLjIzOGMtLjE5NSAwLS40Mi4xNDctLjY3NS40OGMtLjIxLjI3NC0uNTI4LjUyLS45NDMuNTJjLS41NjggMC0uOTQ3LS40NDctMS4xNTQtLjg2MkMuMTIzIDkuMTkzIDAgOC42MTMgMCA4cy4xMjMtMS4xOTMuMzQ2LTEuNjM4Qy41NTMgNS45NDcuOTMyIDUuNSAxLjUgNS41Yy40MTUgMCAuNzMzLjI0Ni45NDMuNTJjLjI1NS4zMzMuNDguNDguNjc1LjQ4aC4yMzh6TTQuNjA1IDNhLjUuNSAwIDAgMC0uNDk4LjU1bC4wMDEuMDA3bC4yOSAzLjRBLjUuNSAwIDAgMSAzLjkgNy41aC0uNzgyYy0uNjk2IDAtMS4xODItLjQ5Ny0xLjQ2OS0uODcyYS41LjUgMCAwIDAtLjExOC0uMTE1bC0uMDI1LS4wMTJMMS41IDYuNWgtLjAwM2EuMi4yIDAgMCAwLS4wNjQuMDM5YS45LjkgMCAwIDAtLjE5My4yN0MxLjEgNy4wOSAxIDcuNTEgMSA4cy4xLjkxMi4yNCAxLjE5Yy4wNy4xNC4xNC4yMjUuMTk0LjI3MWEuMi4yIDAgMCAwIC4wNjMuMDM5SDEuNWwuMDA2LS4wMDFsLjAyNS0uMDEyYS41LjUgMCAwIDAgLjExOC0uMTE1Yy4yODctLjM3NS43NzMtLjg3MiAxLjQ2OS0uODcySDMuOWEuNS41IDAgMCAxIC40OTguNTQybC0uMjkgMy40MDhhLjUuNSAwIDAgMCAuNDk3LjU1aDEuODc4Yy0uMDQ4LS4xNjYtLjE5NS0uMzUyLS40NjMtLjU1N2MtLjI3NC0uMjEtLjUyLS41MjgtLjUyLS45NDNjMC0uNTY4LjQ0Ny0uOTQ3Ljg2Mi0xLjE1NEM2LjgwNyAxMC4xMjMgNy4zODcgMTAgOCAxMHMxLjE5My4xMjMgMS42MzguMzQ2Yy40MTUuMjA3Ljg2Mi41ODYuODYyIDEuMTU0YzAgLjQxNS0uMjQ2LjczMy0uNTIuOTQzYy0uMjY4LjIwNS0uNDE1LjM5LS40NjMuNTU3aDEuODc4YS41LjUgMCAwIDAgLjQ5OC0uNTVsLS4wMDEtLjAwN2wtLjI5LTMuNEEuNS41IDAgMCAxIDEyLjEgOC41aC43ODJjLjY5NiAwIDEuMTgyLjQ5NyAxLjQ2OS44NzJjLjA1LjA2NS4wOTEuMDk5LjExOC4xMTVsLjAyNS4wMTJsLjAwNi4wMDFoLjAwM2EuMi4yIDAgMCAwIC4wNjQtLjAzOWEuOS45IDAgMCAwIC4xOTMtLjI3Yy4xNC0uMjguMjQtLjcuMjQtMS4xOTFzLS4xLS45MTItLjI0LTEuMTlhLjkuOSAwIDAgMC0uMTk0LS4yNzFhLjIuMiAwIDAgMC0uMDYzLS4wMzlIMTQuNWwtLjAwNi4wMDFsLS4wMjUuMDEyYS41LjUgMCAwIDAtLjExOC4xMTVjLS4yODcuMzc1LS43NzMuODcyLTEuNDY5Ljg3MkgxMi4xYS41LjUgMCAwIDEtLjQ5OC0uNTQzbC4yOS0zLjQwN2EuNS41IDAgMCAwLS40OTctLjU1SDkuNTE3Yy4wNDguMTY2LjE5NS4zNTIuNDYzLjU1N2MuMjc0LjIxLjUyLjUyOC41Mi45NDNjMCAuNTY4LS40NDcuOTQ3LS44NjIgMS4xNTRDOS4xOTMgNS44NzcgOC42MTMgNiA4IDZzLTEuMTkzLS4xMjMtMS42MzgtLjM0NkM1Ljk0NyA1LjQ0NyA1LjUgNS4wNjggNS41IDQuNWMwLS40MTUuMjQ2LS43MzMuNTItLjk0M2MuMjY4LS4yMDUuNDE1LS4zOS40NjMtLjU1N3oiLz48L3N2Zz4=', + icon: 'question-mark-circle', type: 'dropdown', dropdownItems: customDashboardPageLinks, } satisfies SideBarLink; diff --git a/packages/studiocms_core/src/helpers/urlGen.ts b/packages/studiocms_core/src/helpers/urlGen.ts index a2e258aa5b..ed8aeebd09 100644 --- a/packages/studiocms_core/src/helpers/urlGen.ts +++ b/packages/studiocms_core/src/helpers/urlGen.ts @@ -11,11 +11,11 @@ import { pathWithBase } from './pathGenerators'; * @param DashboardRouteOverride * @returns */ -export default async function urlGenFactory( +export default function urlGenFactory( isDashboardRoute: boolean, path: string | undefined, DashboardRouteOverride?: string -): Promise { +): string { let url: string; let dashboardRoute = 'dashboard'; diff --git a/packages/studiocms_core/src/schemas/config/dashboard.ts b/packages/studiocms_core/src/schemas/config/dashboard.ts index 910be79c1d..d9a044698b 100644 --- a/packages/studiocms_core/src/schemas/config/dashboard.ts +++ b/packages/studiocms_core/src/schemas/config/dashboard.ts @@ -1,7 +1,6 @@ import { z } from 'astro/zod'; import { authConfigSchema } from './auth'; import { developerConfigSchema } from './developer'; -import { unocssConfigSchema } from './unocss'; export const dashboardConfigSchema = z .object({ @@ -29,14 +28,6 @@ export const dashboardConfigSchema = z * Auth Configuration - Allows customization of the Authentication Configuration */ AuthConfig: authConfigSchema, - /** - * UnoCSS Configuration - Allows customization of the UnoCSS Configuration - * - * **Note: Use with caution, this is an advanced feature** - * - * StudioCMS uses UnoCSS+DaisyUI to provide a TailwindCSS-like experience with minimal CSS+prebuilt theme options!. This configuration allows you to override the default configuration. - */ - UnoCSSConfigOverride: unocssConfigSchema, /** * Developer Options/Configuration */ diff --git a/packages/studiocms_core/src/schemas/config/index.ts b/packages/studiocms_core/src/schemas/config/index.ts index d689ec5e5e..687a53dd12 100644 --- a/packages/studiocms_core/src/schemas/config/index.ts +++ b/packages/studiocms_core/src/schemas/config/index.ts @@ -1,4 +1,5 @@ import { z } from 'astro/zod'; +import { StudioCMSPluginSchema } from '../plugins'; import { overridesSchema } from './componentoverrides'; import { dashboardConfigSchema } from './dashboard'; import { DefaultFrontEndConfigSchema } from './defaultFrontend'; @@ -70,6 +71,10 @@ export const StudioCMSOptionsSchema = z * @default false */ verbose: z.boolean().optional().default(false), + /** + * Add Plugins to the StudioCMS + */ + plugins: z.array(StudioCMSPluginSchema).optional().default([]), }) .optional() .default({}); diff --git a/packages/studiocms_core/src/schemas/config/unocss.ts b/packages/studiocms_core/src/schemas/config/unocss.ts deleted file mode 100644 index 6e809c8b73..0000000000 --- a/packages/studiocms_core/src/schemas/config/unocss.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { z } from 'astro/zod'; - -export const unocssDaisyUISchema = z - .object({ - /** - * OPTIONAL - This allows the user to use any of the available DaisyUI themes - * - * @default ['light', 'dark'] - */ - themes: z.array(z.string()).optional().default(['light', 'dark']), - /** - * OPTIONAL - This allows the user to set the default light theme - * - * @default 'light' - */ - lightTheme: z.string().optional().default('light'), - /** - * OPTIONAL - This allows the user to set the default dark theme - * - * @default 'dark' - */ - darkTheme: z.string().optional().default('dark'), - }) - .optional() - .default({}); - -export const unocssPresetsSchema = z - .object({ - /** - * OPTIONAL - This allows the user to enable or disable the UnoCSS DaisyUI Preset - */ - presetDaisyUI: unocssDaisyUISchema, - }) - .optional() - .default({}); - -export const unocssConfigSchema = z - .object({ - /** - * OPTIONAL - This allows the user to enable or disable the UnoCSS Default Reset import - * - * If you would like to use our UnoCSS configuration with our front-end you can enable this option to import the default reset styles or use the example from the code snippet below to import the reset styles into your Base Layout/header. - * - * ```tsx - * --- - * import '@unocss/reset/tailwind.css'; - * --- - * ``` - * @default false - * The default is false to prevent the dashboard from injecting the reset styles into your project. - */ - injectReset: z.boolean().optional().default(false), - /** - * OPTIONAL - This allows the user to enable or disable the UnoCSS Default Entry import - * - * If you would like to use our UnoCSS configuration with our front-end you can enable this option to import the default entry styles or use the example from the code snippet below to import the entry styles into your Base Layout/header. - * - * ```tsx - * --- - * import 'uno.css'; - * --- - * ``` - * @default false - * The default is false to prevent the dashboard from injecting the entry styles into your project. - */ - injectEntry: z.boolean().optional().default(false), - /** - * Allows the user to modify the included UnoCSS Presets - */ - presetsConfig: unocssPresetsSchema, - }) - .optional() - .default({}); diff --git a/packages/studiocms_core/src/schemas/plugins/index.ts b/packages/studiocms_core/src/schemas/plugins/index.ts new file mode 100644 index 0000000000..68e57f72e2 --- /dev/null +++ b/packages/studiocms_core/src/schemas/plugins/index.ts @@ -0,0 +1,138 @@ +import type { AstroIntegration } from 'astro'; +import { z } from 'astro/zod'; + +// Common options for all fields +const DefaultSettingsFieldOptionsSchema = z.object({ + name: z.string(), + label: z.string(), + required: z.boolean().optional(), + readOnly: z.boolean().optional(), +}); + +// Individual field types +const CheckboxSettingsFieldSchema = z.object({ + input: z.literal('checkbox'), + description: z.string(), +}); + +const NumberSettingsFieldSchema = z.object({ + input: z.literal('number'), + description: z.string(), +}); + +const RadioGroupSettingsFieldSchema = z.object({ + input: z.literal('radio'), + options: z.array( + z.object({ + label: z.string(), + value: z.string(), + }) + ), +}); + +const SelectSettingsFieldSchema = z.object({ + input: z.literal('select'), + options: z.array( + z.object({ + label: z.string(), + value: z.string(), + }) + ), + hasMany: z.boolean().optional(), +}); + +const TextSettingsFieldSchema = z.object({ + input: z.literal('text'), +}); + +const SettingsFieldPreSchema = z.union([ + CheckboxSettingsFieldSchema, + NumberSettingsFieldSchema, + RadioGroupSettingsFieldSchema, + SelectSettingsFieldSchema, + TextSettingsFieldSchema, +]); + +const RowSettingsFieldSchema = z.object({ + input: z.literal('row'), + fields: z.lazy(() => SettingsFieldPreSchema.array()), // Recursive definition +}); + +const SettingsFieldSchema = z + .union([SettingsFieldPreSchema, RowSettingsFieldSchema]) + .and(DefaultSettingsFieldOptionsSchema); + +/** + * Validation function. Takes in all the values and returns a string on error or true on success. + */ + +// biome-ignore lint/suspicious/noExplicitAny: +type ValidationFunction = (values: any) => string | true; + +/** + * Content Transform function. Takes in all the values and returns the modified values. + */ +// biome-ignore lint/suspicious/noExplicitAny: +type ContentTransformFunction = (values: any) => any; + +const StudioCMS_SettingsPageSchema = z + .object({ + /** + * Fields according to specification + */ + fields: z.array(SettingsFieldSchema), + /** + * Validation function that runs on save + */ + validate: z.custom(), + }) + .optional(); + +const StudioCMS_PageTypeSchema = z + .array( + z.object({ + /** + * Label that is shown in the select input + */ + label: z.string(), + /** + * Description that is shown below the "Page Content" header if this type is selected + */ + description: z.string().optional(), + /** + * A function that takes in all basic info & the page content and gets to modify it. `any` type for visualization purposes. + */ + contentTransform: z.custom(), + /** + * The path to the actual component that is displayed for the page content + */ + pageContent: z.string(), + }) + ) + .optional(); + +export const StudioCMSPluginSchema = z.object({ + /** + * Name of the plugin from the package.json + */ + name: z.string(), + /** + * Label of the plugin to be displayed in the StudioCMS Dashboard + */ + label: z.string(), + /** + * If this exists, the plugin will have its own setting page + */ + settingsPage: StudioCMS_SettingsPageSchema, + /** + * Page Type definition. If this is present, the plugin wants to be able to modify the page creation process + */ + pageType: StudioCMS_PageTypeSchema, + /** + * Astro Integration + */ + integration: z.array(z.custom()).or(z.custom()), +}); + +export type StudioCMSPlugin = typeof StudioCMSPluginSchema._input; +export type StudioCMSPluginOptions = typeof StudioCMSPluginSchema._output; diff --git a/packages/studiocms_core/src/types/sideBarLinkType.ts b/packages/studiocms_core/src/types/sideBarLinkType.ts index b626523ef6..40954e35bb 100644 --- a/packages/studiocms_core/src/types/sideBarLinkType.ts +++ b/packages/studiocms_core/src/types/sideBarLinkType.ts @@ -1,10 +1,12 @@ +import type { HeroIconName } from '@studiocms/ui/utils/iconType.ts'; + // Sidebar link type /** * @param id - The unique identifier for the link * @param href - The URL to redirect to * @param text - The text to display for the link * @param minPermissionLevel - The minimum permission level required to view the link (unknown, visitor, editor, admin) - * @param icon - The icon to display for the link ( see https://shoelace.style/components/icon ) + * @param icon - The icon to display for the link. See https://heroicons.com/ for the available names. */ export type SideBarLink = { /** Unique link ID */ @@ -15,8 +17,8 @@ export type SideBarLink = { text: string; /** Minimum permission level required to view the link (unknown/visitor/editor/admin) */ minPermissionLevel: string; - /** Icon to display for the link ( icon: 'data:image/svg+xml;base64,PH...) */ - icon: string; + /** Icon to display for the link ( icon: 'user') */ + icon: HeroIconName; /** Type of link (link/dropdown) */ type: 'link' | 'dropdown'; /** Dropdown items for dropdown links (Requires `type: 'dropdown'`) */ diff --git a/packages/studiocms_dashboard/package.json b/packages/studiocms_dashboard/package.json index d448736664..eeea7b17ee 100644 --- a/packages/studiocms_dashboard/package.json +++ b/packages/studiocms_dashboard/package.json @@ -43,14 +43,7 @@ "astro-integration-kit": "catalog:", "@inox-tools/runtime-logger": "catalog:studiocms-shared", "@matthiesenxyz/astrodtsbuilder": "catalog:studiocms-shared", - "@matthiesenxyz/integration-utils": "catalog:studiocms-shared", - - "@matthiesenxyz/unocss-preset-daisyui": "catalog:studiocms-shared", - "@matthiesenxyz/astrolace": "catalog:studiocms-shared", - "daisyui": "catalog:studiocms-shared", - "unocss": "catalog:studiocms-shared", - "@unocss/astro": "catalog:studiocms-shared", - "@unocss/reset": "catalog:studiocms-shared" + "@matthiesenxyz/integration-utils": "catalog:studiocms-shared" }, "peerDependencies": { "astro": "catalog:min", diff --git a/packages/studiocms_dashboard/src/components/BaseHead.astro b/packages/studiocms_dashboard/src/components/BaseHead.astro index 46c209d1b9..de0977f8df 100644 --- a/packages/studiocms_dashboard/src/components/BaseHead.astro +++ b/packages/studiocms_dashboard/src/components/BaseHead.astro @@ -1,9 +1,5 @@ --- -import 'uno.css'; -import '@unocss/reset/tailwind.css'; import '../styles/base.css'; -import '@matthiesenxyz/astrolace/base.css'; -import '@matthiesenxyz/astrolace/dark.css'; import Config from 'virtual:studiocms/config'; import version from 'virtual:studiocms/version'; import { isDashboardRoute } from '../utils'; @@ -49,4 +45,4 @@ const { title, description } = Astro.props; -)} +)} \ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/CrumbStack.astro b/packages/studiocms_dashboard/src/components/CrumbStack.astro deleted file mode 100644 index 041d0cbe1f..0000000000 --- a/packages/studiocms_dashboard/src/components/CrumbStack.astro +++ /dev/null @@ -1,29 +0,0 @@ ---- -import { Breadcrumb, BreadcrumbItem, Icon } from '@matthiesenxyz/astrolace/components'; -import chevronRight from '@studiocms/assets/svgs/chevron-right.svg'; -import columnsGap from '@studiocms/assets/svgs/columns-gap.svg'; - -interface Props { - items: Array<{ - href: string; - text: string; - }>; - isDashboard: boolean; -} - -const { items, isDashboard } = Astro.props; ---- - - -
- {isDashboard && } - - { - items.map(({ href, text }) => ( - - {text} - - )) - } - -
\ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/DashboardButtons.astro b/packages/studiocms_dashboard/src/components/DashboardButtons.astro deleted file mode 100644 index 44c288d5da..0000000000 --- a/packages/studiocms_dashboard/src/components/DashboardButtons.astro +++ /dev/null @@ -1,20 +0,0 @@ ---- -import { Button, Icon } from '@matthiesenxyz/astrolace/components'; -import discordLogo from '@studiocms/assets/svgs/discord.svg'; -import starIcon from '@studiocms/assets/svgs/star.svg'; -import { BetaFeedback } from '@studiocms/betaresources'; -import { studioCMSSocials } from '@studiocms/core/consts'; - -const { github, discord } = studioCMSSocials; ---- -
- - - -
\ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/Footer.astro b/packages/studiocms_dashboard/src/components/Footer.astro deleted file mode 100644 index 5636b84c13..0000000000 --- a/packages/studiocms_dashboard/src/components/Footer.astro +++ /dev/null @@ -1,75 +0,0 @@ ---- -import { Icon, VisuallyHidden } from '@matthiesenxyz/astrolace/components'; -import studioCMSDarkLogo from '@studiocms/assets/svgs/logo-dark.svg'; -import studioCMSLightLogo from '@studiocms/assets/svgs/logo-light.svg'; -import type { StudioCMSSocials } from '@studiocms/core/consts'; - -type Props = { studioCMSSocials: StudioCMSSocials }; -const { - studioCMSSocials: { github: githubURL, githubContributors, githubLicense }, -} = Astro.props; - -const today = new Date(); ---- - - - - - - - - - \ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/Header.astro b/packages/studiocms_dashboard/src/components/Header.astro index af4b63d2fa..c0c439075b 100644 --- a/packages/studiocms_dashboard/src/components/Header.astro +++ b/packages/studiocms_dashboard/src/components/Header.astro @@ -1,12 +1,7 @@ --- import { getUserData } from 'studiocms:auth/lib/user'; import { StudioCMSRoutes } from 'studiocms:helpers/routemap'; -import { Avatar, Button, Divider, Drawer, IconButton } from '@matthiesenxyz/astrolace/components'; -import githubLogo from '@studiocms/assets/svgs/github-logo.svg'; -import listIcon from '@studiocms/assets/svgs/list.svg'; -import personFillIcon from '@studiocms/assets/svgs/person-fill.svg'; import type { StudioCMSSocials } from '@studiocms/core/consts'; -import { SideBarMenu, ThemeToggleButton } from '../components'; const user = await getUserData(Astro); @@ -33,68 +28,4 @@ if (!name) { } else { useName = name; } ---- - - -
- -
- Current User: - - {useName} -
-
- -
- -
- - - - - -
- -
- -
- - \ No newline at end of file +--- \ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/Layout.astro b/packages/studiocms_dashboard/src/components/Layout.astro index 7046031230..4dc9e45bb8 100644 --- a/packages/studiocms_dashboard/src/components/Layout.astro +++ b/packages/studiocms_dashboard/src/components/Layout.astro @@ -1,17 +1,12 @@ --- import Config from 'virtual:studiocms/config'; import { studioCMSSocials } from '@studiocms/core/consts'; -import { BaseHead, Footer, Header, SideBar, ThemeManager } from '../components'; +import { BaseHead, Header } from '../components'; const socialLinks = studioCMSSocials; const { dashboardConfig: { - UnoCSSConfigOverride: { - presetsConfig: { - presetDaisyUI: { lightTheme }, - }, - }, developerConfig: { viewTransitionAPI }, }, } = Config; @@ -23,13 +18,12 @@ type Props = { sideBarActiveItemID: string; }; -const { title, description, includeSidebar = true } = Astro.props; +const { title, description } = Astro.props; --- - + - {viewTransitionAPI && ( \ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/SideBarFooter.astro b/packages/studiocms_dashboard/src/components/SideBarFooter.astro deleted file mode 100644 index 54a4b6594e..0000000000 --- a/packages/studiocms_dashboard/src/components/SideBarFooter.astro +++ /dev/null @@ -1,21 +0,0 @@ ---- -import { IconButton } from '@matthiesenxyz/astrolace/components'; -import githubLogo from '@studiocms/assets/svgs/github-logo.svg'; -import type { StudioCMSSocials } from '@studiocms/core/consts'; - -type Props = { studioCMSSocials: StudioCMSSocials }; -const { - studioCMSSocials: { github: githubURL }, -} = Astro.props as Props; ---- -
- - \ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/SideBarMenu.astro b/packages/studiocms_dashboard/src/components/SideBarMenu.astro deleted file mode 100644 index e3b1e7ea1f..0000000000 --- a/packages/studiocms_dashboard/src/components/SideBarMenu.astro +++ /dev/null @@ -1,241 +0,0 @@ ---- -import { StudioCMSRoutes, sideBarLinkMap } from 'studiocms:helpers/routemap'; -import Config from 'virtual:studiocms/config'; -import { Button, Details, Icon } from '@matthiesenxyz/astrolace/components'; -import boxArrowLeft from '@studiocms/assets/svgs/box-arrow-left.svg'; - -import { getUserData, verifyUserPermissionLevel } from 'studiocms:auth/lib/user'; - -const user = await getUserData(Astro); - -const { - dashboardConfig: { - developerConfig: { testingAndDemoMode }, - }, -} = Config; -const { - authLinks: { logoutURL }, -} = StudioCMSRoutes; -const sideBarLinks = sideBarLinkMap; ---- - - \ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/ThemeManager.astro b/packages/studiocms_dashboard/src/components/ThemeManager.astro deleted file mode 100644 index 9f73875e5f..0000000000 --- a/packages/studiocms_dashboard/src/components/ThemeManager.astro +++ /dev/null @@ -1,64 +0,0 @@ ---- - -type Props = { - defaultTheme?: 'auto' | 'dark' | 'light' | undefined; -}; - -const { defaultTheme = 'auto' } = Astro.props; ---- - - - \ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/ThemeToggleButton.astro b/packages/studiocms_dashboard/src/components/ThemeToggleButton.astro deleted file mode 100644 index 9ae144787e..0000000000 --- a/packages/studiocms_dashboard/src/components/ThemeToggleButton.astro +++ /dev/null @@ -1,161 +0,0 @@ ---- -/* This button will switch between the default theme and the opposite of that - * - * If the default theme is auto it will toggle between auto and the opposite of the systemTheme - * - * If the default theme is not auto it will never enter auto mode - * - * Set the themeIconRelationship to determine the behavior of the icon, match will have moon icon displayed while dark theme is active - * - */ - -type Props = { - themeIconRelationship?: 'match' | 'opposite' | undefined; -}; - -const { themeIconRelationship = 'opposite' } = Astro.props; ---- - - - - \ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/WebVitalPanel.astro b/packages/studiocms_dashboard/src/components/WebVitalPanel.astro deleted file mode 100644 index 1aafee87d2..0000000000 --- a/packages/studiocms_dashboard/src/components/WebVitalPanel.astro +++ /dev/null @@ -1,56 +0,0 @@ ---- -import type { WebVitalsResponseItem } from 'studiocms-dashboard:web-vitals'; -import { Icon, Tab, TabGroup, TabPanel } from '@matthiesenxyz/astrolace/components'; -import fileEarmarkPost from '@studiocms/assets/svgs/file-earmark-post.svg'; -import fileEarmark from '@studiocms/assets/svgs/file-earmark.svg'; -import google from '@studiocms/assets/svgs/google-logo.svg'; -import speedometer from '@studiocms/assets/svgs/speedometer.svg'; -import PagespeedInsights from './webVitalsParts/PagespeedInsights.astro'; -import WebVitalPerCoreVital from './webVitalsParts/WebVitalPerCoreVital.astro'; -import WebVitalPerCoreVitalRoute from './webVitalsParts/WebVitalPerCoreVitalRoute.astro'; -import WebVitalPerRouteData from './webVitalsParts/WebVitalPerRouteData.astro'; - -interface Props { - webVitalData: WebVitalsResponseItem[]; -} - -const { webVitalData } = Astro.props; ---- -{ - webVitalData.length > 0 ? ( - - - - Page Route Analytics - - - - Core Web Vitals - - - - Core Vitals by Route - - - - Pagespeed Insights Testing - - - - - - - - - - - - - - - - ) : ( -

Web Vitals data is not yet available.

- ) -} - diff --git a/packages/studiocms_dashboard/src/integration.ts b/packages/studiocms_dashboard/src/integration.ts index 1d6a891b25..fd7507e12e 100644 --- a/packages/studiocms_dashboard/src/integration.ts +++ b/packages/studiocms_dashboard/src/integration.ts @@ -1,29 +1,14 @@ import { runtimeLogger } from '@inox-tools/runtime-logger'; -import astrolace from '@matthiesenxyz/astrolace'; -import { addIntegrationArray } from '@matthiesenxyz/integration-utils/aikUtils'; import { integrationLogger } from '@matthiesenxyz/integration-utils/astroUtils'; -import { presetDaisy } from '@matthiesenxyz/unocss-preset-daisyui'; import { DashboardStrings, DbErrors } from '@studiocms/core/strings'; import type { InjectedType } from 'astro'; import { createResolver, defineIntegration } from 'astro-integration-kit'; -import { - presetTypography, - presetUno, - presetWebFonts, - presetWind, - transformerDirectives, -} from 'unocss'; -import UnocssAstroIntegration from 'unocss/astro'; -import type { DarkModeSelectors } from 'unocss/preset-mini'; import { name } from '../package.json'; import { StudioCMSDashboardOptionsSchema } from './schema'; +import { injectDashboardAPIRoutes } from './utils/addAPIRoutes'; import { checkForWebVitals } from './utils/checkForWebVitalsPlugin'; import { injectRouteArray } from './utils/injectRouteArray'; -const darkModeSelector: DarkModeSelectors = { - dark: '[data-theme="dark"]', -}; - export default defineIntegration({ name, optionsSchema: StudioCMSDashboardOptionsSchema, @@ -41,10 +26,7 @@ export default defineIntegration({ const { logger } = params; // Destructure Options - const { - verbose, - dashboardConfig: { UnoCSSConfigOverride }, - } = options; + const { verbose } = options; // Log that the setup has started integrationLogger({ logger, logLevel: 'info', verbose }, DashboardStrings.Setup); @@ -52,43 +34,57 @@ export default defineIntegration({ // Inject `@it-astro:logger:{name}` Logger for runtime logging runtimeLogger(params, { name: 'studiocms-dashboard' }); - // Add Dashboard Integrations - integrationLogger( - { logger, logLevel: 'info', verbose }, - DashboardStrings.AddIntegrations - ); - addIntegrationArray(params, [ - { integration: astrolace({ injectCss: false }) }, - { - integration: UnocssAstroIntegration({ - configFile: false, - injectReset: UnoCSSConfigOverride.injectReset, - injectEntry: UnoCSSConfigOverride.injectEntry, - transformers: [transformerDirectives()], - presets: [ - presetUno({ - dark: darkModeSelector, - }), - presetWind({ - dark: darkModeSelector, - }), - presetDaisy({ - themes: ['light', 'dark'], - darkTheme: 'dark', - }), - presetTypography(), - presetWebFonts({ - provider: 'google', - fonts: { - // Required Fonts for Google Icons - sans: 'Roboto', - mono: ['Fira Code', 'Fira Mono:400,700'], - }, - }), - ], - }), - }, - ]); + // Inject API Routes + injectDashboardAPIRoutes(params, { + options, + routes: [ + { + enabled: options.dashboardConfig.dashboardEnabled && !options.dbStartPage, + pattern: 'liverender', + entrypoint: resolve('./routes/studiocms_api/LiveRender.astro'), + }, + { + enabled: + options.dashboardConfig.dashboardEnabled && + !options.dbStartPage && + options.dashboardConfig.AuthConfig.enabled, + pattern: 'config/site', + entrypoint: resolve('./routes/studiocms_api/config/site.ts'), + }, + { + enabled: + options.dashboardConfig.dashboardEnabled && + !options.dbStartPage && + options.dashboardConfig.AuthConfig.enabled, + pattern: 'config/admin', + entrypoint: resolve('./routes/studiocms_api/config/admin.ts'), + }, + { + enabled: + options.dashboardConfig.dashboardEnabled && + !options.dbStartPage && + options.dashboardConfig.AuthConfig.enabled, + pattern: 'pages/create', + entrypoint: resolve('./routes/studiocms_api/pages/create.ts'), + }, + { + enabled: + options.dashboardConfig.dashboardEnabled && + !options.dbStartPage && + options.dashboardConfig.AuthConfig.enabled, + pattern: 'pages/edit', + entrypoint: resolve('./routes/studiocms_api/pages/edit.ts'), + }, + { + enabled: + options.dashboardConfig.dashboardEnabled && + !options.dbStartPage && + options.dashboardConfig.AuthConfig.enabled, + pattern: 'pages/delete', + entrypoint: resolve('./routes/studiocms_api/pages/delete.ts'), + }, + ], + }); // Inject Routes injectRouteArray(params, { @@ -96,13 +92,13 @@ export default defineIntegration({ routes: [ { enabled: options.dbStartPage, - pattern: 'start/', + pattern: 'start', entrypoint: resolve('./firstTimeSetupRoutes/main.astro'), _non_dashboard: true, }, { enabled: options.dbStartPage, - pattern: 'done/', + pattern: 'done', entrypoint: resolve('./firstTimeSetupRoutes/done.astro'), _non_dashboard: true, }, @@ -124,22 +120,22 @@ export default defineIntegration({ }, { enabled: options.dashboardConfig.dashboardEnabled && !options.dbStartPage, - pattern: 'configuration/', + pattern: 'configuration', entrypoint: resolve('./routes/configuration/index.astro'), }, { enabled: options.dashboardConfig.dashboardEnabled && !options.dbStartPage, - pattern: 'configuration/admins/', + pattern: 'configuration/admins', entrypoint: resolve('./routes/configuration/admins.astro'), }, { enabled: options.dashboardConfig.dashboardEnabled && !options.dbStartPage, - pattern: 'new/page/', + pattern: 'new/page', entrypoint: resolve('./routes/create-page.astro'), }, { enabled: options.dashboardConfig.dashboardEnabled && !options.dbStartPage, - pattern: 'page-list/', + pattern: 'page-list', entrypoint: resolve('./routes/page-list.astro'), }, { @@ -152,51 +148,6 @@ export default defineIntegration({ pattern: 'delete/pages/[...id]', entrypoint: resolve('./routes/delete-pages/[...id].astro'), }, - { - enabled: options.dashboardConfig.dashboardEnabled && !options.dbStartPage, - pattern: 'api/liverender', - entrypoint: resolve('./routes/api/LiveRender.astro'), - }, - { - enabled: - options.dashboardConfig.dashboardEnabled && - !options.dbStartPage && - options.dashboardConfig.AuthConfig.enabled, - pattern: 'api/config/site', - entrypoint: resolve('./routes/api/config/site.ts'), - }, - { - enabled: - options.dashboardConfig.dashboardEnabled && - !options.dbStartPage && - options.dashboardConfig.AuthConfig.enabled, - pattern: 'api/config/admin', - entrypoint: resolve('./routes/api/config/admin.ts'), - }, - { - enabled: - options.dashboardConfig.dashboardEnabled && - !options.dbStartPage && - options.dashboardConfig.AuthConfig.enabled, - pattern: 'api/pages/create', - entrypoint: resolve('./routes/api/pages/create.ts'), - }, - { - enabled: - options.dashboardConfig.dashboardEnabled && - !options.dbStartPage && - options.dashboardConfig.AuthConfig.enabled, - pattern: 'api/pages/edit', - entrypoint: resolve('./routes/api/pages/edit.ts'), - }, - { - enabled: - options.dashboardConfig.dashboardEnabled && - !options.dbStartPage && - options.dashboardConfig.AuthConfig.enabled, - pattern: 'api/pages/delete', - entrypoint: resolve('./routes/api/pages/delete.ts'), - }, ], }); diff --git a/packages/studiocms_dashboard/src/routes/api/LiveRender.astro b/packages/studiocms_dashboard/src/routes/studiocms_api/LiveRender.astro similarity index 100% rename from packages/studiocms_dashboard/src/routes/api/LiveRender.astro rename to packages/studiocms_dashboard/src/routes/studiocms_api/LiveRender.astro diff --git a/packages/studiocms_dashboard/src/routes/api/config/admin.ts b/packages/studiocms_dashboard/src/routes/studiocms_api/config/admin.ts similarity index 100% rename from packages/studiocms_dashboard/src/routes/api/config/admin.ts rename to packages/studiocms_dashboard/src/routes/studiocms_api/config/admin.ts diff --git a/packages/studiocms_dashboard/src/routes/api/config/site.ts b/packages/studiocms_dashboard/src/routes/studiocms_api/config/site.ts similarity index 100% rename from packages/studiocms_dashboard/src/routes/api/config/site.ts rename to packages/studiocms_dashboard/src/routes/studiocms_api/config/site.ts diff --git a/packages/studiocms_dashboard/src/routes/api/firstTimeSetup.ts b/packages/studiocms_dashboard/src/routes/studiocms_api/firstTimeSetup.ts similarity index 100% rename from packages/studiocms_dashboard/src/routes/api/firstTimeSetup.ts rename to packages/studiocms_dashboard/src/routes/studiocms_api/firstTimeSetup.ts diff --git a/packages/studiocms_dashboard/src/routes/api/pages/create.ts b/packages/studiocms_dashboard/src/routes/studiocms_api/pages/create.ts similarity index 100% rename from packages/studiocms_dashboard/src/routes/api/pages/create.ts rename to packages/studiocms_dashboard/src/routes/studiocms_api/pages/create.ts diff --git a/packages/studiocms_dashboard/src/routes/api/pages/delete.ts b/packages/studiocms_dashboard/src/routes/studiocms_api/pages/delete.ts similarity index 100% rename from packages/studiocms_dashboard/src/routes/api/pages/delete.ts rename to packages/studiocms_dashboard/src/routes/studiocms_api/pages/delete.ts diff --git a/packages/studiocms_dashboard/src/routes/api/pages/edit.ts b/packages/studiocms_dashboard/src/routes/studiocms_api/pages/edit.ts similarity index 100% rename from packages/studiocms_dashboard/src/routes/api/pages/edit.ts rename to packages/studiocms_dashboard/src/routes/studiocms_api/pages/edit.ts diff --git a/packages/studiocms_dashboard/src/uno.config.ts b/packages/studiocms_dashboard/src/uno.config.ts deleted file mode 100644 index 79109af8a5..0000000000 --- a/packages/studiocms_dashboard/src/uno.config.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { presetDaisy } from '@matthiesenxyz/unocss-preset-daisyui'; -import { - defineConfig, - presetTypography, - presetUno, - presetWebFonts, - presetWind, - transformerDirectives, -} from 'unocss'; -import type { DarkModeSelectors } from 'unocss/preset-mini'; - -const darkModeSelector: DarkModeSelectors = { - dark: '[data-theme="dark"]', -}; - -export default defineConfig({ - transformers: [transformerDirectives()], - presets: [ - presetUno({ - dark: darkModeSelector, - }), - presetWind({ - dark: darkModeSelector, - }), - presetDaisy({ - themes: ['light', 'dark'], - darkTheme: 'dark', - }), - presetTypography(), - presetWebFonts({ - provider: 'google', - fonts: { - // Required Fonts for Google Icons - sans: 'Roboto', - mono: ['Fira Code', 'Fira Mono:400,700'], - }, - }), - ], -}); diff --git a/packages/studiocms_dashboard/src/utils/addAPIRoutes.ts b/packages/studiocms_dashboard/src/utils/addAPIRoutes.ts new file mode 100644 index 0000000000..0a44b5f7bb --- /dev/null +++ b/packages/studiocms_dashboard/src/utils/addAPIRoutes.ts @@ -0,0 +1,74 @@ +import { integrationLogger } from '@matthiesenxyz/integration-utils/astroUtils'; +import { DashboardStrings } from '@studiocms/core/strings'; +import { defineUtility } from 'astro-integration-kit'; +import type { StudioCMSDashboardOptions } from '../schema'; + +export const makeStudioCMSDashbaordAPIRoute = (route: string) => { + return `studiocms_api/dashboard/${route}`; +}; + +export const injectDashboardAPIRoutes = defineUtility('astro:config:setup')( + ( + params, + opts: { + options: StudioCMSDashboardOptions; + routes: { + enabled: boolean; + pattern: string; + entrypoint: string; + }[]; + } + ) => { + const { injectRoute, logger } = params; + + const { + options: { + verbose, + dashboardConfig: { + dashboardEnabled, + AuthConfig: { enabled: authEnabled }, + developerConfig: { testingAndDemoMode }, + }, + }, + routes, + } = opts; + + // Check if the Dashboard is enabled + if (dashboardEnabled) { + // Log that the Dashboard is enabled + integrationLogger({ logger, logLevel: 'info', verbose }, DashboardStrings.DashboardEnabled); + } else { + // Log that the Dashboard is disabled + integrationLogger({ logger, logLevel: 'info', verbose }, DashboardStrings.DashboardDisabled); + } + + if (!authEnabled) { + // Log that the Auth is disabled + integrationLogger({ logger, logLevel: 'info', verbose }, DashboardStrings.AuthDisabled); + return; + } + + // Log that the Auth is enabled + integrationLogger({ logger, logLevel: 'info', verbose }, DashboardStrings.AuthEnabled); + + // If Testing and Demo Mode is enabled, log that it is enabled + if (testingAndDemoMode) { + integrationLogger({ logger, logLevel: 'info', verbose }, DashboardStrings.TestAndDemo); + } + + // Inject the API routes + for (const route of routes) { + const { enabled, pattern, entrypoint } = route; + + if (!enabled) { + continue; + } + + injectRoute({ + pattern: makeStudioCMSDashbaordAPIRoute(pattern), + entrypoint, + prerender: false, + }); + } + } +); diff --git a/packages/studiocms_ui/package.json b/packages/studiocms_ui/package.json index c3f178d6cc..afa70a539c 100644 --- a/packages/studiocms_ui/package.json +++ b/packages/studiocms_ui/package.json @@ -36,7 +36,9 @@ "./types": "./src/types/index.ts" }, "dependencies": { - "@fontsource-variable/onest": "catalog:studiocms-shared" + "@fontsource-variable/onest": "catalog:studiocms-shared", + "@iconify-json/heroicons": "^1.2.1", + "@iconify/utils": "^2.1.33" }, "peerDependencies": { "astro": "catalog:min" diff --git a/packages/studiocms_ui/src/components/Checkbox.astro b/packages/studiocms_ui/src/components/Checkbox.astro index d0048dd9c2..fae16206ed 100644 --- a/packages/studiocms_ui/src/components/Checkbox.astro +++ b/packages/studiocms_ui/src/components/Checkbox.astro @@ -1,4 +1,5 @@ --- +import Checkmark from '../icons/Checkmark.astro'; import Icon from '../utils/Icon.astro'; import type { StudioCMSColorway } from '../utils/colors'; import { generateID } from '../utils/generateID'; @@ -39,8 +40,7 @@ const iconSizes = { ]} >
- x.value === defaultValue)?.label || "Select"} /> - +
    { diff --git a/packages/studiocms_ui/src/components/Select.astro b/packages/studiocms_ui/src/components/Select.astro index 36c436fd8f..4a1558a0b7 100644 --- a/packages/studiocms_ui/src/components/Select.astro +++ b/packages/studiocms_ui/src/components/Select.astro @@ -1,33 +1,33 @@ --- -import Icon from "../utils/Icon.astro"; -import { generateID } from "../utils/generateID"; +import Icon from '../utils/Icon.astro'; +import { generateID } from '../utils/generateID'; type Option = { - label: string; - value: string; - disabled?: boolean; + label: string; + value: string; + disabled?: boolean; }; type Props = { - label?: string; - defaultValue?: string; - class?: string; - name?: string; - isRequired?: boolean; - options: Option[]; - disabled?: boolean; - fullWidth?: boolean; + label?: string; + defaultValue?: string; + class?: string; + name?: string; + isRequired?: boolean; + options: Option[]; + disabled?: boolean; + fullWidth?: boolean; }; const { - label, - defaultValue, - class: className, - name = generateID("select"), - isRequired, - options = [], - disabled, - fullWidth, + label, + defaultValue, + class: className, + name = generateID('select'), + isRequired, + options = [], + disabled, + fullWidth, } = Astro.props; --- @@ -53,7 +53,7 @@ const { : "Select" } - +
      { diff --git a/packages/studiocms_ui/src/components/User.astro b/packages/studiocms_ui/src/components/User.astro index 8e11fc98ba..ec98af802d 100644 --- a/packages/studiocms_ui/src/components/User.astro +++ b/packages/studiocms_ui/src/components/User.astro @@ -13,11 +13,10 @@ const { name, description, avatar, class: className } = Astro.props; ---
      - {avatar ? ( {name} ) : ( - + )}
      diff --git a/packages/studiocms_ui/src/utils/Icon.astro b/packages/studiocms_ui/src/utils/Icon.astro index fa909b952d..9d9a197900 100644 --- a/packages/studiocms_ui/src/utils/Icon.astro +++ b/packages/studiocms_ui/src/utils/Icon.astro @@ -1,27 +1,32 @@ --- +import { icons } from '@iconify-json/heroicons'; +import { getIconData, iconToSVG, replaceIDs } from '@iconify/utils'; import type { HTMLAttributes } from 'astro/types'; +import { type HeroIconName } from './iconType'; -// biome-ignore lint/suspicious/noExplicitAny: -type AstroComponent = (_props: Record) => any; - -type UIIcons = 'checkmark' | 'x-mark' | 'chevron-up-down' | 'user'; - -// Map of icon names to Astro components -const Components: Record = { - checkmark: (await import('../icons/Checkmark.astro')).default, - 'x-mark': (await import('../icons/X-Mark.astro')).default, - 'chevron-up-down': (await import('../icons/ChevronUpDown.astro')).default, - user: (await import('../icons/User.astro')).default, -}; - +interface SVGAttributes extends HTMLAttributes<'svg'> { + // biome-ignore lint/suspicious/noExplicitAny: Allow any string index + [key: string]: any; +} interface Props extends HTMLAttributes<'svg'> { - name: UIIcons; - width?: number; - height?: number; + name: HeroIconName; } - -const { name, width, height, ...props } = Astro.props; - -const Tag = Components[name]; +const { name, ...props } = Astro.props; +const attributes = props as SVGAttributes; +const iconData = getIconData(icons, name); +if (!iconData) { + throw new Error(`Icon "${name}" is missing`); +} +const renderData = iconToSVG(iconData, { + height: attributes.height || 'auto', +}); +const body = replaceIDs(renderData.body); +let renderAttribsHTML = + body.indexOf('xlink:') === -1 ? '' : ' xmlns:xlink="http://www.w3.org/1999/xlink"'; +for (const attr in attributes) { + renderAttribsHTML += ` ${attr}="${attributes[attr]}"`; +} +const svg = `${body}`; --- - \ No newline at end of file + + \ No newline at end of file diff --git a/packages/studiocms_ui/src/utils/iconType.ts b/packages/studiocms_ui/src/utils/iconType.ts new file mode 100644 index 0000000000..686e75dae4 --- /dev/null +++ b/packages/studiocms_ui/src/utils/iconType.ts @@ -0,0 +1,3 @@ +import type { icons as heroIcons } from '@iconify-json/heroicons/icons.json'; + +export type HeroIconName = keyof typeof heroIcons; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1aa6efc2e..098490e5b4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -71,8 +71,8 @@ catalogs: specifier: ^0.7.4 version: 0.7.4 expressive-code-twoslash: - specifier: ^0.2.6 - version: 0.2.6 + specifier: ^0.3.0 + version: 0.3.0 hast: specifier: ^1.0.0 version: 1.0.0 @@ -264,30 +264,12 @@ catalogs: '@matthiesenxyz/astrodtsbuilder': specifier: ^0.1.2 version: 0.1.2 - '@matthiesenxyz/astrolace': - specifier: ^0.3.2 - version: 0.3.2 '@matthiesenxyz/integration-utils': specifier: ^0.2.0 version: 0.2.0 - '@matthiesenxyz/unocss-preset-daisyui': - specifier: ^0.1.2 - version: 0.1.2 - '@unocss/astro': - specifier: ^0.62.3 - version: 0.62.3 - '@unocss/reset': - specifier: ^0.62.3 - version: 0.62.3 - daisyui: - specifier: ^4.12.10 - version: 4.12.10 rollup-plugin-copy: specifier: ^3.5.0 version: 3.5.0 - unocss: - specifier: ^0.62.3 - version: 0.62.3 importers: @@ -347,15 +329,9 @@ importers: '@matthiesenxyz/astrodtsbuilder': specifier: catalog:studiocms-shared version: 0.1.2(astro@4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3)) - '@matthiesenxyz/astrolace': - specifier: catalog:studiocms-shared - version: 0.3.2(@types/react@18.3.5)(astro@4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3)) '@matthiesenxyz/integration-utils': specifier: catalog:studiocms-shared version: 0.2.0(astro@4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3)) - '@matthiesenxyz/unocss-preset-daisyui': - specifier: catalog:studiocms-shared - version: 0.1.2(daisyui@4.12.10(postcss@8.4.47))(unocss@0.62.3(postcss@8.4.47)(rollup@4.21.0)(vite@5.4.11(@types/node@22.0.0))) '@oslojs/binary': specifier: catalog:studiocms-auth version: 1.0.0 @@ -404,12 +380,6 @@ importers: '@types/three': specifier: catalog:studiocms-auth version: 0.169.0 - '@unocss/astro': - specifier: catalog:studiocms-shared - version: 0.62.3(rollup@4.21.0)(vite@5.4.11(@types/node@22.0.0)) - '@unocss/reset': - specifier: catalog:studiocms-shared - version: 0.62.3 arctic: specifier: catalog:studiocms-auth version: 2.0.1 @@ -422,9 +392,6 @@ importers: bcryptjs: specifier: catalog:studiocms-auth version: 2.4.3 - daisyui: - specifier: catalog:studiocms-shared - version: 4.12.10(postcss@8.4.47) marked: specifier: catalog:studiocms-renderer version: 13.0.3 @@ -467,9 +434,6 @@ importers: three: specifier: catalog:studiocms-auth version: 0.170.0 - unocss: - specifier: catalog:studiocms-shared - version: 0.62.3(postcss@8.4.47)(rollup@4.21.0)(vite@5.4.11(@types/node@22.0.0)) devDependencies: '@types/semver': specifier: catalog:studiocms @@ -607,15 +571,15 @@ importers: '@matthiesenxyz/astrodtsbuilder': specifier: catalog:studiocms-shared version: 0.1.2(astro@4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3)) - '@matthiesenxyz/astrolace': - specifier: catalog:studiocms-shared - version: 0.3.2(@types/react@18.3.5)(astro@4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3)) '@matthiesenxyz/integration-utils': specifier: catalog:studiocms-shared version: 0.2.0(astro@4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3)) '@studiocms/robotstxt': specifier: workspace:* version: link:../studiocms_robotstxt + '@studiocms/ui': + specifier: workspace:* + version: link:../studiocms_ui astro: specifier: catalog:min version: 4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3) @@ -662,15 +626,9 @@ importers: '@matthiesenxyz/astrodtsbuilder': specifier: catalog:studiocms-shared version: 0.1.2(astro@4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3)) - '@matthiesenxyz/astrolace': - specifier: catalog:studiocms-shared - version: 0.3.2(@types/react@18.3.5)(astro@4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3)) '@matthiesenxyz/integration-utils': specifier: catalog:studiocms-shared version: 0.2.0(astro@4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3)) - '@matthiesenxyz/unocss-preset-daisyui': - specifier: catalog:studiocms-shared - version: 0.1.2(daisyui@4.12.10(postcss@8.4.47))(unocss@0.62.3(postcss@8.4.47)(rollup@4.21.0)(vite@5.4.11(@types/node@22.0.0))) '@studiocms/assets': specifier: workspace:* version: link:../studiocms_assets @@ -683,24 +641,12 @@ importers: '@studiocms/renderers': specifier: workspace:* version: link:../studiocms_renderers - '@unocss/astro': - specifier: catalog:studiocms-shared - version: 0.62.3(rollup@4.21.0)(vite@5.4.11(@types/node@22.0.0)) - '@unocss/reset': - specifier: catalog:studiocms-shared - version: 0.62.3 astro: specifier: catalog:min version: 4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3) astro-integration-kit: specifier: 'catalog:' version: 0.16.1(astro@4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3)) - daisyui: - specifier: catalog:studiocms-shared - version: 4.12.10(postcss@8.4.47) - unocss: - specifier: catalog:studiocms-shared - version: 0.62.3(postcss@8.4.47)(rollup@4.21.0)(vite@5.4.11(@types/node@22.0.0)) devDependencies: typescript: specifier: 'catalog:' @@ -898,6 +844,12 @@ importers: '@fontsource-variable/onest': specifier: catalog:studiocms-shared version: 5.1.0 + '@iconify-json/heroicons': + specifier: ^1.2.1 + version: 1.2.1 + '@iconify/utils': + specifier: ^2.1.33 + version: 2.1.33 astro: specifier: catalog:min version: 4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3) @@ -1032,7 +984,7 @@ importers: version: 0.7.4(astro@4.16.14(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3)) expressive-code-twoslash: specifier: catalog:docs - version: 0.2.6(@expressive-code/core@0.38.3)(typescript@5.6.3) + version: 0.3.0(@expressive-code/core@0.38.3)(expressive-code@0.38.3)(typescript@5.6.3) hast: specifier: catalog:docs version: 1.0.0 @@ -1125,8 +1077,8 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@antfu/install-pkg@0.4.0': - resolution: {integrity: sha512-vI73C0pFA9L+5v+djh0WSLXb8qYQGH5fX8nczaFe1OTI/8Fh03JS1Mov1V7urb6P3A2cBlBqZNjJIKv54+zVRw==} + '@antfu/install-pkg@0.4.1': + resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==} '@antfu/utils@0.7.10': resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} @@ -1280,16 +1232,6 @@ packages: resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.25.0': - resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-member-expression-to-functions@7.24.8': - resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} @@ -1306,28 +1248,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.24.7': - resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} - engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.25.9': resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} - '@babel/helper-replace-supers@7.25.0': - resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.25.7': resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==} engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': - resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} @@ -1368,18 +1296,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.24.7': - resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.24.8': - resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.24.7': resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} engines: {node: '>=6.9.0'} @@ -1398,18 +1314,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.25.2': - resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-typescript@7.24.7': - resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/runtime@7.25.0': resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} engines: {node: '>=6.9.0'} @@ -1595,24 +1499,12 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.23.0': - resolution: {integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.23.0': - resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.15.18': resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} engines: {node: '>=12'} @@ -1625,108 +1517,54 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.23.0': - resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.23.0': - resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.23.0': - resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.23.0': - resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.23.0': - resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.23.0': - resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.23.0': - resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.23.0': - resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.23.0': - resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.15.18': resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} engines: {node: '>=12'} @@ -1739,150 +1577,72 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.23.0': - resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.23.0': - resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.23.0': - resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.23.0': - resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.23.0': - resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.23.0': - resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.23.0': - resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.23.0': - resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.23.0': - resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.23.0': - resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.23.0': - resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.23.0': - resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.23.0': - resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@expressive-code/core@0.38.3': resolution: {integrity: sha512-s0/OtdRpBONwcn23O8nVwDNQqpBGKscysejkeBkwlIeHRLZWgiTVrusT5Idrdz1d8cW5wRk9iGsAIQmwDPXgJg==} @@ -1899,23 +1659,17 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@floating-ui/core@1.6.5': - resolution: {integrity: sha512-8GrTWmoFhm5BsMZOTHeGD2/0FLKLQQHvO/ZmQga4tKempYRLz8aqJGqXVuQgisnMObq2YZ2SgkwctN1LOOxcqA==} - - '@floating-ui/dom@1.6.8': - resolution: {integrity: sha512-kx62rP19VZ767Q653wsP1XZCGIirkE09E0QUGNYTM/ttbbQHqcGPdSfWFxUyyNLc/W6aoJRBajOSXhP6GXjC0Q==} - - '@floating-ui/utils@0.2.5': - resolution: {integrity: sha512-sTcG+QZ6fdEUObICavU+aB3Mp8HY4n14wYHdxK4fXjPmv3PXZZeY5RaguJmGyeH/CJQhX3fqKUtS4qc1LoHwhQ==} - '@fontsource-variable/onest@5.1.0': resolution: {integrity: sha512-8jspwmuPWtC2p4gxmjUIQ2JugqCcClFwlD1DEJt+gARgZMm3PI62rYivoKVUDB3Q6hdQxeL5wdzjxCOnzTU5BA==} + '@iconify-json/heroicons@1.2.1': + resolution: {integrity: sha512-TkKfS5U27kE5MXmSGLzPoz95BP5VA9xEJXwJFwmPMVLX+xyWq0OkoiWTUXB0uAoQODpb8BaRpzSydItrq9fIRA==} + '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@2.1.32': - resolution: {integrity: sha512-LeifFZPPKu28O3AEDpYJNdEbvS4/ojAPyIW+pF/vUpJTYnbTiXUHkCh0bwgFRzKvdpb8H4Fbfd/742++MF4fPQ==} + '@iconify/utils@2.1.33': + resolution: {integrity: sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==} '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} @@ -2114,17 +1868,6 @@ packages: cpu: [x64] os: [win32] - '@lit-labs/ssr-dom-shim@1.2.0': - resolution: {integrity: sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==} - - '@lit/react@1.0.5': - resolution: {integrity: sha512-RSHhrcuSMa4vzhqiTenzXvtQ6QDq3hSPsnHHO3jaPmmvVFeoNNm4DHoQ0zLdKAUvY3wP3tTENSUf7xpyVfrDEA==} - peerDependencies: - '@types/react': 17 || 18 - - '@lit/reactive-element@2.0.4': - resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==} - '@lorenzo_lewis/starlight-utils@0.2.0': resolution: {integrity: sha512-RAOhqhA5axe9+MXb6r/QwY6mulbTU1hCmtu2lImU3OyFqyV6ClPhAxqqEY7wMHHEHds8UaXGVPUPMST2FZcyZQ==} peerDependencies: @@ -2159,22 +1902,11 @@ packages: peerDependencies: astro: ^4.14 - '@matthiesenxyz/astrolace@0.3.2': - resolution: {integrity: sha512-w1fO4FGxf6xB57otJS1JdsLe8xv1R9og3ci3dTE0Nm2NsoKvv96nqC6HRX7BOEAWNthoprvkD1k1VxHOGpz/nw==} - peerDependencies: - astro: '>=4.14' - '@matthiesenxyz/integration-utils@0.2.0': resolution: {integrity: sha512-gS5QZ2Kwn4Es2niShuo0YunnYa3+vDbOHOeq/0E2/31LqbReipZwqiHzkkuN/d5nGfBzjvD2VD+uU9QTR4LZRA==} peerDependencies: astro: ^4.14 - '@matthiesenxyz/unocss-preset-daisyui@0.1.2': - resolution: {integrity: sha512-ErhWcbsNQXVCVkM4AWn+5T/t8oupspdcRCPFGu0D98EEE2HKSrj882iF36ZcRqcChuivQpmxSuHL6ZTe0vRhUw==} - peerDependencies: - daisyui: ^4.12.10 - unocss: ^0.62.3 - '@mdx-js/mdx@3.0.1': resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} @@ -2571,9 +2303,6 @@ packages: resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} engines: {node: '>=12'} - '@polka/url@1.0.0-next.25': - resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} - '@prisma/instrumentation@5.19.1': resolution: {integrity: sha512-VLnzMQq7CWroL5AeaW0Py2huiNKeoMfCH3SUxstdzPrlWQi6UQ9UrfcbUkNHlVFqOMacqy8X/8YtE0kuKDpD9w==} @@ -2824,16 +2553,6 @@ packages: '@shikijs/vscode-textmate@9.3.0': resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} - '@shoelace-style/animations@1.1.0': - resolution: {integrity: sha512-Be+cahtZyI2dPKRm8EZSx3YJQ+jLvEcn3xzRP7tM4tqBnvd/eW/64Xh0iOf0t2w5P8iJKfdBbpVNE9naCaOf2g==} - - '@shoelace-style/localize@3.2.1': - resolution: {integrity: sha512-r4C9C/5kSfMBIr0D9imvpRdCNXtUNgyYThc4YlS6K5Hchv1UyxNQ9mxwj+BTRH2i1Neits260sR3OjKMnplsFA==} - - '@shoelace-style/shoelace@2.16.0': - resolution: {integrity: sha512-OV4XYAAZv0OfOR4RlpxCYOn7pH8ETIL8Pkh5hFvIrL+BN4/vlBLoeESYDU2tB/f9iichu4cfwdPquJITmKdY1w==} - engines: {node: '>=14.17.0'} - '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} @@ -2967,9 +2686,6 @@ packages: '@types/three@0.169.0': resolution: {integrity: sha512-oan7qCgJBt03wIaK+4xPWclYRPG9wzcg7Z2f5T8xYTNEF95kh0t0lklxLLYBDo7gQiGLYzE6iF4ta7nXF2bcsw==} - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/turndown@5.0.5': resolution: {integrity: sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==} @@ -2993,92 +2709,6 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@unocss/astro@0.62.3': - resolution: {integrity: sha512-C6ZdyLbLDS0LebwmgwVItLNAOSkL/tvVWNRd1i3Jy5uj1vPxlrw+3lIYiHjEofn0GFpBiwlv5+OCvO1Xpq5MqA==} - peerDependencies: - vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 - peerDependenciesMeta: - vite: - optional: true - - '@unocss/cli@0.62.3': - resolution: {integrity: sha512-yEl1iNKkBVpo8+i8gzveM5/0/vOVe6m8+FmuSDuKeSPJnYMhI1mAn+OCKFb/I+qEeLbRPXebbJUUB1xZNzya+w==} - engines: {node: '>=14'} - hasBin: true - - '@unocss/config@0.62.3': - resolution: {integrity: sha512-zYOvFE0HfGIbnP/AvsbAlJpPRx9CQyXzL11m/8zgsHW5SGlJIYxuTll83l/xu026G5mPiksy7quoEOEgCLslqw==} - engines: {node: '>=14'} - - '@unocss/core@0.62.3': - resolution: {integrity: sha512-Pfyrj8S7jq9K1QXD6Z5BCeiQavaHpbMN5q958/kmdbNGp57hOg1e346fMJAvgPjLBR+lE/hgZEsDrijtRiZXnw==} - - '@unocss/extractor-arbitrary-variants@0.62.3': - resolution: {integrity: sha512-9ZscWyXEwDZif+b56xZyJFHwJOjdMXmj+6x96jOsnRNBzwT9eW7YcGCErP1ih/q1S6KmuRrHM/JOXMBQ6H4qlw==} - - '@unocss/inspector@0.62.3': - resolution: {integrity: sha512-nTSXOf7YimFPxEYJo5VfP5wlMgYOCjlv3c5Ub/0fynCJXZNb89SFeU05ABXkEgg/FfiobVBTscikLc6guW8eHQ==} - - '@unocss/postcss@0.62.3': - resolution: {integrity: sha512-CwL378ef0QazduXqlaGcWgKJAzemBUxdhapWWiRqI8sXC/eXht5xK6nS1JxqADDuxosgqsGdvcCGmP8ZFrEyiA==} - engines: {node: '>=14'} - peerDependencies: - postcss: ^8.4.21 - - '@unocss/preset-attributify@0.62.3': - resolution: {integrity: sha512-ORNwyLobGTwnn/tK5yHnMabdJU6Mr/C4LyFH7G8VSLit/aVS0fFa795kJXwxfbqQoQ7Gw0Zxs9oE5RXI0/0y7g==} - - '@unocss/preset-icons@0.62.3': - resolution: {integrity: sha512-Ie+5RTyac1Q5CNB/s/4aB4VTHAQgQqsI5hshMNLkJ0Jj1lWxodUdEbCRKjXDalRjAXOS9vsLjfJ35ozJ1RSTIQ==} - - '@unocss/preset-mini@0.62.3': - resolution: {integrity: sha512-dn/8ubeW2ry/ZF3iKxdQHnS0l3EBibt0rIOE/XVwx24ub6pRzclU4r7xHnXeqvAFOO9PoiKDGgFR92m6R2MxyQ==} - - '@unocss/preset-tagify@0.62.3': - resolution: {integrity: sha512-8BpUCZ5sjOZOzBKtu7ecfhRggwwPF78IqeqeNjI+XYRs8r7TBBcUVeF6zUkwhlX/TbtREkw2OZj0Iusa9CBO+A==} - - '@unocss/preset-typography@0.62.3': - resolution: {integrity: sha512-GjtDgQ1Jec/5RNmnyGMWMgyPdStWcFG/S+NUfOuroRsGSI8PDxihVOwFu5CwvOB2J2r6mRNLeUYMluE05jW3sw==} - - '@unocss/preset-uno@0.62.3': - resolution: {integrity: sha512-RlsrMlpEzoZqB0lr5VvlkHGpEgr0Vp6z4Q/7DjW5t7mi20Z2i8olaLGWM0TO1wKoRi8bxc6HP0RHUS7pHtZxBA==} - - '@unocss/preset-web-fonts@0.62.3': - resolution: {integrity: sha512-rGEouncGFwcUY1cjkQ/ZoSmEzOeSi3Yk4YAfHGyS0ff5zKuTDWZgivB8hh/mTtvRzZunIL+FW1+1z5G9rUwjgQ==} - - '@unocss/preset-wind@0.62.3': - resolution: {integrity: sha512-6+VNce1he1U5EXKlXRwTIPn8KeK6bZ2jAEgcCxk8mFy8SzOlLeYzXCI9lcdiWRTjIeIiK5iSaUqmsQFtKdTyQg==} - - '@unocss/reset@0.62.3': - resolution: {integrity: sha512-XVKPkbm8y9SGzRaG3x+HygGZURm50MvKLVHXsbxi67RbIir9Ouyt9hQTV6Xs3RicRZFWOpJx3wMRb8iKUOe5Zw==} - - '@unocss/rule-utils@0.62.3': - resolution: {integrity: sha512-qI37jHH//XzyR5Y2aN3Kpo4lQrQO+CaiXpqPSwMLYh2bIypc2RQVpqGVtU736x0eA6IIx41XEkKzUW+VtvJvmg==} - engines: {node: '>=14'} - - '@unocss/scope@0.62.3': - resolution: {integrity: sha512-TJGmFfsMrTo8DBJ7CJupIqObpgij+w4jCHMBf1uu0/9jbm63dH6WGcrl3zf5mm6UBTeLmB0RwJ8K4hs7LtrBDQ==} - - '@unocss/transformer-attributify-jsx-babel@0.62.3': - resolution: {integrity: sha512-3yFZPSoN8VLiAGUAFIyfDRv9HQYTKFGKawDdMM9ATZmSEYOecJnYjS2HayT1P9kzGwBwuKoFjcX50JH1PuNokg==} - - '@unocss/transformer-attributify-jsx@0.62.3': - resolution: {integrity: sha512-AutidZj26QW1vLQzuW/aQigC/5ZnIeqGYIBeb/O+FKKt0bU411tHrHnA1iV4CoxIdWJTkw2sGAl6z6YvwAYG6w==} - - '@unocss/transformer-compile-class@0.62.3': - resolution: {integrity: sha512-1hf+99wJXzQXQPz9xR0AiTB3vBXT5RiEyugIX95HFx7EvSE/P17RP90yKEKZtDZRUwGiz2vIyySlxcKTFak9Vg==} - - '@unocss/transformer-directives@0.62.3': - resolution: {integrity: sha512-HqHwFOA7DfxD/A1ROZIp8Dr8iZcE0z4w3VQtViWPQ89Fqmb7p2wCPGekk+8yW5PAltpynvHE4ahJEto5xjdg6w==} - - '@unocss/transformer-variant-group@0.62.3': - resolution: {integrity: sha512-oNX1SdfWemz0GWGSXACu8NevM0t2l44j2ancnooNkNz3l1+z1nbn4vFwfsJCOqOaoVm4ZqxaiQ8HIx81ZSiU1A==} - - '@unocss/vite@0.62.3': - resolution: {integrity: sha512-RrqF6Go8s0BGpwRfkOiLuO+n3CUE/CXxGqb0ipbUARhmNWJlekE3YPfayqImSEnCcImpaPgtVGv6Y0u3kLGG/w==} - peerDependencies: - vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 - '@vitejs/plugin-react@4.3.3': resolution: {integrity: sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -3266,13 +2896,6 @@ packages: resolution: {integrity: sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==} engines: {node: '>= 14'} - autoprefixer@10.4.20: - resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -3332,16 +2955,6 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} - bundle-require@5.0.0: - resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.18' - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - call-me-maybe@1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} @@ -3349,10 +2962,6 @@ packages: resolution: {integrity: sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==} engines: {node: '>=12.20'} - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - camelcase@8.0.0: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} @@ -3458,24 +3067,21 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} - composed-offset-position@0.0.4: - resolution: {integrity: sha512-vMlvu1RuNegVE0YsCDSV/X4X10j56mq7PCIyOKK74FxkXzGLwhOUmdkJLSdOBOMwWycobGUMgft2lp+YgTe8hw==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} confbox@0.1.7: resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -3506,13 +3112,6 @@ packages: css-selector-parser@3.0.5: resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} - css-selector-tokenizer@0.8.0: - resolution: {integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==} - - css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -3528,14 +3127,6 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - culori@3.3.0: - resolution: {integrity: sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - daisyui@4.12.10: - resolution: {integrity: sha512-jp1RAuzbHhGdXmn957Z2XsTZStXGHzFfF0FgIOZj3Wv9sH7OZgLfXTRZNfKVYxltGUOBsG1kbWAdF5SrqjebvA==} - engines: {node: '>=16.9.0'} - data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -3586,9 +3177,6 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -3600,9 +3188,6 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - destr@2.0.3: - resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} - destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -3758,9 +3343,6 @@ packages: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -3927,11 +3509,6 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.23.0: - resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==} - engines: {node: '>=18'} - hasBin: true - escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -3987,10 +3564,11 @@ packages: resolution: {integrity: sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==} engines: {node: ^18.19.0 || >=20.5.0} - expressive-code-twoslash@0.2.6: - resolution: {integrity: sha512-OplHAMx458Uy/6m/gkAABkW/GOdQEqGE/zCMBoHuOHGgfCfq1zVrj3kUHc3fGB9l2Ebg8ASQpIChlL56H2SYRg==} + expressive-code-twoslash@0.3.0: + resolution: {integrity: sha512-adEOcFTRlNK3mnyi31cEWXEIP+anlZNHmMijTPdv4RVTqjs2qDlt591xntPvlH7YJSfypEw+c3teWOzelNxbvA==} peerDependencies: '@expressive-code/core': ^0.38.3 + expressive-code: ^0.38.3 typescript: ^5.5 expressive-code@0.38.3: @@ -4024,20 +3602,9 @@ packages: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true - fastparse@1.1.2: - resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} - fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fdir@6.3.0: - resolution: {integrity: sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - fdir@6.4.2: resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} peerDependencies: @@ -4095,9 +3662,6 @@ packages: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -4137,9 +3701,6 @@ packages: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} - get-tsconfig@4.7.6: - resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} - github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -4177,10 +3738,6 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} - gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -4314,9 +3871,6 @@ packages: import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - importx@0.4.3: - resolution: {integrity: sha512-x6E6OxmWq/SUaj7wDeDeSjyHP+rMUbEaqJ5fw0uEtC/FTX9ocxNMFJ+ONnpJIsRpFz3ya6qJAK4orwSKqw0BSQ==} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -4440,14 +3994,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} - hasBin: true - - jiti@2.0.0-beta.2: - resolution: {integrity: sha512-c+PHQZakiQuMKbnhvrjZUvrK6E/AfmTOf4P+E3Y4FNVHcNMX9e/XrnbEvO+m4wS6ZjsvhHh/POQTlfy8uXFc0A==} - hasBin: true - jiti@2.3.3: resolution: {integrity: sha512-EX4oNDwcXSivPrw2qKH2LB5PoFxEvgtv2JgwW0bU858HoLQ+kutSvjLMUqBd0PeJYEinLWhoI9Ol0eYMqj/wNQ==} hasBin: true @@ -4523,28 +4069,15 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lit-element@4.0.6: - resolution: {integrity: sha512-U4sdJ3CSQip7sLGZ/uJskO5hGiqtlpxndsLr6mt3IQIjheg93UKYeGQjWMRql1s/cXNOaRrCzC2FQwjIwSUqkg==} - - lit-html@3.1.4: - resolution: {integrity: sha512-yKKO2uVv7zYFHlWMfZmqc+4hkmSbFp8jgjdZY9vvR9jr4J8fH6FUMXhr+ljfELgmjpvlF7Z1SJ5n5/Jeqtc9YA==} - - lit@3.1.4: - resolution: {integrity: sha512-q6qKnKXHy2g1kjBaNfcoLlgbI3+aSOZ9Q4tiGa9bGYXq5RBXxkVTqTIVmP2VWMp29L4GyvCFm8ZQ2o56eUAMyA==} - lite-youtube-embed@0.3.3: resolution: {integrity: sha512-gFfVVnj6NRjxVfJKo3qoLtpi0v5mn3AcR4eKD45wrxQuxzveFJUb+7Cr6uV6n+DjO8X3p0UzPPquhGt0H/y+NA==} - load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} locate-path@5.0.0: @@ -4696,9 +4229,6 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -4855,6 +4385,9 @@ packages: mlly@1.7.1: resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + mlly@1.7.3: + resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} + module-details-from-path@1.0.3: resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} @@ -4896,9 +4429,6 @@ packages: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} - node-fetch-native@1.6.4: - resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -4919,10 +4449,6 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - npm-run-path@6.0.0: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} @@ -4930,9 +4456,6 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - ofetch@1.3.4: - resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} - on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -5028,9 +4551,6 @@ packages: resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==} engines: {node: '>=18'} - package-manager-detector@0.1.2: - resolution: {integrity: sha512-iePyefLTOm2gEzbaZKSW+eBMjg+UYsQvUKxmvGXAQ987K16efBg10MxIjZs08iyX+DY2/owKY9DIdu193kX33w==} - package-manager-detector@0.2.0: resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} @@ -5057,9 +4577,6 @@ packages: parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - parsel-js@1.1.2: - resolution: {integrity: sha512-D66DG2nKx4Yoq66TMEyCUHlR2STGqO7vsBrX7tgyS9cfQyO6XD5JyzOiflwmWN6a4wbUAqpmHqmrxlTQVGZcbA==} - path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -5096,9 +4613,6 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} @@ -5139,11 +4653,8 @@ packages: pkg-types@1.1.3: resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} - postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 + pkg-types@1.2.1: + resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} @@ -5155,9 +4666,6 @@ packages: resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} engines: {node: '>=4'} - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.47: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} @@ -5227,9 +4735,6 @@ packages: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} - qr-creator@1.0.0: - resolution: {integrity: sha512-C0cqfbS1P5hfqN4NhsYsUXePlk9BO+a45bAQ3xLYjBL3bOIFzoVEjs79Fado9u9BPBD3buHi3+vY+C8tHh4qMQ==} - query-registry@3.0.1: resolution: {integrity: sha512-M9RxRITi2mHMVPU5zysNjctUT8bAPx6ltEXo/ir9+qmiM47Y7f0Ir3+OxUO5OjYAWdicBQRew7RtHtqUXydqlg==} engines: {node: '>=20'} @@ -5382,9 +4887,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -5511,10 +5013,6 @@ packages: simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} - sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -5655,9 +5153,6 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinyexec@0.2.0: - resolution: {integrity: sha512-au8dwv4xKSDR+Fw52csDo3wcDztPdne2oM1o/7LFro4h6bdFmvyUAeAfX40pwDtzHgRFqz1XWaUqgKS2G83/ig==} - tinyexec@0.3.1: resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} @@ -5665,10 +5160,6 @@ packages: resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} engines: {node: '>=12.0.0'} - tinyglobby@0.2.5: - resolution: {integrity: sha512-Dlqgt6h0QkoHttG53/WGADNh9QhcjCAIZMTERAVhdpmIBEejSuLI9ZmGKWzB7tweBjlk30+s/ofi4SLmBeTYhw==} - engines: {node: '>=12.0.0'} - tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -5685,10 +5176,6 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} - tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -5716,11 +5203,6 @@ packages: engines: {node: '>=12'} hasBin: true - tsx@4.16.2: - resolution: {integrity: sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==} - engines: {node: '>=18.0.0'} - hasBin: true - tunnel@0.0.6: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} @@ -5783,9 +5265,6 @@ packages: ultramatter@0.0.4: resolution: {integrity: sha512-1f/hO3mR+/Hgue4eInOF/Qm/wzDqwhYha4DxM0hre9YIUyso3fE2XtrAU6B4njLqTC8CM49EZaYgsVSa+dXHGw==} - unconfig@0.5.5: - resolution: {integrity: sha512-VQZ5PT9HDX+qag0XdgQi8tJepPhXiR/yVOkn707gJDKo31lGjRilPREiQJ9Z6zd/Ugpv6ZvO5VxVIcatldYcNQ==} - undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -5847,18 +5326,6 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - unocss@0.62.3: - resolution: {integrity: sha512-CLS6+JIlBobe/iPTz07pehyGDP8VqGJsiE+ZZ3Xkgib3hw76nCqAQF/4mJ8jVoV4C8KvGyVxmHaSSCFOkWmmZg==} - engines: {node: '>=14'} - peerDependencies: - '@unocss/webpack': 0.62.3 - vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 - peerDependenciesMeta: - '@unocss/webpack': - optional: true - vite: - optional: true - unplugin@1.0.1: resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} @@ -6215,10 +5682,10 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@antfu/install-pkg@0.4.0': + '@antfu/install-pkg@0.4.1': dependencies: - package-manager-detector: 0.1.2 - tinyexec: 0.2.0 + package-manager-detector: 0.2.0 + tinyexec: 0.3.1 '@antfu/utils@0.7.10': {} @@ -6602,26 +6069,6 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.24.8 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.26.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/traverse': 7.25.9 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-member-expression-to-functions@7.24.8': - dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-imports@7.25.9': dependencies: '@babel/traverse': 7.25.9 @@ -6648,21 +6095,8 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.24.7': - dependencies: - '@babel/types': 7.26.0 - '@babel/helper-plugin-utils@7.25.9': {} - '@babel/helper-replace-supers@7.25.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-member-expression-to-functions': 7.24.8 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/traverse': 7.25.9 - transitivePeerDependencies: - - supports-color - '@babel/helper-simple-access@7.25.7': dependencies: '@babel/traverse': 7.25.9 @@ -6670,13 +6104,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': - dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-string-parser@7.25.9': {} '@babel/helper-validator-identifier@7.25.9': {} @@ -6713,20 +6140,6 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-simple-access': 7.25.7 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6748,28 +6161,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - '@babel/preset-typescript@7.24.7(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.26.0) - '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - '@babel/runtime@7.25.0': dependencies: regenerator-runtime: 0.14.1 @@ -7057,150 +6448,78 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.23.0': - optional: true - '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.23.0': - optional: true - '@esbuild/android-arm@0.15.18': optional: true '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.23.0': - optional: true - '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.23.0': - optional: true - '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.23.0': - optional: true - '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.23.0': - optional: true - '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.23.0': - optional: true - '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.23.0': - optional: true - '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.23.0': - optional: true - '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.23.0': - optional: true - '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.23.0': - optional: true - '@esbuild/linux-loong64@0.15.18': optional: true '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.23.0': - optional: true - '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.23.0': - optional: true - '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.23.0': - optional: true - '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.23.0': - optional: true - '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.23.0': - optional: true - '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.23.0': - optional: true - '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.23.0': - optional: true - - '@esbuild/openbsd-arm64@0.23.0': - optional: true - '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.23.0': - optional: true - '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.23.0': - optional: true - '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.23.0': - optional: true - '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.23.0': - optional: true - '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.23.0': - optional: true - '@expressive-code/core@0.38.3': dependencies: '@ctrl/tinycolor': 4.1.0 @@ -7228,29 +6547,22 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@floating-ui/core@1.6.5': - dependencies: - '@floating-ui/utils': 0.2.5 + '@fontsource-variable/onest@5.1.0': {} - '@floating-ui/dom@1.6.8': + '@iconify-json/heroicons@1.2.1': dependencies: - '@floating-ui/core': 1.6.5 - '@floating-ui/utils': 0.2.5 - - '@floating-ui/utils@0.2.5': {} - - '@fontsource-variable/onest@5.1.0': {} + '@iconify/types': 2.0.0 '@iconify/types@2.0.0': {} - '@iconify/utils@2.1.32': + '@iconify/utils@2.1.33': dependencies: - '@antfu/install-pkg': 0.4.0 + '@antfu/install-pkg': 0.4.1 '@antfu/utils': 0.7.10 '@iconify/types': 2.0.0 debug: 4.3.7 kolorist: 1.8.0 - local-pkg: 0.5.0 + local-pkg: 0.5.1 mlly: 1.7.1 transitivePeerDependencies: - supports-color @@ -7433,16 +6745,6 @@ snapshots: '@libsql/win32-x64-msvc@0.4.6': optional: true - '@lit-labs/ssr-dom-shim@1.2.0': {} - - '@lit/react@1.0.5(@types/react@18.3.5)': - dependencies: - '@types/react': 18.3.5 - - '@lit/reactive-element@2.0.4': - dependencies: - '@lit-labs/ssr-dom-shim': 1.2.0 - '@lorenzo_lewis/starlight-utils@0.2.0(@astrojs/starlight@0.29.2(astro@4.16.14(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3)))(astro@4.16.14(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3))': dependencies: '@astrojs/starlight': 0.29.2(astro@4.16.14(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3)) @@ -7490,16 +6792,6 @@ snapshots: dependencies: astro: 4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3) - '@matthiesenxyz/astrolace@0.3.2(@types/react@18.3.5)(astro@4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3))': - dependencies: - '@shoelace-style/shoelace': 2.16.0(@types/react@18.3.5) - astro: 4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3) - astro-integration-kit: 0.16.1(astro@4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3)) - lit: 3.1.4 - zod: 3.23.8 - transitivePeerDependencies: - - '@types/react' - '@matthiesenxyz/integration-utils@0.2.0(astro@4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3))': dependencies: astro: 4.16.13(@types/node@22.0.0)(rollup@4.21.0)(typescript@5.6.3) @@ -7507,16 +6799,6 @@ snapshots: package-json: 10.0.1 semver: 7.6.3 - '@matthiesenxyz/unocss-preset-daisyui@0.1.2(daisyui@4.12.10(postcss@8.4.47))(unocss@0.62.3(postcss@8.4.47)(rollup@4.21.0)(vite@5.4.11(@types/node@22.0.0)))': - dependencies: - autoprefixer: 10.4.20(postcss@8.4.47) - camelcase: 8.0.0 - daisyui: 4.12.10(postcss@8.4.47) - parsel-js: 1.1.2 - postcss: 8.4.47 - postcss-js: 4.0.1(postcss@8.4.47) - unocss: 0.62.3(postcss@8.4.47)(rollup@4.21.0)(vite@5.4.11(@types/node@22.0.0)) - '@mdx-js/mdx@3.0.1': dependencies: '@types/estree': 1.0.5 @@ -8006,8 +7288,6 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@polka/url@1.0.0-next.25': {} - '@prisma/instrumentation@5.19.1': dependencies: '@opentelemetry/api': 1.9.0 @@ -8336,23 +7616,6 @@ snapshots: '@shikijs/vscode-textmate@9.3.0': {} - '@shoelace-style/animations@1.1.0': {} - - '@shoelace-style/localize@3.2.1': {} - - '@shoelace-style/shoelace@2.16.0(@types/react@18.3.5)': - dependencies: - '@ctrl/tinycolor': 4.1.0 - '@floating-ui/dom': 1.6.8 - '@lit/react': 1.0.5(@types/react@18.3.5) - '@shoelace-style/animations': 1.1.0 - '@shoelace-style/localize': 3.2.1 - composed-offset-position: 0.0.4 - lit: 3.1.4 - qr-creator: 1.0.0 - transitivePeerDependencies: - - '@types/react' - '@sindresorhus/merge-streams@4.0.0': {} '@tweenjs/tween.js@23.1.3': {} @@ -8511,8 +7774,6 @@ snapshots: fflate: 0.8.2 meshoptimizer: 0.18.1 - '@types/trusted-types@2.0.7': {} - '@types/turndown@5.0.5': {} '@types/unist@2.0.10': {} @@ -8534,166 +7795,6 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@unocss/astro@0.62.3(rollup@4.21.0)(vite@5.4.11(@types/node@22.0.0))': - dependencies: - '@unocss/core': 0.62.3 - '@unocss/reset': 0.62.3 - '@unocss/vite': 0.62.3(rollup@4.21.0)(vite@5.4.11(@types/node@22.0.0)) - optionalDependencies: - vite: 5.4.11(@types/node@22.0.0) - transitivePeerDependencies: - - rollup - - supports-color - - '@unocss/cli@0.62.3(rollup@4.21.0)': - dependencies: - '@ampproject/remapping': 2.3.0 - '@rollup/pluginutils': 5.1.3(rollup@4.21.0) - '@unocss/config': 0.62.3 - '@unocss/core': 0.62.3 - '@unocss/preset-uno': 0.62.3 - cac: 6.7.14 - chokidar: 3.6.0 - colorette: 2.0.20 - consola: 3.2.3 - magic-string: 0.30.12 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - tinyglobby: 0.2.5 - transitivePeerDependencies: - - rollup - - supports-color - - '@unocss/config@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - unconfig: 0.5.5 - transitivePeerDependencies: - - supports-color - - '@unocss/core@0.62.3': {} - - '@unocss/extractor-arbitrary-variants@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - - '@unocss/inspector@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - '@unocss/rule-utils': 0.62.3 - gzip-size: 6.0.0 - sirv: 2.0.4 - - '@unocss/postcss@0.62.3(postcss@8.4.47)': - dependencies: - '@unocss/config': 0.62.3 - '@unocss/core': 0.62.3 - '@unocss/rule-utils': 0.62.3 - css-tree: 2.3.1 - magic-string: 0.30.12 - postcss: 8.4.47 - tinyglobby: 0.2.5 - transitivePeerDependencies: - - supports-color - - '@unocss/preset-attributify@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - - '@unocss/preset-icons@0.62.3': - dependencies: - '@iconify/utils': 2.1.32 - '@unocss/core': 0.62.3 - ofetch: 1.3.4 - transitivePeerDependencies: - - supports-color - - '@unocss/preset-mini@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - '@unocss/extractor-arbitrary-variants': 0.62.3 - '@unocss/rule-utils': 0.62.3 - - '@unocss/preset-tagify@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - - '@unocss/preset-typography@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - '@unocss/preset-mini': 0.62.3 - - '@unocss/preset-uno@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - '@unocss/preset-mini': 0.62.3 - '@unocss/preset-wind': 0.62.3 - '@unocss/rule-utils': 0.62.3 - - '@unocss/preset-web-fonts@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - ofetch: 1.3.4 - - '@unocss/preset-wind@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - '@unocss/preset-mini': 0.62.3 - '@unocss/rule-utils': 0.62.3 - - '@unocss/reset@0.62.3': {} - - '@unocss/rule-utils@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - magic-string: 0.30.12 - - '@unocss/scope@0.62.3': {} - - '@unocss/transformer-attributify-jsx-babel@0.62.3': - dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/preset-typescript': 7.24.7(@babel/core@7.26.0) - '@unocss/core': 0.62.3 - transitivePeerDependencies: - - supports-color - - '@unocss/transformer-attributify-jsx@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - - '@unocss/transformer-compile-class@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - - '@unocss/transformer-directives@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - '@unocss/rule-utils': 0.62.3 - css-tree: 2.3.1 - - '@unocss/transformer-variant-group@0.62.3': - dependencies: - '@unocss/core': 0.62.3 - - '@unocss/vite@0.62.3(rollup@4.21.0)(vite@5.4.11(@types/node@22.0.0))': - dependencies: - '@ampproject/remapping': 2.3.0 - '@rollup/pluginutils': 5.1.3(rollup@4.21.0) - '@unocss/config': 0.62.3 - '@unocss/core': 0.62.3 - '@unocss/inspector': 0.62.3 - '@unocss/scope': 0.62.3 - '@unocss/transformer-directives': 0.62.3 - chokidar: 3.6.0 - magic-string: 0.30.12 - tinyglobby: 0.2.5 - vite: 5.4.11(@types/node@22.0.0) - transitivePeerDependencies: - - rollup - - supports-color - '@vitejs/plugin-react@4.3.3(vite@5.4.11(@types/node@22.0.0))': dependencies: '@babel/core': 7.26.0 @@ -9207,16 +8308,6 @@ snapshots: async-listen@3.0.1: {} - autoprefixer@10.4.20(postcss@8.4.47): - dependencies: - browserslist: 4.24.0 - caniuse-lite: 1.0.30001667 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.1.0 - postcss: 8.4.47 - postcss-value-parser: 4.2.0 - axobject-query@4.1.0: {} bail@2.0.2: {} @@ -9280,19 +8371,10 @@ snapshots: dependencies: run-applescript: 7.0.0 - bundle-require@5.0.0(esbuild@0.23.0): - dependencies: - esbuild: 0.23.0 - load-tsconfig: 0.2.5 - - cac@6.7.14: {} - call-me-maybe@1.0.2: {} callsites@4.2.0: {} - camelcase-css@2.0.1: {} - camelcase@8.0.0: {} caniuse-lite@1.0.30001667: {} @@ -9404,18 +8486,16 @@ snapshots: colorette@1.4.0: {} - colorette@2.0.20: {} - comma-separated-tokens@2.0.3: {} common-ancestor-path@1.0.1: {} - composed-offset-position@0.0.4: {} - concat-map@0.0.1: {} confbox@0.1.7: {} + confbox@0.1.8: {} + config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -9451,16 +8531,6 @@ snapshots: css-selector-parser@3.0.5: {} - css-selector-tokenizer@0.8.0: - dependencies: - cssesc: 3.0.0 - fastparse: 1.1.2 - - css-tree@2.3.1: - dependencies: - mdn-data: 2.0.30 - source-map-js: 1.2.1 - css-what@6.1.0: {} cssesc@3.0.0: {} @@ -9469,17 +8539,6 @@ snapshots: csstype@3.1.3: {} - culori@3.3.0: {} - - daisyui@4.12.10(postcss@8.4.47): - dependencies: - css-selector-tokenizer: 0.8.0 - culori: 3.3.0 - picocolors: 1.1.0 - postcss-js: 4.0.1(postcss@8.4.47) - transitivePeerDependencies: - - postcss - data-uri-to-buffer@4.0.1: {} dataloader@1.4.0: {} @@ -9511,16 +8570,12 @@ snapshots: define-lazy-prop@3.0.0: {} - defu@6.1.4: {} - depd@2.0.0: {} deprecation@2.3.1: {} dequal@2.0.3: {} - destr@2.0.3: {} - destroy@1.2.0: {} detect-indent@6.1.0: {} @@ -9582,8 +8637,6 @@ snapshots: dset@3.1.4: {} - duplexer@0.1.2: {} - ee-first@1.1.1: {} electron-to-chromium@1.5.33: {} @@ -9726,33 +8779,6 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.23.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.23.0 - '@esbuild/android-arm': 0.23.0 - '@esbuild/android-arm64': 0.23.0 - '@esbuild/android-x64': 0.23.0 - '@esbuild/darwin-arm64': 0.23.0 - '@esbuild/darwin-x64': 0.23.0 - '@esbuild/freebsd-arm64': 0.23.0 - '@esbuild/freebsd-x64': 0.23.0 - '@esbuild/linux-arm': 0.23.0 - '@esbuild/linux-arm64': 0.23.0 - '@esbuild/linux-ia32': 0.23.0 - '@esbuild/linux-loong64': 0.23.0 - '@esbuild/linux-mips64el': 0.23.0 - '@esbuild/linux-ppc64': 0.23.0 - '@esbuild/linux-riscv64': 0.23.0 - '@esbuild/linux-s390x': 0.23.0 - '@esbuild/linux-x64': 0.23.0 - '@esbuild/netbsd-x64': 0.23.0 - '@esbuild/openbsd-arm64': 0.23.0 - '@esbuild/openbsd-x64': 0.23.0 - '@esbuild/sunos-x64': 0.23.0 - '@esbuild/win32-arm64': 0.23.0 - '@esbuild/win32-ia32': 0.23.0 - '@esbuild/win32-x64': 0.23.0 - escalade@3.1.2: {} escape-html@1.0.3: {} @@ -9814,7 +8840,7 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.1 - expressive-code-twoslash@0.2.6(@expressive-code/core@0.38.3)(typescript@5.6.3): + expressive-code-twoslash@0.3.0(@expressive-code/core@0.38.3)(expressive-code@0.38.3)(typescript@5.6.3): dependencies: '@expressive-code/core': 0.38.3 expressive-code: 0.38.3 @@ -9863,16 +8889,10 @@ snapshots: dependencies: strnum: 1.0.5 - fastparse@1.1.2: {} - fastq@1.17.1: dependencies: reusify: 1.0.4 - fdir@6.3.0(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - fdir@6.4.2(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -9925,8 +8945,6 @@ snapshots: dependencies: fetch-blob: 3.2.0 - fraction.js@4.3.7: {} - fresh@0.5.2: {} fs-extra@7.0.1: @@ -9959,10 +8977,6 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 - get-tsconfig@4.7.6: - dependencies: - resolve-pkg-maps: 1.0.0 - github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -10018,10 +9032,6 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 - gzip-size@6.0.0: - dependencies: - duplexer: 0.1.2 - has-flag@3.0.0: {} hasown@2.0.2: @@ -10281,19 +9291,6 @@ snapshots: import-meta-resolve@4.1.0: {} - importx@0.4.3: - dependencies: - bundle-require: 5.0.0(esbuild@0.23.0) - debug: 4.3.7 - esbuild: 0.23.0 - jiti: 2.0.0-beta.2 - jiti-v1: jiti@1.21.6 - pathe: 1.1.2 - pkg-types: 1.1.3 - tsx: 4.16.2 - transitivePeerDependencies: - - supports-color - inflight@1.0.6: dependencies: once: 1.4.0 @@ -10380,10 +9377,6 @@ snapshots: isexe@2.0.0: {} - jiti@1.21.6: {} - - jiti@2.0.0-beta.2: {} - jiti@2.3.3: {} js-base64@3.7.7: {} @@ -10454,26 +9447,8 @@ snapshots: dependencies: uc.micro: 2.1.0 - lit-element@4.0.6: - dependencies: - '@lit-labs/ssr-dom-shim': 1.2.0 - '@lit/reactive-element': 2.0.4 - lit-html: 3.1.4 - - lit-html@3.1.4: - dependencies: - '@types/trusted-types': 2.0.7 - - lit@3.1.4: - dependencies: - '@lit/reactive-element': 2.0.4 - lit-element: 4.0.6 - lit-html: 3.1.4 - lite-youtube-embed@0.3.3: {} - load-tsconfig@0.2.5: {} - load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 @@ -10481,10 +9456,10 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - local-pkg@0.5.0: + local-pkg@0.5.1: dependencies: - mlly: 1.7.1 - pkg-types: 1.1.3 + mlly: 1.7.3 + pkg-types: 1.2.1 locate-path@5.0.0: dependencies: @@ -10778,8 +9753,6 @@ snapshots: dependencies: '@types/mdast': 4.0.4 - mdn-data@2.0.30: {} - mdurl@2.0.0: {} merge2@1.4.1: {} @@ -11094,6 +10067,13 @@ snapshots: pkg-types: 1.1.3 ufo: 1.5.4 + mlly@1.7.3: + dependencies: + acorn: 8.14.0 + pathe: 1.1.2 + pkg-types: 1.2.1 + ufo: 1.5.4 + module-details-from-path@1.0.3: {} mri@1.2.0: {} @@ -11118,8 +10098,6 @@ snapshots: node-domexception@1.0.0: {} - node-fetch-native@1.6.4: {} - node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -11134,8 +10112,6 @@ snapshots: normalize-path@3.0.0: {} - normalize-range@0.1.2: {} - npm-run-path@6.0.0: dependencies: path-key: 4.0.0 @@ -11145,12 +10121,6 @@ snapshots: dependencies: boolbase: 1.0.0 - ofetch@1.3.4: - dependencies: - destr: 2.0.3 - node-fetch-native: 1.6.4 - ufo: 1.5.4 - on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -11261,8 +10231,6 @@ snapshots: registry-url: 6.0.1 semver: 7.6.3 - package-manager-detector@0.1.2: {} - package-manager-detector@0.2.0: {} pagefind@1.1.0: @@ -11308,8 +10276,6 @@ snapshots: dependencies: entities: 4.5.0 - parsel-js@1.1.2: {} - path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -11333,8 +10299,6 @@ snapshots: pathe@1.1.2: {} - perfect-debounce@1.0.0: {} - periscopic@3.1.0: dependencies: '@types/estree': 1.0.5 @@ -11381,10 +10345,11 @@ snapshots: mlly: 1.7.1 pathe: 1.1.2 - postcss-js@4.0.1(postcss@8.4.47): + pkg-types@1.2.1: dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.47 + confbox: 0.1.8 + mlly: 1.7.3 + pathe: 1.1.2 postcss-nested@6.2.0(postcss@8.4.47): dependencies: @@ -11396,8 +10361,6 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-value-parser@4.2.0: {} - postcss@8.4.47: dependencies: nanoid: 3.3.7 @@ -11450,8 +10413,6 @@ snapshots: punycode.js@2.3.1: {} - qr-creator@1.0.0: {} - query-registry@3.0.1: dependencies: query-string: 9.1.1 @@ -11692,8 +10653,6 @@ snapshots: resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: {} - resolve@1.22.8: dependencies: is-core-module: 2.15.0 @@ -11896,12 +10855,6 @@ snapshots: dependencies: is-arrayish: 0.3.2 - sirv@2.0.4: - dependencies: - '@polka/url': 1.0.0-next.25 - mrmime: 2.0.0 - totalist: 3.0.1 - sisteransi@1.0.5: {} sitemap@7.1.2: @@ -12015,8 +10968,6 @@ snapshots: tiny-invariant@1.3.3: {} - tinyexec@0.2.0: {} - tinyexec@0.3.1: {} tinyglobby@0.2.10: @@ -12024,11 +10975,6 @@ snapshots: fdir: 6.4.2(picomatch@4.0.2) picomatch: 4.0.2 - tinyglobby@0.2.5: - dependencies: - fdir: 6.3.0(picomatch@4.0.2) - picomatch: 4.0.2 - tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -12041,8 +10987,6 @@ snapshots: toidentifier@1.0.1: {} - totalist@3.0.1: {} - tr46@0.0.3: {} trim-lines@3.0.1: {} @@ -12059,13 +11003,6 @@ snapshots: dependencies: esbuild: 0.15.18 - tsx@4.16.2: - dependencies: - esbuild: 0.21.5 - get-tsconfig: 4.7.6 - optionalDependencies: - fsevents: 2.3.3 - tunnel@0.0.6: {} turndown@7.2.0: @@ -12117,14 +11054,6 @@ snapshots: ultramatter@0.0.4: {} - unconfig@0.5.5: - dependencies: - '@antfu/utils': 0.7.10 - defu: 6.1.4 - importx: 0.4.3 - transitivePeerDependencies: - - supports-color - undici-types@5.26.5: {} undici-types@6.11.1: {} @@ -12204,35 +11133,6 @@ snapshots: universalify@0.1.2: {} - unocss@0.62.3(postcss@8.4.47)(rollup@4.21.0)(vite@5.4.11(@types/node@22.0.0)): - dependencies: - '@unocss/astro': 0.62.3(rollup@4.21.0)(vite@5.4.11(@types/node@22.0.0)) - '@unocss/cli': 0.62.3(rollup@4.21.0) - '@unocss/core': 0.62.3 - '@unocss/extractor-arbitrary-variants': 0.62.3 - '@unocss/postcss': 0.62.3(postcss@8.4.47) - '@unocss/preset-attributify': 0.62.3 - '@unocss/preset-icons': 0.62.3 - '@unocss/preset-mini': 0.62.3 - '@unocss/preset-tagify': 0.62.3 - '@unocss/preset-typography': 0.62.3 - '@unocss/preset-uno': 0.62.3 - '@unocss/preset-web-fonts': 0.62.3 - '@unocss/preset-wind': 0.62.3 - '@unocss/reset': 0.62.3 - '@unocss/transformer-attributify-jsx': 0.62.3 - '@unocss/transformer-attributify-jsx-babel': 0.62.3 - '@unocss/transformer-compile-class': 0.62.3 - '@unocss/transformer-directives': 0.62.3 - '@unocss/transformer-variant-group': 0.62.3 - '@unocss/vite': 0.62.3(rollup@4.21.0)(vite@5.4.11(@types/node@22.0.0)) - optionalDependencies: - vite: 5.4.11(@types/node@22.0.0) - transitivePeerDependencies: - - postcss - - rollup - - supports-color - unplugin@1.0.1: dependencies: acorn: 8.12.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8c379f4b45..fe6e214edb 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -58,7 +58,7 @@ catalogs: rehype-external-links: ^3.0.0 "@types/html-escaper": ^3.0.2 html-escaper: ^3.0.3 - expressive-code-twoslash: ^0.2.6 + expressive-code-twoslash: ^0.3.0 "@shikijs/colorized-brackets": ^1.23.1 starlight-package-managers: ^0.8.0 @@ -99,14 +99,6 @@ catalogs: "@matthiesenxyz/integration-utils": ^0.2.0 rollup-plugin-copy: ^3.5.0 - # Needs to be cleaned up once they are no longer needed - "@matthiesenxyz/astrolace": ^0.3.2 - '@matthiesenxyz/unocss-preset-daisyui': ^0.1.2 - '@unocss/astro': ^0.62.3 - '@unocss/reset': ^0.62.3 - unocss: ^0.62.3 - daisyui: ^4.12.10 - studiocms-renderer: # Confirmed Current Renderer Deps - 11.01.2024 '@shikijs/transformers': ^1.14.1 "@mdx-js/mdx": ^3.0.1 diff --git a/www/docs/ec.config.mjs b/www/docs/ec.config.mjs index 74fc964ab4..bb02c7ba39 100644 --- a/www/docs/ec.config.mjs +++ b/www/docs/ec.config.mjs @@ -24,7 +24,9 @@ export default defineEcConfig({ }), ], styleOverrides: { - // @ts-expect-error - This is not a Standard EC config option, but it's a valid one from a plugin + frames: { + editorActiveTabIndicatorBottomColor: 'var(--sl-color-accent)', + }, twoSlash: { cursorColor: '#f8f8f2', }, diff --git a/www/docs/src/styles/starlight.css b/www/docs/src/styles/starlight.css index 2e424e718c..919e3a3cb4 100644 --- a/www/docs/src/styles/starlight.css +++ b/www/docs/src/styles/starlight.css @@ -77,9 +77,11 @@ border-radius: 8px; } -code, +div.expressive-code, starlight-file-tree { - border-radius: 4px; + border-radius: 8px; + overflow: hidden; + border: 1px solid var(--ec-brdCol); } aside.starlight-aside { @@ -195,3 +197,10 @@ button[aria-label="Menu"][aria-controls="starlight__sidebar"] { a { text-decoration: none; } + +.expressive-code figcaption, +.expressive-code figcaption::before, +.expressive-code pre, +.expressive-code span.title { + border: none !important; +} diff --git a/www/docs/typedoc.config.ts b/www/docs/typedoc.config.ts index 6f4637a496..53550dc289 100644 --- a/www/docs/typedoc.config.ts +++ b/www/docs/typedoc.config.ts @@ -97,7 +97,6 @@ const TypeDocPlugins = (isProd: boolean, testingMode: boolean): StarlightPlugin[ getFilePathToPackage('studiocms_core', 'src/schemas/config/markdoc.ts'), getFilePathToPackage('studiocms_core', 'src/schemas/config/marked.ts'), getFilePathToPackage('studiocms_core', 'src/schemas/config/rendererConfig.ts'), - getFilePathToPackage('studiocms_core', 'src/schemas/config/unocss.ts'), getFilePathToPackage('studiocms_core', 'src/lib/index.ts'), getFilePathToPackage('studiocms_core', 'src/lib/configManager.ts'), getFilePathToPackage('studiocms_core', 'src/lib/convertDashboardLinksType.ts'), From 7b08d7fcde2d772470fbfbcc831920305a7dbf8b Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Sat, 30 Nov 2024 02:59:05 -0800 Subject: [PATCH 002/539] Refactor StudioCMS integration and plugin setup --- packages/studiocms/src/integration.ts | 43 +++++++++++++++-- packages/studiocms/src/stubs.ts | 20 ++++++++ packages/studiocms/src/types.ts | 3 ++ packages/studiocms/tsconfig.json | 47 +------------------ packages/studiocms_core/src/consts.ts | 8 ++-- packages/studiocms_core/src/schemas/index.ts | 1 + .../src/schemas/plugins/index.ts | 4 +- .../src/utils/configResolver.ts | 2 +- 8 files changed, 73 insertions(+), 55 deletions(-) create mode 100644 packages/studiocms/src/stubs.ts create mode 100644 packages/studiocms/src/types.ts diff --git a/packages/studiocms/src/integration.ts b/packages/studiocms/src/integration.ts index d612617e32..e36cb1431d 100644 --- a/packages/studiocms/src/integration.ts +++ b/packages/studiocms/src/integration.ts @@ -7,7 +7,9 @@ import studioCMSAuth from '@studiocms/auth'; import studioCMSCore from '@studiocms/core'; import { getStudioConfigFileUrl, studioCMSPluginList } from '@studiocms/core/lib'; import { + type SafePluginListType, type StudioCMSOptions, + type StudioCMSPluginOptions, StudioCMSOptionsSchema as optionsSchema, } from '@studiocms/core/schemas'; import { CoreStrings, robotsTXTPreset } from '@studiocms/core/strings'; @@ -21,8 +23,9 @@ import studioCMSFrontend from '@studiocms/frontend'; import studioCMSImageHandler from '@studiocms/imagehandler'; import studioCMSRenderers from '@studiocms/renderers'; import studioCMSRobotsTXT from '@studiocms/robotstxt'; -import { defineIntegration } from 'astro-integration-kit'; +import { addIntegration, addVirtualImports, defineIntegration } from 'astro-integration-kit'; import { name, version } from '../package.json'; +import { generateStubs } from './stubs'; import { updateCheck } from './updateCheck'; // Main Integration @@ -68,7 +71,10 @@ export default defineIntegration({ } = ResolvedOptions; // Setup Logger - integrationLogger({ logger, logLevel: 'info', verbose }, CoreStrings.Start); + integrationLogger( + { logger, logLevel: 'info', verbose: verbose || false }, + CoreStrings.Start + ); // Check Astro Config for required settings checkAstroConfig(params); @@ -111,14 +117,43 @@ export default defineIntegration({ // Setup Integrations (External / Optional) addIntegrationArrayWithCheck(params, [ { - enabled: includedIntegrations.useAstroRobots, + enabled: includedIntegrations?.useAstroRobots || false, knownSimilar: ['astro-robots', 'astro-robots-txt'], integration: studioCMSRobotsTXT({ ...robotsTXTPreset, - ...includedIntegrations.astroRobotsConfig, + ...includedIntegrations?.astroRobotsConfig, }), }, ]); + + // Setup StudioCMS Plugins + const StudioCMSPluginList: StudioCMSPluginOptions[] = []; + + for (const plugin of options.plugins) { + if (plugin.integration && Array.isArray(plugin.integration)) { + addIntegrationArray( + params, + plugin.integration.map((i) => ({ integration: i })) + ); + } else if (plugin.integration) { + addIntegration(params, { integration: plugin.integration }); + } + StudioCMSPluginList.push(plugin); + } + + const SafePluginList: SafePluginListType = StudioCMSPluginList.map( + ({ name, label, pageType, settingsPage }) => ({ name, label, pageType, settingsPage }) + ); + + addVirtualImports(params, { + name, + imports: { + 'studiocms:plugins': `export default = ${JSON.stringify(SafePluginList)};`, + }, + }); + }, + 'astro:config:done': ({ injectTypes }) => { + injectTypes(generateStubs()); }, 'astro:server:start': async (params) => { // Check for Updates on Development Server Start diff --git a/packages/studiocms/src/stubs.ts b/packages/studiocms/src/stubs.ts new file mode 100644 index 0000000000..42320b0db5 --- /dev/null +++ b/packages/studiocms/src/stubs.ts @@ -0,0 +1,20 @@ +import astroDTSBuilder from '@matthiesenxyz/astrodtsbuilder'; +import { createResolver } from 'astro-integration-kit'; + +const { resolve } = createResolver(import.meta.url); + +export function generateStubs() { + const DTSFile = astroDTSBuilder(); + + DTSFile.addSingleLineNote( + '// This file is auto-generated by StudioCMS and should not be modified.' + ); + + DTSFile.addModule('studiocms:plugins', { + defaultExport: { + typeDef: `import('${resolve('./types')}').SafePluginListType`, + }, + }); + + return DTSFile.makeAstroInjectedType('plugins.d.ts'); +} diff --git a/packages/studiocms/src/types.ts b/packages/studiocms/src/types.ts new file mode 100644 index 0000000000..7a849e826a --- /dev/null +++ b/packages/studiocms/src/types.ts @@ -0,0 +1,3 @@ +import type { StudioCMSPluginOptions } from '@studiocms/core/schemas'; + +export type SafePluginListType = Omit[]; diff --git a/packages/studiocms/tsconfig.json b/packages/studiocms/tsconfig.json index 73fb2bc445..675a6194b4 100644 --- a/packages/studiocms/tsconfig.json +++ b/packages/studiocms/tsconfig.json @@ -1,40 +1,13 @@ { "extends": "astro/tsconfigs/strictest", - "files": [], "compilerOptions": { "outDir": "../../.moon/cache/types/packages/studiocms", "composite": true, "noEmit": false, "allowImportingTsExtensions": false, - "emitDeclarationOnly": false, - "paths": { - "node-playground/*": ["../../playgrounds/node/src/*"], - "@studiocms/assets": ["../studiocms_assets/src/index.ts"], - "@studiocms/assets/*": ["../studiocms_assets/src/*"], - "@studiocms/auth": ["../studiocms_auth/src/index.ts"], - "@studiocms/auth/*": ["../studiocms_auth/src/*"], - "@studiocms/betaresources": ["../studiocms_betaresources/src/index.ts"], - "@studiocms/betaresources/*": ["../studiocms_betaresources/src/*"], - "@studiocms/blog": ["../studiocms_blog/index.ts"], - "@studiocms/blog/*": ["../studiocms_blog/src/*"], - "@studiocms/core": ["../studiocms_core/src/index.ts"], - "@studiocms/core/*": ["../studiocms_core/src/*"], - "@studiocms/dashboard": ["../studiocms_dashboard/src/index.ts"], - "@studiocms/dashboard/*": ["../studiocms_dashboard/src/*"], - "@studiocms/frontend": ["../studiocms_frontend/src/index.ts"], - "@studiocms/frontend/*": ["../studiocms_frontend/src/*"], - "@studiocms/imagehandler": ["../studiocms_imagehandler/src/index.ts"], - "@studiocms/imagehandler/*": ["../studiocms_imagehandler/src/*"], - "@studiocms/renderers": ["../studiocms_renderers/src/index.ts"], - "@studiocms/renderers/*": ["../studiocms_renderers/src/*"], - "@studiocms/robotstxt": ["../studiocms_robotstxt/src/index.ts"], - "@studiocms/robotstxt/*": ["../studiocms_robotstxt/src/*"] - } + "emitDeclarationOnly": false }, "references": [ - { - "path": "../../playgrounds/node" - }, { "path": "../studiocms_assets" }, @@ -66,21 +39,5 @@ "path": "../studiocms_robotstxt" } ], - "include": [ - "./package.json", - "../../playgrounds/node/**/*", - "../../playgrounds/node/.astro/**/*", - "../studiocms_assets/**/*", - "../studiocms_auth/**/*", - "../studiocms_betaresources/**/*", - "../studiocms_blog/**/*", - "../studiocms_core/**/*", - "../studiocms_dashboard/**/*", - "../studiocms_frontend/**/*", - "../studiocms_imagehandler/**/*", - "../studiocms_renderers/**/*", - "../studiocms_robotstxt/**/*", - "./**/*", - "./src/**/*.json" - ] + "include": ["./package.json", "../../playgrounds/node/.astro/**/*", "./**/*", "./src/**/*.json"] } diff --git a/packages/studiocms_core/src/consts.ts b/packages/studiocms_core/src/consts.ts index a101dd4f0d..28a58a92b4 100644 --- a/packages/studiocms_core/src/consts.ts +++ b/packages/studiocms_core/src/consts.ts @@ -23,8 +23,8 @@ export type StudioCMSSocials = { * StudioCMS Social Links */ export const studioCMSSocials: StudioCMSSocials = { - github: 'https://github.com/astrolicious/studiocms', - githubLicense: 'https://github.com/astrolicious/studiocms?tab=MIT-1-ov-file#readme', - githubContributors: 'https://github.com/astrolicious/studiocms/graphs/contributors', - discord: 'https://chat.astrolicious.dev', + github: 'https://github.com/withstudiocms/studiocms', + githubLicense: 'https://github.com/withstudiocms/studiocms?tab=MIT-1-ov-file#readme', + githubContributors: 'https://github.com/withstudiocms/studiocms/graphs/contributors', + discord: 'https://chat.studiocms.dev', }; diff --git a/packages/studiocms_core/src/schemas/index.ts b/packages/studiocms_core/src/schemas/index.ts index f03c2281a9..83e4f88af4 100644 --- a/packages/studiocms_core/src/schemas/index.ts +++ b/packages/studiocms_core/src/schemas/index.ts @@ -1 +1,2 @@ export * from './config'; +export * from './plugins'; diff --git a/packages/studiocms_core/src/schemas/plugins/index.ts b/packages/studiocms_core/src/schemas/plugins/index.ts index 68e57f72e2..3d138518f6 100644 --- a/packages/studiocms_core/src/schemas/plugins/index.ts +++ b/packages/studiocms_core/src/schemas/plugins/index.ts @@ -134,5 +134,7 @@ export const StudioCMSPluginSchema = z.object({ integration: z.array(z.custom()).or(z.custom()), }); -export type StudioCMSPlugin = typeof StudioCMSPluginSchema._input; +export type StudioCMSPluginInput = typeof StudioCMSPluginSchema._input; export type StudioCMSPluginOptions = typeof StudioCMSPluginSchema._output; + +export type SafePluginListType = Omit[]; diff --git a/packages/studiocms_core/src/utils/configResolver.ts b/packages/studiocms_core/src/utils/configResolver.ts index 9b36ac542f..f4b8735ab7 100644 --- a/packages/studiocms_core/src/utils/configResolver.ts +++ b/packages/studiocms_core/src/utils/configResolver.ts @@ -37,7 +37,7 @@ export const configResolver = defineUtility('astro:config:setup')( // Log that the StudioCMS config file is being used if verbose integrationLogger( - { logger, logLevel: 'warn', verbose: resolvedOptions.verbose }, + { logger, logLevel: 'warn', verbose: resolvedOptions.verbose || false }, warnings.StudioCMSConfigPresent ); } From 5c97cc96e31da4fd6ff5295d14acc23f425feefb Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Sat, 30 Nov 2024 03:11:45 -0800 Subject: [PATCH 003/539] Refactor StudioCMS integration and plugin setup --- packages/studiocms/src/index.ts | 27 ++++++++++++++----- .../studiocms_core/src/lib/pluginSystem.ts | 1 + .../studiocms_core/src/types/pluginOptions.ts | 3 +++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/packages/studiocms/src/index.ts b/packages/studiocms/src/index.ts index c5a1f7079d..ce3b724b6e 100644 --- a/packages/studiocms/src/index.ts +++ b/packages/studiocms/src/index.ts @@ -1,5 +1,10 @@ import { defineStudioCMSConfig, defineStudioCMSPlugin } from '@studiocms/core/lib'; -import type { CustomRenderer, Renderer, StudioCMSOptions } from '@studiocms/core/schemas'; +import type { + CustomRenderer, + Renderer, + StudioCMSOptions, + StudioCMSPluginInput, +} from '@studiocms/core/schemas'; import type { StudioCMSPluginOptions } from '@studiocms/core/types'; import integration from './integration'; @@ -8,10 +13,8 @@ import integration from './integration'; * * A CMS built for Astro by the Astro Community for the Astro Community. * - * > **Note: Astro SSR adapters that are configured for Image Optimization will automatically take full control of the Image Optimization Service. Making the `imageService` option in this integration not have any effect.** - * - * @see [GitHub Repo: 'astrolicious/studiocms'](https://github.com/astrolicious/studiocms) for more information on how to contribute to StudioCMS. - * @see [StudioCMS Docs](https://docs.studiocms.xyz) for more information on how to use StudioCMS. + * @see [GitHub Repo: 'withstudiocms/studiocms'](https://github.com/withstudiocms/studiocms) for more information on how to contribute to StudioCMS. + * @see [StudioCMS Docs](https://docs.studiocms.dev) for more information on how to use StudioCMS. * */ export const studioCMS = integration; @@ -22,6 +25,18 @@ export default studioCMS; export { defineStudioCMSConfig, type StudioCMSOptions }; // Plugin System -export { defineStudioCMSPlugin, type StudioCMSPluginOptions }; export type { CustomRenderer, Renderer }; + +/** + * Defines a plugin for StudioCMS. + * + * @param options - The configuration options for the plugin. + * @returns The provided plugin options. + */ +export function definePlugin(options: StudioCMSPluginInput) { + return options; +} + +//// DEPRECATED: Use `definePlugin` instead +export { defineStudioCMSPlugin, type StudioCMSPluginOptions }; diff --git a/packages/studiocms_core/src/lib/pluginSystem.ts b/packages/studiocms_core/src/lib/pluginSystem.ts index 1af1692046..313bf00b61 100644 --- a/packages/studiocms_core/src/lib/pluginSystem.ts +++ b/packages/studiocms_core/src/lib/pluginSystem.ts @@ -10,6 +10,7 @@ import { convertDashboardLinksType } from './convertDashboardLinksType'; * @param options.opts.pluginLabel {string} - The Label for the Plugin * @param options.opts.navigationLinks Array<{ text: string, slug: string }> - The Navigation Links for the Plugin * @param options.opts.customRendererPluginPath { string } - The Custom Renderer Plugin Path - This is used to replace the built-in Markdown Renderer. Recommended for Advanced Users. + * @deprecated This function has been deprecated in favor of the `definePlugin` function. */ export function defineStudioCMSPlugin(options: StudioCMSPluginOptions) { // Extract the options diff --git a/packages/studiocms_core/src/types/pluginOptions.ts b/packages/studiocms_core/src/types/pluginOptions.ts index eedf1dbdc3..83cd205a5a 100644 --- a/packages/studiocms_core/src/types/pluginOptions.ts +++ b/packages/studiocms_core/src/types/pluginOptions.ts @@ -13,6 +13,9 @@ export type DashboardPageLink = { dropdownChildren?: DashboardPageLink[]; }; +/** + * @deprecated + */ export type StudioCMSPluginOptions = { /** * The package name of the plugin From 70aa136038f50b82591215f65d290a248d22b0d0 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Sat, 30 Nov 2024 03:14:16 -0800 Subject: [PATCH 004/539] Refactor StudioCMS integration and plugin setup: Update SafePluginListType in integration.ts and StudioCMSPluginSchema in plugins/index.ts --- packages/studiocms/src/integration.ts | 7 ++++++- packages/studiocms_core/src/schemas/plugins/index.ts | 6 +++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/studiocms/src/integration.ts b/packages/studiocms/src/integration.ts index e36cb1431d..597d7bd47d 100644 --- a/packages/studiocms/src/integration.ts +++ b/packages/studiocms/src/integration.ts @@ -142,7 +142,12 @@ export default defineIntegration({ } const SafePluginList: SafePluginListType = StudioCMSPluginList.map( - ({ name, label, pageType, settingsPage }) => ({ name, label, pageType, settingsPage }) + ({ name, identifier, pageType, settingsPage }) => ({ + name, + identifier, + pageType, + settingsPage, + }) ); addVirtualImports(params, { diff --git a/packages/studiocms_core/src/schemas/plugins/index.ts b/packages/studiocms_core/src/schemas/plugins/index.ts index 3d138518f6..d7fbdd432a 100644 --- a/packages/studiocms_core/src/schemas/plugins/index.ts +++ b/packages/studiocms_core/src/schemas/plugins/index.ts @@ -113,13 +113,13 @@ const StudioCMS_PageTypeSchema = z export const StudioCMSPluginSchema = z.object({ /** - * Name of the plugin from the package.json + * Identifier of the plugin from the package.json */ - name: z.string(), + identifier: z.string(), /** * Label of the plugin to be displayed in the StudioCMS Dashboard */ - label: z.string(), + name: z.string(), /** * If this exists, the plugin will have its own setting page */ From 42e4d9db1b10e426f818fbe2d8509b22750d8dfd Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Sat, 30 Nov 2024 03:24:38 -0800 Subject: [PATCH 005/539] Refactor StudioCMS integration and plugin setup: Remove deprecated code and update imports in integration.ts and index.ts --- packages/studiocms/src/index.ts | 12 +++--------- packages/studiocms/src/integration.ts | 10 ++++++---- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/studiocms/src/index.ts b/packages/studiocms/src/index.ts index ce3b724b6e..121a4bf14b 100644 --- a/packages/studiocms/src/index.ts +++ b/packages/studiocms/src/index.ts @@ -1,11 +1,10 @@ -import { defineStudioCMSConfig, defineStudioCMSPlugin } from '@studiocms/core/lib'; +import { defineStudioCMSConfig } from '@studiocms/core/lib'; import type { CustomRenderer, Renderer, StudioCMSOptions, StudioCMSPluginInput, } from '@studiocms/core/schemas'; -import type { StudioCMSPluginOptions } from '@studiocms/core/types'; import integration from './integration'; /** @@ -21,13 +20,11 @@ export const studioCMS = integration; export default studioCMS; -// Config Utility +// Config Utilities export { defineStudioCMSConfig, type StudioCMSOptions }; - -// Plugin System - export type { CustomRenderer, Renderer }; +// Plugin System /** * Defines a plugin for StudioCMS. * @@ -37,6 +34,3 @@ export type { CustomRenderer, Renderer }; export function definePlugin(options: StudioCMSPluginInput) { return options; } - -//// DEPRECATED: Use `definePlugin` instead -export { defineStudioCMSPlugin, type StudioCMSPluginOptions }; diff --git a/packages/studiocms/src/integration.ts b/packages/studiocms/src/integration.ts index 597d7bd47d..5b742a0703 100644 --- a/packages/studiocms/src/integration.ts +++ b/packages/studiocms/src/integration.ts @@ -5,7 +5,7 @@ import { } from '@matthiesenxyz/integration-utils/astroUtils'; import studioCMSAuth from '@studiocms/auth'; import studioCMSCore from '@studiocms/core'; -import { getStudioConfigFileUrl, studioCMSPluginList } from '@studiocms/core/lib'; +import { getStudioConfigFileUrl } from '@studiocms/core/lib'; import { type SafePluginListType, type StudioCMSOptions, @@ -33,9 +33,6 @@ export default defineIntegration({ name, optionsSchema, setup({ name, options }) { - // Register StudioCMS into the StudioCMS Plugin List - studioCMSPluginList.set(name, { name, label: 'StudioCMS' }); - // Resolve Options let resolvedOptions: StudioCMSOptions; @@ -150,6 +147,11 @@ export default defineIntegration({ }) ); + SafePluginList.push({ + name: 'StudioCMS (Default)', + identifier: 'studiocms', + }); + addVirtualImports(params, { name, imports: { From 2f30b8dd2b36d51e197bdef9ba705c8deee4905c Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Sat, 30 Nov 2024 03:35:28 -0800 Subject: [PATCH 006/539] Refactor StudioCMS integration: Update import statement in integration.ts --- packages/studiocms/src/integration.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/studiocms/src/integration.ts b/packages/studiocms/src/integration.ts index 5b742a0703..32c0cf355e 100644 --- a/packages/studiocms/src/integration.ts +++ b/packages/studiocms/src/integration.ts @@ -155,7 +155,7 @@ export default defineIntegration({ addVirtualImports(params, { name, imports: { - 'studiocms:plugins': `export default = ${JSON.stringify(SafePluginList)};`, + 'studiocms:plugins': `export default ${JSON.stringify(SafePluginList)};`, }, }); }, From dde0d344956b1c0bb66e5fd5d197186abdd014c1 Mon Sep 17 00:00:00 2001 From: Louis Escher Date: Sat, 30 Nov 2024 14:26:07 +0100 Subject: [PATCH 007/539] Changes :) --- packages/studiocms_auth/src/integration.ts | 1 + .../studiocms_auth/src/stubs/auth-utils.ts | 18 +++ .../src/utils/getLabelForPermissionLevel.ts | 19 +++ packages/studiocms_auth/virtuals.d.ts | 4 + packages/studiocms_dashboard/package.json | 4 +- .../src/components/Layout.astro | 27 ++-- .../src/components/PageHeader.astro | 45 ++++++ .../src/components/SidebarLink.astro | 52 +++++++ .../src/components/SidebarPluginLink.astro | 42 ++++++ .../src/components/SingleSidebar.astro | 134 ++++++++++++++++++ .../src/components/StudioCMSLogo.astro | 17 +++ .../src/components/index.ts | 6 - .../src/routes/index.astro | 84 ++++------- .../studiocms_dashboard/src/styles/layout.css | 40 ++++++ .../src/components/Checkbox.astro | 1 - .../studiocms_ui/src/components/Divider.astro | 10 +- .../src/components/Dropdown/Dropdown.astro | 29 ++-- .../src/components/Dropdown/dropdown.ts | 9 +- .../src/components/Sidebar/Single.astro | 9 +- .../src/components/Sidebar/helpers.ts | 20 ++- .../studiocms_ui/src/components/User.astro | 4 +- packages/studiocms_ui/src/utils/Icon.astro | 5 +- packages/studiocms_ui/src/utils/index.ts | 1 + pnpm-lock.yaml | 6 + 24 files changed, 485 insertions(+), 102 deletions(-) create mode 100644 packages/studiocms_auth/src/utils/getLabelForPermissionLevel.ts create mode 100644 packages/studiocms_dashboard/src/components/PageHeader.astro create mode 100644 packages/studiocms_dashboard/src/components/SidebarLink.astro create mode 100644 packages/studiocms_dashboard/src/components/SidebarPluginLink.astro create mode 100644 packages/studiocms_dashboard/src/components/SingleSidebar.astro create mode 100644 packages/studiocms_dashboard/src/components/StudioCMSLogo.astro create mode 100644 packages/studiocms_dashboard/src/styles/layout.css create mode 100644 packages/studiocms_ui/src/utils/index.ts diff --git a/packages/studiocms_auth/src/integration.ts b/packages/studiocms_auth/src/integration.ts index a47d202985..2fd2e55ee4 100644 --- a/packages/studiocms_auth/src/integration.ts +++ b/packages/studiocms_auth/src/integration.ts @@ -71,6 +71,7 @@ export default defineIntegration({ 'studiocms:auth/lib/user': `export * from '${resolve('./lib/user.ts')}'`, 'studiocms:auth/utils/authEnvCheck': `export * from '${resolve('./utils/authEnvCheck.ts')}'`, 'studiocms:auth/utils/validImages': `export * from '${resolve('./utils/validImages.ts')}'`, + 'studiocms:auth/utils/getLabelForPermissionLevel': `export * from '${resolve('./utils/getLabelForPermissionLevel.ts')}'`, 'studiocms:auth/scripts/three': `import ${JSON.stringify(resolve('./scripts/three.ts'))}`, 'studiocms:auth/scripts/formListener': `export * from '${resolve('./scripts/formListener.ts')}'`, }, diff --git a/packages/studiocms_auth/src/stubs/auth-utils.ts b/packages/studiocms_auth/src/stubs/auth-utils.ts index 82704f596e..ea5191ac0d 100644 --- a/packages/studiocms_auth/src/stubs/auth-utils.ts +++ b/packages/studiocms_auth/src/stubs/auth-utils.ts @@ -18,6 +18,24 @@ authUtils.addModule('studiocms:auth/utils/authEnvCheck', { ], }); +authUtils.addModule('studiocms:auth/utils/validImages', { + namedExports: [ + { + name: 'validImages', + typeDef: `typeof import('${resolve('../utils/validImages.ts')}').validImages`, + }, + ], +}); + +authUtils.addModule('studiocms:auth/utils/getLabelForPermissionLevel', { + namedExports: [ + { + name: 'getLabelForPermissionLevel', + typeDef: `typeof import('${resolve('../utils/getLabelForPermissionLevel.ts')}').getLabelForPermissionLevel`, + }, + ], +}); + const dtsFile = authUtils.makeAstroInjectedType('auth-utils.d.ts'); export default dtsFile; diff --git a/packages/studiocms_auth/src/utils/getLabelForPermissionLevel.ts b/packages/studiocms_auth/src/utils/getLabelForPermissionLevel.ts new file mode 100644 index 0000000000..15aa506fef --- /dev/null +++ b/packages/studiocms_auth/src/utils/getLabelForPermissionLevel.ts @@ -0,0 +1,19 @@ +import type { UserSessionData } from "studiocms:auth/lib/types"; + +// TODO: i18n +const getLabelForPermissionLevel = (permissionLevel: UserSessionData['permissionLevel']) => { + switch (permissionLevel) { + case "admin": + return "Administrator" + case "editor": + return "Editor" + case "owner": + return "Owner" + case "visitor": + return "Visitor" + default: + return "Unknown" + } +} + +export { getLabelForPermissionLevel }; diff --git a/packages/studiocms_auth/virtuals.d.ts b/packages/studiocms_auth/virtuals.d.ts index 9b831aaaed..27942b46df 100644 --- a/packages/studiocms_auth/virtuals.d.ts +++ b/packages/studiocms_auth/virtuals.d.ts @@ -87,6 +87,10 @@ declare module 'studiocms:auth/utils/validImages' { export const validImages: typeof import('./src/utils/validImages').validImages; } +declare module 'studiocms:auth/utils/getLabelForPermissionLevel' { + export const validImages: typeof import('./src/utils/getLabelForPermissionLevel').getLabelForPermissionLevel; +} + declare module 'studiocms:auth/scripts/three' { /** * This module should be imported within a script tag. diff --git a/packages/studiocms_dashboard/package.json b/packages/studiocms_dashboard/package.json index eeea7b17ee..d505745799 100644 --- a/packages/studiocms_dashboard/package.json +++ b/packages/studiocms_dashboard/package.json @@ -36,6 +36,7 @@ }, "type": "module", "dependencies": { + "@studiocms/ui": "workspace:*", "@studiocms/assets": "workspace:*", "@studiocms/betaresources": "workspace:*", "@studiocms/core": "workspace:*", @@ -43,7 +44,8 @@ "astro-integration-kit": "catalog:", "@inox-tools/runtime-logger": "catalog:studiocms-shared", "@matthiesenxyz/astrodtsbuilder": "catalog:studiocms-shared", - "@matthiesenxyz/integration-utils": "catalog:studiocms-shared" + "@matthiesenxyz/integration-utils": "catalog:studiocms-shared", + "@fontsource-variable/onest": "catalog:studiocms-shared" }, "peerDependencies": { "astro": "catalog:min", diff --git a/packages/studiocms_dashboard/src/components/Layout.astro b/packages/studiocms_dashboard/src/components/Layout.astro index 4dc9e45bb8..a7c04ff397 100644 --- a/packages/studiocms_dashboard/src/components/Layout.astro +++ b/packages/studiocms_dashboard/src/components/Layout.astro @@ -1,9 +1,13 @@ --- import Config from 'virtual:studiocms/config'; -import { studioCMSSocials } from '@studiocms/core/consts'; -import { BaseHead, Header } from '../components'; +import { Button } from '@studiocms/ui/components'; +import Icon from '@studiocms/ui/utils/Icon.astro'; +import { BaseHead } from '../components'; +import SingleSidebar from './SingleSidebar.astro'; -const socialLinks = studioCMSSocials; +import '@studiocms/ui/css/global.css'; +import '@fontsource-variable/onest/index.css'; +import '../styles/layout.css'; const { dashboardConfig: { @@ -21,7 +25,7 @@ type Props = { const { title, description } = Astro.props; --- - + @@ -34,13 +38,12 @@ const { title, description } = Astro.props; )} -
      -
      -
      -
      - -
      -
      -
      + +
      + + +
      diff --git a/packages/studiocms_dashboard/src/components/PageHeader.astro b/packages/studiocms_dashboard/src/components/PageHeader.astro new file mode 100644 index 0000000000..f110bc9ced --- /dev/null +++ b/packages/studiocms_dashboard/src/components/PageHeader.astro @@ -0,0 +1,45 @@ +--- +interface Props { + title: string; +} + +const { title } = Astro.props; +--- + + diff --git a/packages/studiocms_dashboard/src/components/SidebarLink.astro b/packages/studiocms_dashboard/src/components/SidebarLink.astro new file mode 100644 index 0000000000..be695569ea --- /dev/null +++ b/packages/studiocms_dashboard/src/components/SidebarLink.astro @@ -0,0 +1,52 @@ +--- +import Icon from '@studiocms/ui/utils/Icon.astro'; +import type { HeroIconName } from '@studiocms/ui/utils/iconType.ts'; +import type { HTMLAttributes } from 'astro/types'; + +interface Props extends HTMLAttributes<'a'> { + /** + * ONLY USE OUTLINED ICONS! Shit will break otherwise + */ + icon: HeroIconName; + href: string; +} + +const { icon, ...props } = Astro.props; + +const isActive = Astro.url.pathname === props.href && 'active'; + +const iconName = isActive ? `${icon}-solid` as HeroIconName : icon; +--- + + + + + + + + diff --git a/packages/studiocms_dashboard/src/components/SidebarPluginLink.astro b/packages/studiocms_dashboard/src/components/SidebarPluginLink.astro new file mode 100644 index 0000000000..471b920737 --- /dev/null +++ b/packages/studiocms_dashboard/src/components/SidebarPluginLink.astro @@ -0,0 +1,42 @@ +--- +interface Props { + identifier: string; + name: string; + href: string; +} + +const { name, href, identifier } = Astro.props; + +const isActive = Astro.url.pathname === href && 'active'; +--- + + + {name} + {identifier} + + diff --git a/packages/studiocms_dashboard/src/components/SingleSidebar.astro b/packages/studiocms_dashboard/src/components/SingleSidebar.astro new file mode 100644 index 0000000000..1c4685a49f --- /dev/null +++ b/packages/studiocms_dashboard/src/components/SingleSidebar.astro @@ -0,0 +1,134 @@ +--- +import { getUserData } from 'studiocms:auth/lib/user'; +import { verifyUserPermissionLevel } from 'studiocms:auth/lib/user'; +import { getLabelForPermissionLevel } from 'studiocms:auth/utils/getLabelForPermissionLevel'; +import { StudioCMSRoutes } from 'studiocms:helpers/routemap'; +import pluginList from 'studiocms:plugins'; +import { Divider, Dropdown, Sidebar, User } from '@studiocms/ui/components'; +import StudioCMSLogo from '../components/StudioCMSLogo.astro'; +import SidebarLink from './SidebarLink.astro'; +import SidebarPluginLink from './SidebarPluginLink.astro'; + +const data = await getUserData(Astro); + +if (!data.user) { + return Astro.redirect(StudioCMSRoutes.authLinks.loginURL); +} + +const isAdmin = await verifyUserPermissionLevel(data, 'admin'); + +const filteredPluginList = pluginList.filter((plugin) => !!plugin.settingsPage); +--- + + + + +
      + +
      +
      +
      + + + diff --git a/packages/studiocms_dashboard/src/components/StudioCMSLogo.astro b/packages/studiocms_dashboard/src/components/StudioCMSLogo.astro new file mode 100644 index 0000000000..808b02854f --- /dev/null +++ b/packages/studiocms_dashboard/src/components/StudioCMSLogo.astro @@ -0,0 +1,17 @@ +--- +import type { HTMLAttributes } from 'astro/types'; + +interface Props extends HTMLAttributes<'svg'> {} + +const { + width = 755, + height = 792, + ...props +} = Astro.props; +--- + + + + + + diff --git a/packages/studiocms_dashboard/src/components/index.ts b/packages/studiocms_dashboard/src/components/index.ts index ee4a1a087c..634bb483b7 100644 --- a/packages/studiocms_dashboard/src/components/index.ts +++ b/packages/studiocms_dashboard/src/components/index.ts @@ -1,9 +1,3 @@ export { default as BaseHead } from './BaseHead.astro'; -export { default as Footer } from './Footer.astro'; export { default as Header } from './Header.astro'; export { default as Layout } from './Layout.astro'; -export { default as SideBar } from './SideBar.astro'; -export { default as SideBarMenu } from './SideBarMenu.astro'; -export { default as SideBarFooter } from './SideBarFooter.astro'; -export { default as ThemeManager } from './ThemeManager.astro'; -export { default as ThemeToggleButton } from './ThemeToggleButton.astro'; diff --git a/packages/studiocms_dashboard/src/routes/index.astro b/packages/studiocms_dashboard/src/routes/index.astro index 95518de42a..83f4bd2ac0 100644 --- a/packages/studiocms_dashboard/src/routes/index.astro +++ b/packages/studiocms_dashboard/src/routes/index.astro @@ -1,33 +1,26 @@ --- import { logger } from '@it-astro:logger:studiocms-dashboard'; -import { getWebVitals } from 'studiocms-dashboard:web-vitals'; +import { getUserData, verifyUserPermissionLevel } from 'studiocms:auth/lib/user'; +// import { getWebVitals } from 'studiocms-dashboard:web-vitals'; import { getSiteConfig } from 'studiocms:helpers/contentHelper'; import { StudioCMSRoutes } from 'studiocms:helpers/routemap'; -import { Alert, Card, Details, Divider, Icon } from '@matthiesenxyz/astrolace/components'; -import check2Circle from '@studiocms/assets/svgs/check2-circle.svg'; -import exclamationTriangle from '@studiocms/assets/svgs/exclamation-triangle.svg'; +import DiscordLogo from '@studiocms/assets/svgs/discord.svg?raw'; +import { Button } from '@studiocms/ui/components'; +import Icon from '@studiocms/ui/utils/Icon.astro'; import { Layout } from '../components'; -import CrumbStack from '../components/CrumbStack.astro'; -import DashboardButtons from '../components/DashboardButtons.astro'; -import WebVitalPanel from '../components/WebVitalPanel.astro'; +import PageHeader from '../components/PageHeader.astro'; import { makePageTitle } from '../utils/makePageTitle'; -import { getUserData, verifyUserPermissionLevel } from 'studiocms:auth/lib/user'; - const user = await getUserData(Astro); if (!user.user) { return Astro.redirect(StudioCMSRoutes.authLinks.loginURL); } -const { - mainLinks: { dashboardIndex }, -} = StudioCMSRoutes; - const contextConfig = await getSiteConfig(); // Get the web vitals -const webVitals = await getWebVitals(); +// const webVitals = await getWebVitals(); // Check Permission Level if (!verifyUserPermissionLevel(user, 'editor')) { @@ -37,48 +30,21 @@ if (!verifyUserPermissionLevel(user, 'editor')) { --- - - - -
      - -

      Dashboard

      - - -

      This is StudioCMS a free and open-source CMS built from the ground up by the Astro Community.

      -
      - - - - - -

      This project is Experimental and should not be used in production at this time.

      -
      - - { webVitals.length > 0 && ( - - - - -
      -
      - -

      Web Vitals is ENABLED! Performance Metrics are being collected.

      -
      - -
      - -
      - )} - - - -
      -
      \ No newline at end of file + sideBarActiveItemID="dashboard" + title={makePageTitle("Dashboard", contextConfig)} + description={contextConfig.description} +> + + + + + StudioCMS is a free and open-source content management system built from the ground up by the Astro community. + diff --git a/packages/studiocms_dashboard/src/styles/layout.css b/packages/studiocms_dashboard/src/styles/layout.css new file mode 100644 index 0000000000..007d97d674 --- /dev/null +++ b/packages/studiocms_dashboard/src/styles/layout.css @@ -0,0 +1,40 @@ +.sidebar-header { + display: flex; + flex-direction: row; + gap: 1rem; + align-items: center; +} + +.sidebar-logo { + width: 2.75rem; + height: auto; +} + +.sidebar-title { + font-size: 1.75em; + font-weight: 700; +} + +body { + display: flex; + align-items: center; +} + +main { + width: 100%; + padding: 1.5rem; +} + +.nav-toggle { + position: absolute; + top: 1rem; + left: 1rem; + display: none !important; + z-index: 40 !important; +} + +@media screen and (max-width: 840px) { + .nav-toggle { + display: flex !important; + } +} diff --git a/packages/studiocms_ui/src/components/Checkbox.astro b/packages/studiocms_ui/src/components/Checkbox.astro index fae16206ed..f22da8a51f 100644 --- a/packages/studiocms_ui/src/components/Checkbox.astro +++ b/packages/studiocms_ui/src/components/Checkbox.astro @@ -1,6 +1,5 @@ --- import Checkmark from '../icons/Checkmark.astro'; -import Icon from '../utils/Icon.astro'; import type { StudioCMSColorway } from '../utils/colors'; import { generateID } from '../utils/generateID'; diff --git a/packages/studiocms_ui/src/components/Divider.astro b/packages/studiocms_ui/src/components/Divider.astro index 3b7e179d39..c50ce6dde2 100644 --- a/packages/studiocms_ui/src/components/Divider.astro +++ b/packages/studiocms_ui/src/components/Divider.astro @@ -1,6 +1,13 @@ +--- +type Props = { + background?: 'background-base' | 'background-step-1' | 'background-step-2' | 'background-step-3'; +}; + +const { background = 'background-base' } = Astro.props; +---
      -
      +
      @@ -25,7 +32,6 @@ } .content { - background-color: hsl(var(--background-base)); padding: .25rem .5rem; z-index: 2; color: hsl(var(--text-muted)); diff --git a/packages/studiocms_ui/src/components/Dropdown/Dropdown.astro b/packages/studiocms_ui/src/components/Dropdown/Dropdown.astro index 565a1eea7c..a9cf988c82 100644 --- a/packages/studiocms_ui/src/components/Dropdown/Dropdown.astro +++ b/packages/studiocms_ui/src/components/Dropdown/Dropdown.astro @@ -1,11 +1,14 @@ --- +import Icon from '../../utils/Icon.astro'; import type { StudioCMSColorway } from '../../utils/colors'; +import type { HeroIconName } from '../../utils/iconType'; type Option = { label: string; value: string; disabled?: boolean; color?: StudioCMSColorway; + icon?: HeroIconName; }; type Props = { @@ -14,9 +17,10 @@ type Props = { id: string; align?: 'start' | 'center' | 'end'; triggerOn?: 'left' | 'right' | 'both'; + offset?: number; }; -const { options, disabled = false, align = 'center', id, triggerOn = 'left' } = Astro.props; +const { options, disabled = false, align = 'center', id, triggerOn = 'left', offset = 0 } = Astro.props; ---
      - diff --git a/packages/studiocms_ui/src/components/Dropdown/dropdown.ts b/packages/studiocms_ui/src/components/Dropdown/dropdown.ts index 7fe9efc144..dd3cadab08 100644 --- a/packages/studiocms_ui/src/components/Dropdown/dropdown.ts +++ b/packages/studiocms_ui/src/components/Dropdown/dropdown.ts @@ -6,8 +6,9 @@ class DropdownHelper { alignment: 'start' | 'center' | 'end'; triggerOn: 'left' | 'right' | 'both'; active = false; + fullWidth = false; - constructor(id: string) { + constructor(id: string, fullWidth?: boolean) { this.container = document.getElementById(`${id}-container`) as HTMLDivElement; if (!this.container) { @@ -35,6 +36,8 @@ class DropdownHelper { }); } + if (fullWidth) this.fullWidth = true; + window.addEventListener('scroll', this.hide); this.hideOnClickOutside(this.container); @@ -104,7 +107,7 @@ class DropdownHelper { left, right, bottom: bottom + margin + dropdownHeight, - width: isMobile ? parentWidth : dropdownWidth, // Account for scaling of animation + width: isMobile || this.fullWidth ? parentWidth : dropdownWidth, // Account for scaling of animation height: dropdownHeight, x, y: y + height + margin, @@ -112,7 +115,7 @@ class DropdownHelper { this.active = true; - if (isMobile) { + if (isMobile || this.fullWidth) { this.dropdown.style.maxWidth = `${parentWidth}px`; this.dropdown.style.minWidth = 'unset'; this.dropdown.style.width = `${parentWidth}px`; diff --git a/packages/studiocms_ui/src/components/Sidebar/Single.astro b/packages/studiocms_ui/src/components/Sidebar/Single.astro index 2ede271c62..ee0bccc414 100644 --- a/packages/studiocms_ui/src/components/Sidebar/Single.astro +++ b/packages/studiocms_ui/src/components/Sidebar/Single.astro @@ -1,4 +1,11 @@ -
      - Dashboard + {t("category-1-header")} - + + Loading +
      @@ -87,5 +94,6 @@ import UserAccount from './islands/sidebar/UserAccount.astro'; display: flex; flex-direction: column; align-items: center; + width: 100%; } diff --git a/packages/studiocms_dashboard/src/components/islands/sidebar/Admin.astro b/packages/studiocms_dashboard/src/components/islands/sidebar/Admin.astro index 5684f36057..07b74d7d21 100644 --- a/packages/studiocms_dashboard/src/components/islands/sidebar/Admin.astro +++ b/packages/studiocms_dashboard/src/components/islands/sidebar/Admin.astro @@ -2,11 +2,16 @@ import { getUserData } from 'studiocms:auth/lib/user'; import { verifyUserPermissionLevel } from 'studiocms:auth/lib/user'; import { StudioCMSRoutes } from 'studiocms:helpers/routemap'; +import { getLangFromUrl, useTranslatedPath, useTranslations } from 'studiocms:i18n'; import pluginList from 'studiocms:plugins'; import { Divider } from '@studiocms/ui/components'; import SidebarLink from '../../SidebarLink.astro'; import SidebarPluginLink from '../../SidebarPluginLink.astro'; +const lang = getLangFromUrl(Astro.url); +const t = useTranslations(lang, '@studiocms/dashboard:sidebar'); +const tPath = useTranslatedPath(lang); + const data = await getUserData(Astro); if (!data.user) { @@ -16,77 +21,82 @@ if (!data.user) { const isAdmin = await verifyUserPermissionLevel(data, 'admin'); const filteredPluginList = pluginList.filter((plugin) => !!plugin.settingsPage); + +Astro.response.headers.set('Cache-Control', 'max-age=604800'); +// 1. Set cookie if admin +// 2. check on subsequent loads if cookie is there +// 3. if yes, show static shit +// 4. render server island --- -{ isAdmin && ( - Admin - - Plugins - +{isAdmin && ( + {t('category-2-header')} + + {t('category-3-header')} + )} - \ No newline at end of file + .sidebar-link-group { + display: flex; + flex-direction: column; + gap: .375rem; + width: 100%; + } + + .sidebar-link-group.hidden { + display: none; + } + + .empty-placeholder-span { + width: 100%; + text-align: center; + color: hsl(var(--text-muted)); + font-size: .875em; + } + + .user-dropdown-trigger-container { + width: calc(280px - 3rem); + cursor: pointer; + border: 1px solid hsl(var(--border)); + padding: .5rem; + border-radius: .5rem; + transition: all .15s ease; + } + + .user-dropdown-trigger-container:hover { + background-color: hsla(var(--border), .5); + } + + .sidebar { + justify-content: space-between; + } + + .sidebar-links-container { + gap: .75rem; + display: flex; + flex-direction: column; + align-items: center; + } + diff --git a/packages/studiocms_dashboard/src/integration.ts b/packages/studiocms_dashboard/src/integration.ts index 536a624770..9187e68896 100644 --- a/packages/studiocms_dashboard/src/integration.ts +++ b/packages/studiocms_dashboard/src/integration.ts @@ -23,7 +23,7 @@ export default defineIntegration({ hooks: { 'astro:config:setup': async (params) => { // Destructure Params - const { logger, injectRoute } = params; + const { logger, injectRoute, addMiddleware } = params; // Destructure Options const { verbose } = options; @@ -114,9 +114,19 @@ export default defineIntegration({ pattern: '/', entrypoint: resolve('./routes/index.astro'), }, + { + enabled: options.dashboardConfig.dashboardEnabled && !options.dbStartPage, + pattern: '/test', + entrypoint: resolve('./routes/test.astro'), + }, ], }); + // addMiddleware({ + // order: "pre", + // entrypoint: resolve('./middleware.ts'), + // }); + // // OLD ROUTES - TO BE REMOVED // injectRouteArray(params, { // options, diff --git a/packages/studiocms_dashboard/src/middleware.ts b/packages/studiocms_dashboard/src/middleware.ts new file mode 100644 index 0000000000..5c521966fb --- /dev/null +++ b/packages/studiocms_dashboard/src/middleware.ts @@ -0,0 +1,20 @@ +import { defineMiddleware } from "astro/middleware"; + +export const onRequest = defineMiddleware(async (ctx, next) => { + if (ctx.request.method === 'POST' && ctx.url.pathname.startsWith('/_server-islands')) { + const request = ctx.request.clone(); + request.headers.set('Cache-Control', 'max-age=86400'); + + const newReq = new Request(request, { + method: request.method, + }); + + const response = await next(newReq); + + response.headers.set('Cache-Control', 'max-age=86400'); + + return response; + } + + return next(); +}); diff --git a/packages/studiocms_dashboard/src/middleware2.ts b/packages/studiocms_dashboard/src/middleware2.ts new file mode 100644 index 0000000000..8d95e0e9ab --- /dev/null +++ b/packages/studiocms_dashboard/src/middleware2.ts @@ -0,0 +1,18 @@ +import { defineMiddleware } from "astro/middleware"; + +export const onRequest = defineMiddleware((ctx, next) => { + if (ctx.request.method === 'POST' && ctx.url.pathname.startsWith('/_server-islands')) { + const request = ctx.request.clone(); + request.headers.set('Cache-Control', 'max-age=86400'); + + const newReq = new Request(request, { + method: request.method, + }); + + console.log(newReq.url, newReq.headers); + + return next(newReq); + } + + return next(); +}); diff --git a/packages/studiocms_dashboard/src/routes/test.astro b/packages/studiocms_dashboard/src/routes/test.astro new file mode 100644 index 0000000000..1dd4dd6e81 --- /dev/null +++ b/packages/studiocms_dashboard/src/routes/test.astro @@ -0,0 +1,30 @@ +--- +// import { getWebVitals } from 'studiocms-dashboard:web-vitals'; +import { getSiteConfig } from 'studiocms:helpers/contentHelper'; +import { getLangFromUrl, staticPaths, useTranslatedPath, useTranslations } from 'studiocms:i18n'; +import type { GetStaticPaths } from 'astro'; +import { Layout } from '../components'; +import PageHeader from '../components/islands/dashboard/PageHeader.astro'; +import { makePageTitle } from '../utils/makePageTitle'; + +const contextConfig = await getSiteConfig(); + +const lang = getLangFromUrl(Astro.url); +const t = useTranslations(lang, '@studiocms/dashboard:index'); + +export const getStaticPaths = (() => { + const paths = staticPaths(); + return paths; +}) satisfies GetStaticPaths; + +// Get the web vitals +// const webVitals = await getWebVitals(); +--- + + + Sus + diff --git a/playgrounds/node/astro.config.mts b/playgrounds/node/astro.config.mts index 93d6eebeec..ed55f9584d 100644 --- a/playgrounds/node/astro.config.mts +++ b/playgrounds/node/astro.config.mts @@ -1,11 +1,11 @@ import db from '@astrojs/db'; import node from '@astrojs/node'; -import sentry from '@sentry/astro'; +// import sentry from '@sentry/astro'; // import webvitals from '@astrojs/web-vitals'; -import studioCMSBlog from '@studiocms/blog'; -import devapps from '@studiocms/devapps'; +// import studioCMSBlog from '@studiocms/blog'; +// import devapps from '@studiocms/devapps'; import { defineConfig } from 'astro/config'; -import studioCMS from '../../packages/studiocms/src'; +import studioCMS from 'studiocms'; import { getCoolifyURL } from '../../www/docs/hostUtils'; // https://astro.build/config @@ -14,31 +14,31 @@ export default defineConfig({ output: 'server', adapter: node({ mode: 'standalone' }), integrations: [ - sentry({ - dsn: 'https://71c3c874d5d8ad20486529628ac13aae@sentry.studiocms.dev/4', - replaysSessionSampleRate: 1.0, - replaysOnErrorSampleRate: 1.0, - sourceMapsUploadOptions: { - project: 'node-playground', - authToken: process.env.SENTRY_AUTH_TOKEN, - }, - }), + // sentry({ + // dsn: 'https://71c3c874d5d8ad20486529628ac13aae@sentry.studiocms.dev/4', + // replaysSessionSampleRate: 1.0, + // replaysOnErrorSampleRate: 1.0, + // sourceMapsUploadOptions: { + // project: 'node-playground', + // authToken: process.env.SENTRY_AUTH_TOKEN, + // }, + // }), db(), // webvitals(), studioCMS(), // StudioCMS Integration options can be found in `studiocms.config.mjs` - studioCMSBlog({ - config: { - title: 'StudioCMS Test Blog', - description: 'A simple blog built with Astro and StudioCMS', - }, - }), - devapps({ - appsConfig: { - wpApiImporter: { - enabled: true, - }, - }, - }), + // studioCMSBlog({ + // config: { + // title: 'StudioCMS Test Blog', + // description: 'A simple blog built with Astro and StudioCMS', + // }, + // }), + // devapps({ + // appsConfig: { + // wpApiImporter: { + // enabled: true, + // }, + // }, + // }), ], image: { remotePatterns: [ diff --git a/playgrounds/node/package.json b/playgrounds/node/package.json index 2b3b98867a..f7202c3ec9 100644 --- a/playgrounds/node/package.json +++ b/playgrounds/node/package.json @@ -10,7 +10,8 @@ "dev": "astro dev --remote", "start": "astro dev --remote", "build": "astro build --remote", - "astro": "astro" + "astro": "astro", + "preview": "astro preview --remote" }, "devDependencies": { "@types/node": "catalog:", From 4fbaf7a41f0f16cdf93fa3f96bfdb0302116a137 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Sat, 30 Nov 2024 10:53:04 -0800 Subject: [PATCH 012/539] Refactor StudioCMS integration: Update import statement in discord.svg --- packages/studiocms_assets/src/svgs/discord.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/studiocms_assets/src/svgs/discord.svg b/packages/studiocms_assets/src/svgs/discord.svg index d8d7fee4b2..dfe3f56d1d 100644 --- a/packages/studiocms_assets/src/svgs/discord.svg +++ b/packages/studiocms_assets/src/svgs/discord.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From e14ef67c2f2aa363906de20f2a1019a249069987 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Sat, 30 Nov 2024 16:15:17 -0800 Subject: [PATCH 013/539] fix some CLS issues --- .../src/components/DashboardPageHeader.astro | 56 +++++++++++++++++++ .../src/components/SingleSidebar.astro | 6 +- .../src/components/islands/LoginChecker.astro | 35 ++++++++++++ .../islands/dashboard/PageHeader.astro | 43 -------------- .../islands/dashboard/UserName.astro | 6 ++ .../components/islands/sidebar/Admin.astro | 5 -- .../islands/sidebar/UserAccount.astro | 7 +-- .../src/routes/index.astro | 7 ++- 8 files changed, 107 insertions(+), 58 deletions(-) create mode 100644 packages/studiocms_dashboard/src/components/DashboardPageHeader.astro create mode 100644 packages/studiocms_dashboard/src/components/islands/LoginChecker.astro delete mode 100644 packages/studiocms_dashboard/src/components/islands/dashboard/PageHeader.astro create mode 100644 packages/studiocms_dashboard/src/components/islands/dashboard/UserName.astro diff --git a/packages/studiocms_dashboard/src/components/DashboardPageHeader.astro b/packages/studiocms_dashboard/src/components/DashboardPageHeader.astro new file mode 100644 index 0000000000..6778278a65 --- /dev/null +++ b/packages/studiocms_dashboard/src/components/DashboardPageHeader.astro @@ -0,0 +1,56 @@ +--- +import { getLangFromUrl, useTranslations } from 'studiocms:i18n'; +import DiscordLogo from '@studiocms/assets/svgs/discord.svg?raw'; +import { Button } from '@studiocms/ui/components'; +import Icon from '@studiocms/ui/utils/Icon.astro'; +import UserName from './islands/dashboard/UserName.astro'; + +const lang = getLangFromUrl(Astro.url); +const t = useTranslations(lang, '@studiocms/dashboard:index'); +--- + + + \ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/SingleSidebar.astro b/packages/studiocms_dashboard/src/components/SingleSidebar.astro index a244f8120b..d1a91caad4 100644 --- a/packages/studiocms_dashboard/src/components/SingleSidebar.astro +++ b/packages/studiocms_dashboard/src/components/SingleSidebar.astro @@ -1,6 +1,6 @@ --- import { getLangFromUrl, useTranslatedPath, useTranslations } from 'studiocms:i18n'; -import { Divider, Dropdown, Sidebar } from '@studiocms/ui/components'; +import { Divider, Dropdown, Sidebar, User } from '@studiocms/ui/components'; import StudioCMSLogo from '../components/StudioCMSLogo.astro'; import SidebarLink from './SidebarLink.astro'; import Admin from './islands/sidebar/Admin.astro'; @@ -40,7 +40,9 @@ const tPath = useTranslatedPath(lang); offset={8} >
      - + + +
      diff --git a/packages/studiocms_dashboard/src/components/islands/LoginChecker.astro b/packages/studiocms_dashboard/src/components/islands/LoginChecker.astro new file mode 100644 index 0000000000..5d54710a27 --- /dev/null +++ b/packages/studiocms_dashboard/src/components/islands/LoginChecker.astro @@ -0,0 +1,35 @@ +--- +import { getUserData, verifyUserPermissionLevel } from 'studiocms:auth/lib/user'; +import { StudioCMSRoutes } from 'studiocms:helpers/routemap'; + +interface Props { + requiredPermission: 'owner' | 'admin' | 'editor' | 'visitor' | 'unknown'; +} + +const { requiredPermission } = Astro.props; + +const user = await getUserData(Astro); + +const isAuthorized = await verifyUserPermissionLevel(user, requiredPermission); +--- + +
      + + + diff --git a/packages/studiocms_dashboard/src/components/islands/dashboard/PageHeader.astro b/packages/studiocms_dashboard/src/components/islands/dashboard/PageHeader.astro deleted file mode 100644 index a08ac73715..0000000000 --- a/packages/studiocms_dashboard/src/components/islands/dashboard/PageHeader.astro +++ /dev/null @@ -1,43 +0,0 @@ ---- -import { logger } from '@it-astro:logger:studiocms-dashboard'; -import { getUserData, verifyUserPermissionLevel } from 'studiocms:auth/lib/user'; -import { StudioCMSRoutes } from 'studiocms:helpers/routemap'; -import { getLangFromUrl, useTranslations } from 'studiocms:i18n'; -import DiscordLogo from '@studiocms/assets/svgs/discord.svg?raw'; -import { Button } from '@studiocms/ui/components'; -import Icon from '@studiocms/ui/utils/Icon.astro'; -import { default as PageHead } from '../../PageHeader.astro'; - -const user = await getUserData(Astro); - -if (!user.user) { - return Astro.redirect(StudioCMSRoutes.authLinks.loginURL); -} - -const referer = Astro.request.headers.get('referer'); - -if (!referer) { - throw new Error('No referer found'); -} - -const lang = getLangFromUrl(new URL(referer)); -const t = useTranslations(lang, '@studiocms/dashboard:index'); - -// Check Permission Level -if (!verifyUserPermissionLevel(user, 'editor')) { - logger.info('User is not an admin or editor. Redirecting to profile page.'); - return Astro.redirect(StudioCMSRoutes.mainLinks.userProfile); -} ---- - - - - \ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/islands/dashboard/UserName.astro b/packages/studiocms_dashboard/src/components/islands/dashboard/UserName.astro new file mode 100644 index 0000000000..6412ec2bcf --- /dev/null +++ b/packages/studiocms_dashboard/src/components/islands/dashboard/UserName.astro @@ -0,0 +1,6 @@ +--- +import { getUserData } from 'studiocms:auth/lib/user'; + +const user = await getUserData(Astro); +--- + \ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/islands/sidebar/Admin.astro b/packages/studiocms_dashboard/src/components/islands/sidebar/Admin.astro index 07b74d7d21..26ab64ba32 100644 --- a/packages/studiocms_dashboard/src/components/islands/sidebar/Admin.astro +++ b/packages/studiocms_dashboard/src/components/islands/sidebar/Admin.astro @@ -1,7 +1,6 @@ --- import { getUserData } from 'studiocms:auth/lib/user'; import { verifyUserPermissionLevel } from 'studiocms:auth/lib/user'; -import { StudioCMSRoutes } from 'studiocms:helpers/routemap'; import { getLangFromUrl, useTranslatedPath, useTranslations } from 'studiocms:i18n'; import pluginList from 'studiocms:plugins'; import { Divider } from '@studiocms/ui/components'; @@ -14,10 +13,6 @@ const tPath = useTranslatedPath(lang); const data = await getUserData(Astro); -if (!data.user) { - return Astro.redirect(StudioCMSRoutes.authLinks.loginURL); -} - const isAdmin = await verifyUserPermissionLevel(data, 'admin'); const filteredPluginList = pluginList.filter((plugin) => !!plugin.settingsPage); diff --git a/packages/studiocms_dashboard/src/components/islands/sidebar/UserAccount.astro b/packages/studiocms_dashboard/src/components/islands/sidebar/UserAccount.astro index b832371b40..f659ddf236 100644 --- a/packages/studiocms_dashboard/src/components/islands/sidebar/UserAccount.astro +++ b/packages/studiocms_dashboard/src/components/islands/sidebar/UserAccount.astro @@ -1,13 +1,8 @@ --- import { getUserData } from 'studiocms:auth/lib/user'; import { getLabelForPermissionLevel } from 'studiocms:auth/utils/getLabelForPermissionLevel'; -import { StudioCMSRoutes } from 'studiocms:helpers/routemap'; import { User } from '@studiocms/ui/components'; const data = await getUserData(Astro); - -if (!data.user) { - return Astro.redirect(StudioCMSRoutes.authLinks.loginURL); -} --- - \ No newline at end of file + \ No newline at end of file diff --git a/packages/studiocms_dashboard/src/routes/index.astro b/packages/studiocms_dashboard/src/routes/index.astro index 1bdf8e9192..c28c811290 100644 --- a/packages/studiocms_dashboard/src/routes/index.astro +++ b/packages/studiocms_dashboard/src/routes/index.astro @@ -4,7 +4,8 @@ import { getSiteConfig } from 'studiocms:helpers/contentHelper'; import { getLangFromUrl, staticPaths, useTranslatedPath, useTranslations } from 'studiocms:i18n'; import type { GetStaticPaths } from 'astro'; import { Layout } from '../components'; -import PageHeader from '../components/islands/dashboard/PageHeader.astro'; +import PageHeader from '../components/DashboardPageHeader.astro'; +import LoginChecker from '../components/islands/LoginChecker.astro'; import { makePageTitle } from '../utils/makePageTitle'; const contextConfig = await getSiteConfig(); @@ -22,11 +23,13 @@ export const getStaticPaths = (() => { // const webVitals = await getWebVitals(); --- + + - + {t('sub-header')} From 356ffd53829d4d3cbf5c2a7050b7213e95e81869 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Sat, 30 Nov 2024 16:22:14 -0800 Subject: [PATCH 014/539] Refactor password hashing to use synchronous function --- packages/studiocms_auth/src/lib/password.ts | 4 ++-- packages/studiocms_auth/src/lib/user.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/studiocms_auth/src/lib/password.ts b/packages/studiocms_auth/src/lib/password.ts index 11ce16d35a..ad543a34c2 100644 --- a/packages/studiocms_auth/src/lib/password.ts +++ b/packages/studiocms_auth/src/lib/password.ts @@ -9,8 +9,8 @@ import bcrypt from 'bcryptjs'; * @param password - The plain text password to hash. * @returns A promise that resolves to the hashed password. */ -export async function hashPassword(password: string): Promise { - const hashedPassword = await bcrypt.hash(password, 10); +export function hashPassword(password: string): string { + const hashedPassword = bcrypt.hashSync(password, 10); return hashedPassword; } diff --git a/packages/studiocms_auth/src/lib/user.ts b/packages/studiocms_auth/src/lib/user.ts index 1bd324373a..171d0cb9c9 100644 --- a/packages/studiocms_auth/src/lib/user.ts +++ b/packages/studiocms_auth/src/lib/user.ts @@ -75,7 +75,7 @@ export async function createLocalUser( email: string, password: string ): Promise { - const passwordHash = await hashPassword(password); + const passwordHash = hashPassword(password); const avatar = await createUserAvatar(email); From 0ed4ebd867c2f069701ae3174123cf057281f2ca Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Sat, 30 Nov 2024 16:32:03 -0800 Subject: [PATCH 015/539] Refactor password hashing to use synchronous function --- packages/studiocms_auth/src/lib/user.ts | 2 +- .../src/components/islands/LoginChecker.astro | 7 ++++--- .../src/components/islands/sidebar/Admin.astro | 6 +++--- packages/studiocms_dashboard/src/routes/test.astro | 3 +-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/studiocms_auth/src/lib/user.ts b/packages/studiocms_auth/src/lib/user.ts index 171d0cb9c9..f894c564bf 100644 --- a/packages/studiocms_auth/src/lib/user.ts +++ b/packages/studiocms_auth/src/lib/user.ts @@ -139,7 +139,7 @@ export const LinkNewOAuthCookieName = 'link-new-o-auth'; * @returns A promise that resolves when the password has been successfully updated. */ export async function updateUserPassword(userId: string, password: string): Promise { - const passwordHash = await hashPassword(password); + const passwordHash = hashPassword(password); await db.update(tsUsers).set({ password: passwordHash }).where(eq(tsUsers.id, userId)); } diff --git a/packages/studiocms_dashboard/src/components/islands/LoginChecker.astro b/packages/studiocms_dashboard/src/components/islands/LoginChecker.astro index 5d54710a27..cc6b2645dd 100644 --- a/packages/studiocms_dashboard/src/components/islands/LoginChecker.astro +++ b/packages/studiocms_dashboard/src/components/islands/LoginChecker.astro @@ -14,6 +14,7 @@ const isAuthorized = await verifyUserPermissionLevel(user, requiredPermission); ---
      diff --git a/packages/studiocms_dashboard/src/components/islands/sidebar/Admin.astro b/packages/studiocms_dashboard/src/components/islands/sidebar/Admin.astro index 26ab64ba32..fcbdc3fc4d 100644 --- a/packages/studiocms_dashboard/src/components/islands/sidebar/Admin.astro +++ b/packages/studiocms_dashboard/src/components/islands/sidebar/Admin.astro @@ -26,10 +26,10 @@ Astro.response.headers.set('Cache-Control', 'max-age=604800'); {isAdmin && ( {t('category-2-header')} @@ -37,7 +37,7 @@ Astro.response.headers.set('Cache-Control', 'max-age=604800'); + + - \ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/islands/content-mgmt/Edit.astro b/packages/studiocms_dashboard/src/components/islands/content-mgmt/Edit.astro index 7fa0d41e76..346b8e6450 100644 --- a/packages/studiocms_dashboard/src/components/islands/content-mgmt/Edit.astro +++ b/packages/studiocms_dashboard/src/components/islands/content-mgmt/Edit.astro @@ -2,6 +2,7 @@ import '../../../styles/tiny-mde.css'; import { StudioCMSRoutes } from 'studiocms:lib'; import { Input, Select } from '@studiocms/ui/components'; +import TinyMDE from '../../component-scripts/TinyMDE.astro'; const pageTypeOptions = [{ label: 'Normal (StudioCMS)', value: 'studiocms' }]; const trueFalse = [ @@ -71,7 +72,7 @@ const parentFolderOptions = [{ label: 'None', value: 'null' }];
      - + \ No newline at end of file diff --git a/packages/studiocms_dashboard/src/components/islands/content-mgmt/Edit.astro b/packages/studiocms_dashboard/src/components/islands/content-mgmt/Edit.astro index cd1160453d..bf2ee762a4 100644 --- a/packages/studiocms_dashboard/src/components/islands/content-mgmt/Edit.astro +++ b/packages/studiocms_dashboard/src/components/islands/content-mgmt/Edit.astro @@ -1,43 +1,15 @@ --- import '../../../styles/tiny-mde.css'; import { StudioCMSRoutes } from 'studiocms:lib'; -import pluginsList from 'studiocms:plugins'; -import { studioCMS_SDK_Cache } from 'studiocms:sdk/cache'; import { Input, Select } from '@studiocms/ui/components'; -import TinyMDE from '../../component-scripts/TinyMDE.astro'; - -type PluginList = { - label: string; - value: string; -}[]; - -const { data: folderList } = await studioCMS_SDK_Cache.GET.folderList(); - -const pageTypeOptions = pluginsList.flatMap(({ pageTypes }) => { - const pageTypeOutput: PluginList = []; - - if (!pageTypes) { - return pageTypeOutput; - } - - for (const { label, identifier } of pageTypes) { - pageTypeOutput.push({ label, value: identifier }); - } - - return pageTypeOutput; -}); - -const parentFolders = folderList.map(({ id: value, name: label }) => ({ label, value })); - -const parentFolderOptions = [{ label: 'None', value: 'null' }, ...parentFolders]; - -const trueFalse = [ - { label: 'Yes', value: 'true' }, - { label: 'No', value: 'false' }, -]; - -const categoriesOptions = [{ label: 'None', value: 'null' }]; -const tagsOptions = [{ label: 'None', value: 'null' }]; +// import TinyMDE from '../../component-scripts/TinyMDE.astro'; +import { + categoriesOptions, + pageTypeOptions, + parentFolderOptions, + tagsOptions, + trueFalse, +} from './shared'; ---
      @@ -89,15 +61,13 @@ const tagsOptions = [{ label: 'None', value: 'null' }];
      - +
      - - - diff --git a/packages/studiocms_dashboard/src/routes/index.astro b/packages/studiocms_dashboard/src/routes/index.astro index dbffd81873..321374c628 100644 --- a/packages/studiocms_dashboard/src/routes/index.astro +++ b/packages/studiocms_dashboard/src/routes/index.astro @@ -1,5 +1,4 @@ --- -// import { getWebVitals } from 'studiocms-dashboard:web-vitals'; import { useTranslations } from 'studiocms:i18n'; import { prerenderRoutes as pagePreRendered } from 'studiocms:mode'; import { Layout } from '../components'; @@ -8,9 +7,6 @@ import DashboardGrid from '../components/islands/dashboard/DashboardGrid.astro'; const lang = 'en-us'; const t = useTranslations(lang, '@studiocms/dashboard:index'); - -// Get the web vitals -// const webVitals = await getWebVitals(); --- - Sus - -
      - -
      -
      From edccb5b715964d589974d1c69bfa31dcb3ad8563 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Sun, 19 Jan 2025 22:53:06 -0800 Subject: [PATCH 430/539] Remove obsolete test route from configSetup --- packages/studiocms_dashboard/src/hooks/configSetup.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/studiocms_dashboard/src/hooks/configSetup.ts b/packages/studiocms_dashboard/src/hooks/configSetup.ts index b16e8a5229..99b6652d4d 100644 --- a/packages/studiocms_dashboard/src/hooks/configSetup.ts +++ b/packages/studiocms_dashboard/src/hooks/configSetup.ts @@ -111,12 +111,6 @@ export const configSetup = defineUtility('astro:config:setup')( { options, routes: [ - { - enabled: dashboardEnabled && !dbStartPage, - pattern: 'test', - entrypoint: resolve('../routes/test.astro'), - }, - { enabled: dashboardEnabled && !dbStartPage, pattern: '/', From 3f74fd9f347535eb5dd63573842e33cf252ea7f1 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Mon, 20 Jan 2025 10:22:30 -0800 Subject: [PATCH 431/539] Add build-scripts directory and various component exports; remove obsolete files and update .gitignore --- .github/workflows/ci-pr-snapshots.yml | 3 + .github/workflows/ci-push-main.yml | 3 + build-scripts/cmd/build.js | 187 +++++ build-scripts/index.js | 14 + build-scripts/jsconfig.json | 12 + build-scripts/package.json | 19 + package.json | 12 +- packages/studiocms/.gitignore | 4 +- packages/studiocms/package.json | 40 +- packages/studiocms/src/cli/commander.ts | 107 +++ packages/studiocms/src/cli/index.ts | 24 + packages/studiocms/src/cli/utils.ts | 249 +++++++ packages/studiocms/src/config.ts | 21 + packages/studiocms/src/hooks/build-done.ts | 21 - packages/studiocms/src/hooks/config-done.ts | 56 -- packages/studiocms/src/hooks/config-setup.ts | 183 ----- packages/studiocms/src/hooks/db-setup.ts | 7 - packages/studiocms/src/hooks/server-start.ts | 52 -- packages/studiocms/src/index.ts | 321 ++++++++- .../src/utils/addIntegrationArray.ts | 35 + .../src/utils/astroConfigCheck.ts | 4 +- packages/studiocms/src/utils/changelog.ts | 2 +- .../src/utils/configManager.ts | 9 +- .../src/utils/configResolver.ts | 10 +- .../studiocms/src/utils/integrationLogger.ts | 24 + packages/studiocms/src/utils/integrations.ts | 32 + packages/studiocms/studiocms-cli.mjs | 13 + packages/studiocms/tsconfig.json | 10 +- packages/studiocms_auth/.gitignore | 4 +- .../components/OAuthButton.astro | 0 .../components/OAuthButtonStack.astro | 1 + .../components/StaticAuthCheck.astro | 1 + .../components/StudioCMSLogoSVG.astro | 0 .../components/oAuthButtonProviders.ts | 0 .../{src => assets}/layouts/AuthLayout.astro | 1 + .../layouts/FallbackCanvas.astro | 1 + .../layouts/ThreeCanvasLoader.astro | 1 + .../{src => assets}/layouts/authlayout.css | 0 .../loginBackgrounds/studiocms-blobs-dark.png | Bin .../studiocms-blobs-light.png | Bin .../studiocms-blocks-dark.png | Bin .../studiocms-blocks-light.png | Bin .../studiocms-curves-dark.png | Bin .../studiocms-curves-light.png | Bin .../{src => assets}/public/studiocms-logo.glb | Bin .../routes/api/auth0/callback.ts | 1 + .../{src => assets}/routes/api/auth0/index.ts | 1 + .../routes/api/auth0/shared.ts | 1 + .../routes/api/discord/callback.ts | 1 + .../routes/api/discord/index.ts | 1 + .../routes/api/discord/shared.ts | 1 + .../routes/api/github/callback.ts | 1 + .../routes/api/github/index.ts | 1 + .../routes/api/github/shared.ts | 1 + .../routes/api/google/callback.ts | 1 + .../routes/api/google/index.ts | 1 + .../routes/api/google/shared.ts | 1 + .../{src => assets}/routes/api/login.ts | 1 + .../{src => assets}/routes/api/logout.ts | 1 + .../{src => assets}/routes/api/register.ts | 1 + .../{src => assets}/routes/api/shared.ts | 0 .../{src => assets}/routes/login.astro | 1 + .../{src => assets}/routes/logout.astro | 1 + .../{src => assets}/routes/signup.astro | 3 +- .../{src => assets}/scripts/formListener.ts | 4 +- packages/studiocms_auth/package.json | 11 +- packages/studiocms_auth/src/env.d.ts | 15 + .../studiocms_auth/src/hooks/config-done.ts | 13 - .../studiocms_auth/src/hooks/config-setup.ts | 59 +- packages/studiocms_auth/src/index.ts | 17 +- packages/studiocms_auth/src/lib/encryption.ts | 1 + packages/studiocms_auth/src/lib/password.ts | 1 + packages/studiocms_auth/src/lib/rate-limit.ts | 3 +- packages/studiocms_auth/src/lib/session.ts | 4 +- packages/studiocms_auth/src/lib/types.ts | 1 + packages/studiocms_auth/src/lib/user.ts | 8 +- packages/studiocms_auth/src/scripts/three.ts | 17 +- packages/studiocms_auth/src/stubs/auth-lib.ts | 78 +-- .../studiocms_auth/src/stubs/auth-scripts.ts | 2 +- .../studiocms_auth/src/stubs/auth-utils.ts | 6 +- .../studiocms_auth/src/utils/authEnvCheck.ts | 1 + packages/studiocms_auth/src/utils/checkENV.ts | 4 +- .../src/utils/getLabelForPermissionLevel.ts | 33 +- .../src/utils/integrationLogger.ts | 24 + .../studiocms_auth/src/utils/routeBuilder.ts | 4 +- .../studiocms_auth/src/utils/validImages.ts | 23 +- packages/studiocms_auth/tsconfig.build.json | 11 + packages/studiocms_auth/tsconfig.json | 16 +- packages/studiocms_auth/virtuals.d.ts | 1 - packages/studiocms_core/.gitignore | 4 +- .../{src => assets}/components/Avatar.astro | 0 .../components/FormattedDate.astro | 0 .../components/Generator.astro | 0 .../components/GenericHeader.astro | 0 .../components/Navigation.astro | 0 .../{src => assets}/components/avatar.webp | Bin .../{src => assets}/components/index.ts | 0 .../{src => assets}/components/navigation.css | 0 .../i18n/LanguageSelector.astro | 0 .../{src => assets}/i18n/index.ts | 0 .../{src => assets}/i18n/translations/de.json | 0 .../i18n/translations/en-us.json | 0 .../{src => assets}/public/favicon-dark.png | Bin .../{src => assets}/public/favicon-light.png | Bin .../{src => assets}/public/favicon.svg | 0 packages/studiocms_core/env.d.ts | 8 - packages/studiocms_core/package.json | 102 ++- packages/studiocms_core/src/consts.ts | 2 +- packages/studiocms_core/src/db/config.ts | 2 +- packages/studiocms_core/src/db/tables.ts | 1 + packages/studiocms_core/src/db/tsTables.ts | 86 --- .../src}/env.d.ts | 2 +- .../studiocms_core/src/hooks/config-done.ts | 10 +- .../studiocms_core/src/hooks/config-setup.ts | 62 +- packages/studiocms_core/src/index.ts | 8 +- packages/studiocms_core/src/lib/head.ts | 2 +- .../studiocms_core/src/lib/headDefaults.ts | 4 +- packages/studiocms_core/src/lib/index.ts | 14 +- packages/studiocms_core/src/lib/routeMap.ts | 6 +- packages/studiocms_core/src/lib/urlGen.ts | 4 +- .../src/routes/update-latest-version-cache.ts | 1 + .../src/schemas/config/dashboard.ts | 4 +- .../src/schemas/config/index.ts | 16 +- .../src/schemas/config/rendererConfig.ts | 4 +- .../studiocms_core/src/schemas/config/sdk.ts | 2 +- packages/studiocms_core/src/schemas/index.ts | 6 +- .../src/schemas/plugins/index.ts | 2 +- .../src/sdk-utils/StudioCMSSDK.ts | 8 +- .../src/sdk-utils/StudioCMSVirtualCache.ts | 6 +- packages/studiocms_core/src/sdk-utils/auth.ts | 4 +- .../studiocms_core/src/sdk-utils/cache.ts | 6 +- .../studiocms_core/src/sdk-utils/delete.ts | 4 +- packages/studiocms_core/src/sdk-utils/get.ts | 4 +- .../studiocms_core/src/sdk-utils/index.ts | 4 +- packages/studiocms_core/src/sdk-utils/init.ts | 2 +- packages/studiocms_core/src/sdk-utils/post.ts | 4 +- .../studiocms_core/src/sdk-utils/tables.ts | 2 +- .../src/sdk-utils/types/index.ts | 10 +- .../src/sdk-utils/types/tableDefs.ts | 2 +- .../src/sdk-utils/types/tsAlias.ts | 2 +- .../studiocms_core/src/sdk-utils/update.ts | 4 +- .../studiocms_core/src/stubs/components.ts | 10 +- packages/studiocms_core/src/stubs/core.ts | 14 +- packages/studiocms_core/src/stubs/i18n-dts.ts | 18 +- packages/studiocms_core/src/stubs/lib.ts | 52 +- packages/studiocms_core/src/stubs/sdk.ts | 94 +-- .../src/utils/defineStudioCMSConfig.ts | 2 +- packages/studiocms_core/src/utils/index.ts | 9 +- .../src/utils/integrationLogger.ts | 24 + packages/studiocms_core/tsconfig.build.json | 11 + packages/studiocms_core/tsconfig.json | 16 +- packages/studiocms_core/virtuals.d.ts | 252 ++++++- packages/studiocms_dashboard/.gitignore | 4 +- .../{src => assets}/components/BaseHead.astro | 0 .../components/DashboardPageHeader.astro | 0 .../components/DoubleSidebar.astro | 0 .../{src => assets}/components/Footer.astro | 0 .../{src => assets}/components/Header.astro | 0 .../components/InnerSidebarFolder.astro | 0 .../components/InnerSidebarLink.astro | 0 .../{src => assets}/components/Layout.astro | 0 .../components/PageEditAndCreateForm.astro | 0 .../components/PageHeader.astro | 0 .../components/SidebarLink.astro | 0 .../components/SidebarPluginLink.astro | 0 .../components/SingleSidebar.astro | 0 .../components/StudioCMSLogo.astro | 0 .../component-scripts/TinyMDE.astro | 0 .../component-scripts/dateTimeListener.ts | 0 .../component-scripts/dateWithTimeAndZone.ts | 0 .../component-scripts/makeClientRoutable.ts | 0 .../components/component-scripts/timeAgo.ts | 0 .../{src => assets}/components/index.ts | 0 .../components/islands/LoginChecker.astro | 0 .../islands/configuration/ConfigForm.astro | 0 .../islands/configuration/LightVsDark.astro | 0 .../islands/content-mgmt/Create.astro | 0 .../islands/content-mgmt/Edit.astro | 0 .../islands/content-mgmt/PageHeader.astro | 0 .../islands/content-mgmt/PageList.astro | 0 .../islands/content-mgmt/TreeRenderer.astro | 0 .../components/islands/content-mgmt/shared.ts | 0 .../islands/dashboard/DashboardGrid.astro | 0 .../islands/dashboard/DashboardGridItem.astro | 0 .../components/islands/dashboard/Test.astro | 0 .../islands/dashboard/UserName.astro | 0 .../islands/profile/BasicInfo.astro | 0 .../islands/profile/BasicInfoFallback.astro | 0 .../islands/profile/SocialSignin.astro | 0 .../profile/SocialSigninFallback.astro | 0 .../islands/profile/UpdatePassword.astro | 0 .../profile/UpdatePasswordFallback.astro | 0 .../islands/profile/oAuthButtonProviders.ts | 0 .../components/islands/sidebar/Admin.astro | 0 .../components/islands/sidebar/Editor.astro | 0 .../islands/sidebar/UserAccount.astro | 0 .../islands/sidebar/VersionCheck.astro | 0 .../sidebar/VersionCheckChangelog.astro | 0 .../shared-parts/VersionCheck.astro | 0 .../components/sidebarConfig.ts | 0 .../webVitalsParts/CoreVitalPanelCard.astro | 0 .../webVitalsParts/DataAnalyticsTable.astro | 0 .../webVitalsParts/PagespeedInsights.astro | 0 .../WebVitalPerCoreRouteTable.astro | 0 .../webVitalsParts/WebVitalPerCoreVital.astro | 0 .../WebVitalPerCoreVitalRoute.astro | 0 .../webVitalsParts/WebVitalPerRouteData.astro | 0 .../webVitalsParts/buildDataObject.ts | 0 .../buildPageRouteDataObject.ts | 0 .../webVitalsParts/buildPerPageDataObject.ts | 0 .../components/webVitalsParts/checkDate.ts | 0 .../webVitalsParts/getPageRouteReference.ts | 0 .../webVitalsParts/webVitalsUtils.ts | 0 .../firstTimeSetupRoutes/done.astro | 0 .../firstTimeSetupRoutes/main.astro | 0 .../{src => assets}/routes/404.astro | 0 .../routes/configuration.astro | 0 .../routes/content-management.astro | 0 .../{src => assets}/routes/index.astro | 0 .../{src => assets}/routes/profile.astro | 0 .../routes/studiocms_api/LiveRender.astro | 0 .../routes/studiocms_api/config/admin.ts | 0 .../routes/studiocms_api/config/site.ts | 0 .../routes/studiocms_api/firstTimeSetup.ts | 0 .../routes/studiocms_api/pages/create.ts | 0 .../routes/studiocms_api/pages/delete.ts | 0 .../routes/studiocms_api/pages/edit.ts | 0 .../routes/user-management.astro | 0 .../{src => assets}/styles/404.css | 0 .../{src => assets}/styles/base.css | 0 .../{src => assets}/styles/tiny-mde.css | 0 packages/studiocms_dashboard/package.json | 18 +- packages/studiocms_dashboard/src/env.d.ts | 33 - .../src/hooks/configDone.ts | 2 +- .../src/hooks/configSetup.ts | 40 +- .../src/hooks/serverStart.ts | 4 +- packages/studiocms_dashboard/src/index.ts | 10 +- .../src/stubs/webVitals.ts | 4 +- .../src/utils/AstroComponentProxy.ts | 2 +- .../src/utils/addAPIRoutes.ts | 4 +- .../studiocms_dashboard/src/utils/astroDb.ts | 146 ---- .../src/utils/checkForWebVitalsPlugin.ts | 2 +- .../src/utils/injectRouteArray.ts | 4 +- .../src/utils/integrationLogger.ts | 24 + .../src/utils/isDashboardRoute.ts | 1 + .../studiocms_dashboard/src/utils/webVital.ts | 1 + .../studiocms_dashboard/tsconfig.build.json | 11 + packages/studiocms_dashboard/tsconfig.json | 17 +- packages/studiocms_dashboard/virtuals.d.ts | 1 - packages/studiocms_frontend/.gitignore | 4 +- .../{src => }/components/BaseHead.astro | 0 .../{src => }/components/Footer.astro | 0 .../{src => }/components/Layout.astro | 0 .../{src => }/components/global.css | 0 .../{src => }/components/index.ts | 0 packages/studiocms_frontend/package.json | 13 +- .../{src => }/routes/[...slug].astro | 0 .../{src => }/routes/index.astro | 0 .../src/hooks/configSetup.ts | 66 -- packages/studiocms_frontend/src/index.ts | 66 +- .../src/utils/integrationLogger.ts | 24 + .../studiocms_frontend/tsconfig.build.json | 11 + packages/studiocms_frontend/tsconfig.json | 16 +- packages/studiocms_frontend/virtuals.d.ts | 141 +++- packages/studiocms_imagehandler/.gitignore | 4 +- .../{src => }/components/CustomImage.astro | 4 +- .../{src => }/components/index.ts | 0 .../components/plugins/cloudinary.ts | 3 +- .../{src => }/components/props.ts | 0 packages/studiocms_imagehandler/package.json | 11 +- .../src/hooks/configDone.ts | 37 - .../src/hooks/configSetup.ts | 87 --- packages/studiocms_imagehandler/src/index.ts | 115 ++- .../src/utils/astroEnvConfig.ts | 12 + .../src/utils/integrationLogger.ts | 24 + .../tsconfig.build.json | 11 + packages/studiocms_imagehandler/tsconfig.json | 16 +- packages/studiocms_imagehandler/virtuals.d.ts | 6 +- packages/studiocms_renderers/.gitignore | 4 +- .../{src => }/components/Renderer.d.ts | 0 .../{src => }/components/Renderer.js | 0 packages/studiocms_renderers/exports/index.ts | 4 + .../MarkDocReactRenderer.tsx | 0 .../MarkDocReactWrapper.astro | 2 +- .../exports/markdocRenderers/markdocReact.ts | 2 +- packages/studiocms_renderers/package.json | 24 +- .../studiocms_renderers/src/exports/index.ts | 1 - .../src/hooks/config-done.ts | 17 - .../src/hooks/config-setup.ts | 48 -- packages/studiocms_renderers/src/index.d.ts | 13 + packages/studiocms_renderers/src/index.ts | 56 +- .../src/lib/astro-remark.d.ts | 13 + .../src/lib/contentRenderer.d.ts | 12 + .../src/lib/contentRenderer.ts | 6 +- .../lib/markdoc-renderers/markdocHTML.d.ts | 3 + .../markdoc-renderers/markdocReactStatic.d.ts | 3 + .../studiocms_renderers/src/lib/markdoc.d.ts | 11 + .../studiocms_renderers/src/lib/markdoc.ts | 4 +- packages/studiocms_renderers/src/lib/mdx.d.ts | 10 + .../src/stubs/renderer-config.d.ts | 2 + .../src/stubs/renderer-config.ts | 2 +- .../src/stubs/renderer-markdownConfig.d.ts | 2 + .../src/stubs/renderer.d.ts | 2 + .../studiocms_renderers/src/stubs/renderer.ts | 6 +- .../src/utils/integrationLogger.d.ts | 7 + .../src/utils/integrationLogger.ts | 24 + .../studiocms_renderers/tsconfig.build.json | 11 + packages/studiocms_renderers/tsconfig.json | 12 +- packages/studiocms_renderers/virtuals.d.ts | 20 +- packages/studiocms_robotstxt/.gitignore | 4 +- packages/studiocms_robotstxt/package.json | 11 +- packages/studiocms_robotstxt/src/core.ts | 3 +- packages/studiocms_robotstxt/src/index.ts | 12 +- .../studiocms_robotstxt/src/utils/index.ts | 2 +- packages/studiocms_robotstxt/tsconfig.json | 15 +- playground/studiocms.config.mjs | 2 +- pnpm-lock.yaml | 661 ++++++++++-------- pnpm-workspace.yaml | 1 + tsconfig.base.json | 15 + 319 files changed, 3094 insertions(+), 1728 deletions(-) create mode 100644 build-scripts/cmd/build.js create mode 100755 build-scripts/index.js create mode 100644 build-scripts/jsconfig.json create mode 100644 build-scripts/package.json create mode 100644 packages/studiocms/src/cli/commander.ts create mode 100644 packages/studiocms/src/cli/index.ts create mode 100644 packages/studiocms/src/cli/utils.ts create mode 100644 packages/studiocms/src/config.ts delete mode 100644 packages/studiocms/src/hooks/build-done.ts delete mode 100644 packages/studiocms/src/hooks/config-done.ts delete mode 100644 packages/studiocms/src/hooks/config-setup.ts delete mode 100644 packages/studiocms/src/hooks/db-setup.ts delete mode 100644 packages/studiocms/src/hooks/server-start.ts create mode 100644 packages/studiocms/src/utils/addIntegrationArray.ts rename packages/{studiocms_core => studiocms}/src/utils/astroConfigCheck.ts (91%) rename packages/{studiocms_core => studiocms}/src/utils/configManager.ts (96%) rename packages/{studiocms_core => studiocms}/src/utils/configResolver.ts (93%) create mode 100644 packages/studiocms/src/utils/integrationLogger.ts create mode 100644 packages/studiocms/src/utils/integrations.ts create mode 100755 packages/studiocms/studiocms-cli.mjs rename packages/studiocms_auth/{src => assets}/components/OAuthButton.astro (100%) rename packages/studiocms_auth/{src => assets}/components/OAuthButtonStack.astro (97%) rename packages/studiocms_auth/{src => assets}/components/StaticAuthCheck.astro (97%) rename packages/studiocms_auth/{src => assets}/components/StudioCMSLogoSVG.astro (100%) rename packages/studiocms_auth/{src => assets}/components/oAuthButtonProviders.ts (100%) rename packages/studiocms_auth/{src => assets}/layouts/AuthLayout.astro (99%) rename packages/studiocms_auth/{src => assets}/layouts/FallbackCanvas.astro (98%) rename packages/studiocms_auth/{src => assets}/layouts/ThreeCanvasLoader.astro (96%) rename packages/studiocms_auth/{src => assets}/layouts/authlayout.css (100%) rename packages/studiocms_auth/{src => assets}/loginBackgrounds/studiocms-blobs-dark.png (100%) rename packages/studiocms_auth/{src => assets}/loginBackgrounds/studiocms-blobs-light.png (100%) rename packages/studiocms_auth/{src => assets}/loginBackgrounds/studiocms-blocks-dark.png (100%) rename packages/studiocms_auth/{src => assets}/loginBackgrounds/studiocms-blocks-light.png (100%) rename packages/studiocms_auth/{src => assets}/loginBackgrounds/studiocms-curves-dark.png (100%) rename packages/studiocms_auth/{src => assets}/loginBackgrounds/studiocms-curves-light.png (100%) rename packages/studiocms_auth/{src => assets}/public/studiocms-logo.glb (100%) rename packages/studiocms_auth/{src => assets}/routes/api/auth0/callback.ts (99%) rename packages/studiocms_auth/{src => assets}/routes/api/auth0/index.ts (98%) rename packages/studiocms_auth/{src => assets}/routes/api/auth0/shared.ts (98%) rename packages/studiocms_auth/{src => assets}/routes/api/discord/callback.ts (99%) rename packages/studiocms_auth/{src => assets}/routes/api/discord/index.ts (98%) rename packages/studiocms_auth/{src => assets}/routes/api/discord/shared.ts (97%) rename packages/studiocms_auth/{src => assets}/routes/api/github/callback.ts (99%) rename packages/studiocms_auth/{src => assets}/routes/api/github/index.ts (98%) rename packages/studiocms_auth/{src => assets}/routes/api/github/shared.ts (97%) rename packages/studiocms_auth/{src => assets}/routes/api/google/callback.ts (99%) rename packages/studiocms_auth/{src => assets}/routes/api/google/index.ts (98%) rename packages/studiocms_auth/{src => assets}/routes/api/google/shared.ts (97%) rename packages/studiocms_auth/{src => assets}/routes/api/login.ts (99%) rename packages/studiocms_auth/{src => assets}/routes/api/logout.ts (99%) rename packages/studiocms_auth/{src => assets}/routes/api/register.ts (99%) rename packages/studiocms_auth/{src => assets}/routes/api/shared.ts (100%) rename packages/studiocms_auth/{src => assets}/routes/login.astro (99%) rename packages/studiocms_auth/{src => assets}/routes/logout.astro (98%) rename packages/studiocms_auth/{src => assets}/routes/signup.astro (96%) rename packages/studiocms_auth/{src => assets}/scripts/formListener.ts (93%) create mode 100644 packages/studiocms_auth/src/env.d.ts delete mode 100644 packages/studiocms_auth/src/hooks/config-done.ts create mode 100644 packages/studiocms_auth/src/utils/integrationLogger.ts create mode 100644 packages/studiocms_auth/tsconfig.build.json delete mode 100644 packages/studiocms_auth/virtuals.d.ts rename packages/studiocms_core/{src => assets}/components/Avatar.astro (100%) rename packages/studiocms_core/{src => assets}/components/FormattedDate.astro (100%) rename packages/studiocms_core/{src => assets}/components/Generator.astro (100%) rename packages/studiocms_core/{src => assets}/components/GenericHeader.astro (100%) rename packages/studiocms_core/{src => assets}/components/Navigation.astro (100%) rename packages/studiocms_core/{src => assets}/components/avatar.webp (100%) rename packages/studiocms_core/{src => assets}/components/index.ts (100%) rename packages/studiocms_core/{src => assets}/components/navigation.css (100%) rename packages/studiocms_core/{src => assets}/i18n/LanguageSelector.astro (100%) rename packages/studiocms_core/{src => assets}/i18n/index.ts (100%) rename packages/studiocms_core/{src => assets}/i18n/translations/de.json (100%) rename packages/studiocms_core/{src => assets}/i18n/translations/en-us.json (100%) rename packages/studiocms_core/{src => assets}/public/favicon-dark.png (100%) rename packages/studiocms_core/{src => assets}/public/favicon-light.png (100%) rename packages/studiocms_core/{src => assets}/public/favicon.svg (100%) delete mode 100644 packages/studiocms_core/env.d.ts delete mode 100644 packages/studiocms_core/src/db/tsTables.ts rename packages/{studiocms_auth => studiocms_core/src}/env.d.ts (76%) create mode 100644 packages/studiocms_core/src/utils/integrationLogger.ts create mode 100644 packages/studiocms_core/tsconfig.build.json rename packages/studiocms_dashboard/{src => assets}/components/BaseHead.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/DashboardPageHeader.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/DoubleSidebar.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/Footer.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/Header.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/InnerSidebarFolder.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/InnerSidebarLink.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/Layout.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/PageEditAndCreateForm.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/PageHeader.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/SidebarLink.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/SidebarPluginLink.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/SingleSidebar.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/StudioCMSLogo.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/component-scripts/TinyMDE.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/component-scripts/dateTimeListener.ts (100%) rename packages/studiocms_dashboard/{src => assets}/components/component-scripts/dateWithTimeAndZone.ts (100%) rename packages/studiocms_dashboard/{src => assets}/components/component-scripts/makeClientRoutable.ts (100%) rename packages/studiocms_dashboard/{src => assets}/components/component-scripts/timeAgo.ts (100%) rename packages/studiocms_dashboard/{src => assets}/components/index.ts (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/LoginChecker.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/configuration/ConfigForm.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/configuration/LightVsDark.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/content-mgmt/Create.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/content-mgmt/Edit.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/content-mgmt/PageHeader.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/content-mgmt/PageList.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/content-mgmt/TreeRenderer.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/content-mgmt/shared.ts (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/dashboard/DashboardGrid.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/dashboard/DashboardGridItem.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/dashboard/Test.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/dashboard/UserName.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/profile/BasicInfo.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/profile/BasicInfoFallback.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/profile/SocialSignin.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/profile/SocialSigninFallback.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/profile/UpdatePassword.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/profile/UpdatePasswordFallback.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/profile/oAuthButtonProviders.ts (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/sidebar/Admin.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/sidebar/Editor.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/sidebar/UserAccount.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/sidebar/VersionCheck.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/islands/sidebar/VersionCheckChangelog.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/shared-parts/VersionCheck.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/sidebarConfig.ts (100%) rename packages/studiocms_dashboard/{src => assets}/components/webVitalsParts/CoreVitalPanelCard.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/webVitalsParts/DataAnalyticsTable.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/webVitalsParts/PagespeedInsights.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/webVitalsParts/WebVitalPerCoreRouteTable.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/webVitalsParts/WebVitalPerCoreVital.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/webVitalsParts/WebVitalPerCoreVitalRoute.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/webVitalsParts/WebVitalPerRouteData.astro (100%) rename packages/studiocms_dashboard/{src => assets}/components/webVitalsParts/buildDataObject.ts (100%) rename packages/studiocms_dashboard/{src => assets}/components/webVitalsParts/buildPageRouteDataObject.ts (100%) rename packages/studiocms_dashboard/{src => assets}/components/webVitalsParts/buildPerPageDataObject.ts (100%) rename packages/studiocms_dashboard/{src => assets}/components/webVitalsParts/checkDate.ts (100%) rename packages/studiocms_dashboard/{src => assets}/components/webVitalsParts/getPageRouteReference.ts (100%) rename packages/studiocms_dashboard/{src => assets}/components/webVitalsParts/webVitalsUtils.ts (100%) rename packages/studiocms_dashboard/{src => assets}/firstTimeSetupRoutes/done.astro (100%) rename packages/studiocms_dashboard/{src => assets}/firstTimeSetupRoutes/main.astro (100%) rename packages/studiocms_dashboard/{src => assets}/routes/404.astro (100%) rename packages/studiocms_dashboard/{src => assets}/routes/configuration.astro (100%) rename packages/studiocms_dashboard/{src => assets}/routes/content-management.astro (100%) rename packages/studiocms_dashboard/{src => assets}/routes/index.astro (100%) rename packages/studiocms_dashboard/{src => assets}/routes/profile.astro (100%) rename packages/studiocms_dashboard/{src => assets}/routes/studiocms_api/LiveRender.astro (100%) rename packages/studiocms_dashboard/{src => assets}/routes/studiocms_api/config/admin.ts (100%) rename packages/studiocms_dashboard/{src => assets}/routes/studiocms_api/config/site.ts (100%) rename packages/studiocms_dashboard/{src => assets}/routes/studiocms_api/firstTimeSetup.ts (100%) rename packages/studiocms_dashboard/{src => assets}/routes/studiocms_api/pages/create.ts (100%) rename packages/studiocms_dashboard/{src => assets}/routes/studiocms_api/pages/delete.ts (100%) rename packages/studiocms_dashboard/{src => assets}/routes/studiocms_api/pages/edit.ts (100%) rename packages/studiocms_dashboard/{src => assets}/routes/user-management.astro (100%) rename packages/studiocms_dashboard/{src => assets}/styles/404.css (100%) rename packages/studiocms_dashboard/{src => assets}/styles/base.css (100%) rename packages/studiocms_dashboard/{src => assets}/styles/tiny-mde.css (100%) delete mode 100644 packages/studiocms_dashboard/src/utils/astroDb.ts create mode 100644 packages/studiocms_dashboard/src/utils/integrationLogger.ts create mode 100644 packages/studiocms_dashboard/tsconfig.build.json delete mode 100644 packages/studiocms_dashboard/virtuals.d.ts rename packages/studiocms_frontend/{src => }/components/BaseHead.astro (100%) rename packages/studiocms_frontend/{src => }/components/Footer.astro (100%) rename packages/studiocms_frontend/{src => }/components/Layout.astro (100%) rename packages/studiocms_frontend/{src => }/components/global.css (100%) rename packages/studiocms_frontend/{src => }/components/index.ts (100%) rename packages/studiocms_frontend/{src => }/routes/[...slug].astro (100%) rename packages/studiocms_frontend/{src => }/routes/index.astro (100%) delete mode 100644 packages/studiocms_frontend/src/hooks/configSetup.ts create mode 100644 packages/studiocms_frontend/src/utils/integrationLogger.ts create mode 100644 packages/studiocms_frontend/tsconfig.build.json rename packages/studiocms_imagehandler/{src => }/components/CustomImage.astro (90%) rename packages/studiocms_imagehandler/{src => }/components/index.ts (100%) rename packages/studiocms_imagehandler/{src => }/components/plugins/cloudinary.ts (95%) rename packages/studiocms_imagehandler/{src => }/components/props.ts (100%) delete mode 100644 packages/studiocms_imagehandler/src/hooks/configDone.ts delete mode 100644 packages/studiocms_imagehandler/src/hooks/configSetup.ts create mode 100644 packages/studiocms_imagehandler/src/utils/astroEnvConfig.ts create mode 100644 packages/studiocms_imagehandler/src/utils/integrationLogger.ts create mode 100644 packages/studiocms_imagehandler/tsconfig.build.json rename packages/studiocms_renderers/{src => }/components/Renderer.d.ts (100%) rename packages/studiocms_renderers/{src => }/components/Renderer.js (100%) create mode 100644 packages/studiocms_renderers/exports/index.ts rename packages/studiocms_renderers/{src => }/exports/markdocRenderers/markdocReact-components/MarkDocReactRenderer.tsx (100%) rename packages/studiocms_renderers/{src => }/exports/markdocRenderers/markdocReact-components/MarkDocReactWrapper.astro (73%) rename packages/studiocms_renderers/{src => }/exports/markdocRenderers/markdocReact.ts (98%) delete mode 100644 packages/studiocms_renderers/src/exports/index.ts delete mode 100644 packages/studiocms_renderers/src/hooks/config-done.ts delete mode 100644 packages/studiocms_renderers/src/hooks/config-setup.ts create mode 100644 packages/studiocms_renderers/src/index.d.ts create mode 100644 packages/studiocms_renderers/src/lib/astro-remark.d.ts create mode 100644 packages/studiocms_renderers/src/lib/contentRenderer.d.ts create mode 100644 packages/studiocms_renderers/src/lib/markdoc-renderers/markdocHTML.d.ts create mode 100644 packages/studiocms_renderers/src/lib/markdoc-renderers/markdocReactStatic.d.ts create mode 100644 packages/studiocms_renderers/src/lib/markdoc.d.ts create mode 100644 packages/studiocms_renderers/src/lib/mdx.d.ts create mode 100644 packages/studiocms_renderers/src/stubs/renderer-config.d.ts create mode 100644 packages/studiocms_renderers/src/stubs/renderer-markdownConfig.d.ts create mode 100644 packages/studiocms_renderers/src/stubs/renderer.d.ts create mode 100644 packages/studiocms_renderers/src/utils/integrationLogger.d.ts create mode 100644 packages/studiocms_renderers/src/utils/integrationLogger.ts create mode 100644 packages/studiocms_renderers/tsconfig.build.json create mode 100644 tsconfig.base.json diff --git a/.github/workflows/ci-pr-snapshots.yml b/.github/workflows/ci-pr-snapshots.yml index 2313c42360..96739c434e 100644 --- a/.github/workflows/ci-pr-snapshots.yml +++ b/.github/workflows/ci-pr-snapshots.yml @@ -15,6 +15,9 @@ jobs: - name: Install Tools & Dependencies uses: withstudiocms/automations/.github/actions/install@main + + - name: Run Prepublish + run: pnpm ci:prepublish - name: Publish packages run: pnpm ci:snapshot diff --git a/.github/workflows/ci-push-main.yml b/.github/workflows/ci-push-main.yml index c26ba4d2c1..90e14fbd7d 100644 --- a/.github/workflows/ci-push-main.yml +++ b/.github/workflows/ci-push-main.yml @@ -83,6 +83,9 @@ jobs: - name: Install Tools & Dependencies uses: withstudiocms/automations/.github/actions/install@main + - name: Run Prepublish + run: pnpm ci:prepublish + - name: Create Release Pull Request or Publish to npm id: changesets uses: changesets/action@v1 diff --git a/build-scripts/cmd/build.js b/build-scripts/cmd/build.js new file mode 100644 index 0000000000..9579052559 --- /dev/null +++ b/build-scripts/cmd/build.js @@ -0,0 +1,187 @@ +import { execSync } from 'node:child_process'; +import fs from 'node:fs/promises'; +import esbuild from 'esbuild'; +import { copy } from 'esbuild-plugin-copy'; +import glob from 'fast-glob'; +import { dim, gray, green, red, yellow } from 'kleur/colors'; + +/** @type {import('esbuild').BuildOptions} */ +const defaultConfig = { + minify: false, + format: 'esm', + platform: 'node', + target: 'node18', + sourcemap: false, + sourcesContent: false, +}; + +const dt = new Intl.DateTimeFormat('en-us', { + hour: '2-digit', + minute: '2-digit', +}); + +const dtsGen = (buildTsConfig) => ({ + name: 'TypeScriptDeclarationsPlugin', + setup(build) { + build.onEnd((result) => { + if (result.errors.length > 0) return; + const date = dt.format(new Date()); + console.log(`${dim(`[${date}]`)} Generating TypeScript declarations...`); + try { + const res = execSync( + `tsc --emitDeclarationOnly ${buildTsConfig ? '-p tsconfig.build.json' : ''} --outDir ./dist` + ); + console.log(res.toString()); + console.log(dim(`[${date}] `) + green('√ Generated TypeScript declarations')); + } catch (error) { + console.error(dim(`[${date}] `) + red(`${error}\n\n${error.stdout.toString()}`)); + } + }); + }, +}); + +const CopyConfig = { + assets: [ + { + from: ['./src/**/*.!(ts|js|css)'], + to: '.', + }, + ], +}; + +export default async function build(...args) { + const config = Object.assign({}, defaultConfig); + const isDev = args.slice(-1)[0] === 'IS_DEV'; + const patterns = args + .filter((f) => !!f) // remove empty args + .map((f) => f.replace(/^'/, '').replace(/'$/, '')); // Needed for Windows: glob strings contain surrounding string chars??? remove these + const entryPoints = [].concat( + ...(await Promise.all( + patterns.map((pattern) => glob(pattern, { filesOnly: true, absolute: true })) + )) + ); + const date = dt.format(new Date()); + + const noClean = args.includes('--no-clean-dist'); + const bundle = args.includes('--bundle'); + const forceCJS = args.includes('--force-cjs'); + const buildTsConfig = args.includes('--build-tsconfig'); + + const { type = 'module', dependencies = {} } = await readPackageJSON('./package.json'); + + config.define = {}; + for (const [key, value] of await getDefinedEntries()) { + config.define[`process.env.${key}`] = JSON.stringify(value); + } + const format = type === 'module' && !forceCJS ? 'esm' : 'cjs'; + + const outdir = 'dist'; + + if (!noClean) { + console.log( + `${dim(`[${date}]`)} Cleaning dist directory... ${dim(`(${entryPoints.length} files found)`)}` + ); + await clean(outdir); + } + + if (!isDev) { + console.log( + `${dim(`[${date}]`)} Building...${bundle ? '(Bundling)' : ''} ${dim(`(${entryPoints.length} files found)`)}` + ); + await esbuild.build({ + ...config, + bundle, + external: bundle ? Object.keys(dependencies) : undefined, + entryPoints, + outdir, + outExtension: forceCJS ? { '.js': '.cjs' } : {}, + format, + plugins: [copy(CopyConfig), dtsGen(buildTsConfig)], + }); + console.log(dim(`[${date}] `) + green('√ Build Complete')); + return; + } + + const rebuildPlugin = { + name: 'dev:rebuild', + setup(build) { + build.onEnd(async (result) => { + const date = dt.format(new Date()); + if (result?.errors.length) { + console.error(dim(`[${date}] `) + red(error || result.errors.join('\n'))); + } else { + if (result.warnings.length) { + console.info( + dim(`[${date}] `) + yellow(`! updated with warnings:\n${result.warnings.join('\n')}`) + ); + } + console.info(dim(`[${date}] `) + green('√ updated')); + } + }); + }, + }; + + const builder = await esbuild.context({ + ...config, + entryPoints, + outdir, + format, + sourcemap: 'linked', + plugins: [copy(CopyConfig), rebuildPlugin, dtsGen(buildTsConfig)], + }); + + console.log( + `${dim(`[${date}] `) + gray('Watching for changes...')} ${dim(`(${entryPoints.length} files found)`)}` + ); + await builder.watch(); + + process.on('beforeExit', () => { + builder.stop?.(); + }); +} + +async function clean(outdir) { + const files = await glob([`${outdir}/**`], { filesOnly: true }); + await Promise.all(files.map((file) => fs.rm(file, { force: true }))); +} + +/** + * Contextual `define` values to statically replace in the built JS output. + * Available to all packages, but mostly useful for CLIs like `create-astro`. + */ +async function getDefinedEntries() { + const define = { + /** The current version (at the time of building) for the current package, such as `astro` or `@astrojs/sitemap` */ + PACKAGE_VERSION: await getInternalPackageVersion('./package.json'), + /** The current version (at the time of building) for `typescript` */ + TYPESCRIPT_VERSION: await getWorkspacePackageVersion('typescript'), + }; + for (const [key, value] of Object.entries(define)) { + if (value === undefined) { + delete define[key]; + } + } + return Object.entries(define); +} + +async function readPackageJSON(path) { + return await fs.readFile(path, { encoding: 'utf8' }).then((res) => JSON.parse(res)); +} + +async function getInternalPackageVersion(path) { + return readPackageJSON(path).then((res) => res.version); +} + +async function getWorkspacePackageVersion(packageName) { + const { dependencies, devDependencies } = await readPackageJSON( + new URL('../../package.json', import.meta.url) + ); + const deps = { ...dependencies, ...devDependencies }; + const version = deps[packageName]; + if (!version) { + throw new Error( + `Unable to resolve "${packageName}". Is it a dependency of the workspace root?` + ); + } + return version.replace(/^\D+/, ''); +} diff --git a/build-scripts/index.js b/build-scripts/index.js new file mode 100755 index 0000000000..17a4d6e676 --- /dev/null +++ b/build-scripts/index.js @@ -0,0 +1,14 @@ +#!/usr/bin/env node +export default async function run() { + const [cmd, ...args] = process.argv.slice(2); + switch (cmd) { + case 'dev': + case 'build': { + const { default: build } = await import('./cmd/build.js'); + await build(...args, cmd === 'dev' ? 'IS_DEV' : undefined); + break; + } + } +} + +run(); diff --git a/build-scripts/jsconfig.json b/build-scripts/jsconfig.json new file mode 100644 index 0000000000..5cf3835e81 --- /dev/null +++ b/build-scripts/jsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "declaration": true, + "strict": true, + "module": "esnext", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "target": "esnext" + } +} diff --git a/build-scripts/package.json b/build-scripts/package.json new file mode 100644 index 0000000000..862fda8573 --- /dev/null +++ b/build-scripts/package.json @@ -0,0 +1,19 @@ +{ + "name": "build-scripts", + "version": "0.0.14", + "private": true, + "type": "module", + "main": "./index.js", + "bin": { + "build-scripts": "./index.js" + }, + "dependencies": { + "esbuild": "^0.24.2", + "esbuild-plugin-copy": "^2.1.1", + "fast-glob": "^3.3.2", + "kleur": "^4.1.5", + "p-limit": "^6.1.0", + "tinyexec": "^0.3.1", + "tsconfck": "^3.1.4" + } +} \ No newline at end of file diff --git a/package.json b/package.json index ab93ea9a82..4f0848dd58 100644 --- a/package.json +++ b/package.json @@ -6,16 +6,24 @@ "node": "20.14.0" }, "scripts": { - "build": "pnpm --filter node-playground build", + "build": "pnpm build:studiocms && pnpm --filter node-playground build", "build:docs": "pnpm --filter docs build", "docs:dev": "pnpm --filter docs dev", "playground:dev": "pnpm --filter node-playground dev", "playground:push": "pnpm --filter node-playground db:push", + "build:studiocms": "pnpm --filter studiocms --filter @studiocms/* build", + "dev:studiocms": "pnpm --stream --filter studiocms --filter @studiocms/* -r -parallel dev", + "dev": "pnpm --stream --filter studiocms --filter @studiocms/* --filter node-playground -r -parallel dev", + + "studiocms:build": "pnpm --filter studiocms build", + "cli:test": "pnpm studiocms", + "changeset": "changeset", "lint": "biome check .", "lint:fix": "biome check --write .", + "ci:prepublish": "pnpm build:studiocms", "ci:lunaria:build": "pnpm --filter docs lunaria:build", "ci:lunaria:report": "pnpm tsm --require=./scripts/filter-warnings.cjs ./www/docs/scripts/lunaria-report-bot.ts", "ci:translations:changeset": "tsm --require=./scripts/filter-warnings.cjs ./scripts/translation-changeset.ts", @@ -32,6 +40,8 @@ "@changesets/config": "3.0.3", "@changesets/changelog-github": "0.5.0", "@changesets/write": "0.3.2", + "build-scripts": "workspace:*", + "studiocms": "workspace:*", "execa": "9.5.1", "pkg-pr-new": "0.0.32", "typescript": "catalog:", diff --git a/packages/studiocms/.gitignore b/packages/studiocms/.gitignore index 4e02004cb0..8f18003eca 100644 --- a/packages/studiocms/.gitignore +++ b/packages/studiocms/.gitignore @@ -18,4 +18,6 @@ pnpm-debug.log* # macOS-specific files .DS_Store -.npmrc \ No newline at end of file +.npmrc + +dist/ \ No newline at end of file diff --git a/packages/studiocms/package.json b/packages/studiocms/package.json index cd4269db1d..29cd2342a3 100644 --- a/packages/studiocms/package.json +++ b/packages/studiocms/package.json @@ -35,13 +35,28 @@ }, "sideEffects": false, "files": [ - "src", + "dist", + "studiocms-cli.mjs", "CHANGELOG.md", "LICENSE", "README.md" ], + "scripts": { + "build": "build-scripts build 'src/**/*.ts'", + "dev": "build-scripts dev 'src/**/*.ts'" + }, + "bin": { + "studiocms": "./studiocms-cli.mjs" + }, "exports": { - ".": "./src/index.ts" + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./config": { + "types": "./dist/config.d.ts", + "default": "./dist/config.js" + } }, "type": "module", "dependencies": { @@ -63,14 +78,26 @@ "@inox-tools/runtime-logger": "catalog:studiocms-shared", "@matthiesenxyz/astrodtsbuilder": "catalog:studiocms-shared", - "@matthiesenxyz/integration-utils": "catalog:studiocms-shared", "rollup-plugin-copy": "catalog:studiocms-shared", "mdast": "catalog:studiocms-shared", "mdast-util-from-markdown": "catalog:studiocms-shared", "mdast-util-to-markdown": "catalog:studiocms-shared", "mdast-util-to-string": "catalog:studiocms-shared", - "unist-util-visit": "catalog:studiocms-shared" + "unist-util-visit": "catalog:studiocms-shared", + + "@bluwy/giget-core": "^0.1.2", + "@clack/core": "0.4.1", + "@clack/prompts": "0.9.1", + "@commander-js/extra-typings": "^13.0.0", + "commander": "^13.0.0", + "figlet": "^1.8.0", + "chalk": "^5.4.1", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0", + "log-update": "^6.1.0", + "boxen": "^8.0.1", + "lodash": "catalog:studiocms-shared" }, "peerDependencies": { "@astrojs/db": "catalog:min", @@ -80,6 +107,9 @@ "devDependencies": { "typescript": "catalog:", "@types/semver": "catalog:studiocms", - "@types/mdast": "catalog:studiocms-shared" + "@types/mdast": "catalog:studiocms-shared", + "@types/lodash": "catalog:studiocms-shared", + "@types/figlet": "^1.7.0", + "@types/node": "catalog:" } } diff --git a/packages/studiocms/src/cli/commander.ts b/packages/studiocms/src/cli/commander.ts new file mode 100644 index 0000000000..6b480c079a --- /dev/null +++ b/packages/studiocms/src/cli/commander.ts @@ -0,0 +1,107 @@ +import { + type CommandUnknownOpts, + type OutputConfiguration, + Command as _Command, + Help as _Help, +} from '@commander-js/extra-typings'; +import { type ChalkInstance, chalkStderr as chalkStdErr, default as chalkStdOut } from 'chalk'; +import stripAnsi from 'strip-ansi'; +import wrapAnsi from 'wrap-ansi'; +import { StudioCMSColorwayError, date, supportsColor } from './utils.js'; + +export class Help extends _Help { + chalk: ChalkInstance; + colorway: ChalkInstance; + colorwayError: ChalkInstance = StudioCMSColorwayError; + sortOptions = true; + sortSubcommands = true; + showGlobalOptions = true; + subcommandTerm = (cmd: CommandUnknownOpts) => + cmd.name() === 'interactive' + ? `${this.colorway(cmd.name())}${this.colorwayError('*')}` + : this.colorway(cmd.name()); + subcommandDescription = (cmd: CommandUnknownOpts) => { + const desc = cmd.summary() || cmd.description(); + return desc; + }; + + constructor() { + super(); + this.chalk = chalkStdOut; + this.colorway = this.chalk.hex('#a581f3'); + } + + prepareContext(contextOptions: { + error?: boolean; + helpWidth?: number; + outputHasColors?: boolean; + }) { + super.prepareContext(contextOptions); + if (contextOptions?.error) { + this.chalk = chalkStdErr; + } + } + + displayWidth(str: string) { + return stripAnsi(str).length; // use imported package + } + + boxWrap(str: string, width: number) { + return wrapAnsi(str, width, { hard: true }); // use imported package + } + + styleTitle(str: string) { + return this.chalk.bold(str); + } + styleCommandText(str: string) { + return this.chalk.cyan(str); + } + styleCommandDescription(str: string) { + return this.chalk.magenta(str); + } + styleDescriptionText(str: string) { + return this.chalk.italic(str); + } + styleOptionText(str: string) { + return this.chalk.green(str); + } + styleArgumentText(str: string) { + return this.chalk.yellow(str); + } + styleSubcommandText(str: string) { + return str; + } +} + +export class Command extends _Command { + chalk: ChalkInstance = chalkStdOut; + colorwayError = StudioCMSColorwayError; + supportsColor = supportsColor; + max = process.stdout.columns; + prefix = this.max < 80 ? ' ' : ' '.repeat(2); + + _outputConfiguration: OutputConfiguration | undefined = { + writeOut: (str) => process.stdout.write(str), + writeErr: (str) => process.stdout.write(`ERROR [${date}]: ${str}`), + // Output errors in red. + outputError: (str, write) => + write(`${this.chalk.red.bold(`ERROR [${date}]:`)} ${this.chalk.red(str)}`), + getOutHelpWidth: () => (process.stdout.isTTY ? (process.stdout.columns ?? 80) : 80), + getErrHelpWidth: () => (process.stderr.isTTY ? (process.stderr.columns ?? 80) : 80), + getOutHasColors: () => this.supportsColor, + getErrHasColors: () => this.supportsColor, + stripColor: (str) => stripAnsi(str), + }; + + createCommand(name: string | undefined) { + return new Command(name); + } + + createHelp() { + return Object.assign(new Help(), this.configureHelp()); + } +} + +export type newInstanceCommand = InstanceType; + +export type instanceCommand = InstanceType; diff --git a/packages/studiocms/src/cli/index.ts b/packages/studiocms/src/cli/index.ts new file mode 100644 index 0000000000..0d4c903c22 --- /dev/null +++ b/packages/studiocms/src/cli/index.ts @@ -0,0 +1,24 @@ +import { Option } from '@commander-js/extra-typings'; +import pkgJson from '../../package.json' assert { type: 'json' }; +import { Command } from './commander.js'; +import { CLITitle, logger } from './utils.js'; + +export async function main() { + logger.log('Starting StudioCMS CLI Utility Toolkit...'); + + const program = new Command('studiocms') + .description('StudioCMS CLI Utility Toolkit') + .version(pkgJson.version) + .addHelpText('beforeAll', CLITitle) + .showHelpAfterError('(add --help for additional information)') + .enablePositionalOptions(true) + .helpOption('-h, --help', 'Display help for command.') + .addOption(new Option('--color', 'Force color output')) // implemented by chalk + .addOption(new Option('--no-color', 'Disable color output')) // implemented by chalk + .helpCommand('help [cmd]', 'Show help for command'); // Enable help command; + + // Add Commands + program.command('help-default', { isDefault: true, hidden: true }).action(() => program.help()); + + await program.parseAsync(); +} diff --git a/packages/studiocms/src/cli/utils.ts b/packages/studiocms/src/cli/utils.ts new file mode 100644 index 0000000000..a7e42f6d35 --- /dev/null +++ b/packages/studiocms/src/cli/utils.ts @@ -0,0 +1,249 @@ +import { exec } from 'node:child_process'; +import type { Key } from 'node:readline'; +import readline from 'node:readline'; +import _boxen, { type Options as BoxenOptions } from 'boxen'; +import chalk from 'chalk'; +import figlet from 'figlet'; +import { createLogUpdate } from 'log-update'; + +export const ASCIIText = figlet.textSync('StudioCMS'); + +export const dt = new Intl.DateTimeFormat('en-us', { + hour: '2-digit', + minute: '2-digit', +}); + +export const date = dt.format(new Date()); + +export const supportsColor = chalk.level > 0; + +export const StudioCMSColorway = chalk.hex('#a581f3'); +export const StudioCMSColorwayBg = chalk.bgHex('#a581f3'); +export const StudioCMSColorwayInfo = chalk.hex('#22c55e'); +export const StudioCMSColorwayInfoBg = chalk.bgHex('#22c55e'); +export const StudioCMSColorwayWarn = chalk.hex('#facc14'); +export const StudioCMSColorwayWarnBg = chalk.bgHex('#facc14'); +export const StudioCMSColorwayError = chalk.hex('#bd0249'); +export const StudioCMSColorwayErrorBg = chalk.bgHex('#bd0249'); + +export const CLITitle = supportsColor ? StudioCMSColorway.bold(`${ASCIIText}\n`) : `${ASCIIText}\n`; + +let stdout = process.stdout; + +const stdin = process.stdin; + +/** @internal Used to mock `process.stdout.write` for testing purposes */ +export function setStdout(writable: typeof process.stdout) { + stdout = writable; +} + +export const action = (key: Key, isSelect: boolean) => { + if (key.meta && key.name !== 'escape') return; + + if (key.ctrl) { + if (key.name === 'a') return 'first'; + if (key.name === 'c') return 'abort'; + if (key.name === 'd') return 'abort'; + if (key.name === 'e') return 'last'; + if (key.name === 'g') return 'reset'; + } + + if (isSelect) { + if (key.name === 'j') return 'down'; + if (key.name === 'k') return 'up'; + if (key.ctrl && key.name === 'n') return 'down'; + if (key.ctrl && key.name === 'p') return 'up'; + } + + if (key.name === 'return') return 'submit'; + if (key.name === 'enter') return 'submit'; // ctrl + J + if (key.name === 'backspace') return 'delete'; + if (key.name === 'delete') return 'deleteForward'; + if (key.name === 'abort') return 'abort'; + if (key.name === 'escape') return 'exit'; + if (key.name === 'tab') return 'next'; + if (key.name === 'pagedown') return 'nextPage'; + if (key.name === 'pageup') return 'prevPage'; + // TODO create home() in prompt types (e.g. TextPrompt) + if (key.name === 'home') return 'home'; + // TODO create end() in prompt types (e.g. TextPrompt) + if (key.name === 'end') return 'end'; + + if (key.name === 'up') return 'up'; + if (key.name === 'down') return 'down'; + if (key.name === 'right') return 'right'; + if (key.name === 'left') return 'left'; + + return false; +}; + +export function boxen( + header?: string, + body?: { ln1?: string; ln2?: string; ln3?: string; ln4?: string }, + footer?: string +) { + const baseBoxenOpts: BoxenOptions = { padding: 1, borderStyle: 'none' }; + const prefix = stdout.columns < 80 ? ' ' : ' '.repeat(4); + const boxContent: string[] = []; + + const logo = _boxen( + [ + `${chalk.white.bold(' ████')}`, + `${chalk.white.bold(' █ ████')}`, + `${chalk.white.bold('█ █▄▄▄ ')}`, + `${chalk.white.bold('█▄▄▄ ')}`, + ].join('\n'), + { + ...baseBoxenOpts, + backgroundColor: 'black', + } + ).split('\n'); + + if (header) { + boxContent.push(`${header}\n`); + } + + boxContent.push( + ...[ + logo[0], + `${logo[1]}${prefix}${body?.ln1 || ''}`, + `${logo[2]}${prefix}${body?.ln2 || ''}`, + `${logo[3]}${prefix}${body?.ln3 || ''}`, + `${logo[4]}${prefix}${body?.ln4 || ''}`, + logo[5], + ] + ); + + if (footer) { + boxContent.push(`\n${footer}`); + } + + return _boxen(boxContent.join('\n'), baseBoxenOpts); +} + +const send = (message: string) => stdout.write(`${message}\n`); + +export const logger = { + log: (message: string) => { + if (!supportsColor) { + send(`[${date}]: ${message}`); + return; + } + send(`${chalk.blue.bold(`[${date}]:`)} ${message}`); + }, + debug: (message: string) => { + if (!supportsColor) { + send(`DEBUG [${date}]: ${message}`); + return; + } + send(`${chalk.blue.bold(`DEBUG [${date}]:`)} ${message}`); + }, + error: (message: string) => { + if (!supportsColor) { + send(`ERROR [${date}]: ${message}`); + return; + } + send(`${chalk.red.bold(`ERROR [${date}]:`)} ${chalk.red(message)}`); + }, + warn: (message: string) => { + if (!supportsColor) { + send(`WARN [${date}]: ${message}`); + return; + } + send(`${chalk.yellow.bold(`WARN [${date}]:`)} ${chalk.yellow(message)}`); + }, +}; + +export const say = async (msg: string | string[] = [], { clear = false } = {}) => { + const messages = Array.isArray(msg) ? msg : [msg]; + const rl = readline.createInterface({ input: stdin, escapeCodeTimeout: 50 }); + const logUpdate = createLogUpdate(stdout, { showCursor: false }); + readline.emitKeypressEvents(stdin, rl); + let i = 0; + let cancelled = false; + const done = async () => { + stdin.off('keypress', done); + if (stdin.isTTY) stdin.setRawMode(false); + rl.close(); + cancelled = true; + if (i < messages.length - 1) { + logUpdate.clear(); + } else if (clear) { + logUpdate.clear(); + } else { + logUpdate.done(); + } + }; + + if (stdin.isTTY) stdin.setRawMode(true); + stdin.on('keypress', (str, key) => { + if (stdin.isTTY) stdin.setRawMode(true); + const k = action(key, true); + if (k === 'abort') { + done(); + return process.exit(0); + } + // biome-ignore lint/suspicious/noExplicitAny: + if (['up', 'down', 'left', 'right'].includes(k as any)) return; + done(); + }); + + for (let message of messages) { + // biome-ignore lint/correctness/noSelfAssign: + message = message; + const _message = Array.isArray(message) ? message : message.split(' '); + const msg = []; + let j = 0; + for (let word of [''].concat(_message)) { + // biome-ignore lint/correctness/noSelfAssign: + word = word; + if (word) msg.push(word); + logUpdate(`\n${boxen(undefined, { ln3: msg.join(' ') })}`); + if (!cancelled) await sleep(randomBetween(75, 200)); + j++; + } + if (!cancelled) await sleep(100); + const tmp = await Promise.all(_message).then((res) => res.join(' ')); + const text = `\n${boxen(undefined, { ln3: tmp })}`; + logUpdate(text); + if (!cancelled) await sleep(randomBetween(1200, 1400)); + i++; + } + stdin.off('keypress', done); + await sleep(100); + done(); + if (stdin.isTTY) stdin.setRawMode(false); + stdin.removeAllListeners('keypress'); +}; + +export const randomBetween = (min: number, max: number) => + Math.floor(Math.random() * (max - min + 1) + min); + +// biome-ignore lint/suspicious/noExplicitAny: +export const random = (...arr: any[]) => { + const flattenedArray = arr.flat(1); + return flattenedArray[Math.floor(flattenedArray.length * Math.random())]; +}; + +export const label = (text: string, c = StudioCMSColorwayBg, t = chalk.whiteBright) => + c(` ${t(text)} `); + +export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +export const getName = () => + new Promise((resolve) => { + exec('git config user.name', { encoding: 'utf-8' }, (_1, gitName) => { + if (gitName.trim()) { + return resolve(gitName.split(' ')[0].trim()); + } + exec('whoami', { encoding: 'utf-8' }, (_3, whoami) => { + if (whoami.trim()) { + return resolve(whoami.split(' ')[0].trim()); + } + return resolve('StudioCMS User'); + }); + }); + }); + +export const cancelMessage = + "Operation cancelled, exiting... If you're stuck, join us at https://chat.studiocms.dev"; diff --git a/packages/studiocms/src/config.ts b/packages/studiocms/src/config.ts new file mode 100644 index 0000000000..29b1a3719a --- /dev/null +++ b/packages/studiocms/src/config.ts @@ -0,0 +1,21 @@ +import { + type CustomRenderer, + type Renderer, + type SafePluginListType, + type StudioCMSOptions, + type StudioCMSPlugin, + type StudioCMSPluginOptions, + definePlugin, +} from '@studiocms/core/schemas'; +import { defineStudioCMSConfig } from '@studiocms/core/utils'; + +export { + defineStudioCMSConfig, + definePlugin, + type StudioCMSPlugin, + type CustomRenderer, + type Renderer, + type StudioCMSOptions, + type StudioCMSPluginOptions, + type SafePluginListType, +}; diff --git a/packages/studiocms/src/hooks/build-done.ts b/packages/studiocms/src/hooks/build-done.ts deleted file mode 100644 index 3ea0476c4a..0000000000 --- a/packages/studiocms/src/hooks/build-done.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { integrationLogger } from '@matthiesenxyz/integration-utils/astroUtils'; -import { defineUtility } from 'astro-integration-kit'; -import type { Messages } from '../types'; - -export const buildDone = defineUtility('astro:build:done')( - ({ logger }, verbose: boolean, messages: Messages) => { - // Log messages at the end of the build - for (const { label, message, logLevel } of messages) { - integrationLogger( - { - logger: logger.fork(label), - logLevel, - verbose: logLevel === 'info' ? verbose : true, - }, - message - ); - } - } -); - -export default buildDone; diff --git a/packages/studiocms/src/hooks/config-done.ts b/packages/studiocms/src/hooks/config-done.ts deleted file mode 100644 index cad9554353..0000000000 --- a/packages/studiocms/src/hooks/config-done.ts +++ /dev/null @@ -1,56 +0,0 @@ -import astroDTSBuilder from '@matthiesenxyz/astrodtsbuilder'; -import { createResolver, defineUtility } from 'astro-integration-kit'; -import type { Messages } from '../types'; - -const { resolve } = createResolver(import.meta.url); - -export const configDone = defineUtility('astro:config:done')( - ({ injectTypes }, messages: Messages) => { - // Make DTS file for StudioCMS Plugins Virtual Module - const dtsFile = astroDTSBuilder(); - - dtsFile.addSingleLineNote( - 'This file is auto-generated by StudioCMS and should not be modified.' - ); - - dtsFile.addModule('studiocms:plugins', { - defaultExport: { - typeDef: `import('${resolve('../index.ts')}').SafePluginListType`, - }, - }); - - dtsFile.addModule('studiocms:changelog', { - defaultExport: { - typeDef: 'string', - }, - }); - - dtsFile.addModule('studiocms:mode', { - defaultExport: { - typeDef: `{ output: 'static' | 'server', prerenderRoutes: boolean }`, - }, - namedExports: [ - { - name: 'output', - typeDef: `'static' | 'server'`, - }, - { - name: 'prerenderRoutes', - typeDef: 'boolean', - }, - ], - }); - - // Inject the DTS file - injectTypes(dtsFile.makeAstroInjectedType('plugins.d.ts')); - - // Log Setup Complete - messages.push({ - label: 'studiocms:setup', - logLevel: 'info', - message: 'Setup Complete. 🚀', - }); - } -); - -export default configDone; diff --git a/packages/studiocms/src/hooks/config-setup.ts b/packages/studiocms/src/hooks/config-setup.ts deleted file mode 100644 index eeca4ca2fe..0000000000 --- a/packages/studiocms/src/hooks/config-setup.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { addIntegrationArray } from '@matthiesenxyz/integration-utils/aikUtils'; -import { - integrationLogger, - nodeNamespaceBuiltinsAstro as nodeNamespace, -} from '@matthiesenxyz/integration-utils/astroUtils'; -import auth from '@studiocms/auth'; -import core from '@studiocms/core'; -import { StudioCMSError } from '@studiocms/core/errors'; -import type { SafePluginListType, StudioCMSConfig } from '@studiocms/core/schemas'; -import { checkAstroConfig, configResolver, watchStudioCMSConfig } from '@studiocms/core/utils'; -import dashboard from '@studiocms/dashboard'; -import frontend from '@studiocms/frontend'; -import imageHandler from '@studiocms/imagehandler'; -import renderers from '@studiocms/renderers'; -import robotsTXT from '@studiocms/robotstxt'; -import ui from '@studiocms/ui'; -import { addVirtualImports, defineUtility } from 'astro-integration-kit'; -import { compare as semCompare } from 'semver'; -import type { ConfigSetupOptions } from '../types'; -import { changelogHelper } from '../utils/changelog'; - -export const configSetup = defineUtility('astro:config:setup')( - async (params, o: ConfigSetupOptions) => { - // Destructure the params - const { - logger, - config: { output }, - } = params; - - // Destructure the options - const { messages, opts, pkgName, pkgVersion } = o; - - logger.info('Checking configuration...'); - - // Watch the StudioCMS Config File(s) for changes (including creation/deletion) - const configFileResponse = watchStudioCMSConfig(params); - if (configFileResponse) { - messages.push({ - label: 'studiocms:config', - logLevel: 'error', - message: configFileResponse, - }); - } - - // Resolve Options - const options: StudioCMSConfig = await configResolver(params, opts); - - const { - verbose, - rendererConfig, - defaultFrontEndConfig, - includedIntegrations, - plugins, - dashboardConfig: { prerender }, - } = options; - - // Check if the dashboard routes should be prerendered - const prerenderRoutes = output === 'static' || prerender; - - // Setup Logger - integrationLogger({ logger, logLevel: 'info', verbose }, 'Setting up StudioCMS...'); - - // Check Astro Config for required settings - checkAstroConfig(params); - - // Setup Logger - integrationLogger({ logger, logLevel: 'info', verbose }, 'Setting up StudioCMS internals...'); - - // Setup StudioCMS Integrations Array (Default Integrations) - const integrations = [ - { integration: nodeNamespace() }, - { integration: ui() }, - { integration: core(options, prerenderRoutes) }, - { integration: renderers(rendererConfig, verbose) }, - { integration: imageHandler(options) }, - { integration: auth(options, prerenderRoutes) }, - { integration: dashboard(options, prerenderRoutes) }, - ]; - - // Frontend Integration (Default) - if (defaultFrontEndConfig !== false) { - integrations.push({ integration: frontend(options) }); - } - - integrationLogger({ logger, logLevel: 'info', verbose }, 'Adding optional integrations...'); - - // Robots.txt Integration (Default) - if (includedIntegrations.robotsTXT === true) { - integrations.push({ integration: robotsTXT() }); - } else if (typeof includedIntegrations.robotsTXT === 'object') { - integrations.push({ integration: robotsTXT(includedIntegrations.robotsTXT) }); - } - - // Initialize and Add the default StudioCMS Plugin to the Safe Plugin List - const safePluginList: SafePluginListType = [ - { - name: 'StudioCMS (Default)', - identifier: 'studiocms', - pageTypes: [{ label: 'Normal (StudioCMS)', identifier: 'studiocms' }], - }, - ]; - - integrationLogger({ logger, logLevel: 'info', verbose }, 'Setting up StudioCMS plugins...'); - - // Resolve StudioCMS Plugins - for (const { - name, - identifier, - studiocmsMinimumVersion, - integration, - frontendNavigationLinks, - pageTypes, - settingsPage, - } of plugins || []) { - // Check if the identifier is reserved - if (identifier === 'studiocms') { - throw new StudioCMSError( - 'Plugin Identifier "studiocms" is reserved for the default StudioCMS package.', - `Plugin ${name} has the identifier "studiocms" which is reserved for the default StudioCMS package, please change the identifier to something else, if the plugin is from a third party, please contact the author to change the identifier.` - ); - } - - // Check if the plugin has a minimum version requirement - const comparison = semCompare(studiocmsMinimumVersion, pkgVersion); - - if (comparison === 1) { - throw new StudioCMSError( - `Plugin ${name} requires StudioCMS version ${studiocmsMinimumVersion} or higher.`, - `Plugin ${name} requires StudioCMS version ${studiocmsMinimumVersion} or higher, please update StudioCMS to the required version, contact the plugin author to update the minimum version requirement or remove the plugin from the StudioCMS config.` - ); - } - - // Add the plugin Integration to the Astro config - if (integration && Array.isArray(integration)) { - integrations.push(...integration.map((integration) => ({ integration }))); - } else if (integration) { - integrations.push({ integration }); - } - - safePluginList.push({ - identifier, - name, - frontendNavigationLinks, - pageTypes, - settingsPage, - }); - } - - // Setup Integrations - addIntegrationArray(params, integrations); - - // Generate the Virtual Imports for the plugins - addVirtualImports(params, { - name: pkgName, - imports: { - 'studiocms:plugins': `export default ${JSON.stringify(safePluginList)};`, - 'studiocms:mode': ` - export const output = ${JSON.stringify(output)}; - export const prerenderRoutes = ${prerenderRoutes}; - export default { output, prerenderRoutes }; - `, - }, - }); - - let pluginListLength = 0; - let pluginListMessage = ''; - - pluginListLength = safePluginList.length; - pluginListMessage = safePluginList.map((p, i) => ` ${i + 1}. ${p.name}`).join('\n'); - - o.messages.push({ - label: 'studiocms:plugins', - logLevel: 'info', - message: `Currently Installed StudioCMS Plugins: (${pluginListLength})\n${pluginListMessage}`, - }); - - changelogHelper(params); - - return options as StudioCMSConfig; - } -); - -export default configSetup; diff --git a/packages/studiocms/src/hooks/db-setup.ts b/packages/studiocms/src/hooks/db-setup.ts deleted file mode 100644 index d06548d9ea..0000000000 --- a/packages/studiocms/src/hooks/db-setup.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineUtility } from 'astro-integration-kit'; - -export const dbSetup = defineUtility('astro:db:setup')(({ extendDb }) => { - extendDb({ configEntrypoint: '@studiocms/core/db/config' }); -}); - -export default dbSetup; diff --git a/packages/studiocms/src/hooks/server-start.ts b/packages/studiocms/src/hooks/server-start.ts deleted file mode 100644 index 986e2d4fb8..0000000000 --- a/packages/studiocms/src/hooks/server-start.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { integrationLogger } from '@matthiesenxyz/integration-utils/astroUtils'; -import { defineUtility } from 'astro-integration-kit'; -import packageJson from 'package-json'; -import { compare as semCompare } from 'semver'; -import type { ServerStartOptions } from '../types'; - -export const serverStart = defineUtility('astro:server:start')( - async ({ logger: l }, { messages, pkgName, pkgVersion, verbose }: ServerStartOptions) => { - const logger = l.fork(`${pkgName}:update-check`); - - try { - const { version: latestVersion } = await packageJson(pkgName.toLowerCase()); - - const comparison = semCompare(pkgVersion, latestVersion); - - if (comparison === -1) { - logger.warn( - `A new version of '${pkgName}' is available. Please update to ${latestVersion} using your favorite package manager.` - ); - } else if (comparison === 0) { - logger.info(`You are using the latest version of '${pkgName}' (${pkgVersion})`); - } else { - logger.info( - `You are using a newer version (${pkgVersion}) of '${pkgName}' than the latest release (${latestVersion})` - ); - } - } catch (error) { - if (error instanceof Error) { - logger.error(`Error fetching latest version from npm registry: ${error.message}`); - } else { - // Handle the case where error is not an Error object - logger.error( - 'An unknown error occurred while fetching the latest version from the npm registry.' - ); - } - } - - // Log all messages - for (const { label, message, logLevel } of messages) { - integrationLogger( - { - logger: l.fork(label), - logLevel, - verbose: logLevel === 'info' ? verbose : true, - }, - message - ); - } - } -); - -export default serverStart; diff --git a/packages/studiocms/src/index.ts b/packages/studiocms/src/index.ts index dd718f4c05..ca451fcaf9 100644 --- a/packages/studiocms/src/index.ts +++ b/packages/studiocms/src/index.ts @@ -1,22 +1,31 @@ -import { - type CustomRenderer, - type Renderer, - type SafePluginListType, - type StudioCMSConfig, - type StudioCMSOptions, - type StudioCMSPlugin, - type StudioCMSPluginOptions, - definePlugin, +import astroDTSBuilder from '@matthiesenxyz/astrodtsbuilder'; +import auth from '@studiocms/auth'; +import core from '@studiocms/core'; +import { StudioCMSError } from '@studiocms/core/errors'; +import type { + SafePluginListType, + StudioCMSConfig, + StudioCMSOptions, } from '@studiocms/core/schemas'; -import { defineStudioCMSConfig } from '@studiocms/core/utils'; +import dashboard from '@studiocms/dashboard'; +import frontend from '@studiocms/frontend'; +import imageHandler from '@studiocms/imagehandler'; +import renderers from '@studiocms/renderers'; +import robotsTXT from '@studiocms/robotstxt'; +import ui from '@studiocms/ui'; import type { AstroIntegration } from 'astro'; -import { name as pkgName, version as pkgVersion } from '../package.json'; -import buildDone from './hooks/build-done'; -import configDone from './hooks/config-done'; -import configSetup from './hooks/config-setup'; -import dbSetup from './hooks/db-setup'; -import serverStart from './hooks/server-start'; -import type { Messages } from './types'; +import { addVirtualImports, createResolver } from 'astro-integration-kit'; +import packageJson from 'package-json'; +import { compare as semCompare } from 'semver'; +import { name as pkgName, version as pkgVersion } from '../package.json' assert { type: 'json' }; +import type { Messages } from './types.js'; +import { addIntegrationArray } from './utils/addIntegrationArray.js'; +import { checkAstroConfig } from './utils/astroConfigCheck.js'; +import { changelogHelper } from './utils/changelog.js'; +import { watchStudioCMSConfig } from './utils/configManager.js'; +import { configResolver } from './utils/configResolver.js'; +import { integrationLogger } from './utils/integrationLogger.js'; +import { nodeNamespaceBuiltinsAstro } from './utils/integrations.js'; /** * **StudioCMS Integration** @@ -33,35 +42,279 @@ export function studioCMSIntegration(opts?: StudioCMSOptions): AstroIntegration // Messages Array for Logging const messages: Messages = []; + const { resolve } = createResolver(import.meta.url); + return { name: pkgName, hooks: { // DB Setup: Setup the Database Connection for AstroDB and StudioCMS - 'astro:db:setup': (params) => dbSetup(params), + // @ts-expect-error - This is a custom Integration Hook + 'astro:db:setup': ({ extendDb }) => { + extendDb({ configEntrypoint: '@studiocms/core/db/config' }); + }, // Config Setup: Main Setup for StudioCMS 'astro:config:setup': async (params) => { - options = await configSetup(params, { pkgName, pkgVersion, opts, messages }); + // options = await configSetup(params, { pkgName, pkgVersion, opts, messages }); + // Destructure the params + const { + logger, + config: { output }, + } = params; + + logger.info('Checking configuration...'); + + const configFileResponse = watchStudioCMSConfig(params); + + if (configFileResponse) { + messages.push({ + label: 'studiocms:config', + logLevel: 'error', + message: configFileResponse, + }); + } + + options = await configResolver(params, opts); + + const { + verbose, + rendererConfig, + defaultFrontEndConfig, + includedIntegrations, + plugins, + dashboardConfig: { prerender }, + } = options; + + // Check if the dashboard routes should be prerendered + const prerenderRoutes = output === 'static' || prerender; + + // Setup Logger + integrationLogger({ logger, logLevel: 'info', verbose }, 'Setting up StudioCMS...'); + + // Check Astro Config for required settings + checkAstroConfig(params); + + // Setup Logger + integrationLogger( + { logger, logLevel: 'info', verbose }, + 'Setting up StudioCMS internals...' + ); + + // Setup StudioCMS Integrations Array (Default Integrations) + const integrations = [ + { integration: nodeNamespaceBuiltinsAstro() }, + { integration: ui() }, + { integration: core(options, prerenderRoutes) }, + { integration: renderers(rendererConfig, verbose) }, + { integration: imageHandler(options) }, + { integration: auth(options, prerenderRoutes) }, + { integration: dashboard(options, prerenderRoutes) }, + ]; + + // Frontend Integration (Default) + if (defaultFrontEndConfig !== false) { + integrations.push({ integration: frontend(options) }); + } + + integrationLogger({ logger, logLevel: 'info', verbose }, 'Adding optional integrations...'); + + // Robots.txt Integration (Default) + if (includedIntegrations.robotsTXT === true) { + integrations.push({ integration: robotsTXT() }); + } else if (typeof includedIntegrations.robotsTXT === 'object') { + integrations.push({ integration: robotsTXT(includedIntegrations.robotsTXT) }); + } + + // Initialize and Add the default StudioCMS Plugin to the Safe Plugin List + const safePluginList: SafePluginListType = [ + { + name: 'StudioCMS (Default)', + identifier: 'studiocms', + pageTypes: [{ label: 'Normal (StudioCMS)', identifier: 'studiocms' }], + }, + ]; + + integrationLogger({ logger, logLevel: 'info', verbose }, 'Setting up StudioCMS plugins...'); + + // Resolve StudioCMS Plugins + for (const { + name, + identifier, + studiocmsMinimumVersion, + integration, + frontendNavigationLinks, + pageTypes, + settingsPage, + } of plugins || []) { + // Check if the identifier is reserved + if (identifier === 'studiocms') { + throw new StudioCMSError( + 'Plugin Identifier "studiocms" is reserved for the default StudioCMS package.', + `Plugin ${name} has the identifier "studiocms" which is reserved for the default StudioCMS package, please change the identifier to something else, if the plugin is from a third party, please contact the author to change the identifier.` + ); + } + + // Check if the plugin has a minimum version requirement + const comparison = semCompare(studiocmsMinimumVersion, pkgVersion); + + if (comparison === 1) { + throw new StudioCMSError( + `Plugin ${name} requires StudioCMS version ${studiocmsMinimumVersion} or higher.`, + `Plugin ${name} requires StudioCMS version ${studiocmsMinimumVersion} or higher, please update StudioCMS to the required version, contact the plugin author to update the minimum version requirement or remove the plugin from the StudioCMS config.` + ); + } + + // Add the plugin Integration to the Astro config + if (integration && Array.isArray(integration)) { + integrations.push(...integration.map((integration) => ({ integration }))); + } else if (integration) { + integrations.push({ integration }); + } + + safePluginList.push({ + identifier, + name, + frontendNavigationLinks, + pageTypes, + settingsPage, + }); + } + + // Setup Integrations + addIntegrationArray(params, integrations); + + // Generate the Virtual Imports for the plugins + addVirtualImports(params, { + name: pkgName, + imports: { + 'studiocms:plugins': `export default ${JSON.stringify(safePluginList)};`, + 'studiocms:mode': ` + export const output = ${JSON.stringify(output)}; + export const prerenderRoutes = ${prerenderRoutes}; + export default { output, prerenderRoutes }; + `, + }, + }); + + let pluginListLength = 0; + let pluginListMessage = ''; + + pluginListLength = safePluginList.length; + pluginListMessage = safePluginList.map((p, i) => ` ${i + 1}. ${p.name}`).join('\n'); + + messages.push({ + label: 'studiocms:plugins', + logLevel: 'info', + message: `Currently Installed StudioCMS Plugins: (${pluginListLength})\n${pluginListMessage}`, + }); + + changelogHelper(params); }, // Config Done: Make DTS file for StudioCMS Plugins Virtual Module - 'astro:config:done': (params) => configDone(params, messages), + 'astro:config:done': ({ injectTypes }) => { + // Make DTS file for StudioCMS Plugins Virtual Module + const dtsFile = astroDTSBuilder(); + + dtsFile.addSingleLineNote( + 'This file is auto-generated by StudioCMS and should not be modified.' + ); + + dtsFile.addModule('studiocms:plugins', { + defaultExport: { + typeDef: `import('${resolve('../index.ts')}').SafePluginListType`, + }, + }); + + dtsFile.addModule('studiocms:changelog', { + defaultExport: { + typeDef: 'string', + }, + }); + + dtsFile.addModule('studiocms:mode', { + defaultExport: { + typeDef: `{ output: 'static' | 'server', prerenderRoutes: boolean }`, + }, + namedExports: [ + { + name: 'output', + typeDef: `'static' | 'server'`, + }, + { + name: 'prerenderRoutes', + typeDef: 'boolean', + }, + ], + }); + + // Inject the DTS file + injectTypes(dtsFile.makeAstroInjectedType('plugins.d.ts')); + + // Log Setup Complete + messages.push({ + label: 'studiocms:setup', + logLevel: 'info', + message: 'Setup Complete. 🚀', + }); + }, // DEV SERVER: Check for updates on server start and log messages - 'astro:server:start': async (params) => - await serverStart(params, { pkgName, pkgVersion, verbose: options.verbose, messages }), + 'astro:server:start': async ({ logger: l }) => { + const logger = l.fork(`${pkgName}:update-check`); + + try { + const { version: latestVersion } = await packageJson(pkgName.toLowerCase()); + + const comparison = semCompare(pkgVersion, latestVersion); + + if (comparison === -1) { + logger.warn( + `A new version of '${pkgName}' is available. Please update to ${latestVersion} using your favorite package manager.` + ); + } else if (comparison === 0) { + logger.info(`You are using the latest version of '${pkgName}' (${pkgVersion})`); + } else { + logger.info( + `You are using a newer version (${pkgVersion}) of '${pkgName}' than the latest release (${latestVersion})` + ); + } + } catch (error) { + if (error instanceof Error) { + logger.error(`Error fetching latest version from npm registry: ${error.message}`); + } else { + // Handle the case where error is not an Error object + logger.error( + 'An unknown error occurred while fetching the latest version from the npm registry.' + ); + } + } + + // Log all messages + for (const { label, message, logLevel } of messages) { + integrationLogger( + { + logger: l.fork(label), + logLevel, + verbose: logLevel === 'info' ? options.verbose : true, + }, + message + ); + } + }, // BUILD: Log messages at the end of the build - 'astro:build:done': (params) => buildDone(params, options.verbose, messages), + 'astro:build:done': ({ logger }) => { + // Log messages at the end of the build + for (const { label, message, logLevel } of messages) { + integrationLogger( + { + logger: logger.fork(label), + logLevel, + verbose: logLevel === 'info' ? options.verbose : true, + }, + message + ); + } + }, }, }; } export default studioCMSIntegration; - -export { - defineStudioCMSConfig, - definePlugin, - type StudioCMSPlugin, - type CustomRenderer, - type Renderer, - type StudioCMSOptions, - type StudioCMSPluginOptions, - type SafePluginListType, -}; diff --git a/packages/studiocms/src/utils/addIntegrationArray.ts b/packages/studiocms/src/utils/addIntegrationArray.ts new file mode 100644 index 0000000000..5e818f05d0 --- /dev/null +++ b/packages/studiocms/src/utils/addIntegrationArray.ts @@ -0,0 +1,35 @@ +import type { AstroIntegration } from 'astro'; +import { addIntegration, defineUtility } from 'astro-integration-kit'; + +/** + * Easily add a list of integrations from within an integration. + * + * @param {import("astro").HookParameters<"astro:config:setup">} params + * @param {array} integrations + * + * @example + * ```ts + * import Vue from "@astrojs/vue"; + * import tailwindcss from "@astrojs/tailwind"; + * + * addIntegrationArray(params, [ + * { integration: Vue(), ensureUnique: true } + * { integration: tailwindcss() } + * ]) + * ``` + * + * @see https://astro-integration-kit.netlify.app/utilities/add-integration/ + */ +export const addIntegrationArray = defineUtility('astro:config:setup')( + ( + params, + integrations: Array<{ + integration: AstroIntegration; + ensureUnique?: boolean | undefined; + }> + ): void => { + for (const { integration, ensureUnique } of integrations) { + addIntegration(params, { integration, ensureUnique }); + } + } +); diff --git a/packages/studiocms_core/src/utils/astroConfigCheck.ts b/packages/studiocms/src/utils/astroConfigCheck.ts similarity index 91% rename from packages/studiocms_core/src/utils/astroConfigCheck.ts rename to packages/studiocms/src/utils/astroConfigCheck.ts index 60cc70fbe4..65c95afcb2 100644 --- a/packages/studiocms_core/src/utils/astroConfigCheck.ts +++ b/packages/studiocms/src/utils/astroConfigCheck.ts @@ -1,6 +1,6 @@ -import { integrationLogger } from '@matthiesenxyz/integration-utils/astroUtils'; +import { StudioCMSCoreError } from '@studiocms/core/errors'; import { defineUtility } from 'astro-integration-kit'; -import { StudioCMSCoreError } from '../errors'; +import { integrationLogger } from './integrationLogger.js'; /** * Checks the Users Astro Config for the following: diff --git a/packages/studiocms/src/utils/changelog.ts b/packages/studiocms/src/utils/changelog.ts index ea0e888886..eb87294c8d 100644 --- a/packages/studiocms/src/utils/changelog.ts +++ b/packages/studiocms/src/utils/changelog.ts @@ -1,7 +1,7 @@ import { addVirtualImports, createResolver, defineUtility } from 'astro-integration-kit'; import type { List, Root } from 'mdast'; import { toMarkdown } from 'mdast-util-to-markdown'; -import { loadChangelog, semverCategories } from './changelogLoader'; +import { loadChangelog, semverCategories } from './changelogLoader.js'; const { resolve } = createResolver(import.meta.url); diff --git a/packages/studiocms_core/src/utils/configManager.ts b/packages/studiocms/src/utils/configManager.ts similarity index 96% rename from packages/studiocms_core/src/utils/configManager.ts rename to packages/studiocms/src/utils/configManager.ts index 13f0fc9b29..ebdf1157b2 100644 --- a/packages/studiocms_core/src/utils/configManager.ts +++ b/packages/studiocms/src/utils/configManager.ts @@ -1,7 +1,7 @@ import { statSync } from 'node:fs'; +import { StudioCMSCoreError } from '@studiocms/core/errors'; +import type { StudioCMSOptions } from '@studiocms/core/schemas'; import { defineUtility } from 'astro-integration-kit'; -import { StudioCMSCoreError } from '../errors'; -import type { StudioCMSOptions } from '../schemas'; // This File was created based on Expressive Code's Astro Integration by Hippotastic on github // see: https://expressive-code.com/ & https://github.com/expressive-code/expressive-code @@ -62,14 +62,14 @@ export function getStudioConfigFileUrl(projectRootUrl: string) { */ export const watchStudioCMSConfig = defineUtility('astro:config:setup')( ({ - // addWatchFile, + addWatchFile, config: { root: { pathname }, }, }) => { const configFileUrl = getStudioConfigFileUrl(pathname); if (configFileUrl) { - // addWatchFile(configFileUrl); + addWatchFile(configFileUrl); // This has been disabled due to a Vite dynamic import issue preventing loading the config file const configFilePath = configFileUrl.replace(pathname, ''); return `There is a StudioCMS config file detected ('${configFilePath}'), due to a vite bug, this file will be ignored. Please use the Astro config file for StudioCMS options for the time being. (You can ignore the warning above about the inline config being ignored while this is in place.)`; @@ -93,6 +93,7 @@ export async function loadStudioCMSConfigFile(projectRootUrl: URL): Promise => { + const { logLevel, logger, verbose } = opts; + + switch (verbose) { + case true: + logger[logLevel](message); + break; + case false: + if (logLevel !== 'debug' && logLevel !== 'info') { + logger[logLevel](message); + } + break; + default: + logger[logLevel](message); + } +}; diff --git a/packages/studiocms/src/utils/integrations.ts b/packages/studiocms/src/utils/integrations.ts new file mode 100644 index 0000000000..cf3a3c33c4 --- /dev/null +++ b/packages/studiocms/src/utils/integrations.ts @@ -0,0 +1,32 @@ +import { builtinModules as builtins } from 'node:module'; +import type { AstroIntegration } from 'astro'; +import { addVitePlugin, hasVitePlugin } from 'astro-integration-kit'; +import type { PluginOption } from 'vite'; + +export function namespaceBuiltinsPlugin(): PluginOption { + return { + name: 'namespace-builtins', + enforce: 'pre', + // biome-ignore lint/suspicious/noExplicitAny: This is a Vite plugin, so we don't have control over the type of `id` + resolveId(id: any) { + if (id[0] === '.' || id[0] === '/') return; + + if (builtins.includes(id)) { + return { id: `node:${id}`, external: true }; + } + return; + }, + }; +} +export function nodeNamespaceBuiltinsAstro(): AstroIntegration { + return { + name: 'vite-namespace-builtins', + hooks: { + 'astro:config:setup': (params) => { + if (!hasVitePlugin(params, { plugin: 'namespace-builtins' })) { + addVitePlugin(params, { plugin: namespaceBuiltinsPlugin() }); + } + }, + }, + }; +} diff --git a/packages/studiocms/studiocms-cli.mjs b/packages/studiocms/studiocms-cli.mjs new file mode 100755 index 0000000000..489f1a7bb9 --- /dev/null +++ b/packages/studiocms/studiocms-cli.mjs @@ -0,0 +1,13 @@ +#!/usr/bin/env node + +const currentVersion = process.versions.node; +const requiredMajorVersion = Number.parseInt(currentVersion.split('.')[0], 10); +const minimumMajorVersion = 18; + +if (requiredMajorVersion < minimumMajorVersion) { + console.error(`Node.js v${currentVersion} is out of date and unsupported!`); + console.error(`Please use Node.js v${minimumMajorVersion} or higher.`); + process.exit(1); +} + +import('./dist/cli/index.js').then(({ main }) => main()); diff --git a/packages/studiocms/tsconfig.json b/packages/studiocms/tsconfig.json index e511a952b9..6073eb52d0 100644 --- a/packages/studiocms/tsconfig.json +++ b/packages/studiocms/tsconfig.json @@ -1,4 +1,10 @@ { - "extends": "astro/tsconfigs/strictest", - "include": ["./package.json", "./**/*", "./src/**/*.json"] + "extends": "../../tsconfig.base.json", + "include": ["src"], + "compilerOptions": { + "outDir": "./dist", + "emitDeclarationOnly": true, + "resolveJsonModule": true, + "rootDir": "./src" + } } diff --git a/packages/studiocms_auth/.gitignore b/packages/studiocms_auth/.gitignore index 4e02004cb0..8f18003eca 100644 --- a/packages/studiocms_auth/.gitignore +++ b/packages/studiocms_auth/.gitignore @@ -18,4 +18,6 @@ pnpm-debug.log* # macOS-specific files .DS_Store -.npmrc \ No newline at end of file +.npmrc + +dist/ \ No newline at end of file diff --git a/packages/studiocms_auth/src/components/OAuthButton.astro b/packages/studiocms_auth/assets/components/OAuthButton.astro similarity index 100% rename from packages/studiocms_auth/src/components/OAuthButton.astro rename to packages/studiocms_auth/assets/components/OAuthButton.astro diff --git a/packages/studiocms_auth/src/components/OAuthButtonStack.astro b/packages/studiocms_auth/assets/components/OAuthButtonStack.astro similarity index 97% rename from packages/studiocms_auth/src/components/OAuthButtonStack.astro rename to packages/studiocms_auth/assets/components/OAuthButtonStack.astro index 113fac6c3b..0b91c519c2 100644 --- a/packages/studiocms_auth/src/components/OAuthButtonStack.astro +++ b/packages/studiocms_auth/assets/components/OAuthButtonStack.astro @@ -1,4 +1,5 @@ --- +// @ts-nocheck import { useTranslations } from 'studiocms:i18n'; import { Divider } from '@studiocms/ui/components'; import OAuthButton from './OAuthButton.astro'; diff --git a/packages/studiocms_auth/src/components/StaticAuthCheck.astro b/packages/studiocms_auth/assets/components/StaticAuthCheck.astro similarity index 97% rename from packages/studiocms_auth/src/components/StaticAuthCheck.astro rename to packages/studiocms_auth/assets/components/StaticAuthCheck.astro index 672601501b..6676be685a 100644 --- a/packages/studiocms_auth/src/components/StaticAuthCheck.astro +++ b/packages/studiocms_auth/assets/components/StaticAuthCheck.astro @@ -1,4 +1,5 @@ --- +// @ts-nocheck import { getUserData } from 'studiocms:auth/lib/user'; import { StudioCMSRoutes } from 'studiocms:lib'; diff --git a/packages/studiocms_auth/src/components/StudioCMSLogoSVG.astro b/packages/studiocms_auth/assets/components/StudioCMSLogoSVG.astro similarity index 100% rename from packages/studiocms_auth/src/components/StudioCMSLogoSVG.astro rename to packages/studiocms_auth/assets/components/StudioCMSLogoSVG.astro diff --git a/packages/studiocms_auth/src/components/oAuthButtonProviders.ts b/packages/studiocms_auth/assets/components/oAuthButtonProviders.ts similarity index 100% rename from packages/studiocms_auth/src/components/oAuthButtonProviders.ts rename to packages/studiocms_auth/assets/components/oAuthButtonProviders.ts diff --git a/packages/studiocms_auth/src/layouts/AuthLayout.astro b/packages/studiocms_auth/assets/layouts/AuthLayout.astro similarity index 99% rename from packages/studiocms_auth/src/layouts/AuthLayout.astro rename to packages/studiocms_auth/assets/layouts/AuthLayout.astro index 582ec3b18a..aff658c4d8 100644 --- a/packages/studiocms_auth/src/layouts/AuthLayout.astro +++ b/packages/studiocms_auth/assets/layouts/AuthLayout.astro @@ -2,6 +2,7 @@ import '@fontsource-variable/onest/index.css'; import '@studiocms/ui/css/global.css'; import './authlayout.css'; +// @ts-ignore import { Generator } from 'studiocms:components'; import onestWoff2 from '@fontsource-variable/onest/files/onest-latin-wght-normal.woff2?url'; import { Toaster } from '@studiocms/ui/components'; diff --git a/packages/studiocms_auth/src/layouts/FallbackCanvas.astro b/packages/studiocms_auth/assets/layouts/FallbackCanvas.astro similarity index 98% rename from packages/studiocms_auth/src/layouts/FallbackCanvas.astro rename to packages/studiocms_auth/assets/layouts/FallbackCanvas.astro index 178adbd601..d4341c3faf 100644 --- a/packages/studiocms_auth/src/layouts/FallbackCanvas.astro +++ b/packages/studiocms_auth/assets/layouts/FallbackCanvas.astro @@ -1,4 +1,5 @@ --- +// @ts-nocheck import { Image } from 'astro:assets'; import { validImages } from 'studiocms:auth/utils/validImages'; import studioCMS_SDK_Cache from 'studiocms:sdk/cache'; diff --git a/packages/studiocms_auth/src/layouts/ThreeCanvasLoader.astro b/packages/studiocms_auth/assets/layouts/ThreeCanvasLoader.astro similarity index 96% rename from packages/studiocms_auth/src/layouts/ThreeCanvasLoader.astro rename to packages/studiocms_auth/assets/layouts/ThreeCanvasLoader.astro index 4ef318170b..6c3e03c91b 100644 --- a/packages/studiocms_auth/src/layouts/ThreeCanvasLoader.astro +++ b/packages/studiocms_auth/assets/layouts/ThreeCanvasLoader.astro @@ -1,4 +1,5 @@ --- +// @ts-nocheck import studioCMS_SDK_Cache from 'studiocms:sdk/cache'; // Get the site config diff --git a/packages/studiocms_auth/src/layouts/authlayout.css b/packages/studiocms_auth/assets/layouts/authlayout.css similarity index 100% rename from packages/studiocms_auth/src/layouts/authlayout.css rename to packages/studiocms_auth/assets/layouts/authlayout.css diff --git a/packages/studiocms_auth/src/loginBackgrounds/studiocms-blobs-dark.png b/packages/studiocms_auth/assets/loginBackgrounds/studiocms-blobs-dark.png similarity index 100% rename from packages/studiocms_auth/src/loginBackgrounds/studiocms-blobs-dark.png rename to packages/studiocms_auth/assets/loginBackgrounds/studiocms-blobs-dark.png diff --git a/packages/studiocms_auth/src/loginBackgrounds/studiocms-blobs-light.png b/packages/studiocms_auth/assets/loginBackgrounds/studiocms-blobs-light.png similarity index 100% rename from packages/studiocms_auth/src/loginBackgrounds/studiocms-blobs-light.png rename to packages/studiocms_auth/assets/loginBackgrounds/studiocms-blobs-light.png diff --git a/packages/studiocms_auth/src/loginBackgrounds/studiocms-blocks-dark.png b/packages/studiocms_auth/assets/loginBackgrounds/studiocms-blocks-dark.png similarity index 100% rename from packages/studiocms_auth/src/loginBackgrounds/studiocms-blocks-dark.png rename to packages/studiocms_auth/assets/loginBackgrounds/studiocms-blocks-dark.png diff --git a/packages/studiocms_auth/src/loginBackgrounds/studiocms-blocks-light.png b/packages/studiocms_auth/assets/loginBackgrounds/studiocms-blocks-light.png similarity index 100% rename from packages/studiocms_auth/src/loginBackgrounds/studiocms-blocks-light.png rename to packages/studiocms_auth/assets/loginBackgrounds/studiocms-blocks-light.png diff --git a/packages/studiocms_auth/src/loginBackgrounds/studiocms-curves-dark.png b/packages/studiocms_auth/assets/loginBackgrounds/studiocms-curves-dark.png similarity index 100% rename from packages/studiocms_auth/src/loginBackgrounds/studiocms-curves-dark.png rename to packages/studiocms_auth/assets/loginBackgrounds/studiocms-curves-dark.png diff --git a/packages/studiocms_auth/src/loginBackgrounds/studiocms-curves-light.png b/packages/studiocms_auth/assets/loginBackgrounds/studiocms-curves-light.png similarity index 100% rename from packages/studiocms_auth/src/loginBackgrounds/studiocms-curves-light.png rename to packages/studiocms_auth/assets/loginBackgrounds/studiocms-curves-light.png diff --git a/packages/studiocms_auth/src/public/studiocms-logo.glb b/packages/studiocms_auth/assets/public/studiocms-logo.glb similarity index 100% rename from packages/studiocms_auth/src/public/studiocms-logo.glb rename to packages/studiocms_auth/assets/public/studiocms-logo.glb diff --git a/packages/studiocms_auth/src/routes/api/auth0/callback.ts b/packages/studiocms_auth/assets/routes/api/auth0/callback.ts similarity index 99% rename from packages/studiocms_auth/src/routes/api/auth0/callback.ts rename to packages/studiocms_auth/assets/routes/api/auth0/callback.ts index 74ade2ddb6..6deaf1d278 100644 --- a/packages/studiocms_auth/src/routes/api/auth0/callback.ts +++ b/packages/studiocms_auth/assets/routes/api/auth0/callback.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { logger } from '@it-astro:logger:studiocms-auth'; import { createUserSession } from 'studiocms:auth/lib/session'; import { LinkNewOAuthCookieName, createOAuthUser, getUserData } from 'studiocms:auth/lib/user'; diff --git a/packages/studiocms_auth/src/routes/api/auth0/index.ts b/packages/studiocms_auth/assets/routes/api/auth0/index.ts similarity index 98% rename from packages/studiocms_auth/src/routes/api/auth0/index.ts rename to packages/studiocms_auth/assets/routes/api/auth0/index.ts index b0feaa2258..822e281ec9 100644 --- a/packages/studiocms_auth/src/routes/api/auth0/index.ts +++ b/packages/studiocms_auth/assets/routes/api/auth0/index.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { setOAuthSessionTokenCookie } from 'studiocms:auth/lib/session'; import { generateState } from 'arctic'; import type { APIContext, APIRoute } from 'astro'; diff --git a/packages/studiocms_auth/src/routes/api/auth0/shared.ts b/packages/studiocms_auth/assets/routes/api/auth0/shared.ts similarity index 98% rename from packages/studiocms_auth/src/routes/api/auth0/shared.ts rename to packages/studiocms_auth/assets/routes/api/auth0/shared.ts index b77de9b94e..82ec811102 100644 --- a/packages/studiocms_auth/src/routes/api/auth0/shared.ts +++ b/packages/studiocms_auth/assets/routes/api/auth0/shared.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { authEnvCheck } from 'studiocms:auth/utils/authEnvCheck'; import { AuthConfig } from 'studiocms:config'; import { Auth0 } from 'arctic'; diff --git a/packages/studiocms_auth/src/routes/api/discord/callback.ts b/packages/studiocms_auth/assets/routes/api/discord/callback.ts similarity index 99% rename from packages/studiocms_auth/src/routes/api/discord/callback.ts rename to packages/studiocms_auth/assets/routes/api/discord/callback.ts index 79303517d4..55619378fb 100644 --- a/packages/studiocms_auth/src/routes/api/discord/callback.ts +++ b/packages/studiocms_auth/assets/routes/api/discord/callback.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { logger } from '@it-astro:logger:studiocms-auth'; import { createUserSession } from 'studiocms:auth/lib/session'; import { LinkNewOAuthCookieName, createOAuthUser, getUserData } from 'studiocms:auth/lib/user'; diff --git a/packages/studiocms_auth/src/routes/api/discord/index.ts b/packages/studiocms_auth/assets/routes/api/discord/index.ts similarity index 98% rename from packages/studiocms_auth/src/routes/api/discord/index.ts rename to packages/studiocms_auth/assets/routes/api/discord/index.ts index 6b839be5df..525fc5f0bc 100644 --- a/packages/studiocms_auth/src/routes/api/discord/index.ts +++ b/packages/studiocms_auth/assets/routes/api/discord/index.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { setOAuthSessionTokenCookie } from 'studiocms:auth/lib/session'; import { generateState } from 'arctic'; import type { APIContext, APIRoute } from 'astro'; diff --git a/packages/studiocms_auth/src/routes/api/discord/shared.ts b/packages/studiocms_auth/assets/routes/api/discord/shared.ts similarity index 97% rename from packages/studiocms_auth/src/routes/api/discord/shared.ts rename to packages/studiocms_auth/assets/routes/api/discord/shared.ts index c0e1f643d4..bbd8d504c0 100644 --- a/packages/studiocms_auth/src/routes/api/discord/shared.ts +++ b/packages/studiocms_auth/assets/routes/api/discord/shared.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { authEnvCheck } from 'studiocms:auth/utils/authEnvCheck'; import { AuthConfig } from 'studiocms:config'; import { Discord } from 'arctic'; diff --git a/packages/studiocms_auth/src/routes/api/github/callback.ts b/packages/studiocms_auth/assets/routes/api/github/callback.ts similarity index 99% rename from packages/studiocms_auth/src/routes/api/github/callback.ts rename to packages/studiocms_auth/assets/routes/api/github/callback.ts index 01b06a7a6d..c7cec6e09a 100644 --- a/packages/studiocms_auth/src/routes/api/github/callback.ts +++ b/packages/studiocms_auth/assets/routes/api/github/callback.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { logger } from '@it-astro:logger:studiocms-auth'; import { createUserSession } from 'studiocms:auth/lib/session'; import { LinkNewOAuthCookieName, createOAuthUser, getUserData } from 'studiocms:auth/lib/user'; diff --git a/packages/studiocms_auth/src/routes/api/github/index.ts b/packages/studiocms_auth/assets/routes/api/github/index.ts similarity index 98% rename from packages/studiocms_auth/src/routes/api/github/index.ts rename to packages/studiocms_auth/assets/routes/api/github/index.ts index 10f5597b85..bf609c3081 100644 --- a/packages/studiocms_auth/src/routes/api/github/index.ts +++ b/packages/studiocms_auth/assets/routes/api/github/index.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { setOAuthSessionTokenCookie } from 'studiocms:auth/lib/session'; import { generateState } from 'arctic'; import type { APIContext, APIRoute } from 'astro'; diff --git a/packages/studiocms_auth/src/routes/api/github/shared.ts b/packages/studiocms_auth/assets/routes/api/github/shared.ts similarity index 97% rename from packages/studiocms_auth/src/routes/api/github/shared.ts rename to packages/studiocms_auth/assets/routes/api/github/shared.ts index a0761d2320..bfb82bc79c 100644 --- a/packages/studiocms_auth/src/routes/api/github/shared.ts +++ b/packages/studiocms_auth/assets/routes/api/github/shared.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { authEnvCheck } from 'studiocms:auth/utils/authEnvCheck'; import { AuthConfig } from 'studiocms:config'; import { GitHub } from 'arctic'; diff --git a/packages/studiocms_auth/src/routes/api/google/callback.ts b/packages/studiocms_auth/assets/routes/api/google/callback.ts similarity index 99% rename from packages/studiocms_auth/src/routes/api/google/callback.ts rename to packages/studiocms_auth/assets/routes/api/google/callback.ts index 773450bb75..16777601c7 100644 --- a/packages/studiocms_auth/src/routes/api/google/callback.ts +++ b/packages/studiocms_auth/assets/routes/api/google/callback.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { logger } from '@it-astro:logger:studiocms-auth'; import { createUserSession } from 'studiocms:auth/lib/session'; import { LinkNewOAuthCookieName, createOAuthUser, getUserData } from 'studiocms:auth/lib/user'; diff --git a/packages/studiocms_auth/src/routes/api/google/index.ts b/packages/studiocms_auth/assets/routes/api/google/index.ts similarity index 98% rename from packages/studiocms_auth/src/routes/api/google/index.ts rename to packages/studiocms_auth/assets/routes/api/google/index.ts index 5a897997f3..a191d57820 100644 --- a/packages/studiocms_auth/src/routes/api/google/index.ts +++ b/packages/studiocms_auth/assets/routes/api/google/index.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { setOAuthSessionTokenCookie } from 'studiocms:auth/lib/session'; import { generateCodeVerifier, generateState } from 'arctic'; import type { APIContext, APIRoute } from 'astro'; diff --git a/packages/studiocms_auth/src/routes/api/google/shared.ts b/packages/studiocms_auth/assets/routes/api/google/shared.ts similarity index 97% rename from packages/studiocms_auth/src/routes/api/google/shared.ts rename to packages/studiocms_auth/assets/routes/api/google/shared.ts index e6dd955bd7..e2f96e1146 100644 --- a/packages/studiocms_auth/src/routes/api/google/shared.ts +++ b/packages/studiocms_auth/assets/routes/api/google/shared.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { authEnvCheck } from 'studiocms:auth/utils/authEnvCheck'; import { AuthConfig } from 'studiocms:config'; import { Google } from 'arctic'; diff --git a/packages/studiocms_auth/src/routes/api/login.ts b/packages/studiocms_auth/assets/routes/api/login.ts similarity index 99% rename from packages/studiocms_auth/src/routes/api/login.ts rename to packages/studiocms_auth/assets/routes/api/login.ts index 86834bf859..e073d5d01c 100644 --- a/packages/studiocms_auth/src/routes/api/login.ts +++ b/packages/studiocms_auth/assets/routes/api/login.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { verifyPasswordHash } from 'studiocms:auth/lib/password'; import { createUserSession } from 'studiocms:auth/lib/session'; import studioCMS_SDK from 'studiocms:sdk'; diff --git a/packages/studiocms_auth/src/routes/api/logout.ts b/packages/studiocms_auth/assets/routes/api/logout.ts similarity index 99% rename from packages/studiocms_auth/src/routes/api/logout.ts rename to packages/studiocms_auth/assets/routes/api/logout.ts index b82030ce0a..61b28d9f31 100644 --- a/packages/studiocms_auth/src/routes/api/logout.ts +++ b/packages/studiocms_auth/assets/routes/api/logout.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { deleteSessionTokenCookie, invalidateSession, diff --git a/packages/studiocms_auth/src/routes/api/register.ts b/packages/studiocms_auth/assets/routes/api/register.ts similarity index 99% rename from packages/studiocms_auth/src/routes/api/register.ts rename to packages/studiocms_auth/assets/routes/api/register.ts index dca8bb3a76..1919d93a63 100644 --- a/packages/studiocms_auth/src/routes/api/register.ts +++ b/packages/studiocms_auth/assets/routes/api/register.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { verifyPasswordStrength } from 'studiocms:auth/lib/password'; import { createUserSession } from 'studiocms:auth/lib/session'; import { createLocalUser, verifyUsernameInput } from 'studiocms:auth/lib/user'; diff --git a/packages/studiocms_auth/src/routes/api/shared.ts b/packages/studiocms_auth/assets/routes/api/shared.ts similarity index 100% rename from packages/studiocms_auth/src/routes/api/shared.ts rename to packages/studiocms_auth/assets/routes/api/shared.ts diff --git a/packages/studiocms_auth/src/routes/login.astro b/packages/studiocms_auth/assets/routes/login.astro similarity index 99% rename from packages/studiocms_auth/src/routes/login.astro rename to packages/studiocms_auth/assets/routes/login.astro index cc3f9087b3..0f43445fd8 100644 --- a/packages/studiocms_auth/src/routes/login.astro +++ b/packages/studiocms_auth/assets/routes/login.astro @@ -1,4 +1,5 @@ --- +// @ts-nocheck import { authEnvCheck } from 'studiocms:auth/utils/authEnvCheck'; import { AuthConfig } from 'studiocms:config'; import { useTranslations } from 'studiocms:i18n'; diff --git a/packages/studiocms_auth/src/routes/logout.astro b/packages/studiocms_auth/assets/routes/logout.astro similarity index 98% rename from packages/studiocms_auth/src/routes/logout.astro rename to packages/studiocms_auth/assets/routes/logout.astro index 887218a579..34f8335e80 100644 --- a/packages/studiocms_auth/src/routes/logout.astro +++ b/packages/studiocms_auth/assets/routes/logout.astro @@ -1,4 +1,5 @@ --- +// @ts-nocheck import { useTranslations } from 'studiocms:i18n'; import { StudioCMSRoutes } from 'studiocms:lib'; import { prerenderRoutes as pagePreRendered } from 'studiocms:mode'; diff --git a/packages/studiocms_auth/src/routes/signup.astro b/packages/studiocms_auth/assets/routes/signup.astro similarity index 96% rename from packages/studiocms_auth/src/routes/signup.astro rename to packages/studiocms_auth/assets/routes/signup.astro index 11b06fa714..f61eb568a9 100644 --- a/packages/studiocms_auth/src/routes/signup.astro +++ b/packages/studiocms_auth/assets/routes/signup.astro @@ -1,4 +1,5 @@ --- +// @ts-nocheck import { authEnvCheck } from 'studiocms:auth/utils/authEnvCheck'; import { AuthConfig } from 'studiocms:config'; import { useTranslations } from 'studiocms:i18n'; @@ -65,7 +66,7 @@ if (usernameAndPassword && SHOW_OAUTH) { \ No newline at end of file From 8a05344b04329326cb56bf03659cb775aae610a4 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Thu, 23 Jan 2025 02:28:28 -0800 Subject: [PATCH 440/539] Update type definitions and fix props for LightVsDark component in ConfigForm --- packages/studiocms/src/index.ts | 2 +- packages/studiocms_dashboard/assets/astro.d.ts | 2 +- .../assets/components/islands/configuration/ConfigForm.astro | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/studiocms/src/index.ts b/packages/studiocms/src/index.ts index 5ed7f1de34..f44439f7a5 100644 --- a/packages/studiocms/src/index.ts +++ b/packages/studiocms/src/index.ts @@ -216,7 +216,7 @@ export function studioCMSIntegration(opts?: StudioCMSOptions): AstroIntegration dtsFile.addModule('studiocms:plugins', { defaultExport: { - typeDef: `import('${resolve('../index.ts')}').SafePluginListType`, + typeDef: `import('${resolve('./config.js')}').SafePluginListType`, }, }); diff --git a/packages/studiocms_dashboard/assets/astro.d.ts b/packages/studiocms_dashboard/assets/astro.d.ts index f964fe0cff..3c0a2f7c7e 100644 --- a/packages/studiocms_dashboard/assets/astro.d.ts +++ b/packages/studiocms_dashboard/assets/astro.d.ts @@ -1 +1 @@ -/// +/// diff --git a/packages/studiocms_dashboard/assets/components/islands/configuration/ConfigForm.astro b/packages/studiocms_dashboard/assets/components/islands/configuration/ConfigForm.astro index 9020182b5c..ed27c8cc33 100644 --- a/packages/studiocms_dashboard/assets/components/islands/configuration/ConfigForm.astro +++ b/packages/studiocms_dashboard/assets/components/islands/configuration/ConfigForm.astro @@ -41,7 +41,7 @@ const curves = validImages.filter(({ name }) => name === 'studiocms-curves')[0];
      { currentLoginPageBg && currentLoginPageBg.name !== 'custom' && ( - + ) } From aa681dfa026dde3a304472e32a7063f083d2df43 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Thu, 23 Jan 2025 02:35:30 -0800 Subject: [PATCH 441/539] Refactor package.json scripts and remove tsconfig.json; update imports in Astro components --- package.json | 4 ++-- packages/studiocms_auth/assets/astro.d.ts | 1 + .../assets/components/OAuthButtonStack.astro | 1 - .../assets/components/StaticAuthCheck.astro | 1 - .../studiocms_auth/assets/layouts/AuthLayout.astro | 2 -- .../assets/layouts/FallbackCanvas.astro | 1 - .../assets/layouts/ThreeCanvasLoader.astro | 1 - packages/studiocms_auth/assets/routes/login.astro | 1 - packages/studiocms_auth/assets/routes/logout.astro | 1 - packages/studiocms_auth/assets/routes/signup.astro | 1 - packages/studiocms_core/assets/astro.d.ts | 1 + tsconfig.json | 14 -------------- 12 files changed, 4 insertions(+), 25 deletions(-) create mode 100644 packages/studiocms_auth/assets/astro.d.ts create mode 100644 packages/studiocms_core/assets/astro.d.ts delete mode 100644 tsconfig.json diff --git a/package.json b/package.json index 4f0848dd58..24b4d7310a 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "scripts": { "build": "pnpm build:studiocms && pnpm --filter node-playground build", "build:docs": "pnpm --filter docs build", - "docs:dev": "pnpm --filter docs dev", + "docs:dev": "pnpm build:studiocms && pnpm --filter docs dev", "playground:dev": "pnpm --filter node-playground dev", "playground:push": "pnpm --filter node-playground db:push", @@ -16,7 +16,7 @@ "dev:studiocms": "pnpm --stream --filter studiocms --filter @studiocms/* -r -parallel dev", "dev": "pnpm --stream --filter studiocms --filter @studiocms/* --filter node-playground -r -parallel dev", - "studiocms:build": "pnpm --filter studiocms build", + "build:cli": "pnpm --filter studiocms build", "cli:test": "pnpm studiocms", "changeset": "changeset", diff --git a/packages/studiocms_auth/assets/astro.d.ts b/packages/studiocms_auth/assets/astro.d.ts new file mode 100644 index 0000000000..3c0a2f7c7e --- /dev/null +++ b/packages/studiocms_auth/assets/astro.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/studiocms_auth/assets/components/OAuthButtonStack.astro b/packages/studiocms_auth/assets/components/OAuthButtonStack.astro index cdb7413d01..9a5955358a 100644 --- a/packages/studiocms_auth/assets/components/OAuthButtonStack.astro +++ b/packages/studiocms_auth/assets/components/OAuthButtonStack.astro @@ -1,5 +1,4 @@ --- -// @ts-nocheck import { useTranslations } from 'studiocms:i18n'; import { Divider } from 'studiocms:ui/components'; import OAuthButton from './OAuthButton.astro'; diff --git a/packages/studiocms_auth/assets/components/StaticAuthCheck.astro b/packages/studiocms_auth/assets/components/StaticAuthCheck.astro index 6676be685a..672601501b 100644 --- a/packages/studiocms_auth/assets/components/StaticAuthCheck.astro +++ b/packages/studiocms_auth/assets/components/StaticAuthCheck.astro @@ -1,5 +1,4 @@ --- -// @ts-nocheck import { getUserData } from 'studiocms:auth/lib/user'; import { StudioCMSRoutes } from 'studiocms:lib'; diff --git a/packages/studiocms_auth/assets/layouts/AuthLayout.astro b/packages/studiocms_auth/assets/layouts/AuthLayout.astro index d61c6c1ab5..d16842f15c 100644 --- a/packages/studiocms_auth/assets/layouts/AuthLayout.astro +++ b/packages/studiocms_auth/assets/layouts/AuthLayout.astro @@ -1,8 +1,6 @@ --- import '@fontsource-variable/onest/index.css'; -import '@studiocms/ui/css/global.css'; import './authlayout.css'; -// @ts-ignore import { Generator } from 'studiocms:components'; import { Toaster } from 'studiocms:ui/components'; import onestWoff2 from '@fontsource-variable/onest/files/onest-latin-wght-normal.woff2?url'; diff --git a/packages/studiocms_auth/assets/layouts/FallbackCanvas.astro b/packages/studiocms_auth/assets/layouts/FallbackCanvas.astro index d4341c3faf..178adbd601 100644 --- a/packages/studiocms_auth/assets/layouts/FallbackCanvas.astro +++ b/packages/studiocms_auth/assets/layouts/FallbackCanvas.astro @@ -1,5 +1,4 @@ --- -// @ts-nocheck import { Image } from 'astro:assets'; import { validImages } from 'studiocms:auth/utils/validImages'; import studioCMS_SDK_Cache from 'studiocms:sdk/cache'; diff --git a/packages/studiocms_auth/assets/layouts/ThreeCanvasLoader.astro b/packages/studiocms_auth/assets/layouts/ThreeCanvasLoader.astro index 6c3e03c91b..4ef318170b 100644 --- a/packages/studiocms_auth/assets/layouts/ThreeCanvasLoader.astro +++ b/packages/studiocms_auth/assets/layouts/ThreeCanvasLoader.astro @@ -1,5 +1,4 @@ --- -// @ts-nocheck import studioCMS_SDK_Cache from 'studiocms:sdk/cache'; // Get the site config diff --git a/packages/studiocms_auth/assets/routes/login.astro b/packages/studiocms_auth/assets/routes/login.astro index d5417432ab..07b15f93db 100644 --- a/packages/studiocms_auth/assets/routes/login.astro +++ b/packages/studiocms_auth/assets/routes/login.astro @@ -1,5 +1,4 @@ --- -// @ts-nocheck import { authEnvCheck } from 'studiocms:auth/utils/authEnvCheck'; import { AuthConfig } from 'studiocms:config'; import { useTranslations } from 'studiocms:i18n'; diff --git a/packages/studiocms_auth/assets/routes/logout.astro b/packages/studiocms_auth/assets/routes/logout.astro index 34f8335e80..887218a579 100644 --- a/packages/studiocms_auth/assets/routes/logout.astro +++ b/packages/studiocms_auth/assets/routes/logout.astro @@ -1,5 +1,4 @@ --- -// @ts-nocheck import { useTranslations } from 'studiocms:i18n'; import { StudioCMSRoutes } from 'studiocms:lib'; import { prerenderRoutes as pagePreRendered } from 'studiocms:mode'; diff --git a/packages/studiocms_auth/assets/routes/signup.astro b/packages/studiocms_auth/assets/routes/signup.astro index 795e73c13d..4e33280b85 100644 --- a/packages/studiocms_auth/assets/routes/signup.astro +++ b/packages/studiocms_auth/assets/routes/signup.astro @@ -1,5 +1,4 @@ --- -// @ts-nocheck import { authEnvCheck } from 'studiocms:auth/utils/authEnvCheck'; import { AuthConfig } from 'studiocms:config'; import { useTranslations } from 'studiocms:i18n'; diff --git a/packages/studiocms_core/assets/astro.d.ts b/packages/studiocms_core/assets/astro.d.ts new file mode 100644 index 0000000000..3c0a2f7c7e --- /dev/null +++ b/packages/studiocms_core/assets/astro.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 025d3701fc..0000000000 --- a/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "include": ["**/*"], - "compilerOptions": { - "baseUrl": ".", - "composite": true, - "declaration": true, - "declarationMap": true, - "noEmit": false, - "emitDeclarationOnly": true, - "incremental": true, - "noEmitOnError": true, - "skipLibCheck": true - } -} From ac157bff1327e5677884fec910b669993a0c14e0 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Thu, 23 Jan 2025 04:54:20 -0800 Subject: [PATCH 442/539] Remove unused prerenderRoutes parameter from various components and update related configurations --- packages/studiocms/src/index.ts | 21 +++----- .../assets/layouts/AuthLayout.astro | 13 ++--- .../studiocms_auth/assets/routes/login.astro | 2 - .../studiocms_auth/assets/routes/logout.astro | 2 - .../studiocms_auth/assets/routes/signup.astro | 2 - .../studiocms_auth/src/hooks/config-setup.ts | 4 +- packages/studiocms_auth/src/index.ts | 4 +- .../studiocms_core/src/hooks/config-setup.ts | 6 +-- packages/studiocms_core/src/index.ts | 7 +-- .../src/schemas/config/dashboard.ts | 16 +++--- .../components/DashboardPageHeader.astro | 12 +---- .../assets/components/DoubleSidebar.astro | 51 ++----------------- .../assets/components/Layout.astro | 11 ++-- .../assets/components/SingleSidebar.astro | 46 ++--------------- .../islands/sidebar/VersionCheck.astro | 1 - .../assets/routes/configuration.astro | 8 +-- .../assets/routes/content-management.astro | 12 ++--- .../assets/routes/index.astro | 10 +--- .../assets/routes/profile.astro | 43 +++------------- .../assets/routes/user-management.astro | 2 - .../src/hooks/configSetup.ts | 4 +- packages/studiocms_dashboard/src/index.ts | 7 +-- 22 files changed, 58 insertions(+), 226 deletions(-) diff --git a/packages/studiocms/src/index.ts b/packages/studiocms/src/index.ts index f44439f7a5..d4935714bc 100644 --- a/packages/studiocms/src/index.ts +++ b/packages/studiocms/src/index.ts @@ -71,17 +71,8 @@ export function studioCMSIntegration(opts?: StudioCMSOptions): AstroIntegration options = await configResolver(params, opts); - const { - verbose, - rendererConfig, - defaultFrontEndConfig, - includedIntegrations, - plugins, - dashboardConfig: { prerender }, - } = options; - - // Check if the dashboard routes should be prerendered - const prerenderRoutes = output === 'static' || prerender; + const { verbose, rendererConfig, defaultFrontEndConfig, includedIntegrations, plugins } = + options; // Setup Logger integrationLogger({ logger, logLevel: 'info', verbose }, 'Setting up StudioCMS...'); @@ -99,11 +90,11 @@ export function studioCMSIntegration(opts?: StudioCMSOptions): AstroIntegration const integrations = [ { integration: nodeNamespaceBuiltinsAstro() }, { integration: ui() }, - { integration: core(options, prerenderRoutes) }, + { integration: core(options) }, { integration: renderers(rendererConfig, verbose) }, { integration: imageHandler(options) }, - { integration: auth(options, prerenderRoutes) }, - { integration: dashboard(options, prerenderRoutes) }, + { integration: auth(options) }, + { integration: dashboard(options) }, ]; // Frontend Integration (Default) @@ -185,7 +176,7 @@ export function studioCMSIntegration(opts?: StudioCMSOptions): AstroIntegration 'studiocms:plugins': `export default ${JSON.stringify(safePluginList)};`, 'studiocms:mode': ` export const output = ${JSON.stringify(output)}; - export const prerenderRoutes = ${prerenderRoutes}; + export const prerenderRoutes = false; export default { output, prerenderRoutes }; `, }, diff --git a/packages/studiocms_auth/assets/layouts/AuthLayout.astro b/packages/studiocms_auth/assets/layouts/AuthLayout.astro index d16842f15c..d49319c325 100644 --- a/packages/studiocms_auth/assets/layouts/AuthLayout.astro +++ b/packages/studiocms_auth/assets/layouts/AuthLayout.astro @@ -15,10 +15,9 @@ interface Props { lang: string; disableScreen?: boolean; checkLogin?: boolean; - pagePreRendered?: boolean; } -const { title, description, lang, disableScreen, checkLogin, pagePreRendered = true } = Astro.props; +const { title, description, lang, disableScreen, checkLogin } = Astro.props; --- @@ -45,9 +44,7 @@ const { title, description, lang, disableScreen, checkLogin, pagePreRendered = t
      - { - pagePreRendered ? : - } +
      { checkLogin && ( - <> - { pagePreRendered ? : } - + )} - { pagePreRendered ? : } + diff --git a/packages/studiocms_auth/assets/routes/login.astro b/packages/studiocms_auth/assets/routes/login.astro index 07b15f93db..2fcf2c3cbf 100644 --- a/packages/studiocms_auth/assets/routes/login.astro +++ b/packages/studiocms_auth/assets/routes/login.astro @@ -3,7 +3,6 @@ import { authEnvCheck } from 'studiocms:auth/utils/authEnvCheck'; import { AuthConfig } from 'studiocms:config'; import { useTranslations } from 'studiocms:i18n'; import { StudioCMSRoutes } from 'studiocms:lib'; -import { prerenderRoutes as pagePreRendered } from 'studiocms:mode'; import { Button, Input } from 'studiocms:ui/components'; import AuthLayout from '../layouts/AuthLayout.astro'; @@ -36,7 +35,6 @@ if (usernameAndPassword && SHOW_OAUTH) { title={t('title')} description={t('description')} {lang} - {pagePreRendered} checkLogin > diff --git a/packages/studiocms_auth/assets/routes/logout.astro b/packages/studiocms_auth/assets/routes/logout.astro index 887218a579..78450b21bb 100644 --- a/packages/studiocms_auth/assets/routes/logout.astro +++ b/packages/studiocms_auth/assets/routes/logout.astro @@ -1,7 +1,6 @@ --- import { useTranslations } from 'studiocms:i18n'; import { StudioCMSRoutes } from 'studiocms:lib'; -import { prerenderRoutes as pagePreRendered } from 'studiocms:mode'; import AuthLayout from '../layouts/AuthLayout.astro'; const lang = 'en-us'; @@ -11,7 +10,6 @@ const t = useTranslations(lang, '@studiocms/auth:logout'); title={t('title')} description={t('description')} {lang} - {pagePreRendered} disableScreen > diff --git a/packages/studiocms_auth/assets/routes/signup.astro b/packages/studiocms_auth/assets/routes/signup.astro index 4e33280b85..80f8afcd4b 100644 --- a/packages/studiocms_auth/assets/routes/signup.astro +++ b/packages/studiocms_auth/assets/routes/signup.astro @@ -3,7 +3,6 @@ import { authEnvCheck } from 'studiocms:auth/utils/authEnvCheck'; import { AuthConfig } from 'studiocms:config'; import { useTranslations } from 'studiocms:i18n'; import { StudioCMSRoutes } from 'studiocms:lib'; -import { prerenderRoutes as pagePreRendered } from 'studiocms:mode'; import { Button, Input } from 'studiocms:ui/components'; import AuthLayout from '../layouts/AuthLayout.astro'; @@ -37,7 +36,6 @@ if (usernameAndPassword && SHOW_OAUTH) { description={t('description')} {lang} checkLogin - {pagePreRendered} >
      diff --git a/packages/studiocms_auth/src/hooks/config-setup.ts b/packages/studiocms_auth/src/hooks/config-setup.ts index 2493a4ef9d..bd1660d90e 100644 --- a/packages/studiocms_auth/src/hooks/config-setup.ts +++ b/packages/studiocms_auth/src/hooks/config-setup.ts @@ -10,7 +10,7 @@ import { integrationLogger } from '../utils/integrationLogger.js'; import { injectAuthAPIRoutes, injectAuthPageRoutes } from '../utils/routeBuilder.js'; export const configSetup = defineUtility('astro:config:setup')( - (params, name: string, options: StudioCMSAuthOptions, prerenderRoutes: boolean) => { + (params, name: string, options: StudioCMSAuthOptions) => { // Destructure Params const { logger, updateConfig } = params; @@ -250,7 +250,7 @@ export const configSetup = defineUtility('astro:config:setup')( }, ], }, - prerenderRoutes + false ); } ); diff --git a/packages/studiocms_auth/src/index.ts b/packages/studiocms_auth/src/index.ts index 0b08c732f4..2f51743e04 100644 --- a/packages/studiocms_auth/src/index.ts +++ b/packages/studiocms_auth/src/index.ts @@ -11,11 +11,11 @@ const { name } = readJson<{ name: string }>(new URL('../package.json', import.me /** * StudioCMS Auth Integration */ -function studioCMSAuth(options: StudioCMSAuthOptions, prerenderRoutes: boolean): AstroIntegration { +function studioCMSAuth(options: StudioCMSAuthOptions): AstroIntegration { return { name, hooks: { - 'astro:config:setup': (params) => configSetup(params, name, options, prerenderRoutes), + 'astro:config:setup': (params) => configSetup(params, name, options), 'astro:config:done': ({ injectTypes }) => { // Inject Types injectTypes(authLibDTS); diff --git a/packages/studiocms_core/src/hooks/config-setup.ts b/packages/studiocms_core/src/hooks/config-setup.ts index c813381c54..319a74814d 100644 --- a/packages/studiocms_core/src/hooks/config-setup.ts +++ b/packages/studiocms_core/src/hooks/config-setup.ts @@ -10,7 +10,7 @@ const { name, version } = readJson<{ name: string; version: string }>( ); export const configSetup = defineUtility('astro:config:setup')( - (params, options: StudioCMSConfig, prerenderRoutes: boolean) => { + (params, options: StudioCMSConfig) => { // Destructure the params const { logger, @@ -153,13 +153,13 @@ export const configSetup = defineUtility('astro:config:setup')( injectRoute({ pattern: sdkRouteResolver('fallback-list-pages.json'), entrypoint: resolve('../routes/fallback-list-pages.json.js'), - prerender: prerenderRoutes, + prerender: true, }); injectRoute({ pattern: sdkRouteResolver('full-changelog.json'), entrypoint: resolve('../routes/full-changelog.json.js'), - prerender: prerenderRoutes, + prerender: true, }); integrationLogger(logInfo, 'Core Setup Complete...'); diff --git a/packages/studiocms_core/src/index.ts b/packages/studiocms_core/src/index.ts index cce114685a..56553b1ec7 100644 --- a/packages/studiocms_core/src/index.ts +++ b/packages/studiocms_core/src/index.ts @@ -15,14 +15,11 @@ const { name: pkgName } = readJson<{ name: string }>(new URL('../package.json', * * @see [StudioCMS Docs](https://docs.studiocms.dev) for more information on how to use StudioCMS. */ -export function studioCMSCore( - options: StudioCMSConfig, - prerenderRoutes: boolean -): AstroIntegration { +export function studioCMSCore(options: StudioCMSConfig): AstroIntegration { return { name: pkgName, hooks: { - 'astro:config:setup': (params) => configSetup(params, options, prerenderRoutes), + 'astro:config:setup': (params) => configSetup(params, options), 'astro:config:done': (params) => configDone(params), }, }; diff --git a/packages/studiocms_core/src/schemas/config/dashboard.ts b/packages/studiocms_core/src/schemas/config/dashboard.ts index b12038cf6d..4835fd7d9c 100644 --- a/packages/studiocms_core/src/schemas/config/dashboard.ts +++ b/packages/studiocms_core/src/schemas/config/dashboard.ts @@ -10,14 +10,14 @@ export const dashboardConfigSchema = z * @default true */ dashboardEnabled: z.boolean().optional().default(true), - /** - * This allows the user when in `output: "server"` mode with Astro to enable or disable the prerendering of the dashboard - * - * **Note: This is only applicable when using Astro in server mode in static(hybrid) mode, this will be `true`** - * - * @default true - */ - prerender: z.boolean().optional().default(true), + // /** + // * This allows the user when in `output: "server"` mode with Astro to enable or disable the prerendering of the dashboard + // * + // * **Note: This is only applicable when using Astro in server mode in static(hybrid) mode, this will be `true`** + // * + // * @default true + // */ + // prerender: z.boolean().optional().default(true), /** * OPTIONAL - This allows the user to enable or disable the default 404 route for the dashboard * diff --git a/packages/studiocms_dashboard/assets/components/DashboardPageHeader.astro b/packages/studiocms_dashboard/assets/components/DashboardPageHeader.astro index ba076690f9..391b92a2f5 100644 --- a/packages/studiocms_dashboard/assets/components/DashboardPageHeader.astro +++ b/packages/studiocms_dashboard/assets/components/DashboardPageHeader.astro @@ -4,23 +4,13 @@ import { Button, Icon } from 'studiocms:ui/components'; import DiscordLogo from '@studiocms/assets/svgs/discord.svg?raw'; import UserName from './islands/dashboard/UserName.astro'; -interface Props { - pagePreRendered: boolean; -} - -const { pagePreRendered } = Astro.props; - const lang = 'en-us'; const t = useTranslations(lang, '@studiocms/dashboard:index'); ---
      - { - pagePreRendered - ? - : - } + { /* Fallback slot removed from component to prevent the sidebar from displaying the fallback content when the user is not an admin. @@ -88,15 +55,7 @@ const sidebar = getSidebarLinks(lang); transition:persist transition:persist-props >
      - { - pagePreRendered - ? ( - - - - ) - : - } +
      diff --git a/packages/studiocms_dashboard/assets/components/Layout.astro b/packages/studiocms_dashboard/assets/components/Layout.astro index a317513c21..980527699e 100644 --- a/packages/studiocms_dashboard/assets/components/Layout.astro +++ b/packages/studiocms_dashboard/assets/components/Layout.astro @@ -12,7 +12,6 @@ const { data: dbConfig } = await studioCMS_SDK_Cache.GET.siteConfig(); type Props = { title: string; - pagePreRendered?: boolean; description?: string; lang?: string; sidebar?: false | 'single' | 'double'; @@ -23,7 +22,6 @@ type Props = { const { title: propTitle, description: propDescription, - pagePreRendered = true, lang = 'en-us', requiredPermission = 'unknown', sidebar = 'single', @@ -40,13 +38,10 @@ const description = propDescription ?? dbConfig.description; { requiredPermission !== 'none' && ( - <> { pagePreRendered - ? - : - } + ) } - { sidebar === 'single' && } - { sidebar === 'double' && } + { sidebar === 'single' && } + { sidebar === 'double' && }
      { sidebar !== false && ( diff --git a/packages/studiocms_dashboard/assets/components/SingleSidebar.astro b/packages/studiocms_dashboard/assets/components/SingleSidebar.astro index 1ff490d1b9..2942ce9c6b 100644 --- a/packages/studiocms_dashboard/assets/components/SingleSidebar.astro +++ b/packages/studiocms_dashboard/assets/components/SingleSidebar.astro @@ -2,24 +2,17 @@ import { dashboardConfig } from 'studiocms:config'; import { useTranslations } from 'studiocms:i18n'; import { StudioCMSRoutes } from 'studiocms:lib'; -import { Divider, Dropdown, Sidebar, User } from 'studiocms:ui/components'; +import { Divider, Dropdown, Sidebar } from 'studiocms:ui/components'; import StudioCMSLogo from '../components/StudioCMSLogo.astro'; import SidebarLink from './SidebarLink.astro'; import Admin from './islands/sidebar/Admin.astro'; import Editor from './islands/sidebar/Editor.astro'; import UserAccount from './islands/sidebar/UserAccount.astro'; import VersionCheck from './islands/sidebar/VersionCheck.astro'; -import VersionCheckPart from './shared-parts/VersionCheck.astro'; import { getSidebarLinks } from './sidebarConfig'; const { versionCheck } = dashboardConfig; -interface Props { - pagePreRendered: boolean; -} - -const { pagePreRendered } = Astro.props; - const lang = 'en-us'; const t = useTranslations(lang, '@studiocms/dashboard:sidebar'); const sidebar = getSidebarLinks(lang); @@ -31,20 +24,7 @@ const sidebar = getSidebarLinks(lang); {t("category-1-header")} @@ -54,17 +34,9 @@ const sidebar = getSidebarLinks(lang); {title} )) } - { - pagePreRendered - ? - : - } + - { - pagePreRendered - ? - : - } + { /* Fallback slot removed from component to prevent the sidebar from displaying the fallback content when the user is not an admin. @@ -82,15 +54,7 @@ const sidebar = getSidebarLinks(lang); transition:persist transition:persist-props >
      - { - pagePreRendered - ? ( - - - - ) - : - } +
      diff --git a/packages/studiocms_dashboard/assets/components/islands/sidebar/VersionCheck.astro b/packages/studiocms_dashboard/assets/components/islands/sidebar/VersionCheck.astro index c7b7d0a2ab..4080c23013 100644 --- a/packages/studiocms_dashboard/assets/components/islands/sidebar/VersionCheck.astro +++ b/packages/studiocms_dashboard/assets/components/islands/sidebar/VersionCheck.astro @@ -102,7 +102,6 @@ const status = comparison === -1 ? 'outdated' : comparison === 0 ? 'latest' : 'f } document.addEventListener('astro:page-load', async () => { - setTimeout(() => {}, 1000) new ModalHelper('version-modal', 'version-modal-trigger'); }) diff --git a/packages/studiocms_dashboard/assets/routes/configuration.astro b/packages/studiocms_dashboard/assets/routes/configuration.astro index 7ff793ddf1..8a54895790 100644 --- a/packages/studiocms_dashboard/assets/routes/configuration.astro +++ b/packages/studiocms_dashboard/assets/routes/configuration.astro @@ -1,5 +1,4 @@ --- -import { prerenderRoutes as pagePreRendered } from 'studiocms:mode'; import { Button, Icon } from 'studiocms:ui/components'; // import { useTranslations } from 'studiocms:i18n'; import { Layout } from '../components'; @@ -13,7 +12,6 @@ const lang = 'en-us'; @@ -26,10 +24,6 @@ const lang = 'en-us'; - { - pagePreRendered - ? - : - } + diff --git a/packages/studiocms_dashboard/assets/routes/content-management.astro b/packages/studiocms_dashboard/assets/routes/content-management.astro index 7ae8672cc2..cd31d150b0 100644 --- a/packages/studiocms_dashboard/assets/routes/content-management.astro +++ b/packages/studiocms_dashboard/assets/routes/content-management.astro @@ -17,7 +17,6 @@ const lang = 'en-us'; title="Content Management" requiredPermission='editor' sidebar='double' - {pagePreRendered} {lang} > @@ -31,24 +30,21 @@ const lang = 'en-us'; Items
      - { pagePreRendered - ? - : - } +
      - +

      Select a page or create a new one to get started!

      - - + + diff --git a/packages/studiocms_dashboard/assets/routes/index.astro b/packages/studiocms_dashboard/assets/routes/index.astro index 321374c628..0655e890a8 100644 --- a/packages/studiocms_dashboard/assets/routes/index.astro +++ b/packages/studiocms_dashboard/assets/routes/index.astro @@ -1,6 +1,5 @@ --- import { useTranslations } from 'studiocms:i18n'; -import { prerenderRoutes as pagePreRendered } from 'studiocms:mode'; import { Layout } from '../components'; import DashboardPageHeader from '../components/DashboardPageHeader.astro'; import DashboardGrid from '../components/islands/dashboard/DashboardGrid.astro'; @@ -12,19 +11,14 @@ const t = useTranslations(lang, '@studiocms/dashboard:index');
      - + {t('sub-header')}
      - { - pagePreRendered - ? - : - } +
      diff --git a/packages/studiocms_dashboard/assets/routes/profile.astro b/packages/studiocms_dashboard/assets/routes/profile.astro index e353145379..e777033f3f 100644 --- a/packages/studiocms_dashboard/assets/routes/profile.astro +++ b/packages/studiocms_dashboard/assets/routes/profile.astro @@ -1,15 +1,11 @@ --- // import { useTranslations } from 'studiocms:i18n'; import { AuthConfig } from 'studiocms:config'; -import { prerenderRoutes as pagePreRendered } from 'studiocms:mode'; import { Layout } from '../components'; import PageHeader from '../components/PageHeader.astro'; import BasicInfo from '../components/islands/profile/BasicInfo.astro'; -import BasicInfoFallback from '../components/islands/profile/BasicInfoFallback.astro'; import SocialSignin from '../components/islands/profile/SocialSignin.astro'; -import SocialSigninFallback from '../components/islands/profile/SocialSigninFallback.astro'; import UpdatePassword from '../components/islands/profile/UpdatePassword.astro'; -import UpdatePasswordFallback from '../components/islands/profile/UpdatePasswordFallback.astro'; import { providerData, showOAuth } from '../components/islands/profile/oAuthButtonProviders'; const lang = 'en-us'; @@ -25,7 +21,6 @@ const shouldShowOAuth = showOAuth && providerData.some(({ enabled }) => enabled) @@ -35,40 +30,14 @@ const shouldShowOAuth = showOAuth && providerData.some(({ enabled }) => enabled)
      - { pagePreRendered ? ( - <> + - - - - - { usernameAndPassword && ( - - - - )} - - { shouldShowOAuth && ( - - - - )} - - - ) : ( - <> - - - - { usernameAndPassword && ( - - )} - - { shouldShowOAuth && ( - - )} + { usernameAndPassword && ( + + )} - + { shouldShowOAuth && ( + )}
      diff --git a/packages/studiocms_dashboard/assets/routes/user-management.astro b/packages/studiocms_dashboard/assets/routes/user-management.astro index 6c23c6d4dc..14e93e0b43 100644 --- a/packages/studiocms_dashboard/assets/routes/user-management.astro +++ b/packages/studiocms_dashboard/assets/routes/user-management.astro @@ -1,5 +1,4 @@ --- -import { prerenderRoutes as pagePreRendered } from 'studiocms:mode'; // import { useTranslations } from 'studiocms:i18n'; import { Layout } from '../components'; import PageHeader from '../components/PageHeader.astro'; @@ -10,7 +9,6 @@ const lang = 'en-us'; diff --git a/packages/studiocms_dashboard/src/hooks/configSetup.ts b/packages/studiocms_dashboard/src/hooks/configSetup.ts index b0e87f4232..940170767c 100644 --- a/packages/studiocms_dashboard/src/hooks/configSetup.ts +++ b/packages/studiocms_dashboard/src/hooks/configSetup.ts @@ -9,7 +9,7 @@ import { integrationLogger } from '../utils/integrationLogger.js'; const { resolve } = createResolver(import.meta.url); export const configSetup = defineUtility('astro:config:setup')( - (params, name: string, options: StudioCMSDashboardOptions, prerenderRoutes: boolean) => { + (params, name: string, options: StudioCMSDashboardOptions) => { // Destructure the params object const { logger, injectRoute } = params; @@ -138,7 +138,7 @@ export const configSetup = defineUtility('astro:config:setup')( }, ], }, - prerenderRoutes + false ); // Log that the setup is complete diff --git a/packages/studiocms_dashboard/src/index.ts b/packages/studiocms_dashboard/src/index.ts index 34ad3bad98..a32ed99560 100644 --- a/packages/studiocms_dashboard/src/index.ts +++ b/packages/studiocms_dashboard/src/index.ts @@ -10,14 +10,11 @@ const { name } = readJson<{ name: string }>(new URL('../package.json', import.me /** * StudioCMS Dashboard Integration */ -function studioCMSDashboard( - options: StudioCMSDashboardOptions, - prerenderRoutes: boolean -): AstroIntegration { +function studioCMSDashboard(options: StudioCMSDashboardOptions): AstroIntegration { return { name, hooks: { - 'astro:config:setup': (params) => configSetup(params, name, options, prerenderRoutes), + 'astro:config:setup': (params) => configSetup(params, name, options), 'astro:config:done': (params) => configDone(params), 'astro:server:start': (params) => serverStart(params, options), }, From a934b0bca1a54483347ab3cf1592168c2775bdbd Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Thu, 23 Jan 2025 05:18:09 -0800 Subject: [PATCH 443/539] Refactor PageHeader and Create components to improve type safety and remove inline scripts --- .../islands/content-mgmt/Create.astro | 95 +++++--------- .../islands/content-mgmt/Edit.astro | 120 ++++++++++-------- .../islands/content-mgmt/PageHeader.astro | 18 +-- 3 files changed, 112 insertions(+), 121 deletions(-) diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro index 900519314e..b1fae842a7 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro @@ -67,83 +67,52 @@ import { - + + From 20bc75a2609afeea739bd4d579fe6ac7b537279a Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Thu, 23 Jan 2025 05:33:13 -0800 Subject: [PATCH 445/539] Add event listener for 'astro:page-load' in Create, Edit, and PageHeader components; remove unused prerenderRoutes import in content-management route --- .../assets/components/islands/content-mgmt/Create.astro | 1 + .../assets/components/islands/content-mgmt/Edit.astro | 1 + .../assets/components/islands/content-mgmt/PageHeader.astro | 2 ++ .../studiocms_dashboard/assets/routes/content-management.astro | 1 - 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro index b1fae842a7..2ce35a1134 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro @@ -288,6 +288,7 @@ import { } listener(); + document.addEventListener('astro:page-load', listener); diff --git a/packages/studiocms_dashboard/assets/routes/content-management.astro b/packages/studiocms_dashboard/assets/routes/content-management/editpage.astro similarity index 85% rename from packages/studiocms_dashboard/assets/routes/content-management.astro rename to packages/studiocms_dashboard/assets/routes/content-management/editpage.astro index 9f3355c437..9ec8567373 100644 --- a/packages/studiocms_dashboard/assets/routes/content-management.astro +++ b/packages/studiocms_dashboard/assets/routes/content-management/editpage.astro @@ -1,12 +1,12 @@ --- +import { StudioCMSRoutes } from 'studiocms:lib'; import { Button, Divider, Icon, Input } from 'studiocms:ui/components'; // import { useTranslations } from 'studiocms:i18n'; -import { Layout } from '../components'; -import TinyMDE from '../components/component-scripts/TinyMDE.astro'; -import Create from '../components/islands/content-mgmt/Create.astro'; -import Edit from '../components/islands/content-mgmt/Edit.astro'; -import PageHeader from '../components/islands/content-mgmt/PageHeader.astro'; -import PageList from '../components/islands/content-mgmt/PageList.astro'; +import { Layout } from '../../components'; +import TinyMDE from '../../components/component-scripts/TinyMDE.astro'; +import Edit from '../../components/islands/content-mgmt/Edit.astro'; +import PageHeader from '../../components/islands/content-mgmt/PageHeader.astro'; +import PageList from '../../components/islands/content-mgmt/PageList.astro'; const lang = 'en-us'; // const t = useTranslations(lang, '@studiocms/dashboard:index'); @@ -23,7 +23,7 @@ const lang = 'en-us'; - - - diff --git a/packages/studiocms_dashboard/assets/routes/content-management/index.astro b/packages/studiocms_dashboard/assets/routes/content-management/index.astro new file mode 100644 index 0000000000..cf40099c65 --- /dev/null +++ b/packages/studiocms_dashboard/assets/routes/content-management/index.astro @@ -0,0 +1,105 @@ +--- +import { StudioCMSRoutes } from 'studiocms:lib'; +import { Button, Divider, Icon, Input } from 'studiocms:ui/components'; +// import { useTranslations } from 'studiocms:i18n'; +import { Layout } from '../../components'; +import PageHeader from '../../components/islands/content-mgmt/PageHeader.astro'; +import PageList from '../../components/islands/content-mgmt/PageList.astro'; + +const lang = 'en-us'; +// const t = useTranslations(lang, '@studiocms/dashboard:index'); +--- + + + +
      + +
      + +
      + +
      + +
      +

      Select a page or create a new one to get started!

      +
      + +
      + + diff --git a/packages/studiocms_dashboard/src/hooks/configSetup.ts b/packages/studiocms_dashboard/src/hooks/configSetup.ts index 940170767c..be907e9a80 100644 --- a/packages/studiocms_dashboard/src/hooks/configSetup.ts +++ b/packages/studiocms_dashboard/src/hooks/configSetup.ts @@ -119,7 +119,17 @@ export const configSetup = defineUtility('astro:config:setup')( { enabled: dashboardEnabled && !dbStartPage, pattern: 'content-management', - entrypoint: resolve('../../assets/routes/content-management.astro'), + entrypoint: resolve('../../assets/routes/content-management/index.astro'), + }, + { + enabled: dashboardEnabled && !dbStartPage, + pattern: 'content-management/create', + entrypoint: resolve('../../assets/routes/content-management/createpage.astro'), + }, + { + enabled: dashboardEnabled && !dbStartPage, + pattern: 'content-management/edit', + entrypoint: resolve('../../assets/routes/content-management/editpage.astro'), }, { enabled: dashboardEnabled && !dbStartPage, From 4cd8f403839a2d047945dde86b9a221200b8aeda Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Thu, 23 Jan 2025 06:21:22 -0800 Subject: [PATCH 450/539] Refactor TreeRenderer to use StudioCMSRoutes for edit links and remove placeholder info from edit page --- .../assets/components/islands/content-mgmt/TreeRenderer.astro | 3 ++- .../assets/routes/content-management/editpage.astro | 4 ---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/TreeRenderer.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/TreeRenderer.astro index 9ef9e23faf..4118ecdbd1 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/TreeRenderer.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/TreeRenderer.astro @@ -1,4 +1,5 @@ --- +import { StudioCMSRoutes } from 'studiocms:lib'; import type { FolderNode } from '@studiocms/core/sdk-utils/types'; import TreeSidebarFolder from './TreeSidebarFolder.astro'; import TreeSidebarLink from './TreeSidebarLink.astro'; @@ -29,7 +30,7 @@ const sortedData = sortTree(data); {sortedData.map(({ id, name, page, children }) => ( page ? ( - + {name} ) : ( diff --git a/packages/studiocms_dashboard/assets/routes/content-management/editpage.astro b/packages/studiocms_dashboard/assets/routes/content-management/editpage.astro index 9ec8567373..5145913025 100644 --- a/packages/studiocms_dashboard/assets/routes/content-management/editpage.astro +++ b/packages/studiocms_dashboard/assets/routes/content-management/editpage.astro @@ -38,10 +38,6 @@ const lang = 'en-us'; -
      -

      Select a page or create a new one to get started!

      -
      -
      From 35bfd678233ddefaf054067a0cfbc8d205472398 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Thu, 23 Jan 2025 06:25:03 -0800 Subject: [PATCH 451/539] Refactor Create component to rename TinyMDE editor variable for clarity --- .../assets/components/islands/content-mgmt/Create.astro | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro index 0096162c10..86e5c97c97 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro @@ -89,7 +89,6 @@ import { const parentFolderOptions = editPageGrabber.dataset.parent_folder_options; // get the elements - const createPageContainer = document.getElementById('create-page-container') as HTMLElement; const createPageForm = document.getElementById('page-create-form') as HTMLFormElement; const pageContentTextarea = createPageForm.querySelector('#page-content') as HTMLTextAreaElement; @@ -106,11 +105,11 @@ import { // Setup the TinyMDE editor // See https://github.com/jefago/tiny-markdown-editor/tree/main for more details // @ts-expect-error - Added TinyMDE to the window object - var createMDE = new TinyMDE.Editor({ textarea: pageContentTextarea }); + var tinyMDE = new TinyMDE.Editor({ textarea: pageContentTextarea }); // @ts-expect-error - Added TinyMDE to the window object var commandBar = new TinyMDE.CommandBar({ element: editorToolbar, - editor: createMDE, + editor: tinyMDE, commands: [ { name: 'bold', @@ -199,12 +198,12 @@ import { }); // @ts-expect-error - Added TinyMDE to the window object - createMDE.addEventListener('change', e => { + tinyMDE.addEventListener('change', e => { pageContentTextarea.textContent = e.content; }); // @ts-expect-error - Added TinyMDE to the window object - createMDE.addEventListener("drop", function (event) { + tinyMDE.addEventListener("drop", function (event) { let formData = new FormData(); // You can add use event.dataTransfer.items or event.dataTransfer.files From e46dd28585b8432b0fd04cd7a0bb5d1cdd4fcade Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Thu, 23 Jan 2025 06:37:23 -0800 Subject: [PATCH 452/539] Refactor content management components to improve header titles and conditional rendering of buttons --- .../islands/content-mgmt/Create.astro | 3 - .../islands/content-mgmt/Edit.astro | 3 - .../islands/content-mgmt/PageHeader.astro | 80 +++++++------------ .../content-management/createpage.astro | 4 +- .../routes/content-management/editpage.astro | 4 +- .../routes/content-management/index.astro | 2 +- 6 files changed, 35 insertions(+), 61 deletions(-) diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro index 86e5c97c97..ee28feb16f 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/Create.astro @@ -1,7 +1,6 @@ --- import { StudioCMSRoutes } from 'studiocms:lib'; import { Input, Select } from 'studiocms:ui/components'; -import TinyMDE from '../../component-scripts/TinyMDE.astro'; import { categoriesOptions, pageTypeOptions, @@ -81,8 +80,6 @@ import { > - - \ No newline at end of file diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/PageHeader.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/PageHeader.astro index 8ccbfc4f83..97ff08c3aa 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/PageHeader.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/PageHeader.astro @@ -1,6 +1,6 @@ --- import { StudioCMSRoutes } from 'studiocms:lib'; -import { Button, Icon } from 'studiocms:ui/components'; +import { Button, Group, Icon } from 'studiocms:ui/components'; interface Props { editPage?: boolean; @@ -17,21 +17,23 @@ const { editPage, createPage, title = 'Content Management' } = Astro.props;
      { editPage && ( - )} {createPage && ( - - + )}
      diff --git a/packages/studiocms_dashboard/assets/routes/content-management/createpage.astro b/packages/studiocms_dashboard/assets/routes/content-management/createpage.astro index a28add9722..12649e1bef 100644 --- a/packages/studiocms_dashboard/assets/routes/content-management/createpage.astro +++ b/packages/studiocms_dashboard/assets/routes/content-management/createpage.astro @@ -1,12 +1,10 @@ --- -import { StudioCMSRoutes } from 'studiocms:lib'; -import { Button, Divider, Icon, Input } from 'studiocms:ui/components'; // import { useTranslations } from 'studiocms:i18n'; import { Layout } from '../../components'; import TinyMDE from '../../components/component-scripts/TinyMDE.astro'; import Create from '../../components/islands/content-mgmt/Create.astro'; +import InnerSidebarElement from '../../components/islands/content-mgmt/InnerSidebarElement.astro'; import PageHeader from '../../components/islands/content-mgmt/PageHeader.astro'; -import PageList from '../../components/islands/content-mgmt/PageList.astro'; const lang = 'en-us'; // const t = useTranslations(lang, '@studiocms/dashboard:index'); @@ -21,16 +19,7 @@ const lang = 'en-us';
      @@ -54,41 +43,6 @@ const lang = 'en-us'; padding: 1rem; } - .inner-sidebar-header { - display: flex; - width: 100%; - justify-content: space-between; - align-items: center; - - & input { - margin-right: 1rem; - width: 95%; - } - } - - .add-button { - width: 32px !important; - height: 32px !important; - - padding: 0.25rem !important; - } - - .inner-sidebar-items { - display: flex; - flex-direction: column; - gap: .375rem; - width: 100%; - height: 100%; - } - - input[name=search] { - /* heroicons:magnifying-glass-16-solid */ - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAndJREFUSEvFlUtoFEEQhv/qRVkvevARiM+DiOAjKooS0KCYg9EIigrGi3jzIBK8bNdsCIHt3mURET14EwQhugQRIxg8KMRHEIMGQUFyCCiBGFBE8LLsdLkTZsUkm52BZLGuXV3f/FX19xDqHFTn+vh/gO7u7sXJZPK0iFwAsAnASgBjRDTsnOsvFot9PT09LqoDVRVkMpnVSqkBAFtrFBgBcI6ZP9WCzAIYYxqI6B2AxvDiGxEZSCQS733f30lEbQD2hGcTzrnd6XR6fC7INICIUDabfQ6gBcAkgIvM/GDmZWvtKRG5RUQrAAwxc3MsgDGmlYieBslEdERrHbSpahhjjhLR4zC3Q2vdWy1xmgJr7X0AZwA8ZOYTUQO01vYDOEZE/Vrr43EAYwA2ALjMzDeiAMaYK0R0NWgnMzfEARQBLBKRNs/znkQBMplMu1LqEYAfzLw8DuALgLUAOpn5ehTAGNNJRNcAfGXmdXEAlRncYebzUQBr7d3ACwB6mbkjEvCP5N8i0ux53ocaW7SLiF4CWAKgnZmnNmpmzDJaNpsdKhtrX9kD35xzJ9Pp9OsqPthfdnkfgFXlLRpm5orxogG5XK7JOTcIYCkAR0Q3nXPBszBORGuIqElELgFQYbVJ3/cPdHV1fY6lIEgyxmwnomA71teYwysAGwEE6/ldKdWSSqU+RraoklAoFBKjo6NnlVKtIrIDwBYAPoBA3T2t9e18Pr+5VCoNhk/GTxE56HleoPZvzPt/kMvltjnnXgBYBuBXefCHtdZvK4R5A8KWBhv1LIRMaK0biUim3qmoXY97bq3dCyBw/wgzH1pQBbU+YsEUzAWpO+APfeLiGcjy+NMAAAAASUVORK5CYII=") !important; - background-position: 6px 6px !important; - background-repeat: no-repeat !important; - padding: .5rem 20px .5rem 2rem !important; - } - .placeholder-info { display: flex; justify-content: center; diff --git a/packages/studiocms_dashboard/assets/routes/content-management/editpage.astro b/packages/studiocms_dashboard/assets/routes/content-management/editpage.astro index 1d4c3c1b82..296f564275 100644 --- a/packages/studiocms_dashboard/assets/routes/content-management/editpage.astro +++ b/packages/studiocms_dashboard/assets/routes/content-management/editpage.astro @@ -1,12 +1,10 @@ --- -import { StudioCMSRoutes } from 'studiocms:lib'; -import { Button, Divider, Icon, Input } from 'studiocms:ui/components'; // import { useTranslations } from 'studiocms:i18n'; import { Layout } from '../../components'; import TinyMDE from '../../components/component-scripts/TinyMDE.astro'; import Edit from '../../components/islands/content-mgmt/Edit.astro'; +import InnerSidebarElement from '../../components/islands/content-mgmt/InnerSidebarElement.astro'; import PageHeader from '../../components/islands/content-mgmt/PageHeader.astro'; -import PageList from '../../components/islands/content-mgmt/PageList.astro'; const lang = 'en-us'; // const t = useTranslations(lang, '@studiocms/dashboard:index'); @@ -21,16 +19,7 @@ const lang = 'en-us';
      @@ -54,41 +43,6 @@ const lang = 'en-us'; padding: 1rem; } - .inner-sidebar-header { - display: flex; - width: 100%; - justify-content: space-between; - align-items: center; - - & input { - margin-right: 1rem; - width: 95%; - } - } - - .add-button { - width: 32px !important; - height: 32px !important; - - padding: 0.25rem !important; - } - - .inner-sidebar-items { - display: flex; - flex-direction: column; - gap: .375rem; - width: 100%; - height: 100%; - } - - input[name=search] { - /* heroicons:magnifying-glass-16-solid */ - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAndJREFUSEvFlUtoFEEQhv/qRVkvevARiM+DiOAjKooS0KCYg9EIigrGi3jzIBK8bNdsCIHt3mURET14EwQhugQRIxg8KMRHEIMGQUFyCCiBGFBE8LLsdLkTZsUkm52BZLGuXV3f/FX19xDqHFTn+vh/gO7u7sXJZPK0iFwAsAnASgBjRDTsnOsvFot9PT09LqoDVRVkMpnVSqkBAFtrFBgBcI6ZP9WCzAIYYxqI6B2AxvDiGxEZSCQS733f30lEbQD2hGcTzrnd6XR6fC7INICIUDabfQ6gBcAkgIvM/GDmZWvtKRG5RUQrAAwxc3MsgDGmlYieBslEdERrHbSpahhjjhLR4zC3Q2vdWy1xmgJr7X0AZwA8ZOYTUQO01vYDOEZE/Vrr43EAYwA2ALjMzDeiAMaYK0R0NWgnMzfEARQBLBKRNs/znkQBMplMu1LqEYAfzLw8DuALgLUAOpn5ehTAGNNJRNcAfGXmdXEAlRncYebzUQBr7d3ACwB6mbkjEvCP5N8i0ux53ocaW7SLiF4CWAKgnZmnNmpmzDJaNpsdKhtrX9kD35xzJ9Pp9OsqPthfdnkfgFXlLRpm5orxogG5XK7JOTcIYCkAR0Q3nXPBszBORGuIqElELgFQYbVJ3/cPdHV1fY6lIEgyxmwnomA71teYwysAGwEE6/ldKdWSSqU+RraoklAoFBKjo6NnlVKtIrIDwBYAPoBA3T2t9e18Pr+5VCoNhk/GTxE56HleoPZvzPt/kMvltjnnXgBYBuBXefCHtdZvK4R5A8KWBhv1LIRMaK0biUim3qmoXY97bq3dCyBw/wgzH1pQBbU+YsEUzAWpO+APfeLiGcjy+NMAAAAASUVORK5CYII=") !important; - background-position: 6px 6px !important; - background-repeat: no-repeat !important; - padding: .5rem 20px .5rem 2rem !important; - } - .placeholder-info { display: flex; justify-content: center; diff --git a/packages/studiocms_dashboard/assets/routes/content-management/index.astro b/packages/studiocms_dashboard/assets/routes/content-management/index.astro index 4fda7f812f..a36e52bb36 100644 --- a/packages/studiocms_dashboard/assets/routes/content-management/index.astro +++ b/packages/studiocms_dashboard/assets/routes/content-management/index.astro @@ -1,10 +1,8 @@ --- -import { StudioCMSRoutes } from 'studiocms:lib'; -import { Button, Divider, Icon, Input } from 'studiocms:ui/components'; // import { useTranslations } from 'studiocms:i18n'; import { Layout } from '../../components'; +import InnerSidebarElement from '../../components/islands/content-mgmt/InnerSidebarElement.astro'; import PageHeader from '../../components/islands/content-mgmt/PageHeader.astro'; -import PageList from '../../components/islands/content-mgmt/PageList.astro'; const lang = 'en-us'; // const t = useTranslations(lang, '@studiocms/dashboard:index'); @@ -19,16 +17,7 @@ const lang = 'en-us';
      @@ -52,41 +41,6 @@ const lang = 'en-us'; padding: 1rem; } - .inner-sidebar-header { - display: flex; - width: 100%; - justify-content: space-between; - align-items: center; - - & input { - margin-right: 1rem; - width: 95%; - } - } - - .add-button { - width: 32px !important; - height: 32px !important; - - padding: 0.25rem !important; - } - - .inner-sidebar-items { - display: flex; - flex-direction: column; - gap: .375rem; - width: 100%; - height: 100%; - } - - input[name=search] { - /* heroicons:magnifying-glass-16-solid */ - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAndJREFUSEvFlUtoFEEQhv/qRVkvevARiM+DiOAjKooS0KCYg9EIigrGi3jzIBK8bNdsCIHt3mURET14EwQhugQRIxg8KMRHEIMGQUFyCCiBGFBE8LLsdLkTZsUkm52BZLGuXV3f/FX19xDqHFTn+vh/gO7u7sXJZPK0iFwAsAnASgBjRDTsnOsvFot9PT09LqoDVRVkMpnVSqkBAFtrFBgBcI6ZP9WCzAIYYxqI6B2AxvDiGxEZSCQS733f30lEbQD2hGcTzrnd6XR6fC7INICIUDabfQ6gBcAkgIvM/GDmZWvtKRG5RUQrAAwxc3MsgDGmlYieBslEdERrHbSpahhjjhLR4zC3Q2vdWy1xmgJr7X0AZwA8ZOYTUQO01vYDOEZE/Vrr43EAYwA2ALjMzDeiAMaYK0R0NWgnMzfEARQBLBKRNs/znkQBMplMu1LqEYAfzLw8DuALgLUAOpn5ehTAGNNJRNcAfGXmdXEAlRncYebzUQBr7d3ACwB6mbkjEvCP5N8i0ux53ocaW7SLiF4CWAKgnZmnNmpmzDJaNpsdKhtrX9kD35xzJ9Pp9OsqPthfdnkfgFXlLRpm5orxogG5XK7JOTcIYCkAR0Q3nXPBszBORGuIqElELgFQYbVJ3/cPdHV1fY6lIEgyxmwnomA71teYwysAGwEE6/ldKdWSSqU+RraoklAoFBKjo6NnlVKtIrIDwBYAPoBA3T2t9e18Pr+5VCoNhk/GTxE56HleoPZvzPt/kMvltjnnXgBYBuBXefCHtdZvK4R5A8KWBhv1LIRMaK0biUim3qmoXY97bq3dCyBw/wgzH1pQBbU+YsEUzAWpO+APfeLiGcjy+NMAAAAASUVORK5CYII=") !important; - background-position: 6px 6px !important; - background-repeat: no-repeat !important; - padding: .5rem 20px .5rem 2rem !important; - } - .placeholder-info { display: flex; justify-content: center; From 9b6f17d37cb495e246e7c9d50b165ef2494a01b1 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Thu, 23 Jan 2025 13:21:33 -0800 Subject: [PATCH 459/539] Add folder creation and editing routes, enhance InnerSidebarElement with dropdown for folder actions --- packages/studiocms_core/src/lib/routeMap.ts | 2 + .../content-mgmt/InnerSidebarElement.astro | 22 +++++-- .../islands/content-mgmt/PageList.astro | 62 +++++++++---------- .../islands/content-mgmt/TreeRenderer.astro | 2 +- .../content-mgmt/TreeSidebarFolder.astro | 56 +++++++++++++++-- .../content-management/createfolder.astro | 55 ++++++++++++++++ .../content-management/editfolder.astro | 55 ++++++++++++++++ .../src/hooks/configSetup.ts | 10 +++ 8 files changed, 223 insertions(+), 41 deletions(-) create mode 100644 packages/studiocms_dashboard/assets/routes/content-management/createfolder.astro create mode 100644 packages/studiocms_dashboard/assets/routes/content-management/editfolder.astro diff --git a/packages/studiocms_core/src/lib/routeMap.ts b/packages/studiocms_core/src/lib/routeMap.ts index 1fc9d4e0ca..ff9e86f80f 100644 --- a/packages/studiocms_core/src/lib/routeMap.ts +++ b/packages/studiocms_core/src/lib/routeMap.ts @@ -38,6 +38,8 @@ export const StudioCMSRoutes = { contentManagement: makeDashboardRoute('content-management'), contentManagementCreate: makeDashboardRoute('content-management/create'), contentManagementEdit: makeDashboardRoute('content-management/edit'), + contentManagementFolderCreate: makeDashboardRoute('content-management/create-folder'), + contentManagementFolderEdit: makeDashboardRoute('content-management/edit-folder'), createPage: makeDashboardRoute('create-page'), siteConfiguration: makeDashboardRoute('configuration'), userManagement: makeDashboardRoute('user-management'), diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro index 1365266ff6..940b5958db 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro @@ -1,14 +1,22 @@ --- import { StudioCMSRoutes } from 'studiocms:lib'; -import { Button, Divider, Icon, Input, TabItem, Tabs } from 'studiocms:ui/components'; +import { Button, Divider, Dropdown, Icon, Input } from 'studiocms:ui/components'; import PageList from './PageList.astro'; ---
      - + + +
      Items @@ -17,6 +25,12 @@ import PageList from './PageList.astro'; + + diff --git a/packages/studiocms_dashboard/assets/routes/content-management/createfolder.astro b/packages/studiocms_dashboard/assets/routes/content-management/createfolder.astro new file mode 100644 index 0000000000..18b778fe91 --- /dev/null +++ b/packages/studiocms_dashboard/assets/routes/content-management/createfolder.astro @@ -0,0 +1,55 @@ +--- +// import { useTranslations } from 'studiocms:i18n'; +import { Layout } from '../../components'; +import InnerSidebarElement from '../../components/islands/content-mgmt/InnerSidebarElement.astro'; +import PageHeader from '../../components/islands/content-mgmt/PageHeader.astro'; + +const lang = 'en-us'; +// const t = useTranslations(lang, '@studiocms/dashboard:index'); +--- + + + +
      + +
      + +
      + +
      + +
      + + diff --git a/packages/studiocms_dashboard/assets/routes/content-management/editfolder.astro b/packages/studiocms_dashboard/assets/routes/content-management/editfolder.astro new file mode 100644 index 0000000000..c81e45c8c9 --- /dev/null +++ b/packages/studiocms_dashboard/assets/routes/content-management/editfolder.astro @@ -0,0 +1,55 @@ +--- +// import { useTranslations } from 'studiocms:i18n'; +import { Layout } from '../../components'; +import InnerSidebarElement from '../../components/islands/content-mgmt/InnerSidebarElement.astro'; +import PageHeader from '../../components/islands/content-mgmt/PageHeader.astro'; + +const lang = 'en-us'; +// const t = useTranslations(lang, '@studiocms/dashboard:index'); +--- + + + +
      + +
      + +
      + +
      + +
      + + diff --git a/packages/studiocms_dashboard/src/hooks/configSetup.ts b/packages/studiocms_dashboard/src/hooks/configSetup.ts index be907e9a80..a5f80492e5 100644 --- a/packages/studiocms_dashboard/src/hooks/configSetup.ts +++ b/packages/studiocms_dashboard/src/hooks/configSetup.ts @@ -126,11 +126,21 @@ export const configSetup = defineUtility('astro:config:setup')( pattern: 'content-management/create', entrypoint: resolve('../../assets/routes/content-management/createpage.astro'), }, + { + enabled: dashboardEnabled && !dbStartPage, + pattern: 'content-management/create-folder', + entrypoint: resolve('../../assets/routes/content-management/createfolder.astro'), + }, { enabled: dashboardEnabled && !dbStartPage, pattern: 'content-management/edit', entrypoint: resolve('../../assets/routes/content-management/editpage.astro'), }, + { + enabled: dashboardEnabled && !dbStartPage, + pattern: 'content-management/edit-folder', + entrypoint: resolve('../../assets/routes/content-management/editfolder.astro'), + }, { enabled: dashboardEnabled && !dbStartPage, pattern: 'profile', From 323e0ae8b73115c9d6e9df7f461aec8042a64ef3 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Thu, 23 Jan 2025 13:22:15 -0800 Subject: [PATCH 460/539] Add alignment to InnerSidebarElement dropdown for improved layout --- .../components/islands/content-mgmt/InnerSidebarElement.astro | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro index 940b5958db..6be0c4dabc 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro @@ -12,6 +12,7 @@ import PageList from './PageList.astro'; { label: 'Create Page', value: '1', href: StudioCMSRoutes.mainLinks.contentManagementCreate}, { label: 'Create Folder', value: '2', href: StudioCMSRoutes.mainLinks.contentManagementFolderCreate}, ]} + align={'end'} > @@ -299,4 +301,65 @@ const status = comparison === -1 ? 'outdated' : comparison === 0 ? 'latest' : 'f -webkit-mask-size: 100% 100%; mask-size: 100% 100%; } + .version-check { + display: flex; + flex-direction: row; + gap: .375rem; + width: 100%; + justify-content: left; + text-align: center; + align-items: center; + align-content: center; + vertical-align: middle; + color: hsl(var(--text-muted)); + font-size: .875em; + font-weight: 700; + } + + .version-check:hover { + color: hsl(var(--primary-base)); + cursor: pointer; + } + + .outdated { + display: inline-block; + width: 14px; + height: 14px; + --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M12 16.5V9.75m0 0l3 3m-3-3l-3 3M6.75 19.5a4.5 4.5 0 0 1-1.41-8.775a5.25 5.25 0 0 1 10.233-2.33a3 3 0 0 1 3.758 3.848A3.752 3.752 0 0 1 18 19.5z'/%3E%3C/svg%3E"); + background-color: hsl(var(--warning-base)); + -webkit-mask-image: var(--svg); + mask-image: var(--svg); + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-size: 100% 100%; + mask-size: 100% 100%; + } + + .latest { + display: inline-block; + width: 14px; + height: 14px; + --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m4.5 12.75l6 6l9-13.5'/%3E%3C/svg%3E"); + background-color: hsl(var(--success-base)); + -webkit-mask-image: var(--svg); + mask-image: var(--svg); + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-size: 100% 100%; + mask-size: 100% 100%; + } + + .future { + display: inline-block; + width: 14px; + height: 14px; + --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M9.75 3.104v5.714a2.25 2.25 0 0 1-.659 1.591L5 14.5M9.75 3.104q-.376.034-.75.082m.75-.082a24.3 24.3 0 0 1 4.5 0m0 0v5.714c0 .597.237 1.17.659 1.591L19.8 15.3M14.25 3.104q.377.034.75.082M19.8 15.3l-1.57.393A9.07 9.07 0 0 1 12 15a9.07 9.07 0 0 0-6.23-.693L5 14.5m14.8.8l1.402 1.402c1.232 1.232.65 3.318-1.067 3.611A48.3 48.3 0 0 1 12 21a48 48 0 0 1-8.135-.687c-1.718-.293-2.3-2.379-1.067-3.61L5 14.5'/%3E%3C/svg%3E"); + background-color: hsl(var(--primary-base)); + -webkit-mask-image: var(--svg); + mask-image: var(--svg); + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-size: 100% 100%; + mask-size: 100% 100%; + } diff --git a/packages/studiocms_dashboard/assets/components/shared-parts/VersionCheck.astro b/packages/studiocms_dashboard/assets/components/shared-parts/VersionCheck.astro deleted file mode 100644 index acbd26fd51..0000000000 --- a/packages/studiocms_dashboard/assets/components/shared-parts/VersionCheck.astro +++ /dev/null @@ -1,79 +0,0 @@ ---- -import currentVersion from 'studiocms:version'; - -interface Props { - status?: 'outdated' | 'latest' | 'future'; -} - -const { status } = Astro.props; ---- - - - v{currentVersion} - {status && } - - - \ No newline at end of file diff --git a/packages/studiocms_dashboard/assets/routes/configuration.astro b/packages/studiocms_dashboard/assets/routes/configuration.astro index 8a54895790..8a55b89aa6 100644 --- a/packages/studiocms_dashboard/assets/routes/configuration.astro +++ b/packages/studiocms_dashboard/assets/routes/configuration.astro @@ -17,13 +17,13 @@ const lang = 'en-us';
      -
      - + diff --git a/packages/studiocms_dashboard/assets/routes/profile.astro b/packages/studiocms_dashboard/assets/routes/profile.astro index e777033f3f..2598fb3fa9 100644 --- a/packages/studiocms_dashboard/assets/routes/profile.astro +++ b/packages/studiocms_dashboard/assets/routes/profile.astro @@ -30,14 +30,14 @@ const shouldShowOAuth = showOAuth && providerData.some(({ enabled }) => enabled)
      - + { usernameAndPassword && ( - + )} { shouldShowOAuth && ( - + )}
      diff --git a/packages/studiocms_robotstxt/src/core.ts b/packages/studiocms_robotstxt/src/core.ts index 21223f3b9e..e25449d5d1 100644 --- a/packages/studiocms_robotstxt/src/core.ts +++ b/packages/studiocms_robotstxt/src/core.ts @@ -1,6 +1,6 @@ import path from 'node:path'; import type { AstroIntegrationLogger } from 'astro'; -import type { RobotsConfig } from './index.js'; +import type { RobotsConfig } from './types.js'; function validateHost(host: string, logger: AstroIntegrationLogger) { const hostPattern = /^(?=.{1,253}$)(?:(?!-)[a-zA-Z0-9-]{1,63}(?(new URL('../package.json', import.meta.url)); -function getFileSizeInKilobytes(filename: URL): number { - const stats = fs.statSync(filename); - const fileSizeInBytes = stats.size; - const fileSizeInKilobytes = fileSizeInBytes / 1024; - return fileSizeInKilobytes; -} - -export interface RobotsConfig { - /** - * @default false - * @description - * [ Optional ] Some crawlers(Yandex) support and only accept domain names. - * @example - * ```ts - * integrations:[ - * robots({ - * host: siteUrl.replace(/^https?:\/\/|:\d+/g, "") - * }) - * ] - * ``` - */ - host?: boolean | string; - /** - * @description - * [ Optional, zero or more per file ] The location of a sitemap for this website. - * @example - * ```ts - * sitemap: [ - * "https://example.com/sitemap.xml", - * "https://www.example.com/sitemap.xml" - * ] - * ``` - * The value of the [SITEMAP](https://developers.google.com/search/docs/crawling-indexing/robots/robots_txt#sitemap) field is case-sensitive. - */ - sitemap?: boolean | string | string[]; - /** - * @description - * [ Optional ] List of `policy` rules. - * @default - * ```ts - * policy:[ - * { - * userAgent: "*", - * allow: "/" - * } - * ] - * ``` - * For more help, refer to [SYNTAX](https://yandex.com/support/webmaster/controlling-robot/robots-txt.html#recommend) by Yandex. - */ - policy?: PolicyOptions[] | undefined; -} -export interface PolicyOptions { - /** - * @description - * [ Required ] Indicates the robot to which the rules listed in `robots.txt` apply. - * @example - * ```ts - * policy:[ - * { - * userAgent: [ - * 'Googlebot', - * 'Applebot', - * 'Baiduspider', - * 'bingbot' - * ], - * // crawling rule(s) for above bots - * } - * ] - * ``` - * Verified bots, refer to [DITIG](https://www.ditig.com/robots-txt-template#regular-template) or [Cloudflare Radar](https://radar.cloudflare.com/traffic/verified-bots). - */ - userAgent?: UserAgentType | UserAgentType[]; - /** - * @description - * [ At least one or more `allow` or `disallow` entries per rule ] Allows indexing site sections or individual pages. - * @example - * ```ts - * policy:[{allow:["/"]}] - * ``` - * Path-based URL matching, refer to [SYNTAX](https://developers.google.com/search/docs/crawling-indexing/robots/robots_txt#url-matching-based-on-path-values) via Google. - */ - allow?: string | string[]; - /** - * @description - * [ At least one or more `disallow` or `allow` entries per rule ] Prohibits indexing site sections or individual pages. - * @example - * ```ts - * policy:[ - * { - * disallow:[ - * "/admin", - * "/uploads/1989-08-21/*.jpg$" - * ] - * } - * ] - * ``` - * Path-based URL matching, refer to [SYNTAX](https://developers.google.com/search/docs/crawling-indexing/robots/robots_txt#url-matching-based-on-path-values) via Google. - */ - disallow?: string | string[]; - /** - * @description - * [ Optional ] Specifies the minimum interval (in seconds) for the search robot to wait after loading one page, before starting to load another. - * - * @example - * ```ts - * policy:[{crawlDelay:5}] - * ``` - * About the [Crawl-delay](https://yandex.com/support/webmaster/robot-workings/crawl-delay.html#crawl-delay) directive. - */ - crawlDelay?: number; - /** - * @description - * [ Optional ] Indicates to the robot that the page URL contains parameters (like UTM tags) that should be ignored when indexing it. - * - * @example - * ```bash - * # for URLs like: - * www.example2.com/index.php?page=1&sid=2564126ebdec301c607e5df - * www.example2.com/index.php?page=1&sid=974017dcd170d6c4a5d76ae - * ``` - * ```ts - * policy:[ - * { - * cleanParam: [ - * "sid /index.php", - * ] - * } - * ] - * ``` - * For additional examples, please consult - * Yandex's [SYNTAX](https://yandex.com/support/webmaster/robot-workings/clean-param.html#clean-param__additional) guide. - */ - cleanParam?: string | string[]; -} - const defaultConfig: RobotsConfig = { sitemap: true, host: false, diff --git a/packages/studiocms_robotstxt/src/consts.ts b/packages/studiocms_robotstxt/src/types.ts similarity index 51% rename from packages/studiocms_robotstxt/src/consts.ts rename to packages/studiocms_robotstxt/src/types.ts index bb2392212d..bfb5dc98c0 100644 --- a/packages/studiocms_robotstxt/src/consts.ts +++ b/packages/studiocms_robotstxt/src/types.ts @@ -131,3 +131,132 @@ export type UserAgentType = | SearchEngines[keyof SearchEngines] | SocialNetwork[keyof SocialNetwork] | SearchEngineOptimization[keyof SearchEngineOptimization]; + +export interface RobotsConfig { + /** + * @default false + * @description + * [ Optional ] Some crawlers(Yandex) support and only accept domain names. + * @example + * ```ts + * integrations:[ + * robots({ + * host: siteUrl.replace(/^https?:\/\/|:\d+/g, "") + * }) + * ] + * ``` + */ + host?: boolean | string; + /** + * @description + * [ Optional, zero or more per file ] The location of a sitemap for this website. + * @example + * ```ts + * sitemap: [ + * "https://example.com/sitemap.xml", + * "https://www.example.com/sitemap.xml" + * ] + * ``` + * The value of the [SITEMAP](https://developers.google.com/search/docs/crawling-indexing/robots/robots_txt#sitemap) field is case-sensitive. + */ + sitemap?: boolean | string | string[]; + /** + * @description + * [ Optional ] List of `policy` rules. + * @default + * ```ts + * policy:[ + * { + * userAgent: "*", + * allow: "/" + * } + * ] + * ``` + * For more help, refer to [SYNTAX](https://yandex.com/support/webmaster/controlling-robot/robots-txt.html#recommend) by Yandex. + */ + policy?: PolicyOptions[] | undefined; +} + +export interface PolicyOptions { + /** + * @description + * [ Required ] Indicates the robot to which the rules listed in `robots.txt` apply. + * @example + * ```ts + * policy:[ + * { + * userAgent: [ + * 'Googlebot', + * 'Applebot', + * 'Baiduspider', + * 'bingbot' + * ], + * // crawling rule(s) for above bots + * } + * ] + * ``` + * Verified bots, refer to [DITIG](https://www.ditig.com/robots-txt-template#regular-template) or [Cloudflare Radar](https://radar.cloudflare.com/traffic/verified-bots). + */ + userAgent?: UserAgentType | UserAgentType[]; + /** + * @description + * [ At least one or more `allow` or `disallow` entries per rule ] Allows indexing site sections or individual pages. + * @example + * ```ts + * policy:[{allow:["/"]}] + * ``` + * Path-based URL matching, refer to [SYNTAX](https://developers.google.com/search/docs/crawling-indexing/robots/robots_txt#url-matching-based-on-path-values) via Google. + */ + allow?: string | string[]; + /** + * @description + * [ At least one or more `disallow` or `allow` entries per rule ] Prohibits indexing site sections or individual pages. + * @example + * ```ts + * policy:[ + * { + * disallow:[ + * "/admin", + * "/uploads/1989-08-21/*.jpg$" + * ] + * } + * ] + * ``` + * Path-based URL matching, refer to [SYNTAX](https://developers.google.com/search/docs/crawling-indexing/robots/robots_txt#url-matching-based-on-path-values) via Google. + */ + disallow?: string | string[]; + /** + * @description + * [ Optional ] Specifies the minimum interval (in seconds) for the search robot to wait after loading one page, before starting to load another. + * + * @example + * ```ts + * policy:[{crawlDelay:5}] + * ``` + * About the [Crawl-delay](https://yandex.com/support/webmaster/robot-workings/crawl-delay.html#crawl-delay) directive. + */ + crawlDelay?: number; + /** + * @description + * [ Optional ] Indicates to the robot that the page URL contains parameters (like UTM tags) that should be ignored when indexing it. + * + * @example + * ```bash + * # for URLs like: + * www.example2.com/index.php?page=1&sid=2564126ebdec301c607e5df + * www.example2.com/index.php?page=1&sid=974017dcd170d6c4a5d76ae + * ``` + * ```ts + * policy:[ + * { + * cleanParam: [ + * "sid /index.php", + * ] + * } + * ] + * ``` + * For additional examples, please consult + * Yandex's [SYNTAX](https://yandex.com/support/webmaster/robot-workings/clean-param.html#clean-param__additional) guide. + */ + cleanParam?: string | string[]; +} diff --git a/packages/studiocms_robotstxt/src/utils.ts b/packages/studiocms_robotstxt/src/utils.ts new file mode 100644 index 0000000000..b2e22d5638 --- /dev/null +++ b/packages/studiocms_robotstxt/src/utils.ts @@ -0,0 +1,20 @@ +import fs from 'node:fs'; + +export function readJson(path: string | URL): T { + return JSON.parse(fs.readFileSync(path, 'utf-8')); +} + +export function measureExecutionTime(callback: () => void): number { + const startTime = performance.now(); + callback(); + const endTime = performance.now(); + const executionTime = Math.floor(endTime - startTime); + return executionTime; +} + +export function getFileSizeInKilobytes(filename: URL): number { + const stats = fs.statSync(filename); + const fileSizeInBytes = stats.size; + const fileSizeInKilobytes = fileSizeInBytes / 1024; + return fileSizeInKilobytes; +} diff --git a/packages/studiocms_robotstxt/src/utils/index.ts b/packages/studiocms_robotstxt/src/utils/index.ts deleted file mode 100644 index 53bf678a7c..0000000000 --- a/packages/studiocms_robotstxt/src/utils/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as measureExecutionTime } from './measureExecutionTime.js'; diff --git a/packages/studiocms_robotstxt/src/utils/measureExecutionTime.ts b/packages/studiocms_robotstxt/src/utils/measureExecutionTime.ts deleted file mode 100644 index 7bc9212375..0000000000 --- a/packages/studiocms_robotstxt/src/utils/measureExecutionTime.ts +++ /dev/null @@ -1,7 +0,0 @@ -export default function measureExecutionTime(callback: () => void): number { - const startTime = performance.now(); - callback(); - const endTime = performance.now(); - const executionTime = Math.floor(endTime - startTime); - return executionTime; -} diff --git a/packages/studiocms_robotstxt/src/utils/readJson.ts b/packages/studiocms_robotstxt/src/utils/readJson.ts deleted file mode 100644 index 1490cf858a..0000000000 --- a/packages/studiocms_robotstxt/src/utils/readJson.ts +++ /dev/null @@ -1,5 +0,0 @@ -import fs from 'node:fs'; - -export default function readJson(path: string | URL): T { - return JSON.parse(fs.readFileSync(path, 'utf-8')); -} From 4a40e2d2687b3200891ec04402ced522fd4ebad6 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Sat, 25 Jan 2025 05:38:35 -0800 Subject: [PATCH 501/539] Remove unnecessary check for dropdown existence in InnerSidebarElement --- .../components/islands/content-mgmt/InnerSidebarElement.astro | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro index 9100481b81..913dc15f6b 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro @@ -38,7 +38,6 @@ const { isNewFolder, isNewPage } = Astro.props; import { DropdownHelper } from 'studiocms:ui/components'; document.addEventListener('astro:page-load', () => { - if (!document.getElementById('create-new-dropdown-dropdown')) return; const createNewDropdown = new DropdownHelper('create-new-dropdown'); createNewDropdown.registerClickCallback((value) => { From 84100e997ad33e4a33fb23e7dc9e599e4afca601 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Sat, 25 Jan 2025 05:44:47 -0800 Subject: [PATCH 502/539] Add transition effects to MainSidebarContent and Dropdown components --- .../studiocms_dashboard/assets/components/DoubleSidebar.astro | 2 +- .../assets/components/MainSidebarContent.astro | 2 ++ .../studiocms_dashboard/assets/components/SingleSidebar.astro | 2 +- .../components/islands/content-mgmt/InnerSidebarElement.astro | 2 ++ 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/studiocms_dashboard/assets/components/DoubleSidebar.astro b/packages/studiocms_dashboard/assets/components/DoubleSidebar.astro index f46beed88d..eee959336c 100644 --- a/packages/studiocms_dashboard/assets/components/DoubleSidebar.astro +++ b/packages/studiocms_dashboard/assets/components/DoubleSidebar.astro @@ -5,7 +5,7 @@ import MainSidebarContent from './MainSidebarContent.astro';
      - +
      diff --git a/packages/studiocms_dashboard/assets/components/MainSidebarContent.astro b/packages/studiocms_dashboard/assets/components/MainSidebarContent.astro index 8462f06082..e42acb7fe9 100644 --- a/packages/studiocms_dashboard/assets/components/MainSidebarContent.astro +++ b/packages/studiocms_dashboard/assets/components/MainSidebarContent.astro @@ -53,6 +53,8 @@ const sidebar = getSidebarLinks(lang);
      - + + }; - \ No newline at end of file + } + + .add-button { + width: 32px !important; + height: 32px !important; + padding: 0.25rem !important; + } + + .inner-sidebar-items { + display: flex; + flex-direction: column; + gap: .375rem; + width: 100%; + height: 100%; + } + + input[name=search] { + /* heroicons:magnifying-glass-16-solid */ + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAndJREFUSEvFlUtoFEEQhv/qRVkvevARiM+DiOAjKooS0KCYg9EIigrGi3jzIBK8bNdsCIHt3mURET14EwQhugQRIxg8KMRHEIMGQUFyCCiBGFBE8LLsdLkTZsUkm52BZLGuXV3f/FX19xDqHFTn+vh/gO7u7sXJZPK0iFwAsAnASgBjRDTsnOsvFot9PT09LqoDVRVkMpnVSqkBAFtrFBgBcI6ZP9WCzAIYYxqI6B2AxvDiGxEZSCQS733f30lEbQD2hGcTzrnd6XR6fC7INICIUDabfQ6gBcAkgIvM/GDmZWvtKRG5RUQrAAwxc3MsgDGmlYieBslEdERrHbSpahhjjhLR4zC3Q2vdWy1xmgJr7X0AZwA8ZOYTUQO01vYDOEZE/Vrr43EAYwA2ALjMzDeiAMaYK0R0NWgnMzfEARQBLBKRNs/znkQBMplMu1LqEYAfzLw8DuALgLUAOpn5ehTAGNNJRNcAfGXmdXEAlRncYebzUQBr7d3ACwB6mbkjEvCP5N8i0ux53ocaW7SLiF4CWAKgnZmnNmpmzDJaNpsdKhtrX9kD35xzJ9Pp9OsqPthfdnkfgFXlLRpm5orxogG5XK7JOTcIYCkAR0Q3nXPBszBORGuIqElELgFQYbVJ3/cPdHV1fY6lIEgyxmwnomA71teYwysAGwEE6/ldKdWSSqU+RraoklAoFBKjo6NnlVKtIrIDwBYAPoBA3T2t9e18Pr+5VCoNhk/GTxE56HleoPZvzPt/kMvltjnnXgBYBuBXefCHtdZvK4R5A8KWBhv1LIRMaK0biUim3qmoXY97bq3dCyBw/wgzH1pQBbU+YsEUzAWpO+APfeLiGcjy+NMAAAAASUVORK5CYII=") !important; + background-position: 6px 6px !important; + background-repeat: no-repeat !important; + padding: .5rem 20px .5rem 2rem !important; + } + + \ No newline at end of file diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/PageList.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/PageList.astro index f8187057e3..e5b0315c17 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/PageList.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/PageList.astro @@ -1,6 +1,6 @@ --- -import studioCMS_SDK_Cache from 'studiocms:sdk/cache'; import TreeRenderer from './TreeRenderer.astro'; +import { PageFolderTree } from './shared'; interface Props { isNewFolder?: boolean; @@ -9,8 +9,6 @@ interface Props { const { isNewFolder, isNewPage } = Astro.props; -const { data } = await studioCMS_SDK_Cache.GET.pageFolderTree(); - const testData = [ { id: '1', @@ -44,4 +42,4 @@ const testData = [ ]; --- - \ No newline at end of file + \ No newline at end of file diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/shared.ts b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/shared.ts index 4df921dc79..c861f91488 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/shared.ts +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/shared.ts @@ -8,7 +8,9 @@ interface PluginListItem { const { data: folderList } = await studioCMS_SDK_Cache.GET.folderList(); -const parentFolders = folderList.map(({ id: value, name: label }) => ({ value, label })); +export const { data: PageFolderTree } = await studioCMS_SDK_Cache.GET.pageFolderTree(); + +export const parentFolders = folderList.map(({ id: value, name: label }) => ({ value, label })); // EXPORTS diff --git a/packages/studiocms_dashboard/assets/styles/base.css b/packages/studiocms_dashboard/assets/styles/base.css index 421e762a58..675410a824 100644 --- a/packages/studiocms_dashboard/assets/styles/base.css +++ b/packages/studiocms_dashboard/assets/styles/base.css @@ -280,3 +280,20 @@ main { [data-theme="light"] #studiocms-theme-toggle #fallback-content { display: none; } + +.inner-sidebar-link { + display: flex; + flex-direction: row; + gap: .5rem; + align-items: center; + border-radius: .5rem; + transition: all .15s ease; + width: 100%; + padding: .375rem .5rem; + text-decoration: none; + color: hsl(var(--text-muted)); +} + +.inner-sidebar-link:hover { + background-color: hsl(var(--background-step-3)); +} diff --git a/packages/studiocms_dashboard/package.json b/packages/studiocms_dashboard/package.json index 1657b904e4..7c28de361f 100644 --- a/packages/studiocms_dashboard/package.json +++ b/packages/studiocms_dashboard/package.json @@ -56,7 +56,9 @@ "@matthiesenxyz/integration-utils": "catalog:studiocms-shared", "@fontsource-variable/onest": "catalog:studiocms-shared", "semver": "catalog:studiocms", - "ultrahtml": "^1.5.3" + "ultrahtml": "^1.5.3", + "dompurify": "^3.2.3", + "fuse.js": "^7.0.0" }, "peerDependencies": { "astro": "catalog:min", @@ -66,6 +68,7 @@ }, "devDependencies": { "typescript": "catalog:", - "@types/semver": "catalog:studiocms" + "@types/semver": "catalog:studiocms", + "@types/dompurify": "^3.2.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d57c516437..5f6292e945 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -830,6 +830,12 @@ importers: astro-integration-kit: specifier: 'catalog:' version: 0.18.0(astro@5.1.8(@types/node@22.10.2)(jiti@2.4.1)(rollup@4.28.1)(typescript@5.7.2)(yaml@2.6.1)) + dompurify: + specifier: ^3.2.3 + version: 3.2.3 + fuse.js: + specifier: ^7.0.0 + version: 7.0.0 semver: specifier: catalog:studiocms version: 7.6.3 @@ -840,6 +846,9 @@ importers: specifier: catalog:min version: 6.0.3(@types/node@22.10.2)(jiti@2.4.1)(yaml@2.6.1) devDependencies: + '@types/dompurify': + specifier: ^3.2.0 + version: 3.2.0 '@types/semver': specifier: catalog:studiocms version: 7.5.8 @@ -2556,6 +2565,10 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/dompurify@3.2.0': + resolution: {integrity: sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg==} + deprecated: This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed. + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -2663,6 +2676,9 @@ packages: '@types/three@0.169.0': resolution: {integrity: sha512-oan7qCgJBt03wIaK+4xPWclYRPG9wzcg7Z2f5T8xYTNEF95kh0t0lklxLLYBDo7gQiGLYzE6iF4ta7nXF2bcsw==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/turndown@5.0.5': resolution: {integrity: sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==} @@ -3224,6 +3240,9 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} + dompurify@3.2.3: + resolution: {integrity: sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA==} + domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} @@ -3698,6 +3717,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + fuse.js@7.0.0: + resolution: {integrity: sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==} + engines: {node: '>=10'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -7838,6 +7861,10 @@ snapshots: dependencies: '@types/ms': 0.7.34 + '@types/dompurify@3.2.0': + dependencies: + dompurify: 3.2.3 + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.6 @@ -7957,6 +7984,9 @@ snapshots: fflate: 0.8.2 meshoptimizer: 0.18.1 + '@types/trusted-types@2.0.7': + optional: true + '@types/turndown@5.0.5': {} '@types/unist@2.0.11': {} @@ -8716,6 +8746,10 @@ snapshots: dependencies: domelementtype: 2.3.0 + dompurify@3.2.3: + optionalDependencies: + '@types/trusted-types': 2.0.7 + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 @@ -9106,6 +9140,8 @@ snapshots: function-bind@1.1.2: {} + fuse.js@7.0.0: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} From 54c2a55038ef4a2fc04f2672c8afc73b1ed5f90c Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Sat, 25 Jan 2025 09:04:31 -0800 Subject: [PATCH 506/539] Enhance InnerSidebarElement by adding a title to the divider and updating its text dynamically based on search results --- .../islands/content-mgmt/InnerSidebarElement.astro | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro index bf4b7452be..4328af5f18 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro @@ -46,7 +46,7 @@ const { isNewFolder, isNewPage } = Astro.props;
      -Items +Items
      \ No newline at end of file diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro index bd17a0bfad..069b3b3280 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro @@ -72,7 +72,7 @@ function setupDropdown() { const createNewDropdown = new DropdownHelper('create-new-dropdown'); createNewDropdown.registerClickCallback((value) => { - window.location.href = value; + window.location.assign(value); }); }; diff --git a/packages/studiocms_dashboard/assets/routes/content-management/editfolder.astro b/packages/studiocms_dashboard/assets/routes/content-management/editfolder.astro index 7df2dd50a6..03cc9987b6 100644 --- a/packages/studiocms_dashboard/assets/routes/content-management/editfolder.astro +++ b/packages/studiocms_dashboard/assets/routes/content-management/editfolder.astro @@ -1,6 +1,7 @@ --- // import { useTranslations } from 'studiocms:i18n'; import { Layout } from '../../components'; +import EditFolder from '../../components/islands/content-mgmt/EditFolder.astro'; import InnerSidebarElement from '../../components/islands/content-mgmt/InnerSidebarElement.astro'; import PageHeader from '../../components/islands/content-mgmt/PageHeader.astro'; @@ -25,6 +26,8 @@ const lang = 'en-us';
      + + \ No newline at end of file diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/CreatePage.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/CreatePage.astro index fb831b83e2..603fc78e59 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/CreatePage.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/CreatePage.astro @@ -20,7 +20,10 @@ import { - +
      + + +
      @@ -117,18 +120,19 @@ import { const formData = new FormData(createPageForm); const pageData = { - title: formData.get('page-title'), - slug: formData.get('page-slug'), - description: formData.get('page-description'), - type: formData.get('page-type'), - showInNav: formData.get('show-in-nav'), - heroImage: formData.get('page-hero-image'), + title: formData.get('page-title')?.toString(), + slug: formData.get('page-slug')?.toString(), + description: formData.get('page-description')?.toString(), + type: formData.get('page-type')?.toString(), + showInNav: formData.get('show-in-nav')?.toString() === 'true', + heroImage: formData.get('page-hero-image')?.toString(), parentFolder: getParentFolderValue(formData.get('parent-folder')), - categories: formData.get('categories'), - tags: formData.get('tags'), - showAuthor: formData.get('show-author'), - showContributors: formData.get('show-contributors'), - content: formData.get('page-content'), + categories: formData.get('categories')?.toString(), + tags: formData.get('tags')?.toString(), + showAuthor: formData.get('show-author')?.toString() === 'true', + showContributors: formData.get('show-contributors')?.toString() === 'true', + content: formData.get('page-content')?.toString(), + draft: true, }; console.log("DRAFT: " + JSON.stringify(pageData)); @@ -139,18 +143,19 @@ import { const formData = new FormData(createPageForm); const pageData = { - title: formData.get('page-title'), - slug: formData.get('page-slug'), - description: formData.get('page-description'), - type: formData.get('page-type'), - showInNav: formData.get('show-in-nav'), - heroImage: formData.get('page-hero-image'), + title: formData.get('page-title')?.toString(), + slug: formData.get('page-slug')?.toString(), + description: formData.get('page-description')?.toString(), + type: formData.get('page-type')?.toString(), + showInNav: formData.get('show-in-nav')?.toString() === 'true', + heroImage: formData.get('page-hero-image')?.toString(), parentFolder: getParentFolderValue(formData.get('parent-folder')), - categories: formData.get('categories'), - tags: formData.get('tags'), - showAuthor: formData.get('show-author'), - showContributors: formData.get('show-contributors'), - content: formData.get('page-content'), + categories: formData.get('categories')?.toString(), + tags: formData.get('tags')?.toString(), + showAuthor: formData.get('show-author')?.toString() === 'true', + showContributors: formData.get('show-contributors')?.toString() === 'true', + content: formData.get('page-content')?.toString(), + draft: false, }; console.log("PUBLISH: " + JSON.stringify(pageData)); @@ -308,7 +313,7 @@ document.addEventListener('astro:page-load', () => listener()); .tab-section { display: flex; flex-direction: column; - gap: .75rem; + gap: 1rem; } .form-row { diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditFolder.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditFolder.astro index 88ad6fcca8..874f2471d2 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditFolder.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditFolder.astro @@ -43,7 +43,7 @@ const currentFolder = folderList.find((folder) => folder.id === editId); #edit-folder-form { display: flex; flex-direction: column; - gap: .75rem; + gap: 1rem; padding-top: .5rem; } \ No newline at end of file diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditPage.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditPage.astro index e5a657f43f..da927e30fe 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditPage.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditPage.astro @@ -35,7 +35,10 @@ function getParentFolderValue(value: string | null): string | undefined {
      - +
      + + +
      @@ -124,17 +127,18 @@ async function listener() { const formData = new FormData(editPageForm); const data = { - title: formData.get('page-title'), - slug: formData.get('page-slug'), - description: formData.get('page-description'), - package: formData.get('page-type'), + title: formData.get('page-title')?.toString(), + slug: formData.get('page-slug')?.toString(), + description: formData.get('page-description')?.toString(), + package: formData.get('page-type')?.toString(), showOnNav: formData.get('show-in-nav') === 'true', - heroImage: formData.get('page-hero-image'), + heroImage: formData.get('page-hero-image')?.toString(), parentFolder: getParentFolderValue(formData.get('parent-folder')), showAuthor: formData.get('show-author') === 'true', - showContributors: formData.get('show-contributors'), - content: formData.get('page-content'), - id: formData.get('page-id'), + showContributors: formData.get('show-contributors')?.toString(), + content: formData.get('page-content')?.toString(), + id: formData.get('page-id')?.toString(), + draft: formData.get('draft')?.toString() === 'true', }; console.log(data); @@ -289,11 +293,11 @@ document.addEventListener('astro:page-load', () => listener()); } -.tab-section { - display: flex; - flex-direction: column; - gap: .75rem; -} + .tab-section { + display: flex; + flex-direction: column; + gap: 1rem; + } .form-row { display: grid; diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro index 1f8296e5b5..61e4c75148 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/InnerSidebarElement.astro @@ -84,21 +84,38 @@ setupDropdown(); name: string; slug?: string; type: 'folder' | 'page'; + isDraft?: boolean; }; type SearchList = SearchItem[]; + function getIcon(item: SearchItem) { + if (item.type === 'folder') { + // heroicons:folder + return ` `; + } + + if (item.slug === 'index') { + // heroicons:home-modern + return ` `; + } + + if (item.isDraft) { + // heroicons:pencil-square + return ` `; + } + + // heroicons:document-text + return ` `; + } + const itemTemplate = (item: SearchItem, searchTerm: string) => { const url = item.type === 'folder' ? `${document.getElementById('inner-sidebar-items-search')?.dataset.editfolder}?folder=${item.id}&search=${searchTerm}` : `${document.getElementById('inner-sidebar-items-search')?.dataset.editpage}/?edit=${item.id}&search=${searchTerm}`; return ` +
      + + + + +
      + \ No newline at end of file diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditPage.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditPage.astro index 330b381d5c..5eeed7681e 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditPage.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditPage.astro @@ -1,7 +1,7 @@ --- import '../../../styles/tiny-mde.css'; import { studioCMS_SDK_Cache } from 'studiocms:sdk/cache'; -import { Input, Select, TabItem, Tabs } from 'studiocms:ui/components'; +import { Button, Icon, Input, Select, TabItem, Tabs } from 'studiocms:ui/components'; import { categoriesOptions, pageTypeOptions, @@ -61,7 +61,7 @@ function getParentFolderValue(value: string | null): string | undefined {
      + + + +
      +
      -
      - - -
      + + +

      Are you sure you want to delete this folder?

      +
      + +
      +
      + + \ No newline at end of file diff --git a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditPage.astro b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditPage.astro index 5eeed7681e..2cd4111d86 100644 --- a/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditPage.astro +++ b/packages/studiocms_dashboard/assets/components/islands/content-mgmt/EditPage.astro @@ -1,7 +1,7 @@ --- import '../../../styles/tiny-mde.css'; import { studioCMS_SDK_Cache } from 'studiocms:sdk/cache'; -import { Button, Icon, Input, Select, TabItem, Tabs } from 'studiocms:ui/components'; +import { Button, Center, Icon, Input, Modal, Select, TabItem, Tabs } from 'studiocms:ui/components'; import { categoriesOptions, pageTypeOptions, @@ -91,15 +91,50 @@ function getParentFolderValue(value: string | null): string | undefined {
      -
      - - -
      + + +

      Are you sure you want to Delete this page?

      +
      + +
      +
      + + -
      - - -

      Are you sure you want to Delete this page?

      -
      - -
      -
      -
      - - - - { footer &&
      } -
      diff --git a/packages/studiocms_dashboard/assets/components/MainSidebarContent.astro b/packages/studiocms_dashboard/assets/components/MainSidebarContent.astro index 71e2c3ddc4..0e4e081d14 100644 --- a/packages/studiocms_dashboard/assets/components/MainSidebarContent.astro +++ b/packages/studiocms_dashboard/assets/components/MainSidebarContent.astro @@ -4,6 +4,7 @@ import { useTranslations } from 'studiocms:i18n'; import { StudioCMSRoutes } from 'studiocms:lib'; import { Button, Divider, Dropdown, Group, Icon } from 'studiocms:ui/components'; import StudioCMSLogo from '../components/StudioCMSLogo.astro'; +import Footer from './Footer.astro'; import SidebarLink from './SidebarLink.astro'; import Admin from './islands/sidebar/Admin.astro'; import Editor from './islands/sidebar/Editor.astro'; @@ -76,6 +77,8 @@ const sidebar = getSidebarLinks(lang); + +