studiocms 0.2.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 (293) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/dist/cli/add/index.d.ts +2 -2
  3. package/dist/cli/add/index.js +4 -3
  4. package/dist/cli/add/npm-utils.d.ts +6 -6
  5. package/dist/cli/add/tryToInstallPlugins.d.ts +1 -1
  6. package/dist/cli/add/tryToInstallPlugins.js +6 -5
  7. package/dist/cli/add/updateStudioCMSConfig.d.ts +1 -1
  8. package/dist/cli/add/updateStudioCMSConfig.js +3 -4
  9. package/dist/cli/add/validatePlugins.d.ts +1 -2
  10. package/dist/cli/add/validatePlugins.js +15 -9
  11. package/dist/cli/crypto/genJWT/index.d.ts +1 -1
  12. package/dist/cli/crypto/genJWT/index.js +8 -9
  13. package/dist/cli/crypto/index.d.ts +1 -1
  14. package/dist/cli/init/steps/env.js +14 -4
  15. package/dist/cli/init/steps/next.d.ts +1 -1
  16. package/dist/cli/init/steps/next.js +6 -5
  17. package/dist/cli/migrator/index.d.ts +1 -1
  18. package/dist/cli/migrator/index.js +2 -2
  19. package/dist/cli/users/index.d.ts +1 -1
  20. package/dist/cli/users/shared.js +2 -2
  21. package/dist/cli/users/steps/createUsers.js +7 -7
  22. package/dist/cli/users/steps/modifyUsers.js +2 -2
  23. package/dist/cli/users/steps/next.d.ts +1 -1
  24. package/dist/cli/utils/checkRequiredEnvVars.js +2 -2
  25. package/dist/cli/utils/context.d.ts +2 -4
  26. package/dist/cli/utils/context.js +1 -3
  27. package/dist/cli/utils/getCliDbClient.d.ts +1 -1
  28. package/dist/cli/utils/intro.d.ts +1 -1
  29. package/dist/cli/utils/loadConfig.d.ts +54 -49
  30. package/dist/cli/utils/loadConfig.js +5 -8
  31. package/dist/cli/utils/logger.js +3 -3
  32. package/dist/cli/utils/user-utils.d.ts +1 -1
  33. package/dist/cli/utils/user-utils.js +4 -3
  34. package/dist/client/apiClient.d.ts +4923 -0
  35. package/dist/client/apiClient.js +72 -0
  36. package/dist/config.d.ts +1734 -1
  37. package/dist/consts.d.ts +5 -5
  38. package/dist/consts.js +3 -2
  39. package/dist/db/plugins.d.ts +1 -1
  40. package/dist/db/plugins.js +5 -8
  41. package/dist/handlers/frontend/routes.d.ts +4 -18
  42. package/dist/handlers/frontend/routes.js +13 -152
  43. package/dist/handlers/frontend/types.d.ts +1 -1
  44. package/dist/handlers/frontend/utils.js +0 -18
  45. package/dist/handlers/pluginHandler.d.ts +34 -257
  46. package/dist/handlers/pluginHandler.js +92 -46
  47. package/dist/handlers/routeHandler.js +32 -11
  48. package/dist/handlers/setupDbStudio.d.ts +3 -1
  49. package/dist/handlers/setupDbStudio.js +19 -10
  50. package/dist/handlers/storage-manager/core/effectify-astro-context.d.ts +25 -0
  51. package/dist/handlers/storage-manager/core/effectify-astro-context.js +78 -0
  52. package/dist/handlers/storage-manager/no-op.d.ts +2 -2
  53. package/dist/handlers/storage-manager/no-op.js +2 -3
  54. package/dist/index.d.ts +0 -1
  55. package/dist/index.js +10 -20
  56. package/dist/integrations/robots/index.d.ts +2 -2
  57. package/dist/integrations/robots/index.js +1 -3
  58. package/dist/integrations/robots/schema.d.ts +102 -273
  59. package/dist/integrations/robots/schema.js +220 -209
  60. package/dist/plugins/analytics/assets/schemas.d.ts +14 -9
  61. package/dist/plugins/analytics/assets/schemas.js +25 -17
  62. package/dist/plugins/analytics/db-client.d.ts +1 -1
  63. package/dist/plugins/analytics/index.d.ts +823 -3
  64. package/dist/plugins/analytics/index.js +4 -5
  65. package/dist/plugins/analytics/schemas.d.ts +54 -62
  66. package/dist/plugins/analytics/schemas.js +64 -13
  67. package/dist/plugins/analytics/table.d.ts +1 -1
  68. package/dist/plugins.d.ts +0 -1
  69. package/dist/schemas/config/api.d.ts +17 -0
  70. package/dist/schemas/config/api.js +14 -0
  71. package/dist/schemas/config/auth.d.ts +55 -59
  72. package/dist/schemas/config/auth.js +34 -11
  73. package/dist/schemas/config/dashboard.d.ts +43 -79
  74. package/dist/schemas/config/dashboard.js +43 -12
  75. package/dist/schemas/config/db.d.ts +15 -17
  76. package/dist/schemas/config/db.js +13 -5
  77. package/dist/schemas/config/developer.d.ts +33 -45
  78. package/dist/schemas/config/developer.js +22 -5
  79. package/dist/schemas/config/index.d.ts +398 -521
  80. package/dist/schemas/config/index.js +115 -57
  81. package/dist/schemas/config/sdk.d.ts +50 -196
  82. package/dist/schemas/config/sdk.js +61 -73
  83. package/dist/schemas/custom.d.ts +40 -0
  84. package/dist/schemas/custom.js +41 -0
  85. package/dist/schemas/external-schemas.d.ts +171 -0
  86. package/dist/schemas/external-schemas.js +179 -0
  87. package/dist/schemas/index.d.ts +2 -0
  88. package/dist/schemas/index.js +2 -0
  89. package/dist/schemas/plugins/i18n.d.ts +59 -39
  90. package/dist/schemas/plugins/i18n.js +42 -5
  91. package/dist/schemas/plugins/index.d.ts +7126 -10296
  92. package/dist/schemas/plugins/index.js +260 -276
  93. package/dist/schemas/plugins/shared.d.ts +1293 -3718
  94. package/dist/schemas/plugins/shared.js +320 -329
  95. package/dist/test-utils.d.ts +15 -4
  96. package/dist/test-utils.js +27 -11
  97. package/dist/toolbar/db-viewer/db-shared-types.d.ts +6 -6
  98. package/dist/toolbar/db-viewer/studio/connection.d.ts +8 -4
  99. package/dist/toolbar/db-viewer/studio/connection.js +2 -28
  100. package/dist/toolbar/db-viewer/studio/env/libsql.d.ts +7 -0
  101. package/dist/toolbar/db-viewer/studio/env/libsql.js +17 -0
  102. package/dist/toolbar/db-viewer/studio/env/mysql.d.ts +7 -0
  103. package/dist/toolbar/db-viewer/studio/env/mysql.js +23 -0
  104. package/dist/toolbar/db-viewer/studio/env/postgres.d.ts +7 -0
  105. package/dist/toolbar/db-viewer/studio/env/postgres.js +23 -0
  106. package/dist/toolbar/db-viewer/studio/index.js +20 -56
  107. package/dist/toolbar/db-viewer/studio/type.d.ts +1 -2
  108. package/dist/toolbar/db-viewer/studio/virtual-connection/libsql.d.ts +3 -0
  109. package/dist/toolbar/db-viewer/studio/virtual-connection/libsql.js +24 -0
  110. package/dist/toolbar/db-viewer/studio/virtual-connection/mysql.d.ts +3 -0
  111. package/dist/toolbar/db-viewer/studio/virtual-connection/mysql.js +9 -0
  112. package/dist/toolbar/db-viewer/studio/virtual-connection/postgres.d.ts +3 -0
  113. package/dist/toolbar/db-viewer/studio/virtual-connection/postgres.js +9 -0
  114. package/dist/toolbar/db-viewer/viewer.js +20 -21
  115. package/dist/types.d.ts +30 -0
  116. package/dist/utils/effects/smtp.d.ts +1 -1
  117. package/dist/utils/lang-helper.d.ts +10 -2
  118. package/dist/virtual.d.ts +35 -28
  119. package/dist/virtuals/auth/core.d.ts +5 -5
  120. package/dist/virtuals/auth/verify-email.d.ts +6 -6
  121. package/dist/virtuals/components/Generator.astro +2 -2
  122. package/dist/virtuals/components/Renderer.astro +9 -1
  123. package/dist/virtuals/components/renderFn.d.ts +3 -1
  124. package/dist/virtuals/components/renderFn.js +18 -0
  125. package/dist/virtuals/lib/headDefaults.d.ts +4 -2
  126. package/dist/virtuals/lib/headDefaults.js +0 -2
  127. package/dist/virtuals/lib/routeMap.d.ts +0 -12
  128. package/dist/virtuals/lib/routeMap.js +2 -14
  129. package/dist/virtuals/mailer/index.d.ts +3 -3
  130. package/dist/virtuals/notifier/index.d.ts +5 -5
  131. package/dist/virtuals/plugins/dashboard-pages.d.ts +2 -64
  132. package/dist/virtuals/scripts/StorageFileBrowser.d.ts +1 -172
  133. package/dist/virtuals/scripts/StorageFileBrowser.js +216 -119
  134. package/dist/virtuals/template-engine/index.d.ts +4 -4
  135. package/frontend/components/dashboard/configuration/ConfigForm.astro +218 -110
  136. package/frontend/components/dashboard/content-mgmt/ContentSearch.astro +21 -22
  137. package/frontend/components/dashboard/content-mgmt/CreateFolder.astro +66 -54
  138. package/frontend/components/dashboard/content-mgmt/CreatePage.astro +58 -104
  139. package/frontend/components/dashboard/content-mgmt/EditFolder.astro +65 -67
  140. package/frontend/components/dashboard/content-mgmt/EditPage.astro +86 -134
  141. package/frontend/components/dashboard/content-mgmt/InnerSidebarElement.astro +0 -1
  142. package/frontend/components/dashboard/content-mgmt/PageHeader.astro +33 -52
  143. package/frontend/components/dashboard/content-mgmt/PageTypeHandler.astro +2 -2
  144. package/frontend/components/dashboard/profile/APITokens.astro +219 -158
  145. package/frontend/components/dashboard/profile/BasicInfo.astro +165 -106
  146. package/frontend/components/dashboard/profile/Notifications.astro +27 -18
  147. package/frontend/components/dashboard/profile/UpdatePassword.astro +134 -94
  148. package/frontend/components/dashboard/sidebar/VersionCheck.astro +31 -16
  149. package/frontend/components/dashboard/sidebar/VersionCheckChangelog.astro +18 -11
  150. package/frontend/components/dashboard/sidebar-modals/VersionModal.astro +2 -2
  151. package/frontend/components/dashboard/smtp-config/TemplateEditor.astro +14 -14
  152. package/frontend/components/dashboard/taxonomy/InnerSidebarElement.astro +0 -1
  153. package/frontend/components/dashboard/taxonomy/MetaContainer.astro +0 -2
  154. package/frontend/components/dashboard/taxonomy/PageHeader.astro +16 -24
  155. package/frontend/components/dashboard/taxonomy/TaxonomySearch.astro +23 -27
  156. package/frontend/components/dashboard/user-mgmt/InnerSidebarElement.astro +111 -104
  157. package/frontend/components/dashboard/user-mgmt/UserListItem.astro +9 -22
  158. package/frontend/components/dashboard/user-mgmt/UserListItems.astro +18 -0
  159. package/frontend/components/first-time-setup/snippets/{opt2-studiocms.config.diff → studiocms.config.diff} +1 -0
  160. package/frontend/components/shared/Code.astro +1 -4
  161. package/frontend/components/shared/DynamicSettingsRenderer.astro +1 -1
  162. package/frontend/components/shared/SSRUser.astro +2 -4
  163. package/frontend/components/shared/foldertree/FolderTreeNode.astro +0 -6
  164. package/frontend/components/shared/storage-manager/StorageCopyOutput.astro +0 -1
  165. package/frontend/components/shared/taxonomy/TaxonomyTreeNode.astro +0 -6
  166. package/frontend/layouts/DashboardLayout.astro +1 -10
  167. package/frontend/layouts/TaxonomyLayout.astro +0 -1
  168. package/frontend/middleware/index.ts +102 -61
  169. package/frontend/pages/404.astro +5 -9
  170. package/frontend/pages/[dashboard]/[...pluginPage].astro +10 -1
  171. package/frontend/pages/[dashboard]/configuration.astro +10 -1
  172. package/frontend/pages/[dashboard]/content-management/createfolder.astro +10 -1
  173. package/frontend/pages/[dashboard]/content-management/createpage.astro +10 -1
  174. package/frontend/pages/[dashboard]/content-management/diff.astro +39 -14
  175. package/frontend/pages/[dashboard]/content-management/editfolder.astro +10 -1
  176. package/frontend/pages/[dashboard]/content-management/editpage.astro +10 -1
  177. package/frontend/pages/[dashboard]/content-management/index.astro +10 -1
  178. package/frontend/pages/[dashboard]/index.astro +10 -1
  179. package/frontend/pages/[dashboard]/login.astro +86 -25
  180. package/frontend/pages/[dashboard]/password-reset.astro +22 -16
  181. package/frontend/pages/[dashboard]/plugins/[plugin].astro +10 -1
  182. package/frontend/pages/[dashboard]/profile.astro +10 -1
  183. package/frontend/pages/[dashboard]/signup.astro +153 -52
  184. package/frontend/pages/[dashboard]/smtp-configuration.astro +77 -75
  185. package/frontend/pages/[dashboard]/system-management.astro +10 -1
  186. package/frontend/pages/[dashboard]/taxonomy/categories.astro +30 -41
  187. package/frontend/pages/[dashboard]/taxonomy/index.astro +10 -0
  188. package/frontend/pages/[dashboard]/taxonomy/tags.astro +33 -43
  189. package/frontend/pages/[dashboard]/unverified-email.astro +29 -21
  190. package/frontend/pages/[dashboard]/user-management/edit.astro +170 -90
  191. package/frontend/pages/[dashboard]/user-management/index.astro +10 -1
  192. package/frontend/pages/studiocms_api/[...all].ts +106 -0
  193. package/frontend/pages/studiocms_api/_handlers/_utils/auth.ts +26 -0
  194. package/frontend/pages/studiocms_api/_handlers/_utils/changelog.ts +147 -0
  195. package/frontend/pages/studiocms_api/_handlers/_utils/db-studio-driver.ts +46 -0
  196. package/frontend/pages/studiocms_api/_handlers/_utils/parseLogLevel.ts +27 -0
  197. package/frontend/pages/studiocms_api/_handlers/auth/auth.ts +459 -0
  198. package/frontend/pages/studiocms_api/_handlers/auth/index.ts +17 -0
  199. package/frontend/pages/studiocms_api/_handlers/auth/oauth.ts +91 -0
  200. package/frontend/pages/studiocms_api/_handlers/dashboard/_shared.ts +57 -0
  201. package/frontend/pages/studiocms_api/_handlers/dashboard/apiTokens.ts +134 -0
  202. package/frontend/pages/studiocms_api/_handlers/dashboard/config.ts +64 -0
  203. package/frontend/pages/studiocms_api/_handlers/dashboard/content.ts +741 -0
  204. package/frontend/pages/studiocms_api/_handlers/dashboard/create.ts +480 -0
  205. package/frontend/pages/studiocms_api/_handlers/dashboard/emailNotifications.ts +49 -0
  206. package/frontend/pages/studiocms_api/_handlers/dashboard/index.ts +45 -0
  207. package/frontend/pages/studiocms_api/_handlers/dashboard/mailer.ts +136 -0
  208. package/frontend/pages/studiocms_api/_handlers/dashboard/plugins.ts +80 -0
  209. package/frontend/pages/studiocms_api/_handlers/dashboard/profile.ts +275 -0
  210. package/frontend/pages/studiocms_api/_handlers/dashboard/resetPassword.ts +140 -0
  211. package/frontend/pages/studiocms_api/_handlers/dashboard/search.ts +63 -0
  212. package/frontend/pages/studiocms_api/_handlers/dashboard/taxonomy.ts +285 -0
  213. package/frontend/pages/studiocms_api/_handlers/dashboard/templates.ts +75 -0
  214. package/frontend/pages/studiocms_api/_handlers/dashboard/users.ts +312 -0
  215. package/frontend/pages/studiocms_api/_handlers/dashboard/verifyEndpoints.ts +307 -0
  216. package/frontend/pages/studiocms_api/_handlers/integration/dbStudio.ts +98 -0
  217. package/frontend/pages/studiocms_api/_handlers/integration/index.ts +17 -0
  218. package/frontend/pages/studiocms_api/_handlers/integration/storageManager.ts +107 -0
  219. package/frontend/pages/studiocms_api/_handlers/rest-api/index.ts +8 -0
  220. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/_shared.ts +41 -0
  221. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/index.ts +17 -0
  222. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/public.ts +195 -0
  223. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/secure.ts +1726 -0
  224. package/frontend/pages/studiocms_api/_handlers/sdk.ts +129 -0
  225. package/frontend/pages/studiocms_api/_middleware/astroLocals.ts +36 -0
  226. package/frontend/pages/studiocms_api/_middleware/restApi.ts +56 -0
  227. package/frontend/pages/studiocms_api/integrations/[...all].ts +8 -0
  228. package/frontend/scripts/formdata.ts +219 -0
  229. package/frontend/setup-pages/3-done.astro +4 -20
  230. package/frontend/setup-pages/studiocms_api/dashboard/step-2.ts +3 -6
  231. package/frontend/styles/dashboard-base.css +0 -1
  232. package/frontend/web-vitals/endpoint.ts +2 -1
  233. package/package.json +35 -31
  234. package/dist/global.d.ts +0 -9
  235. package/frontend/components/dashboard/LoginChecker.astro +0 -68
  236. package/frontend/components/dashboard/user-mgmt/RankCheck.astro +0 -57
  237. package/frontend/components/first-time-setup/snippets/opt1-astro.config.diff +0 -14
  238. package/frontend/components/first-time-setup/snippets/opt2-astro.config.diff +0 -9
  239. package/frontend/middleware/_authmap.ts +0 -63
  240. package/frontend/pages/studiocms_api/auth/[path].ts +0 -390
  241. package/frontend/pages/studiocms_api/auth/[provider]/[...id].ts +0 -64
  242. package/frontend/pages/studiocms_api/auth/[provider]/_effects/index.ts +0 -101
  243. package/frontend/pages/studiocms_api/auth/_shared.ts +0 -52
  244. package/frontend/pages/studiocms_api/dashboard/api-tokens.ts +0 -115
  245. package/frontend/pages/studiocms_api/dashboard/config.ts +0 -74
  246. package/frontend/pages/studiocms_api/dashboard/content/diff.ts +0 -73
  247. package/frontend/pages/studiocms_api/dashboard/content/folder.ts +0 -220
  248. package/frontend/pages/studiocms_api/dashboard/content/page.ts +0 -359
  249. package/frontend/pages/studiocms_api/dashboard/create-reset-link.ts +0 -77
  250. package/frontend/pages/studiocms_api/dashboard/create-user-invite.ts +0 -231
  251. package/frontend/pages/studiocms_api/dashboard/create-user.ts +0 -186
  252. package/frontend/pages/studiocms_api/dashboard/email-notification-settings-site.ts +0 -74
  253. package/frontend/pages/studiocms_api/dashboard/mailer/check-email.ts +0 -75
  254. package/frontend/pages/studiocms_api/dashboard/mailer/config.ts +0 -136
  255. package/frontend/pages/studiocms_api/dashboard/plugins/[plugin].ts +0 -80
  256. package/frontend/pages/studiocms_api/dashboard/profile.ts +0 -245
  257. package/frontend/pages/studiocms_api/dashboard/resend-verify-email.ts +0 -77
  258. package/frontend/pages/studiocms_api/dashboard/reset-password.ts +0 -124
  259. package/frontend/pages/studiocms_api/dashboard/search-list.ts +0 -59
  260. package/frontend/pages/studiocms_api/dashboard/taxonomy-search.ts +0 -47
  261. package/frontend/pages/studiocms_api/dashboard/taxonomy.ts +0 -230
  262. package/frontend/pages/studiocms_api/dashboard/templates.ts +0 -74
  263. package/frontend/pages/studiocms_api/dashboard/update-user-notifications.ts +0 -86
  264. package/frontend/pages/studiocms_api/dashboard/users.ts +0 -236
  265. package/frontend/pages/studiocms_api/dashboard/verify-email.ts +0 -83
  266. package/frontend/pages/studiocms_api/dashboard/verify-session.ts +0 -187
  267. package/frontend/pages/studiocms_api/integrations/[type]/[...id].ts +0 -15
  268. package/frontend/pages/studiocms_api/integrations/[type]/_routes/db-studio.ts +0 -173
  269. package/frontend/pages/studiocms_api/integrations/[type]/_routes/storage.ts +0 -88
  270. package/frontend/pages/studiocms_api/partials/editor.astro +0 -74
  271. package/frontend/pages/studiocms_api/partials/render.astro +0 -39
  272. package/frontend/pages/studiocms_api/partials/user-list-items.astro +0 -43
  273. package/frontend/pages/studiocms_api/rest/utils/auth-token.ts +0 -59
  274. package/frontend/pages/studiocms_api/rest/v1/[type]/[...id].ts +0 -23
  275. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/categories.ts +0 -267
  276. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/folders.ts +0 -283
  277. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/pages.ts +0 -505
  278. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/settings.ts +0 -100
  279. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/tags.ts +0 -229
  280. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/users.ts +0 -553
  281. package/frontend/pages/studiocms_api/rest/v1/public/[type]/[...id].ts +0 -19
  282. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/categories.ts +0 -74
  283. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/folders.ts +0 -85
  284. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/pages.ts +0 -103
  285. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/tags.ts +0 -67
  286. package/frontend/pages/studiocms_api/sdk/[...path].ts +0 -97
  287. package/frontend/pages/studiocms_api/sdk/utils/changelog.ts +0 -119
  288. package/frontend/scripts/auth/formListener.ts +0 -81
  289. package/frontend/scripts/formdata-utils.ts +0 -116
  290. package/frontend/utils/build-partial-schema.ts +0 -46
  291. package/frontend/utils/errors.ts +0 -6
  292. package/frontend/utils/param-extractor.ts +0 -83
  293. package/frontend/utils/rest-router.ts +0 -444
@@ -1,3 +1,7 @@
1
+ import { integrationsClient } from "studiocms:client/apiClients";
2
+ import { IntegrationsAPIError } from "@withstudiocms/api-spec/integrations";
3
+ import * as Cause from "effect/Cause";
4
+ import * as Effect from "effect/Effect";
1
5
  const s3SafeNameRegex = /^[a-zA-Z0-9._-]+(?:\/[a-zA-Z0-9._-]+)*$/;
2
6
  class InvalidFileNameError extends Error {
3
7
  #files;
@@ -423,13 +427,27 @@ class StorageFileBrowser extends HTMLElement {
423
427
  if (!this.selectedFile) return;
424
428
  let value = "";
425
429
  if (this.returnType === "url") {
426
- const response = await fetch(this.apiEndpoint, {
427
- method: "POST",
428
- headers: { "Content-Type": "application/json" },
429
- body: JSON.stringify({ action: "publicUrl", key: this.selectedFile.key })
430
- });
431
- const data = await response.json();
432
- value = data.url;
430
+ const response = await integrationsClient.pipe(
431
+ Effect.flatMap(
432
+ (client) => client.storageManager.storageManager({
433
+ payload: {
434
+ action: "publicUrl",
435
+ // biome-ignore lint/style/noNonNullAssertion: We check for selectedFile above, so this is safe
436
+ key: this.selectedFile.key
437
+ }
438
+ })
439
+ ),
440
+ Effect.flatMap(
441
+ (res) => "url" in res ? Effect.succeed(res.url) : Effect.fail(
442
+ new IntegrationsAPIError({
443
+ error: "Invalid response from server: missing url field"
444
+ })
445
+ )
446
+ ),
447
+ Effect.tapError(Effect.logError),
448
+ Effect.runPromise
449
+ );
450
+ value = response;
433
451
  } else if (this.returnType === "identifier") {
434
452
  value = `storage-file://${this.selectedFile.key}`;
435
453
  } else {
@@ -450,36 +468,45 @@ class StorageFileBrowser extends HTMLElement {
450
468
  if (!content) return false;
451
469
  content.innerHTML = `<div class="storage-browser-loading" role="status">${this.t("testingConnection")}</div>`;
452
470
  try {
453
- const response = await fetch(this.apiEndpoint, {
454
- method: "POST",
455
- headers: { "Content-Type": "application/json" },
456
- body: JSON.stringify({ action: "test" })
457
- });
458
- const data = await response.json();
459
- if (response.status === 501 && data.error) {
471
+ const response = await integrationsClient.pipe(
472
+ Effect.flatMap(
473
+ (client) => client.storageManager.storageManager({
474
+ payload: { action: "test" }
475
+ })
476
+ ),
477
+ Effect.flatMap(
478
+ (res) => "success" in res ? Effect.succeed({ success: res.success }) : Effect.fail(
479
+ new IntegrationsAPIError({
480
+ error: "Invalid response from server: missing success field"
481
+ })
482
+ )
483
+ ),
484
+ Effect.tapError(Effect.logError),
485
+ Effect.runPromiseExit
486
+ );
487
+ if (response._tag === "Failure") {
488
+ const errors = Cause.prettyErrors(response.cause).map((e) => e.message).join("; ");
460
489
  this.connectionEstablished = false;
490
+ this.connectionTestResponse = {
491
+ status: 500,
492
+ message: errors || "Unknown error"
493
+ };
461
494
  content.innerHTML = `
462
495
  <div class="storage-browser-error" role="alert">
463
496
  <svg width="48" height="48" fill="none" stroke="currentColor" viewBox="0 0 24 24">
464
497
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
465
498
  </svg>
466
- <p>${this.t(data.error)}</p>
499
+ <p>${this.t("failedConnection")}</p>
500
+ <p style="font-size: 0.875rem; opacity: 0.7;">${errors || this.t("unknownError")}</p>
467
501
  </div>
468
502
  `;
469
- this.connectionTestResponse = {
470
- status: response.status,
471
- message: data.error || "No error message provided"
472
- };
473
503
  return false;
474
504
  }
475
- if (!response.ok) {
476
- this.connectionTestResponse = {
477
- status: response.status,
478
- message: data.error || "No error message provided"
479
- };
480
- throw new Error(data.error || "Connection test failed");
481
- }
482
- this.connectionEstablished = data.success === true;
505
+ this.connectionEstablished = response.value.success === true;
506
+ this.connectionTestResponse = {
507
+ status: 200,
508
+ message: "Connection successful"
509
+ };
483
510
  if (!this.connectionEstablished) {
484
511
  content.innerHTML = `
485
512
  <div class="storage-browser-error" role="alert">
@@ -516,13 +543,25 @@ class StorageFileBrowser extends HTMLElement {
516
543
  if (!content) return;
517
544
  content.innerHTML = `<div class="storage-browser-loading">${this.t("loadingFiles")}</div>`;
518
545
  try {
519
- const response = await fetch(this.apiEndpoint, {
520
- method: "POST",
521
- headers: { "Content-Type": "application/json" },
522
- body: JSON.stringify({ action: "list", prefix: this.currentPath })
523
- });
524
- const data = await response.json();
525
- const files = data.files;
546
+ const files = await integrationsClient.pipe(
547
+ Effect.flatMap(
548
+ (client) => client.storageManager.storageManager({
549
+ payload: {
550
+ action: "list",
551
+ prefix: this.currentPath
552
+ }
553
+ })
554
+ ),
555
+ Effect.flatMap(
556
+ (returnedData) => "files" in returnedData ? Effect.succeed(returnedData.files) : Effect.fail(
557
+ new IntegrationsAPIError({
558
+ error: "Invalid response from server: missing files field"
559
+ })
560
+ )
561
+ ),
562
+ Effect.tapError(Effect.logError),
563
+ Effect.runPromise
564
+ );
526
565
  this.updateBreadcrumb();
527
566
  const folders = /* @__PURE__ */ new Set();
528
567
  const fileItems = [];
@@ -1083,14 +1122,18 @@ class StorageFileBrowser extends HTMLElement {
1083
1122
  if (!content) return;
1084
1123
  content.innerHTML = `<div class="storage-browser-loading" role="status">${this.t("deletingFile")}</div>`;
1085
1124
  try {
1086
- const response = await fetch(this.apiEndpoint, {
1087
- method: "POST",
1088
- headers: { "Content-Type": "application/json" },
1089
- body: JSON.stringify({ action: "delete", key: file.key })
1090
- });
1091
- if (!response.ok) {
1092
- throw new Error("Delete failed");
1093
- }
1125
+ await integrationsClient.pipe(
1126
+ Effect.flatMap(
1127
+ (client) => client.storageManager.storageManager({
1128
+ payload: {
1129
+ action: "delete",
1130
+ key: file.key
1131
+ }
1132
+ })
1133
+ ),
1134
+ Effect.tapError(Effect.logError),
1135
+ Effect.runPromise
1136
+ );
1094
1137
  await this.loadFiles();
1095
1138
  } catch (error) {
1096
1139
  console.error("Delete error:", error);
@@ -1119,28 +1162,43 @@ class StorageFileBrowser extends HTMLElement {
1119
1162
  const sanitized = newName.replace(/[^a-zA-Z0-9-_]/g, "-");
1120
1163
  const oldPrefix = `${this.currentPath + oldName}/`;
1121
1164
  const newPrefix = `${this.currentPath + sanitized}/`;
1122
- const response = await fetch(this.apiEndpoint, {
1123
- method: "POST",
1124
- headers: { "Content-Type": "application/json" },
1125
- body: JSON.stringify({ action: "list", prefix: oldPrefix })
1126
- });
1127
- if (!response.ok) throw new Error("Failed to list folder contents");
1128
- const result = await response.json();
1129
- const files = result.files || result.data?.files || [];
1165
+ const files = await integrationsClient.pipe(
1166
+ Effect.flatMap(
1167
+ (client) => client.storageManager.storageManager({
1168
+ payload: {
1169
+ action: "list",
1170
+ prefix: oldPrefix
1171
+ }
1172
+ })
1173
+ ),
1174
+ Effect.flatMap(
1175
+ (returnedData) => "files" in returnedData ? Effect.succeed(returnedData.files) : Effect.fail(
1176
+ new IntegrationsAPIError({
1177
+ error: "Unexpected response structure"
1178
+ })
1179
+ )
1180
+ ),
1181
+ Effect.tapError(Effect.logError),
1182
+ Effect.runPromise
1183
+ );
1130
1184
  for (const file of files) {
1131
1185
  const relativePath = file.key.substring(oldPrefix.length);
1132
1186
  const newKey = newPrefix + relativePath;
1133
- const renameResponse = await fetch(this.apiEndpoint, {
1134
- method: "POST",
1135
- headers: { "Content-Type": "application/json" },
1136
- body: JSON.stringify({
1137
- action: "rename",
1138
- key: file.key,
1139
- newKey
1140
- })
1141
- });
1142
- if (!renameResponse.ok) {
1143
- const error = await renameResponse.json();
1187
+ const response = await integrationsClient.pipe(
1188
+ Effect.flatMap(
1189
+ (client) => client.storageManager.storageManager({
1190
+ payload: {
1191
+ action: "rename",
1192
+ key: file.key,
1193
+ newKey
1194
+ }
1195
+ })
1196
+ ),
1197
+ Effect.tapError(Effect.logError),
1198
+ Effect.runPromiseExit
1199
+ );
1200
+ if (response._tag === "Failure") {
1201
+ const error = Cause.prettyErrors(response.cause).map((e) => e.message).join("; ");
1144
1202
  console.error("Failed to rename file:", file.key, error);
1145
1203
  }
1146
1204
  }
@@ -1169,22 +1227,40 @@ class StorageFileBrowser extends HTMLElement {
1169
1227
  `;
1170
1228
  try {
1171
1229
  const prefix = `${this.currentPath + folderName}/`;
1172
- const response = await fetch(this.apiEndpoint, {
1173
- method: "POST",
1174
- headers: { "Content-Type": "application/json" },
1175
- body: JSON.stringify({ action: "list", prefix })
1176
- });
1177
- if (!response.ok) throw new Error("Failed to list folder contents");
1178
- const result = await response.json();
1179
- const files = result.files || result.data?.files || [];
1230
+ const files = await integrationsClient.pipe(
1231
+ Effect.flatMap(
1232
+ (client) => client.storageManager.storageManager({
1233
+ payload: {
1234
+ action: "list",
1235
+ prefix
1236
+ }
1237
+ })
1238
+ ),
1239
+ Effect.flatMap(
1240
+ (returnedData) => "files" in returnedData ? Effect.succeed(returnedData.files) : Effect.fail(
1241
+ new IntegrationsAPIError({
1242
+ error: "Unexpected response structure"
1243
+ })
1244
+ )
1245
+ ),
1246
+ Effect.tapError(Effect.logError),
1247
+ Effect.runPromise
1248
+ );
1180
1249
  for (const file of files) {
1181
- const deleteResponse = await fetch(this.apiEndpoint, {
1182
- method: "POST",
1183
- headers: { "Content-Type": "application/json" },
1184
- body: JSON.stringify({ action: "delete", key: file.key })
1185
- });
1186
- if (!deleteResponse.ok) {
1187
- const error = await deleteResponse.json();
1250
+ const response = await integrationsClient.pipe(
1251
+ Effect.flatMap(
1252
+ (client) => client.storageManager.storageManager({
1253
+ payload: {
1254
+ action: "delete",
1255
+ key: file.key
1256
+ }
1257
+ })
1258
+ ),
1259
+ Effect.tapError(Effect.logError),
1260
+ Effect.runPromiseExit
1261
+ );
1262
+ if (response._tag === "Failure") {
1263
+ const error = Cause.prettyErrors(response.cause).map((e) => e.message).join("; ");
1188
1264
  console.error("Failed to delete file:", file.key, error);
1189
1265
  }
1190
1266
  }
@@ -1218,16 +1294,21 @@ class StorageFileBrowser extends HTMLElement {
1218
1294
  try {
1219
1295
  const sanitized = folderName.replace(/[^a-zA-Z0-9-_]/g, "-");
1220
1296
  const folderKey = `${this.currentPath}${sanitized}/.folder`;
1221
- const response = await fetch(this.apiEndpoint, {
1222
- method: "PUT",
1223
- headers: {
1224
- "Content-Type": "text/plain",
1225
- "x-storage-key": folderKey
1226
- },
1227
- body: ""
1228
- });
1229
- if (!response.ok) {
1230
- throw new Error("Create folder failed");
1297
+ const response = await integrationsClient.pipe(
1298
+ Effect.flatMap(
1299
+ (client) => client.storageManager.storageManagerUpload({
1300
+ headers: {
1301
+ "x-storage-key": folderKey
1302
+ },
1303
+ payload: Buffer.from("")
1304
+ })
1305
+ ),
1306
+ Effect.tapError(Effect.logError),
1307
+ Effect.runPromiseExit
1308
+ );
1309
+ if (response._tag === "Failure") {
1310
+ const error = Cause.prettyErrors(response.cause).map((e) => e.message).join("; ");
1311
+ throw new Error(error);
1231
1312
  }
1232
1313
  await this.loadFiles();
1233
1314
  } catch (error) {
@@ -1339,17 +1420,22 @@ class StorageFileBrowser extends HTMLElement {
1339
1420
  async uploadSingleFile(file, customName) {
1340
1421
  const fileName = customName || `${Date.now()}-${file.name}`;
1341
1422
  const key = this.currentPath ? `${this.currentPath}${fileName}` : fileName;
1342
- const response = await fetch(this.apiEndpoint, {
1343
- method: "PUT",
1344
- headers: {
1345
- "Content-Type": file.type || "application/octet-stream",
1346
- "x-storage-key": key
1347
- },
1348
- body: file
1349
- });
1350
- if (!response.ok) {
1351
- const error = await response.json();
1352
- throw new Error(error.error || "Upload failed");
1423
+ const payload = Buffer.from(await file.arrayBuffer());
1424
+ const response = await integrationsClient.pipe(
1425
+ Effect.flatMap(
1426
+ (client) => client.storageManager.storageManagerUpload({
1427
+ headers: {
1428
+ "x-storage-key": key
1429
+ },
1430
+ payload
1431
+ })
1432
+ ),
1433
+ Effect.tapError(Effect.logError),
1434
+ Effect.runPromiseExit
1435
+ );
1436
+ if (response._tag === "Failure") {
1437
+ const error = Cause.prettyErrors(response.cause).map((e) => e.message).join("; ");
1438
+ throw new Error(error);
1353
1439
  }
1354
1440
  }
1355
1441
  showRenameFolderDialog(folderName) {
@@ -1474,20 +1560,23 @@ class StorageFileBrowser extends HTMLElement {
1474
1560
  newKey,
1475
1561
  action: "rename"
1476
1562
  });
1477
- const response = await fetch(this.apiEndpoint, {
1478
- method: "POST",
1479
- headers: {
1480
- "Content-Type": "application/json"
1481
- },
1482
- body: JSON.stringify({
1483
- action: "rename",
1484
- key: this.fileToRename.key,
1485
- newKey
1486
- })
1487
- });
1488
- if (!response.ok) {
1489
- const errorData = await response.json();
1490
- throw new Error(errorData.error || "Rename failed");
1563
+ const response = await integrationsClient.pipe(
1564
+ Effect.flatMap(
1565
+ (client) => client.storageManager.storageManager({
1566
+ payload: {
1567
+ action: "rename",
1568
+ // biome-ignore lint/style/noNonNullAssertion: We check fileToRename at the beginning of this function
1569
+ key: this.fileToRename.key,
1570
+ newKey
1571
+ }
1572
+ })
1573
+ ),
1574
+ Effect.tapError(Effect.logError),
1575
+ Effect.runPromiseExit
1576
+ );
1577
+ if (response._tag === "Failure") {
1578
+ const error = Cause.prettyErrors(response.cause).map((e) => e.message).join("; ");
1579
+ throw new Error(error);
1491
1580
  }
1492
1581
  await this.loadFiles();
1493
1582
  } catch (error) {
@@ -1582,14 +1671,22 @@ class StorageFileBrowser extends HTMLElement {
1582
1671
  fileExt || ""
1583
1672
  );
1584
1673
  try {
1585
- const response = await fetch(this.apiEndpoint, {
1586
- method: "POST",
1587
- headers: { "Content-Type": "application/json" },
1588
- body: JSON.stringify({ action: "publicUrl", key: file.key })
1589
- });
1590
- if (!response.ok) throw new Error("Failed to get file URL");
1591
- const result = await response.json();
1592
- const fileUrl = result.url;
1674
+ const fileUrl = await integrationsClient.pipe(
1675
+ Effect.flatMap(
1676
+ (client) => client.storageManager.storageManager({
1677
+ payload: { action: "publicUrl", key: file.key }
1678
+ })
1679
+ ),
1680
+ Effect.flatMap(
1681
+ (returnedData) => "url" in returnedData ? Effect.succeed(returnedData.url) : Effect.fail(
1682
+ new IntegrationsAPIError({
1683
+ error: "Unexpected response structure"
1684
+ })
1685
+ )
1686
+ ),
1687
+ Effect.tapError(Effect.logError),
1688
+ Effect.runPromise
1689
+ );
1593
1690
  if (!fileUrl) {
1594
1691
  throw new Error("No URL returned from API");
1595
1692
  }
@@ -27,15 +27,15 @@ export declare const templateEngine: Effect.Effect<{
27
27
  * @param key - The key of the template to retrieve.
28
28
  * @returns The specified email template.
29
29
  */
30
- readonly getTemplate: (key: "notifications" | "passwordReset" | "userInvite" | "verifyEmail") => string | undefined;
30
+ readonly getTemplate: (key: "verifyEmail" | "notifications" | "passwordReset" | "userInvite") => string | undefined;
31
31
  /**
32
32
  * Retrieves the default email template.
33
33
  *
34
34
  * @param key - The key of the default template to retrieve.
35
35
  * @returns The default email template.
36
36
  */
37
- readonly getDefaultTemplate: (key: "notifications" | "passwordReset" | "userInvite" | "verifyEmail") => "<!doctype html>\n<html>\n <body>\n <div\n style='background-color:#F2F5F7;color:#242424;font-family:\"Helvetica Neue\", \"Arial Nova\", \"Nimbus Sans\", Arial, sans-serif;font-size:16px;font-weight:400;letter-spacing:0.15008px;line-height:1.5;margin:0;padding:32px 0;min-height:100%;width:100%'\n >\n <table\n align=\"center\"\n width=\"100%\"\n style=\"margin:0 auto;max-width:600px;background-color:#FFFFFF\"\n role=\"presentation\"\n cellspacing=\"0\"\n cellpadding=\"0\"\n border=\"0\"\n >\n <tbody>\n <tr style=\"width:100%\">\n <td>\n <h3\n style=\"font-weight:bold;text-align:left;margin:0;font-size:20px;padding:32px 24px 0px 24px\"\n >\n {{data.title}}\n </h3>\n <div\n style=\"color:#474849;font-size:14px;font-weight:normal;text-align:left;padding:8px 24px 16px 24px\"\n >\n {{data.message}}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </body>\n</html>" | "<!doctype html>\n<html>\n <body>\n <div\n style='background-color:#F2F5F7;color:#242424;font-family:\"Helvetica Neue\", \"Arial Nova\", \"Nimbus Sans\", Arial, sans-serif;font-size:16px;font-weight:400;letter-spacing:0.15008px;line-height:1.5;margin:0;padding:32px 0;min-height:100%;width:100%'\n >\n <table\n align=\"center\"\n width=\"100%\"\n style=\"margin:0 auto;max-width:600px;background-color:#FFFFFF\"\n role=\"presentation\"\n cellspacing=\"0\"\n cellpadding=\"0\"\n border=\"0\"\n >\n <tbody>\n <tr style=\"width:100%\">\n <td>\n <h3\n style=\"font-weight:bold;text-align:left;margin:0;font-size:20px;padding:32px 24px 0px 24px\"\n >\n Reset Your Password\n </h3>\n <div\n style=\"color:#474849;font-size:14px;font-weight:normal;text-align:left;padding:8px 24px 16px 24px\"\n >\n Click the button below, or copy-paste the link to reset your password!\n <br />\n <br />\n If you didn't request a password reset, you can ignore this email and\n your password will not be changed.\n </div>\n <div style=\"text-align:left;padding:12px 24px 32px 24px\">\n <a\n href=\"{{data.link}}\"\n style=\"color:#FFFFFF;font-size:14px;font-weight:bold;background-color:#0068FF;display:inline-block;padding:12px 20px;text-decoration:none\"\n target=\"_blank\"\n ><span>Reset Password</span></a\n >\n </div>\n <div\n style=\"font-size:12px;font-weight:normal;padding:16px 24px 16px 24px\"\n >\n Link: {{data.link}}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </body>\n</html>" | "<!doctype html>\n<html>\n <body>\n <div\n style='background-color:#F2F5F7;color:#242424;font-family:\"Helvetica Neue\", \"Arial Nova\", \"Nimbus Sans\", Arial, sans-serif;font-size:16px;font-weight:400;letter-spacing:0.15008px;line-height:1.5;margin:0;padding:32px 0;min-height:100%;width:100%'\n >\n <table\n align=\"center\"\n width=\"100%\"\n style=\"margin:0 auto;max-width:600px;background-color:#FFFFFF\"\n role=\"presentation\"\n cellspacing=\"0\"\n cellpadding=\"0\"\n border=\"0\"\n >\n <tbody>\n <tr style=\"width:100%\">\n <td>\n <h3\n style=\"font-weight:bold;text-align:left;margin:0;font-size:20px;padding:32px 24px 0px 24px\"\n >\n New User Invite from {{site.title}}\n </h3>\n <div\n style=\"color:#474849;font-size:14px;font-weight:normal;text-align:left;padding:8px 24px 16px 24px\"\n >\n You have been invited to join {{site.title}}! Click the button below to set your password and get started.\n </div>\n <div style=\"text-align:left;padding:12px 24px 32px 24px\">\n <a\n href=\"{{data.link}}\"\n style=\"color:#FFFFFF;font-size:14px;font-weight:bold;background-color:#0068FF;display:inline-block;padding:12px 20px;text-decoration:none\"\n target=\"_blank\"\n ><span>Set Password</span\n ></a\n >\n </div>\n <div\n style=\"font-size:12px;font-weight:normal;padding:16px 24px 16px 24px\"\n >\n Link: {{data.link}}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </body>\n</html>" | "<!doctype html>\n<html>\n <body>\n <div\n style='background-color:#F2F5F7;color:#242424;font-family:\"Helvetica Neue\", \"Arial Nova\", \"Nimbus Sans\", Arial, sans-serif;font-size:16px;font-weight:400;letter-spacing:0.15008px;line-height:1.5;margin:0;padding:32px 0;min-height:100%;width:100%'\n >\n <table\n align=\"center\"\n width=\"100%\"\n style=\"margin:0 auto;max-width:600px;background-color:#FFFFFF\"\n role=\"presentation\"\n cellspacing=\"0\"\n cellpadding=\"0\"\n border=\"0\"\n >\n <tbody>\n <tr style=\"width:100%\">\n <td>\n <h3\n style=\"font-weight:bold;text-align:left;margin:0;font-size:20px;padding:32px 24px 0px 24px\"\n >\n Verify your Email\n </h3>\n <div\n style=\"color:#474849;font-size:14px;font-weight:normal;text-align:left;padding:8px 24px 16px 24px\"\n >\n Click the button below, or copy-paste the link to verify your\n email!\n </div>\n <div style=\"text-align:left;padding:12px 24px 32px 24px\">\n <a\n href=\"{{data.link}}\"\n style=\"color:#FFFFFF;font-size:14px;font-weight:bold;background-color:#0068FF;display:inline-block;padding:12px 20px;text-decoration:none\"\n target=\"_blank\"\n ><span>Verify Email</span></a\n >\n </div>\n <div\n style=\"font-size:12px;font-weight:normal;padding:16px 24px 16px 24px\"\n >\n Link: {{data.link}}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </body>\n</html>";
38
- readonly availableTemplates: ("notifications" | "passwordReset" | "userInvite" | "verifyEmail")[];
37
+ readonly getDefaultTemplate: (key: "verifyEmail" | "notifications" | "passwordReset" | "userInvite") => "<!doctype html>\n<html>\n <body>\n <div\n style='background-color:#F2F5F7;color:#242424;font-family:\"Helvetica Neue\", \"Arial Nova\", \"Nimbus Sans\", Arial, sans-serif;font-size:16px;font-weight:400;letter-spacing:0.15008px;line-height:1.5;margin:0;padding:32px 0;min-height:100%;width:100%'\n >\n <table\n align=\"center\"\n width=\"100%\"\n style=\"margin:0 auto;max-width:600px;background-color:#FFFFFF\"\n role=\"presentation\"\n cellspacing=\"0\"\n cellpadding=\"0\"\n border=\"0\"\n >\n <tbody>\n <tr style=\"width:100%\">\n <td>\n <h3\n style=\"font-weight:bold;text-align:left;margin:0;font-size:20px;padding:32px 24px 0px 24px\"\n >\n {{data.title}}\n </h3>\n <div\n style=\"color:#474849;font-size:14px;font-weight:normal;text-align:left;padding:8px 24px 16px 24px\"\n >\n {{data.message}}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </body>\n</html>" | "<!doctype html>\n<html>\n <body>\n <div\n style='background-color:#F2F5F7;color:#242424;font-family:\"Helvetica Neue\", \"Arial Nova\", \"Nimbus Sans\", Arial, sans-serif;font-size:16px;font-weight:400;letter-spacing:0.15008px;line-height:1.5;margin:0;padding:32px 0;min-height:100%;width:100%'\n >\n <table\n align=\"center\"\n width=\"100%\"\n style=\"margin:0 auto;max-width:600px;background-color:#FFFFFF\"\n role=\"presentation\"\n cellspacing=\"0\"\n cellpadding=\"0\"\n border=\"0\"\n >\n <tbody>\n <tr style=\"width:100%\">\n <td>\n <h3\n style=\"font-weight:bold;text-align:left;margin:0;font-size:20px;padding:32px 24px 0px 24px\"\n >\n Reset Your Password\n </h3>\n <div\n style=\"color:#474849;font-size:14px;font-weight:normal;text-align:left;padding:8px 24px 16px 24px\"\n >\n Click the button below, or copy-paste the link to reset your password!\n <br />\n <br />\n If you didn't request a password reset, you can ignore this email and\n your password will not be changed.\n </div>\n <div style=\"text-align:left;padding:12px 24px 32px 24px\">\n <a\n href=\"{{data.link}}\"\n style=\"color:#FFFFFF;font-size:14px;font-weight:bold;background-color:#0068FF;display:inline-block;padding:12px 20px;text-decoration:none\"\n target=\"_blank\"\n ><span>Reset Password</span></a\n >\n </div>\n <div\n style=\"font-size:12px;font-weight:normal;padding:16px 24px 16px 24px\"\n >\n Link: {{data.link}}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </body>\n</html>" | "<!doctype html>\n<html>\n <body>\n <div\n style='background-color:#F2F5F7;color:#242424;font-family:\"Helvetica Neue\", \"Arial Nova\", \"Nimbus Sans\", Arial, sans-serif;font-size:16px;font-weight:400;letter-spacing:0.15008px;line-height:1.5;margin:0;padding:32px 0;min-height:100%;width:100%'\n >\n <table\n align=\"center\"\n width=\"100%\"\n style=\"margin:0 auto;max-width:600px;background-color:#FFFFFF\"\n role=\"presentation\"\n cellspacing=\"0\"\n cellpadding=\"0\"\n border=\"0\"\n >\n <tbody>\n <tr style=\"width:100%\">\n <td>\n <h3\n style=\"font-weight:bold;text-align:left;margin:0;font-size:20px;padding:32px 24px 0px 24px\"\n >\n New User Invite from {{site.title}}\n </h3>\n <div\n style=\"color:#474849;font-size:14px;font-weight:normal;text-align:left;padding:8px 24px 16px 24px\"\n >\n You have been invited to join {{site.title}}! Click the button below to set your password and get started.\n </div>\n <div style=\"text-align:left;padding:12px 24px 32px 24px\">\n <a\n href=\"{{data.link}}\"\n style=\"color:#FFFFFF;font-size:14px;font-weight:bold;background-color:#0068FF;display:inline-block;padding:12px 20px;text-decoration:none\"\n target=\"_blank\"\n ><span>Set Password</span\n ></a\n >\n </div>\n <div\n style=\"font-size:12px;font-weight:normal;padding:16px 24px 16px 24px\"\n >\n Link: {{data.link}}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </body>\n</html>" | "<!doctype html>\n<html>\n <body>\n <div\n style='background-color:#F2F5F7;color:#242424;font-family:\"Helvetica Neue\", \"Arial Nova\", \"Nimbus Sans\", Arial, sans-serif;font-size:16px;font-weight:400;letter-spacing:0.15008px;line-height:1.5;margin:0;padding:32px 0;min-height:100%;width:100%'\n >\n <table\n align=\"center\"\n width=\"100%\"\n style=\"margin:0 auto;max-width:600px;background-color:#FFFFFF\"\n role=\"presentation\"\n cellspacing=\"0\"\n cellpadding=\"0\"\n border=\"0\"\n >\n <tbody>\n <tr style=\"width:100%\">\n <td>\n <h3\n style=\"font-weight:bold;text-align:left;margin:0;font-size:20px;padding:32px 24px 0px 24px\"\n >\n Verify your Email\n </h3>\n <div\n style=\"color:#474849;font-size:14px;font-weight:normal;text-align:left;padding:8px 24px 16px 24px\"\n >\n Click the button below, or copy-paste the link to verify your\n email!\n </div>\n <div style=\"text-align:left;padding:12px 24px 32px 24px\">\n <a\n href=\"{{data.link}}\"\n style=\"color:#FFFFFF;font-size:14px;font-weight:bold;background-color:#0068FF;display:inline-block;padding:12px 20px;text-decoration:none\"\n target=\"_blank\"\n ><span>Verify Email</span></a\n >\n </div>\n <div\n style=\"font-size:12px;font-weight:normal;padding:16px 24px 16px 24px\"\n >\n Link: {{data.link}}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </body>\n</html>";
38
+ readonly availableTemplates: ("verifyEmail" | "notifications" | "passwordReset" | "userInvite")[];
39
39
  readonly allTemplates: {
40
40
  notifications?: string;
41
41
  passwordReset?: string;
@@ -66,6 +66,6 @@ export declare const templateEngine: Effect.Effect<{
66
66
  * @param context - The context data to use for rendering the template.
67
67
  * @returns The rendered email content.
68
68
  */
69
- readonly render: (key: "notifications" | "passwordReset" | "userInvite" | "verifyEmail", context: EngineContext) => Effect.Effect<string, TemplateEngineError, never>;
69
+ readonly render: (key: "verifyEmail" | "notifications" | "passwordReset" | "userInvite", context: EngineContext) => Effect.Effect<string, TemplateEngineError, never>;
70
70
  }, import("../sdk/index.js").DBClientInitializationError | import("../sdk/index.js").SDKInitializationError | import("@withstudiocms/kysely/client").DBCallbackFailure | import("@withstudiocms/kysely/core/errors").DatabaseError | TemplateEngineError, never>;
71
71
  export default templateEngine;