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,215 @@
|
|
|
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 * as Renderers from '../../renderers/element-renderers'
|
|
9
|
+
import type { ComponentRenderer } from '../component-dispatch-config'
|
|
10
|
+
import type { Component } from '@/domain/models/app/page/sections'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Structural HTML components (section, header, footer, main, etc.)
|
|
14
|
+
*
|
|
15
|
+
* These components render semantic HTML elements for page structure.
|
|
16
|
+
*/
|
|
17
|
+
export const structuralComponents: Partial<Record<Component['type'], ComponentRenderer>> = {
|
|
18
|
+
section: ({ elementPropsWithSpacing, content, renderedChildren, interactions }) =>
|
|
19
|
+
Renderers.renderHTMLElement({
|
|
20
|
+
type: 'section',
|
|
21
|
+
props: elementPropsWithSpacing,
|
|
22
|
+
content: content,
|
|
23
|
+
children: renderedChildren,
|
|
24
|
+
interactions: interactions,
|
|
25
|
+
}),
|
|
26
|
+
|
|
27
|
+
header: ({ elementPropsWithSpacing, content, renderedChildren, interactions }) =>
|
|
28
|
+
Renderers.renderHTMLElement({
|
|
29
|
+
type: 'header',
|
|
30
|
+
props: elementPropsWithSpacing,
|
|
31
|
+
content: content,
|
|
32
|
+
children: renderedChildren,
|
|
33
|
+
interactions: interactions,
|
|
34
|
+
}),
|
|
35
|
+
|
|
36
|
+
footer: ({ elementPropsWithSpacing, content, renderedChildren, interactions }) =>
|
|
37
|
+
Renderers.renderHTMLElement({
|
|
38
|
+
type: 'footer',
|
|
39
|
+
props: elementPropsWithSpacing,
|
|
40
|
+
content: content,
|
|
41
|
+
children: renderedChildren,
|
|
42
|
+
interactions: interactions,
|
|
43
|
+
}),
|
|
44
|
+
|
|
45
|
+
main: ({ elementPropsWithSpacing, content, renderedChildren, interactions }) =>
|
|
46
|
+
Renderers.renderHTMLElement({
|
|
47
|
+
type: 'main',
|
|
48
|
+
props: elementPropsWithSpacing,
|
|
49
|
+
content: content,
|
|
50
|
+
children: renderedChildren,
|
|
51
|
+
interactions: interactions,
|
|
52
|
+
}),
|
|
53
|
+
|
|
54
|
+
article: ({ elementPropsWithSpacing, content, renderedChildren, interactions }) =>
|
|
55
|
+
Renderers.renderHTMLElement({
|
|
56
|
+
type: 'article',
|
|
57
|
+
props: elementPropsWithSpacing,
|
|
58
|
+
content: content,
|
|
59
|
+
children: renderedChildren,
|
|
60
|
+
interactions: interactions,
|
|
61
|
+
}),
|
|
62
|
+
|
|
63
|
+
aside: ({ elementPropsWithSpacing, content, renderedChildren, interactions }) =>
|
|
64
|
+
Renderers.renderHTMLElement({
|
|
65
|
+
type: 'aside',
|
|
66
|
+
props: elementPropsWithSpacing,
|
|
67
|
+
content: content,
|
|
68
|
+
children: renderedChildren,
|
|
69
|
+
interactions: interactions,
|
|
70
|
+
}),
|
|
71
|
+
|
|
72
|
+
nav: ({ elementPropsWithSpacing, content, renderedChildren, interactions }) =>
|
|
73
|
+
Renderers.renderHTMLElement({
|
|
74
|
+
type: 'nav',
|
|
75
|
+
props: elementPropsWithSpacing,
|
|
76
|
+
content: content,
|
|
77
|
+
children: renderedChildren,
|
|
78
|
+
interactions: interactions,
|
|
79
|
+
}),
|
|
80
|
+
|
|
81
|
+
div: ({ elementPropsWithSpacing, content, renderedChildren, interactions }) =>
|
|
82
|
+
Renderers.renderHTMLElement({
|
|
83
|
+
type: 'div',
|
|
84
|
+
props: elementPropsWithSpacing,
|
|
85
|
+
content: content,
|
|
86
|
+
children: renderedChildren,
|
|
87
|
+
interactions: interactions,
|
|
88
|
+
}),
|
|
89
|
+
|
|
90
|
+
container: ({ elementPropsWithSpacing, content, renderedChildren, interactions }) =>
|
|
91
|
+
Renderers.renderHTMLElement({
|
|
92
|
+
type: 'div',
|
|
93
|
+
props: elementPropsWithSpacing,
|
|
94
|
+
content: content,
|
|
95
|
+
children: renderedChildren,
|
|
96
|
+
interactions: interactions,
|
|
97
|
+
}),
|
|
98
|
+
|
|
99
|
+
flex: ({ elementPropsWithSpacing, content, renderedChildren, interactions }) =>
|
|
100
|
+
Renderers.renderHTMLElement({
|
|
101
|
+
type: 'div',
|
|
102
|
+
props: elementPropsWithSpacing,
|
|
103
|
+
content: content,
|
|
104
|
+
children: renderedChildren,
|
|
105
|
+
interactions: interactions,
|
|
106
|
+
}),
|
|
107
|
+
|
|
108
|
+
grid: ({ elementPropsWithSpacing, content, renderedChildren, interactions }) =>
|
|
109
|
+
Renderers.renderHTMLElement({
|
|
110
|
+
type: 'div',
|
|
111
|
+
props: elementPropsWithSpacing,
|
|
112
|
+
content: content,
|
|
113
|
+
children: renderedChildren,
|
|
114
|
+
interactions: interactions,
|
|
115
|
+
}),
|
|
116
|
+
|
|
117
|
+
card: ({ elementPropsWithSpacing, content, renderedChildren, interactions }) =>
|
|
118
|
+
Renderers.renderHTMLElement({
|
|
119
|
+
type: 'div',
|
|
120
|
+
props: elementPropsWithSpacing,
|
|
121
|
+
content: content,
|
|
122
|
+
children: renderedChildren,
|
|
123
|
+
interactions: interactions,
|
|
124
|
+
}),
|
|
125
|
+
|
|
126
|
+
timeline: ({ elementPropsWithSpacing, content, renderedChildren, interactions }) =>
|
|
127
|
+
Renderers.renderHTMLElement({
|
|
128
|
+
type: 'div',
|
|
129
|
+
props: elementPropsWithSpacing,
|
|
130
|
+
content: content,
|
|
131
|
+
children: renderedChildren,
|
|
132
|
+
interactions: interactions,
|
|
133
|
+
}),
|
|
134
|
+
|
|
135
|
+
accordion: ({ elementPropsWithSpacing, content, renderedChildren, interactions }) =>
|
|
136
|
+
Renderers.renderHTMLElement({
|
|
137
|
+
type: 'div',
|
|
138
|
+
props: elementPropsWithSpacing,
|
|
139
|
+
content: content,
|
|
140
|
+
children: renderedChildren,
|
|
141
|
+
interactions: interactions,
|
|
142
|
+
}),
|
|
143
|
+
|
|
144
|
+
span: ({ elementProps, content, renderedChildren, interactions }) =>
|
|
145
|
+
Renderers.renderHTMLElement({
|
|
146
|
+
type: 'span',
|
|
147
|
+
props: elementProps,
|
|
148
|
+
content: content,
|
|
149
|
+
children: renderedChildren,
|
|
150
|
+
interactions: interactions,
|
|
151
|
+
}),
|
|
152
|
+
|
|
153
|
+
modal: ({ elementProps, content, renderedChildren, interactions }) =>
|
|
154
|
+
Renderers.renderHTMLElement({
|
|
155
|
+
type: 'div',
|
|
156
|
+
props: elementProps,
|
|
157
|
+
content: content,
|
|
158
|
+
children: renderedChildren,
|
|
159
|
+
interactions: interactions,
|
|
160
|
+
}),
|
|
161
|
+
|
|
162
|
+
sidebar: ({ elementProps, content, renderedChildren, interactions }) =>
|
|
163
|
+
Renderers.renderHTMLElement({
|
|
164
|
+
type: 'div',
|
|
165
|
+
props: elementProps,
|
|
166
|
+
content: content,
|
|
167
|
+
children: renderedChildren,
|
|
168
|
+
interactions: interactions,
|
|
169
|
+
}),
|
|
170
|
+
|
|
171
|
+
toast: ({ elementProps, content, renderedChildren, interactions }) =>
|
|
172
|
+
Renderers.renderHTMLElement({
|
|
173
|
+
type: 'div',
|
|
174
|
+
props: elementProps,
|
|
175
|
+
content: content,
|
|
176
|
+
children: renderedChildren,
|
|
177
|
+
interactions: interactions,
|
|
178
|
+
}),
|
|
179
|
+
|
|
180
|
+
fab: ({ elementProps, content, renderedChildren, interactions }) =>
|
|
181
|
+
Renderers.renderHTMLElement({
|
|
182
|
+
type: 'div',
|
|
183
|
+
props: elementProps,
|
|
184
|
+
content: content,
|
|
185
|
+
children: renderedChildren,
|
|
186
|
+
interactions: interactions,
|
|
187
|
+
}),
|
|
188
|
+
|
|
189
|
+
spinner: ({ elementProps, content, renderedChildren, interactions }) =>
|
|
190
|
+
Renderers.renderHTMLElement({
|
|
191
|
+
type: 'div',
|
|
192
|
+
props: elementProps,
|
|
193
|
+
content: content,
|
|
194
|
+
children: renderedChildren,
|
|
195
|
+
interactions: interactions,
|
|
196
|
+
}),
|
|
197
|
+
|
|
198
|
+
'list-item': ({ elementProps, content, renderedChildren, interactions }) =>
|
|
199
|
+
Renderers.renderHTMLElement({
|
|
200
|
+
type: 'div',
|
|
201
|
+
props: elementProps,
|
|
202
|
+
content: content,
|
|
203
|
+
children: renderedChildren,
|
|
204
|
+
interactions: interactions,
|
|
205
|
+
}),
|
|
206
|
+
|
|
207
|
+
dropdown: ({ elementProps, content, renderedChildren, interactions }) =>
|
|
208
|
+
Renderers.renderHTMLElement({
|
|
209
|
+
type: 'div',
|
|
210
|
+
props: elementProps,
|
|
211
|
+
content: content,
|
|
212
|
+
children: renderedChildren,
|
|
213
|
+
interactions: interactions,
|
|
214
|
+
}),
|
|
215
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
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 * as Renderers from '../../renderers/element-renderers'
|
|
9
|
+
import type { ComponentRenderer } from '../component-dispatch-config'
|
|
10
|
+
import type { Component } from '@/domain/models/app/page/sections'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Text and heading components (h1-h6, text, paragraph, code, etc.)
|
|
14
|
+
*
|
|
15
|
+
* These components render text content and typography elements.
|
|
16
|
+
*/
|
|
17
|
+
export const textComponents: Partial<Record<Component['type'], ComponentRenderer>> = {
|
|
18
|
+
h1: ({ elementProps, content, renderedChildren }) =>
|
|
19
|
+
Renderers.renderHeading(1, elementProps, content, renderedChildren),
|
|
20
|
+
|
|
21
|
+
h2: ({ elementProps, content, renderedChildren }) =>
|
|
22
|
+
Renderers.renderHeading(2, elementProps, content, renderedChildren),
|
|
23
|
+
|
|
24
|
+
h3: ({ elementProps, content, renderedChildren }) =>
|
|
25
|
+
Renderers.renderHeading(3, elementProps, content, renderedChildren),
|
|
26
|
+
|
|
27
|
+
h4: ({ elementProps, content, renderedChildren }) =>
|
|
28
|
+
Renderers.renderHeading(4, elementProps, content, renderedChildren),
|
|
29
|
+
|
|
30
|
+
h5: ({ elementProps, content, renderedChildren }) =>
|
|
31
|
+
Renderers.renderHeading(5, elementProps, content, renderedChildren),
|
|
32
|
+
|
|
33
|
+
h6: ({ elementProps, content, renderedChildren }) =>
|
|
34
|
+
Renderers.renderHeading(6, elementProps, content, renderedChildren),
|
|
35
|
+
|
|
36
|
+
heading: ({ elementProps, content, renderedChildren }) =>
|
|
37
|
+
Renderers.renderHeading(1, elementProps, content, renderedChildren),
|
|
38
|
+
|
|
39
|
+
text: ({ elementProps, content }) => Renderers.renderTextElement(elementProps, content),
|
|
40
|
+
|
|
41
|
+
'single-line-text': ({ elementProps, content }) =>
|
|
42
|
+
Renderers.renderTextElement(elementProps, content),
|
|
43
|
+
|
|
44
|
+
'long-text': ({ elementProps, content }) => Renderers.renderTextElement(elementProps, content),
|
|
45
|
+
|
|
46
|
+
paragraph: ({ elementProps, content, renderedChildren }) =>
|
|
47
|
+
Renderers.renderParagraph(elementProps, content, renderedChildren),
|
|
48
|
+
|
|
49
|
+
p: ({ elementProps, content, renderedChildren }) =>
|
|
50
|
+
Renderers.renderParagraph(elementProps, content, renderedChildren),
|
|
51
|
+
|
|
52
|
+
code: ({ elementProps, content, renderedChildren }) =>
|
|
53
|
+
Renderers.renderCode(elementProps, content, renderedChildren),
|
|
54
|
+
|
|
55
|
+
pre: ({ elementProps, content, renderedChildren }) =>
|
|
56
|
+
Renderers.renderPre(elementProps, content, renderedChildren),
|
|
57
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
/**
|
|
9
|
+
* Convert custom props to data-* attributes for badge components
|
|
10
|
+
*
|
|
11
|
+
* Re-exported from prop-conversion module for backward compatibility
|
|
12
|
+
*/
|
|
13
|
+
export { convertBadgeProps } from '../props/prop-conversion'
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Parse HTML content string into React elements
|
|
17
|
+
*
|
|
18
|
+
* SECURITY: Safe use of dangerouslySetInnerHTML
|
|
19
|
+
* - Content: HTML string from component configuration
|
|
20
|
+
* - Source: Validated schema (component content property)
|
|
21
|
+
* - Risk: Low - content is from server configuration, not user input
|
|
22
|
+
* - Validation: Schema validation ensures string type
|
|
23
|
+
* - Purpose: Render HTML content in badge/component elements
|
|
24
|
+
* - XSS Protection: Content comes from trusted configuration
|
|
25
|
+
* - NOTE: For user-generated HTML, use DOMPurify sanitization instead
|
|
26
|
+
*/
|
|
27
|
+
export function parseHTMLContent(htmlString: string) {
|
|
28
|
+
return <div dangerouslySetInnerHTML={{ __html: htmlString }} />
|
|
29
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
/**
|
|
9
|
+
* Re-export from component-registry directory
|
|
10
|
+
*
|
|
11
|
+
* This file maintains backward compatibility with existing imports.
|
|
12
|
+
* The actual implementation has been split into:
|
|
13
|
+
* - structural-components.ts
|
|
14
|
+
* - text-components.ts
|
|
15
|
+
* - media-components.ts
|
|
16
|
+
* - interactive-components.ts
|
|
17
|
+
* - special-components.tsx
|
|
18
|
+
*
|
|
19
|
+
* @see src/presentation/ui/sections/rendering/component-registry/
|
|
20
|
+
*/
|
|
21
|
+
export { COMPONENT_REGISTRY } from './component-registry/'
|
|
@@ -0,0 +1,33 @@
|
|
|
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 * as Renderers from '../renderers/element-renderers'
|
|
9
|
+
import { COMPONENT_REGISTRY } from './component-registry'
|
|
10
|
+
import type { ComponentDispatchConfig } from './component-dispatch-config'
|
|
11
|
+
import type { ReactElement } from 'react'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Dispatch component rendering based on type using registry pattern
|
|
15
|
+
* Complexity reduced from 47 to <10 by replacing switch statement with lookup
|
|
16
|
+
* Parameters reduced from 7 to 1 by using config object
|
|
17
|
+
*/
|
|
18
|
+
export function dispatchComponentType(config: ComponentDispatchConfig): ReactElement | null {
|
|
19
|
+
// Registry lookup replaces giant switch statement
|
|
20
|
+
const renderer = COMPONENT_REGISTRY[config.type]
|
|
21
|
+
if (renderer) {
|
|
22
|
+
return renderer(config)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Fallback for unknown types
|
|
26
|
+
return Renderers.renderHTMLElement({
|
|
27
|
+
type: 'div',
|
|
28
|
+
props: config.elementProps,
|
|
29
|
+
content: config.content,
|
|
30
|
+
children: config.renderedChildren,
|
|
31
|
+
interactions: config.interactions,
|
|
32
|
+
})
|
|
33
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
// Barrel export for component rendering utilities
|
|
9
|
+
// Files will be added during migration
|
|
@@ -0,0 +1,96 @@
|
|
|
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 { type ReactElement, Fragment } from 'react'
|
|
9
|
+
import { BREAKPOINT_ORDER } from './responsive-resolver'
|
|
10
|
+
import type { Responsive } from '@/domain/models/app/page/common/responsive'
|
|
11
|
+
import type { Component } from '@/domain/models/app/page/sections'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Props for responsive children renderer
|
|
15
|
+
*/
|
|
16
|
+
export interface ResponsiveChildrenRendererProps {
|
|
17
|
+
readonly responsive: Responsive
|
|
18
|
+
readonly baseChildren: readonly ReactElement[] | undefined
|
|
19
|
+
readonly renderChild: (
|
|
20
|
+
child: Component | string,
|
|
21
|
+
index: number,
|
|
22
|
+
breakpoint?: string,
|
|
23
|
+
additionalClassName?: string
|
|
24
|
+
) => ReactElement
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Builds responsive children variants using CSS-based approach
|
|
29
|
+
*
|
|
30
|
+
* Renders wrapper divs for each breakpoint's children array.
|
|
31
|
+
* Each wrapper is shown/hidden via Tailwind visibility classes based on viewport width.
|
|
32
|
+
*
|
|
33
|
+
* Uses mobile-first approach with upper-bound hiding:
|
|
34
|
+
* - If next breakpoint has override: hide from next breakpoint (e.g., "block lg:hidden")
|
|
35
|
+
* - If no next override: show from this breakpoint onwards (e.g., "hidden lg:block")
|
|
36
|
+
*
|
|
37
|
+
* This approach works reliably in E2E tests because:
|
|
38
|
+
* - All children variants rendered server-side
|
|
39
|
+
* - CSS media queries control visibility (no JavaScript required)
|
|
40
|
+
* - Playwright can query visible children after viewport changes
|
|
41
|
+
* - No React state updates needed for viewport changes
|
|
42
|
+
*
|
|
43
|
+
* Example output:
|
|
44
|
+
* <nav>
|
|
45
|
+
* <div className="block lg:hidden">
|
|
46
|
+
* <button>☰</button>
|
|
47
|
+
* </div>
|
|
48
|
+
* <div className="hidden lg:block">
|
|
49
|
+
* <a>Home</a>
|
|
50
|
+
* <a>About</a>
|
|
51
|
+
* <a>Contact</a>
|
|
52
|
+
* </div>
|
|
53
|
+
* </nav>
|
|
54
|
+
*
|
|
55
|
+
* @param props - Responsive children renderer props
|
|
56
|
+
* @returns ReactElement with responsive children variants wrapped in visibility containers
|
|
57
|
+
*/
|
|
58
|
+
export function buildResponsiveChildrenVariants({
|
|
59
|
+
responsive,
|
|
60
|
+
baseChildren,
|
|
61
|
+
renderChild,
|
|
62
|
+
}: ResponsiveChildrenRendererProps): readonly ReactElement[] {
|
|
63
|
+
// Collect all breakpoints with children overrides, maintaining order
|
|
64
|
+
const breakpointsWithChildren = BREAKPOINT_ORDER.filter(
|
|
65
|
+
(bp) => responsive[bp]?.children !== undefined
|
|
66
|
+
).map((bp) => ({ breakpoint: bp, children: responsive[bp]!.children! }))
|
|
67
|
+
|
|
68
|
+
// If no responsive children overrides, return base children
|
|
69
|
+
if (breakpointsWithChildren.length === 0) {
|
|
70
|
+
return baseChildren ?? []
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Build responsive children variants by cloning elements with visibility classes
|
|
74
|
+
const childrenVariants = breakpointsWithChildren.map(({ breakpoint, children }, index) => {
|
|
75
|
+
// Determine visibility class based on next breakpoint override
|
|
76
|
+
// Use max-* utilities for upper bounds (mobile-first approach)
|
|
77
|
+
const nextBreakpoint = breakpointsWithChildren[index + 1]?.breakpoint
|
|
78
|
+
const visibilityClass = nextBreakpoint
|
|
79
|
+
? breakpoint === 'mobile'
|
|
80
|
+
? `max-${nextBreakpoint}:block ${nextBreakpoint}:hidden` // Mobile: show below next BP, hide at/above
|
|
81
|
+
: `max-${breakpoint}:hidden ${breakpoint}:block max-${nextBreakpoint}:block ${nextBreakpoint}:hidden` // Mid: hide below, show in range, hide above
|
|
82
|
+
: breakpoint === 'mobile'
|
|
83
|
+
? 'block' // Mobile with no next: always visible
|
|
84
|
+
: `max-${breakpoint}:hidden ${breakpoint}:block` // Last breakpoint: hide below, show at/above
|
|
85
|
+
|
|
86
|
+
// Render children for this breakpoint with visibility class passed to renderChild
|
|
87
|
+
// The renderChild callback will inject the className into the component's props
|
|
88
|
+
const renderedChildren = children.map((child, childIndex) =>
|
|
89
|
+
renderChild(child, childIndex, breakpoint, visibilityClass)
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
return <Fragment key={breakpoint}>{renderedChildren}</Fragment>
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
return childrenVariants
|
|
96
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
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 { type ReactElement } from 'react'
|
|
9
|
+
import { dispatchComponentType } from '../rendering/component-type-dispatcher'
|
|
10
|
+
import { BREAKPOINT_ORDER } from './responsive-resolver'
|
|
11
|
+
import type { Responsive } from '@/domain/models/app/page/common/responsive'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Builds responsive content variants using CSS-based approach (nested span strategy)
|
|
15
|
+
*
|
|
16
|
+
* Renders a single wrapper element with nested span elements for each breakpoint's content.
|
|
17
|
+
* Each span is shown/hidden via Tailwind visibility classes based on viewport width.
|
|
18
|
+
*
|
|
19
|
+
* Uses mobile-first approach with upper-bound hiding:
|
|
20
|
+
* - If next breakpoint has override: hide from next breakpoint (e.g., "inline max-md:inline md:hidden")
|
|
21
|
+
* - If no next override: show from this breakpoint onwards (e.g., "max-md:hidden md:inline")
|
|
22
|
+
*
|
|
23
|
+
* This approach works reliably in E2E tests because:
|
|
24
|
+
* - Single parent element (avoids Playwright strict mode violations)
|
|
25
|
+
* - Nested spans with responsive visibility (inline elements for text concatenation)
|
|
26
|
+
* - CSS media queries control visibility (display: none via Tailwind)
|
|
27
|
+
* - Playwright's toHaveText() only reads visible span's textContent
|
|
28
|
+
*
|
|
29
|
+
* Example output:
|
|
30
|
+
* <h1>
|
|
31
|
+
* <span className="inline max-md:inline md:hidden">Mobile!</span>
|
|
32
|
+
* <span className="max-md:hidden md:inline max-lg:inline lg:hidden">Tablet Welcome</span>
|
|
33
|
+
* <span className="max-lg:hidden lg:inline">Desktop Welcome</span>
|
|
34
|
+
* </h1>
|
|
35
|
+
*
|
|
36
|
+
* @param responsive - Responsive configuration
|
|
37
|
+
* @param type - Component type (e.g., 'heading', 'text')
|
|
38
|
+
* @param elementProps - Element props for the wrapper
|
|
39
|
+
* @param elementPropsWithSpacing - Element props with spacing
|
|
40
|
+
* @returns ReactElement with nested responsive content spans (or null if dispatcher returns null)
|
|
41
|
+
*/
|
|
42
|
+
export function buildResponsiveContentVariants(
|
|
43
|
+
responsive: Responsive,
|
|
44
|
+
type: string,
|
|
45
|
+
elementProps: Record<string, unknown>,
|
|
46
|
+
elementPropsWithSpacing: Record<string, unknown>
|
|
47
|
+
): ReactElement | null {
|
|
48
|
+
// Collect all breakpoints with content overrides, maintaining order
|
|
49
|
+
const breakpointsWithContent = BREAKPOINT_ORDER.filter(
|
|
50
|
+
(bp) => responsive[bp]?.content !== undefined
|
|
51
|
+
).map((bp, index, array) => ({
|
|
52
|
+
breakpoint: bp,
|
|
53
|
+
content: responsive[bp]!.content!,
|
|
54
|
+
nextBreakpoint: array[index + 1],
|
|
55
|
+
}))
|
|
56
|
+
|
|
57
|
+
// Build nested span elements with responsive visibility classes
|
|
58
|
+
const contentSpans = breakpointsWithContent.map(
|
|
59
|
+
({ breakpoint, content: variantContent, nextBreakpoint }) => {
|
|
60
|
+
// Calculate visibility class using block/hidden for proper Tailwind display toggling
|
|
61
|
+
// Same logic as children builder but using inline-block for text content
|
|
62
|
+
const visibilityClass = nextBreakpoint
|
|
63
|
+
? breakpoint === 'mobile'
|
|
64
|
+
? `inline-block max-${nextBreakpoint}:inline-block ${nextBreakpoint}:hidden` // Mobile: show below next BP, hide at/above
|
|
65
|
+
: `max-${breakpoint}:hidden ${breakpoint}:inline-block max-${nextBreakpoint}:inline-block ${nextBreakpoint}:hidden` // Mid: hide below, show in range, hide above
|
|
66
|
+
: breakpoint === 'mobile'
|
|
67
|
+
? 'inline-block' // Mobile with no next: always visible
|
|
68
|
+
: `max-${breakpoint}:hidden ${breakpoint}:inline-block` // Last breakpoint: hide below, show at/above
|
|
69
|
+
|
|
70
|
+
// Use data attribute to track which breakpoint this span represents
|
|
71
|
+
// This helps with debugging and ensures each span is uniquely identifiable
|
|
72
|
+
return (
|
|
73
|
+
<span
|
|
74
|
+
key={breakpoint}
|
|
75
|
+
className={visibilityClass}
|
|
76
|
+
data-responsive-breakpoint={breakpoint}
|
|
77
|
+
>
|
|
78
|
+
{variantContent}
|
|
79
|
+
</span>
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
// Dispatch the wrapper component with nested content spans as children
|
|
85
|
+
return dispatchComponentType({
|
|
86
|
+
type,
|
|
87
|
+
elementProps,
|
|
88
|
+
elementPropsWithSpacing,
|
|
89
|
+
content: undefined,
|
|
90
|
+
renderedChildren: contentSpans as readonly ReactElement[],
|
|
91
|
+
theme: undefined,
|
|
92
|
+
languages: undefined,
|
|
93
|
+
interactions: undefined,
|
|
94
|
+
})
|
|
95
|
+
}
|