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,150 @@
|
|
|
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 { Context } from 'effect'
|
|
9
|
+
import type { UserMetadataWithOptionalImage } from '@/application/ports/models/user-metadata'
|
|
10
|
+
import type { UserSession } from '@/application/ports/models/user-session'
|
|
11
|
+
import type { SessionContextError } from '@/domain/errors'
|
|
12
|
+
import type { Effect } from 'effect'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Comment with user metadata
|
|
16
|
+
*/
|
|
17
|
+
export interface CommentWithUser {
|
|
18
|
+
readonly id: string
|
|
19
|
+
readonly tableId: string
|
|
20
|
+
readonly recordId: string
|
|
21
|
+
readonly userId: string
|
|
22
|
+
readonly content: string
|
|
23
|
+
readonly createdAt: Date
|
|
24
|
+
readonly updatedAt: Date
|
|
25
|
+
readonly user: UserMetadataWithOptionalImage | undefined
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Comment for authorization check (minimal fields)
|
|
30
|
+
*/
|
|
31
|
+
export interface CommentForAuth {
|
|
32
|
+
readonly id: string
|
|
33
|
+
readonly userId: string
|
|
34
|
+
readonly recordId: string
|
|
35
|
+
readonly tableId: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* User record for authorization
|
|
40
|
+
*/
|
|
41
|
+
export interface CommentUser {
|
|
42
|
+
readonly id: string
|
|
43
|
+
readonly role: string | undefined
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Listed comment with required updatedAt
|
|
48
|
+
*/
|
|
49
|
+
export interface ListedComment {
|
|
50
|
+
readonly id: string
|
|
51
|
+
readonly tableId: string
|
|
52
|
+
readonly recordId: string
|
|
53
|
+
readonly userId: string
|
|
54
|
+
readonly content: string
|
|
55
|
+
readonly createdAt: Date
|
|
56
|
+
readonly updatedAt: Date
|
|
57
|
+
readonly user?: UserMetadataWithOptionalImage | undefined
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Comment Repository port for comment CRUD operations
|
|
62
|
+
*
|
|
63
|
+
* Defines the contract for comment creation, retrieval, deletion, and listing.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const program = Effect.gen(function* () {
|
|
68
|
+
* const comments = yield* CommentRepository
|
|
69
|
+
* const comment = yield* comments.create({ session, tableId, recordId, content })
|
|
70
|
+
* })
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export class CommentRepository extends Context.Tag('CommentRepository')<
|
|
74
|
+
CommentRepository,
|
|
75
|
+
{
|
|
76
|
+
readonly create: (config: {
|
|
77
|
+
readonly session: Readonly<UserSession>
|
|
78
|
+
readonly tableId: string
|
|
79
|
+
readonly recordId: string
|
|
80
|
+
readonly content: string
|
|
81
|
+
}) => Effect.Effect<
|
|
82
|
+
{
|
|
83
|
+
readonly id: string
|
|
84
|
+
readonly tableId: string
|
|
85
|
+
readonly recordId: string
|
|
86
|
+
readonly userId: string
|
|
87
|
+
readonly content: string
|
|
88
|
+
readonly createdAt: Date
|
|
89
|
+
},
|
|
90
|
+
SessionContextError
|
|
91
|
+
>
|
|
92
|
+
|
|
93
|
+
readonly getWithUser: (config: {
|
|
94
|
+
readonly session: Readonly<UserSession>
|
|
95
|
+
readonly commentId: string
|
|
96
|
+
}) => Effect.Effect<CommentWithUser | undefined, SessionContextError>
|
|
97
|
+
|
|
98
|
+
readonly checkRecordExists: (config: {
|
|
99
|
+
readonly session: Readonly<UserSession>
|
|
100
|
+
readonly tableName: string
|
|
101
|
+
readonly recordId: string
|
|
102
|
+
readonly isAdmin?: boolean
|
|
103
|
+
}) => Effect.Effect<boolean, SessionContextError>
|
|
104
|
+
|
|
105
|
+
readonly getForAuth: (config: {
|
|
106
|
+
readonly session: Readonly<UserSession>
|
|
107
|
+
readonly commentId: string
|
|
108
|
+
}) => Effect.Effect<CommentForAuth | undefined, SessionContextError>
|
|
109
|
+
|
|
110
|
+
readonly getUserById: (config: {
|
|
111
|
+
readonly session: Readonly<UserSession>
|
|
112
|
+
readonly userId: string
|
|
113
|
+
}) => Effect.Effect<CommentUser | undefined, SessionContextError>
|
|
114
|
+
|
|
115
|
+
readonly remove: (config: {
|
|
116
|
+
readonly session: Readonly<UserSession>
|
|
117
|
+
readonly commentId: string
|
|
118
|
+
}) => Effect.Effect<void, SessionContextError>
|
|
119
|
+
|
|
120
|
+
readonly list: (config: {
|
|
121
|
+
readonly session: Readonly<UserSession>
|
|
122
|
+
readonly recordId: string
|
|
123
|
+
readonly limit?: number
|
|
124
|
+
readonly offset?: number
|
|
125
|
+
readonly sortOrder?: 'asc' | 'desc'
|
|
126
|
+
}) => Effect.Effect<readonly ListedComment[], SessionContextError>
|
|
127
|
+
|
|
128
|
+
readonly getCount: (config: {
|
|
129
|
+
readonly session: Readonly<UserSession>
|
|
130
|
+
readonly recordId: string
|
|
131
|
+
}) => Effect.Effect<number, SessionContextError>
|
|
132
|
+
|
|
133
|
+
readonly update: (config: {
|
|
134
|
+
readonly session: Readonly<UserSession>
|
|
135
|
+
readonly commentId: string
|
|
136
|
+
readonly content: string
|
|
137
|
+
}) => Effect.Effect<
|
|
138
|
+
{
|
|
139
|
+
readonly id: string
|
|
140
|
+
readonly tableId: string
|
|
141
|
+
readonly recordId: string
|
|
142
|
+
readonly userId: string
|
|
143
|
+
readonly content: string
|
|
144
|
+
readonly createdAt: Date
|
|
145
|
+
readonly updatedAt: Date
|
|
146
|
+
},
|
|
147
|
+
SessionContextError
|
|
148
|
+
>
|
|
149
|
+
}
|
|
150
|
+
>() {}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export {
|
|
9
|
+
ActivityLogRepository,
|
|
10
|
+
ActivityLogDatabaseError,
|
|
11
|
+
type ActivityLog,
|
|
12
|
+
} from './activity-log-repository'
|
|
13
|
+
export {
|
|
14
|
+
AnalyticsRepository,
|
|
15
|
+
AnalyticsDatabaseError,
|
|
16
|
+
type PageViewInput,
|
|
17
|
+
type AnalyticsQueryParams,
|
|
18
|
+
type TimeSeriesPoint,
|
|
19
|
+
type AnalyticsSummary,
|
|
20
|
+
type TopPage,
|
|
21
|
+
type TopReferrer,
|
|
22
|
+
type BreakdownEntry,
|
|
23
|
+
type DeviceBreakdown,
|
|
24
|
+
type CampaignEntry,
|
|
25
|
+
} from './analytics-repository'
|
|
26
|
+
export { ActivityRepository, type ActivityHistoryEntry } from './activity-repository'
|
|
27
|
+
export { AuthRepository, AuthDatabaseError } from './auth-repository'
|
|
28
|
+
export { BatchRepository, type BatchValidationError, type UpsertResult } from './batch-repository'
|
|
29
|
+
export {
|
|
30
|
+
CommentRepository,
|
|
31
|
+
type CommentWithUser,
|
|
32
|
+
type CommentForAuth,
|
|
33
|
+
type CommentUser,
|
|
34
|
+
type ListedComment,
|
|
35
|
+
} from './comment-repository'
|
|
36
|
+
export {
|
|
37
|
+
TableRepository,
|
|
38
|
+
type QueryFilter,
|
|
39
|
+
type AggregateQuery,
|
|
40
|
+
type AggregationResult,
|
|
41
|
+
} from './table-repository'
|
|
@@ -0,0 +1,139 @@
|
|
|
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 { Context } from 'effect'
|
|
9
|
+
import type { UserSession } from '@/application/ports/models/user-session'
|
|
10
|
+
import type { SessionContextError, UniqueConstraintViolationError } from '@/domain/errors'
|
|
11
|
+
import type { App } from '@/domain/models/app'
|
|
12
|
+
import type { Effect } from 'effect'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Query filter for record listing
|
|
16
|
+
*/
|
|
17
|
+
export interface QueryFilter {
|
|
18
|
+
readonly and?: readonly {
|
|
19
|
+
readonly field: string
|
|
20
|
+
readonly operator: string
|
|
21
|
+
readonly value: unknown
|
|
22
|
+
}[]
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Aggregation query configuration
|
|
27
|
+
*/
|
|
28
|
+
export interface AggregateQuery {
|
|
29
|
+
readonly count?: boolean
|
|
30
|
+
readonly sum?: readonly string[]
|
|
31
|
+
readonly avg?: readonly string[]
|
|
32
|
+
readonly min?: readonly string[]
|
|
33
|
+
readonly max?: readonly string[]
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Aggregation result from database
|
|
38
|
+
*/
|
|
39
|
+
export interface AggregationResult {
|
|
40
|
+
readonly count?: string
|
|
41
|
+
readonly sum?: Record<string, number>
|
|
42
|
+
readonly avg?: Record<string, number>
|
|
43
|
+
readonly min?: Record<string, number>
|
|
44
|
+
readonly max?: Record<string, number>
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Table Repository port for CRUD operations
|
|
49
|
+
*
|
|
50
|
+
* Defines the contract between the Application layer and database infrastructure.
|
|
51
|
+
* Live implementation delegates to table-queries infrastructure functions.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* const program = Effect.gen(function* () {
|
|
56
|
+
* const repo = yield* TableRepository
|
|
57
|
+
* const records = yield* repo.listRecords({ session, tableName: 'users' })
|
|
58
|
+
* })
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export class TableRepository extends Context.Tag('TableRepository')<
|
|
62
|
+
TableRepository,
|
|
63
|
+
{
|
|
64
|
+
readonly listRecords: (config: {
|
|
65
|
+
readonly session: Readonly<UserSession>
|
|
66
|
+
readonly tableName: string
|
|
67
|
+
readonly table?: { readonly permissions?: { readonly organizationScoped?: boolean } }
|
|
68
|
+
readonly filter?: QueryFilter
|
|
69
|
+
readonly includeDeleted?: boolean
|
|
70
|
+
readonly sort?: string
|
|
71
|
+
readonly app?: {
|
|
72
|
+
readonly tables?: readonly {
|
|
73
|
+
readonly name: string
|
|
74
|
+
readonly fields: readonly unknown[]
|
|
75
|
+
}[]
|
|
76
|
+
}
|
|
77
|
+
}) => Effect.Effect<readonly Record<string, unknown>[], SessionContextError>
|
|
78
|
+
|
|
79
|
+
readonly listTrash: (config: {
|
|
80
|
+
readonly session: Readonly<UserSession>
|
|
81
|
+
readonly tableName: string
|
|
82
|
+
readonly filter?: QueryFilter
|
|
83
|
+
readonly sort?: string
|
|
84
|
+
}) => Effect.Effect<readonly Record<string, unknown>[], SessionContextError>
|
|
85
|
+
|
|
86
|
+
readonly getRecord: (
|
|
87
|
+
session: Readonly<UserSession>,
|
|
88
|
+
tableName: string,
|
|
89
|
+
recordId: string,
|
|
90
|
+
includeDeleted?: boolean
|
|
91
|
+
) => Effect.Effect<Record<string, unknown> | null, SessionContextError>
|
|
92
|
+
|
|
93
|
+
readonly createRecord: (
|
|
94
|
+
session: Readonly<UserSession>,
|
|
95
|
+
tableName: string,
|
|
96
|
+
fields: Readonly<Record<string, unknown>>
|
|
97
|
+
) => Effect.Effect<
|
|
98
|
+
Record<string, unknown>,
|
|
99
|
+
SessionContextError | UniqueConstraintViolationError
|
|
100
|
+
>
|
|
101
|
+
|
|
102
|
+
readonly updateRecord: (
|
|
103
|
+
session: Readonly<UserSession>,
|
|
104
|
+
tableName: string,
|
|
105
|
+
recordId: string,
|
|
106
|
+
params: {
|
|
107
|
+
readonly fields: Readonly<Record<string, unknown>>
|
|
108
|
+
readonly app?: App
|
|
109
|
+
}
|
|
110
|
+
) => Effect.Effect<Record<string, unknown>, SessionContextError>
|
|
111
|
+
|
|
112
|
+
readonly deleteRecord: (
|
|
113
|
+
session: Readonly<UserSession>,
|
|
114
|
+
tableName: string,
|
|
115
|
+
recordId: string,
|
|
116
|
+
app?: App
|
|
117
|
+
) => Effect.Effect<boolean, SessionContextError>
|
|
118
|
+
|
|
119
|
+
readonly permanentlyDeleteRecord: (
|
|
120
|
+
session: Readonly<UserSession>,
|
|
121
|
+
tableName: string,
|
|
122
|
+
recordId: string
|
|
123
|
+
) => Effect.Effect<boolean, SessionContextError>
|
|
124
|
+
|
|
125
|
+
readonly restoreRecord: (
|
|
126
|
+
session: Readonly<UserSession>,
|
|
127
|
+
tableName: string,
|
|
128
|
+
recordId: string
|
|
129
|
+
) => Effect.Effect<Record<string, unknown> | null, SessionContextError>
|
|
130
|
+
|
|
131
|
+
readonly computeAggregations: (config: {
|
|
132
|
+
readonly session: Readonly<UserSession>
|
|
133
|
+
readonly tableName: string
|
|
134
|
+
readonly filter?: QueryFilter
|
|
135
|
+
readonly includeDeleted?: boolean
|
|
136
|
+
readonly aggregate: AggregateQuery
|
|
137
|
+
}) => Effect.Effect<AggregationResult, SessionContextError>
|
|
138
|
+
}
|
|
139
|
+
>() {}
|
|
@@ -0,0 +1,55 @@
|
|
|
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 { Context } from 'effect'
|
|
9
|
+
import type { App } from '@/domain/models/app'
|
|
10
|
+
import type { Effect } from 'effect'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Compiled CSS result
|
|
14
|
+
*/
|
|
15
|
+
export interface CompiledCSS {
|
|
16
|
+
readonly css: string
|
|
17
|
+
readonly timestamp: number
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* CSS compilation error
|
|
22
|
+
*/
|
|
23
|
+
export interface CSSCompilationError {
|
|
24
|
+
readonly _tag: 'CSSCompilationError'
|
|
25
|
+
readonly cause: unknown
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* CSS Compiler port for compiling Tailwind CSS
|
|
30
|
+
*
|
|
31
|
+
* This interface defines the contract for CSS compilation,
|
|
32
|
+
* allowing the Application layer to remain decoupled from
|
|
33
|
+
* Infrastructure implementations (PostCSS, Tailwind, etc.).
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* const program = Effect.gen(function* () {
|
|
38
|
+
* const cssCompiler = yield* CSSCompiler
|
|
39
|
+
* const result = yield* cssCompiler.compile(app)
|
|
40
|
+
* console.log(`Compiled ${result.css.length} bytes of CSS`)
|
|
41
|
+
* })
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export class CSSCompiler extends Context.Tag('CSSCompiler')<
|
|
45
|
+
CSSCompiler,
|
|
46
|
+
{
|
|
47
|
+
/**
|
|
48
|
+
* Compiles CSS from app theme configuration
|
|
49
|
+
*
|
|
50
|
+
* @param app - Optional app configuration containing theme
|
|
51
|
+
* @returns Effect that yields compiled CSS string or CSSCompilationError
|
|
52
|
+
*/
|
|
53
|
+
readonly compile: (app?: App) => Effect.Effect<CompiledCSS, CSSCompilationError>
|
|
54
|
+
}
|
|
55
|
+
>() {}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export { CSSCompiler, type CompiledCSS, type CSSCompilationError } from './css-compiler'
|
|
9
|
+
export { PageRenderer } from './page-renderer'
|
|
10
|
+
export { ServerFactory, type ServerFactoryConfig } from './server-factory'
|
|
11
|
+
export {
|
|
12
|
+
StaticSiteGenerator,
|
|
13
|
+
type SSGOptions,
|
|
14
|
+
type SSGResult,
|
|
15
|
+
type SSGGenerationError,
|
|
16
|
+
} from './static-site-generator'
|
|
@@ -0,0 +1,79 @@
|
|
|
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 { Context } from 'effect'
|
|
9
|
+
import type { App } from '@/domain/models/app'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Page renderer port for server-side rendering
|
|
13
|
+
*
|
|
14
|
+
* This interface defines the contract for rendering pages to HTML,
|
|
15
|
+
* allowing the Application layer to remain decoupled from
|
|
16
|
+
* Presentation layer implementations.
|
|
17
|
+
*
|
|
18
|
+
* All rendering functions are synchronous and return complete HTML documents.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const program = Effect.gen(function* () {
|
|
23
|
+
* const pageRenderer = yield* PageRenderer
|
|
24
|
+
*
|
|
25
|
+
* // Render homepage with app data
|
|
26
|
+
* const homeHtml = pageRenderer.renderHome(app)
|
|
27
|
+
*
|
|
28
|
+
* // Render error pages
|
|
29
|
+
* const notFoundHtml = pageRenderer.renderNotFound()
|
|
30
|
+
* const errorHtml = pageRenderer.renderError()
|
|
31
|
+
*
|
|
32
|
+
* return { homeHtml, notFoundHtml, errorHtml }
|
|
33
|
+
* })
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* PageRenderer service for server-side HTML rendering
|
|
39
|
+
*
|
|
40
|
+
* Use this service via Effect Context to render React components
|
|
41
|
+
* to HTML strings with type-safe dependency injection.
|
|
42
|
+
*/
|
|
43
|
+
export class PageRenderer extends Context.Tag('PageRenderer')<
|
|
44
|
+
PageRenderer,
|
|
45
|
+
{
|
|
46
|
+
/**
|
|
47
|
+
* Renders the application home page
|
|
48
|
+
*
|
|
49
|
+
* @param app - Validated application data from AppSchema
|
|
50
|
+
* @param detectedLanguage - Optional detected language from Accept-Language header or URL
|
|
51
|
+
* @returns Complete HTML document as string with embedded app data
|
|
52
|
+
*/
|
|
53
|
+
readonly renderHome: (app: App, detectedLanguage?: string) => string
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Renders any page by path
|
|
57
|
+
*
|
|
58
|
+
* @param app - Validated application data from AppSchema
|
|
59
|
+
* @param path - Page path to render (e.g., '/', '/about')
|
|
60
|
+
* @param detectedLanguage - Optional detected language from Accept-Language header or URL
|
|
61
|
+
* @returns Complete HTML document as string, or undefined if page not found
|
|
62
|
+
*/
|
|
63
|
+
readonly renderPage: (app: App, path: string, detectedLanguage?: string) => string | undefined
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Renders the 404 Not Found page
|
|
67
|
+
*
|
|
68
|
+
* @returns Complete HTML document as string with 404 error message
|
|
69
|
+
*/
|
|
70
|
+
readonly renderNotFound: () => string
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Renders the 500 Internal Server Error page
|
|
74
|
+
*
|
|
75
|
+
* @returns Complete HTML document as string with error message
|
|
76
|
+
*/
|
|
77
|
+
readonly renderError: () => string
|
|
78
|
+
}
|
|
79
|
+
>() {}
|
|
@@ -0,0 +1,80 @@
|
|
|
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 { Context } from 'effect'
|
|
9
|
+
import type { ServerInstance } from '@/application/models/server'
|
|
10
|
+
import type { App } from '@/domain/models/app'
|
|
11
|
+
import type { AuthConfigRequiredForUserFields } from '@/infrastructure/errors/auth-config-required-error'
|
|
12
|
+
import type { CSSCompilationError } from '@/infrastructure/errors/css-compilation-error'
|
|
13
|
+
import type { SchemaInitializationError } from '@/infrastructure/errors/schema-initialization-error'
|
|
14
|
+
import type { ServerCreationError } from '@/infrastructure/errors/server-creation-error'
|
|
15
|
+
import type { Effect } from 'effect'
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Server factory port for creating web servers
|
|
19
|
+
*
|
|
20
|
+
* This interface defines the contract for server creation,
|
|
21
|
+
* allowing the Application layer to remain decoupled from
|
|
22
|
+
* Infrastructure implementations.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const program = Effect.gen(function* () {
|
|
27
|
+
* const serverFactory = yield* ServerFactory
|
|
28
|
+
* const server = yield* serverFactory.create({
|
|
29
|
+
* app: validatedApp,
|
|
30
|
+
* port: 3000,
|
|
31
|
+
* renderHomePage: (app) => '<html>...</html>',
|
|
32
|
+
* renderNotFoundPage: () => '<html>404</html>',
|
|
33
|
+
* renderErrorPage: () => '<html>Error</html>',
|
|
34
|
+
* })
|
|
35
|
+
* return server
|
|
36
|
+
* })
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Configuration for server creation
|
|
42
|
+
*/
|
|
43
|
+
export interface ServerFactoryConfig {
|
|
44
|
+
readonly app: App
|
|
45
|
+
readonly port?: number
|
|
46
|
+
readonly hostname?: string
|
|
47
|
+
readonly publicDir?: string
|
|
48
|
+
readonly renderHomePage: (app: App) => string
|
|
49
|
+
readonly renderPage: (app: App, path: string) => string | undefined
|
|
50
|
+
readonly renderNotFoundPage: () => string
|
|
51
|
+
readonly renderErrorPage: () => string
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* ServerFactory service for creating and starting web servers
|
|
56
|
+
*
|
|
57
|
+
* Use this service via Effect Context to create server instances
|
|
58
|
+
* with type-safe dependency injection.
|
|
59
|
+
*/
|
|
60
|
+
export class ServerFactory extends Context.Tag('ServerFactory')<
|
|
61
|
+
ServerFactory,
|
|
62
|
+
{
|
|
63
|
+
/**
|
|
64
|
+
* Creates and starts a server instance
|
|
65
|
+
*
|
|
66
|
+
* @param config - Server configuration with app data and rendering functions
|
|
67
|
+
* @returns Effect that yields ServerInstance or creation/compilation/auth config/migration errors
|
|
68
|
+
*/
|
|
69
|
+
readonly create: (
|
|
70
|
+
config: ServerFactoryConfig
|
|
71
|
+
) => Effect.Effect<
|
|
72
|
+
ServerInstance,
|
|
73
|
+
| ServerCreationError
|
|
74
|
+
| CSSCompilationError
|
|
75
|
+
| AuthConfigRequiredForUserFields
|
|
76
|
+
| SchemaInitializationError
|
|
77
|
+
| Error
|
|
78
|
+
>
|
|
79
|
+
}
|
|
80
|
+
>() {}
|
|
@@ -0,0 +1,82 @@
|
|
|
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 { Context } from 'effect'
|
|
9
|
+
import type { Effect } from 'effect'
|
|
10
|
+
import type { Hono } from 'hono'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Options for static site generation
|
|
14
|
+
*/
|
|
15
|
+
export interface SSGOptions {
|
|
16
|
+
readonly outputDir?: string
|
|
17
|
+
readonly baseUrl?: string
|
|
18
|
+
readonly basePath?: string
|
|
19
|
+
readonly deployment?: 'github-pages' | 'generic'
|
|
20
|
+
readonly languages?: readonly string[]
|
|
21
|
+
readonly defaultLanguage?: string
|
|
22
|
+
readonly generateSitemap?: boolean
|
|
23
|
+
readonly generateRobotsTxt?: boolean
|
|
24
|
+
readonly hydration?: boolean
|
|
25
|
+
readonly generateManifest?: boolean
|
|
26
|
+
readonly bundleOptimization?: 'split' | 'none'
|
|
27
|
+
readonly pagePaths?: readonly string[]
|
|
28
|
+
readonly publicDir?: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Result of static site generation
|
|
33
|
+
*/
|
|
34
|
+
export interface SSGResult {
|
|
35
|
+
readonly outputDir: string
|
|
36
|
+
readonly files: readonly string[]
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* SSG generation error
|
|
41
|
+
*/
|
|
42
|
+
export interface SSGGenerationError {
|
|
43
|
+
readonly _tag: 'SSGGenerationError'
|
|
44
|
+
readonly message: string
|
|
45
|
+
readonly cause?: unknown
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Static Site Generator port for generating static HTML files
|
|
50
|
+
*
|
|
51
|
+
* This interface defines the contract for static site generation,
|
|
52
|
+
* allowing the Application layer to remain decoupled from
|
|
53
|
+
* Infrastructure implementations (Hono SSG, file system, etc.).
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* const program = Effect.gen(function* () {
|
|
58
|
+
* const ssg = yield* StaticSiteGenerator
|
|
59
|
+
* const result = yield* ssg.generate(honoApp, {
|
|
60
|
+
* outputDir: './static',
|
|
61
|
+
* pagePaths: ['/', '/about'],
|
|
62
|
+
* })
|
|
63
|
+
* console.log(`Generated ${result.files.length} files`)
|
|
64
|
+
* })
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export class StaticSiteGenerator extends Context.Tag('StaticSiteGenerator')<
|
|
68
|
+
StaticSiteGenerator,
|
|
69
|
+
{
|
|
70
|
+
/**
|
|
71
|
+
* Generates static HTML files from a Hono application
|
|
72
|
+
*
|
|
73
|
+
* @param app - Hono application instance
|
|
74
|
+
* @param options - Static generation options
|
|
75
|
+
* @returns Effect that yields SSG result or generation error
|
|
76
|
+
*/
|
|
77
|
+
readonly generate: (
|
|
78
|
+
app: Hono | Readonly<Hono>,
|
|
79
|
+
options: Readonly<SSGOptions>
|
|
80
|
+
) => Effect.Effect<SSGResult, SSGGenerationError>
|
|
81
|
+
}
|
|
82
|
+
>() {}
|