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,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 { Schema } from 'effect'
|
|
9
|
+
import { BaseFieldSchema } from '../base-field'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Date Field
|
|
13
|
+
*
|
|
14
|
+
* Stores date and optionally time values.
|
|
15
|
+
* Supports custom date formats, timezone configuration, and time inclusion.
|
|
16
|
+
* Can be marked as required, unique, or indexed for efficient date-based queries.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const field = {
|
|
21
|
+
* id: 1,
|
|
22
|
+
* name: 'due_date',
|
|
23
|
+
* type: 'date',
|
|
24
|
+
* required: true,
|
|
25
|
+
* format: 'YYYY-MM-DD',
|
|
26
|
+
* includeTime: false
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export const DateFieldSchema = BaseFieldSchema.pipe(
|
|
31
|
+
Schema.extend(
|
|
32
|
+
Schema.Struct({
|
|
33
|
+
type: Schema.Literal('date', 'datetime', 'time'),
|
|
34
|
+
format: Schema.optional(
|
|
35
|
+
Schema.String.pipe(
|
|
36
|
+
Schema.annotations({
|
|
37
|
+
description: 'Date format string',
|
|
38
|
+
examples: ['YYYY-MM-DD', 'MM/DD/YYYY', 'DD-MM-YYYY'],
|
|
39
|
+
})
|
|
40
|
+
)
|
|
41
|
+
),
|
|
42
|
+
dateFormat: Schema.optional(
|
|
43
|
+
Schema.Literal('US', 'European', 'ISO').pipe(
|
|
44
|
+
Schema.annotations({
|
|
45
|
+
description: 'Date display format preset',
|
|
46
|
+
examples: ['US', 'European', 'ISO'],
|
|
47
|
+
})
|
|
48
|
+
)
|
|
49
|
+
),
|
|
50
|
+
timeFormat: Schema.optional(
|
|
51
|
+
Schema.Literal('12-hour', '24-hour').pipe(
|
|
52
|
+
Schema.annotations({
|
|
53
|
+
description: 'Time display format (12-hour with AM/PM or 24-hour)',
|
|
54
|
+
examples: ['12-hour', '24-hour'],
|
|
55
|
+
})
|
|
56
|
+
)
|
|
57
|
+
),
|
|
58
|
+
includeTime: Schema.optional(Schema.Boolean),
|
|
59
|
+
timezone: Schema.optional(
|
|
60
|
+
Schema.String.pipe(
|
|
61
|
+
Schema.annotations({
|
|
62
|
+
description: 'Timezone for datetime fields',
|
|
63
|
+
examples: ['UTC', 'America/New_York', 'Europe/London'],
|
|
64
|
+
})
|
|
65
|
+
)
|
|
66
|
+
),
|
|
67
|
+
timeZone: Schema.optional(
|
|
68
|
+
Schema.Union(Schema.Literal('local'), Schema.String).pipe(
|
|
69
|
+
Schema.annotations({
|
|
70
|
+
description: 'Timezone setting (specific timezone or "local" for browser timezone)',
|
|
71
|
+
examples: ['local', 'America/New_York', 'Europe/Paris'],
|
|
72
|
+
})
|
|
73
|
+
)
|
|
74
|
+
),
|
|
75
|
+
default: Schema.optional(Schema.String),
|
|
76
|
+
})
|
|
77
|
+
),
|
|
78
|
+
Schema.annotations({
|
|
79
|
+
title: 'Date Field',
|
|
80
|
+
description:
|
|
81
|
+
'Stores date and optionally time values. Supports custom formats, timezones, and time inclusion.',
|
|
82
|
+
examples: [
|
|
83
|
+
{
|
|
84
|
+
id: 1,
|
|
85
|
+
name: 'due_date',
|
|
86
|
+
type: 'date',
|
|
87
|
+
required: true,
|
|
88
|
+
format: 'YYYY-MM-DD',
|
|
89
|
+
includeTime: false,
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
})
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
export type DateField = Schema.Schema.Type<typeof DateFieldSchema>
|
|
@@ -0,0 +1,56 @@
|
|
|
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
|
+
* Deleted At Field
|
|
13
|
+
*
|
|
14
|
+
* Captures the timestamp when a record is soft-deleted.
|
|
15
|
+
* When NULL, the record is considered active (not deleted).
|
|
16
|
+
* When set, the record is considered soft-deleted and should be
|
|
17
|
+
* excluded from normal queries.
|
|
18
|
+
*
|
|
19
|
+
* This field enables soft delete functionality, allowing records
|
|
20
|
+
* to be "deleted" without permanent removal, supporting:
|
|
21
|
+
* - Record restoration
|
|
22
|
+
* - Audit trails
|
|
23
|
+
* - Data recovery
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const field = {
|
|
28
|
+
* id: 1,
|
|
29
|
+
* name: 'deleted_at',
|
|
30
|
+
* type: 'deleted-at',
|
|
31
|
+
* indexed: true
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export const DeletedAtFieldSchema = BaseFieldSchema.pipe(
|
|
36
|
+
Schema.extend(
|
|
37
|
+
Schema.Struct({
|
|
38
|
+
type: Schema.Literal('deleted-at'),
|
|
39
|
+
})
|
|
40
|
+
),
|
|
41
|
+
Schema.annotations({
|
|
42
|
+
title: 'Deleted At Field',
|
|
43
|
+
description:
|
|
44
|
+
'Captures the timestamp when a record is soft-deleted. NULL indicates the record is active. Enables soft delete with record restoration capability.',
|
|
45
|
+
examples: [
|
|
46
|
+
{
|
|
47
|
+
id: 1,
|
|
48
|
+
name: 'deleted_at',
|
|
49
|
+
type: 'deleted-at',
|
|
50
|
+
indexed: true,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
})
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
export type DeletedAtField = Schema.Schema.Type<typeof DeletedAtFieldSchema>
|
|
@@ -0,0 +1,73 @@
|
|
|
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
|
+
* Duration Field
|
|
13
|
+
*
|
|
14
|
+
* Stores time duration values (e.g., hours, minutes, seconds).
|
|
15
|
+
* Used for tracking elapsed time, work hours, or time intervals.
|
|
16
|
+
* Supports custom display formats for presenting duration values.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const field = {
|
|
21
|
+
* id: 1,
|
|
22
|
+
* name: 'work_hours',
|
|
23
|
+
* type: 'duration',
|
|
24
|
+
* required: true,
|
|
25
|
+
* format: 'h:mm'
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export const DurationFieldSchema = BaseFieldSchema.pipe(
|
|
30
|
+
Schema.extend(
|
|
31
|
+
Schema.Struct({
|
|
32
|
+
type: Schema.Literal('duration'),
|
|
33
|
+
format: Schema.optional(
|
|
34
|
+
Schema.String.pipe(
|
|
35
|
+
Schema.annotations({
|
|
36
|
+
description: 'Display format for the duration',
|
|
37
|
+
})
|
|
38
|
+
)
|
|
39
|
+
),
|
|
40
|
+
displayFormat: Schema.optional(
|
|
41
|
+
Schema.Literal('h:mm', 'h:mm:ss', 'decimal').pipe(
|
|
42
|
+
Schema.annotations({
|
|
43
|
+
description: 'Display format preset for duration values',
|
|
44
|
+
examples: ['h:mm', 'h:mm:ss', 'decimal'],
|
|
45
|
+
})
|
|
46
|
+
)
|
|
47
|
+
),
|
|
48
|
+
default: Schema.optional(
|
|
49
|
+
Schema.Number.pipe(
|
|
50
|
+
Schema.annotations({
|
|
51
|
+
description: 'Default duration value in seconds when creating new records',
|
|
52
|
+
})
|
|
53
|
+
)
|
|
54
|
+
),
|
|
55
|
+
})
|
|
56
|
+
),
|
|
57
|
+
Schema.annotations({
|
|
58
|
+
title: 'Duration Field',
|
|
59
|
+
description:
|
|
60
|
+
'Stores time duration values. Used for tracking elapsed time or work hours with custom formats.',
|
|
61
|
+
examples: [
|
|
62
|
+
{
|
|
63
|
+
id: 1,
|
|
64
|
+
name: 'work_hours',
|
|
65
|
+
type: 'duration',
|
|
66
|
+
required: true,
|
|
67
|
+
format: 'h:mm',
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
})
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
export type DurationField = Schema.Schema.Type<typeof DurationFieldSchema>
|
|
@@ -0,0 +1,12 @@
|
|
|
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 './date-field'
|
|
9
|
+
export * from './duration-field'
|
|
10
|
+
export * from './created-at-field'
|
|
11
|
+
export * from './updated-at-field'
|
|
12
|
+
export * from './deleted-at-field'
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Schema } from 'effect'
|
|
9
|
+
import { BaseFieldSchema } from '../base-field'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Updated At Field
|
|
13
|
+
*
|
|
14
|
+
* Automatically updates the timestamp whenever a record is modified.
|
|
15
|
+
* This field is system-managed and cannot be manually edited.
|
|
16
|
+
* Automatically updates on every record update operation.
|
|
17
|
+
* Commonly used for tracking last modification time and cache invalidation.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const field = {
|
|
22
|
+
* id: 1,
|
|
23
|
+
* name: 'updated_at',
|
|
24
|
+
* type: 'updated-at',
|
|
25
|
+
* indexed: true
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export const UpdatedAtFieldSchema = BaseFieldSchema.pipe(
|
|
30
|
+
Schema.extend(
|
|
31
|
+
Schema.Struct({
|
|
32
|
+
type: Schema.Literal('updated-at'),
|
|
33
|
+
})
|
|
34
|
+
),
|
|
35
|
+
Schema.annotations({
|
|
36
|
+
title: 'Updated At Field',
|
|
37
|
+
description:
|
|
38
|
+
'Automatically updates the timestamp whenever a record is modified. System-managed field that updates on every change.',
|
|
39
|
+
examples: [
|
|
40
|
+
{
|
|
41
|
+
id: 1,
|
|
42
|
+
name: 'updated_at',
|
|
43
|
+
type: 'updated-at',
|
|
44
|
+
indexed: true,
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
})
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
export type UpdatedAtField = Schema.Schema.Type<typeof UpdatedAtFieldSchema>
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
// Re-export base field and validation utilities
|
|
9
|
+
export * from './base-field'
|
|
10
|
+
|
|
11
|
+
// Re-export all field types organized by category
|
|
12
|
+
export * from './text'
|
|
13
|
+
export * from './numeric'
|
|
14
|
+
export * from './date-time'
|
|
15
|
+
export * from './relational'
|
|
16
|
+
export * from './selection'
|
|
17
|
+
export * from './media'
|
|
18
|
+
export * from './user'
|
|
19
|
+
export * from './advanced'
|
|
@@ -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 { BaseFieldSchema } from '../base-field'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Barcode Field
|
|
13
|
+
*
|
|
14
|
+
* Stores barcode values with support for various barcode formats.
|
|
15
|
+
* Used for product identification, inventory tracking, and asset management.
|
|
16
|
+
* Can be configured to support specific barcode standards (e.g., EAN, UPC, QR Code).
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const field = {
|
|
21
|
+
* id: 1,
|
|
22
|
+
* name: 'product_barcode',
|
|
23
|
+
* type: 'barcode',
|
|
24
|
+
* required: true,
|
|
25
|
+
* format: 'EAN-13'
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export const BarcodeFieldSchema = BaseFieldSchema.pipe(
|
|
30
|
+
Schema.extend(
|
|
31
|
+
Schema.Struct({
|
|
32
|
+
type: Schema.Literal('barcode'),
|
|
33
|
+
format: Schema.optional(
|
|
34
|
+
Schema.String.pipe(
|
|
35
|
+
Schema.annotations({
|
|
36
|
+
description: 'Barcode format',
|
|
37
|
+
})
|
|
38
|
+
)
|
|
39
|
+
),
|
|
40
|
+
})
|
|
41
|
+
),
|
|
42
|
+
Schema.annotations({
|
|
43
|
+
title: 'Barcode Field',
|
|
44
|
+
description:
|
|
45
|
+
'Stores barcode values with various format support. Used for product identification and inventory.',
|
|
46
|
+
examples: [
|
|
47
|
+
{
|
|
48
|
+
id: 1,
|
|
49
|
+
name: 'product_barcode',
|
|
50
|
+
type: 'barcode',
|
|
51
|
+
required: true,
|
|
52
|
+
format: 'EAN-13',
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
})
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
export type BarcodeField = Schema.Schema.Type<typeof BarcodeFieldSchema>
|
|
@@ -0,0 +1,10 @@
|
|
|
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-attachment-field'
|
|
9
|
+
export * from './multiple-attachments-field'
|
|
10
|
+
export * from './barcode-field'
|
|
@@ -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
|
+
export const MultipleAttachmentsFieldSchema = BaseFieldSchema.pipe(
|
|
12
|
+
Schema.extend(
|
|
13
|
+
Schema.Struct({
|
|
14
|
+
type: Schema.Literal('multiple-attachments'),
|
|
15
|
+
maxFiles: Schema.optional(
|
|
16
|
+
Schema.Int.pipe(
|
|
17
|
+
Schema.greaterThanOrEqualTo(1),
|
|
18
|
+
Schema.annotations({ description: 'Maximum number of files allowed' })
|
|
19
|
+
)
|
|
20
|
+
),
|
|
21
|
+
allowedFileTypes: Schema.optional(
|
|
22
|
+
Schema.Array(Schema.String).pipe(
|
|
23
|
+
Schema.annotations({
|
|
24
|
+
description: 'Allowed MIME types for file uploads',
|
|
25
|
+
examples: [['application/pdf', 'application/msword']],
|
|
26
|
+
})
|
|
27
|
+
)
|
|
28
|
+
),
|
|
29
|
+
maxFileSize: Schema.optional(
|
|
30
|
+
Schema.Int.pipe(
|
|
31
|
+
Schema.greaterThanOrEqualTo(1),
|
|
32
|
+
Schema.annotations({
|
|
33
|
+
description: 'Maximum file size in bytes per attachment',
|
|
34
|
+
examples: [10_485_760],
|
|
35
|
+
})
|
|
36
|
+
)
|
|
37
|
+
),
|
|
38
|
+
generateThumbnails: Schema.optional(
|
|
39
|
+
Schema.Boolean.pipe(
|
|
40
|
+
Schema.annotations({
|
|
41
|
+
description: 'Whether to generate thumbnails for image attachments',
|
|
42
|
+
})
|
|
43
|
+
)
|
|
44
|
+
),
|
|
45
|
+
storeMetadata: Schema.optional(
|
|
46
|
+
Schema.Boolean.pipe(
|
|
47
|
+
Schema.annotations({
|
|
48
|
+
description: 'Whether to store metadata for each attachment',
|
|
49
|
+
})
|
|
50
|
+
)
|
|
51
|
+
),
|
|
52
|
+
storage: Schema.optional(
|
|
53
|
+
Schema.Struct({
|
|
54
|
+
provider: Schema.optional(
|
|
55
|
+
Schema.String.pipe(Schema.annotations({ description: 'Storage provider' }))
|
|
56
|
+
),
|
|
57
|
+
bucket: Schema.optional(
|
|
58
|
+
Schema.String.pipe(
|
|
59
|
+
Schema.annotations({ description: 'S3 bucket name (required for s3 provider)' })
|
|
60
|
+
)
|
|
61
|
+
),
|
|
62
|
+
maxSize: Schema.optional(
|
|
63
|
+
Schema.Int.pipe(
|
|
64
|
+
Schema.greaterThanOrEqualTo(1),
|
|
65
|
+
Schema.annotations({ description: 'Maximum file size in bytes per file' })
|
|
66
|
+
)
|
|
67
|
+
),
|
|
68
|
+
allowedTypes: Schema.optional(Schema.Array(Schema.String)),
|
|
69
|
+
})
|
|
70
|
+
),
|
|
71
|
+
})
|
|
72
|
+
),
|
|
73
|
+
Schema.annotations({
|
|
74
|
+
title: 'Multiple Attachments Field',
|
|
75
|
+
description: 'Stores multiple file attachments with storage configuration.',
|
|
76
|
+
examples: [{ id: 1, name: 'documents', type: 'multiple-attachments', maxFiles: 10 }],
|
|
77
|
+
})
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
export type MultipleAttachmentsField = Schema.Schema.Type<typeof MultipleAttachmentsFieldSchema>
|
|
@@ -0,0 +1,81 @@
|
|
|
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
|
+
export const SingleAttachmentFieldSchema = BaseFieldSchema.pipe(
|
|
12
|
+
Schema.extend(
|
|
13
|
+
Schema.Struct({
|
|
14
|
+
type: Schema.Literal('single-attachment'),
|
|
15
|
+
allowedFileTypes: Schema.optional(
|
|
16
|
+
Schema.Array(Schema.String).pipe(
|
|
17
|
+
Schema.annotations({
|
|
18
|
+
description: 'Allowed MIME types for file uploads',
|
|
19
|
+
examples: [['image/png', 'image/jpeg', 'image/gif']],
|
|
20
|
+
})
|
|
21
|
+
)
|
|
22
|
+
),
|
|
23
|
+
maxFileSize: Schema.optional(
|
|
24
|
+
Schema.Int.pipe(
|
|
25
|
+
Schema.greaterThanOrEqualTo(1),
|
|
26
|
+
Schema.annotations({
|
|
27
|
+
description: 'Maximum file size in bytes',
|
|
28
|
+
examples: [5_242_880],
|
|
29
|
+
})
|
|
30
|
+
)
|
|
31
|
+
),
|
|
32
|
+
generateThumbnail: Schema.optional(
|
|
33
|
+
Schema.Boolean.pipe(
|
|
34
|
+
Schema.annotations({
|
|
35
|
+
description: 'Whether to generate thumbnails for image attachments',
|
|
36
|
+
})
|
|
37
|
+
)
|
|
38
|
+
),
|
|
39
|
+
storeMetadata: Schema.optional(
|
|
40
|
+
Schema.Boolean.pipe(
|
|
41
|
+
Schema.annotations({
|
|
42
|
+
description: 'Whether to store metadata (dimensions for images, duration for videos)',
|
|
43
|
+
})
|
|
44
|
+
)
|
|
45
|
+
),
|
|
46
|
+
storage: Schema.optional(
|
|
47
|
+
Schema.Struct({
|
|
48
|
+
provider: Schema.optional(
|
|
49
|
+
Schema.String.pipe(Schema.annotations({ description: 'Storage provider' }))
|
|
50
|
+
),
|
|
51
|
+
bucket: Schema.optional(
|
|
52
|
+
Schema.String.pipe(
|
|
53
|
+
Schema.annotations({ description: 'S3 bucket name (required for s3 provider)' })
|
|
54
|
+
)
|
|
55
|
+
),
|
|
56
|
+
maxSize: Schema.optional(
|
|
57
|
+
Schema.Int.pipe(
|
|
58
|
+
Schema.greaterThanOrEqualTo(1),
|
|
59
|
+
Schema.annotations({ description: 'Maximum file size in bytes' })
|
|
60
|
+
)
|
|
61
|
+
),
|
|
62
|
+
allowedTypes: Schema.optional(Schema.Array(Schema.String)),
|
|
63
|
+
})
|
|
64
|
+
),
|
|
65
|
+
})
|
|
66
|
+
),
|
|
67
|
+
Schema.annotations({
|
|
68
|
+
title: 'Single Attachment Field',
|
|
69
|
+
description: 'Stores a single file attachment with storage configuration.',
|
|
70
|
+
examples: [
|
|
71
|
+
{
|
|
72
|
+
id: 1,
|
|
73
|
+
name: 'profile_pic',
|
|
74
|
+
type: 'single-attachment',
|
|
75
|
+
storage: { provider: 'local', maxSize: 5_242_880 },
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
})
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
export type SingleAttachmentField = Schema.Schema.Type<typeof SingleAttachmentFieldSchema>
|
|
@@ -0,0 +1,144 @@
|
|
|
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 { validateMinMaxRange } from '../validation-utils'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Currency Field
|
|
14
|
+
*
|
|
15
|
+
* Specialized numeric field for storing monetary values with currency information.
|
|
16
|
+
* Automatically formats values with currency symbols and stores precise decimal amounts.
|
|
17
|
+
* Supports configurable currency codes (USD, EUR, GBP, etc.) and precision (typically 2
|
|
18
|
+
* decimal places). Can be marked as required, unique, or indexed. Stored using DECIMAL
|
|
19
|
+
* database type to prevent rounding errors in financial calculations.
|
|
20
|
+
*
|
|
21
|
+
* Business Rules:
|
|
22
|
+
* - Currency code must be valid ISO 4217 three-letter code (USD, EUR, GBP, etc.)
|
|
23
|
+
* - Precision defaults to 2 decimal places (standard for most currencies)
|
|
24
|
+
* - DECIMAL storage ensures exact monetary amounts without floating-point errors
|
|
25
|
+
* - Min/max validation optional - useful for enforcing business rules (e.g., price >= 0)
|
|
26
|
+
* - Currency code stored with value to support multi-currency applications
|
|
27
|
+
* - Indexing recommended for fields used in financial reports and sorting
|
|
28
|
+
* - Constant value 'currency' ensures type safety and enables discriminated unions
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const field = {
|
|
33
|
+
* id: 1,
|
|
34
|
+
* name: 'price',
|
|
35
|
+
* type: 'currency',
|
|
36
|
+
* required: true,
|
|
37
|
+
* currency: 'USD',
|
|
38
|
+
* precision: 2,
|
|
39
|
+
* min: 0,
|
|
40
|
+
* default: 0.00
|
|
41
|
+
* }
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export const CurrencyFieldSchema = BaseFieldSchema.pipe(
|
|
45
|
+
Schema.extend(
|
|
46
|
+
Schema.Struct({
|
|
47
|
+
type: Schema.Literal('currency').pipe(
|
|
48
|
+
Schema.annotations({
|
|
49
|
+
description: "Constant value 'currency' for type discrimination in discriminated unions",
|
|
50
|
+
})
|
|
51
|
+
),
|
|
52
|
+
currency: Schema.String.pipe(
|
|
53
|
+
Schema.length(3),
|
|
54
|
+
Schema.pattern(/^[A-Z]{3}$/),
|
|
55
|
+
Schema.annotations({
|
|
56
|
+
description: 'ISO 4217 three-letter currency code (e.g., USD, EUR, GBP)',
|
|
57
|
+
examples: ['USD', 'EUR', 'GBP', 'JPY', 'CAD', 'AUD'],
|
|
58
|
+
})
|
|
59
|
+
),
|
|
60
|
+
precision: Schema.optional(
|
|
61
|
+
Schema.Int.pipe(
|
|
62
|
+
Schema.greaterThanOrEqualTo(0),
|
|
63
|
+
Schema.lessThanOrEqualTo(10),
|
|
64
|
+
Schema.annotations({
|
|
65
|
+
description: 'Number of decimal places (0-10, default: 2 for most currencies)',
|
|
66
|
+
})
|
|
67
|
+
)
|
|
68
|
+
),
|
|
69
|
+
min: Schema.optional(
|
|
70
|
+
Schema.Number.pipe(
|
|
71
|
+
Schema.annotations({
|
|
72
|
+
description: 'Minimum allowed value (inclusive)',
|
|
73
|
+
})
|
|
74
|
+
)
|
|
75
|
+
),
|
|
76
|
+
max: Schema.optional(
|
|
77
|
+
Schema.Number.pipe(
|
|
78
|
+
Schema.annotations({
|
|
79
|
+
description: 'Maximum allowed value (inclusive)',
|
|
80
|
+
})
|
|
81
|
+
)
|
|
82
|
+
),
|
|
83
|
+
symbolPosition: Schema.optional(
|
|
84
|
+
Schema.Literal('before', 'after').pipe(
|
|
85
|
+
Schema.annotations({
|
|
86
|
+
description: 'Position of currency symbol relative to the amount',
|
|
87
|
+
examples: ['before', 'after'],
|
|
88
|
+
})
|
|
89
|
+
)
|
|
90
|
+
),
|
|
91
|
+
negativeFormat: Schema.optional(
|
|
92
|
+
Schema.Literal('minus', 'parentheses').pipe(
|
|
93
|
+
Schema.annotations({
|
|
94
|
+
description: 'Format for displaying negative amounts',
|
|
95
|
+
examples: ['minus', 'parentheses'],
|
|
96
|
+
})
|
|
97
|
+
)
|
|
98
|
+
),
|
|
99
|
+
thousandsSeparator: Schema.optional(
|
|
100
|
+
Schema.Literal('comma', 'period', 'space', 'none').pipe(
|
|
101
|
+
Schema.annotations({
|
|
102
|
+
description: 'Character used to separate thousands',
|
|
103
|
+
examples: ['comma', 'period', 'space', 'none'],
|
|
104
|
+
})
|
|
105
|
+
)
|
|
106
|
+
),
|
|
107
|
+
default: Schema.optional(
|
|
108
|
+
Schema.Number.pipe(
|
|
109
|
+
Schema.annotations({
|
|
110
|
+
description: 'Default currency value when creating new records',
|
|
111
|
+
})
|
|
112
|
+
)
|
|
113
|
+
),
|
|
114
|
+
})
|
|
115
|
+
),
|
|
116
|
+
Schema.filter(validateMinMaxRange),
|
|
117
|
+
Schema.annotations({
|
|
118
|
+
title: 'Currency Field',
|
|
119
|
+
description:
|
|
120
|
+
'Specialized numeric field for monetary values with currency codes (ISO 4217). Uses exact DECIMAL storage to prevent rounding errors in financial calculations.',
|
|
121
|
+
examples: [
|
|
122
|
+
{
|
|
123
|
+
id: 1,
|
|
124
|
+
name: 'price',
|
|
125
|
+
type: 'currency',
|
|
126
|
+
required: true,
|
|
127
|
+
currency: 'USD',
|
|
128
|
+
precision: 2,
|
|
129
|
+
min: 0,
|
|
130
|
+
default: 0.0,
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
id: 2,
|
|
134
|
+
name: 'total_cost',
|
|
135
|
+
type: 'currency',
|
|
136
|
+
required: true,
|
|
137
|
+
currency: 'EUR',
|
|
138
|
+
precision: 2,
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
})
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
export type CurrencyField = Schema.Schema.Type<typeof CurrencyFieldSchema>
|