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
package/README.md
ADDED
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
<h3 align="center">Build business apps with config. Own your data forever.</h3>
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
The open-source alternative to Airtable, Retool, and Notion.<br />
|
|
5
|
+
Self-hosted. Configuration-driven. No vendor lock-in.
|
|
6
|
+
</p>
|
|
7
|
+
|
|
8
|
+
<p align="center">
|
|
9
|
+
<a href="https://github.com/sovrium/sovrium/blob/main/LICENSE.md"><img src="https://img.shields.io/badge/license-BSL--1.1-blue" alt="License" /></a>
|
|
10
|
+
<a href="SPEC-PROGRESS.md"><img src="https://img.shields.io/badge/specs-99%25_passing-brightgreen" alt="Specs" /></a>
|
|
11
|
+
<a href="https://bun.sh"><img src="https://img.shields.io/badge/runtime-Bun_1.3-f472b6" alt="Bun" /></a>
|
|
12
|
+
<a href="https://www.typescriptlang.org"><img src="https://img.shields.io/badge/TypeScript-5.9-3178c6" alt="TypeScript" /></a>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
<p align="center">
|
|
16
|
+
<a href="VISION.md">Vision</a> ·
|
|
17
|
+
<a href="SPEC-PROGRESS.md">Roadmap</a> ·
|
|
18
|
+
<a href="CLAUDE.md">Docs</a> ·
|
|
19
|
+
<a href="https://github.com/sovrium/sovrium/issues">Issues</a>
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## What is Sovrium?
|
|
25
|
+
|
|
26
|
+
Sovrium turns **configuration files** into full-featured web applications -- database, auth, API, and UI included.
|
|
27
|
+
|
|
28
|
+
No code generation. No external services. Just config and `sovrium start`.
|
|
29
|
+
|
|
30
|
+
**Choose your format** -- YAML for readability, TypeScript for type safety:
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
# sovrium.yaml
|
|
34
|
+
name: my-crm
|
|
35
|
+
|
|
36
|
+
tables:
|
|
37
|
+
- id: 1
|
|
38
|
+
name: contacts
|
|
39
|
+
fields:
|
|
40
|
+
- id: 1
|
|
41
|
+
name: email
|
|
42
|
+
type: email
|
|
43
|
+
- id: 2
|
|
44
|
+
name: name
|
|
45
|
+
type: single-line-text
|
|
46
|
+
- id: 3
|
|
47
|
+
name: company
|
|
48
|
+
type: single-line-text
|
|
49
|
+
|
|
50
|
+
auth:
|
|
51
|
+
emailAndPassword: true
|
|
52
|
+
|
|
53
|
+
pages:
|
|
54
|
+
- name: home
|
|
55
|
+
path: /
|
|
56
|
+
sections:
|
|
57
|
+
- type: h1
|
|
58
|
+
content: Welcome to My CRM
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
<details>
|
|
62
|
+
<summary>Or use TypeScript for IDE completion</summary>
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
// app.ts
|
|
66
|
+
import { start } from 'sovrium'
|
|
67
|
+
|
|
68
|
+
await start({
|
|
69
|
+
name: 'my-crm',
|
|
70
|
+
tables: [
|
|
71
|
+
{
|
|
72
|
+
id: 1,
|
|
73
|
+
name: 'contacts',
|
|
74
|
+
fields: [
|
|
75
|
+
{ id: 1, name: 'email', type: 'email' },
|
|
76
|
+
{ id: 2, name: 'name', type: 'single-line-text' },
|
|
77
|
+
{ id: 3, name: 'company', type: 'single-line-text' },
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
auth: { emailAndPassword: true },
|
|
82
|
+
pages: [
|
|
83
|
+
{
|
|
84
|
+
name: 'home',
|
|
85
|
+
path: '/',
|
|
86
|
+
sections: [{ type: 'h1', content: 'Welcome to My CRM' }],
|
|
87
|
+
},
|
|
88
|
+
],
|
|
89
|
+
})
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
</details>
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
sovrium start sovrium.yaml # Run with YAML
|
|
96
|
+
bun run app.ts # Or run with TypeScript
|
|
97
|
+
# -> http://localhost:3000
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Why Sovrium?
|
|
103
|
+
|
|
104
|
+
**The problem**: Organizations pay $10k+/month for 20+ SaaS tools, with data scattered everywhere and zero control.
|
|
105
|
+
|
|
106
|
+
**The solution**: One self-hosted platform that does what you need, configured in files you own.
|
|
107
|
+
|
|
108
|
+
| | Sovrium | SaaS Tools |
|
|
109
|
+
| ------------------- | :-------------: | :----------: |
|
|
110
|
+
| **Data ownership** | Your servers | Vendor cloud |
|
|
111
|
+
| **Monthly cost** | $0 (infra only) | $20-50/user |
|
|
112
|
+
| **Vendor lock-in** | None | Complete |
|
|
113
|
+
| **Customization** | Unlimited | Limited |
|
|
114
|
+
| **Version control** | Git-native | None |
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Quick Start
|
|
119
|
+
|
|
120
|
+
**Requirements**: [Bun](https://bun.sh) 1.3+ and [PostgreSQL](https://www.postgresql.org/) 15+
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# Install
|
|
124
|
+
bun add sovrium
|
|
125
|
+
|
|
126
|
+
# Create config
|
|
127
|
+
cat > sovrium.yaml << EOF
|
|
128
|
+
name: my-app
|
|
129
|
+
pages:
|
|
130
|
+
- name: home
|
|
131
|
+
path: /
|
|
132
|
+
sections:
|
|
133
|
+
- type: h1
|
|
134
|
+
content: Hello World
|
|
135
|
+
EOF
|
|
136
|
+
|
|
137
|
+
# Run
|
|
138
|
+
sovrium start sovrium.yaml
|
|
139
|
+
|
|
140
|
+
# Or use environment variable (JSON, YAML, or URL)
|
|
141
|
+
APP_SCHEMA='{"name":"my-app"}' sovrium start
|
|
142
|
+
APP_SCHEMA='name: my-app' sovrium start
|
|
143
|
+
APP_SCHEMA='https://example.com/app.yaml' sovrium start
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Features
|
|
149
|
+
|
|
150
|
+
### Database & Tables
|
|
151
|
+
|
|
152
|
+
Define your data model in config. Sovrium creates PostgreSQL tables, handles migrations, and exposes a full REST API automatically.
|
|
153
|
+
|
|
154
|
+
- **44+ field types** -- text, numeric, date/time, selection, media, relational, user tracking, and advanced types (formula, JSON, geolocation, barcode, autonumber, and more)
|
|
155
|
+
- **Relationships** -- one-to-many and many-to-many with lookup and rollup fields
|
|
156
|
+
- **Views** -- filtered, sorted, and grouped views with field-level visibility
|
|
157
|
+
- **Indexes and constraints** -- primary keys, unique constraints, check constraints
|
|
158
|
+
- **Soft delete** -- built-in trash with restore capability
|
|
159
|
+
- **Permissions** -- role-based table and field-level access control
|
|
160
|
+
- **Schema evolution** -- migration system for safe schema changes
|
|
161
|
+
|
|
162
|
+
### REST API
|
|
163
|
+
|
|
164
|
+
Every table gets a full CRUD API with no additional code.
|
|
165
|
+
|
|
166
|
+
- **Records** -- create, read, update, delete with field validation
|
|
167
|
+
- **Batch operations** -- bulk create, update, and upsert
|
|
168
|
+
- **Filtering and sorting** -- query records with field-based filters
|
|
169
|
+
- **Pagination** -- cursor and offset-based pagination
|
|
170
|
+
- **Activity logs** -- audit trail for all record changes
|
|
171
|
+
- **Rate limiting** -- configurable per-endpoint rate limits
|
|
172
|
+
|
|
173
|
+
### Authentication
|
|
174
|
+
|
|
175
|
+
Production-ready auth out of the box.
|
|
176
|
+
|
|
177
|
+
- **Email/password** -- sign up, sign in, email verification, password reset
|
|
178
|
+
- **Magic link** -- passwordless email authentication
|
|
179
|
+
- **Two-factor** -- TOTP-based 2FA
|
|
180
|
+
- **OAuth** -- social login providers
|
|
181
|
+
- **Roles** -- admin, member, viewer with custom roles
|
|
182
|
+
- **Admin plugin** -- user management, banning, impersonation
|
|
183
|
+
- **Session management** -- list, revoke, and manage active sessions
|
|
184
|
+
|
|
185
|
+
### Pages & UI
|
|
186
|
+
|
|
187
|
+
Server-rendered pages with a component-based system.
|
|
188
|
+
|
|
189
|
+
- **Dynamic routing** -- path-based page routing
|
|
190
|
+
- **Sections** -- composable content sections with theming support
|
|
191
|
+
- **Reusable components** -- define once with `$ref`, customize with `$vars`
|
|
192
|
+
- **SEO metadata** -- title, description, Open Graph, structured data
|
|
193
|
+
- **Scripts** -- custom head and body scripts per page
|
|
194
|
+
|
|
195
|
+
### Theming
|
|
196
|
+
|
|
197
|
+
Design system configuration for consistent styling.
|
|
198
|
+
|
|
199
|
+
- **Colors** -- primary, secondary, accent, and semantic color tokens
|
|
200
|
+
- **Fonts** -- custom font families with Google Fonts support
|
|
201
|
+
- **Spacing, shadows, border-radius** -- design tokens applied globally
|
|
202
|
+
- **Animations** -- configurable keyframe animations
|
|
203
|
+
- **Breakpoints** -- responsive design breakpoints
|
|
204
|
+
|
|
205
|
+
### Internationalization
|
|
206
|
+
|
|
207
|
+
Multi-language support built in.
|
|
208
|
+
|
|
209
|
+
- **Language configuration** -- define supported languages and default
|
|
210
|
+
- **Translation tokens** -- `$t:` syntax for referencing translations in pages
|
|
211
|
+
- **Browser detection** -- automatic language detection
|
|
212
|
+
- **Persistence** -- remember user language preference
|
|
213
|
+
|
|
214
|
+
### CLI
|
|
215
|
+
|
|
216
|
+
- `sovrium start` -- run the application from a config file
|
|
217
|
+
- `sovrium build` -- generate a static site from config
|
|
218
|
+
- Supports YAML, JSON, and TypeScript config files
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Architecture
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
Config File (YAML/JSON/TS)
|
|
226
|
+
|
|
|
227
|
+
v
|
|
228
|
+
Effect Schema (validation)
|
|
229
|
+
|
|
|
230
|
+
v
|
|
231
|
+
Sovrium Runtime
|
|
232
|
+
|
|
|
233
|
+
+---> PostgreSQL (tables, records, migrations)
|
|
234
|
+
+---> Hono (REST API + SSR)
|
|
235
|
+
+---> Better Auth (sessions, OAuth, 2FA)
|
|
236
|
+
+---> React + Tailwind (server-rendered UI)
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Stack
|
|
240
|
+
|
|
241
|
+
| | |
|
|
242
|
+
| :---------------------------------------- | :------------- |
|
|
243
|
+
| [Bun](https://bun.sh) | Runtime |
|
|
244
|
+
| [Hono](https://hono.dev) | Web framework |
|
|
245
|
+
| [Drizzle](https://orm.drizzle.team) | Database ORM |
|
|
246
|
+
| [Effect](https://effect.website) | Type-safe FP |
|
|
247
|
+
| [React 19](https://react.dev) | UI (SSR) |
|
|
248
|
+
| [Tailwind CSS 4](https://tailwindcss.com) | Styling |
|
|
249
|
+
| [Better Auth](https://better-auth.com) | Authentication |
|
|
250
|
+
|
|
251
|
+
### Project Structure
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
src/
|
|
255
|
+
domain/ # Business logic, Effect Schema models
|
|
256
|
+
models/app/ # App configuration schema (tables, auth, pages, theme, ...)
|
|
257
|
+
models/api/ # API contracts (Zod schemas for OpenAPI)
|
|
258
|
+
application/ # Use cases, Effect programs
|
|
259
|
+
infrastructure/ # Database, auth, CSS compiler, email, logging
|
|
260
|
+
presentation/ # API routes, CLI, React components, styling
|
|
261
|
+
specs/ # 2,200+ E2E tests (Playwright)
|
|
262
|
+
docs/ # Architecture and infrastructure documentation
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## Status
|
|
268
|
+
|
|
269
|
+
**Sovrium is under active development.**
|
|
270
|
+
|
|
271
|
+
The specification and testing phase is nearly complete: **2,270 out of 2,283 E2E tests are passing** across 225 spec files, covering 272 user stories with 2,394 acceptance criteria. A TDD automation pipeline handles test implementation, averaging 15+ specs fixed per day.
|
|
272
|
+
|
|
273
|
+
| Domain | Spec Files | Tests | Status |
|
|
274
|
+
| ---------- | ---------: | ----: | ------ |
|
|
275
|
+
| API | 67 | 627 | 100% |
|
|
276
|
+
| App Schema | 131 | 1,398 | 99% |
|
|
277
|
+
| CLI | 9 | 108 | 100% |
|
|
278
|
+
| Migrations | 17 | 139 | 100% |
|
|
279
|
+
| Templates | 1 | 11 | 100% |
|
|
280
|
+
|
|
281
|
+
Track progress in detail: [SPEC-PROGRESS.md](SPEC-PROGRESS.md)
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## Development
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
bun install # Install dependencies
|
|
289
|
+
bun run start # Run application
|
|
290
|
+
bun run quality --skip-e2e # Lint, format, typecheck, unit tests
|
|
291
|
+
bun test:unit # Unit tests only
|
|
292
|
+
bun test:e2e:regression # E2E regression tests
|
|
293
|
+
bun run progress # Spec analysis and progress report
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## Contributing
|
|
299
|
+
|
|
300
|
+
We welcome contributions! See [CLAUDE.md](CLAUDE.md) for coding standards and architecture details.
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
git clone https://github.com/sovrium/sovrium
|
|
304
|
+
cd sovrium && bun install
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## License
|
|
310
|
+
|
|
311
|
+
[BSL-1.1](LICENSE.md) -- Free for internal and non-commercial use. Becomes Apache 2.0 on January 1, 2029.
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
<p align="center">
|
|
316
|
+
<sub><strong>Own your data. Own your tools. Own your future.</strong></sub>
|
|
317
|
+
</p>
|
|
318
|
+
|
|
319
|
+
<p align="center">
|
|
320
|
+
<sub>© 2025 ESSENTIAL SERVICES · <a href="TRADEMARK.md">Trademark</a></sub>
|
|
321
|
+
</p>
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
CREATE SCHEMA "auth";
|
|
2
|
+
--> statement-breakpoint
|
|
3
|
+
CREATE SCHEMA "system";
|
|
4
|
+
--> statement-breakpoint
|
|
5
|
+
CREATE TABLE "auth"."account" (
|
|
6
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
7
|
+
"account_id" text NOT NULL,
|
|
8
|
+
"provider_id" text NOT NULL,
|
|
9
|
+
"user_id" text NOT NULL,
|
|
10
|
+
"access_token" text,
|
|
11
|
+
"refresh_token" text,
|
|
12
|
+
"id_token" text,
|
|
13
|
+
"access_token_expires_at" timestamp with time zone,
|
|
14
|
+
"refresh_token_expires_at" timestamp with time zone,
|
|
15
|
+
"scope" text,
|
|
16
|
+
"password" text,
|
|
17
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
18
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
19
|
+
);
|
|
20
|
+
--> statement-breakpoint
|
|
21
|
+
CREATE TABLE "auth"."session" (
|
|
22
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
23
|
+
"expires_at" timestamp with time zone NOT NULL,
|
|
24
|
+
"token" text NOT NULL,
|
|
25
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
26
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
27
|
+
"ip_address" text,
|
|
28
|
+
"user_agent" text,
|
|
29
|
+
"user_id" text NOT NULL,
|
|
30
|
+
"impersonated_by" text,
|
|
31
|
+
CONSTRAINT "session_token_unique" UNIQUE("token")
|
|
32
|
+
);
|
|
33
|
+
--> statement-breakpoint
|
|
34
|
+
CREATE TABLE "auth"."two_factor" (
|
|
35
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
36
|
+
"user_id" text NOT NULL,
|
|
37
|
+
"secret" text NOT NULL,
|
|
38
|
+
"backup_codes" text NOT NULL
|
|
39
|
+
);
|
|
40
|
+
--> statement-breakpoint
|
|
41
|
+
CREATE TABLE "auth"."user" (
|
|
42
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
43
|
+
"name" text NOT NULL,
|
|
44
|
+
"email" text NOT NULL,
|
|
45
|
+
"email_verified" boolean DEFAULT false NOT NULL,
|
|
46
|
+
"image" text,
|
|
47
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
48
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
49
|
+
"role" text,
|
|
50
|
+
"banned" boolean DEFAULT false,
|
|
51
|
+
"ban_reason" text,
|
|
52
|
+
"ban_expires" timestamp with time zone,
|
|
53
|
+
"two_factor_enabled" boolean DEFAULT false,
|
|
54
|
+
CONSTRAINT "user_email_unique" UNIQUE("email")
|
|
55
|
+
);
|
|
56
|
+
--> statement-breakpoint
|
|
57
|
+
CREATE TABLE "auth"."verification" (
|
|
58
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
59
|
+
"identifier" text NOT NULL,
|
|
60
|
+
"value" text NOT NULL,
|
|
61
|
+
"expires_at" timestamp with time zone NOT NULL,
|
|
62
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
63
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
64
|
+
);
|
|
65
|
+
--> statement-breakpoint
|
|
66
|
+
CREATE TABLE "system"."migration_history" (
|
|
67
|
+
"id" serial PRIMARY KEY NOT NULL,
|
|
68
|
+
"version" integer NOT NULL,
|
|
69
|
+
"checksum" text NOT NULL,
|
|
70
|
+
"schema" jsonb,
|
|
71
|
+
"applied_at" timestamp DEFAULT now(),
|
|
72
|
+
"rolled_back_at" timestamp
|
|
73
|
+
);
|
|
74
|
+
--> statement-breakpoint
|
|
75
|
+
CREATE TABLE "system"."migration_log" (
|
|
76
|
+
"id" serial PRIMARY KEY NOT NULL,
|
|
77
|
+
"operation" text NOT NULL,
|
|
78
|
+
"from_version" integer,
|
|
79
|
+
"to_version" integer,
|
|
80
|
+
"reason" text,
|
|
81
|
+
"status" text NOT NULL,
|
|
82
|
+
"created_at" timestamp DEFAULT now()
|
|
83
|
+
);
|
|
84
|
+
--> statement-breakpoint
|
|
85
|
+
CREATE TABLE "system"."schema_checksum" (
|
|
86
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
87
|
+
"checksum" text NOT NULL,
|
|
88
|
+
"schema" jsonb NOT NULL,
|
|
89
|
+
"updated_at" timestamp DEFAULT now()
|
|
90
|
+
);
|
|
91
|
+
--> statement-breakpoint
|
|
92
|
+
CREATE TABLE "system"."activity_logs" (
|
|
93
|
+
"id" text PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
94
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
95
|
+
"user_id" text,
|
|
96
|
+
"session_id" text,
|
|
97
|
+
"action" text NOT NULL,
|
|
98
|
+
"table_name" text NOT NULL,
|
|
99
|
+
"table_id" text,
|
|
100
|
+
"record_id" text NOT NULL,
|
|
101
|
+
"changes" jsonb,
|
|
102
|
+
"ip_address" text,
|
|
103
|
+
"user_agent" text
|
|
104
|
+
);
|
|
105
|
+
--> statement-breakpoint
|
|
106
|
+
CREATE TABLE "system"."analytics_page_views" (
|
|
107
|
+
"id" text PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
108
|
+
"timestamp" timestamp with time zone DEFAULT now() NOT NULL,
|
|
109
|
+
"app_name" text DEFAULT 'default' NOT NULL,
|
|
110
|
+
"page_path" text NOT NULL,
|
|
111
|
+
"page_title" text,
|
|
112
|
+
"visitor_hash" text NOT NULL,
|
|
113
|
+
"session_hash" text DEFAULT gen_random_uuid() NOT NULL,
|
|
114
|
+
"is_entrance" boolean DEFAULT false NOT NULL,
|
|
115
|
+
"referrer_url" text,
|
|
116
|
+
"referrer_domain" text,
|
|
117
|
+
"utm_source" text,
|
|
118
|
+
"utm_medium" text,
|
|
119
|
+
"utm_campaign" text,
|
|
120
|
+
"utm_content" text,
|
|
121
|
+
"utm_term" text,
|
|
122
|
+
"device_type" text,
|
|
123
|
+
"browser_name" text,
|
|
124
|
+
"os_name" text,
|
|
125
|
+
"language" text,
|
|
126
|
+
"screen_width" smallint,
|
|
127
|
+
"screen_height" smallint
|
|
128
|
+
);
|
|
129
|
+
--> statement-breakpoint
|
|
130
|
+
CREATE TABLE "system"."record_comments" (
|
|
131
|
+
"id" text PRIMARY KEY NOT NULL,
|
|
132
|
+
"record_id" text NOT NULL,
|
|
133
|
+
"table_id" text NOT NULL,
|
|
134
|
+
"user_id" text NOT NULL,
|
|
135
|
+
"content" text NOT NULL,
|
|
136
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
137
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
138
|
+
"deleted_at" timestamp with time zone
|
|
139
|
+
);
|
|
140
|
+
--> statement-breakpoint
|
|
141
|
+
ALTER TABLE "auth"."account" ADD CONSTRAINT "account_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "auth"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
142
|
+
ALTER TABLE "auth"."session" ADD CONSTRAINT "session_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "auth"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
143
|
+
ALTER TABLE "auth"."two_factor" ADD CONSTRAINT "two_factor_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "auth"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
144
|
+
ALTER TABLE "system"."activity_logs" ADD CONSTRAINT "activity_logs_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "auth"."user"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
|
|
145
|
+
ALTER TABLE "system"."record_comments" ADD CONSTRAINT "record_comments_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "auth"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
146
|
+
CREATE INDEX "account_userId_idx" ON "auth"."account" USING btree ("user_id");--> statement-breakpoint
|
|
147
|
+
CREATE INDEX "session_userId_idx" ON "auth"."session" USING btree ("user_id");--> statement-breakpoint
|
|
148
|
+
CREATE INDEX "twoFactor_secret_idx" ON "auth"."two_factor" USING btree ("secret");--> statement-breakpoint
|
|
149
|
+
CREATE INDEX "twoFactor_userId_idx" ON "auth"."two_factor" USING btree ("user_id");--> statement-breakpoint
|
|
150
|
+
CREATE INDEX "verification_identifier_idx" ON "auth"."verification" USING btree ("identifier");--> statement-breakpoint
|
|
151
|
+
CREATE INDEX "activity_logs_created_at_idx" ON "system"."activity_logs" USING btree ("created_at");--> statement-breakpoint
|
|
152
|
+
CREATE INDEX "activity_logs_user_created_at_idx" ON "system"."activity_logs" USING btree ("user_id","created_at");--> statement-breakpoint
|
|
153
|
+
CREATE INDEX "activity_logs_table_record_idx" ON "system"."activity_logs" USING btree ("table_name","record_id");--> statement-breakpoint
|
|
154
|
+
CREATE INDEX "activity_logs_action_idx" ON "system"."activity_logs" USING btree ("action");--> statement-breakpoint
|
|
155
|
+
CREATE INDEX "analytics_pv_app_timestamp_idx" ON "system"."analytics_page_views" USING btree ("app_name","timestamp");--> statement-breakpoint
|
|
156
|
+
CREATE INDEX "analytics_pv_app_visitor_timestamp_idx" ON "system"."analytics_page_views" USING btree ("app_name","visitor_hash","timestamp");--> statement-breakpoint
|
|
157
|
+
CREATE INDEX "analytics_pv_app_path_timestamp_idx" ON "system"."analytics_page_views" USING btree ("app_name","page_path","timestamp");--> statement-breakpoint
|
|
158
|
+
CREATE INDEX "analytics_pv_app_referrer_idx" ON "system"."analytics_page_views" USING btree ("app_name","referrer_domain");--> statement-breakpoint
|
|
159
|
+
CREATE INDEX "analytics_pv_app_utm_source_idx" ON "system"."analytics_page_views" USING btree ("app_name","utm_source");--> statement-breakpoint
|
|
160
|
+
CREATE INDEX "analytics_pv_app_device_idx" ON "system"."analytics_page_views" USING btree ("app_name","device_type");--> statement-breakpoint
|
|
161
|
+
CREATE INDEX "record_comments_record_created_idx" ON "system"."record_comments" USING btree ("table_id","record_id","created_at");--> statement-breakpoint
|
|
162
|
+
CREATE INDEX "record_comments_user_created_idx" ON "system"."record_comments" USING btree ("user_id","created_at");--> statement-breakpoint
|
|
163
|
+
CREATE INDEX "record_comments_deleted_at_idx" ON "system"."record_comments" USING btree ("deleted_at");
|