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,208 @@
|
|
|
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 {
|
|
10
|
+
DurationSchema,
|
|
11
|
+
EasingFunctionSchema,
|
|
12
|
+
} from '@/domain/models/app/page/common/interactions/hover-interaction'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Animation configuration object
|
|
16
|
+
*
|
|
17
|
+
* Detailed animation config with duration, easing, delay, and keyframes.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const config = {
|
|
22
|
+
* enabled: true,
|
|
23
|
+
* duration: '300ms',
|
|
24
|
+
* easing: 'ease-in-out',
|
|
25
|
+
* delay: '0ms',
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @see specs/app/theme/animations/animations.schema.json#/patternProperties/.../oneOf[2]
|
|
30
|
+
*/
|
|
31
|
+
export const AnimationConfigObjectSchema = Schema.Struct({
|
|
32
|
+
enabled: Schema.optional(Schema.Boolean),
|
|
33
|
+
duration: Schema.optional(DurationSchema),
|
|
34
|
+
easing: Schema.optional(EasingFunctionSchema),
|
|
35
|
+
delay: Schema.optional(DurationSchema),
|
|
36
|
+
keyframes: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Unknown })),
|
|
37
|
+
}).pipe(
|
|
38
|
+
Schema.annotations({
|
|
39
|
+
title: 'Animation Configuration Object',
|
|
40
|
+
description: 'Detailed animation configuration',
|
|
41
|
+
})
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Animation value (boolean, string, or object)
|
|
46
|
+
*
|
|
47
|
+
* Flexible animation configuration:
|
|
48
|
+
* - Boolean: Simple enable/disable (true/false)
|
|
49
|
+
* - String: CSS animation value or class name
|
|
50
|
+
* - Object: Detailed config (duration, easing, delay, keyframes)
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const simple = true
|
|
55
|
+
* const className = 'animate-fade-in'
|
|
56
|
+
* const detailed = {
|
|
57
|
+
* enabled: true,
|
|
58
|
+
* duration: '300ms',
|
|
59
|
+
* easing: 'ease-in-out',
|
|
60
|
+
* }
|
|
61
|
+
* ```
|
|
62
|
+
*
|
|
63
|
+
* @see specs/app/theme/animations/animations.schema.json#/patternProperties/.../oneOf
|
|
64
|
+
*/
|
|
65
|
+
export const AnimationValueSchema = Schema.Union(
|
|
66
|
+
Schema.Boolean,
|
|
67
|
+
Schema.String,
|
|
68
|
+
AnimationConfigObjectSchema
|
|
69
|
+
).pipe(
|
|
70
|
+
Schema.annotations({
|
|
71
|
+
title: 'Animation Value',
|
|
72
|
+
description: 'Animation configuration (boolean, string, or object)',
|
|
73
|
+
})
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Duration design tokens schema
|
|
78
|
+
*
|
|
79
|
+
* Map of duration token names to CSS duration values.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const durations = {
|
|
84
|
+
* fast: '200ms',
|
|
85
|
+
* normal: '300ms',
|
|
86
|
+
* slow: '500ms',
|
|
87
|
+
* }
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
const DurationTokensSchema = Schema.Record({
|
|
91
|
+
key: Schema.String.pipe(
|
|
92
|
+
Schema.pattern(/^[a-zA-Z][a-zA-Z0-9]*$/, {
|
|
93
|
+
message: () =>
|
|
94
|
+
'Duration key must start with a letter and contain only alphanumeric characters',
|
|
95
|
+
})
|
|
96
|
+
),
|
|
97
|
+
value: DurationSchema,
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Easing function design tokens schema
|
|
102
|
+
*
|
|
103
|
+
* Map of easing token names to CSS easing functions.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```typescript
|
|
107
|
+
* const easings = {
|
|
108
|
+
* smooth: 'cubic-bezier(0.4, 0, 0.2, 1)',
|
|
109
|
+
* bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',
|
|
110
|
+
* }
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
const EasingTokensSchema = Schema.Record({
|
|
114
|
+
key: Schema.String.pipe(
|
|
115
|
+
Schema.pattern(/^[a-zA-Z][a-zA-Z0-9]*$/, {
|
|
116
|
+
message: () => 'Easing key must start with a letter and contain only alphanumeric characters',
|
|
117
|
+
})
|
|
118
|
+
),
|
|
119
|
+
value: EasingFunctionSchema,
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Keyframes design tokens schema
|
|
124
|
+
*
|
|
125
|
+
* Map of keyframe animation names to CSS keyframe definitions.
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```typescript
|
|
129
|
+
* const keyframes = {
|
|
130
|
+
* fadeIn: {
|
|
131
|
+
* from: { opacity: '0' },
|
|
132
|
+
* to: { opacity: '1' },
|
|
133
|
+
* },
|
|
134
|
+
* colorPulse: {
|
|
135
|
+
* '0%': { backgroundColor: '$colors.primary' },
|
|
136
|
+
* '50%': { backgroundColor: '$colors.accent' },
|
|
137
|
+
* '100%': { backgroundColor: '$colors.primary' },
|
|
138
|
+
* },
|
|
139
|
+
* }
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
const KeyframesTokensSchema = Schema.Record({
|
|
143
|
+
key: Schema.String.pipe(
|
|
144
|
+
Schema.pattern(/^[a-zA-Z][a-zA-Z0-9]*$/, {
|
|
145
|
+
message: () =>
|
|
146
|
+
'Keyframe key must start with a letter and contain only alphanumeric characters',
|
|
147
|
+
})
|
|
148
|
+
),
|
|
149
|
+
value: Schema.Record({ key: Schema.String, value: Schema.Unknown }),
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Animation configuration (animation and transition design tokens)
|
|
154
|
+
*
|
|
155
|
+
* Supports two formats:
|
|
156
|
+
* 1. Nested design tokens (duration, easing, keyframes)
|
|
157
|
+
* 2. Legacy flat animation names
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```typescript
|
|
161
|
+
* // Nested design tokens
|
|
162
|
+
* const animations = {
|
|
163
|
+
* duration: { fast: '200ms', normal: '300ms', slow: '500ms' },
|
|
164
|
+
* easing: { smooth: 'cubic-bezier(0.4, 0, 0.2, 1)', bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)' },
|
|
165
|
+
* keyframes: {
|
|
166
|
+
* fadeIn: { from: { opacity: '0' }, to: { opacity: '1' } },
|
|
167
|
+
* colorPulse: { '0%': { backgroundColor: '$colors.primary' }, '50%': { backgroundColor: '$colors.accent' }, '100%': { backgroundColor: '$colors.primary' } },
|
|
168
|
+
* },
|
|
169
|
+
* }
|
|
170
|
+
*
|
|
171
|
+
* // Legacy flat animations
|
|
172
|
+
* const animations = {
|
|
173
|
+
* fadeIn: true,
|
|
174
|
+
* slideUp: 'animate-slide-up',
|
|
175
|
+
* modalOpen: { enabled: true, duration: '300ms', easing: 'ease-in-out' },
|
|
176
|
+
* }
|
|
177
|
+
* ```
|
|
178
|
+
*
|
|
179
|
+
* @see specs/app/theme/animations/animations.schema.json
|
|
180
|
+
*/
|
|
181
|
+
export const AnimationsConfigSchema = Schema.Record({
|
|
182
|
+
key: Schema.String.pipe(
|
|
183
|
+
Schema.pattern(/^[a-zA-Z][a-zA-Z0-9]*$/, {
|
|
184
|
+
message: () =>
|
|
185
|
+
'Animation key must start with a letter and contain only alphanumeric characters',
|
|
186
|
+
}),
|
|
187
|
+
Schema.annotations({
|
|
188
|
+
title: 'Animation Key',
|
|
189
|
+
description: 'Animation name (alphanumeric)',
|
|
190
|
+
examples: ['fadeIn', 'slideUp', 'modalOpen', 'duration', 'easing', 'keyframes'],
|
|
191
|
+
})
|
|
192
|
+
),
|
|
193
|
+
value: Schema.Union(
|
|
194
|
+
AnimationValueSchema,
|
|
195
|
+
DurationTokensSchema,
|
|
196
|
+
EasingTokensSchema,
|
|
197
|
+
KeyframesTokensSchema
|
|
198
|
+
),
|
|
199
|
+
}).pipe(
|
|
200
|
+
Schema.annotations({
|
|
201
|
+
title: 'Animation Configuration',
|
|
202
|
+
description: 'Animation and transition design tokens',
|
|
203
|
+
})
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
export type AnimationConfigObject = Schema.Schema.Type<typeof AnimationConfigObjectSchema>
|
|
207
|
+
export type AnimationValue = Schema.Schema.Type<typeof AnimationValueSchema>
|
|
208
|
+
export type AnimationsConfig = Schema.Schema.Type<typeof AnimationsConfigSchema>
|
|
@@ -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
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Border radius configuration (design tokens for rounded corners)
|
|
12
|
+
*
|
|
13
|
+
* Map of semantic radius names to CSS border-radius values.
|
|
14
|
+
* Supports progressive rounding scale:
|
|
15
|
+
* - none: 0 (sharp corners)
|
|
16
|
+
* - sm, md, lg, xl, 2xl, 3xl: progressive rounding
|
|
17
|
+
* - full: 9999px (perfect circles/pills)
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const borderRadius = {
|
|
22
|
+
* none: '0',
|
|
23
|
+
* sm: '0.125rem',
|
|
24
|
+
* md: '0.375rem',
|
|
25
|
+
* lg: '0.5rem',
|
|
26
|
+
* full: '9999px',
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @see specs/app/theme/border-radius/border-radius.schema.json
|
|
31
|
+
*/
|
|
32
|
+
export const BorderRadiusConfigSchema = Schema.Record({
|
|
33
|
+
key: Schema.String.pipe(
|
|
34
|
+
Schema.pattern(/^(DEFAULT|[a-z0-9]+(-[a-z0-9]+)*)$/, {
|
|
35
|
+
message: () =>
|
|
36
|
+
'Border radius key must be DEFAULT or use kebab-case format (lowercase letters/numbers)',
|
|
37
|
+
}),
|
|
38
|
+
Schema.annotations({
|
|
39
|
+
title: 'Border Radius Key',
|
|
40
|
+
description: 'Semantic radius name (kebab-case with numbers) or DEFAULT for base radius',
|
|
41
|
+
examples: ['DEFAULT', 'none', 'sm', 'md', 'lg', '2xl', '3xl', 'full'],
|
|
42
|
+
})
|
|
43
|
+
),
|
|
44
|
+
value: Schema.String.pipe(
|
|
45
|
+
Schema.annotations({
|
|
46
|
+
title: 'Border Radius Value',
|
|
47
|
+
description: 'CSS border-radius value',
|
|
48
|
+
examples: ['0', '0.125rem', '0.5rem', '9999px'],
|
|
49
|
+
})
|
|
50
|
+
),
|
|
51
|
+
}).pipe(
|
|
52
|
+
Schema.annotations({
|
|
53
|
+
title: 'Border Radius',
|
|
54
|
+
description: 'Border radius design tokens',
|
|
55
|
+
})
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
export type BorderRadiusConfig = Schema.Schema.Type<typeof BorderRadiusConfigSchema>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Schema } from 'effect'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Breakpoints configuration (responsive design breakpoints)
|
|
12
|
+
*
|
|
13
|
+
* Map of breakpoint names to pixel values.
|
|
14
|
+
* Standard Tailwind breakpoints:
|
|
15
|
+
* - sm: 640px (mobile)
|
|
16
|
+
* - md: 768px (tablet)
|
|
17
|
+
* - lg: 1024px (laptop)
|
|
18
|
+
* - xl: 1280px (desktop)
|
|
19
|
+
* - 2xl: 1536px (large desktop)
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const breakpoints = {
|
|
24
|
+
* sm: '640px',
|
|
25
|
+
* md: '768px',
|
|
26
|
+
* lg: '1024px',
|
|
27
|
+
* xl: '1280px',
|
|
28
|
+
* '2xl': '1536px',
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @see specs/app/theme/breakpoints/breakpoints.schema.json
|
|
33
|
+
*/
|
|
34
|
+
export const BreakpointsConfigSchema = Schema.Record({
|
|
35
|
+
key: Schema.String.pipe(
|
|
36
|
+
Schema.pattern(/^[a-z0-9]+$/, {
|
|
37
|
+
message: () => 'Breakpoint key must be lowercase alphanumeric',
|
|
38
|
+
}),
|
|
39
|
+
Schema.annotations({
|
|
40
|
+
title: 'Breakpoint Key',
|
|
41
|
+
description: 'Breakpoint name (lowercase alphanumeric)',
|
|
42
|
+
examples: ['sm', 'md', 'lg', 'xl', '2xl'],
|
|
43
|
+
})
|
|
44
|
+
),
|
|
45
|
+
value: Schema.String.pipe(
|
|
46
|
+
Schema.pattern(/^[0-9]+px$/, {
|
|
47
|
+
message: () => 'Breakpoint value must be in pixels (e.g., "640px")',
|
|
48
|
+
}),
|
|
49
|
+
Schema.annotations({
|
|
50
|
+
title: 'Breakpoint Value',
|
|
51
|
+
description: 'Breakpoint value in pixels',
|
|
52
|
+
examples: ['640px', '768px', '1024px', '1280px'],
|
|
53
|
+
})
|
|
54
|
+
),
|
|
55
|
+
}).pipe(
|
|
56
|
+
Schema.annotations({
|
|
57
|
+
title: 'Breakpoints',
|
|
58
|
+
description: 'Responsive design breakpoints',
|
|
59
|
+
})
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
export type BreakpointsConfig = Schema.Schema.Type<typeof BreakpointsConfigSchema>
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Schema } from 'effect'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Color name in kebab-case format
|
|
12
|
+
*
|
|
13
|
+
* Supports semantic naming (primary, secondary) and variants:
|
|
14
|
+
* - Base colors: primary, secondary, success, danger
|
|
15
|
+
* - Variants: primary-hover, primary-light, primary-dark
|
|
16
|
+
* - Numbered scales: gray-100, gray-200, ..., gray-900
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const base = 'primary'
|
|
21
|
+
* const variant = 'primary-hover'
|
|
22
|
+
* const scale = 'gray-500'
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @see specs/app/theme/colors/colors.schema.json#/patternProperties
|
|
26
|
+
*/
|
|
27
|
+
export const ColorNameSchema = Schema.String.pipe(
|
|
28
|
+
Schema.pattern(/^[a-z]+[a-z0-9]*(-[a-z0-9]+)*$/, {
|
|
29
|
+
message: () =>
|
|
30
|
+
'Color name must use kebab-case format: lowercase letters and numbers separated by hyphens (e.g., "primary", "text-muted", "gray-500")',
|
|
31
|
+
}),
|
|
32
|
+
Schema.annotations({
|
|
33
|
+
title: 'Color Name',
|
|
34
|
+
description: 'Color name in kebab-case format',
|
|
35
|
+
examples: ['primary', 'primary-hover', 'gray-500', 'text-muted'],
|
|
36
|
+
})
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Color value in various CSS formats
|
|
41
|
+
*
|
|
42
|
+
* Supports multiple color formats:
|
|
43
|
+
* - Hex 6-digit: #007bff (standard)
|
|
44
|
+
* - Hex 8-digit: #007bff80 (with alpha channel)
|
|
45
|
+
* - RGB: rgb(255, 0, 0)
|
|
46
|
+
* - RGBA: rgba(255, 0, 0, 0.5)
|
|
47
|
+
* - HSL: hsl(210, 100%, 50%)
|
|
48
|
+
* - HSLA: hsla(210, 100%, 50%, 0.8)
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* const hex6 = '#007bff'
|
|
53
|
+
* const hex8 = '#007bff80' // 50% opacity
|
|
54
|
+
* const rgb = 'rgb(0, 123, 255)'
|
|
55
|
+
* const hsl = 'hsl(210, 100%, 50%)'
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* @see specs/app/theme/colors/colors.schema.json#/patternProperties/.../pattern
|
|
59
|
+
*/
|
|
60
|
+
export const ColorValueSchema = Schema.String.pipe(
|
|
61
|
+
Schema.pattern(/^#[0-9A-Fa-f]{6}$|^#[0-9A-Fa-f]{8}$|^rgb\(|^rgba\(|^hsl\(|^hsla\(/, {
|
|
62
|
+
message: () => 'Color value must be in hex (#RRGGBB or #RRGGBBAA), rgb(a), or hsl(a) format',
|
|
63
|
+
}),
|
|
64
|
+
Schema.annotations({
|
|
65
|
+
title: 'Color Value',
|
|
66
|
+
description: 'Color value in hex, rgb, rgba, hsl, or hsla format',
|
|
67
|
+
examples: ['#007bff', '#007bff80', 'rgb(0, 123, 255)', 'hsl(210, 100%, 50%)'],
|
|
68
|
+
})
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Color palette (design tokens)
|
|
73
|
+
*
|
|
74
|
+
* Map of semantic color names to CSS color values.
|
|
75
|
+
* Supports comprehensive color systems with:
|
|
76
|
+
* - Semantic colors (primary, secondary, success, danger, warning, info)
|
|
77
|
+
* - Variants (hover states, light/dark tints)
|
|
78
|
+
* - Numbered scales (gray-100 to gray-900)
|
|
79
|
+
* - Multiple formats (hex, rgb, hsl with optional alpha)
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const colors = {
|
|
84
|
+
* primary: '#007bff',
|
|
85
|
+
* 'primary-hover': '#0056b3',
|
|
86
|
+
* 'primary-light': '#e7f1ff',
|
|
87
|
+
* secondary: '#6c757d',
|
|
88
|
+
* success: '#28a745',
|
|
89
|
+
* danger: '#dc3545',
|
|
90
|
+
* 'gray-100': '#f8f9fa',
|
|
91
|
+
* 'gray-500': '#adb5bd',
|
|
92
|
+
* 'gray-900': '#212529',
|
|
93
|
+
* }
|
|
94
|
+
* ```
|
|
95
|
+
*
|
|
96
|
+
* @see specs/app/theme/colors/colors.schema.json
|
|
97
|
+
*/
|
|
98
|
+
export const ColorsConfigSchema = Schema.Record({
|
|
99
|
+
key: ColorNameSchema,
|
|
100
|
+
value: ColorValueSchema,
|
|
101
|
+
}).pipe(
|
|
102
|
+
Schema.annotations({
|
|
103
|
+
title: 'Color Palette',
|
|
104
|
+
description: 'Color design tokens with support for semantic naming and variants',
|
|
105
|
+
})
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
export type ColorName = Schema.Schema.Type<typeof ColorNameSchema>
|
|
109
|
+
export type ColorValue = Schema.Schema.Type<typeof ColorValueSchema>
|
|
110
|
+
export type ColorsConfig = Schema.Schema.Type<typeof ColorsConfigSchema>
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Schema } from 'effect'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Font weight (100-900 in increments of 100)
|
|
12
|
+
*/
|
|
13
|
+
export const FontWeightSchema = Schema.Literal(100, 200, 300, 400, 500, 600, 700, 800, 900).pipe(
|
|
14
|
+
Schema.annotations({
|
|
15
|
+
title: 'Font Weight',
|
|
16
|
+
description: 'Font weight value (100-900 in increments of 100)',
|
|
17
|
+
})
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Font style (normal, italic, oblique)
|
|
22
|
+
*/
|
|
23
|
+
export const FontStyleSchema = Schema.Literal('normal', 'italic', 'oblique').pipe(
|
|
24
|
+
Schema.annotations({
|
|
25
|
+
title: 'Font Style',
|
|
26
|
+
description: 'Font style',
|
|
27
|
+
})
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Text transformation (none, uppercase, lowercase, capitalize)
|
|
32
|
+
*/
|
|
33
|
+
export const FontTransformSchema = Schema.Literal(
|
|
34
|
+
'none',
|
|
35
|
+
'uppercase',
|
|
36
|
+
'lowercase',
|
|
37
|
+
'capitalize'
|
|
38
|
+
).pipe(
|
|
39
|
+
Schema.annotations({
|
|
40
|
+
title: 'Text Transform',
|
|
41
|
+
description: 'Text transformation',
|
|
42
|
+
})
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Font category name (alphabetic characters only: title, body, mono, etc.)
|
|
47
|
+
*/
|
|
48
|
+
export const FontCategoryKeySchema = Schema.String.pipe(
|
|
49
|
+
Schema.pattern(/^[a-zA-Z]+$/, {
|
|
50
|
+
message: () => 'Font category key must contain only alphabetic characters (a-zA-Z)',
|
|
51
|
+
}),
|
|
52
|
+
Schema.annotations({
|
|
53
|
+
title: 'Font Category Key',
|
|
54
|
+
description: 'Semantic font category name (alphabetic characters only)',
|
|
55
|
+
examples: ['title', 'body', 'mono', 'heading', 'label'],
|
|
56
|
+
})
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Individual font configuration (family, fallback, weights, style, size, lineHeight, letterSpacing, transform, url)
|
|
61
|
+
*
|
|
62
|
+
* @see specs/app/theme/fonts/fonts.schema.json#/patternProperties/...
|
|
63
|
+
*/
|
|
64
|
+
export const FontConfigItemSchema = Schema.Struct({
|
|
65
|
+
family: Schema.String.pipe(
|
|
66
|
+
Schema.annotations({
|
|
67
|
+
title: 'Font Family',
|
|
68
|
+
description: 'Primary font family name',
|
|
69
|
+
})
|
|
70
|
+
),
|
|
71
|
+
fallback: Schema.optional(
|
|
72
|
+
Schema.String.pipe(
|
|
73
|
+
Schema.annotations({
|
|
74
|
+
title: 'Fallback Font Stack',
|
|
75
|
+
description: 'Fallback font stack',
|
|
76
|
+
examples: ['system-ui, sans-serif', 'Georgia, serif', 'monospace'],
|
|
77
|
+
})
|
|
78
|
+
)
|
|
79
|
+
),
|
|
80
|
+
weights: Schema.optional(
|
|
81
|
+
Schema.Array(FontWeightSchema).pipe(
|
|
82
|
+
Schema.annotations({
|
|
83
|
+
title: 'Font Weights',
|
|
84
|
+
description: 'Available font weights',
|
|
85
|
+
examples: [
|
|
86
|
+
[400, 700],
|
|
87
|
+
[300, 400, 500, 600, 700],
|
|
88
|
+
],
|
|
89
|
+
})
|
|
90
|
+
)
|
|
91
|
+
),
|
|
92
|
+
style: Schema.optional(
|
|
93
|
+
FontStyleSchema.pipe(
|
|
94
|
+
Schema.annotations({
|
|
95
|
+
default: 'normal',
|
|
96
|
+
})
|
|
97
|
+
)
|
|
98
|
+
),
|
|
99
|
+
size: Schema.optional(
|
|
100
|
+
Schema.String.pipe(
|
|
101
|
+
Schema.annotations({
|
|
102
|
+
title: 'Font Size',
|
|
103
|
+
description: 'Default font size',
|
|
104
|
+
examples: ['16px', '1rem', '14px'],
|
|
105
|
+
})
|
|
106
|
+
)
|
|
107
|
+
),
|
|
108
|
+
lineHeight: Schema.optional(
|
|
109
|
+
Schema.String.pipe(
|
|
110
|
+
Schema.annotations({
|
|
111
|
+
title: 'Line Height',
|
|
112
|
+
description: 'Default line height',
|
|
113
|
+
examples: ['1.5', '1.75', '24px'],
|
|
114
|
+
})
|
|
115
|
+
)
|
|
116
|
+
),
|
|
117
|
+
letterSpacing: Schema.optional(
|
|
118
|
+
Schema.String.pipe(
|
|
119
|
+
Schema.annotations({
|
|
120
|
+
title: 'Letter Spacing',
|
|
121
|
+
description: 'Letter spacing',
|
|
122
|
+
examples: ['0', '0.05em', '-0.01em'],
|
|
123
|
+
})
|
|
124
|
+
)
|
|
125
|
+
),
|
|
126
|
+
transform: Schema.optional(FontTransformSchema),
|
|
127
|
+
url: Schema.optional(
|
|
128
|
+
Schema.String.pipe(
|
|
129
|
+
Schema.annotations({
|
|
130
|
+
title: 'Font URL',
|
|
131
|
+
description: 'Font file URL or Google Fonts URL',
|
|
132
|
+
examples: ['https://fonts.googleapis.com/css2?family=Inter', '/fonts/bely-display.woff2'],
|
|
133
|
+
})
|
|
134
|
+
)
|
|
135
|
+
),
|
|
136
|
+
}).pipe(
|
|
137
|
+
Schema.annotations({
|
|
138
|
+
title: 'Font Configuration Item',
|
|
139
|
+
description: 'Individual font configuration with family and optional properties',
|
|
140
|
+
})
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Font configuration (map of semantic font categories to font configurations)
|
|
145
|
+
*
|
|
146
|
+
* @see specs/app/theme/fonts/fonts.schema.json
|
|
147
|
+
*/
|
|
148
|
+
export const FontsConfigSchema = Schema.Record({
|
|
149
|
+
key: FontCategoryKeySchema,
|
|
150
|
+
value: FontConfigItemSchema,
|
|
151
|
+
}).pipe(
|
|
152
|
+
Schema.annotations({
|
|
153
|
+
title: 'Font Configuration',
|
|
154
|
+
description: 'Typography design tokens for font families and styles',
|
|
155
|
+
})
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
// Type exports
|
|
159
|
+
export type FontWeight = Schema.Schema.Type<typeof FontWeightSchema>
|
|
160
|
+
export type FontStyle = Schema.Schema.Type<typeof FontStyleSchema>
|
|
161
|
+
export type FontTransform = Schema.Schema.Type<typeof FontTransformSchema>
|
|
162
|
+
export type FontCategoryKey = Schema.Schema.Type<typeof FontCategoryKeySchema>
|
|
163
|
+
export type FontConfigItem = Schema.Schema.Type<typeof FontConfigItemSchema>
|
|
164
|
+
export type FontsConfig = Schema.Schema.Type<typeof FontsConfigSchema>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Schema } from 'effect'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Shadow configuration (box shadow design tokens)
|
|
12
|
+
*
|
|
13
|
+
* Map of semantic shadow names to CSS box-shadow values.
|
|
14
|
+
* Supports elevation system:
|
|
15
|
+
* - sm, md, lg, xl, 2xl: progressive depth
|
|
16
|
+
* - inner: inset shadows
|
|
17
|
+
* - none: no shadow
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const shadows = {
|
|
22
|
+
* sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',
|
|
23
|
+
* md: '0 4px 6px -1px rgb(0 0 0 / 0.1)',
|
|
24
|
+
* lg: '0 10px 15px -3px rgb(0 0 0 / 0.1)',
|
|
25
|
+
* inner: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)',
|
|
26
|
+
* none: '0 0 #0000',
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @see specs/app/theme/shadows/shadows.schema.json
|
|
31
|
+
*/
|
|
32
|
+
export const ShadowsConfigSchema = Schema.Record({
|
|
33
|
+
key: Schema.String.pipe(
|
|
34
|
+
Schema.pattern(/^[a-z0-9]+(-[a-z0-9]+)*$/, {
|
|
35
|
+
message: () => 'Shadow key must use kebab-case format (lowercase letters/numbers)',
|
|
36
|
+
}),
|
|
37
|
+
Schema.annotations({
|
|
38
|
+
title: 'Shadow Key',
|
|
39
|
+
description: 'Semantic shadow name (kebab-case with numbers)',
|
|
40
|
+
examples: ['sm', 'md', 'lg', 'xl', '2xl', 'inner', 'none'],
|
|
41
|
+
})
|
|
42
|
+
),
|
|
43
|
+
value: Schema.String.pipe(
|
|
44
|
+
Schema.annotations({
|
|
45
|
+
title: 'Shadow Value',
|
|
46
|
+
description: 'CSS box-shadow value',
|
|
47
|
+
examples: [
|
|
48
|
+
'0 1px 2px 0 rgb(0 0 0 / 0.05)',
|
|
49
|
+
'0 4px 6px -1px rgb(0 0 0 / 0.1)',
|
|
50
|
+
'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)',
|
|
51
|
+
],
|
|
52
|
+
})
|
|
53
|
+
),
|
|
54
|
+
}).pipe(
|
|
55
|
+
Schema.annotations({
|
|
56
|
+
title: 'Shadows',
|
|
57
|
+
description: 'Box shadow design tokens',
|
|
58
|
+
})
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
export type ShadowsConfig = Schema.Schema.Type<typeof ShadowsConfigSchema>
|