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,230 @@
|
|
|
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
|
+
import { AuthEmailTemplatesSchema } from './config'
|
|
10
|
+
import { TwoFactorConfigSchema } from './plugins/two-factor'
|
|
11
|
+
import { DefaultRoleSchema, RolesConfigSchema } from './roles'
|
|
12
|
+
import { AuthStrategiesSchema, type AuthStrategy } from './strategies'
|
|
13
|
+
|
|
14
|
+
// Re-export all auth-related schemas and types for convenient imports
|
|
15
|
+
export * from './config'
|
|
16
|
+
export * from './methods/email-and-password'
|
|
17
|
+
export * from './methods/magic-link'
|
|
18
|
+
export * from './oauth'
|
|
19
|
+
export * from './plugins/admin'
|
|
20
|
+
export * from './plugins/two-factor'
|
|
21
|
+
export * from './roles'
|
|
22
|
+
export * from './strategies'
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Strategy type names
|
|
26
|
+
*/
|
|
27
|
+
type StrategyType = 'emailAndPassword' | 'magicLink' | 'oauth'
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Check if a specific strategy type is present in the strategies array
|
|
31
|
+
*/
|
|
32
|
+
export const hasStrategy = (auth: Auth | undefined, strategyType: StrategyType): boolean => {
|
|
33
|
+
if (!auth?.strategies) return false
|
|
34
|
+
return auth.strategies.some((s) => s.type === strategyType)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Get a specific strategy configuration by type
|
|
39
|
+
*/
|
|
40
|
+
export const getStrategy = <T extends StrategyType>(
|
|
41
|
+
auth: Auth | undefined,
|
|
42
|
+
strategyType: T
|
|
43
|
+
): Extract<AuthStrategy, { readonly type: T }> | undefined => {
|
|
44
|
+
if (!auth?.strategies) return undefined
|
|
45
|
+
return auth.strategies.find((s) => s.type === strategyType) as
|
|
46
|
+
| Extract<AuthStrategy, { readonly type: T }>
|
|
47
|
+
| undefined
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Get all strategy type names that are enabled
|
|
52
|
+
*/
|
|
53
|
+
export const getEnabledStrategies = (auth: Auth | undefined): readonly StrategyType[] => {
|
|
54
|
+
if (!auth?.strategies) return []
|
|
55
|
+
return auth.strategies.map((s) => s.type)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Legacy aliases for backward compatibility during migration
|
|
59
|
+
export const isMethodEnabled = (auth: Auth | undefined, method: StrategyType): boolean =>
|
|
60
|
+
hasStrategy(auth, method)
|
|
61
|
+
|
|
62
|
+
export const getEnabledMethods = (auth: Auth | undefined): readonly StrategyType[] =>
|
|
63
|
+
getEnabledStrategies(auth)
|
|
64
|
+
|
|
65
|
+
export const hasAnyMethodEnabled = (auth: Auth | undefined): boolean =>
|
|
66
|
+
(auth?.strategies?.length ?? 0) > 0
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Authentication Configuration Schema
|
|
70
|
+
*
|
|
71
|
+
* Comprehensive authentication configuration supporting all Better Auth features.
|
|
72
|
+
* If this config exists, authentication is enabled.
|
|
73
|
+
* If omitted from the app config, no auth endpoints are available.
|
|
74
|
+
*
|
|
75
|
+
* Admin features (user management, role assignment, impersonation) are always
|
|
76
|
+
* enabled when auth is configured — no separate toggle needed.
|
|
77
|
+
*
|
|
78
|
+
* Infrastructure configuration (secrets, URLs, credentials) is handled via
|
|
79
|
+
* environment variables, not in this schema. See .env.example for details.
|
|
80
|
+
*
|
|
81
|
+
* Structure:
|
|
82
|
+
* - strategies: Array of authentication strategy objects (required, at least one)
|
|
83
|
+
* - roles: Custom role definitions with hierarchy (optional)
|
|
84
|
+
* - defaultRole: Role assigned to new users (optional, defaults to 'member')
|
|
85
|
+
* - twoFactor: TOTP-based two-factor authentication (optional)
|
|
86
|
+
* - emailTemplates: Custom email templates (optional)
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```typescript
|
|
90
|
+
* // Minimal
|
|
91
|
+
* { strategies: [{ type: 'emailAndPassword' }] }
|
|
92
|
+
*
|
|
93
|
+
* // With custom roles and defaultRole
|
|
94
|
+
* {
|
|
95
|
+
* strategies: [{ type: 'emailAndPassword', minPasswordLength: 12 }],
|
|
96
|
+
* defaultRole: 'viewer',
|
|
97
|
+
* roles: [{ name: 'editor', description: 'Can edit content', level: 30 }]
|
|
98
|
+
* }
|
|
99
|
+
*
|
|
100
|
+
* // Multiple strategies
|
|
101
|
+
* {
|
|
102
|
+
* strategies: [
|
|
103
|
+
* { type: 'emailAndPassword' },
|
|
104
|
+
* { type: 'oauth', providers: ['google', 'github'] }
|
|
105
|
+
* ]
|
|
106
|
+
* }
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export const AuthSchema = Schema.Struct({
|
|
110
|
+
// ============================================================================
|
|
111
|
+
// Authentication Strategies (required)
|
|
112
|
+
// ============================================================================
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Array of authentication strategies.
|
|
116
|
+
* At least one strategy must be defined. No duplicate types allowed.
|
|
117
|
+
*/
|
|
118
|
+
strategies: AuthStrategiesSchema,
|
|
119
|
+
|
|
120
|
+
// ============================================================================
|
|
121
|
+
// Role Configuration (optional)
|
|
122
|
+
// ============================================================================
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Custom role definitions (optional)
|
|
126
|
+
*
|
|
127
|
+
* Define additional roles beyond the built-in ones (admin, member, viewer).
|
|
128
|
+
* Empty array means only built-in roles are available.
|
|
129
|
+
*/
|
|
130
|
+
roles: Schema.optional(RolesConfigSchema),
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Default role for new users (optional)
|
|
134
|
+
*
|
|
135
|
+
* Role assigned to users on registration. Defaults to 'member'.
|
|
136
|
+
* Must reference a built-in role or a custom role name.
|
|
137
|
+
*/
|
|
138
|
+
defaultRole: Schema.optional(DefaultRoleSchema),
|
|
139
|
+
|
|
140
|
+
// ============================================================================
|
|
141
|
+
// Feature Extensions (optional)
|
|
142
|
+
// ============================================================================
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Two-factor authentication plugin configuration (optional)
|
|
146
|
+
*
|
|
147
|
+
* Enable TOTP-based two-factor authentication. Users can set up 2FA
|
|
148
|
+
* using authenticator apps. Requires emailAndPassword strategy.
|
|
149
|
+
*/
|
|
150
|
+
twoFactor: Schema.optional(TwoFactorConfigSchema),
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Email templates for authentication flows (optional)
|
|
154
|
+
*
|
|
155
|
+
* Customize the subject and content of emails sent during authentication.
|
|
156
|
+
* Templates support variable substitution using $variable syntax.
|
|
157
|
+
*/
|
|
158
|
+
emailTemplates: Schema.optional(AuthEmailTemplatesSchema),
|
|
159
|
+
}).pipe(
|
|
160
|
+
Schema.filter((config) => {
|
|
161
|
+
// Validate two-factor requires emailAndPassword strategy
|
|
162
|
+
if (config.twoFactor) {
|
|
163
|
+
const hasEmailPassword = config.strategies.some((s) => s.type === 'emailAndPassword')
|
|
164
|
+
if (!hasEmailPassword) {
|
|
165
|
+
return 'Two-factor authentication requires emailAndPassword strategy'
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Validate defaultRole references a defined role (if custom role name)
|
|
170
|
+
if (config.defaultRole && config.roles) {
|
|
171
|
+
const builtInRoles = ['admin', 'member', 'viewer']
|
|
172
|
+
const customRoleNames = config.roles.map((r) => r.name)
|
|
173
|
+
const allValidRoles = [...builtInRoles, ...customRoleNames]
|
|
174
|
+
if (!allValidRoles.includes(config.defaultRole)) {
|
|
175
|
+
return `Default role '${config.defaultRole}' is not a built-in role or defined in auth.roles`
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return undefined
|
|
180
|
+
}),
|
|
181
|
+
Schema.annotations({
|
|
182
|
+
title: 'Authentication Configuration',
|
|
183
|
+
description:
|
|
184
|
+
'Authentication configuration with strategies, roles, and plugins. Admin features are always enabled when auth is configured.',
|
|
185
|
+
examples: [
|
|
186
|
+
{ strategies: [{ type: 'emailAndPassword' as const }] },
|
|
187
|
+
{
|
|
188
|
+
strategies: [{ type: 'emailAndPassword' as const, minPasswordLength: 12 }],
|
|
189
|
+
defaultRole: 'viewer',
|
|
190
|
+
roles: [{ name: 'editor', description: 'Can edit content', level: 30 }],
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
strategies: [
|
|
194
|
+
{ type: 'emailAndPassword' as const },
|
|
195
|
+
{ type: 'oauth' as const, providers: ['google', 'github'] },
|
|
196
|
+
],
|
|
197
|
+
},
|
|
198
|
+
],
|
|
199
|
+
})
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* TypeScript type inferred from AuthSchema
|
|
204
|
+
*/
|
|
205
|
+
export type Auth = Schema.Schema.Type<typeof AuthSchema>
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Encoded type of AuthSchema (what goes in before validation)
|
|
209
|
+
*/
|
|
210
|
+
export type AuthEncoded = Schema.Schema.Encoded<typeof AuthSchema>
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Helper to check if auth is configured with a specific strategy
|
|
214
|
+
*/
|
|
215
|
+
export const hasAuthenticationMethod = (auth: Auth, strategyType: StrategyType): boolean =>
|
|
216
|
+
hasStrategy(auth, strategyType)
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Plugin names that can be checked
|
|
220
|
+
*/
|
|
221
|
+
type PluginName = 'twoFactor'
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Helper to check if auth has a specific plugin enabled
|
|
225
|
+
*/
|
|
226
|
+
export const hasPlugin = (auth: Auth, pluginName: PluginName): boolean => {
|
|
227
|
+
const plugin = auth[pluginName]
|
|
228
|
+
if (typeof plugin === 'boolean') return plugin
|
|
229
|
+
return plugin !== undefined
|
|
230
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
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
|
+
* Email and Password Authentication Method Configuration
|
|
12
|
+
*
|
|
13
|
+
* Traditional credential-based authentication using email and password.
|
|
14
|
+
* This is the most common authentication method.
|
|
15
|
+
*
|
|
16
|
+
* Can be:
|
|
17
|
+
* - A boolean (true to enable with defaults)
|
|
18
|
+
* - A configuration object for customization
|
|
19
|
+
*
|
|
20
|
+
* Configuration options:
|
|
21
|
+
* - requireEmailVerification: Require email verification before allowing sign-in
|
|
22
|
+
* - minPasswordLength: Minimum password length (default: 8, range: 6-128)
|
|
23
|
+
* - maxPasswordLength: Maximum password length (default: 128)
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* // Simple enable (as strategy)
|
|
28
|
+
* { type: 'emailAndPassword' }
|
|
29
|
+
*
|
|
30
|
+
* // With configuration
|
|
31
|
+
* {
|
|
32
|
+
* type: 'emailAndPassword',
|
|
33
|
+
* requireEmailVerification: true,
|
|
34
|
+
* minPasswordLength: 12
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export const EmailAndPasswordConfigSchema = Schema.Union(
|
|
39
|
+
Schema.Boolean,
|
|
40
|
+
Schema.Struct({
|
|
41
|
+
requireEmailVerification: Schema.optional(
|
|
42
|
+
Schema.Boolean.pipe(
|
|
43
|
+
Schema.annotations({ description: 'Require email verification before sign-in' })
|
|
44
|
+
)
|
|
45
|
+
),
|
|
46
|
+
minPasswordLength: Schema.optional(
|
|
47
|
+
Schema.Number.pipe(
|
|
48
|
+
Schema.between(6, 128),
|
|
49
|
+
Schema.annotations({ description: 'Minimum password length (6-128)' })
|
|
50
|
+
)
|
|
51
|
+
),
|
|
52
|
+
maxPasswordLength: Schema.optional(
|
|
53
|
+
Schema.Number.pipe(
|
|
54
|
+
Schema.between(8, 256),
|
|
55
|
+
Schema.annotations({ description: 'Maximum password length (8-256)' })
|
|
56
|
+
)
|
|
57
|
+
),
|
|
58
|
+
})
|
|
59
|
+
).pipe(
|
|
60
|
+
Schema.annotations({
|
|
61
|
+
title: 'Email and Password Configuration',
|
|
62
|
+
description: 'Configuration for email and password authentication',
|
|
63
|
+
examples: [true, { requireEmailVerification: true }, { minPasswordLength: 12 }],
|
|
64
|
+
})
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
export type EmailAndPasswordConfig = Schema.Schema.Type<typeof EmailAndPasswordConfigSchema>
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
// Export individual method schemas
|
|
9
|
+
// These are used directly in the flattened AuthSchema
|
|
10
|
+
export * from './email-and-password'
|
|
11
|
+
export * from './magic-link'
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
* Magic Link Authentication Method Configuration
|
|
12
|
+
*
|
|
13
|
+
* Passwordless authentication via email link.
|
|
14
|
+
* User receives an email with a one-time link to sign in.
|
|
15
|
+
*
|
|
16
|
+
* Can be:
|
|
17
|
+
* - A boolean (true to enable with defaults)
|
|
18
|
+
* - A configuration object for customization
|
|
19
|
+
*
|
|
20
|
+
* Configuration options:
|
|
21
|
+
* - expirationMinutes: How long the magic link is valid (default: 15)
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // Simple enable
|
|
26
|
+
* { magicLink: true }
|
|
27
|
+
*
|
|
28
|
+
* // With configuration
|
|
29
|
+
* {
|
|
30
|
+
* magicLink: {
|
|
31
|
+
* expirationMinutes: 30
|
|
32
|
+
* }
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export const MagicLinkConfigSchema = Schema.Union(
|
|
37
|
+
Schema.Boolean,
|
|
38
|
+
Schema.Struct({
|
|
39
|
+
expirationMinutes: Schema.optional(
|
|
40
|
+
Schema.Number.pipe(
|
|
41
|
+
Schema.positive(),
|
|
42
|
+
Schema.annotations({ description: 'Link expiration time in minutes' })
|
|
43
|
+
)
|
|
44
|
+
),
|
|
45
|
+
})
|
|
46
|
+
).pipe(
|
|
47
|
+
Schema.annotations({
|
|
48
|
+
title: 'Magic Link Configuration',
|
|
49
|
+
description: 'Configuration for magic link authentication',
|
|
50
|
+
examples: [true, { expirationMinutes: 30 }],
|
|
51
|
+
})
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
export type MagicLinkConfig = Schema.Schema.Type<typeof MagicLinkConfigSchema>
|
|
@@ -0,0 +1,105 @@
|
|
|
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
|
+
* OAuth Provider Schema
|
|
12
|
+
*
|
|
13
|
+
* Essential OAuth providers for v1.
|
|
14
|
+
* Focused on enterprise and developer use cases.
|
|
15
|
+
*
|
|
16
|
+
* Providers:
|
|
17
|
+
* - google: Google Workspace integration
|
|
18
|
+
* - github: Developer authentication
|
|
19
|
+
* - microsoft: Enterprise/Azure AD
|
|
20
|
+
* - slack: Workspace communication
|
|
21
|
+
* - gitlab: Developer/CI-CD integration
|
|
22
|
+
*
|
|
23
|
+
* Credentials are loaded from environment variables:
|
|
24
|
+
* - {PROVIDER}_CLIENT_ID (e.g., GOOGLE_CLIENT_ID)
|
|
25
|
+
* - {PROVIDER}_CLIENT_SECRET (e.g., GOOGLE_CLIENT_SECRET)
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const providers = ['google', 'github', 'slack']
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export const OAuthProviderSchema = Schema.Literal(
|
|
33
|
+
'google',
|
|
34
|
+
'github',
|
|
35
|
+
'microsoft',
|
|
36
|
+
'slack',
|
|
37
|
+
'gitlab'
|
|
38
|
+
).pipe(
|
|
39
|
+
Schema.annotations({
|
|
40
|
+
title: 'OAuth Provider',
|
|
41
|
+
description: 'Supported OAuth providers for social login',
|
|
42
|
+
})
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
export type OAuthProvider = Schema.Schema.Type<typeof OAuthProviderSchema>
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* OAuth Configuration Schema
|
|
49
|
+
*
|
|
50
|
+
* Simple provider list using environment variables for credentials.
|
|
51
|
+
* For each provider enabled, the system expects:
|
|
52
|
+
* - {PROVIDER}_CLIENT_ID environment variable
|
|
53
|
+
* - {PROVIDER}_CLIENT_SECRET environment variable
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* // Enable Google and GitHub OAuth
|
|
58
|
+
* { providers: ['google', 'github'] }
|
|
59
|
+
*
|
|
60
|
+
* // Required environment variables:
|
|
61
|
+
* // GOOGLE_CLIENT_ID=your-google-client-id
|
|
62
|
+
* // GOOGLE_CLIENT_SECRET=your-google-client-secret
|
|
63
|
+
* // GITHUB_CLIENT_ID=your-github-client-id
|
|
64
|
+
* // GITHUB_CLIENT_SECRET=your-github-client-secret
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export const OAuthConfigSchema = Schema.Struct({
|
|
68
|
+
/** List of OAuth providers to enable */
|
|
69
|
+
providers: Schema.NonEmptyArray(OAuthProviderSchema),
|
|
70
|
+
}).pipe(
|
|
71
|
+
Schema.annotations({
|
|
72
|
+
title: 'OAuth Configuration',
|
|
73
|
+
description:
|
|
74
|
+
'OAuth social login configuration. Credentials loaded from environment variables ({PROVIDER}_CLIENT_ID, {PROVIDER}_CLIENT_SECRET).',
|
|
75
|
+
examples: [
|
|
76
|
+
{ providers: ['google'] },
|
|
77
|
+
{ providers: ['google', 'github'] },
|
|
78
|
+
{ providers: ['google', 'github', 'microsoft'] },
|
|
79
|
+
],
|
|
80
|
+
})
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
export type OAuthConfig = Schema.Schema.Type<typeof OAuthConfigSchema>
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Get environment variable names for a provider
|
|
87
|
+
*
|
|
88
|
+
* @param provider - OAuth provider name
|
|
89
|
+
* @returns Object with clientId and clientSecret env var names
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* getProviderEnvVars('google')
|
|
94
|
+
* // Returns: { clientId: 'GOOGLE_CLIENT_ID', clientSecret: 'GOOGLE_CLIENT_SECRET' }
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export const getProviderEnvVars = (
|
|
98
|
+
provider: OAuthProvider
|
|
99
|
+
): { readonly clientId: string; readonly clientSecret: string } => {
|
|
100
|
+
const upper = provider.toUpperCase()
|
|
101
|
+
return {
|
|
102
|
+
clientId: `${upper}_CLIENT_ID`,
|
|
103
|
+
clientSecret: `${upper}_CLIENT_SECRET`,
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
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
|
+
import {
|
|
10
|
+
ResourceActionPermissionsSchema,
|
|
11
|
+
UserLevelRoleSchema,
|
|
12
|
+
} from '@/domain/models/app/permissions'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Role Management Configuration
|
|
16
|
+
*
|
|
17
|
+
* Controls admin role assignment and revocation capabilities.
|
|
18
|
+
* Presence of this config enables role management features.
|
|
19
|
+
*/
|
|
20
|
+
export const RoleManagementSchema = Schema.Struct({
|
|
21
|
+
assignAdmin: Schema.optional(
|
|
22
|
+
Schema.Boolean.pipe(
|
|
23
|
+
Schema.annotations({ description: 'Allow admins to grant admin role to users' })
|
|
24
|
+
)
|
|
25
|
+
),
|
|
26
|
+
revokeAdmin: Schema.optional(
|
|
27
|
+
Schema.Boolean.pipe(
|
|
28
|
+
Schema.annotations({ description: 'Allow admins to revoke admin role from users' })
|
|
29
|
+
)
|
|
30
|
+
),
|
|
31
|
+
preventSelfRevocation: Schema.optional(
|
|
32
|
+
Schema.Boolean.pipe(
|
|
33
|
+
Schema.annotations({ description: 'Prevent admins from revoking their own admin role' })
|
|
34
|
+
)
|
|
35
|
+
),
|
|
36
|
+
}).pipe(
|
|
37
|
+
Schema.annotations({
|
|
38
|
+
title: 'Role Management',
|
|
39
|
+
description: 'Admin role assignment and revocation capabilities',
|
|
40
|
+
examples: [{ assignAdmin: true, revokeAdmin: true, preventSelfRevocation: true }],
|
|
41
|
+
})
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
export type RoleManagement = Schema.Schema.Type<typeof RoleManagementSchema>
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Admin Plugin Configuration
|
|
48
|
+
*
|
|
49
|
+
* Enables administrative features for user management.
|
|
50
|
+
* Includes capabilities for managing roles, impersonating users,
|
|
51
|
+
* and custom permissions.
|
|
52
|
+
*
|
|
53
|
+
* Configuration options:
|
|
54
|
+
* - impersonation: Allow admins to impersonate other users
|
|
55
|
+
* - userManagement: Enable user CRUD operations
|
|
56
|
+
* - firstUserAdmin: Make first registered user an admin
|
|
57
|
+
* - defaultRole: Default role for new users
|
|
58
|
+
* - customPermissions: Granular resource:action permissions
|
|
59
|
+
* - roleManagement: Admin role assignment/revocation
|
|
60
|
+
*
|
|
61
|
+
* Default admin user is configured via environment variables:
|
|
62
|
+
* - ADMIN_EMAIL: Admin email address
|
|
63
|
+
* - ADMIN_PASSWORD: Admin password
|
|
64
|
+
* - ADMIN_NAME: Admin display name (optional)
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* // Simple enable
|
|
69
|
+
* { plugins: { admin: true } }
|
|
70
|
+
*
|
|
71
|
+
* // With configuration
|
|
72
|
+
* { plugins: { admin: { impersonation: true, firstUserAdmin: true } } }
|
|
73
|
+
*
|
|
74
|
+
* // With custom permissions
|
|
75
|
+
* { plugins: { admin: {
|
|
76
|
+
* customPermissions: {
|
|
77
|
+
* posts: ['create', 'read', 'update', 'delete'],
|
|
78
|
+
* analytics: ['read']
|
|
79
|
+
* }
|
|
80
|
+
* } } }
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export const AdminConfigSchema = Schema.Union(
|
|
84
|
+
Schema.Boolean,
|
|
85
|
+
Schema.Struct({
|
|
86
|
+
// ========== Existing Fields ==========
|
|
87
|
+
impersonation: Schema.optional(
|
|
88
|
+
Schema.Boolean.pipe(Schema.annotations({ description: 'Allow admin impersonation of users' }))
|
|
89
|
+
),
|
|
90
|
+
userManagement: Schema.optional(
|
|
91
|
+
Schema.Boolean.pipe(Schema.annotations({ description: 'Enable user management features' }))
|
|
92
|
+
),
|
|
93
|
+
|
|
94
|
+
// ========== Admin Options ==========
|
|
95
|
+
firstUserAdmin: Schema.optional(
|
|
96
|
+
Schema.Boolean.pipe(
|
|
97
|
+
Schema.annotations({ description: 'Automatically make the first registered user an admin' })
|
|
98
|
+
)
|
|
99
|
+
),
|
|
100
|
+
defaultRole: Schema.optional(
|
|
101
|
+
UserLevelRoleSchema.pipe(
|
|
102
|
+
Schema.annotations({
|
|
103
|
+
description: 'Default role assigned to new users',
|
|
104
|
+
message: () => 'Invalid default role. Must be one of: admin, member, viewer',
|
|
105
|
+
})
|
|
106
|
+
)
|
|
107
|
+
),
|
|
108
|
+
|
|
109
|
+
// ========== Advanced Features ==========
|
|
110
|
+
customPermissions: Schema.optional(ResourceActionPermissionsSchema),
|
|
111
|
+
roleManagement: Schema.optional(RoleManagementSchema),
|
|
112
|
+
})
|
|
113
|
+
).pipe(
|
|
114
|
+
Schema.annotations({
|
|
115
|
+
title: 'Admin Plugin Configuration',
|
|
116
|
+
description:
|
|
117
|
+
'Administrative features for user management. Default admin user configured via ADMIN_EMAIL, ADMIN_PASSWORD, ADMIN_NAME environment variables.',
|
|
118
|
+
examples: [
|
|
119
|
+
true,
|
|
120
|
+
{ impersonation: true },
|
|
121
|
+
{ impersonation: true, userManagement: true, firstUserAdmin: true },
|
|
122
|
+
{
|
|
123
|
+
customPermissions: { posts: ['create', 'read', 'update', 'delete'] },
|
|
124
|
+
roleManagement: { assignAdmin: true, revokeAdmin: true },
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
})
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
export type AdminConfig = Schema.Schema.Type<typeof AdminConfigSchema>
|
|
@@ -0,0 +1,74 @@
|
|
|
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
|
+
import { AdminConfigSchema } from './admin'
|
|
10
|
+
import { TwoFactorConfigSchema } from './two-factor'
|
|
11
|
+
|
|
12
|
+
// Export individual plugin schemas
|
|
13
|
+
export * from './admin'
|
|
14
|
+
export * from './two-factor'
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Unified Plugins Configuration Schema
|
|
18
|
+
*
|
|
19
|
+
* All authentication plugins in a single configuration object.
|
|
20
|
+
* Each plugin is optional and can be:
|
|
21
|
+
* - A boolean (true to enable with defaults)
|
|
22
|
+
* - A configuration object for customization
|
|
23
|
+
*
|
|
24
|
+
* Plugin categories:
|
|
25
|
+
* - Admin: admin
|
|
26
|
+
* - Security: twoFactor
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* // Simple plugins
|
|
31
|
+
* {
|
|
32
|
+
* plugins: {
|
|
33
|
+
* admin: true,
|
|
34
|
+
* twoFactor: true
|
|
35
|
+
* }
|
|
36
|
+
* }
|
|
37
|
+
*
|
|
38
|
+
* // Configured plugins
|
|
39
|
+
* {
|
|
40
|
+
* plugins: {
|
|
41
|
+
* admin: { impersonation: true },
|
|
42
|
+
* twoFactor: { issuer: 'MyApp', backupCodes: true }
|
|
43
|
+
* }
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export const PluginsConfigSchema = Schema.Struct({
|
|
48
|
+
// Admin features
|
|
49
|
+
admin: Schema.optional(AdminConfigSchema),
|
|
50
|
+
|
|
51
|
+
// Security plugins
|
|
52
|
+
twoFactor: Schema.optional(TwoFactorConfigSchema),
|
|
53
|
+
}).pipe(
|
|
54
|
+
Schema.annotations({
|
|
55
|
+
title: 'Plugins Configuration',
|
|
56
|
+
description: 'All authentication plugins configuration',
|
|
57
|
+
examples: [{ admin: true }, { twoFactor: { issuer: 'MyApp' } }],
|
|
58
|
+
})
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
export type PluginsConfig = Schema.Schema.Type<typeof PluginsConfigSchema>
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Helper to check if a plugin is enabled
|
|
65
|
+
*/
|
|
66
|
+
export const isPluginEnabled = (
|
|
67
|
+
plugins: PluginsConfig | undefined,
|
|
68
|
+
plugin: keyof PluginsConfig
|
|
69
|
+
): boolean => {
|
|
70
|
+
if (!plugins) return false
|
|
71
|
+
const value = plugins[plugin]
|
|
72
|
+
if (typeof value === 'boolean') return value
|
|
73
|
+
return value !== undefined
|
|
74
|
+
}
|