sovrium 0.0.2
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 +3497 -0
- package/LICENSE.md +147 -0
- package/LICENSE_EE.md +297 -0
- package/README.md +321 -0
- package/drizzle/0000_melted_kabuki.sql +163 -0
- package/drizzle/meta/0000_snapshot.json +1216 -0
- package/drizzle/meta/_journal.json +13 -0
- package/package.json +167 -0
- package/schemas/0.0.1/app.openapi.json +70 -0
- package/schemas/0.0.1/app.schema.json +7961 -0
- package/schemas/0.0.2/app.openapi.json +80 -0
- package/schemas/0.0.2/app.schema.json +8829 -0
- package/schemas/development/app.openapi.json +70 -0
- package/schemas/development/app.schema.json +7456 -0
- package/src/application/errors/app-validation-error.ts +14 -0
- package/src/application/errors/static-generation-error.ts +16 -0
- package/src/application/metadata/favicon-transformer.ts +127 -0
- package/src/application/models/server.ts +27 -0
- package/src/application/ports/models/user-metadata.ts +36 -0
- package/src/application/ports/models/user-session.ts +34 -0
- package/src/application/ports/repositories/activity-log-repository.ts +68 -0
- package/src/application/ports/repositories/activity-repository.ts +49 -0
- package/src/application/ports/repositories/analytics-repository.ts +164 -0
- package/src/application/ports/repositories/auth-repository.ts +33 -0
- package/src/application/ports/repositories/batch-repository.ts +86 -0
- package/src/application/ports/repositories/comment-repository.ts +150 -0
- package/src/application/ports/repositories/index.ts +41 -0
- package/src/application/ports/repositories/table-repository.ts +139 -0
- package/src/application/ports/services/css-compiler.ts +55 -0
- package/src/application/ports/services/index.ts +16 -0
- package/src/application/ports/services/page-renderer.ts +79 -0
- package/src/application/ports/services/server-factory.ts +80 -0
- package/src/application/ports/services/static-site-generator.ts +82 -0
- package/src/application/use-cases/activity/programs.ts +66 -0
- package/src/application/use-cases/analytics/collect-page-view.ts +114 -0
- package/src/application/use-cases/analytics/purge-old-data.ts +40 -0
- package/src/application/use-cases/analytics/query-campaigns.ts +43 -0
- package/src/application/use-cases/analytics/query-devices.ts +36 -0
- package/src/application/use-cases/analytics/query-overview.ts +50 -0
- package/src/application/use-cases/analytics/query-pages.ts +40 -0
- package/src/application/use-cases/analytics/query-referrers.ts +43 -0
- package/src/application/use-cases/analytics/ua-parser.ts +89 -0
- package/src/application/use-cases/analytics/visitor-hash.ts +77 -0
- package/src/application/use-cases/auth/bootstrap-admin.ts +270 -0
- package/src/application/use-cases/list-activity-logs.ts +123 -0
- package/src/application/use-cases/server/generate-static-helpers.ts +374 -0
- package/src/application/use-cases/server/generate-static.ts +287 -0
- package/src/application/use-cases/server/start-server.ts +118 -0
- package/src/application/use-cases/server/startup-error-handler.ts +69 -0
- package/src/application/use-cases/server/static-content-generators.ts +182 -0
- package/src/application/use-cases/server/static-language-generators.ts +181 -0
- package/src/application/use-cases/server/static-url-rewriter.ts +237 -0
- package/src/application/use-cases/server/translation-replacer.ts +164 -0
- package/src/application/use-cases/tables/activity-programs.ts +93 -0
- package/src/application/use-cases/tables/batch-operations.ts +156 -0
- package/src/application/use-cases/tables/comment-programs.ts +436 -0
- package/src/application/use-cases/tables/permissions/permissions.ts +25 -0
- package/src/application/use-cases/tables/programs.ts +435 -0
- package/src/application/use-cases/tables/table-operations.ts +412 -0
- package/src/application/use-cases/tables/user-role.ts +52 -0
- package/src/application/use-cases/tables/utils/display-formatter.ts +471 -0
- package/src/application/use-cases/tables/utils/field-read-filter.ts +189 -0
- package/src/application/use-cases/tables/utils/list-helpers.ts +122 -0
- package/src/application/use-cases/tables/utils/record-transformer.ts +319 -0
- package/src/cli.ts +370 -0
- package/src/domain/errors/create-tagged-error.ts +36 -0
- package/src/domain/errors/index.ts +78 -0
- package/src/domain/models/api/analytics.ts +179 -0
- package/src/domain/models/api/auth.ts +231 -0
- package/src/domain/models/api/common.ts +60 -0
- package/src/domain/models/api/error.ts +89 -0
- package/src/domain/models/api/health.ts +38 -0
- package/src/domain/models/api/index.ts +42 -0
- package/src/domain/models/api/request.ts +132 -0
- package/src/domain/models/api/tables.ts +444 -0
- package/src/domain/models/app/analytics/index.ts +129 -0
- package/src/domain/models/app/auth/config.ts +116 -0
- package/src/domain/models/app/auth/index.ts +230 -0
- package/src/domain/models/app/auth/methods/email-and-password.ts +67 -0
- package/src/domain/models/app/auth/methods/index.ts +11 -0
- package/src/domain/models/app/auth/methods/magic-link.ts +54 -0
- package/src/domain/models/app/auth/oauth/index.ts +8 -0
- package/src/domain/models/app/auth/oauth/providers.ts +105 -0
- package/src/domain/models/app/auth/plugins/admin.ts +130 -0
- package/src/domain/models/app/auth/plugins/index.ts +74 -0
- package/src/domain/models/app/auth/plugins/two-factor.ts +63 -0
- package/src/domain/models/app/auth/roles.ts +179 -0
- package/src/domain/models/app/auth/strategies.ts +191 -0
- package/src/domain/models/app/auth/validation.ts +127 -0
- package/src/domain/models/app/common/branded-ids.ts +200 -0
- package/src/domain/models/app/common/definitions.ts +187 -0
- package/src/domain/models/app/component/common/component-children.ts +119 -0
- package/src/domain/models/app/component/common/component-props.ts +89 -0
- package/src/domain/models/app/component/common/component-reference.ts +170 -0
- package/src/domain/models/app/component/component.ts +81 -0
- package/src/domain/models/app/components.ts +65 -0
- package/src/domain/models/app/description.ts +83 -0
- package/src/domain/models/app/index.ts +258 -0
- package/src/domain/models/app/language/language-config.ts +200 -0
- package/src/domain/models/app/languages.ts +205 -0
- package/src/domain/models/app/name.ts +66 -0
- package/src/domain/models/app/page/common/interactions/click-interaction.ts +116 -0
- package/src/domain/models/app/page/common/interactions/entrance-animation.ts +84 -0
- package/src/domain/models/app/page/common/interactions/hover-interaction.ts +144 -0
- package/src/domain/models/app/page/common/interactions/interactions.ts +64 -0
- package/src/domain/models/app/page/common/interactions/scroll-interaction.ts +93 -0
- package/src/domain/models/app/page/common/responsive.ts +114 -0
- package/src/domain/models/app/page/common/url.ts +35 -0
- package/src/domain/models/app/page/common/variable-reference.ts +53 -0
- package/src/domain/models/app/page/id.ts +44 -0
- package/src/domain/models/app/page/index.ts +270 -0
- package/src/domain/models/app/page/meta/analytics.ts +248 -0
- package/src/domain/models/app/page/meta/custom-elements.ts +180 -0
- package/src/domain/models/app/page/meta/dns-prefetch.ts +77 -0
- package/src/domain/models/app/page/meta/favicon-set.ts +203 -0
- package/src/domain/models/app/page/meta/favicon.ts +50 -0
- package/src/domain/models/app/page/meta/favicons-config.ts +73 -0
- package/src/domain/models/app/page/meta/index.ts +278 -0
- package/src/domain/models/app/page/meta/open-graph.ts +166 -0
- package/src/domain/models/app/page/meta/preload.ts +190 -0
- package/src/domain/models/app/page/meta/structured-data/article.ts +211 -0
- package/src/domain/models/app/page/meta/structured-data/breadcrumb.ts +115 -0
- package/src/domain/models/app/page/meta/structured-data/common-fields.ts +201 -0
- package/src/domain/models/app/page/meta/structured-data/education-event.ts +256 -0
- package/src/domain/models/app/page/meta/structured-data/faq-page.ts +127 -0
- package/src/domain/models/app/page/meta/structured-data/index.ts +95 -0
- package/src/domain/models/app/page/meta/structured-data/local-business.ts +247 -0
- package/src/domain/models/app/page/meta/structured-data/organization.ts +171 -0
- package/src/domain/models/app/page/meta/structured-data/person.ts +138 -0
- package/src/domain/models/app/page/meta/structured-data/postal-address.ts +106 -0
- package/src/domain/models/app/page/meta/structured-data/product.ts +214 -0
- package/src/domain/models/app/page/meta/twitter-card.ts +217 -0
- package/src/domain/models/app/page/name.ts +38 -0
- package/src/domain/models/app/page/path.ts +21 -0
- package/src/domain/models/app/page/scripts/external-scripts.ts +163 -0
- package/src/domain/models/app/page/scripts/features.ts +135 -0
- package/src/domain/models/app/page/scripts/inline-scripts.ts +114 -0
- package/src/domain/models/app/page/scripts/scripts.ts +102 -0
- package/src/domain/models/app/page/sections.ts +298 -0
- package/src/domain/models/app/pages.ts +61 -0
- package/src/domain/models/app/permissions/index.ts +61 -0
- package/src/domain/models/app/permissions/resource-action.ts +114 -0
- package/src/domain/models/app/permissions/roles.ts +120 -0
- package/src/domain/models/app/table/check-constraints.ts +105 -0
- package/src/domain/models/app/table/cycle-detection.ts +124 -0
- package/src/domain/models/app/table/database-identifier.ts +153 -0
- package/src/domain/models/app/table/field-name.ts +36 -0
- package/src/domain/models/app/table/field-types/advanced/array-field.ts +33 -0
- package/src/domain/models/app/table/field-types/advanced/autonumber-field.ts +54 -0
- package/src/domain/models/app/table/field-types/advanced/button-field.ts +56 -0
- package/src/domain/models/app/table/field-types/advanced/color-field.ts +57 -0
- package/src/domain/models/app/table/field-types/advanced/count-field.ts +54 -0
- package/src/domain/models/app/table/field-types/advanced/formula-field.ts +58 -0
- package/src/domain/models/app/table/field-types/advanced/geolocation-field.ts +49 -0
- package/src/domain/models/app/table/field-types/advanced/index.ts +16 -0
- package/src/domain/models/app/table/field-types/advanced/json-field.ts +25 -0
- package/src/domain/models/app/table/field-types/advanced/unknown-field.ts +85 -0
- package/src/domain/models/app/table/field-types/base-field.ts +42 -0
- package/src/domain/models/app/table/field-types/date-time/created-at-field.ts +49 -0
- package/src/domain/models/app/table/field-types/date-time/date-field.ts +95 -0
- package/src/domain/models/app/table/field-types/date-time/deleted-at-field.ts +56 -0
- package/src/domain/models/app/table/field-types/date-time/duration-field.ts +73 -0
- package/src/domain/models/app/table/field-types/date-time/index.ts +12 -0
- package/src/domain/models/app/table/field-types/date-time/updated-at-field.ts +50 -0
- package/src/domain/models/app/table/field-types/index.ts +19 -0
- package/src/domain/models/app/table/field-types/media/barcode-field.ts +58 -0
- package/src/domain/models/app/table/field-types/media/index.ts +10 -0
- package/src/domain/models/app/table/field-types/media/multiple-attachments-field.ts +80 -0
- package/src/domain/models/app/table/field-types/media/single-attachment-field.ts +81 -0
- package/src/domain/models/app/table/field-types/numeric/currency-field.ts +144 -0
- package/src/domain/models/app/table/field-types/numeric/decimal-field.ts +113 -0
- package/src/domain/models/app/table/field-types/numeric/index.ts +13 -0
- package/src/domain/models/app/table/field-types/numeric/integer-field.ts +98 -0
- package/src/domain/models/app/table/field-types/numeric/percentage-field.ts +115 -0
- package/src/domain/models/app/table/field-types/numeric/progress-field.ts +71 -0
- package/src/domain/models/app/table/field-types/numeric/rating-field.ts +74 -0
- package/src/domain/models/app/table/field-types/relational/index.ts +10 -0
- package/src/domain/models/app/table/field-types/relational/lookup-field.ts +46 -0
- package/src/domain/models/app/table/field-types/relational/relationship-field.ts +112 -0
- package/src/domain/models/app/table/field-types/relational/rollup-field.ts +58 -0
- package/src/domain/models/app/table/field-types/selection/checkbox-field.ts +51 -0
- package/src/domain/models/app/table/field-types/selection/index.ts +11 -0
- package/src/domain/models/app/table/field-types/selection/multi-select-field.ts +68 -0
- package/src/domain/models/app/table/field-types/selection/single-select-field.ts +54 -0
- package/src/domain/models/app/table/field-types/selection/status-field.ts +37 -0
- package/src/domain/models/app/table/field-types/text/email-field.ts +80 -0
- package/src/domain/models/app/table/field-types/text/index.ts +13 -0
- package/src/domain/models/app/table/field-types/text/long-text-field.ts +77 -0
- package/src/domain/models/app/table/field-types/text/phone-number-field.ts +82 -0
- package/src/domain/models/app/table/field-types/text/rich-text-field.ts +66 -0
- package/src/domain/models/app/table/field-types/text/single-line-text-field.ts +79 -0
- package/src/domain/models/app/table/field-types/text/url-field.ts +81 -0
- package/src/domain/models/app/table/field-types/user/created-by-field.ts +50 -0
- package/src/domain/models/app/table/field-types/user/deleted-by-field.ts +57 -0
- package/src/domain/models/app/table/field-types/user/index.ts +11 -0
- package/src/domain/models/app/table/field-types/user/updated-by-field.ts +51 -0
- package/src/domain/models/app/table/field-types/user/user-field.ts +52 -0
- package/src/domain/models/app/table/field-types/validation-utils.ts +166 -0
- package/src/domain/models/app/table/fields.ts +216 -0
- package/src/domain/models/app/table/foreign-keys.ts +111 -0
- package/src/domain/models/app/table/formula-keywords.ts +326 -0
- package/src/domain/models/app/table/id.ts +31 -0
- package/src/domain/models/app/table/index.ts +290 -0
- package/src/domain/models/app/table/indexes.ts +80 -0
- package/src/domain/models/app/table/name.ts +37 -0
- package/src/domain/models/app/table/permissions/field-permission.ts +83 -0
- package/src/domain/models/app/table/permissions/index.ts +167 -0
- package/src/domain/models/app/table/permissions/permission-evaluator.ts +372 -0
- package/src/domain/models/app/table/permissions/permission.ts +49 -0
- package/src/domain/models/app/table/primary-key.ts +62 -0
- package/src/domain/models/app/table/table-formula-validation.ts +168 -0
- package/src/domain/models/app/table/table-indexes-validation.ts +38 -0
- package/src/domain/models/app/table/table-permissions-validation.ts +77 -0
- package/src/domain/models/app/table/table-primary-key-validation.ts +49 -0
- package/src/domain/models/app/table/table-views-validation.ts +408 -0
- package/src/domain/models/app/table/unique-constraints.ts +79 -0
- package/src/domain/models/app/table/views/fields.ts +28 -0
- package/src/domain/models/app/table/views/filters.ts +162 -0
- package/src/domain/models/app/table/views/group-by.ts +32 -0
- package/src/domain/models/app/table/views/id.ts +50 -0
- package/src/domain/models/app/table/views/index.ts +177 -0
- package/src/domain/models/app/table/views/name.ts +32 -0
- package/src/domain/models/app/table/views/permissions.ts +98 -0
- package/src/domain/models/app/table/views/sorts.ts +31 -0
- package/src/domain/models/app/tables.ts +695 -0
- package/src/domain/models/app/theme/animations.ts +208 -0
- package/src/domain/models/app/theme/border-radius.ts +58 -0
- package/src/domain/models/app/theme/breakpoints.ts +62 -0
- package/src/domain/models/app/theme/colors.ts +110 -0
- package/src/domain/models/app/theme/fonts.ts +164 -0
- package/src/domain/models/app/theme/shadows.ts +61 -0
- package/src/domain/models/app/theme/spacing.ts +115 -0
- package/src/domain/models/app/theme.ts +66 -0
- package/src/domain/models/app/version.ts +87 -0
- package/src/domain/models/record-comment.ts +91 -0
- package/src/domain/utils/content-parsing.ts +49 -0
- package/src/domain/utils/format-detection.ts +69 -0
- package/src/domain/utils/index.ts +9 -0
- package/src/domain/utils/route-matcher.ts +184 -0
- package/src/domain/utils/translation-resolver.ts +170 -0
- package/src/index.ts +208 -0
- package/src/infrastructure/analytics/tracking-script.ts +48 -0
- package/src/infrastructure/auth/better-auth/auth.ts +216 -0
- package/src/infrastructure/auth/better-auth/email-handlers.ts +162 -0
- package/src/infrastructure/auth/better-auth/index.ts +16 -0
- package/src/infrastructure/auth/better-auth/layer.ts +97 -0
- package/src/infrastructure/auth/better-auth/plugins/admin.ts +56 -0
- package/src/infrastructure/auth/better-auth/plugins/magic-link.ts +31 -0
- package/src/infrastructure/auth/better-auth/plugins/two-factor.ts +19 -0
- package/src/infrastructure/auth/better-auth/schema.ts +152 -0
- package/src/infrastructure/auth/index.ts +27 -0
- package/src/infrastructure/css/cache/css-cache-service.ts +130 -0
- package/src/infrastructure/css/compiler.ts +210 -0
- package/src/infrastructure/css/css-compiler-live.ts +20 -0
- package/src/infrastructure/css/index.ts +25 -0
- package/src/infrastructure/css/styles/animation-styles-generator.ts +177 -0
- package/src/infrastructure/css/styles/click-animations.ts +147 -0
- package/src/infrastructure/css/styles/component-layer-generators.ts +147 -0
- package/src/infrastructure/css/theme/theme-generators.ts +130 -0
- package/src/infrastructure/css/theme/theme-layer-generators.ts +219 -0
- package/src/infrastructure/css/theme/theme-token-resolver.ts +76 -0
- package/src/infrastructure/database/activity-queries.ts +111 -0
- package/src/infrastructure/database/auth/auth-validation.ts +101 -0
- package/src/infrastructure/database/drizzle/db-bun.ts +17 -0
- package/src/infrastructure/database/drizzle/db.ts +17 -0
- package/src/infrastructure/database/drizzle/index.ts +16 -0
- package/src/infrastructure/database/drizzle/layer.ts +34 -0
- package/src/infrastructure/database/drizzle/migrate.ts +77 -0
- package/src/infrastructure/database/drizzle/schema/activity-log.ts +111 -0
- package/src/infrastructure/database/drizzle/schema/analytics-page-views.ts +116 -0
- package/src/infrastructure/database/drizzle/schema/migration-audit.ts +68 -0
- package/src/infrastructure/database/drizzle/schema/record-comments.ts +79 -0
- package/src/infrastructure/database/drizzle/schema.ts +12 -0
- package/src/infrastructure/database/field-utils.ts +87 -0
- package/src/infrastructure/database/filter-operators.ts +136 -0
- package/src/infrastructure/database/formula/formula-trigger-generators.ts +114 -0
- package/src/infrastructure/database/formula/formula-utils.ts +440 -0
- package/src/infrastructure/database/generators/index-generators.ts +152 -0
- package/src/infrastructure/database/generators/trigger-generators.ts +154 -0
- package/src/infrastructure/database/index.ts +35 -0
- package/src/infrastructure/database/lookup/lookup-expression-generators.ts +356 -0
- package/src/infrastructure/database/lookup/lookup-expressions.ts +116 -0
- package/src/infrastructure/database/lookup/lookup-view-generators.ts +403 -0
- package/src/infrastructure/database/lookup/lookup-view-helpers.ts +65 -0
- package/src/infrastructure/database/lookup/lookup-view-triggers.ts +121 -0
- package/src/infrastructure/database/migration-audit-trail.ts +375 -0
- package/src/infrastructure/database/repositories/activity-log-repository-live.ts +99 -0
- package/src/infrastructure/database/repositories/activity-repository-live.ts +21 -0
- package/src/infrastructure/database/repositories/analytics-repository-live.ts +316 -0
- package/src/infrastructure/database/repositories/auth-repository-live.ts +42 -0
- package/src/infrastructure/database/repositories/batch-repository-live.ts +29 -0
- package/src/infrastructure/database/repositories/comment-repository-live.ts +39 -0
- package/src/infrastructure/database/repositories/table-repository-live.ts +38 -0
- package/src/infrastructure/database/schema/schema-dependency-sorting.ts +142 -0
- package/src/infrastructure/database/schema/schema-initializer.ts +598 -0
- package/src/infrastructure/database/schema-migration/column-detection.ts +286 -0
- package/src/infrastructure/database/schema-migration/constants.ts +31 -0
- package/src/infrastructure/database/schema-migration/constraint-sync.ts +288 -0
- package/src/infrastructure/database/schema-migration/index-sync.ts +108 -0
- package/src/infrastructure/database/schema-migration/index.ts +66 -0
- package/src/infrastructure/database/schema-migration/migration-statements.ts +106 -0
- package/src/infrastructure/database/schema-migration/rename-detection.ts +87 -0
- package/src/infrastructure/database/schema-migration/table-operations.ts +65 -0
- package/src/infrastructure/database/schema-migration/type-utils.ts +98 -0
- package/src/infrastructure/database/schema-migration/types.ts +14 -0
- package/src/infrastructure/database/schema-migration-helpers.ts +53 -0
- package/src/infrastructure/database/session-context.ts +20 -0
- package/src/infrastructure/database/sql/sql-check-constraints.ts +252 -0
- package/src/infrastructure/database/sql/sql-column-generators.ts +174 -0
- package/src/infrastructure/database/sql/sql-execution.ts +245 -0
- package/src/infrastructure/database/sql/sql-field-predicates.ts +81 -0
- package/src/infrastructure/database/sql/sql-generators.ts +91 -0
- package/src/infrastructure/database/sql/sql-junction-tables.ts +79 -0
- package/src/infrastructure/database/sql/sql-key-constraints.ts +210 -0
- package/src/infrastructure/database/sql/sql-type-mappings.ts +106 -0
- package/src/infrastructure/database/sql/sql-utils.ts +53 -0
- package/src/infrastructure/database/table-live-layers.ts +30 -0
- package/src/infrastructure/database/table-operations/column-generators.ts +82 -0
- package/src/infrastructure/database/table-operations/create-table-sql.ts +81 -0
- package/src/infrastructure/database/table-operations/index.ts +55 -0
- package/src/infrastructure/database/table-operations/migration-utils.ts +157 -0
- package/src/infrastructure/database/table-operations/table-effects.ts +234 -0
- package/src/infrastructure/database/table-operations/table-features.ts +96 -0
- package/src/infrastructure/database/table-operations/type-compatibility.ts +58 -0
- package/src/infrastructure/database/table-operations.ts +47 -0
- package/src/infrastructure/database/table-queries/batch/batch-create.ts +80 -0
- package/src/infrastructure/database/table-queries/batch/batch-delete.ts +212 -0
- package/src/infrastructure/database/table-queries/batch/batch-helpers.ts +124 -0
- package/src/infrastructure/database/table-queries/batch/batch-restore.ts +161 -0
- package/src/infrastructure/database/table-queries/batch/batch-update.ts +146 -0
- package/src/infrastructure/database/table-queries/batch/batch-upsert.ts +357 -0
- package/src/infrastructure/database/table-queries/batch/batch.ts +14 -0
- package/src/infrastructure/database/table-queries/crud/crud-read.ts +351 -0
- package/src/infrastructure/database/table-queries/crud/crud-write.ts +399 -0
- package/src/infrastructure/database/table-queries/crud/crud.ts +16 -0
- package/src/infrastructure/database/table-queries/index.ts +11 -0
- package/src/infrastructure/database/table-queries/mutation-helpers/authorship-helpers.ts +152 -0
- package/src/infrastructure/database/table-queries/mutation-helpers/create-record-helpers.ts +90 -0
- package/src/infrastructure/database/table-queries/mutation-helpers/delete-helpers.ts +163 -0
- package/src/infrastructure/database/table-queries/mutation-helpers/record-fetch-helpers.ts +79 -0
- package/src/infrastructure/database/table-queries/mutation-helpers/update-helpers.ts +74 -0
- package/src/infrastructure/database/table-queries/query-helpers/activity-log-helpers.ts +53 -0
- package/src/infrastructure/database/table-queries/query-helpers/activity-queries.ts +106 -0
- package/src/infrastructure/database/table-queries/query-helpers/aggregation-helpers.ts +314 -0
- package/src/infrastructure/database/table-queries/query-helpers/comment-queries.ts +414 -0
- package/src/infrastructure/database/table-queries/query-helpers/record-validation-queries.ts +126 -0
- package/src/infrastructure/database/table-queries/query-helpers/trash-helpers.ts +58 -0
- package/src/infrastructure/database/table-queries/shared/error-handling.ts +47 -0
- package/src/infrastructure/database/table-queries/shared/typed-execute.ts +27 -0
- package/src/infrastructure/database/table-queries/shared/user-join-helpers.ts +38 -0
- package/src/infrastructure/database/table-queries/shared/validation.ts +39 -0
- package/src/infrastructure/database/views/view-generators.ts +258 -0
- package/src/infrastructure/devtools/devtools-layer.ts +43 -0
- package/src/infrastructure/devtools/index.ts +8 -0
- package/src/infrastructure/email/email-config.ts +103 -0
- package/src/infrastructure/email/email-service.ts +152 -0
- package/src/infrastructure/email/index.ts +107 -0
- package/src/infrastructure/email/nodemailer.ts +125 -0
- package/src/infrastructure/email/templates.ts +244 -0
- package/src/infrastructure/errors/auth-config-required-error.ts +21 -0
- package/src/infrastructure/errors/auth-error.ts +16 -0
- package/src/infrastructure/errors/css-compilation-error.ts +14 -0
- package/src/infrastructure/errors/index.ts +26 -0
- package/src/infrastructure/errors/schema-initialization-error.ts +19 -0
- package/src/infrastructure/errors/server-creation-error.ts +14 -0
- package/src/infrastructure/filesystem/copy-directory.ts +136 -0
- package/src/infrastructure/layers/app-layer.ts +61 -0
- package/src/infrastructure/layers/page-renderer-layer.ts +41 -0
- package/src/infrastructure/logging/index.ts +8 -0
- package/src/infrastructure/logging/logger.ts +204 -0
- package/src/infrastructure/schema/file-loader.ts +53 -0
- package/src/infrastructure/schema/index.ts +15 -0
- package/src/infrastructure/schema/remote-loader.ts +48 -0
- package/src/infrastructure/server/index.ts +26 -0
- package/src/infrastructure/server/language-detection.ts +87 -0
- package/src/infrastructure/server/lifecycle.ts +67 -0
- package/src/infrastructure/server/route-setup/api-routes.ts +310 -0
- package/src/infrastructure/server/route-setup/auth-route-utils.ts +399 -0
- package/src/infrastructure/server/route-setup/auth-routes.ts +245 -0
- package/src/infrastructure/server/route-setup/openapi-routes.ts +45 -0
- package/src/infrastructure/server/route-setup/openapi-schema.ts +120 -0
- package/src/infrastructure/server/route-setup/page-routes.ts +219 -0
- package/src/infrastructure/server/route-setup/static-assets.ts +191 -0
- package/src/infrastructure/server/server-factory-live.ts +45 -0
- package/src/infrastructure/server/server.ts +275 -0
- package/src/infrastructure/server/ssg-adapter.ts +196 -0
- package/src/infrastructure/server/static-site-generator-live.ts +20 -0
- package/src/infrastructure/utils/accept-language-parser.ts +106 -0
- package/src/infrastructure/utils/glob-matcher.ts +50 -0
- package/src/presentation/api/client.ts +114 -0
- package/src/presentation/api/middleware/auth.ts +233 -0
- package/src/presentation/api/middleware/table.ts +155 -0
- package/src/presentation/api/middleware/validation.ts +88 -0
- package/src/presentation/api/routes/activity/get-activity-by-id-handler.ts +77 -0
- package/src/presentation/api/routes/activity/index.ts +28 -0
- package/src/presentation/api/routes/activity.ts +339 -0
- package/src/presentation/api/routes/analytics.ts +328 -0
- package/src/presentation/api/routes/auth.ts +169 -0
- package/src/presentation/api/routes/index.ts +11 -0
- package/src/presentation/api/routes/tables/activity-handlers.ts +57 -0
- package/src/presentation/api/routes/tables/batch-permission-helpers.ts +163 -0
- package/src/presentation/api/routes/tables/batch-routes.ts +355 -0
- package/src/presentation/api/routes/tables/comment-handlers.ts +377 -0
- package/src/presentation/api/routes/tables/create-record-helpers.ts +179 -0
- package/src/presentation/api/routes/tables/effect-runner.ts +58 -0
- package/src/presentation/api/routes/tables/error-handlers.ts +53 -0
- package/src/presentation/api/routes/tables/field-permission-validation.ts +167 -0
- package/src/presentation/api/routes/tables/filter-parser.ts +75 -0
- package/src/presentation/api/routes/tables/formula-parser.ts +118 -0
- package/src/presentation/api/routes/tables/index.ts +113 -0
- package/src/presentation/api/routes/tables/list-records-filter.ts +54 -0
- package/src/presentation/api/routes/tables/param-parsers.ts +59 -0
- package/src/presentation/api/routes/tables/record-handlers.ts +484 -0
- package/src/presentation/api/routes/tables/record-routes.ts +53 -0
- package/src/presentation/api/routes/tables/record-update-handler.ts +200 -0
- package/src/presentation/api/routes/tables/sort-validation.ts +85 -0
- package/src/presentation/api/routes/tables/table-routes.ts +76 -0
- package/src/presentation/api/routes/tables/timezone-validation.ts +41 -0
- package/src/presentation/api/routes/tables/upsert-helpers.ts +471 -0
- package/src/presentation/api/routes/tables/utils.ts +159 -0
- package/src/presentation/api/routes/tables/view-routes.ts +51 -0
- package/src/presentation/api/routes/tables.ts +9 -0
- package/src/presentation/api/utils/context-helpers.ts +43 -0
- package/src/presentation/api/utils/error-sanitizer.ts +235 -0
- package/src/presentation/api/utils/field-permission-validator.ts +53 -0
- package/src/presentation/api/utils/filter-field-validator.ts +90 -0
- package/src/presentation/api/utils/index.ts +13 -0
- package/src/presentation/api/utils/run-effect.ts +94 -0
- package/src/presentation/api/utils/validate-request.ts +89 -0
- package/src/presentation/api/validation/index.ts +29 -0
- package/src/presentation/api/validation/rules/field-rules.ts +158 -0
- package/src/presentation/api/validation/rules/record-rules.ts +73 -0
- package/src/presentation/cli/index.ts +19 -0
- package/src/presentation/cli/schema-loader.ts +172 -0
- package/src/presentation/hooks/use-breakpoint.ts +155 -0
- package/src/presentation/rendering/render-error-pages.tsx +60 -0
- package/src/presentation/rendering/render-homepage.tsx +137 -0
- package/src/presentation/scripts/script-renderers.ts +112 -0
- package/src/presentation/styling/animation-composer.ts +117 -0
- package/src/presentation/styling/index.ts +13 -0
- package/src/presentation/styling/parse-style.ts +243 -0
- package/src/presentation/styling/style-utils.ts +50 -0
- package/src/presentation/styling/theme-colors.ts +53 -0
- package/src/presentation/translations/component-utils.ts +54 -0
- package/src/presentation/translations/index.ts +16 -0
- package/src/presentation/translations/translation-resolver.ts +22 -0
- package/src/presentation/ui/languages/language-switcher.tsx +119 -0
- package/src/presentation/ui/metadata/analytics-builders.tsx +174 -0
- package/src/presentation/ui/metadata/analytics-head.tsx +39 -0
- package/src/presentation/ui/metadata/custom-elements-builders.tsx +157 -0
- package/src/presentation/ui/metadata/extract-component-meta.ts +108 -0
- package/src/presentation/ui/metadata/head-elements.tsx +164 -0
- package/src/presentation/ui/metadata/index.tsx +35 -0
- package/src/presentation/ui/metadata/meta-utils.tsx +42 -0
- package/src/presentation/ui/metadata/open-graph-meta.tsx +57 -0
- package/src/presentation/ui/metadata/structured-data-from-component.tsx +134 -0
- package/src/presentation/ui/metadata/structured-data.tsx +88 -0
- package/src/presentation/ui/metadata/twitter-card-meta.tsx +80 -0
- package/src/presentation/ui/pages/DefaultHomePage.tsx +43 -0
- package/src/presentation/ui/pages/DefaultPageConfigs.ts +220 -0
- package/src/presentation/ui/pages/DynamicPage.tsx +307 -0
- package/src/presentation/ui/pages/ErrorPage.tsx +25 -0
- package/src/presentation/ui/pages/NotFoundPage.tsx +25 -0
- package/src/presentation/ui/pages/PageBodyScripts.tsx +242 -0
- package/src/presentation/ui/pages/PageBodyStyles.ts +52 -0
- package/src/presentation/ui/pages/PageHead.tsx +380 -0
- package/src/presentation/ui/pages/PageLangResolver.ts +58 -0
- package/src/presentation/ui/pages/PageMain.tsx +58 -0
- package/src/presentation/ui/pages/PageMetadata.ts +168 -0
- package/src/presentation/ui/pages/PageMetadataI18n.ts +169 -0
- package/src/presentation/ui/pages/PageScripts.ts +78 -0
- package/src/presentation/ui/pages/SectionRenderer.tsx +67 -0
- package/src/presentation/ui/pages/SectionSpacing.tsx +131 -0
- package/src/presentation/ui/sections/component-renderer.tsx +426 -0
- package/src/presentation/ui/sections/component-renderer.types.ts +33 -0
- package/src/presentation/ui/sections/components/component-reference-handler.tsx +74 -0
- package/src/presentation/ui/sections/components/component-resolution.ts +65 -0
- package/src/presentation/ui/sections/components/index.ts +9 -0
- package/src/presentation/ui/sections/hero.tsx +394 -0
- package/src/presentation/ui/sections/props/component-builder.ts +183 -0
- package/src/presentation/ui/sections/props/element-props.ts +179 -0
- package/src/presentation/ui/sections/props/index.ts +9 -0
- package/src/presentation/ui/sections/props/prop-conversion.ts +171 -0
- package/src/presentation/ui/sections/props/props-builder-config.ts +42 -0
- package/src/presentation/ui/sections/props/props-builder.ts +296 -0
- package/src/presentation/ui/sections/renderers/element-renderers/html-element-renderer.tsx +124 -0
- package/src/presentation/ui/sections/renderers/element-renderers/index.ts +59 -0
- package/src/presentation/ui/sections/renderers/element-renderers/interactive-renderers.tsx +231 -0
- package/src/presentation/ui/sections/renderers/element-renderers/media-renderers.tsx +102 -0
- package/src/presentation/ui/sections/renderers/element-renderers/text-content-renderers.tsx +42 -0
- package/src/presentation/ui/sections/renderers/element-renderers.ts +53 -0
- package/src/presentation/ui/sections/renderers/html-element-helpers.ts +100 -0
- package/src/presentation/ui/sections/renderers/specialized-renderers.tsx +212 -0
- package/src/presentation/ui/sections/rendering/component-dispatch-config.ts +31 -0
- package/src/presentation/ui/sections/rendering/component-registry/index.ts +39 -0
- package/src/presentation/ui/sections/rendering/component-registry/interactive-components.ts +54 -0
- package/src/presentation/ui/sections/rendering/component-registry/media-components.ts +36 -0
- package/src/presentation/ui/sections/rendering/component-registry/special-components.tsx +153 -0
- package/src/presentation/ui/sections/rendering/component-registry/structural-components.ts +215 -0
- package/src/presentation/ui/sections/rendering/component-registry/text-components.ts +57 -0
- package/src/presentation/ui/sections/rendering/component-registry-helpers.tsx +29 -0
- package/src/presentation/ui/sections/rendering/component-registry.tsx +21 -0
- package/src/presentation/ui/sections/rendering/component-type-dispatcher.tsx +33 -0
- package/src/presentation/ui/sections/rendering/index.ts +9 -0
- package/src/presentation/ui/sections/responsive/responsive-children-builder.tsx +96 -0
- package/src/presentation/ui/sections/responsive/responsive-content-builder.tsx +95 -0
- package/src/presentation/ui/sections/responsive/responsive-props-merger.ts +195 -0
- package/src/presentation/ui/sections/responsive/responsive-resolver.ts +213 -0
- package/src/presentation/ui/sections/styling/animation-composer-wrapper.ts +65 -0
- package/src/presentation/ui/sections/styling/class-builders.ts +45 -0
- package/src/presentation/ui/sections/styling/color-resolver.ts +43 -0
- package/src/presentation/ui/sections/styling/hover-interaction-handler.ts +107 -0
- package/src/presentation/ui/sections/styling/index.ts +9 -0
- package/src/presentation/ui/sections/styling/interaction-props-builder.ts +55 -0
- package/src/presentation/ui/sections/styling/shadow-resolver.ts +83 -0
- package/src/presentation/ui/sections/styling/spacing-resolver.ts +104 -0
- package/src/presentation/ui/sections/styling/style-processor.ts +170 -0
- package/src/presentation/ui/sections/styling/theme-tokens.ts +184 -0
- package/src/presentation/ui/sections/translations/i18n-content-resolver.ts +198 -0
- package/src/presentation/ui/sections/translations/index.ts +9 -0
- package/src/presentation/ui/sections/translations/translation-handler.ts +143 -0
- package/src/presentation/ui/sections/translations/variable-substitution.ts +225 -0
- package/src/presentation/ui/sections/utils/time-parser.ts +82 -0
- package/src/presentation/utils/link-attributes.ts +50 -0
- package/src/presentation/utils/string-utils.ts +58 -0
- package/src/presentation/utils/styles.ts +50 -0
- package/tsconfig.json +46 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { z } from 'zod'
|
|
9
|
+
import { paginationSchema, timestampSchema } from './common'
|
|
10
|
+
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Field Schemas
|
|
13
|
+
// ============================================================================
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Base field schema
|
|
17
|
+
*
|
|
18
|
+
* Common properties for all field types.
|
|
19
|
+
*/
|
|
20
|
+
export const baseFieldSchema = z.object({
|
|
21
|
+
id: z.string().describe('Field identifier'),
|
|
22
|
+
name: z.string().describe('Field name'),
|
|
23
|
+
type: z.string().describe('Field type'),
|
|
24
|
+
required: z.boolean().optional().describe('Whether field is required'),
|
|
25
|
+
unique: z.boolean().optional().describe('Whether field must be unique'),
|
|
26
|
+
indexed: z.boolean().optional().describe('Whether field is indexed'),
|
|
27
|
+
description: z.string().optional().describe('Field description'),
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Field value schema (for record data)
|
|
32
|
+
*
|
|
33
|
+
* Represents a value in a record field.
|
|
34
|
+
*/
|
|
35
|
+
export const fieldValueSchema = z.union([
|
|
36
|
+
z.string(),
|
|
37
|
+
z.number(),
|
|
38
|
+
z.boolean(),
|
|
39
|
+
z.null(),
|
|
40
|
+
z.array(z.unknown()),
|
|
41
|
+
z.record(z.string(), z.unknown()),
|
|
42
|
+
])
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Formatted field value schema (for display formatting)
|
|
46
|
+
*
|
|
47
|
+
* When format=display is requested, fields may include both value and displayValue.
|
|
48
|
+
*/
|
|
49
|
+
export const formattedFieldValueSchema = z.union([
|
|
50
|
+
fieldValueSchema,
|
|
51
|
+
z.object({
|
|
52
|
+
value: fieldValueSchema,
|
|
53
|
+
displayValue: z.string().optional(),
|
|
54
|
+
}),
|
|
55
|
+
])
|
|
56
|
+
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// Table Schemas
|
|
59
|
+
// ============================================================================
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Table schema
|
|
63
|
+
*
|
|
64
|
+
* Represents a table definition in API responses.
|
|
65
|
+
*/
|
|
66
|
+
export const tableSchema = z
|
|
67
|
+
.object({
|
|
68
|
+
id: z.string().describe('Table identifier'),
|
|
69
|
+
name: z.string().describe('Table name'),
|
|
70
|
+
description: z.string().optional().describe('Table description'),
|
|
71
|
+
fields: z.array(baseFieldSchema).describe('Table fields'),
|
|
72
|
+
primaryKey: z.string().optional().describe('Primary key field'),
|
|
73
|
+
views: z.array(z.unknown()).describe('Table views'),
|
|
74
|
+
permissions: z
|
|
75
|
+
.object({
|
|
76
|
+
read: z
|
|
77
|
+
.union([z.array(z.string()).readonly(), z.literal('all'), z.literal('authenticated')])
|
|
78
|
+
.optional(),
|
|
79
|
+
create: z
|
|
80
|
+
.union([z.array(z.string()).readonly(), z.literal('all'), z.literal('authenticated')])
|
|
81
|
+
.optional(),
|
|
82
|
+
update: z
|
|
83
|
+
.union([z.array(z.string()).readonly(), z.literal('all'), z.literal('authenticated')])
|
|
84
|
+
.optional(),
|
|
85
|
+
delete: z
|
|
86
|
+
.union([z.array(z.string()).readonly(), z.literal('all'), z.literal('authenticated')])
|
|
87
|
+
.optional(),
|
|
88
|
+
})
|
|
89
|
+
.optional()
|
|
90
|
+
.describe('Table permissions'),
|
|
91
|
+
})
|
|
92
|
+
.extend(timestampSchema.shape)
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Table summary schema (for list endpoints)
|
|
96
|
+
*/
|
|
97
|
+
export const tableSummarySchema = z
|
|
98
|
+
.object({
|
|
99
|
+
id: z.string().describe('Table identifier'),
|
|
100
|
+
name: z.string().describe('Table name'),
|
|
101
|
+
description: z.string().optional().describe('Table description'),
|
|
102
|
+
fieldCount: z.number().describe('Number of fields'),
|
|
103
|
+
recordCount: z.number().optional().describe('Number of records'),
|
|
104
|
+
})
|
|
105
|
+
.extend(timestampSchema.shape)
|
|
106
|
+
|
|
107
|
+
// ============================================================================
|
|
108
|
+
// Record Schemas
|
|
109
|
+
// ============================================================================
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Record schema (Airtable-style)
|
|
113
|
+
*
|
|
114
|
+
* Represents a record in a table.
|
|
115
|
+
* User-defined fields are nested under the `fields` property.
|
|
116
|
+
* System fields (id, createdAt, updatedAt) remain at root level.
|
|
117
|
+
*/
|
|
118
|
+
/**
|
|
119
|
+
* User reference schema for authorship fields
|
|
120
|
+
*/
|
|
121
|
+
export const userRefSchema = z.object({
|
|
122
|
+
id: z.string().describe('User identifier'),
|
|
123
|
+
name: z.string().optional().describe('User display name'),
|
|
124
|
+
email: z.string().optional().describe('User email address'),
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
export const recordSchema = z
|
|
128
|
+
.object({
|
|
129
|
+
id: z.union([z.string(), z.number()]).describe('Record identifier'),
|
|
130
|
+
fields: z
|
|
131
|
+
.record(z.string(), formattedFieldValueSchema)
|
|
132
|
+
.describe('User-defined field values (may include display formatting)'),
|
|
133
|
+
createdBy: z.string().optional().describe('User who created the record'),
|
|
134
|
+
updatedBy: z.string().optional().describe('User who last updated the record'),
|
|
135
|
+
deletedBy: userRefSchema.optional().describe('User who deleted the record'),
|
|
136
|
+
})
|
|
137
|
+
.extend(timestampSchema.shape)
|
|
138
|
+
|
|
139
|
+
// ============================================================================
|
|
140
|
+
// Table API Response Schemas
|
|
141
|
+
// ============================================================================
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* List tables response schema
|
|
145
|
+
*/
|
|
146
|
+
export const listTablesResponseSchema = z.object({
|
|
147
|
+
tables: z.array(tableSummarySchema).describe('List of tables'),
|
|
148
|
+
pagination: paginationSchema.optional().describe('Pagination metadata'),
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Get table response schema
|
|
153
|
+
*/
|
|
154
|
+
export const getTableResponseSchema = z.object({
|
|
155
|
+
table: tableSchema.describe('Table details'),
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Create table response schema
|
|
160
|
+
*/
|
|
161
|
+
export const createTableResponseSchema = z.object({
|
|
162
|
+
table: tableSchema.describe('Created table'),
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Update table response schema
|
|
167
|
+
*/
|
|
168
|
+
export const updateTableResponseSchema = z.object({
|
|
169
|
+
table: tableSchema.describe('Updated table'),
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Delete table response schema
|
|
174
|
+
*/
|
|
175
|
+
export const deleteTableResponseSchema = z.object({
|
|
176
|
+
success: z.literal(true).describe('Table deleted'),
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
// ============================================================================
|
|
180
|
+
// Record API Response Schemas
|
|
181
|
+
// ============================================================================
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* List records response schema
|
|
185
|
+
*/
|
|
186
|
+
export const listRecordsResponseSchema = z.object({
|
|
187
|
+
records: z.array(recordSchema).describe('List of records'),
|
|
188
|
+
pagination: paginationSchema.optional().describe('Pagination metadata'),
|
|
189
|
+
aggregations: z
|
|
190
|
+
.object({
|
|
191
|
+
count: z.string().optional().describe('Total count of records'),
|
|
192
|
+
sum: z.record(z.string(), z.number()).optional().describe('Sum aggregations by field'),
|
|
193
|
+
avg: z.record(z.string(), z.number()).optional().describe('Average aggregations by field'),
|
|
194
|
+
min: z.record(z.string(), z.number()).optional().describe('Minimum aggregations by field'),
|
|
195
|
+
max: z.record(z.string(), z.number()).optional().describe('Maximum aggregations by field'),
|
|
196
|
+
})
|
|
197
|
+
.optional()
|
|
198
|
+
.describe('Aggregation results'),
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Get record response schema
|
|
203
|
+
*
|
|
204
|
+
* Returns record in flattened format (id, fields, timestamps, authorship at root level)
|
|
205
|
+
* to match test expectations and provide consistent API response structure.
|
|
206
|
+
*/
|
|
207
|
+
export const getRecordResponseSchema = z
|
|
208
|
+
.object({
|
|
209
|
+
id: z.union([z.string(), z.number()]).describe('Record identifier'),
|
|
210
|
+
fields: z
|
|
211
|
+
.record(z.string(), formattedFieldValueSchema)
|
|
212
|
+
.describe('User-defined field values (may include display formatting)'),
|
|
213
|
+
createdBy: z.string().optional().describe('User who created the record'),
|
|
214
|
+
updatedBy: z.string().optional().describe('User who last updated the record'),
|
|
215
|
+
deletedBy: userRefSchema.optional().describe('User who deleted the record'),
|
|
216
|
+
})
|
|
217
|
+
.extend(timestampSchema.shape)
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Create record response schema
|
|
221
|
+
*
|
|
222
|
+
* Returns record in flattened format (id, fields, timestamps at root level)
|
|
223
|
+
* to match test expectations and provide consistent API response structure.
|
|
224
|
+
*/
|
|
225
|
+
export const createRecordResponseSchema = z
|
|
226
|
+
.object({
|
|
227
|
+
id: z.string().describe('Record identifier'),
|
|
228
|
+
fields: z.record(z.string(), fieldValueSchema).describe('User-defined field values'),
|
|
229
|
+
createdBy: z.string().optional().describe('User who created the record'),
|
|
230
|
+
updatedBy: z.string().optional().describe('User who last updated the record'),
|
|
231
|
+
})
|
|
232
|
+
.extend(timestampSchema.shape)
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Update record response schema
|
|
236
|
+
*/
|
|
237
|
+
export const updateRecordResponseSchema = z.object({
|
|
238
|
+
record: recordSchema.describe('Updated record'),
|
|
239
|
+
})
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Delete record response schema
|
|
243
|
+
*/
|
|
244
|
+
export const deleteRecordResponseSchema = z.object({
|
|
245
|
+
success: z.literal(true).describe('Record deleted'),
|
|
246
|
+
})
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Restore record response schema
|
|
250
|
+
*/
|
|
251
|
+
export const restoreRecordResponseSchema = z.object({
|
|
252
|
+
success: z.literal(true).describe('Record restored'),
|
|
253
|
+
record: recordSchema.describe('Restored record'),
|
|
254
|
+
})
|
|
255
|
+
|
|
256
|
+
// ============================================================================
|
|
257
|
+
// Batch Operation Schemas
|
|
258
|
+
// ============================================================================
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Batch create records response schema
|
|
262
|
+
*/
|
|
263
|
+
export const batchCreateRecordsResponseSchema = z.object({
|
|
264
|
+
created: z.number().describe('Number of records created'),
|
|
265
|
+
records: z
|
|
266
|
+
.array(recordSchema)
|
|
267
|
+
.optional()
|
|
268
|
+
.describe('Created records (only if returnRecords=true)'),
|
|
269
|
+
})
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Batch update records response schema
|
|
273
|
+
*/
|
|
274
|
+
export const batchUpdateRecordsResponseSchema = z.object({
|
|
275
|
+
updated: z.number().describe('Number of records updated'),
|
|
276
|
+
records: z
|
|
277
|
+
.array(recordSchema)
|
|
278
|
+
.optional()
|
|
279
|
+
.describe('Updated records (only if returnRecords=true)'),
|
|
280
|
+
})
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Batch delete records response schema
|
|
284
|
+
*/
|
|
285
|
+
export const batchDeleteRecordsResponseSchema = z.object({
|
|
286
|
+
deleted: z.number().describe('Number of records deleted'),
|
|
287
|
+
})
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Batch restore records response schema
|
|
291
|
+
*/
|
|
292
|
+
export const batchRestoreRecordsResponseSchema = z.object({
|
|
293
|
+
success: z.literal(true).describe('Batch restore succeeded'),
|
|
294
|
+
restored: z.number().describe('Number of records restored'),
|
|
295
|
+
})
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Upsert records response schema
|
|
299
|
+
*/
|
|
300
|
+
export const upsertRecordsResponseSchema = z.object({
|
|
301
|
+
records: z.array(recordSchema).describe('Upserted records'),
|
|
302
|
+
created: z.number().describe('Number of records created'),
|
|
303
|
+
updated: z.number().describe('Number of records updated'),
|
|
304
|
+
})
|
|
305
|
+
|
|
306
|
+
// ============================================================================
|
|
307
|
+
// View Schemas
|
|
308
|
+
// ============================================================================
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* View schema
|
|
312
|
+
*/
|
|
313
|
+
export const viewSchema = z
|
|
314
|
+
.object({
|
|
315
|
+
id: z.string().describe('View identifier'),
|
|
316
|
+
name: z.string().describe('View name'),
|
|
317
|
+
tableId: z.string().describe('Parent table ID'),
|
|
318
|
+
fields: z.array(z.string()).optional().describe('Visible field IDs'),
|
|
319
|
+
filters: z.array(z.unknown()).optional().describe('View filters'),
|
|
320
|
+
sorts: z.array(z.unknown()).optional().describe('View sorts'),
|
|
321
|
+
groupBy: z.string().optional().describe('Group by field'),
|
|
322
|
+
})
|
|
323
|
+
.extend(timestampSchema.shape)
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* List views response schema
|
|
327
|
+
*/
|
|
328
|
+
export const listViewsResponseSchema = z.object({
|
|
329
|
+
views: z.array(viewSchema).describe('List of views'),
|
|
330
|
+
})
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Get view response schema
|
|
334
|
+
* Returns view properties directly at root level
|
|
335
|
+
*/
|
|
336
|
+
export const getViewResponseSchema = z.object({
|
|
337
|
+
id: z.string().describe('View identifier'),
|
|
338
|
+
name: z.string().describe('View name'),
|
|
339
|
+
filters: z
|
|
340
|
+
.object({
|
|
341
|
+
and: z
|
|
342
|
+
.array(
|
|
343
|
+
z.object({
|
|
344
|
+
field: z.string(),
|
|
345
|
+
operator: z.string(),
|
|
346
|
+
value: z.unknown(),
|
|
347
|
+
})
|
|
348
|
+
)
|
|
349
|
+
.optional(),
|
|
350
|
+
or: z
|
|
351
|
+
.array(
|
|
352
|
+
z.object({
|
|
353
|
+
field: z.string(),
|
|
354
|
+
operator: z.string(),
|
|
355
|
+
value: z.unknown(),
|
|
356
|
+
})
|
|
357
|
+
)
|
|
358
|
+
.optional(),
|
|
359
|
+
})
|
|
360
|
+
.optional()
|
|
361
|
+
.describe('View filters'),
|
|
362
|
+
sorts: z
|
|
363
|
+
.array(
|
|
364
|
+
z.object({
|
|
365
|
+
field: z.string(),
|
|
366
|
+
direction: z.enum(['asc', 'desc']),
|
|
367
|
+
})
|
|
368
|
+
)
|
|
369
|
+
.optional()
|
|
370
|
+
.describe('View sorts'),
|
|
371
|
+
fields: z.array(z.string()).optional().describe('Visible field names'),
|
|
372
|
+
groupBy: z
|
|
373
|
+
.object({
|
|
374
|
+
field: z.string(),
|
|
375
|
+
direction: z.enum(['asc', 'desc']).optional(),
|
|
376
|
+
})
|
|
377
|
+
.optional()
|
|
378
|
+
.describe('Group by configuration'),
|
|
379
|
+
isDefault: z.boolean().optional().describe('Whether this is the default view'),
|
|
380
|
+
})
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Get view records response schema
|
|
384
|
+
*/
|
|
385
|
+
export const getViewRecordsResponseSchema = z.object({
|
|
386
|
+
records: z.array(recordSchema).describe('Records matching view'),
|
|
387
|
+
pagination: paginationSchema.optional().describe('Pagination metadata'),
|
|
388
|
+
})
|
|
389
|
+
|
|
390
|
+
// ============================================================================
|
|
391
|
+
// Permission Schemas
|
|
392
|
+
// ============================================================================
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Table permission schema
|
|
396
|
+
*/
|
|
397
|
+
export const tablePermissionSchema = z.object({
|
|
398
|
+
read: z.boolean().describe('Can read records'),
|
|
399
|
+
create: z.boolean().describe('Can create records'),
|
|
400
|
+
update: z.boolean().describe('Can update records'),
|
|
401
|
+
delete: z.boolean().describe('Can delete records'),
|
|
402
|
+
manage: z.boolean().describe('Can manage table schema'),
|
|
403
|
+
})
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Field permission schema
|
|
407
|
+
*/
|
|
408
|
+
export const fieldPermissionSchema = z.object({
|
|
409
|
+
read: z.boolean().describe('Can read field'),
|
|
410
|
+
write: z.boolean().describe('Can write field'),
|
|
411
|
+
})
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Get table permissions response schema
|
|
415
|
+
*/
|
|
416
|
+
export const getTablePermissionsResponseSchema = z.object({
|
|
417
|
+
table: z
|
|
418
|
+
.object({
|
|
419
|
+
read: z.boolean().describe('Can read records'),
|
|
420
|
+
create: z.boolean().describe('Can create records'),
|
|
421
|
+
update: z.boolean().describe('Can update records'),
|
|
422
|
+
delete: z.boolean().describe('Can delete records'),
|
|
423
|
+
})
|
|
424
|
+
.describe('Table-level permissions'),
|
|
425
|
+
fields: z.record(z.string(), fieldPermissionSchema).describe('Field-level permissions'),
|
|
426
|
+
})
|
|
427
|
+
|
|
428
|
+
// ============================================================================
|
|
429
|
+
// TypeScript Types
|
|
430
|
+
// ============================================================================
|
|
431
|
+
|
|
432
|
+
export type BaseField = z.infer<typeof baseFieldSchema>
|
|
433
|
+
export type FieldValue = z.infer<typeof fieldValueSchema>
|
|
434
|
+
export type Table = z.infer<typeof tableSchema>
|
|
435
|
+
export type TableSummary = z.infer<typeof tableSummarySchema>
|
|
436
|
+
export type Record = z.infer<typeof recordSchema>
|
|
437
|
+
export type View = z.infer<typeof viewSchema>
|
|
438
|
+
export type TablePermission = z.infer<typeof tablePermissionSchema>
|
|
439
|
+
export type ListTablesResponse = z.infer<typeof listTablesResponseSchema>
|
|
440
|
+
export type GetTableResponse = z.infer<typeof getTableResponseSchema>
|
|
441
|
+
export type ListRecordsResponse = z.infer<typeof listRecordsResponseSchema>
|
|
442
|
+
export type GetRecordResponse = z.infer<typeof getRecordResponseSchema>
|
|
443
|
+
export type RestoreRecordResponse = z.infer<typeof restoreRecordResponseSchema>
|
|
444
|
+
export type BatchRestoreRecordsResponse = z.infer<typeof batchRestoreRecordsResponseSchema>
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Schema } from 'effect'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Built-in Analytics Configuration Schema
|
|
12
|
+
*
|
|
13
|
+
* Configures the first-party, privacy-friendly analytics engine.
|
|
14
|
+
* When this property exists in the app config, analytics is enabled.
|
|
15
|
+
* When omitted, no analytics endpoints are available.
|
|
16
|
+
*
|
|
17
|
+
* Configuration forms:
|
|
18
|
+
* - `true` — Enable analytics with all defaults
|
|
19
|
+
* - `false` — Explicitly disable analytics
|
|
20
|
+
* - `{ ... }` — Enable analytics with custom options
|
|
21
|
+
*
|
|
22
|
+
* Design principles:
|
|
23
|
+
* - No cookies (visitor hashing via SHA-256)
|
|
24
|
+
* - No external dependencies
|
|
25
|
+
* - GDPR-friendly by default (respectDoNotTrack: true)
|
|
26
|
+
* - Configurable data retention
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* // Enable with all defaults
|
|
31
|
+
* true
|
|
32
|
+
*
|
|
33
|
+
* // Explicitly disabled
|
|
34
|
+
* false
|
|
35
|
+
*
|
|
36
|
+
* // Custom retention and excluded paths
|
|
37
|
+
* {
|
|
38
|
+
* retentionDays: 90,
|
|
39
|
+
* excludedPaths: ['/admin/*', '/api/*'],
|
|
40
|
+
* sessionTimeout: 15
|
|
41
|
+
* }
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export const BuiltInAnalyticsSchema = Schema.Union(
|
|
45
|
+
Schema.Boolean,
|
|
46
|
+
Schema.Struct({
|
|
47
|
+
/**
|
|
48
|
+
* Number of days to retain analytics data (optional).
|
|
49
|
+
*
|
|
50
|
+
* Must be between 1 and 730 days (2 years).
|
|
51
|
+
* Defaults to 365 days. Data older than this is automatically purged.
|
|
52
|
+
*/
|
|
53
|
+
retentionDays: Schema.optional(
|
|
54
|
+
Schema.Number.pipe(
|
|
55
|
+
Schema.int(),
|
|
56
|
+
Schema.between(1, 730),
|
|
57
|
+
Schema.annotations({
|
|
58
|
+
title: 'Retention Days',
|
|
59
|
+
description: 'Number of days to retain analytics data (1-730)',
|
|
60
|
+
})
|
|
61
|
+
)
|
|
62
|
+
),
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* URL path patterns to exclude from tracking (optional).
|
|
66
|
+
*
|
|
67
|
+
* Glob patterns matching page paths that should not be tracked.
|
|
68
|
+
* Useful for excluding admin pages, API docs, or internal routes.
|
|
69
|
+
*/
|
|
70
|
+
excludedPaths: Schema.optional(
|
|
71
|
+
Schema.Array(Schema.String).pipe(
|
|
72
|
+
Schema.annotations({
|
|
73
|
+
title: 'Excluded Paths',
|
|
74
|
+
description: 'Glob patterns for paths excluded from tracking',
|
|
75
|
+
})
|
|
76
|
+
)
|
|
77
|
+
),
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Whether to honor the Do Not Track browser setting (optional).
|
|
81
|
+
*
|
|
82
|
+
* When true, visitors with DNT:1 header will not be tracked.
|
|
83
|
+
* Defaults to true for privacy compliance.
|
|
84
|
+
*/
|
|
85
|
+
respectDoNotTrack: Schema.optional(Schema.Boolean),
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Session timeout in minutes (optional).
|
|
89
|
+
*
|
|
90
|
+
* Time of inactivity before a new session is created.
|
|
91
|
+
* Must be between 1 and 120 minutes. Defaults to 30 minutes.
|
|
92
|
+
*/
|
|
93
|
+
sessionTimeout: Schema.optional(
|
|
94
|
+
Schema.Number.pipe(
|
|
95
|
+
Schema.int(),
|
|
96
|
+
Schema.between(1, 120),
|
|
97
|
+
Schema.annotations({
|
|
98
|
+
title: 'Session Timeout',
|
|
99
|
+
description: 'Session timeout in minutes (1-120)',
|
|
100
|
+
})
|
|
101
|
+
)
|
|
102
|
+
),
|
|
103
|
+
})
|
|
104
|
+
).pipe(
|
|
105
|
+
Schema.annotations({
|
|
106
|
+
title: 'Built-in Analytics Configuration',
|
|
107
|
+
description:
|
|
108
|
+
'First-party, privacy-friendly analytics engine. No cookies, no external dependencies, GDPR-compliant.',
|
|
109
|
+
examples: [
|
|
110
|
+
true,
|
|
111
|
+
{
|
|
112
|
+
retentionDays: 90,
|
|
113
|
+
excludedPaths: ['/admin/*', '/api/*'],
|
|
114
|
+
sessionTimeout: 15,
|
|
115
|
+
},
|
|
116
|
+
false,
|
|
117
|
+
],
|
|
118
|
+
})
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* TypeScript type inferred from BuiltInAnalyticsSchema
|
|
123
|
+
*/
|
|
124
|
+
export type BuiltInAnalytics = Schema.Schema.Type<typeof BuiltInAnalyticsSchema>
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Encoded type of BuiltInAnalyticsSchema (what goes in before validation)
|
|
128
|
+
*/
|
|
129
|
+
export type BuiltInAnalyticsEncoded = Schema.Schema.Encoded<typeof BuiltInAnalyticsSchema>
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Schema } from 'effect'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Auth Email Template Schema
|
|
12
|
+
*
|
|
13
|
+
* Configuration for a single authentication email template.
|
|
14
|
+
* Templates support variable substitution using $variable syntax.
|
|
15
|
+
*
|
|
16
|
+
* Available variables depend on the email type:
|
|
17
|
+
* - $url: Link URL (verification, password reset, magic link)
|
|
18
|
+
* - $name: User's name
|
|
19
|
+
* - $email: User's email address
|
|
20
|
+
* - $code: OTP code (for email-otp)
|
|
21
|
+
* - $organizationName: Organization name (for invitations)
|
|
22
|
+
* - $inviterName: Name of person who sent invitation
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* {
|
|
27
|
+
* subject: 'Reset your password',
|
|
28
|
+
* text: 'Click the link to reset your password: $url'
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export const AuthEmailTemplateSchema = Schema.Struct({
|
|
33
|
+
/** Email subject line (can include $variables) */
|
|
34
|
+
subject: Schema.String.pipe(
|
|
35
|
+
Schema.annotations({ description: 'Email subject line with optional $variable substitution' })
|
|
36
|
+
),
|
|
37
|
+
/** Plain text email body (can include $variables) */
|
|
38
|
+
text: Schema.optional(
|
|
39
|
+
Schema.String.pipe(
|
|
40
|
+
Schema.annotations({
|
|
41
|
+
description: 'Plain text email body with optional $variable substitution',
|
|
42
|
+
})
|
|
43
|
+
)
|
|
44
|
+
),
|
|
45
|
+
/** HTML email body (can include $variables) */
|
|
46
|
+
html: Schema.optional(
|
|
47
|
+
Schema.String.pipe(
|
|
48
|
+
Schema.annotations({ description: 'HTML email body with optional $variable substitution' })
|
|
49
|
+
)
|
|
50
|
+
),
|
|
51
|
+
}).pipe(
|
|
52
|
+
Schema.annotations({
|
|
53
|
+
title: 'Auth Email Template',
|
|
54
|
+
description: 'Email template configuration with subject and body content',
|
|
55
|
+
examples: [
|
|
56
|
+
{ subject: 'Verify your email', text: 'Click here to verify: $url' },
|
|
57
|
+
{
|
|
58
|
+
subject: 'Reset your password',
|
|
59
|
+
text: 'Click the link to reset your password: $url',
|
|
60
|
+
html: '<p>Click <a href="$url">here</a> to reset your password.</p>',
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
})
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
export type AuthEmailTemplate = Schema.Schema.Type<typeof AuthEmailTemplateSchema>
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Auth Email Templates Schema
|
|
70
|
+
*
|
|
71
|
+
* All available email templates for authentication flows.
|
|
72
|
+
* Each template is optional - Better Auth provides sensible defaults.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* {
|
|
77
|
+
* verification: {
|
|
78
|
+
* subject: 'Verify your email for MyApp',
|
|
79
|
+
* text: 'Hi $name, click here to verify your email: $url'
|
|
80
|
+
* },
|
|
81
|
+
* resetPassword: {
|
|
82
|
+
* subject: 'Reset your password',
|
|
83
|
+
* text: 'Click the link to reset your password: $url'
|
|
84
|
+
* }
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export const AuthEmailTemplatesSchema = Schema.Struct({
|
|
89
|
+
/** Email verification after signup */
|
|
90
|
+
verification: Schema.optional(AuthEmailTemplateSchema),
|
|
91
|
+
/** Password reset email */
|
|
92
|
+
resetPassword: Schema.optional(AuthEmailTemplateSchema),
|
|
93
|
+
/** Magic link login email */
|
|
94
|
+
magicLink: Schema.optional(AuthEmailTemplateSchema),
|
|
95
|
+
/** Email OTP code email */
|
|
96
|
+
emailOtp: Schema.optional(AuthEmailTemplateSchema),
|
|
97
|
+
/** Two-factor authentication backup codes email */
|
|
98
|
+
twoFactorBackupCodes: Schema.optional(AuthEmailTemplateSchema),
|
|
99
|
+
/** Welcome email after verification */
|
|
100
|
+
welcome: Schema.optional(AuthEmailTemplateSchema),
|
|
101
|
+
/** Account deletion confirmation email */
|
|
102
|
+
accountDeletion: Schema.optional(AuthEmailTemplateSchema),
|
|
103
|
+
}).pipe(
|
|
104
|
+
Schema.annotations({
|
|
105
|
+
title: 'Auth Email Templates',
|
|
106
|
+
description: 'Templates for all authentication-related emails',
|
|
107
|
+
examples: [
|
|
108
|
+
{
|
|
109
|
+
verification: { subject: 'Verify your email', text: 'Click to verify: $url' },
|
|
110
|
+
resetPassword: { subject: 'Reset your password', text: 'Reset link: $url' },
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
})
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
export type AuthEmailTemplates = Schema.Schema.Type<typeof AuthEmailTemplatesSchema>
|