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,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Schema } from 'effect'
|
|
9
|
+
import { ViewFiltersSchema } from '../../views/filters'
|
|
10
|
+
import { BaseFieldSchema } from '../base-field'
|
|
11
|
+
|
|
12
|
+
export const RollupFieldSchema = BaseFieldSchema.pipe(
|
|
13
|
+
Schema.extend(
|
|
14
|
+
Schema.Struct({
|
|
15
|
+
type: Schema.Literal('rollup'),
|
|
16
|
+
relationshipField: Schema.String.pipe(
|
|
17
|
+
Schema.nonEmptyString({ message: () => 'relationshipField is required' }),
|
|
18
|
+
Schema.annotations({ description: 'Name of the relationship field to aggregate from' })
|
|
19
|
+
),
|
|
20
|
+
relatedField: Schema.String.pipe(
|
|
21
|
+
Schema.nonEmptyString({ message: () => 'relatedField is required' }),
|
|
22
|
+
Schema.annotations({ description: 'Name of the field in the related table to aggregate' })
|
|
23
|
+
),
|
|
24
|
+
aggregation: Schema.String.pipe(
|
|
25
|
+
Schema.annotations({ description: 'Aggregation function to apply' })
|
|
26
|
+
),
|
|
27
|
+
format: Schema.optional(
|
|
28
|
+
Schema.String.pipe(
|
|
29
|
+
Schema.annotations({
|
|
30
|
+
description: 'Display format for the result',
|
|
31
|
+
examples: ['currency', 'number', 'percentage'],
|
|
32
|
+
})
|
|
33
|
+
)
|
|
34
|
+
),
|
|
35
|
+
filters: Schema.optional(
|
|
36
|
+
ViewFiltersSchema.pipe(
|
|
37
|
+
Schema.annotations({ description: 'Filters to apply to the rollup aggregation' })
|
|
38
|
+
)
|
|
39
|
+
),
|
|
40
|
+
})
|
|
41
|
+
),
|
|
42
|
+
Schema.annotations({
|
|
43
|
+
title: 'Rollup Field',
|
|
44
|
+
description: 'Aggregates values from related records using functions like SUM, AVG, COUNT.',
|
|
45
|
+
examples: [
|
|
46
|
+
{
|
|
47
|
+
id: 1,
|
|
48
|
+
name: 'total_sales',
|
|
49
|
+
type: 'rollup',
|
|
50
|
+
relationshipField: 'orders',
|
|
51
|
+
relatedField: 'amount',
|
|
52
|
+
aggregation: 'SUM',
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
})
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
export type RollupField = Schema.Schema.Type<typeof RollupFieldSchema>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Schema } from 'effect'
|
|
9
|
+
import { BaseFieldSchema } from '../base-field'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Checkbox Field
|
|
13
|
+
*
|
|
14
|
+
* Boolean field that stores true/false values.
|
|
15
|
+
* Typically rendered as a checkbox in the UI.
|
|
16
|
+
* Supports optional default value and database indexing.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const field = {
|
|
21
|
+
* id: 1,
|
|
22
|
+
* name: 'is_active',
|
|
23
|
+
* type: 'checkbox',
|
|
24
|
+
* required: true,
|
|
25
|
+
* default: false
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export const CheckboxFieldSchema = BaseFieldSchema.pipe(
|
|
30
|
+
Schema.extend(
|
|
31
|
+
Schema.Struct({
|
|
32
|
+
type: Schema.Literal('checkbox'),
|
|
33
|
+
default: Schema.optional(Schema.Boolean),
|
|
34
|
+
})
|
|
35
|
+
),
|
|
36
|
+
Schema.annotations({
|
|
37
|
+
title: 'Checkbox Field',
|
|
38
|
+
description: 'Boolean field for true/false values. Typically rendered as a checkbox in the UI.',
|
|
39
|
+
examples: [
|
|
40
|
+
{
|
|
41
|
+
id: 1,
|
|
42
|
+
name: 'is_active',
|
|
43
|
+
type: 'checkbox',
|
|
44
|
+
required: true,
|
|
45
|
+
default: false,
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
})
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
export type CheckboxField = Schema.Schema.Type<typeof CheckboxFieldSchema>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export * from './single-select-field'
|
|
9
|
+
export * from './multi-select-field'
|
|
10
|
+
export * from './checkbox-field'
|
|
11
|
+
export * from './status-field'
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Schema } from 'effect'
|
|
9
|
+
import { BaseFieldSchema } from '../base-field'
|
|
10
|
+
import { createOptionsSchema } from '../validation-utils'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Multi Select Field
|
|
14
|
+
*
|
|
15
|
+
* Allows selection of multiple options from a predefined list.
|
|
16
|
+
* Commonly used for tags, categories, or any multi-valued selections.
|
|
17
|
+
* Supports optional default value array and maximum selection limit.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const field = {
|
|
22
|
+
* id: 1,
|
|
23
|
+
* name: 'tags',
|
|
24
|
+
* type: 'multi-select',
|
|
25
|
+
* options: ['Urgent', 'Important', 'Review'],
|
|
26
|
+
* maxSelections: 3,
|
|
27
|
+
* default: ['Important']
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export const MultiSelectFieldSchema = BaseFieldSchema.pipe(
|
|
32
|
+
Schema.extend(
|
|
33
|
+
Schema.Struct({
|
|
34
|
+
type: Schema.Literal('multi-select'),
|
|
35
|
+
options: createOptionsSchema('multi-select'),
|
|
36
|
+
maxSelections: Schema.optional(
|
|
37
|
+
Schema.Int.pipe(
|
|
38
|
+
Schema.greaterThanOrEqualTo(1),
|
|
39
|
+
Schema.annotations({
|
|
40
|
+
description: 'Maximum number of selections allowed',
|
|
41
|
+
})
|
|
42
|
+
)
|
|
43
|
+
),
|
|
44
|
+
default: Schema.optional(Schema.Array(Schema.String)),
|
|
45
|
+
})
|
|
46
|
+
),
|
|
47
|
+
Schema.filter((field) => {
|
|
48
|
+
if (field.maxSelections !== undefined && field.maxSelections > field.options.length) {
|
|
49
|
+
return 'maxSelections exceeds available options'
|
|
50
|
+
}
|
|
51
|
+
return true
|
|
52
|
+
}),
|
|
53
|
+
Schema.annotations({
|
|
54
|
+
title: 'Multi Select Field',
|
|
55
|
+
description: 'Allows selection of multiple options from predefined list.',
|
|
56
|
+
examples: [
|
|
57
|
+
{
|
|
58
|
+
id: 1,
|
|
59
|
+
name: 'tags',
|
|
60
|
+
type: 'multi-select',
|
|
61
|
+
options: ['Urgent', 'Important', 'Review'],
|
|
62
|
+
maxSelections: 3,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
})
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
export type MultiSelectField = Schema.Schema.Type<typeof MultiSelectFieldSchema>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Schema } from 'effect'
|
|
9
|
+
import { BaseFieldSchema } from '../base-field'
|
|
10
|
+
import { createOptionsSchema } from '../validation-utils'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Single Select Field
|
|
14
|
+
*
|
|
15
|
+
* Allows selection of one option from a predefined list.
|
|
16
|
+
* Commonly used for categories, statuses, or any enumerated values.
|
|
17
|
+
* Supports optional default value selection.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const field = {
|
|
22
|
+
* id: 1,
|
|
23
|
+
* name: 'category',
|
|
24
|
+
* type: 'single-select',
|
|
25
|
+
* options: ['Electronics', 'Clothing', 'Food'],
|
|
26
|
+
* default: 'Electronics'
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export const SingleSelectFieldSchema = BaseFieldSchema.pipe(
|
|
31
|
+
Schema.extend(
|
|
32
|
+
Schema.Struct({
|
|
33
|
+
type: Schema.Literal('single-select'),
|
|
34
|
+
options: createOptionsSchema('single-select'),
|
|
35
|
+
default: Schema.optional(Schema.String),
|
|
36
|
+
})
|
|
37
|
+
),
|
|
38
|
+
Schema.annotations({
|
|
39
|
+
title: 'Single Select Field',
|
|
40
|
+
description:
|
|
41
|
+
'Allows selection of one option from predefined list. Used for categories or enumerated values.',
|
|
42
|
+
examples: [
|
|
43
|
+
{
|
|
44
|
+
id: 1,
|
|
45
|
+
name: 'category',
|
|
46
|
+
type: 'single-select',
|
|
47
|
+
options: ['Electronics', 'Clothing', 'Food'],
|
|
48
|
+
default: 'Electronics',
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
})
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
export type SingleSelectField = Schema.Schema.Type<typeof SingleSelectFieldSchema>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Schema } from 'effect'
|
|
9
|
+
import { BaseFieldSchema } from '../base-field'
|
|
10
|
+
import { createStatusOptionsSchema } from '../validation-utils'
|
|
11
|
+
|
|
12
|
+
export const StatusFieldSchema = BaseFieldSchema.pipe(
|
|
13
|
+
Schema.extend(
|
|
14
|
+
Schema.Struct({
|
|
15
|
+
type: Schema.Literal('status'),
|
|
16
|
+
options: createStatusOptionsSchema(),
|
|
17
|
+
default: Schema.optional(Schema.String),
|
|
18
|
+
})
|
|
19
|
+
),
|
|
20
|
+
Schema.annotations({
|
|
21
|
+
title: 'Status Field',
|
|
22
|
+
description: 'Status field with colored options for workflow states.',
|
|
23
|
+
examples: [
|
|
24
|
+
{
|
|
25
|
+
id: 1,
|
|
26
|
+
name: 'status',
|
|
27
|
+
type: 'status',
|
|
28
|
+
options: [
|
|
29
|
+
{ value: 'todo', color: '#94A3B8' },
|
|
30
|
+
{ value: 'in_progress', color: '#3B82F6' },
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
})
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
export type StatusField = Schema.Schema.Type<typeof StatusFieldSchema>
|
|
@@ -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 { Schema } from 'effect'
|
|
9
|
+
import { BaseFieldSchema } from '../base-field'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Email Field
|
|
13
|
+
*
|
|
14
|
+
* Text field with email format validation. Stores email addresses and validates
|
|
15
|
+
* them against standard email format rules (RFC 5322). Can be marked as required,
|
|
16
|
+
* unique (for user authentication), or indexed for fast lookups. Email validation
|
|
17
|
+
* ensures data integrity and prevents invalid email addresses from being stored.
|
|
18
|
+
*
|
|
19
|
+
* Business Rules:
|
|
20
|
+
* - Email format validation enforced at application level using RFC 5322 standard
|
|
21
|
+
* - Unique constraint recommended for user authentication and preventing duplicate accounts
|
|
22
|
+
* - Indexing recommended for user lookup, login, and search operations
|
|
23
|
+
* - Case-insensitive comparison for uniqueness checks to prevent duplicate emails
|
|
24
|
+
* - Constant value 'email' ensures type safety and enables discriminated unions
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const field = {
|
|
29
|
+
* id: 1,
|
|
30
|
+
* name: 'email',
|
|
31
|
+
* type: 'email',
|
|
32
|
+
* required: true,
|
|
33
|
+
* unique: true,
|
|
34
|
+
* indexed: true,
|
|
35
|
+
* default: 'user@example.com'
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export const EmailFieldSchema = BaseFieldSchema.pipe(
|
|
40
|
+
Schema.extend(
|
|
41
|
+
Schema.Struct({
|
|
42
|
+
type: Schema.Literal('email').pipe(
|
|
43
|
+
Schema.annotations({
|
|
44
|
+
description: "Constant value 'email' for type discrimination in discriminated unions",
|
|
45
|
+
})
|
|
46
|
+
),
|
|
47
|
+
default: Schema.optional(
|
|
48
|
+
Schema.String.pipe(
|
|
49
|
+
Schema.annotations({
|
|
50
|
+
description: 'Default email address when creating new records',
|
|
51
|
+
})
|
|
52
|
+
)
|
|
53
|
+
),
|
|
54
|
+
})
|
|
55
|
+
),
|
|
56
|
+
Schema.annotations({
|
|
57
|
+
title: 'Email Field',
|
|
58
|
+
description:
|
|
59
|
+
'Text field with email format validation (RFC 5322). Validates email addresses and prevents invalid formats from being stored.',
|
|
60
|
+
examples: [
|
|
61
|
+
{
|
|
62
|
+
id: 1,
|
|
63
|
+
name: 'email',
|
|
64
|
+
type: 'email',
|
|
65
|
+
required: true,
|
|
66
|
+
unique: true,
|
|
67
|
+
indexed: true,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 2,
|
|
71
|
+
name: 'contact_email',
|
|
72
|
+
type: 'email',
|
|
73
|
+
required: false,
|
|
74
|
+
default: 'contact@example.com',
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
})
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
export type EmailField = Schema.Schema.Type<typeof EmailFieldSchema>
|
|
@@ -0,0 +1,13 @@
|
|
|
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 * from './single-line-text-field'
|
|
9
|
+
export * from './long-text-field'
|
|
10
|
+
export * from './rich-text-field'
|
|
11
|
+
export * from './email-field'
|
|
12
|
+
export * from './url-field'
|
|
13
|
+
export * from './phone-number-field'
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Schema } from 'effect'
|
|
9
|
+
import { BaseFieldSchema } from '../base-field'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Long Text Field
|
|
13
|
+
*
|
|
14
|
+
* Multi-line text input for paragraphs, descriptions, notes, and comments.
|
|
15
|
+
* Supports line breaks and longer content. Text is stored as-is without rich
|
|
16
|
+
* formatting (no bold, italics, etc.). Required flag makes the field mandatory.
|
|
17
|
+
* Indexing improves search performance but may be slower for very long content.
|
|
18
|
+
*
|
|
19
|
+
* Business Rules:
|
|
20
|
+
* - Multi-line support allows paragraphs and extended content while preserving line breaks
|
|
21
|
+
* - Text is stored without formatting, focusing on plain text content
|
|
22
|
+
* - Indexing optional due to performance trade-offs with large text content
|
|
23
|
+
* - Constant value 'long-text' ensures type safety and enables discriminated unions
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const field = {
|
|
28
|
+
* id: 1,
|
|
29
|
+
* name: 'description',
|
|
30
|
+
* type: 'long-text',
|
|
31
|
+
* required: true,
|
|
32
|
+
* indexed: false,
|
|
33
|
+
* default: 'Enter description here...'
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export const LongTextFieldSchema = BaseFieldSchema.pipe(
|
|
38
|
+
Schema.extend(
|
|
39
|
+
Schema.Struct({
|
|
40
|
+
type: Schema.Literal('long-text').pipe(
|
|
41
|
+
Schema.annotations({
|
|
42
|
+
description: "Constant value 'long-text' for type discrimination in discriminated unions",
|
|
43
|
+
})
|
|
44
|
+
),
|
|
45
|
+
default: Schema.optional(
|
|
46
|
+
Schema.String.pipe(
|
|
47
|
+
Schema.annotations({
|
|
48
|
+
description: 'Default value for this field when creating new records',
|
|
49
|
+
})
|
|
50
|
+
)
|
|
51
|
+
),
|
|
52
|
+
})
|
|
53
|
+
),
|
|
54
|
+
Schema.annotations({
|
|
55
|
+
title: 'Long Text Field',
|
|
56
|
+
description:
|
|
57
|
+
'Multi-line text input for paragraphs, descriptions, notes, and comments. Supports line breaks and longer content without rich formatting.',
|
|
58
|
+
examples: [
|
|
59
|
+
{
|
|
60
|
+
id: 1,
|
|
61
|
+
name: 'description',
|
|
62
|
+
type: 'long-text',
|
|
63
|
+
required: true,
|
|
64
|
+
indexed: false,
|
|
65
|
+
default: 'Enter description here...',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: 2,
|
|
69
|
+
name: 'notes',
|
|
70
|
+
type: 'long-text',
|
|
71
|
+
required: false,
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
})
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
export type LongTextField = Schema.Schema.Type<typeof LongTextFieldSchema>
|
|
@@ -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 { Schema } from 'effect'
|
|
9
|
+
import { BaseFieldSchema } from '../base-field'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Phone Number Field
|
|
13
|
+
*
|
|
14
|
+
* Text field designed for storing phone numbers with optional format validation.
|
|
15
|
+
* Stores phone numbers as plain text strings, supporting international formats
|
|
16
|
+
* and various notation styles. Can be marked as required, unique (for preventing
|
|
17
|
+
* duplicate registrations), or indexed for fast lookups. No automatic formatting
|
|
18
|
+
* is applied - numbers are stored exactly as entered.
|
|
19
|
+
*
|
|
20
|
+
* Business Rules:
|
|
21
|
+
* - Phone numbers stored as text strings to preserve original formatting (spaces, dashes, parentheses)
|
|
22
|
+
* - No automatic validation applied - allows flexibility for international formats
|
|
23
|
+
* - Unique constraint useful for preventing duplicate user registrations
|
|
24
|
+
* - Indexing recommended for user lookup and search operations
|
|
25
|
+
* - Constant value 'phone-number' ensures type safety and enables discriminated unions
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const field = {
|
|
30
|
+
* id: 1,
|
|
31
|
+
* name: 'mobile_phone',
|
|
32
|
+
* type: 'phone-number',
|
|
33
|
+
* required: true,
|
|
34
|
+
* unique: true,
|
|
35
|
+
* indexed: true,
|
|
36
|
+
* default: '+1 (555) 000-0000'
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export const PhoneNumberFieldSchema = BaseFieldSchema.pipe(
|
|
41
|
+
Schema.extend(
|
|
42
|
+
Schema.Struct({
|
|
43
|
+
type: Schema.Literal('phone-number').pipe(
|
|
44
|
+
Schema.annotations({
|
|
45
|
+
description:
|
|
46
|
+
"Constant value 'phone-number' for type discrimination in discriminated unions",
|
|
47
|
+
})
|
|
48
|
+
),
|
|
49
|
+
default: Schema.optional(
|
|
50
|
+
Schema.String.pipe(
|
|
51
|
+
Schema.annotations({
|
|
52
|
+
description: 'Default phone number value when creating new records',
|
|
53
|
+
})
|
|
54
|
+
)
|
|
55
|
+
),
|
|
56
|
+
})
|
|
57
|
+
),
|
|
58
|
+
Schema.annotations({
|
|
59
|
+
title: 'Phone Number Field',
|
|
60
|
+
description:
|
|
61
|
+
'Text field for storing phone numbers with support for international formats. Numbers are stored as plain text without automatic formatting.',
|
|
62
|
+
examples: [
|
|
63
|
+
{
|
|
64
|
+
id: 1,
|
|
65
|
+
name: 'mobile_phone',
|
|
66
|
+
type: 'phone-number',
|
|
67
|
+
required: true,
|
|
68
|
+
unique: true,
|
|
69
|
+
indexed: true,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
id: 2,
|
|
73
|
+
name: 'office_phone',
|
|
74
|
+
type: 'phone-number',
|
|
75
|
+
required: false,
|
|
76
|
+
default: '+1 (555) 000-0000',
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
})
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
export type PhoneNumberField = Schema.Schema.Type<typeof PhoneNumberFieldSchema>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Schema } from 'effect'
|
|
9
|
+
import { BaseFieldSchema } from '../base-field'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Rich Text Field
|
|
13
|
+
*
|
|
14
|
+
* Stores formatted text with support for bold, italic, links, lists, and other rich formatting.
|
|
15
|
+
* Typically rendered with a WYSIWYG editor in the UI.
|
|
16
|
+
* Supports optional maximum length constraints.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const field = {
|
|
21
|
+
* id: 1,
|
|
22
|
+
* name: 'article_content',
|
|
23
|
+
* type: 'rich-text',
|
|
24
|
+
* required: true,
|
|
25
|
+
* maxLength: 10000
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export const RichTextFieldSchema = BaseFieldSchema.pipe(
|
|
30
|
+
Schema.extend(
|
|
31
|
+
Schema.Struct({
|
|
32
|
+
type: Schema.Literal('rich-text'),
|
|
33
|
+
maxLength: Schema.optional(
|
|
34
|
+
Schema.Int.pipe(
|
|
35
|
+
Schema.greaterThanOrEqualTo(1),
|
|
36
|
+
Schema.annotations({
|
|
37
|
+
description: 'Maximum length in characters',
|
|
38
|
+
})
|
|
39
|
+
)
|
|
40
|
+
),
|
|
41
|
+
fullTextSearch: Schema.optional(
|
|
42
|
+
Schema.Boolean.pipe(
|
|
43
|
+
Schema.annotations({
|
|
44
|
+
description: 'Enable full-text search indexing for this field',
|
|
45
|
+
})
|
|
46
|
+
)
|
|
47
|
+
),
|
|
48
|
+
})
|
|
49
|
+
),
|
|
50
|
+
Schema.annotations({
|
|
51
|
+
title: 'Rich Text Field',
|
|
52
|
+
description:
|
|
53
|
+
'Stores formatted text with rich formatting support. Rendered with WYSIWYG editor in UI.',
|
|
54
|
+
examples: [
|
|
55
|
+
{
|
|
56
|
+
id: 1,
|
|
57
|
+
name: 'article_content',
|
|
58
|
+
type: 'rich-text',
|
|
59
|
+
required: true,
|
|
60
|
+
maxLength: 10_000,
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
})
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
export type RichTextField = Schema.Schema.Type<typeof RichTextFieldSchema>
|
|
@@ -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 { Schema } from 'effect'
|
|
9
|
+
import { BaseFieldSchema } from '../base-field'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Single Line Text Field
|
|
13
|
+
*
|
|
14
|
+
* Short text input limited to a single line. Ideal for names, titles, labels,
|
|
15
|
+
* and brief identifiers. Text is stored as-is without formatting. Required flag
|
|
16
|
+
* makes the field mandatory. Unique constraint ensures no duplicate values across
|
|
17
|
+
* records. Indexing improves search and filter performance on this field.
|
|
18
|
+
*
|
|
19
|
+
* Business Rules:
|
|
20
|
+
* - Single-line constraint prevents multi-line input, ensuring consistent formatting and UI display
|
|
21
|
+
* - Text is stored without formatting, preserving raw input for maximum flexibility
|
|
22
|
+
* - Constant value 'single-line-text' ensures type safety and enables discriminated unions
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const field = {
|
|
27
|
+
* id: 1,
|
|
28
|
+
* name: 'title',
|
|
29
|
+
* type: 'single-line-text',
|
|
30
|
+
* required: true,
|
|
31
|
+
* unique: false,
|
|
32
|
+
* indexed: true,
|
|
33
|
+
* default: 'Untitled'
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export const SingleLineTextFieldSchema = BaseFieldSchema.pipe(
|
|
38
|
+
Schema.extend(
|
|
39
|
+
Schema.Struct({
|
|
40
|
+
type: Schema.Literal('single-line-text').pipe(
|
|
41
|
+
Schema.annotations({
|
|
42
|
+
description:
|
|
43
|
+
"Constant value 'single-line-text' for type discrimination in discriminated unions",
|
|
44
|
+
})
|
|
45
|
+
),
|
|
46
|
+
default: Schema.optional(
|
|
47
|
+
Schema.String.pipe(
|
|
48
|
+
Schema.annotations({
|
|
49
|
+
description: 'Default value for this field when creating new records',
|
|
50
|
+
})
|
|
51
|
+
)
|
|
52
|
+
),
|
|
53
|
+
})
|
|
54
|
+
),
|
|
55
|
+
Schema.annotations({
|
|
56
|
+
title: 'Single Line Text Field',
|
|
57
|
+
description:
|
|
58
|
+
'Short text input limited to a single line. Ideal for names, titles, labels, and brief identifiers. Text is stored as-is without formatting.',
|
|
59
|
+
examples: [
|
|
60
|
+
{
|
|
61
|
+
id: 1,
|
|
62
|
+
name: 'title',
|
|
63
|
+
type: 'single-line-text',
|
|
64
|
+
required: true,
|
|
65
|
+
unique: false,
|
|
66
|
+
indexed: true,
|
|
67
|
+
default: 'Untitled',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 2,
|
|
71
|
+
name: 'first_name',
|
|
72
|
+
type: 'single-line-text',
|
|
73
|
+
required: true,
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
})
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
export type SingleLineTextField = Schema.Schema.Type<typeof SingleLineTextFieldSchema>
|