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.
- package/CHANGELOG.md +122 -0
- package/dist/cli/add/index.d.ts +2 -2
- package/dist/cli/add/index.js +4 -3
- package/dist/cli/add/npm-utils.d.ts +6 -6
- package/dist/cli/add/tryToInstallPlugins.d.ts +1 -1
- package/dist/cli/add/tryToInstallPlugins.js +6 -5
- package/dist/cli/add/updateStudioCMSConfig.d.ts +1 -1
- package/dist/cli/add/updateStudioCMSConfig.js +3 -4
- package/dist/cli/add/validatePlugins.d.ts +1 -2
- package/dist/cli/add/validatePlugins.js +15 -9
- package/dist/cli/crypto/genJWT/index.d.ts +1 -1
- package/dist/cli/crypto/genJWT/index.js +8 -9
- package/dist/cli/crypto/index.d.ts +1 -1
- package/dist/cli/init/steps/env.js +14 -4
- package/dist/cli/init/steps/next.d.ts +1 -1
- package/dist/cli/init/steps/next.js +6 -5
- package/dist/cli/migrator/index.d.ts +1 -1
- package/dist/cli/migrator/index.js +2 -2
- package/dist/cli/users/index.d.ts +1 -1
- package/dist/cli/users/shared.js +2 -2
- package/dist/cli/users/steps/createUsers.js +7 -7
- package/dist/cli/users/steps/modifyUsers.js +2 -2
- package/dist/cli/users/steps/next.d.ts +1 -1
- package/dist/cli/utils/checkRequiredEnvVars.js +2 -2
- package/dist/cli/utils/context.d.ts +2 -4
- package/dist/cli/utils/context.js +1 -3
- package/dist/cli/utils/getCliDbClient.d.ts +1 -1
- package/dist/cli/utils/intro.d.ts +1 -1
- package/dist/cli/utils/loadConfig.d.ts +54 -49
- package/dist/cli/utils/loadConfig.js +5 -8
- package/dist/cli/utils/logger.js +3 -3
- package/dist/cli/utils/user-utils.d.ts +1 -1
- package/dist/cli/utils/user-utils.js +4 -3
- package/dist/client/apiClient.d.ts +4923 -0
- package/dist/client/apiClient.js +72 -0
- package/dist/config.d.ts +1734 -1
- package/dist/consts.d.ts +5 -5
- package/dist/consts.js +3 -2
- package/dist/db/plugins.d.ts +1 -1
- package/dist/db/plugins.js +5 -8
- package/dist/handlers/frontend/routes.d.ts +4 -18
- package/dist/handlers/frontend/routes.js +13 -152
- package/dist/handlers/frontend/types.d.ts +1 -1
- package/dist/handlers/frontend/utils.js +0 -18
- package/dist/handlers/pluginHandler.d.ts +34 -257
- package/dist/handlers/pluginHandler.js +92 -46
- package/dist/handlers/routeHandler.js +32 -11
- package/dist/handlers/setupDbStudio.d.ts +3 -1
- package/dist/handlers/setupDbStudio.js +19 -10
- package/dist/handlers/storage-manager/core/effectify-astro-context.d.ts +25 -0
- package/dist/handlers/storage-manager/core/effectify-astro-context.js +78 -0
- package/dist/handlers/storage-manager/no-op.d.ts +2 -2
- package/dist/handlers/storage-manager/no-op.js +2 -3
- package/dist/index.d.ts +0 -1
- package/dist/index.js +10 -20
- package/dist/integrations/robots/index.d.ts +2 -2
- package/dist/integrations/robots/index.js +1 -3
- package/dist/integrations/robots/schema.d.ts +102 -273
- package/dist/integrations/robots/schema.js +220 -209
- package/dist/plugins/analytics/assets/schemas.d.ts +14 -9
- package/dist/plugins/analytics/assets/schemas.js +25 -17
- package/dist/plugins/analytics/db-client.d.ts +1 -1
- package/dist/plugins/analytics/index.d.ts +823 -3
- package/dist/plugins/analytics/index.js +4 -5
- package/dist/plugins/analytics/schemas.d.ts +54 -62
- package/dist/plugins/analytics/schemas.js +64 -13
- package/dist/plugins/analytics/table.d.ts +1 -1
- package/dist/plugins.d.ts +0 -1
- package/dist/schemas/config/api.d.ts +17 -0
- package/dist/schemas/config/api.js +14 -0
- package/dist/schemas/config/auth.d.ts +55 -59
- package/dist/schemas/config/auth.js +34 -11
- package/dist/schemas/config/dashboard.d.ts +43 -79
- package/dist/schemas/config/dashboard.js +43 -12
- package/dist/schemas/config/db.d.ts +15 -17
- package/dist/schemas/config/db.js +13 -5
- package/dist/schemas/config/developer.d.ts +33 -45
- package/dist/schemas/config/developer.js +22 -5
- package/dist/schemas/config/index.d.ts +398 -521
- package/dist/schemas/config/index.js +115 -57
- package/dist/schemas/config/sdk.d.ts +50 -196
- package/dist/schemas/config/sdk.js +61 -73
- package/dist/schemas/custom.d.ts +40 -0
- package/dist/schemas/custom.js +41 -0
- package/dist/schemas/external-schemas.d.ts +171 -0
- package/dist/schemas/external-schemas.js +179 -0
- package/dist/schemas/index.d.ts +2 -0
- package/dist/schemas/index.js +2 -0
- package/dist/schemas/plugins/i18n.d.ts +59 -39
- package/dist/schemas/plugins/i18n.js +42 -5
- package/dist/schemas/plugins/index.d.ts +7126 -10296
- package/dist/schemas/plugins/index.js +260 -276
- package/dist/schemas/plugins/shared.d.ts +1293 -3718
- package/dist/schemas/plugins/shared.js +320 -329
- package/dist/test-utils.d.ts +15 -4
- package/dist/test-utils.js +27 -11
- package/dist/toolbar/db-viewer/db-shared-types.d.ts +6 -6
- package/dist/toolbar/db-viewer/studio/connection.d.ts +8 -4
- package/dist/toolbar/db-viewer/studio/connection.js +2 -28
- package/dist/toolbar/db-viewer/studio/env/libsql.d.ts +7 -0
- package/dist/toolbar/db-viewer/studio/env/libsql.js +17 -0
- package/dist/toolbar/db-viewer/studio/env/mysql.d.ts +7 -0
- package/dist/toolbar/db-viewer/studio/env/mysql.js +23 -0
- package/dist/toolbar/db-viewer/studio/env/postgres.d.ts +7 -0
- package/dist/toolbar/db-viewer/studio/env/postgres.js +23 -0
- package/dist/toolbar/db-viewer/studio/index.js +20 -56
- package/dist/toolbar/db-viewer/studio/type.d.ts +1 -2
- package/dist/toolbar/db-viewer/studio/virtual-connection/libsql.d.ts +3 -0
- package/dist/toolbar/db-viewer/studio/virtual-connection/libsql.js +24 -0
- package/dist/toolbar/db-viewer/studio/virtual-connection/mysql.d.ts +3 -0
- package/dist/toolbar/db-viewer/studio/virtual-connection/mysql.js +9 -0
- package/dist/toolbar/db-viewer/studio/virtual-connection/postgres.d.ts +3 -0
- package/dist/toolbar/db-viewer/studio/virtual-connection/postgres.js +9 -0
- package/dist/toolbar/db-viewer/viewer.js +20 -21
- package/dist/types.d.ts +30 -0
- package/dist/utils/effects/smtp.d.ts +1 -1
- package/dist/utils/lang-helper.d.ts +10 -2
- package/dist/virtual.d.ts +35 -28
- package/dist/virtuals/auth/core.d.ts +5 -5
- package/dist/virtuals/auth/verify-email.d.ts +6 -6
- package/dist/virtuals/components/Generator.astro +2 -2
- package/dist/virtuals/components/Renderer.astro +9 -1
- package/dist/virtuals/components/renderFn.d.ts +3 -1
- package/dist/virtuals/components/renderFn.js +18 -0
- package/dist/virtuals/lib/headDefaults.d.ts +4 -2
- package/dist/virtuals/lib/headDefaults.js +0 -2
- package/dist/virtuals/lib/routeMap.d.ts +0 -12
- package/dist/virtuals/lib/routeMap.js +2 -14
- package/dist/virtuals/mailer/index.d.ts +3 -3
- package/dist/virtuals/notifier/index.d.ts +5 -5
- package/dist/virtuals/plugins/dashboard-pages.d.ts +2 -64
- package/dist/virtuals/scripts/StorageFileBrowser.d.ts +1 -172
- package/dist/virtuals/scripts/StorageFileBrowser.js +216 -119
- package/dist/virtuals/template-engine/index.d.ts +4 -4
- package/frontend/components/dashboard/configuration/ConfigForm.astro +218 -110
- package/frontend/components/dashboard/content-mgmt/ContentSearch.astro +21 -22
- package/frontend/components/dashboard/content-mgmt/CreateFolder.astro +66 -54
- package/frontend/components/dashboard/content-mgmt/CreatePage.astro +58 -104
- package/frontend/components/dashboard/content-mgmt/EditFolder.astro +65 -67
- package/frontend/components/dashboard/content-mgmt/EditPage.astro +86 -134
- package/frontend/components/dashboard/content-mgmt/InnerSidebarElement.astro +0 -1
- package/frontend/components/dashboard/content-mgmt/PageHeader.astro +33 -52
- package/frontend/components/dashboard/content-mgmt/PageTypeHandler.astro +2 -2
- package/frontend/components/dashboard/profile/APITokens.astro +219 -158
- package/frontend/components/dashboard/profile/BasicInfo.astro +165 -106
- package/frontend/components/dashboard/profile/Notifications.astro +27 -18
- package/frontend/components/dashboard/profile/UpdatePassword.astro +134 -94
- package/frontend/components/dashboard/sidebar/VersionCheck.astro +31 -16
- package/frontend/components/dashboard/sidebar/VersionCheckChangelog.astro +18 -11
- package/frontend/components/dashboard/sidebar-modals/VersionModal.astro +2 -2
- package/frontend/components/dashboard/smtp-config/TemplateEditor.astro +14 -14
- package/frontend/components/dashboard/taxonomy/InnerSidebarElement.astro +0 -1
- package/frontend/components/dashboard/taxonomy/MetaContainer.astro +0 -2
- package/frontend/components/dashboard/taxonomy/PageHeader.astro +16 -24
- package/frontend/components/dashboard/taxonomy/TaxonomySearch.astro +23 -27
- package/frontend/components/dashboard/user-mgmt/InnerSidebarElement.astro +111 -104
- package/frontend/components/dashboard/user-mgmt/UserListItem.astro +9 -22
- package/frontend/components/dashboard/user-mgmt/UserListItems.astro +18 -0
- package/frontend/components/first-time-setup/snippets/{opt2-studiocms.config.diff → studiocms.config.diff} +1 -0
- package/frontend/components/shared/Code.astro +1 -4
- package/frontend/components/shared/DynamicSettingsRenderer.astro +1 -1
- package/frontend/components/shared/SSRUser.astro +2 -4
- package/frontend/components/shared/foldertree/FolderTreeNode.astro +0 -6
- package/frontend/components/shared/storage-manager/StorageCopyOutput.astro +0 -1
- package/frontend/components/shared/taxonomy/TaxonomyTreeNode.astro +0 -6
- package/frontend/layouts/DashboardLayout.astro +1 -10
- package/frontend/layouts/TaxonomyLayout.astro +0 -1
- package/frontend/middleware/index.ts +102 -61
- package/frontend/pages/404.astro +5 -9
- package/frontend/pages/[dashboard]/[...pluginPage].astro +10 -1
- package/frontend/pages/[dashboard]/configuration.astro +10 -1
- package/frontend/pages/[dashboard]/content-management/createfolder.astro +10 -1
- package/frontend/pages/[dashboard]/content-management/createpage.astro +10 -1
- package/frontend/pages/[dashboard]/content-management/diff.astro +39 -14
- package/frontend/pages/[dashboard]/content-management/editfolder.astro +10 -1
- package/frontend/pages/[dashboard]/content-management/editpage.astro +10 -1
- package/frontend/pages/[dashboard]/content-management/index.astro +10 -1
- package/frontend/pages/[dashboard]/index.astro +10 -1
- package/frontend/pages/[dashboard]/login.astro +86 -25
- package/frontend/pages/[dashboard]/password-reset.astro +22 -16
- package/frontend/pages/[dashboard]/plugins/[plugin].astro +10 -1
- package/frontend/pages/[dashboard]/profile.astro +10 -1
- package/frontend/pages/[dashboard]/signup.astro +153 -52
- package/frontend/pages/[dashboard]/smtp-configuration.astro +77 -75
- package/frontend/pages/[dashboard]/system-management.astro +10 -1
- package/frontend/pages/[dashboard]/taxonomy/categories.astro +30 -41
- package/frontend/pages/[dashboard]/taxonomy/index.astro +10 -0
- package/frontend/pages/[dashboard]/taxonomy/tags.astro +33 -43
- package/frontend/pages/[dashboard]/unverified-email.astro +29 -21
- package/frontend/pages/[dashboard]/user-management/edit.astro +170 -90
- package/frontend/pages/[dashboard]/user-management/index.astro +10 -1
- package/frontend/pages/studiocms_api/[...all].ts +106 -0
- package/frontend/pages/studiocms_api/_handlers/_utils/auth.ts +26 -0
- package/frontend/pages/studiocms_api/_handlers/_utils/changelog.ts +147 -0
- package/frontend/pages/studiocms_api/_handlers/_utils/db-studio-driver.ts +46 -0
- package/frontend/pages/studiocms_api/_handlers/_utils/parseLogLevel.ts +27 -0
- package/frontend/pages/studiocms_api/_handlers/auth/auth.ts +459 -0
- package/frontend/pages/studiocms_api/_handlers/auth/index.ts +17 -0
- package/frontend/pages/studiocms_api/_handlers/auth/oauth.ts +91 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/_shared.ts +57 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/apiTokens.ts +134 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/config.ts +64 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/content.ts +741 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/create.ts +480 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/emailNotifications.ts +49 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/index.ts +45 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/mailer.ts +136 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/plugins.ts +80 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/profile.ts +275 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/resetPassword.ts +140 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/search.ts +63 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/taxonomy.ts +285 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/templates.ts +75 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/users.ts +312 -0
- package/frontend/pages/studiocms_api/_handlers/dashboard/verifyEndpoints.ts +307 -0
- package/frontend/pages/studiocms_api/_handlers/integration/dbStudio.ts +98 -0
- package/frontend/pages/studiocms_api/_handlers/integration/index.ts +17 -0
- package/frontend/pages/studiocms_api/_handlers/integration/storageManager.ts +107 -0
- package/frontend/pages/studiocms_api/_handlers/rest-api/index.ts +8 -0
- package/frontend/pages/studiocms_api/_handlers/rest-api/v1/_shared.ts +41 -0
- package/frontend/pages/studiocms_api/_handlers/rest-api/v1/index.ts +17 -0
- package/frontend/pages/studiocms_api/_handlers/rest-api/v1/public.ts +195 -0
- package/frontend/pages/studiocms_api/_handlers/rest-api/v1/secure.ts +1726 -0
- package/frontend/pages/studiocms_api/_handlers/sdk.ts +129 -0
- package/frontend/pages/studiocms_api/_middleware/astroLocals.ts +36 -0
- package/frontend/pages/studiocms_api/_middleware/restApi.ts +56 -0
- package/frontend/pages/studiocms_api/integrations/[...all].ts +8 -0
- package/frontend/scripts/formdata.ts +219 -0
- package/frontend/setup-pages/3-done.astro +4 -20
- package/frontend/setup-pages/studiocms_api/dashboard/step-2.ts +3 -6
- package/frontend/styles/dashboard-base.css +0 -1
- package/frontend/web-vitals/endpoint.ts +2 -1
- package/package.json +35 -31
- package/dist/global.d.ts +0 -9
- package/frontend/components/dashboard/LoginChecker.astro +0 -68
- package/frontend/components/dashboard/user-mgmt/RankCheck.astro +0 -57
- package/frontend/components/first-time-setup/snippets/opt1-astro.config.diff +0 -14
- package/frontend/components/first-time-setup/snippets/opt2-astro.config.diff +0 -9
- package/frontend/middleware/_authmap.ts +0 -63
- package/frontend/pages/studiocms_api/auth/[path].ts +0 -390
- package/frontend/pages/studiocms_api/auth/[provider]/[...id].ts +0 -64
- package/frontend/pages/studiocms_api/auth/[provider]/_effects/index.ts +0 -101
- package/frontend/pages/studiocms_api/auth/_shared.ts +0 -52
- package/frontend/pages/studiocms_api/dashboard/api-tokens.ts +0 -115
- package/frontend/pages/studiocms_api/dashboard/config.ts +0 -74
- package/frontend/pages/studiocms_api/dashboard/content/diff.ts +0 -73
- package/frontend/pages/studiocms_api/dashboard/content/folder.ts +0 -220
- package/frontend/pages/studiocms_api/dashboard/content/page.ts +0 -359
- package/frontend/pages/studiocms_api/dashboard/create-reset-link.ts +0 -77
- package/frontend/pages/studiocms_api/dashboard/create-user-invite.ts +0 -231
- package/frontend/pages/studiocms_api/dashboard/create-user.ts +0 -186
- package/frontend/pages/studiocms_api/dashboard/email-notification-settings-site.ts +0 -74
- package/frontend/pages/studiocms_api/dashboard/mailer/check-email.ts +0 -75
- package/frontend/pages/studiocms_api/dashboard/mailer/config.ts +0 -136
- package/frontend/pages/studiocms_api/dashboard/plugins/[plugin].ts +0 -80
- package/frontend/pages/studiocms_api/dashboard/profile.ts +0 -245
- package/frontend/pages/studiocms_api/dashboard/resend-verify-email.ts +0 -77
- package/frontend/pages/studiocms_api/dashboard/reset-password.ts +0 -124
- package/frontend/pages/studiocms_api/dashboard/search-list.ts +0 -59
- package/frontend/pages/studiocms_api/dashboard/taxonomy-search.ts +0 -47
- package/frontend/pages/studiocms_api/dashboard/taxonomy.ts +0 -230
- package/frontend/pages/studiocms_api/dashboard/templates.ts +0 -74
- package/frontend/pages/studiocms_api/dashboard/update-user-notifications.ts +0 -86
- package/frontend/pages/studiocms_api/dashboard/users.ts +0 -236
- package/frontend/pages/studiocms_api/dashboard/verify-email.ts +0 -83
- package/frontend/pages/studiocms_api/dashboard/verify-session.ts +0 -187
- package/frontend/pages/studiocms_api/integrations/[type]/[...id].ts +0 -15
- package/frontend/pages/studiocms_api/integrations/[type]/_routes/db-studio.ts +0 -173
- package/frontend/pages/studiocms_api/integrations/[type]/_routes/storage.ts +0 -88
- package/frontend/pages/studiocms_api/partials/editor.astro +0 -74
- package/frontend/pages/studiocms_api/partials/render.astro +0 -39
- package/frontend/pages/studiocms_api/partials/user-list-items.astro +0 -43
- package/frontend/pages/studiocms_api/rest/utils/auth-token.ts +0 -59
- package/frontend/pages/studiocms_api/rest/v1/[type]/[...id].ts +0 -23
- package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/categories.ts +0 -267
- package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/folders.ts +0 -283
- package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/pages.ts +0 -505
- package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/settings.ts +0 -100
- package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/tags.ts +0 -229
- package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/users.ts +0 -553
- package/frontend/pages/studiocms_api/rest/v1/public/[type]/[...id].ts +0 -19
- package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/categories.ts +0 -74
- package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/folders.ts +0 -85
- package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/pages.ts +0 -103
- package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/tags.ts +0 -67
- package/frontend/pages/studiocms_api/sdk/[...path].ts +0 -97
- package/frontend/pages/studiocms_api/sdk/utils/changelog.ts +0 -119
- package/frontend/scripts/auth/formListener.ts +0 -81
- package/frontend/scripts/formdata-utils.ts +0 -116
- package/frontend/utils/build-partial-schema.ts +0 -46
- package/frontend/utils/errors.ts +0 -6
- package/frontend/utils/param-extractor.ts +0 -83
- 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
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
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
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
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(
|
|
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
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
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
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
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
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
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
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
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
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
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
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
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
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
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
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
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
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
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
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
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
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
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: "
|
|
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: "
|
|
38
|
-
readonly availableTemplates: ("
|
|
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: "
|
|
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;
|