studiocms 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/dist/cli/add/index.d.ts +2 -2
  3. package/dist/cli/add/npm-utils.d.ts +6 -6
  4. package/dist/cli/add/tryToInstallPlugins.d.ts +1 -1
  5. package/dist/cli/add/updateStudioCMSConfig.d.ts +1 -1
  6. package/dist/cli/add/validatePlugins.d.ts +1 -1
  7. package/dist/cli/crypto/genJWT/index.d.ts +1 -1
  8. package/dist/cli/crypto/index.d.ts +1 -1
  9. package/dist/cli/init/steps/env.js +12 -2
  10. package/dist/cli/init/steps/next.d.ts +1 -1
  11. package/dist/cli/migrator/index.d.ts +1 -1
  12. package/dist/cli/users/index.d.ts +1 -1
  13. package/dist/cli/users/steps/createUsers.js +3 -3
  14. package/dist/cli/users/steps/next.d.ts +1 -1
  15. package/dist/cli/utils/context.d.ts +1 -1
  16. package/dist/cli/utils/getCliDbClient.d.ts +1 -1
  17. package/dist/cli/utils/intro.d.ts +1 -1
  18. package/dist/cli/utils/loadConfig.d.ts +54 -49
  19. package/dist/cli/utils/loadConfig.js +5 -8
  20. package/dist/cli/utils/user-utils.d.ts +1 -1
  21. package/dist/client/apiClient.d.ts +4923 -0
  22. package/dist/client/apiClient.js +72 -0
  23. package/dist/config.d.ts +1734 -1
  24. package/dist/consts.d.ts +5 -5
  25. package/dist/consts.js +3 -2
  26. package/dist/db/plugins.d.ts +1 -1
  27. package/dist/db/plugins.js +5 -8
  28. package/dist/handlers/frontend/routes.d.ts +4 -18
  29. package/dist/handlers/frontend/routes.js +13 -152
  30. package/dist/handlers/frontend/types.d.ts +1 -1
  31. package/dist/handlers/frontend/utils.js +0 -18
  32. package/dist/handlers/pluginHandler.d.ts +34 -257
  33. package/dist/handlers/pluginHandler.js +92 -46
  34. package/dist/handlers/routeHandler.js +32 -11
  35. package/dist/handlers/setupDbStudio.d.ts +1 -1
  36. package/dist/handlers/storage-manager/core/effectify-astro-context.d.ts +25 -0
  37. package/dist/handlers/storage-manager/core/effectify-astro-context.js +78 -0
  38. package/dist/handlers/storage-manager/no-op.d.ts +2 -2
  39. package/dist/handlers/storage-manager/no-op.js +2 -3
  40. package/dist/index.d.ts +0 -1
  41. package/dist/index.js +9 -5
  42. package/dist/integrations/robots/index.d.ts +2 -2
  43. package/dist/integrations/robots/index.js +1 -3
  44. package/dist/integrations/robots/schema.d.ts +102 -273
  45. package/dist/integrations/robots/schema.js +220 -209
  46. package/dist/plugins/analytics/assets/schemas.d.ts +14 -9
  47. package/dist/plugins/analytics/assets/schemas.js +25 -17
  48. package/dist/plugins/analytics/db-client.d.ts +1 -1
  49. package/dist/plugins/analytics/index.d.ts +823 -3
  50. package/dist/plugins/analytics/index.js +4 -5
  51. package/dist/plugins/analytics/schemas.d.ts +54 -62
  52. package/dist/plugins/analytics/schemas.js +64 -13
  53. package/dist/plugins/analytics/table.d.ts +1 -1
  54. package/dist/plugins.d.ts +0 -1
  55. package/dist/schemas/config/api.d.ts +17 -0
  56. package/dist/schemas/config/api.js +14 -0
  57. package/dist/schemas/config/auth.d.ts +55 -59
  58. package/dist/schemas/config/auth.js +34 -11
  59. package/dist/schemas/config/dashboard.d.ts +43 -79
  60. package/dist/schemas/config/dashboard.js +43 -12
  61. package/dist/schemas/config/db.d.ts +15 -17
  62. package/dist/schemas/config/db.js +13 -5
  63. package/dist/schemas/config/developer.d.ts +33 -45
  64. package/dist/schemas/config/developer.js +22 -5
  65. package/dist/schemas/config/index.d.ts +398 -521
  66. package/dist/schemas/config/index.js +115 -57
  67. package/dist/schemas/config/sdk.d.ts +50 -196
  68. package/dist/schemas/config/sdk.js +61 -73
  69. package/dist/schemas/custom.d.ts +40 -0
  70. package/dist/schemas/custom.js +41 -0
  71. package/dist/schemas/external-schemas.d.ts +171 -0
  72. package/dist/schemas/external-schemas.js +179 -0
  73. package/dist/schemas/index.d.ts +2 -0
  74. package/dist/schemas/index.js +2 -0
  75. package/dist/schemas/plugins/i18n.d.ts +59 -39
  76. package/dist/schemas/plugins/i18n.js +42 -5
  77. package/dist/schemas/plugins/index.d.ts +7126 -10296
  78. package/dist/schemas/plugins/index.js +260 -276
  79. package/dist/schemas/plugins/shared.d.ts +1293 -3718
  80. package/dist/schemas/plugins/shared.js +320 -329
  81. package/dist/test-utils.d.ts +15 -4
  82. package/dist/test-utils.js +27 -11
  83. package/dist/toolbar/db-viewer/db-shared-types.d.ts +6 -6
  84. package/dist/toolbar/db-viewer/viewer.js +20 -21
  85. package/dist/types.d.ts +30 -0
  86. package/dist/utils/effects/smtp.d.ts +1 -1
  87. package/dist/utils/lang-helper.d.ts +10 -2
  88. package/dist/virtual.d.ts +23 -0
  89. package/dist/virtuals/auth/core.d.ts +5 -5
  90. package/dist/virtuals/auth/verify-email.d.ts +6 -6
  91. package/dist/virtuals/components/Generator.astro +2 -2
  92. package/dist/virtuals/components/Renderer.astro +9 -1
  93. package/dist/virtuals/components/renderFn.d.ts +3 -1
  94. package/dist/virtuals/components/renderFn.js +18 -0
  95. package/dist/virtuals/lib/headDefaults.d.ts +4 -2
  96. package/dist/virtuals/lib/headDefaults.js +0 -2
  97. package/dist/virtuals/lib/routeMap.d.ts +0 -12
  98. package/dist/virtuals/lib/routeMap.js +2 -14
  99. package/dist/virtuals/mailer/index.d.ts +3 -3
  100. package/dist/virtuals/notifier/index.d.ts +5 -5
  101. package/dist/virtuals/plugins/dashboard-pages.d.ts +2 -64
  102. package/dist/virtuals/scripts/StorageFileBrowser.d.ts +1 -172
  103. package/dist/virtuals/scripts/StorageFileBrowser.js +216 -119
  104. package/dist/virtuals/template-engine/index.d.ts +4 -4
  105. package/frontend/components/dashboard/configuration/ConfigForm.astro +218 -110
  106. package/frontend/components/dashboard/content-mgmt/ContentSearch.astro +21 -22
  107. package/frontend/components/dashboard/content-mgmt/CreateFolder.astro +66 -54
  108. package/frontend/components/dashboard/content-mgmt/CreatePage.astro +58 -104
  109. package/frontend/components/dashboard/content-mgmt/EditFolder.astro +65 -67
  110. package/frontend/components/dashboard/content-mgmt/EditPage.astro +86 -134
  111. package/frontend/components/dashboard/content-mgmt/InnerSidebarElement.astro +0 -1
  112. package/frontend/components/dashboard/content-mgmt/PageHeader.astro +33 -52
  113. package/frontend/components/dashboard/content-mgmt/PageTypeHandler.astro +2 -2
  114. package/frontend/components/dashboard/profile/APITokens.astro +219 -158
  115. package/frontend/components/dashboard/profile/BasicInfo.astro +165 -106
  116. package/frontend/components/dashboard/profile/Notifications.astro +27 -18
  117. package/frontend/components/dashboard/profile/UpdatePassword.astro +134 -94
  118. package/frontend/components/dashboard/sidebar/VersionCheck.astro +31 -16
  119. package/frontend/components/dashboard/sidebar/VersionCheckChangelog.astro +18 -11
  120. package/frontend/components/dashboard/sidebar-modals/VersionModal.astro +2 -2
  121. package/frontend/components/dashboard/smtp-config/TemplateEditor.astro +14 -14
  122. package/frontend/components/dashboard/taxonomy/InnerSidebarElement.astro +0 -1
  123. package/frontend/components/dashboard/taxonomy/MetaContainer.astro +0 -2
  124. package/frontend/components/dashboard/taxonomy/PageHeader.astro +16 -24
  125. package/frontend/components/dashboard/taxonomy/TaxonomySearch.astro +23 -27
  126. package/frontend/components/dashboard/user-mgmt/InnerSidebarElement.astro +111 -104
  127. package/frontend/components/dashboard/user-mgmt/UserListItem.astro +9 -22
  128. package/frontend/components/dashboard/user-mgmt/UserListItems.astro +18 -0
  129. package/frontend/components/first-time-setup/snippets/{opt2-studiocms.config.diff → studiocms.config.diff} +1 -0
  130. package/frontend/components/shared/Code.astro +1 -4
  131. package/frontend/components/shared/DynamicSettingsRenderer.astro +1 -1
  132. package/frontend/components/shared/SSRUser.astro +2 -4
  133. package/frontend/components/shared/foldertree/FolderTreeNode.astro +0 -6
  134. package/frontend/components/shared/storage-manager/StorageCopyOutput.astro +0 -1
  135. package/frontend/components/shared/taxonomy/TaxonomyTreeNode.astro +0 -6
  136. package/frontend/layouts/DashboardLayout.astro +0 -9
  137. package/frontend/layouts/TaxonomyLayout.astro +0 -1
  138. package/frontend/middleware/index.ts +102 -61
  139. package/frontend/pages/404.astro +0 -1
  140. package/frontend/pages/[dashboard]/[...pluginPage].astro +10 -1
  141. package/frontend/pages/[dashboard]/configuration.astro +10 -1
  142. package/frontend/pages/[dashboard]/content-management/createfolder.astro +10 -1
  143. package/frontend/pages/[dashboard]/content-management/createpage.astro +10 -1
  144. package/frontend/pages/[dashboard]/content-management/diff.astro +39 -14
  145. package/frontend/pages/[dashboard]/content-management/editfolder.astro +10 -1
  146. package/frontend/pages/[dashboard]/content-management/editpage.astro +10 -1
  147. package/frontend/pages/[dashboard]/content-management/index.astro +10 -1
  148. package/frontend/pages/[dashboard]/index.astro +10 -1
  149. package/frontend/pages/[dashboard]/login.astro +86 -25
  150. package/frontend/pages/[dashboard]/password-reset.astro +22 -16
  151. package/frontend/pages/[dashboard]/plugins/[plugin].astro +10 -1
  152. package/frontend/pages/[dashboard]/profile.astro +10 -1
  153. package/frontend/pages/[dashboard]/signup.astro +153 -52
  154. package/frontend/pages/[dashboard]/smtp-configuration.astro +77 -75
  155. package/frontend/pages/[dashboard]/system-management.astro +10 -1
  156. package/frontend/pages/[dashboard]/taxonomy/categories.astro +30 -41
  157. package/frontend/pages/[dashboard]/taxonomy/index.astro +10 -0
  158. package/frontend/pages/[dashboard]/taxonomy/tags.astro +33 -43
  159. package/frontend/pages/[dashboard]/unverified-email.astro +29 -21
  160. package/frontend/pages/[dashboard]/user-management/edit.astro +170 -90
  161. package/frontend/pages/[dashboard]/user-management/index.astro +10 -1
  162. package/frontend/pages/studiocms_api/[...all].ts +106 -0
  163. package/frontend/pages/studiocms_api/_handlers/_utils/auth.ts +26 -0
  164. package/frontend/pages/studiocms_api/_handlers/_utils/changelog.ts +147 -0
  165. package/frontend/pages/studiocms_api/_handlers/_utils/db-studio-driver.ts +46 -0
  166. package/frontend/pages/studiocms_api/_handlers/_utils/parseLogLevel.ts +27 -0
  167. package/frontend/pages/studiocms_api/_handlers/auth/auth.ts +459 -0
  168. package/frontend/pages/studiocms_api/_handlers/auth/index.ts +17 -0
  169. package/frontend/pages/studiocms_api/_handlers/auth/oauth.ts +91 -0
  170. package/frontend/pages/studiocms_api/_handlers/dashboard/_shared.ts +57 -0
  171. package/frontend/pages/studiocms_api/_handlers/dashboard/apiTokens.ts +134 -0
  172. package/frontend/pages/studiocms_api/_handlers/dashboard/config.ts +64 -0
  173. package/frontend/pages/studiocms_api/_handlers/dashboard/content.ts +741 -0
  174. package/frontend/pages/studiocms_api/_handlers/dashboard/create.ts +480 -0
  175. package/frontend/pages/studiocms_api/_handlers/dashboard/emailNotifications.ts +49 -0
  176. package/frontend/pages/studiocms_api/_handlers/dashboard/index.ts +45 -0
  177. package/frontend/pages/studiocms_api/_handlers/dashboard/mailer.ts +136 -0
  178. package/frontend/pages/studiocms_api/_handlers/dashboard/plugins.ts +80 -0
  179. package/frontend/pages/studiocms_api/_handlers/dashboard/profile.ts +275 -0
  180. package/frontend/pages/studiocms_api/_handlers/dashboard/resetPassword.ts +140 -0
  181. package/frontend/pages/studiocms_api/_handlers/dashboard/search.ts +63 -0
  182. package/frontend/pages/studiocms_api/_handlers/dashboard/taxonomy.ts +285 -0
  183. package/frontend/pages/studiocms_api/_handlers/dashboard/templates.ts +75 -0
  184. package/frontend/pages/studiocms_api/_handlers/dashboard/users.ts +312 -0
  185. package/frontend/pages/studiocms_api/_handlers/dashboard/verifyEndpoints.ts +307 -0
  186. package/frontend/pages/studiocms_api/_handlers/integration/dbStudio.ts +98 -0
  187. package/frontend/pages/studiocms_api/_handlers/integration/index.ts +17 -0
  188. package/frontend/pages/studiocms_api/_handlers/integration/storageManager.ts +107 -0
  189. package/frontend/pages/studiocms_api/_handlers/rest-api/index.ts +8 -0
  190. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/_shared.ts +41 -0
  191. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/index.ts +17 -0
  192. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/public.ts +195 -0
  193. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/secure.ts +1726 -0
  194. package/frontend/pages/studiocms_api/_handlers/sdk.ts +129 -0
  195. package/frontend/pages/studiocms_api/_middleware/astroLocals.ts +36 -0
  196. package/frontend/pages/studiocms_api/_middleware/restApi.ts +56 -0
  197. package/frontend/pages/studiocms_api/integrations/[...all].ts +8 -0
  198. package/frontend/scripts/formdata.ts +219 -0
  199. package/frontend/setup-pages/3-done.astro +4 -20
  200. package/frontend/setup-pages/studiocms_api/dashboard/step-2.ts +3 -6
  201. package/frontend/styles/dashboard-base.css +0 -1
  202. package/frontend/web-vitals/endpoint.ts +2 -1
  203. package/package.json +34 -29
  204. package/dist/global.d.ts +0 -9
  205. package/frontend/components/dashboard/LoginChecker.astro +0 -68
  206. package/frontend/components/dashboard/user-mgmt/RankCheck.astro +0 -57
  207. package/frontend/components/first-time-setup/snippets/opt1-astro.config.diff +0 -14
  208. package/frontend/components/first-time-setup/snippets/opt2-astro.config.diff +0 -9
  209. package/frontend/middleware/_authmap.ts +0 -63
  210. package/frontend/pages/studiocms_api/auth/[path].ts +0 -384
  211. package/frontend/pages/studiocms_api/auth/[provider]/[...id].ts +0 -64
  212. package/frontend/pages/studiocms_api/auth/[provider]/_effects/index.ts +0 -101
  213. package/frontend/pages/studiocms_api/auth/_shared.ts +0 -52
  214. package/frontend/pages/studiocms_api/dashboard/api-tokens.ts +0 -115
  215. package/frontend/pages/studiocms_api/dashboard/config.ts +0 -74
  216. package/frontend/pages/studiocms_api/dashboard/content/diff.ts +0 -73
  217. package/frontend/pages/studiocms_api/dashboard/content/folder.ts +0 -220
  218. package/frontend/pages/studiocms_api/dashboard/content/page.ts +0 -359
  219. package/frontend/pages/studiocms_api/dashboard/create-reset-link.ts +0 -77
  220. package/frontend/pages/studiocms_api/dashboard/create-user-invite.ts +0 -231
  221. package/frontend/pages/studiocms_api/dashboard/create-user.ts +0 -186
  222. package/frontend/pages/studiocms_api/dashboard/email-notification-settings-site.ts +0 -74
  223. package/frontend/pages/studiocms_api/dashboard/mailer/check-email.ts +0 -75
  224. package/frontend/pages/studiocms_api/dashboard/mailer/config.ts +0 -136
  225. package/frontend/pages/studiocms_api/dashboard/plugins/[plugin].ts +0 -80
  226. package/frontend/pages/studiocms_api/dashboard/profile.ts +0 -245
  227. package/frontend/pages/studiocms_api/dashboard/resend-verify-email.ts +0 -77
  228. package/frontend/pages/studiocms_api/dashboard/reset-password.ts +0 -124
  229. package/frontend/pages/studiocms_api/dashboard/search-list.ts +0 -59
  230. package/frontend/pages/studiocms_api/dashboard/taxonomy-search.ts +0 -47
  231. package/frontend/pages/studiocms_api/dashboard/taxonomy.ts +0 -230
  232. package/frontend/pages/studiocms_api/dashboard/templates.ts +0 -74
  233. package/frontend/pages/studiocms_api/dashboard/update-user-notifications.ts +0 -86
  234. package/frontend/pages/studiocms_api/dashboard/users.ts +0 -236
  235. package/frontend/pages/studiocms_api/dashboard/verify-email.ts +0 -83
  236. package/frontend/pages/studiocms_api/dashboard/verify-session.ts +0 -187
  237. package/frontend/pages/studiocms_api/integrations/[type]/[...id].ts +0 -15
  238. package/frontend/pages/studiocms_api/integrations/[type]/_routes/db-studio.ts +0 -173
  239. package/frontend/pages/studiocms_api/integrations/[type]/_routes/storage.ts +0 -88
  240. package/frontend/pages/studiocms_api/partials/editor.astro +0 -74
  241. package/frontend/pages/studiocms_api/partials/render.astro +0 -39
  242. package/frontend/pages/studiocms_api/partials/user-list-items.astro +0 -43
  243. package/frontend/pages/studiocms_api/rest/utils/auth-token.ts +0 -59
  244. package/frontend/pages/studiocms_api/rest/v1/[type]/[...id].ts +0 -23
  245. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/categories.ts +0 -267
  246. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/folders.ts +0 -283
  247. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/pages.ts +0 -505
  248. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/settings.ts +0 -100
  249. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/tags.ts +0 -229
  250. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/users.ts +0 -553
  251. package/frontend/pages/studiocms_api/rest/v1/public/[type]/[...id].ts +0 -19
  252. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/categories.ts +0 -74
  253. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/folders.ts +0 -85
  254. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/pages.ts +0 -103
  255. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/tags.ts +0 -67
  256. package/frontend/pages/studiocms_api/sdk/[...path].ts +0 -97
  257. package/frontend/pages/studiocms_api/sdk/utils/changelog.ts +0 -119
  258. package/frontend/scripts/auth/formListener.ts +0 -81
  259. package/frontend/scripts/formdata-utils.ts +0 -116
  260. package/frontend/utils/build-partial-schema.ts +0 -46
  261. package/frontend/utils/errors.ts +0 -6
  262. package/frontend/utils/param-extractor.ts +0 -83
  263. package/frontend/utils/rest-router.ts +0 -444
@@ -37,7 +37,9 @@ const status: false | 'outdated' | 'latest' | 'future' = (() => {
37
37
  import { dateTimeListener } from "../../../scripts/dateTimeListener.js";
38
38
  import { dateWithTimeAndZone } from "../../../scripts/dateWithTimeAndZone.js";
39
39
  import { timeAgo } from "../../../scripts/timeAgo.js";
40
- // import type { VersionCacheObject } from "studiocms:sdk/types";
40
+ import * as Effect from 'effect/Effect';
41
+ import { sdkClient } from 'studiocms:client/apiClients';
42
+ import { toast } from 'studiocms:ui/components/toaster/client';
41
43
 
42
44
  function setupVersionChecker() {
43
45
  const reloadButton = document.getElementById(
@@ -70,21 +72,34 @@ const status: false | 'outdated' | 'latest' | 'future' = (() => {
70
72
  new ModalHelper("version-modal", "version-modal-trigger");
71
73
 
72
74
  reloadButton.addEventListener("click", async () => {
73
- const response = await fetch(reloadButton.dataset.link!);
74
- if (response.ok) {
75
- const data: { success: boolean; latestVersion: { version: string; lastCacheUpdate: Date } } =
76
- await response.json();
77
-
78
- if (data.success) {
79
- latestVersionElem.textContent = `v${data.latestVersion.version}`;
80
- timeElem.dateTime = new Date(
81
- data.latestVersion.lastCacheUpdate,
82
- ).toISOString();
83
- timeElem.textContent = dateWithTimeAndZone(
84
- new Date(data.latestVersion.lastCacheUpdate),
85
- );
86
- latestUpdateCheck.textContent = `(${timeAgo(new Date(data.latestVersion.lastCacheUpdate))})`;
87
- }
75
+ reloadButton.disabled = true;
76
+
77
+ type FailureVersionResponse = {
78
+ readonly success: false;
79
+ readonly latestVersion: null;
80
+ };
81
+
82
+ const { latestVersion, success } = await Effect.orElse(
83
+ sdkClient.pipe(Effect.flatMap((client) =>
84
+ client.sdk.updateLatestVersionCache()
85
+ )),
86
+ () => Effect.succeed({ success: false, latestVersion: null } as FailureVersionResponse)
87
+ ).pipe(Effect.runPromise);
88
+
89
+ if (success) {
90
+ latestVersionElem.textContent = `v${latestVersion.version}`;
91
+ timeElem.dateTime = new Date(latestVersion.lastCacheUpdate).toISOString();
92
+ timeElem.textContent = dateWithTimeAndZone(new Date(latestVersion.lastCacheUpdate));
93
+ latestUpdateCheck.textContent = `(${timeAgo(new Date(latestVersion.lastCacheUpdate))})`;
94
+
95
+ reloadButton.disabled = false;
96
+ } else {
97
+ reloadButton.disabled = false;
98
+ toast({
99
+ title: "Failed to update version check",
100
+ description: "Please try again later.",
101
+ type: "danger",
102
+ });
88
103
  }
89
104
  });
90
105
  }
@@ -2,18 +2,20 @@
2
2
  import css from '@studiocms/ui/css/prose.css?raw';
3
3
 
4
4
  interface Props {
5
- link: string;
6
5
  changelog: string;
7
6
  }
8
7
 
9
- const { link, changelog } = Astro.props;
8
+ const { changelog } = Astro.props;
10
9
  ---
11
10
 
12
- <frame-button data-link={link} data-changelog={changelog} data-styles={css}>
11
+ <frame-button data-changelog={changelog} data-styles={css}>
13
12
  <slot />
14
13
  </frame-button>
15
14
 
16
15
  <script>
16
+ import * as Effect from 'effect/Effect';
17
+ import { sdkClient } from 'studiocms:client/apiClients';
18
+
17
19
  if (!customElements.get('frame-button')) {
18
20
 
19
21
  class FrameButton extends HTMLElement {
@@ -81,15 +83,20 @@ const { link, changelog } = Astro.props;
81
83
  });
82
84
 
83
85
  slot.addEventListener('click', async () => {
86
+ const { changelog } = await Effect.orElse(
87
+ sdkClient.pipe(Effect.flatMap((client) =>
88
+ client.sdk.fullChangelog({
89
+ payload: { currentURLOrigin: window.location.origin },
90
+ })
91
+ )),
92
+ () => Effect.succeed({
93
+ success: false,
94
+ changelog: 'Failed to load changelog. Please try again later.'
95
+ })
96
+ ).pipe(
97
+ Effect.runPromise
98
+ );
84
99
  const changelogLink = this.getAttribute('data-changelog')!;
85
- const link = this.getAttribute('data-link')!;
86
- const { changelog } = await (await fetch(link, {
87
- method: 'POST',
88
- headers: {
89
- 'Content-Type': 'application/json',
90
- },
91
- body: JSON.stringify({ currentURLOrigin: window.location.origin }),
92
- })).json();
93
100
  const styles = this.getAttribute('data-styles')!;
94
101
 
95
102
  frameContent.innerHTML = `
@@ -25,7 +25,7 @@ const lastChecked = new Date(Astro.locals.StudioCMS.latestVersion.lastCacheUpdat
25
25
 
26
26
  <h2 slot="header" class="inline-title">
27
27
  <span><t-vcm key="header-title">{t('header-title')}</t-vcm></span>
28
- <button data-link={Astro.locals.StudioCMS.routeMap.sdk.updateLatestVersionCache}
28
+ <button
29
29
  id="version-modal-reload"
30
30
  class="reload-button"
31
31
  title="Check for updates"
@@ -58,7 +58,7 @@ const lastChecked = new Date(Astro.locals.StudioCMS.latestVersion.lastCacheUpdat
58
58
  <div class="version-modal-release-notes">
59
59
  <div class="prose"><Fragment set:html={parseMarkdown(changelog)} /></div>
60
60
  <span class="release-notes-read-more">
61
- <VersionCheckChangelog changelog={studioCMSSocials.changelog} link={Astro.locals.StudioCMS.routeMap.sdk.changelog}><span class="read-more-text"><t-vcm key="full-changelog">{t('full-changelog')}</t-vcm></span></VersionCheckChangelog>
61
+ <VersionCheckChangelog changelog={studioCMSSocials.changelog}><span class="read-more-text"><t-vcm key="full-changelog">{t('full-changelog')}</t-vcm></span></VersionCheckChangelog>
62
62
  </span>
63
63
  </div>
64
64
 
@@ -11,8 +11,6 @@ interface Props {
11
11
  }
12
12
 
13
13
  const { templateKeys, templates, defaultTemplates, t } = Astro.props;
14
-
15
- const templateSaveAPIEndpoint = Astro.locals.StudioCMS.routeMap.endpointLinks.templates;
16
14
  ---
17
15
 
18
16
  <Modal id='template-editor-preview-modal' size='lg'>
@@ -44,7 +42,6 @@ const templateSaveAPIEndpoint = Astro.locals.StudioCMS.routeMap.endpointLinks.te
44
42
  data-templates={JSON.stringify(templates)}
45
43
  data-template-keys={JSON.stringify(templateKeys)}
46
44
  data-default-templates={JSON.stringify(defaultTemplates)}
47
- data-save-endpoint={templateSaveAPIEndpoint}
48
45
  ></div>
49
46
 
50
47
  <script>
@@ -83,6 +80,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
83
80
  import { $i18n, baseTranslation, updateSelectOptions } from 'studiocms:i18n/client';
84
81
  import { ModalHelper } from 'studiocms:ui/components/modal/client';
85
82
  import { toast } from 'studiocms:ui/components/toaster/client';
83
+ import { dashboardClient, dashboardSharedCatchTags } from "studiocms:client/apiClients";
84
+ import * as Effect from "effect/Effect";
86
85
  import 'ace-builds/src-noconflict/ace';
87
86
  import 'ace-builds/src-noconflict/mode-handlebars';
88
87
  import 'ace-builds/src-noconflict/theme-cloud_editor';
@@ -151,7 +150,6 @@ const defaultTemplates = JSON.parse(templateEditor.dataset.defaultTemplates || '
151
150
  string,
152
151
  string
153
152
  >;
154
- const saveEndpoint = templateEditor.dataset.saveEndpoint as string;
155
153
 
156
154
  // --- INTERNATIONALIZATION SETUP ---
157
155
  const i18n = $i18n(i18nCurrentPage, baseTranslation[i18nCurrentPage]);
@@ -243,16 +241,18 @@ async function saveTemplate(templateKey: string, content: string) {
243
241
  const allTemplates = { ...templates, [templateKey]: content };
244
242
 
245
243
  try {
246
- const response = await fetch(saveEndpoint, {
247
- method: 'POST',
248
- headers: {
249
- 'Content-Type': 'application/json',
250
- },
251
- body: JSON.stringify({ templates: allTemplates }),
252
- });
253
-
254
- if (!response.ok) {
255
- throw new Error(`${t['template-editor-save-failed']}: ${response.statusText}`);
244
+ const response = await dashboardClient.pipe(
245
+ Effect.flatMap((client) =>
246
+ client.templates.updateEmailTemplates({
247
+ payload: allTemplates,
248
+ })
249
+ ),
250
+ Effect.catchTags(dashboardSharedCatchTags),
251
+ Effect.runPromise,
252
+ );
253
+
254
+ if ('error' in response) {
255
+ throw new Error(`${t['template-editor-save-failed']}: ${response.error}`);
256
256
  }
257
257
 
258
258
  displaySuccessToastThenReload(t['template-editor-save-success']);
@@ -108,7 +108,6 @@ const tagData = tagsToTaxonomyNodes(tags);
108
108
  id="inner-sidebar-items-search"
109
109
  class="folder-tree-search-container scrollbar"
110
110
  style="display: none;"
111
- data-searchlist={Astro.locals.StudioCMS.routeMap.endpointLinks.taxonomySearch}
112
111
  data-base-category-link={Astro.locals.StudioCMS.routeMap.mainLinks.taxonomyCategories}
113
112
  data-base-tag-link={Astro.locals.StudioCMS.routeMap.mainLinks.taxonomyTags}
114
113
  >
@@ -216,8 +216,6 @@ const { name, entries } = Astro.props;
216
216
  </style>
217
217
 
218
218
  <script>
219
- import { keys } from "effect/Record";
220
-
221
219
  class DynamicKeyValuePair extends HTMLElement {
222
220
  static formAssociated = true;
223
221
  #internals: ElementInternals;
@@ -180,8 +180,10 @@ const replaceNameParam = (str: string) => str.replace('{name}', pageTitle);
180
180
  ></div>
181
181
 
182
182
  <script>
183
+ import { dashboardClient, dashboardSharedCatchTags } from 'studiocms:client/apiClients';
183
184
  import { ModalHelper } from 'studiocms:ui/components/modal/client';
184
185
  import { toast } from "studiocms:ui/components/toaster/client";
186
+ import * as Effect from "effect/Effect";
185
187
 
186
188
  function setup() {
187
189
  const modeSelectorEl = document.getElementById('current-mode-selector') as HTMLDivElement;
@@ -232,10 +234,10 @@ const replaceNameParam = (str: string) => str.replace('{name}', pageTitle);
232
234
 
233
235
  const { actionRoute, slug, confirmSlug, ...jsonData } = {
234
236
  type: type,
235
- id: formData.get('id'),
236
- actionRoute: formData.get('action-route'),
237
- slug: formData.get('slug'),
238
- confirmSlug: formData.get('confirm-slug'),
237
+ id: formData.get('id')?.toString() || '',
238
+ actionRoute: formData.get('action-route')?.toString(),
239
+ slug: formData.get('slug')?.toString(),
240
+ confirmSlug: formData.get('confirm-slug')?.toString(),
239
241
  }
240
242
 
241
243
  if (!actionRoute || typeof actionRoute !== 'string') {
@@ -288,25 +290,22 @@ const replaceNameParam = (str: string) => str.replace('{name}', pageTitle);
288
290
  id: Number.parseInt(jsonData.id, 10),
289
291
  }
290
292
 
291
- const response = await fetch(actionRoute, {
292
- method: 'DELETE',
293
- headers: {
294
- 'Content-Type': 'application/json',
295
- },
296
- body: JSON.stringify(parsedJsonData),
297
- });
293
+ const response = await dashboardClient.pipe(
294
+ Effect.flatMap((client) => client.taxonomy.taxonomyDelete({
295
+ payload: parsedJsonData,
296
+ })),
297
+ Effect.catchTags(dashboardSharedCatchTags),
298
+ Effect.runPromise
299
+ );
298
300
 
299
- if (!response.ok) {
300
- const errorData = await response.json();
301
+ if ('error' in response) {
301
302
  toast({
302
303
  title: 'Error',
303
- description: errorData.message || `Failed to delete ${type === 'categories' ? 'category' : 'tag'}.`,
304
+ description: response.error,
304
305
  type: 'danger',
305
306
  });
306
307
  return;
307
- }
308
-
309
- if (response.ok) {
308
+ } else {
310
309
  toast({
311
310
  title: 'Success',
312
311
  description: `Deleted ${type === 'categories' ? 'category' : 'tag'} successfully.`,
@@ -317,13 +316,6 @@ const replaceNameParam = (str: string) => str.replace('{name}', pageTitle);
317
316
  window.location.href = indexPage;
318
317
  return;
319
318
  }
320
-
321
- toast({
322
- title: 'Error',
323
- description: 'An unexpected error occurred during deletion.',
324
- type: 'danger',
325
- });
326
- return;
327
319
  })
328
320
  break;
329
321
  }
@@ -33,6 +33,8 @@ const t = useTranslations(lang, '@studiocms/dashboard:content-sidebar');
33
33
  baseTranslation,
34
34
  updateElmPlaceholder,
35
35
  } from "studiocms:i18n/client";
36
+ import { dashboardClient } from "studiocms:client/apiClients";
37
+ import * as Effect from "effect/Effect";
36
38
 
37
39
  const currentPage = "@studiocms/dashboard:content-sidebar";
38
40
 
@@ -53,19 +55,19 @@ const t = useTranslations(lang, '@studiocms/dashboard:content-sidebar');
53
55
  const searchOutputEl = $<HTMLDivElement>(`#${searchOutputElId}`);
54
56
 
55
57
  interface TaxonomyNode {
56
- id: number;
57
- name: string;
58
- slug: string;
59
- description: string;
60
- meta: {
58
+ readonly id: number;
59
+ readonly name: string;
60
+ readonly slug: string;
61
+ readonly description: string;
62
+ readonly meta: {
61
63
  readonly [x: string]: unknown;
62
64
  };
63
- parent: number | null | undefined;
64
- children: TaxonomyNode[];
65
- type: 'category' | 'tag';
65
+ readonly parent: number | null | undefined;
66
+ readonly children: readonly TaxonomyNode[];
67
+ readonly type: 'category' | 'tag';
66
68
  }
67
69
 
68
- type SearchList = TaxonomyNode[];
70
+ type SearchList = readonly TaxonomyNode[];
69
71
 
70
72
  function getIcons(item: TaxonomyNode) {
71
73
  switch (item.type) {
@@ -85,24 +87,18 @@ const t = useTranslations(lang, '@studiocms/dashboard:content-sidebar');
85
87
  }
86
88
  }
87
89
 
88
- async function getSearchList(searchItems: HTMLDivElement) {
89
- const response = await fetch(
90
- searchItems.dataset.searchlist as string,
91
- {
92
- method: "GET",
93
- headers: {
94
- "Content-Type": "application/json",
95
- },
96
- },
90
+ async function getSearchList(): Promise<SearchList> {
91
+ return await Effect.runPromise(
92
+ Effect.orElse(
93
+ dashboardClient.pipe(
94
+ Effect.flatMap((client) => client.taxonomy.taxonomySearch({})),
95
+ Effect.tapError(Effect.logError)
96
+ ),
97
+ () => Effect.log("Failed to fetch search list, returning empty array").pipe(
98
+ Effect.as([] as SearchList)
99
+ )
100
+ )
97
101
  );
98
-
99
- if (response.ok) {
100
- const data: SearchList = await response.json();
101
- return data;
102
- } else {
103
- console.error("Failed to fetch search list");
104
- return [];
105
- }
106
102
  }
107
103
 
108
104
  function clearSearchParams(innerSidebarItemsSearch: HTMLDivElement) {
@@ -176,7 +172,7 @@ const t = useTranslations(lang, '@studiocms/dashboard:content-sidebar');
176
172
  currentUrl.searchParams.set("search", searchTerm);
177
173
  window.history.pushState({}, "", currentUrl);
178
174
 
179
- const searchList = await getSearchList(searchItems);
175
+ const searchList = await getSearchList();
180
176
 
181
177
  const fuse = new Fuse(searchList, {
182
178
  keys: ["name", "slug"],