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,162 @@
|
|
|
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
|
+
* View Filter Condition Schema
|
|
12
|
+
*
|
|
13
|
+
* A single filter condition for filtering records.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* { field: 'status', operator: 'equals', value: 'active' }
|
|
18
|
+
* { field: 'age', operator: 'greaterThan', value: 18 }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export const ViewFilterConditionSchema = Schema.Struct({
|
|
22
|
+
field: Schema.String,
|
|
23
|
+
operator: Schema.String,
|
|
24
|
+
value: Schema.Unknown,
|
|
25
|
+
}).pipe(
|
|
26
|
+
Schema.annotations({
|
|
27
|
+
title: 'Filter Condition',
|
|
28
|
+
description: 'A single filter condition specifying field, operator, and value.',
|
|
29
|
+
})
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
export type ViewFilterCondition = Schema.Schema.Type<typeof ViewFilterConditionSchema>
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* View Filter Node
|
|
36
|
+
*
|
|
37
|
+
* Recursive type for filter expressions. Can be either:
|
|
38
|
+
* - A condition: `{ field, operator, value }`
|
|
39
|
+
* - An AND group: `{ and: [...] }`
|
|
40
|
+
* - An OR group: `{ or: [...] }`
|
|
41
|
+
*/
|
|
42
|
+
export type ViewFilterNode =
|
|
43
|
+
| ViewFilterCondition
|
|
44
|
+
| { readonly and: ReadonlyArray<ViewFilterNode> }
|
|
45
|
+
| { readonly or: ReadonlyArray<ViewFilterNode> }
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* View Filter Node Schema
|
|
49
|
+
*
|
|
50
|
+
* Recursive schema for nested filter expressions.
|
|
51
|
+
* Uses a simple `{ and: [...] }` or `{ or: [...] }` format.
|
|
52
|
+
*
|
|
53
|
+
* @example Simple condition
|
|
54
|
+
* ```typescript
|
|
55
|
+
* { field: 'status', operator: 'equals', value: 'active' }
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* @example AND group
|
|
59
|
+
* ```typescript
|
|
60
|
+
* {
|
|
61
|
+
* and: [
|
|
62
|
+
* { field: 'status', operator: 'equals', value: 'active' },
|
|
63
|
+
* { field: 'archived', operator: 'equals', value: false }
|
|
64
|
+
* ]
|
|
65
|
+
* }
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* @example Nested groups (Prisma/MongoDB style)
|
|
69
|
+
* ```typescript
|
|
70
|
+
* // (status = 'active') AND ((priority = 'high') OR (priority = 'urgent'))
|
|
71
|
+
* {
|
|
72
|
+
* and: [
|
|
73
|
+
* { field: 'status', operator: 'equals', value: 'active' },
|
|
74
|
+
* {
|
|
75
|
+
* or: [
|
|
76
|
+
* { field: 'priority', operator: 'equals', value: 'high' },
|
|
77
|
+
* { field: 'priority', operator: 'equals', value: 'urgent' }
|
|
78
|
+
* ]
|
|
79
|
+
* }
|
|
80
|
+
* ]
|
|
81
|
+
* }
|
|
82
|
+
* ```
|
|
83
|
+
*
|
|
84
|
+
* @example Complex nested logic
|
|
85
|
+
* ```typescript
|
|
86
|
+
* {
|
|
87
|
+
* or: [
|
|
88
|
+
* {
|
|
89
|
+
* and: [
|
|
90
|
+
* { field: 'type', operator: 'equals', value: 'task' },
|
|
91
|
+
* { field: 'status', operator: 'equals', value: 'completed' }
|
|
92
|
+
* ]
|
|
93
|
+
* },
|
|
94
|
+
* {
|
|
95
|
+
* and: [
|
|
96
|
+
* { field: 'type', operator: 'equals', value: 'bug' },
|
|
97
|
+
* { field: 'severity', operator: 'equals', value: 'critical' }
|
|
98
|
+
* ]
|
|
99
|
+
* }
|
|
100
|
+
* ]
|
|
101
|
+
* }
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export const ViewFilterNodeSchema: Schema.Schema<ViewFilterNode> = Schema.Union(
|
|
105
|
+
ViewFilterConditionSchema,
|
|
106
|
+
Schema.Struct({
|
|
107
|
+
and: Schema.Array(Schema.suspend((): Schema.Schema<ViewFilterNode> => ViewFilterNodeSchema)),
|
|
108
|
+
}),
|
|
109
|
+
Schema.Struct({
|
|
110
|
+
or: Schema.Array(Schema.suspend((): Schema.Schema<ViewFilterNode> => ViewFilterNodeSchema)),
|
|
111
|
+
})
|
|
112
|
+
).pipe(
|
|
113
|
+
Schema.annotations({
|
|
114
|
+
identifier: 'ViewFilterNode',
|
|
115
|
+
title: 'Filter Node',
|
|
116
|
+
description: 'A filter condition or a logical group (and/or) of filter nodes.',
|
|
117
|
+
})
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* View Filters Schema
|
|
122
|
+
*
|
|
123
|
+
* Root filter configuration for views. Can be a single condition or a logical group.
|
|
124
|
+
*
|
|
125
|
+
* @example Single condition (implicit)
|
|
126
|
+
* ```typescript
|
|
127
|
+
* { field: 'status', operator: 'equals', value: 'active' }
|
|
128
|
+
* ```
|
|
129
|
+
*
|
|
130
|
+
* @example Multiple conditions with AND
|
|
131
|
+
* ```typescript
|
|
132
|
+
* {
|
|
133
|
+
* and: [
|
|
134
|
+
* { field: 'status', operator: 'equals', value: 'active' },
|
|
135
|
+
* { field: 'archived', operator: 'equals', value: false }
|
|
136
|
+
* ]
|
|
137
|
+
* }
|
|
138
|
+
* ```
|
|
139
|
+
*
|
|
140
|
+
* @example Complex nested filters
|
|
141
|
+
* ```typescript
|
|
142
|
+
* {
|
|
143
|
+
* and: [
|
|
144
|
+
* { field: 'status', operator: 'equals', value: 'active' },
|
|
145
|
+
* {
|
|
146
|
+
* or: [
|
|
147
|
+
* { field: 'priority', operator: 'equals', value: 'high' },
|
|
148
|
+
* { field: 'priority', operator: 'equals', value: 'urgent' }
|
|
149
|
+
* ]
|
|
150
|
+
* }
|
|
151
|
+
* ]
|
|
152
|
+
* }
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
export const ViewFiltersSchema = ViewFilterNodeSchema.pipe(
|
|
156
|
+
Schema.annotations({
|
|
157
|
+
title: 'View Filters',
|
|
158
|
+
description: 'Filter configuration using nested and/or groups.',
|
|
159
|
+
})
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
export type ViewFilters = Schema.Schema.Type<typeof ViewFiltersSchema>
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
* View Group By Schema
|
|
12
|
+
*
|
|
13
|
+
* Grouping configuration for the view. Specifies which field to group records by.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* { field: 'status' }
|
|
18
|
+
* { field: 'category', direction: 'asc' }
|
|
19
|
+
* { field: 'priority', direction: 'desc' }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export const ViewGroupBySchema = Schema.Struct({
|
|
23
|
+
field: Schema.String,
|
|
24
|
+
direction: Schema.optional(Schema.Literal('asc', 'desc')),
|
|
25
|
+
}).pipe(
|
|
26
|
+
Schema.annotations({
|
|
27
|
+
title: 'View Group By',
|
|
28
|
+
description: 'Grouping configuration specifying which field to group by.',
|
|
29
|
+
})
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
export type ViewGroupBy = Schema.Schema.Type<typeof ViewGroupBySchema>
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
* Valid View ID String Pattern
|
|
12
|
+
*
|
|
13
|
+
* String view IDs must follow snake_case or kebab-case pattern:
|
|
14
|
+
* - Only lowercase letters (a-z)
|
|
15
|
+
* - Numbers (0-9)
|
|
16
|
+
* - Underscores (_) and hyphens (-)
|
|
17
|
+
* - No spaces, no uppercase letters
|
|
18
|
+
*/
|
|
19
|
+
const ViewIdStringSchema = Schema.String.pipe(
|
|
20
|
+
Schema.pattern(/^[a-z0-9_-]+$/, {
|
|
21
|
+
message: () => 'must be one of the allowed values',
|
|
22
|
+
}),
|
|
23
|
+
Schema.annotations({
|
|
24
|
+
description: 'View ID as string (lowercase, numbers, underscores, hyphens only)',
|
|
25
|
+
})
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* View ID Schema
|
|
30
|
+
*
|
|
31
|
+
* Unique identifier for a view. Can be either a numeric ID or a string identifier.
|
|
32
|
+
* String IDs must follow snake_case or kebab-case pattern (lowercase, numbers, underscores, hyphens only).
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* 1
|
|
37
|
+
* 'default_view'
|
|
38
|
+
* 'kanban-view'
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export const ViewIdSchema = Schema.Union(Schema.Number, ViewIdStringSchema).pipe(
|
|
42
|
+
Schema.annotations({
|
|
43
|
+
title: 'View ID',
|
|
44
|
+
description:
|
|
45
|
+
'Unique identifier for the view. Can be a number or string (lowercase, numbers, underscores, hyphens only).',
|
|
46
|
+
examples: [1, 2, 'default', 'kanban_view'],
|
|
47
|
+
})
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
export type ViewId = Schema.Schema.Type<typeof ViewIdSchema>
|
|
@@ -0,0 +1,177 @@
|
|
|
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 { ViewFieldsSchema } from './fields'
|
|
10
|
+
import { ViewFiltersSchema } from './filters'
|
|
11
|
+
import { ViewGroupBySchema } from './group-by'
|
|
12
|
+
import { ViewIdSchema } from './id'
|
|
13
|
+
import { ViewNameSchema } from './name'
|
|
14
|
+
import { ViewPermissionsSchema } from './permissions'
|
|
15
|
+
import { ViewSortSchema } from './sorts'
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* View Schema
|
|
19
|
+
*
|
|
20
|
+
* Represents a database view configuration for a table.
|
|
21
|
+
* Views can be defined in two modes:
|
|
22
|
+
*
|
|
23
|
+
* 1. **SQL Query Mode**: Define a raw SQL query that creates a PostgreSQL VIEW
|
|
24
|
+
* 2. **JSON Config Mode**: Define filters, sorts, fields, and groupBy declaratively
|
|
25
|
+
*
|
|
26
|
+
* Views support materialized views for caching aggregations with optional refresh on migration.
|
|
27
|
+
*
|
|
28
|
+
* @example SQL Query Mode (PostgreSQL VIEW)
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const activeUsersView = {
|
|
31
|
+
* id: 'active_users',
|
|
32
|
+
* name: 'Active Users',
|
|
33
|
+
* query: 'SELECT * FROM users WHERE active = true',
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* @example Materialized View
|
|
38
|
+
* ```typescript
|
|
39
|
+
* const orderStatsView = {
|
|
40
|
+
* id: 'order_stats',
|
|
41
|
+
* name: 'Order Statistics',
|
|
42
|
+
* query: 'SELECT customer_id, COUNT(*) as order_count FROM orders GROUP BY customer_id',
|
|
43
|
+
* materialized: true,
|
|
44
|
+
* refreshOnMigration: true,
|
|
45
|
+
* }
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @example JSON Config Mode
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const activeTasks = {
|
|
51
|
+
* id: 'active_tasks',
|
|
52
|
+
* name: 'Active Tasks',
|
|
53
|
+
* isDefault: true,
|
|
54
|
+
* filters: {
|
|
55
|
+
* and: [{ field: 'status', operator: 'equals', value: 'active' }]
|
|
56
|
+
* },
|
|
57
|
+
* sorts: [{ field: 'priority', direction: 'desc' }],
|
|
58
|
+
* }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export const ViewSchema = Schema.Struct({
|
|
62
|
+
id: ViewIdSchema,
|
|
63
|
+
name: ViewNameSchema,
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* SQL query for creating a PostgreSQL VIEW or MATERIALIZED VIEW.
|
|
67
|
+
* When provided, the view is created using CREATE VIEW statement.
|
|
68
|
+
* When omitted, JSON config mode is used (filters, sorts, fields, groupBy).
|
|
69
|
+
*/
|
|
70
|
+
query: Schema.optional(Schema.String),
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Whether this is a materialized view (PostgreSQL MATERIALIZED VIEW).
|
|
74
|
+
* Only applicable when `query` is provided.
|
|
75
|
+
* Materialized views cache query results for faster access.
|
|
76
|
+
*/
|
|
77
|
+
materialized: Schema.optional(Schema.Boolean),
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Whether to refresh the materialized view during migrations.
|
|
81
|
+
* Only applicable when `materialized` is true.
|
|
82
|
+
*/
|
|
83
|
+
refreshOnMigration: Schema.optional(Schema.Boolean),
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Whether this view is the default view for the table.
|
|
87
|
+
* The default view's configuration is applied when no specific view is requested.
|
|
88
|
+
*/
|
|
89
|
+
isDefault: Schema.optional(Schema.Boolean),
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Filter conditions for the view (JSON config mode).
|
|
93
|
+
* Defines which records are included in the view.
|
|
94
|
+
*/
|
|
95
|
+
filters: Schema.optional(ViewFiltersSchema),
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Sort configuration for the view (JSON config mode).
|
|
99
|
+
* Defines the order of records in the view.
|
|
100
|
+
*/
|
|
101
|
+
sorts: Schema.optional(Schema.Array(ViewSortSchema)),
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Fields to include in the view (JSON config mode).
|
|
105
|
+
* Array of field names in the order they should appear.
|
|
106
|
+
*/
|
|
107
|
+
fields: Schema.optional(ViewFieldsSchema),
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Group by configuration for the view (JSON config mode).
|
|
111
|
+
* Defines how records are grouped.
|
|
112
|
+
*/
|
|
113
|
+
groupBy: Schema.optional(ViewGroupBySchema),
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Role-based access permissions for the view.
|
|
117
|
+
*/
|
|
118
|
+
permissions: Schema.optional(ViewPermissionsSchema),
|
|
119
|
+
}).pipe(
|
|
120
|
+
Schema.annotations({
|
|
121
|
+
title: 'View',
|
|
122
|
+
description:
|
|
123
|
+
'A database view configuration for a table. Supports both SQL query mode (PostgreSQL VIEW) and JSON config mode (declarative filters, sorts, grouping).',
|
|
124
|
+
examples: [
|
|
125
|
+
// SQL query mode - simple view
|
|
126
|
+
{
|
|
127
|
+
id: 'active_users',
|
|
128
|
+
name: 'Active Users',
|
|
129
|
+
query: 'SELECT * FROM users WHERE active = true',
|
|
130
|
+
},
|
|
131
|
+
// SQL query mode - materialized view
|
|
132
|
+
{
|
|
133
|
+
id: 'order_stats',
|
|
134
|
+
name: 'Order Statistics',
|
|
135
|
+
query:
|
|
136
|
+
'SELECT customer_id, COUNT(*) as order_count, SUM(amount) as total FROM orders GROUP BY customer_id',
|
|
137
|
+
materialized: true,
|
|
138
|
+
refreshOnMigration: true,
|
|
139
|
+
},
|
|
140
|
+
// JSON config mode
|
|
141
|
+
{
|
|
142
|
+
id: 1,
|
|
143
|
+
name: 'Active Tasks',
|
|
144
|
+
isDefault: true,
|
|
145
|
+
filters: {
|
|
146
|
+
and: [{ field: 'status', operator: 'equals', value: 'active' }],
|
|
147
|
+
},
|
|
148
|
+
sorts: [{ field: 'priority', direction: 'desc' as const }],
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
})
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
export type View = Schema.Schema.Type<typeof ViewSchema>
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Views Array Schema
|
|
158
|
+
*
|
|
159
|
+
* Array of views for a table.
|
|
160
|
+
*/
|
|
161
|
+
export const ViewsSchema = Schema.Array(ViewSchema).pipe(
|
|
162
|
+
Schema.annotations({
|
|
163
|
+
title: 'Views',
|
|
164
|
+
description: 'Collection of saved views for a table.',
|
|
165
|
+
})
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
export type Views = Schema.Schema.Type<typeof ViewsSchema>
|
|
169
|
+
|
|
170
|
+
// Re-export all sub-schemas for external use
|
|
171
|
+
export * from './id'
|
|
172
|
+
export * from './name'
|
|
173
|
+
export * from './filters'
|
|
174
|
+
export * from './sorts'
|
|
175
|
+
export * from './fields'
|
|
176
|
+
export * from './group-by'
|
|
177
|
+
export * from './permissions'
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
* View Name Schema
|
|
12
|
+
*
|
|
13
|
+
* Human-readable name for the view.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* 'All Records'
|
|
18
|
+
* 'Active Tasks'
|
|
19
|
+
* 'Completed Orders'
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export const ViewNameSchema = Schema.String.pipe(
|
|
23
|
+
Schema.minLength(1),
|
|
24
|
+
Schema.maxLength(100),
|
|
25
|
+
Schema.annotations({
|
|
26
|
+
title: 'View Name',
|
|
27
|
+
description: 'Human-readable name for the view. Must be non-empty.',
|
|
28
|
+
examples: ['All Records', 'Active Tasks', 'Completed Orders'],
|
|
29
|
+
})
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
export type ViewName = Schema.Schema.Type<typeof ViewNameSchema>
|
|
@@ -0,0 +1,98 @@
|
|
|
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 { FlexibleRolesSchema } from '@/domain/models/app/permissions'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Role-Based View Permissions Schema
|
|
13
|
+
*
|
|
14
|
+
* Defines view access control using role arrays for read and write operations.
|
|
15
|
+
* Uses FlexibleRolesSchema to support both standard and custom roles.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* { read: ['admin', 'member'], write: ['admin'] }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export const RoleBasedViewPermissionsSchema = Schema.Struct({
|
|
23
|
+
/**
|
|
24
|
+
* Roles that can read (view) this view.
|
|
25
|
+
*/
|
|
26
|
+
read: Schema.optional(FlexibleRolesSchema),
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Roles that can write (modify settings of) this view.
|
|
30
|
+
*/
|
|
31
|
+
write: Schema.optional(FlexibleRolesSchema),
|
|
32
|
+
}).pipe(
|
|
33
|
+
Schema.annotations({
|
|
34
|
+
title: 'Role-Based View Permissions',
|
|
35
|
+
description: 'View access control using role arrays.',
|
|
36
|
+
examples: [
|
|
37
|
+
{ read: ['admin', 'member'], write: ['admin'] },
|
|
38
|
+
{ read: ['admin', 'member', 'viewer'] },
|
|
39
|
+
],
|
|
40
|
+
})
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Public View Permissions Schema
|
|
45
|
+
*
|
|
46
|
+
* Marks a view as publicly accessible (no authentication required).
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* { public: true }
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export const PublicViewPermissionsSchema = Schema.Struct({
|
|
54
|
+
/**
|
|
55
|
+
* When true, the view is accessible without authentication.
|
|
56
|
+
*/
|
|
57
|
+
public: Schema.Literal(true),
|
|
58
|
+
}).pipe(
|
|
59
|
+
Schema.annotations({
|
|
60
|
+
title: 'Public View Permissions',
|
|
61
|
+
description: 'View is publicly accessible without authentication.',
|
|
62
|
+
examples: [{ public: true as const }],
|
|
63
|
+
})
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* View Permissions Schema
|
|
68
|
+
*
|
|
69
|
+
* Permissions configuration for the view, defining who can access or modify it.
|
|
70
|
+
* Supports two modes:
|
|
71
|
+
* 1. Role-based: `{ read: ['admin', 'member'], write: ['admin'] }`
|
|
72
|
+
* 2. Public access: `{ public: true }`
|
|
73
|
+
*
|
|
74
|
+
* @example Role-based permissions
|
|
75
|
+
* ```typescript
|
|
76
|
+
* { read: ['admin', 'user'], write: ['admin'] }
|
|
77
|
+
* ```
|
|
78
|
+
*
|
|
79
|
+
* @example Public view
|
|
80
|
+
* ```typescript
|
|
81
|
+
* { public: true }
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export const ViewPermissionsSchema = Schema.Union(
|
|
85
|
+
RoleBasedViewPermissionsSchema,
|
|
86
|
+
PublicViewPermissionsSchema
|
|
87
|
+
).pipe(
|
|
88
|
+
Schema.annotations({
|
|
89
|
+
title: 'View Permissions',
|
|
90
|
+
description:
|
|
91
|
+
'Permission configuration for the view. Use role-based ({ read, write }) or public ({ public: true }).',
|
|
92
|
+
examples: [{ read: ['admin', 'member'], write: ['admin'] }, { public: true as const }],
|
|
93
|
+
})
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
export type ViewPermissions = Schema.Schema.Type<typeof ViewPermissionsSchema>
|
|
97
|
+
export type RoleBasedViewPermissions = Schema.Schema.Type<typeof RoleBasedViewPermissionsSchema>
|
|
98
|
+
export type PublicViewPermissions = Schema.Schema.Type<typeof PublicViewPermissionsSchema>
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
* View Sort Schema
|
|
12
|
+
*
|
|
13
|
+
* Sort configuration for a single field.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* { field: 'createdAt', direction: 'desc' }
|
|
18
|
+
* { field: 'name', direction: 'asc' }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export const ViewSortSchema = Schema.Struct({
|
|
22
|
+
field: Schema.String,
|
|
23
|
+
direction: Schema.Literal('asc', 'desc'),
|
|
24
|
+
}).pipe(
|
|
25
|
+
Schema.annotations({
|
|
26
|
+
title: 'View Sort',
|
|
27
|
+
description: 'Sort configuration for a single field.',
|
|
28
|
+
})
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
export type ViewSort = Schema.Schema.Type<typeof ViewSortSchema>
|