Skip to content

Commit cc24775

Browse files
committed
contrib(raak): 738 files
- .github/copilot-instructions.md - .github/workflows/ci.yml - .github/workflows/deploy.yml - .gitignore - backend/.env.example - backend/Dockerfile - backend/drizzle.config.ts - backend/emails/README.md - backend/emails/components/email-avatar.tsx - backend/emails/components/email-body.tsx - backend/emails/components/email-text.tsx - backend/emails/components/index.ts - backend/emails/templates/account-security.tsx - backend/emails/templates/create-password.tsx - backend/emails/templates/email-verification.tsx - backend/emails/templates/member-added.tsx - backend/emails/templates/member-invite-with-token.tsx - backend/emails/templates/member-invite.tsx - backend/emails/templates/newsletter.tsx - backend/emails/templates/oauth-verification.tsx - backend/emails/templates/request-was-sent-admin.tsx - backend/emails/templates/request-was-sent.tsx - backend/emails/templates/system-invite.tsx - backend/mocks/mock-activity.ts - backend/mocks/mock-attachment.ts - backend/mocks/mock-auth.ts - backend/mocks/mock-entity-base.ts - backend/mocks/mock-error.ts - backend/mocks/mock-me.ts - backend/mocks/mock-membership.ts - backend/mocks/mock-metrics.ts - backend/mocks/mock-organization.ts - backend/mocks/mock-page.ts - backend/mocks/mock-request.ts - backend/mocks/mock-system.ts - backend/mocks/mock-user.ts - backend/mocks/tests/utils.test.ts - backend/mocks/utils/index.ts - backend/mocks/utils/mock-nanoid.ts - backend/mocks/utils/mock-past-iso-date.ts - backend/mocks/utils/mock-stx.ts - backend/mocks/utils/mock-timestamps.ts - backend/scripts/README.md - backend/scripts/db-maintenance.ts - backend/scripts/db/create-db-roles.ts - backend/scripts/generate-openapi.ts - backend/scripts/migrations/00-drizzle.migration.ts - backend/scripts/migrations/10-cdc.migration.ts - backend/scripts/migrations/10-immutability.migration.ts - backend/scripts/migrations/10-partman.migration.ts - backend/scripts/migrations/10-rls.migration.ts - backend/scripts/migrations/helpers/drizzle-utils.ts - backend/scripts/seeds.ts - backend/scripts/seeds/00-init.seed.ts - backend/scripts/seeds/10-organization.seed.ts - backend/scripts/seeds/20-attachment.seed.ts - backend/scripts/seeds/20-page.seed.ts - backend/scripts/seeds/50-counters.seed.ts - backend/src/db/db.ts - backend/src/db/immutability-triggers.ts - backend/src/db/rls-helpers.ts - backend/src/db/schema/context-counters.ts - backend/src/db/schema/emails.ts - backend/src/db/schema/oauth-accounts.ts - backend/src/db/schema/organizations.ts - backend/src/db/schema/pages.ts - backend/src/db/schema/passkeys.ts - backend/src/db/schema/passwords.ts - backend/src/db/schema/seen-by.ts - backend/src/db/schema/system-roles.ts - backend/src/db/schema/tenants.ts - backend/src/db/schema/totps.ts - backend/src/db/schema/users.ts - backend/src/db/tenant-context.ts - backend/src/db/utils/context-entity-columns.ts - backend/src/db/utils/product-entity-columns.ts - backend/src/db/utils/tenant-entity-columns.ts - backend/src/db/utils/timestamp-columns.ts - backend/src/docs/utils/index.ts - backend/src/docs/x-routes.ts - backend/src/env.ts - backend/src/lib/context.ts - backend/src/lib/error.ts - backend/src/lib/health.ts - backend/src/lib/i18n.ts - backend/src/lib/mailer.ts - backend/src/lib/notifications/send-matrix-message.ts - backend/src/lib/transloadit.ts - backend/src/main.ts - backend/src/middlewares/app.ts - backend/src/middlewares/entity-cache/app-entity-cache.ts - backend/src/middlewares/entity-cache/index.ts - backend/src/middlewares/entity-cache/presets.ts - backend/src/middlewares/entity-cache/public-entity-cache.ts - backend/src/middlewares/guard/auth-guard.ts - backend/src/middlewares/guard/cross-tenant-guard.ts - backend/src/middlewares/guard/org-guard.ts - backend/src/middlewares/guard/sys-admin-guard.ts - backend/src/middlewares/guard/tenant-guard.ts - backend/src/middlewares/logger.ts - backend/src/middlewares/rate-limiter/core.ts - backend/src/middlewares/rate-limiter/helpers.ts - backend/src/middlewares/rate-limiter/limiters.ts - backend/src/middlewares/update-last-seen.ts - backend/src/modules/activities/activities-handlers.ts - backend/src/modules/activities/activities-schema.ts - backend/src/modules/attachment/attachment-handlers.ts - backend/src/modules/attachment/attachment-routes.ts - backend/src/modules/attachment/attachment-schema.ts - backend/src/modules/auth/general/general-handlers.ts - backend/src/modules/auth/general/helpers/send-verification-email.ts - backend/src/modules/auth/general/helpers/session.ts - backend/src/modules/auth/general/helpers/user.ts - backend/src/modules/auth/oauth/helpers/callback.ts - backend/src/modules/auth/oauth/helpers/initiation.ts - backend/src/modules/auth/oauth/helpers/send-oauth-verification-email.ts - backend/src/modules/auth/oauth/oauth-handlers.ts - backend/src/modules/auth/passkeys/passkeys-handlers.ts - backend/src/modules/auth/passwords/passwords-handlers.ts - backend/src/modules/auth/totps/totps-handlers.ts - backend/src/modules/domains/domains-handlers.ts - backend/src/modules/domains/domains-schema.ts - backend/src/modules/entities/app-stream/can-receive.ts - backend/src/modules/entities/app-stream/dispatch.ts - backend/src/modules/entities/app-stream/fetch-data.ts - backend/src/modules/entities/app-stream/types.ts - backend/src/modules/entities/entities-handlers.ts - backend/src/modules/entities/entities-routes.ts - backend/src/modules/entities/entities-schema.ts - backend/src/modules/entities/helpers/build-zero-counts.ts - backend/src/modules/entities/helpers/check-slug.ts - backend/src/modules/entities/helpers/get-entity-counts.ts - backend/src/modules/entities/helpers/recalculate-context-counters.ts - backend/src/modules/entities/public-stream/dispatch.ts - backend/src/modules/entities/public-stream/fetch-data.ts - backend/src/modules/me/me-handlers.ts - backend/src/modules/memberships/helpers/membership-helpers.ts - backend/src/modules/memberships/memberships-handlers.ts - backend/src/modules/memberships/memberships-schema.ts - backend/src/modules/metrics/metrics-handlers.ts - backend/src/modules/metrics/metrics-routes.ts - backend/src/modules/metrics/metrics-schema.ts - backend/src/modules/organization/organization-handlers.ts - backend/src/modules/organization/organization-schema.ts - backend/src/modules/page/page-handlers.ts - backend/src/modules/page/page-routes.ts - backend/src/modules/page/page-schema.ts - backend/src/modules/requests/requests-handlers.ts - backend/src/modules/requests/requests-schema.ts - backend/src/modules/seen/seen-handlers.ts - backend/src/modules/system/helpers/get-signed-src.ts - backend/src/modules/system/system-handlers.ts - backend/src/modules/system/system-routes.ts - backend/src/modules/system/system-schema.ts - backend/src/modules/tenants/tenant-service.ts - backend/src/modules/tenants/tenants-handlers.ts - backend/src/modules/tenants/tenants-schema.ts - backend/src/modules/user/helpers/audit-user.ts - backend/src/modules/user/helpers/select.ts - backend/src/modules/user/user-handlers.ts - backend/src/modules/user/user-schema.ts - backend/src/permissions/README.md - backend/src/permissions/get-context-entity.ts - backend/src/permissions/get-product-entity.ts - backend/src/permissions/index.ts - backend/src/permissions/permission-manager/check.perf.test.ts - backend/src/permissions/permission-manager/check.ts - backend/src/permissions/permission-manager/index.test.ts - backend/src/permissions/permission-manager/validation.ts - backend/src/permissions/split-by-permission.ts - backend/src/pino.ts - backend/src/schemas/common-schemas.ts - backend/src/schemas/context-entity-included.ts - backend/src/schemas/count-schemas.ts - backend/src/schemas/entity-base.ts - backend/src/schemas/index.ts - backend/src/schemas/stream-schemas.ts - backend/src/schemas/success-response-schemas.ts - backend/src/schemas/sync-transaction-schemas.ts - backend/src/schemas/user-minimal-base.ts - backend/src/server.ts - backend/src/sync/activity-actions.ts - backend/src/sync/activity-bus.ts - backend/src/sync/build-stx.ts - backend/src/sync/cache-invalidation.ts - backend/src/sync/cdc-websocket.ts - backend/src/sync/create-server-stx.ts - backend/src/sync/field-versions.ts - backend/src/sync/idempotency.ts - backend/src/sync/index.ts - backend/src/sync/stream/build-message.ts - backend/src/sync/stream/dispatcher.ts - backend/src/sync/stream/helpers.ts - backend/src/sync/stream/send-to-subscriber.ts - backend/src/sync/stream/subscriber-manager.ts - backend/src/sync/sync-metrics.ts - backend/src/sync/update-schema.ts - backend/src/tracing.ts - backend/src/utils/console.ts - backend/src/utils/logger.ts - backend/src/utils/rejection-utils.ts - backend/src/utils/unsubscribe-token.ts - backend/src/utils/validate-block-urls.test.ts - backend/tests/auth-strategies/enforcement.test.ts - backend/tests/fixtures.ts - backend/tests/global-setup.ts - backend/tests/helpers.ts - backend/tests/integration/rls-security.test.ts - backend/tests/integration/test-utils.ts - backend/tests/invitations/helpers.ts - backend/tests/invitations/invitation-respond.test.ts - backend/tests/invitations/membership-invite.test.ts - backend/tests/invitations/system-invite.test.ts - backend/tests/sign-in/oauth.test.ts - backend/tests/sign-in/passkey.test.ts - backend/tests/sign-in/password.test.ts - backend/tests/sign-in/totp.test.ts - backend/tests/sign-up/basic.test.ts - backend/tests/sign-up/password-disabled.test.ts - backend/tests/sign-up/registration-disabled.test.ts - backend/tests/test-utils.ts - backend/vitest.config.ts - biome.json - cdc/Dockerfile - cdc/README.md - cdc/package.json - cdc/src/cdc-worker.ts - cdc/src/constants.ts - cdc/src/env.ts - cdc/src/handlers/delete.ts - cdc/src/handlers/insert.ts - cdc/src/handlers/update.ts - cdc/src/tests/retry.test.ts - cdc/src/tests/utils.test.ts - cdc/src/types.ts - cdc/src/utils/action-to-verb.ts - cdc/src/utils/convert-row-keys.ts - cdc/src/utils/extract-row-data.ts - cdc/src/utils/extract-stx-data.ts - cdc/src/utils/index.ts - cdc/src/utils/update-counts.ts - cdc/tsconfig.json - cdc/tsup.config.ts - cli/cella/package.json - cli/cella/src/cella-cli.ts - cli/cella/src/cli.ts - cli/cella/src/config/types.ts - cli/cella/src/services/audit.ts - cli/cella/src/services/contribute.ts - cli/cella/src/services/contributions.ts - cli/cella/src/services/inspect.ts - frontend/.env.example - frontend/src/env.ts - frontend/src/hooks/use-auto-resize.tsx - frontend/src/hooks/use-body-class.ts - frontend/src/hooks/use-copy-to-clipboard.tsx - frontend/src/hooks/use-event-listener.tsx - frontend/src/hooks/use-has-scrolled.tsx - frontend/src/hooks/use-lazy-component.tsx - frontend/src/hooks/use-online-manager.tsx - frontend/src/hooks/use-relative-date.ts - frontend/src/hooks/use-scroll-spy-store.ts - frontend/src/hooks/use-scroll-spy.tsx - frontend/src/hooks/use-search-params.tsx - frontend/src/lib/api.ts - frontend/src/lib/export.ts - frontend/src/lib/tracing.ts - frontend/src/main.tsx - frontend/src/modules/attachment/delete-attachments.tsx - frontend/src/modules/attachment/dexie/attachments-db.ts - frontend/src/modules/attachment/dexie/storage-service.ts - frontend/src/modules/attachment/dialog/attachment-dialog.tsx - frontend/src/modules/attachment/dialog/handler.tsx - frontend/src/modules/attachment/dialog/helpers.tsx - frontend/src/modules/attachment/download-service.ts - frontend/src/modules/attachment/hooks/use-attachment-url.ts - frontend/src/modules/attachment/hooks/use-blob-sync-status.ts - frontend/src/modules/attachment/hooks/use-resolved-attachments.ts - frontend/src/modules/attachment/query.ts - frontend/src/modules/attachment/table/attachments-bar.tsx - frontend/src/modules/attachment/table/attachments-columns.tsx - frontend/src/modules/attachment/table/attachments-table.tsx - frontend/src/modules/attachment/table/cells.tsx - frontend/src/modules/attachment/table/helpers.tsx - frontend/src/modules/attachment/table/sync-status-cell.tsx - frontend/src/modules/attachment/upload-service.ts - frontend/src/modules/auth/auth-error-page.tsx - frontend/src/modules/auth/auth-layout.tsx - frontend/src/modules/auth/authenticate-page.tsx - frontend/src/modules/auth/create-password-page.tsx - frontend/src/modules/auth/mfa-page.tsx - frontend/src/modules/auth/oauth-providers.tsx - frontend/src/modules/auth/passkey-credentials.ts - frontend/src/modules/auth/passkey-strategy.tsx - frontend/src/modules/auth/request-password-form.tsx - frontend/src/modules/auth/sign-out.tsx - frontend/src/modules/auth/steps/check-email.tsx - frontend/src/modules/auth/steps/sign-in.tsx - frontend/src/modules/auth/steps/sign-up.tsx - frontend/src/modules/auth/steps/waitlist.tsx - frontend/src/modules/auth/totp-strategy.tsx - frontend/src/modules/auth/totp-verify-code-form.tsx - frontend/src/modules/auth/types.ts - frontend/src/modules/auth/unsubscribed-page.tsx - frontend/src/modules/auth/use-get-token-data.tsx - frontend/src/modules/common/animated-arrow.tsx - frontend/src/modules/common/app/app-content.tsx - frontend/src/modules/common/app/app-footer.tsx - frontend/src/modules/common/app/app-layout.tsx - frontend/src/modules/common/blocknote/block-note-editor.tsx - frontend/src/modules/common/blocknote/custom-elements/checklist/checklist-extension.ts - frontend/src/modules/common/blocknote/custom-elements/checklist/checklist-group-render.tsx - frontend/src/modules/common/blocknote/custom-elements/checklist/checklist-item-block.tsx - frontend/src/modules/common/blocknote/custom-elements/checklist/checklist-item-render.tsx - frontend/src/modules/common/blocknote/custom-elements/checklist/checklist-styles.css - frontend/src/modules/common/blocknote/custom-file-panel/uppy-upload-panel.tsx - frontend/src/modules/common/blocknote/full-html.tsx - frontend/src/modules/common/blocknote/helpers/blocknote-helpers.ts - frontend/src/modules/common/blocknote/helpers/dictionary.ts - frontend/src/modules/common/blocknote/helpers/open-attachment.tsx - frontend/src/modules/common/blocknote/minimal-html.tsx - frontend/src/modules/common/blocknote/type-to-keys.ts - frontend/src/modules/common/contact-form/contact-form-map.tsx - frontend/src/modules/common/contact-form/contact-form.tsx - frontend/src/modules/common/content-placeholder.tsx - frontend/src/modules/common/country-flag.tsx - frontend/src/modules/common/data-grid/cell.tsx - frontend/src/modules/common/data-grid/columns.tsx - frontend/src/modules/common/data-grid/data-grid.tsx - frontend/src/modules/common/data-grid/group-cell.tsx - frontend/src/modules/common/data-grid/group-row.tsx - frontend/src/modules/common/data-grid/grouped-column-header-cell.tsx - frontend/src/modules/common/data-grid/grouped-column-header-row.tsx - frontend/src/modules/common/data-grid/header-cell.tsx - frontend/src/modules/common/data-grid/header-row.tsx - frontend/src/modules/common/data-grid/hooks/use-calculated-columns.ts - frontend/src/modules/common/data-grid/hooks/use-column-widths.ts - frontend/src/modules/common/data-grid/index.ts - frontend/src/modules/common/data-grid/style/data-grid.css - frontend/src/modules/common/data-grid/tree-data-grid.tsx - frontend/src/modules/common/data-grid/types.ts - frontend/src/modules/common/data-grid/utils/style-utils.ts - frontend/src/modules/common/data-table/checkbox-column.tsx - frontend/src/modules/common/data-table/export.tsx - frontend/src/modules/common/data-table/infinite-loader.tsx - frontend/src/modules/common/data-table/select-column.tsx - frontend/src/modules/common/data-table/style.css - frontend/src/modules/common/data-table/table-bar-button.tsx - frontend/src/modules/common/data-table/table-bar-container.tsx - frontend/src/modules/common/data-table/table-search.tsx - frontend/src/modules/common/data-table/types.ts - frontend/src/modules/common/dialoger/provider.tsx - frontend/src/modules/common/drop-indicator.tsx - frontend/src/modules/common/dropdowner/provider.tsx - frontend/src/modules/common/error-notice.tsx - frontend/src/modules/common/focus-view.tsx - frontend/src/modules/common/form-fields/select-combobox/parent.tsx - frontend/src/modules/common/form-fields/select-combobox/tenant.tsx - frontend/src/modules/common/form-fields/select-role.tsx - frontend/src/modules/common/form-fields/select-sort.tsx - frontend/src/modules/common/form-fields/slug.tsx - frontend/src/modules/common/gleap-support.tsx - frontend/src/modules/common/hamburger.tsx - frontend/src/modules/common/page/aside.tsx - frontend/src/modules/common/page/header.tsx - frontend/src/modules/common/page/tab-nav.tsx - frontend/src/modules/common/public-layout.tsx - frontend/src/modules/common/pull-to-refresh.tsx - frontend/src/modules/common/root.tsx - frontend/src/modules/common/router-wrapper.tsx - frontend/src/modules/common/sheet-tabs.tsx - frontend/src/modules/common/sheeter/drawer.tsx - frontend/src/modules/common/sheeter/provider.tsx - frontend/src/modules/common/sheeter/sheet.tsx - frontend/src/modules/common/stepper/types.ts - frontend/src/modules/common/sticky-box.tsx - frontend/src/modules/common/stories/data-grid.stories.tsx - frontend/src/modules/common/themer.tsx - frontend/src/modules/common/toaster/toaster-provider.tsx - frontend/src/modules/common/uploader/helpers/prepare-for-offline.ts - frontend/src/modules/common/uploader/helpers/uppy-helpers.ts - frontend/src/modules/common/uploader/types.ts - frontend/src/modules/common/uploader/uploader.tsx - frontend/src/modules/common/uploader/use-uppy-upload.tsx - frontend/src/modules/docs/code-viewer.tsx - frontend/src/modules/docs/docs-layout.tsx - frontend/src/modules/docs/helpers/extract-types.ts - frontend/src/modules/docs/json-actions.tsx - frontend/src/modules/docs/json-viewer/collapsed-preview.tsx - frontend/src/modules/docs/json-viewer/json-node.tsx - frontend/src/modules/docs/json-viewer/key-renderer.tsx - frontend/src/modules/docs/operations/operation-detail.tsx - frontend/src/modules/docs/operations/operation-examples.tsx - frontend/src/modules/docs/operations/operation-request.tsx - frontend/src/modules/docs/operations/operation-responses.tsx - frontend/src/modules/docs/operations/operations-page.tsx - frontend/src/modules/docs/operations/operations-table/operations-columns.tsx - frontend/src/modules/docs/overview-table.tsx - frontend/src/modules/docs/query.ts - frontend/src/modules/docs/sidebar/collapsible-tag-item.tsx - frontend/src/modules/docs/sidebar/docs-sidebar.tsx - frontend/src/modules/docs/sidebar/operation-item.tsx - frontend/src/modules/docs/sidebar/operations-sidebar.tsx - frontend/src/modules/docs/sidebar/schema-item.tsx - frontend/src/modules/docs/tag-operations-table.tsx - frontend/src/modules/entities/entity-grid/tile.tsx - frontend/src/modules/entities/types.ts - frontend/src/modules/home/onboarding/completed.tsx - frontend/src/modules/home/onboarding/steps.tsx - frontend/src/modules/home/welcome-page.tsx - frontend/src/modules/marketing/about/cards.tsx - frontend/src/modules/marketing/about/counters.tsx - frontend/src/modules/marketing/about/features.tsx - frontend/src/modules/marketing/about/hero.tsx - frontend/src/modules/marketing/device-mockup.tsx - frontend/src/modules/marketing/layout.tsx - frontend/src/modules/marketing/legal/legal-aside.tsx - frontend/src/modules/marketing/legal/legal-config.ts - frontend/src/modules/marketing/legal/legal-page.tsx - frontend/src/modules/marketing/legal/legal-types.ts - frontend/src/modules/marketing/legal/subprocessors.tsx - frontend/src/modules/marketing/nav.tsx - frontend/src/modules/me/account-page.tsx - frontend/src/modules/me/delete-self.tsx - frontend/src/modules/me/helpers.tsx - frontend/src/modules/me/invitations-table/index.tsx - frontend/src/modules/me/invitations-table/invitations-columns.tsx - frontend/src/modules/me/mfa/confirmation.tsx - frontend/src/modules/me/mfa/switch.tsx - frontend/src/modules/me/passkeys/list.tsx - frontend/src/modules/me/passkeys/tile.tsx - frontend/src/modules/me/query.ts - frontend/src/modules/me/sessions-list.tsx - frontend/src/modules/me/totp-setup.tsx - frontend/src/modules/me/totp.tsx - frontend/src/modules/me/types.ts - frontend/src/modules/me/user-language.tsx - frontend/src/modules/me/user-theme.tsx - frontend/src/modules/memberships/delete-memberships.tsx - frontend/src/modules/memberships/leave-entity-button.tsx - frontend/src/modules/memberships/members-table/members-bar.tsx - frontend/src/modules/memberships/members-table/members-table.tsx - frontend/src/modules/memberships/pending-memberships-count.tsx - frontend/src/modules/memberships/pending-table/pending-columns.tsx - frontend/src/modules/memberships/pending-table/pending-memberships-table.tsx - frontend/src/modules/memberships/query-mutations.ts - frontend/src/modules/memberships/query.ts - frontend/src/modules/memberships/resend-invitation-button.tsx - frontend/src/modules/memberships/search-params-schemas.ts - frontend/src/modules/memberships/types.ts - frontend/src/modules/navigation/account-sheet.tsx - frontend/src/modules/navigation/app-nav-loader.tsx - frontend/src/modules/navigation/app-nav.tsx - frontend/src/modules/navigation/app-search.tsx - frontend/src/modules/navigation/bottom-bar-nav.tsx - frontend/src/modules/navigation/floating-nav/floating-nav.tsx - frontend/src/modules/navigation/focus-bridge.tsx - frontend/src/modules/navigation/menu-sheet/header.tsx - frontend/src/modules/navigation/menu-sheet/helpers/build-menu-from-cache.ts - frontend/src/modules/navigation/menu-sheet/helpers/get-menu-data.ts - frontend/src/modules/navigation/menu-sheet/helpers/is-page-data.ts - frontend/src/modules/navigation/menu-sheet/helpers/use-menu.ts - frontend/src/modules/navigation/menu-sheet/item-edit.tsx - frontend/src/modules/navigation/menu-sheet/item.tsx - frontend/src/modules/navigation/menu-sheet/items-edit-list.tsx - frontend/src/modules/navigation/menu-sheet/items-list.tsx - frontend/src/modules/navigation/menu-sheet/menu-sheet.tsx - frontend/src/modules/navigation/menu-sheet/offline-access-switch.tsx - frontend/src/modules/navigation/menu-sheet/search-result-block.tsx - frontend/src/modules/navigation/menu-sheet/section-button.tsx - frontend/src/modules/navigation/menu-sheet/section.tsx - frontend/src/modules/navigation/nav-buttons.tsx - frontend/src/modules/navigation/open-preferences-sheet.tsx - frontend/src/modules/navigation/preferences-sheet.tsx - frontend/src/modules/navigation/sidebar-nav.tsx - frontend/src/modules/navigation/stop-impersonation.tsx - frontend/src/modules/organization/create-organization-form.tsx - frontend/src/modules/organization/delete-organizations.tsx - frontend/src/modules/organization/organization-settings.tsx - frontend/src/modules/organization/query.ts - frontend/src/modules/organization/search-params-schemas.ts - frontend/src/modules/organization/table/organizations-bar.tsx - frontend/src/modules/organization/table/organizations-columns.tsx - frontend/src/modules/organization/table/update-row.tsx - frontend/src/modules/organization/types.ts - frontend/src/modules/organization/update-organization-details-form.tsx - frontend/src/modules/organization/update-organization-form.tsx - frontend/src/modules/page/create-page-form.tsx - frontend/src/modules/page/delete-pages.tsx - frontend/src/modules/page/query.ts - frontend/src/modules/page/search-params-schemas.ts - frontend/src/modules/page/table/pages-bar.tsx - frontend/src/modules/page/table/pages-columns.tsx - frontend/src/modules/page/table/pages-table.tsx - frontend/src/modules/page/update-page-form.tsx - frontend/src/modules/page/view-page.tsx - frontend/src/modules/requests/delete-requests.tsx - frontend/src/modules/requests/query.ts - frontend/src/modules/requests/search-params-schemas.ts - frontend/src/modules/requests/table/requests-bar.tsx - frontend/src/modules/requests/table/requests-columns.tsx - frontend/src/modules/requests/table/requests-table.tsx - frontend/src/modules/requests/waitlist-form.tsx - frontend/src/modules/seen/query.ts - frontend/src/modules/seen/seen-mark.tsx - frontend/src/modules/seen/seen-tracker.tsx - frontend/src/modules/seen/use-unseen-count.ts - frontend/src/modules/system/create-newsletter-form.tsx - frontend/src/modules/system/newsletter-preview.tsx - frontend/src/modules/tenants/create-tenant-form.tsx - frontend/src/modules/tenants/domains/manage-domains-sheet.tsx - frontend/src/modules/tenants/query.ts - frontend/src/modules/tenants/table/tenants-bar.tsx - frontend/src/modules/tenants/table/tenants-columns.tsx - frontend/src/modules/tenants/table/tenants-table.tsx - frontend/src/modules/tenants/table/update-row.tsx - frontend/src/modules/tenants/update-tenant-form.tsx - frontend/src/modules/ui/accordion.tsx - frontend/src/modules/ui/alert-dialog.tsx - frontend/src/modules/ui/alert.tsx - frontend/src/modules/ui/badge.tsx - frontend/src/modules/ui/breadcrumb.tsx - frontend/src/modules/ui/button-group.tsx - frontend/src/modules/ui/button.tsx - frontend/src/modules/ui/combobox.tsx - frontend/src/modules/ui/command.tsx - frontend/src/modules/ui/context-menu.tsx - frontend/src/modules/ui/dialog.tsx - frontend/src/modules/ui/drawer.tsx - frontend/src/modules/ui/radio-group.tsx - frontend/src/modules/ui/sheet.tsx - frontend/src/modules/ui/sidebar.tsx - frontend/src/modules/ui/sonner.tsx - frontend/src/modules/ui/stories/sidebar.stories.tsx - frontend/src/modules/user/invite-email-form.tsx - frontend/src/modules/user/invite-search-form.tsx - frontend/src/modules/user/invite-users.tsx - frontend/src/modules/user/query.ts - frontend/src/modules/user/search-params-schemas.ts - frontend/src/modules/user/table/impersonate-row.tsx - frontend/src/modules/user/types.ts - frontend/src/modules/user/update-user-form.tsx - frontend/src/modules/user/user-cell.tsx - frontend/src/modules/user/user-combobox.tsx - frontend/src/modules/user/user-profile-content.tsx - frontend/src/modules/user/user-profile.tsx - frontend/src/modules/user/user-sheet-handler.tsx - frontend/src/modules/user/user-sheet.tsx - frontend/src/query/basic/create-optimistic.ts - frontend/src/query/basic/create-query-keys.ts - frontend/src/query/basic/entity-query-registry.ts - frontend/src/query/basic/find-in-list-cache.ts - frontend/src/query/basic/helpers.ts - frontend/src/query/basic/index.ts - frontend/src/query/basic/invalidation-helpers.ts - frontend/src/query/basic/mutate-query.ts - frontend/src/query/basic/types.ts - frontend/src/query/basic/use-infinite-query-total.tsx - frontend/src/query/enrichment/ancestor-slugs.ts - frontend/src/query/enrichment/helpers.ts - frontend/src/query/enrichment/membership.ts - frontend/src/query/enrichment/permissions.ts - frontend/src/query/index.ts - frontend/src/query/offline/index.ts - frontend/src/query/offline/squash-utils.ts - frontend/src/query/offline/stx-utils.ts - frontend/src/query/offline/update-success-utils.ts - frontend/src/query/on-error.ts - frontend/src/query/on-success.ts - frontend/src/query/persister.ts - frontend/src/query/provider.tsx - frontend/src/query/query-client.ts - frontend/src/query/realtime/app-stream-handler.ts - frontend/src/query/realtime/app-stream.tsx - frontend/src/query/realtime/cache-ops.ts - frontend/src/query/realtime/cache-token-store.ts - frontend/src/query/realtime/catchup-processor.ts - frontend/src/query/realtime/membership-ops.ts - frontend/src/query/realtime/public-stream-handler.ts - frontend/src/query/realtime/public-stream.tsx - frontend/src/query/realtime/stream-store.ts - frontend/src/query/realtime/sync-priority.ts - frontend/src/query/realtime/sync-service.ts - frontend/src/query/realtime/types.ts - frontend/src/query/types.ts - frontend/src/routes/auth-routes.tsx - frontend/src/routes/base-routes.tsx - frontend/src/routes/docs-routes.tsx - frontend/src/routes/home-routes.tsx - frontend/src/routes/organization-routes.tsx - frontend/src/routes/route-tree.base.ts - frontend/src/routes/router.ts - frontend/src/routes/system-routes.tsx - frontend/src/routes/user-routes.tsx - frontend/src/styling/tailwind.css - frontend/src/utils/flush-stores.ts - frontend/src/utils/form-on-invalid.ts - frontend/src/utils/get-draggable-item-data.ts - frontend/src/utils/no-direct-access.ts - frontend/src/utils/resource-error.ts - frontend/src/utils/rewrite-url-to-slug.ts - frontend/src/utils/truncate-middle.ts - frontend/tsconfig.json - frontend/vite.config.ts - frontend/vite/stop-vite.ts - info/AGENTS.md - info/ARCHITECTURE.md - info/STATISTICS.md - info/SYNC_ENGINE.md - info/TESTING.md - infra/README.md - infra/deploy/main.tf - infra/environments/dev.tfvars - infra/environments/prod.tfvars - infra/environments/staging.tfvars - infra/main.tf - infra/modules/containers/main.tf - infra/modules/dns/main.tf - infra/modules/load-balancer/main.tf - infra/modules/secrets/main.tf - infra/outputs.tf - infra/variables.tf - locales/en/common.json - locales/en/error.json - locales/nl/common.json - locales/package.json - pnpm-workspace.yaml - shared/index.ts - shared/package.json - shared/scripts/wait-backend.ts - shared/src/permissions/access-policies.ts - shared/src/permissions/action-helpers.test.ts - shared/src/permissions/action-helpers.ts - shared/src/permissions/compute-can.ts - shared/src/permissions/index.ts - shared/src/permissions/types.ts - shared/src/tracing/tracing.ts - shared/src/utils/ascii.ts - shared/src/utils/is-cdn-url.ts - shared/src/utils/nanoid.ts - shared/src/utils/text-from-block.ts - shared/types.ts - studio/package.json - vitest.config.ts - (deleted) .env.example - (deleted) .npmrc - (deleted) backend/scripts/migrations/10-seq-triggers.migration.ts - (deleted) backend/scripts/quick.ts - (deleted) backend/src/custom-env.ts - (deleted) backend/src/db/schema/user-activity.ts - (deleted) backend/src/db/utils/activity-error-schema.ts - (deleted) backend/src/docs/tags-config.ts - (deleted) backend/src/middlewares/monitoring/monitoring-middleware.ts - (deleted) backend/src/middlewares/observability/config.ts - (deleted) backend/src/middlewares/observability/observability-middleware.ts - (deleted) backend/src/middlewares/observability/types.ts - (deleted) backend/src/modules/entities/helpers/init-context-counters.ts - (deleted) backend/src/modules/memberships/helpers/context-ids.ts - (deleted) backend/src/modules/metrics/helpers/calculate-requests-per-minute.ts - (deleted) backend/src/modules/metrics/helpers/parse-prom-metrics.ts - (deleted) backend/src/relatable-config.ts - (deleted) cdc/src/handlers/build-activity.ts - (deleted) cdc/src/health.ts - (deleted) cdc/src/lib/activity-service.ts - (deleted) cdc/src/lib/error.ts - (deleted) cdc/src/lib/replication-state.ts - (deleted) cdc/src/lib/resource-monitor.ts - (deleted) cdc/src/pino.ts - (deleted) cdc/src/process-message.ts - (deleted) cdc/src/tables.ts - (deleted) cdc/src/tracing.ts - (deleted) cdc/src/utils/extract-activity-context.ts - (deleted) cdc/src/utils/extract-context-entity-ids.ts - (deleted) cdc/src/utils/get-table-entry.ts - (deleted) cdc/src/worker.ts - (deleted) cli/create-cella/.gitignore - (deleted) cli/create-cella/README.md - (deleted) cli/create-cella/configs/default-config.ts.template - (deleted) cli/create-cella/index.js - (deleted) cli/create-cella/package.json - (deleted) cli/create-cella/src/add-remote.ts - (deleted) cli/create-cella/src/constants.ts - (deleted) cli/create-cella/src/create-cella-cli.ts - (deleted) cli/create-cella/src/create.ts - (deleted) cli/create-cella/src/modules/cli/commands.ts - (deleted) cli/create-cella/src/modules/cli/display.ts - (deleted) cli/create-cella/src/modules/cli/index.ts - (deleted) cli/create-cella/src/modules/cli/types.ts - (deleted) cli/create-cella/src/utils/clean-template.ts - (deleted) cli/create-cella/src/utils/detect-used-ports.ts - (deleted) cli/create-cella/src/utils/extract-package-json-version-from-uri.ts - (deleted) cli/create-cella/src/utils/git/command.ts - (deleted) cli/create-cella/src/utils/git/index.ts - (deleted) cli/create-cella/src/utils/is-empty-directory.ts - (deleted) cli/create-cella/src/utils/progress.ts - (deleted) cli/create-cella/src/utils/run-package-manager-command.ts - (deleted) cli/create-cella/src/utils/validate-project-name.ts - (deleted) cli/create-cella/tests/e2e.test.ts - (deleted) cli/create-cella/tests/validate-project-name.test.ts - (deleted) cli/create-cella/tsconfig.json - (deleted) cli/create-cella/vitest.config.ts - (deleted) frontend/src/hooks/use-boundary-cleanup.ts - (deleted) frontend/src/hooks/use-double-click.tsx - (deleted) frontend/src/hooks/use-nav-tabs.ts - (deleted) frontend/src/hooks/use-offline-table-search.tsx - (deleted) frontend/src/lib/custom-events/index.ts - (deleted) frontend/src/lib/custom-events/types.ts - (deleted) frontend/src/lib/health-check.ts - (deleted) frontend/src/lib/sentry.ts - (deleted) frontend/src/modules/attachment/helpers.ts - (deleted) frontend/src/modules/common/app/app-sheets.tsx - (deleted) frontend/src/modules/common/board-layout.tsx - (deleted) frontend/src/modules/common/debug-toolbars.tsx - (deleted) frontend/src/modules/common/tab-coordinator.tsx - (deleted) frontend/src/modules/metrics/requests-per-minute.tsx - (deleted) frontend/src/modules/navigation/README.md - (deleted) frontend/src/modules/organization/subscription.tsx - (deleted) frontend/src/modules/tenants/subscription.tsx - (deleted) frontend/src/query/basic/compare-query-keys.ts - (deleted) frontend/src/query/basic/use-mutate-query-data.tsx - (deleted) frontend/src/query/offline/detect-changed-fields.ts - (deleted) frontend/src/routes-resolver.ts - (deleted) frontend/src/routes/boundary-cleanup.ts - (deleted) frontend/src/store/README.md - (deleted) frontend/src/utils/date-is-recent.ts - (deleted) frontend/src/utils/get-nested-value.ts - (deleted) frontend/src/utils/hex-to-hsl.ts - (deleted) frontend/src/utils/is-el-interactive.ts - (deleted) frontend/src/utils/object.ts - (deleted) frontend/vite/openapi-watch.ts - (deleted) info/OWASP_ANALYSIS.md - (deleted) info/QUICKSTART.md - (deleted) info/SCALEWAY_DEPLOYMENT.md - (deleted) info/SYNC_ENGINE_PERF_TESTING.md - (deleted) json/email-providers.json - (deleted) patches/dexie@4.3.0.patch - (deleted) patches/slugify@1.6.6.patch - (deleted) shared/app-config.ts
1 parent 7ec622f commit cc24775

File tree

645 files changed

+12775
-13140
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

645 files changed

+12775
-13140
lines changed

.env.example

Lines changed: 0 additions & 7 deletions
This file was deleted.

.github/copilot-instructions.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,8 @@ Product entities are typically daily-use content data models that can optionally
5353
## Essential Commands
5454

5555
```bash
56-
pnpm quick # Fast dev with PGlite (DEV_MODE=basic, no Docker)
56+
pnpm dev:core # Dev with PostgreSQL only (DEV_MODE=core, no CDC, requires Docker)
5757
pnpm dev # Full dev with PostgreSQL + CDC Worker (DEV_MODE=full, requires Docker)
58-
pnpm dev:core # Dev with PostgreSQL only (DEV_MODE=core, no CDC)
5958
pnpm check # Run generate:openapi + typecheck + lint:fix
6059
pnpm generate # Create Drizzle migrations from schema changes
6160
pnpm seed # Seed database with test data

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ jobs:
126126
run: cd frontend && pnpm exec playwright install
127127

128128
- name: Generate OpenAPI spec
129-
run: pnpm --filter backend generate-openapi
129+
run: pnpm --filter backend generate:openapi
130130

131131
- name: Run database migrations
132132
run: pnpm --filter backend push

.github/workflows/deploy.yml

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
# Triggered on pushes to main (prod) or manually for other environments
66
# =============================================================================
77

8-
export const stxRequestSchema = z
9-
108
permissions:
119
contents: read
1210

@@ -18,6 +16,7 @@ on:
1816
paths:
1917
- 'backend/**'
2018
- 'cdc/**'
19+
- 'yjs/**'
2120
- 'frontend/**'
2221
- 'infra/**'
2322
- '.github/workflows/deploy.yml'
@@ -127,6 +126,36 @@ jobs:
127126
cache-from: type=gha
128127
cache-to: type=gha,mode=max
129128

129+
build-yjs:
130+
runs-on: ubuntu-latest
131+
needs: setup
132+
environment: ${{ needs.setup.outputs.environment }}
133+
steps:
134+
- name: Checkout
135+
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
136+
137+
- name: Set up Docker Buildx
138+
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
139+
140+
- name: Login to Scaleway Container Registry
141+
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
142+
with:
143+
registry: rg.${{ env.SCW_REGION }}.scw.cloud
144+
username: nologin
145+
password: ${{ secrets.SCW_SECRET_KEY }}
146+
147+
- name: Build and push Yjs image
148+
uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5
149+
with:
150+
context: .
151+
file: yjs/Dockerfile
152+
push: true
153+
tags: |
154+
rg.${{ env.SCW_REGION }}.scw.cloud/${{ needs.setup.outputs.environment }}cella/yjs:${{ needs.setup.outputs.image_tag }}
155+
rg.${{ env.SCW_REGION }}.scw.cloud/${{ needs.setup.outputs.environment }}cella/yjs:latest
156+
cache-from: type=gha
157+
cache-to: type=gha,mode=max
158+
130159
# -------------------------------------------------------------------------
131160
# Build and deploy frontend to Object Storage
132161
# -------------------------------------------------------------------------
@@ -212,7 +241,7 @@ jobs:
212241
# -------------------------------------------------------------------------
213242
terraform:
214243
runs-on: ubuntu-latest
215-
needs: [setup, build-backend, build-cdc]
244+
needs: [setup, build-backend, build-cdc, build-yjs]
216245
environment: ${{ needs.setup.outputs.environment }}
217246
defaults:
218247
run:
@@ -257,10 +286,12 @@ jobs:
257286
-var-file="environments/${{ needs.setup.outputs.environment }}.tfvars" \
258287
-var="backend_image_tag=${{ needs.setup.outputs.image_tag }}" \
259288
-var="cdc_image_tag=${{ needs.setup.outputs.image_tag }}" \
289+
-var="yjs_image_tag=${{ needs.setup.outputs.image_tag }}" \
260290
-var="argon_secret=${{ secrets.ARGON_SECRET }}" \
261291
-var="cookie_secret=${{ secrets.COOKIE_SECRET }}" \
262-
-var="unsubscribe_token_secret=${{ secrets.UNSUBSCRIBE_TOKEN_SECRET }}" \
263-
-var="cdc_ws_secret=${{ secrets.CDC_WS_SECRET }}" \
292+
'-var="unsubscribe_secret=${{ secrets.UNSUBSCRIBE_SECRET }}" \'
293+
-var="cdc_secret=${{ secrets.CDC_SECRET }}" \
294+
-var="yjs_secret=${{ secrets.YJS_SECRET }}" \
264295
-out=tfplan
265296
266297
- name: Terraform Apply
@@ -296,7 +327,7 @@ jobs:
296327
297328
for i in {1..10}; do
298329
response=$(curl -s -o /dev/null -w "%{http_code}" "$HEALTH_URL" || echo "000")
299-
if [ "$response" = "200" ]; then
330+
if [ "$response" = "204" ] || [ "$response" = "200" ]; then
300331
echo "✅ Backend is healthy!"
301332
exit 0
302333
fi

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ dist-ssr
3131

3232
# Cache
3333
*.tsbuildinfo
34-
.sentryclirc
3534
.million
3635
.db
3736
.rendered
@@ -40,6 +39,10 @@ backend/.openapi-manifest.json
4039
frontend/vite/temp-api-gen-*
4140
frontend/vite/temp-docs-gen-*
4241
frontend/vite/.generate-client.lock
42+
sdk/src/temp-api-gen-*
43+
sdk/src/temp-docs-gen-*
44+
sdk/src/.generate-client.lock
45+
sdk/src/.spec-hash
4346

4447
# Other
4548
.netlify

backend/.env.example

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
# REQUIRED ENVIRONMENT VARIABLES
33
#*******************************************************************************
44

5+
# Docker compose.yaml variables
6+
PROJECT_SLUG=cella
7+
DB_PORT=5432
8+
DB_TEST_PORT=5434
9+
510
# Node environment
611
NODE_ENV=development
712

@@ -30,7 +35,10 @@ COOKIE_SECRET=cookie_secret
3035
SYSTEM_ADMIN_IP_ALLOWLIST=none
3136

3237
# CDC Worker authentication (optional in quick mode)
33-
CDC_INTERNAL_SECRET=some_internal_secret_for_cdc_worker
38+
CDC_SECRET=some_secret_for_cdc_worker
39+
40+
# Yjs relay authentication
41+
YJS_SECRET=some_secret_for_yjs_relay
3442

3543
# Admin email for initial admin user seeding
3644
ADMIN_EMAIL=admin-test@cellajs.com
@@ -42,17 +50,23 @@ ADMIN_EMAIL=admin-test@cellajs.com
4250
# Debug mode
4351
DEBUG=false
4452

53+
# Pino
54+
PINO_LOG_LEVEL=info
55+
4556
# Backend port
4657
PORT=4000
4758

4859
# Public URL of the development tunnel
4960
TUNNEL_URL=
5061
TUNNEL_AUTH_TOKEN=
5162

52-
# Brevo
63+
# Brevo transactional email
5364
BREVO_API_KEY=
5465
SEND_ALL_TO_EMAIL=
5566

67+
# Maple.dev observability
68+
MAPLE_API_KEY=
69+
5670
# OAuth strategies
5771
GITHUB_CLIENT_ID=
5872
GITHUB_CLIENT_SECRET=
@@ -68,12 +82,6 @@ TRANSLOADIT_SECRET=your_transloadit_secret
6882
S3_ACCESS_KEY_ID=
6983
S3_ACCESS_KEY_SECRET=
7084

71-
# Pino
72-
PINO_LOG_LEVEL=info
73-
7485
# Element
7586
ELEMENT_ROOM_ID=
7687
ELEMENT_BOT_ACCESS_TOKEN=
77-
78-
# Maple.dev observability
79-
MAPLE_API_KEY=

backend/Dockerfile

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# =============================================================================
2-
# Cella Backend - Production Dockerfile
2+
# Backend - Production Dockerfile
33
# =============================================================================
44
# Multi-stage build for Node.js 24 Hono API server
55
# Optimized for Scaleway Serverless Containers
@@ -30,7 +30,7 @@ COPY packages/tracing/package.json ./packages/tracing/
3030
COPY patches/ ./patches/
3131

3232
# Install production dependencies only (--ignore-scripts avoids native build issues)
33-
RUN pnpm install --frozen-lockfile --prod --ignore-scripts --filter @cella/backend...
33+
RUN pnpm install --frozen-lockfile --prod --ignore-scripts --filter backend...
3434

3535
# -----------------------------------------------------------------------------
3636
# Stage 3: Build application
@@ -46,7 +46,7 @@ COPY packages/tracing/package.json ./packages/tracing/
4646
COPY patches/ ./patches/
4747

4848
# Install all dependencies (including dev for build)
49-
RUN pnpm install --frozen-lockfile --ignore-scripts --filter @cella/backend...
49+
RUN pnpm install --frozen-lockfile --ignore-scripts --filter backend...
5050

5151
# Copy source code
5252
COPY backend/ ./backend/
@@ -66,8 +66,8 @@ RUN pnpm build
6666
FROM node:24-alpine AS production
6767

6868
# Add non-root user for security
69-
RUN addgroup --system --gid 1001 cella && \
70-
adduser --system --uid 1001 cella
69+
RUN addgroup --system --gid 1001 app && \
70+
adduser --system --uid 1001 app
7171

7272
WORKDIR /app
7373

@@ -89,10 +89,10 @@ COPY --from=builder /app/json ./json
8989
COPY backend/drizzle ./backend/drizzle
9090

9191
# Set ownership
92-
RUN chown -R cella:cella /app
92+
RUN chown -R app:app /app
9393

9494
# Switch to non-root user
95-
USER cella
95+
USER app
9696

9797
# Environment variables
9898
ENV NODE_ENV=production

backend/drizzle.config.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import { defineConfig } from 'drizzle-kit';
22

3-
const devMode = process.env.DEV_MODE || 'core';
43
const databaseUrl = process.env.DATABASE_URL || '';
54
// Use admin URL for Drizzle Studio/push so it bypasses RLS (admin_role has BYPASSRLS)
65
const databaseAdminUrl = process.env.DATABASE_ADMIN_URL || databaseUrl;
7-
const extendConfig = devMode === 'basic' ? { driver: 'pglite' as const } : {};
86

97
/**
108
* Drizzle configuration.
@@ -18,8 +16,7 @@ export default defineConfig({
1816
entities: {
1917
roles: true,
2018
},
21-
...extendConfig,
2219
dbCredentials: {
23-
url: devMode === 'basic' ? './.db' : databaseAdminUrl,
20+
url: databaseAdminUrl,
2421
},
2522
});

backend/emails/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
Email templates are processed by jsx-email. View backend/package.json for email commands.
44

5+
https://jsx.email/
6+
57
## Structure
68

79
- `index.ts` - Barrel file exporting all templates

backend/emails/components/email-avatar.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ const getRandomColor = () => {
88
};
99

1010
/**
11-
* Avatar email component to display user or organization initials.
11+
* EmailAvatar component to display user or organization initials.
1212
*/
13-
export const Avatar = ({ name, type = 'user' }: { name?: string | null; type?: 'user' | 'organization' }) => {
13+
export const EmailAvatar = ({ name, type = 'user' }: { name?: string | null; type?: 'user' | 'organization' }) => {
1414
let initials = 'U';
1515
if (name) {
1616
const words = name.split(' ');
@@ -42,4 +42,4 @@ export const Avatar = ({ name, type = 'user' }: { name?: string | null; type?: '
4242
};
4343

4444
// Template export
45-
export const Template = Avatar;
45+
export const Template = EmailAvatar;

0 commit comments

Comments
 (0)