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,214 @@
|
|
|
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 { SchemaOrgContext, schemaType } from './common-fields'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Product brand
|
|
13
|
+
*
|
|
14
|
+
* Brand object with @type "Brand" and name.
|
|
15
|
+
* Identifies the product manufacturer or brand.
|
|
16
|
+
*/
|
|
17
|
+
export const ProductBrandSchema = Schema.Struct({
|
|
18
|
+
'@type': schemaType('Brand'),
|
|
19
|
+
name: Schema.optional(
|
|
20
|
+
Schema.String.annotations({
|
|
21
|
+
description: 'Brand name',
|
|
22
|
+
})
|
|
23
|
+
),
|
|
24
|
+
}).annotations({
|
|
25
|
+
description: 'Product brand',
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* ISO 4217 currency code
|
|
30
|
+
*
|
|
31
|
+
* 3-letter currency code (uppercase).
|
|
32
|
+
* - Pattern: ^[A-Z]{3}$ (exactly 3 uppercase letters)
|
|
33
|
+
* - Examples: USD (US Dollar), EUR (Euro), GBP (British Pound), JPY (Japanese Yen)
|
|
34
|
+
*/
|
|
35
|
+
export const CurrencyCodeSchema = Schema.String.pipe(
|
|
36
|
+
Schema.pattern(/^[A-Z]{3}$/, {
|
|
37
|
+
message: () =>
|
|
38
|
+
'Currency code must be ISO 4217 format (3 uppercase letters, e.g., USD, EUR, GBP, JPY)',
|
|
39
|
+
})
|
|
40
|
+
).annotations({
|
|
41
|
+
description: 'ISO 4217 currency code',
|
|
42
|
+
examples: ['USD', 'EUR', 'GBP'],
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Product offer
|
|
47
|
+
*
|
|
48
|
+
* Pricing and availability information for a product.
|
|
49
|
+
* - @type: "Offer"
|
|
50
|
+
* - price: Price as string or number (e.g., "29.99", 29.99)
|
|
51
|
+
* - priceCurrency: ISO 4217 currency code (e.g., "USD", "EUR")
|
|
52
|
+
* - availability: Stock status URL (e.g., "https://schema.org/InStock")
|
|
53
|
+
* - url: URL to purchase page
|
|
54
|
+
*/
|
|
55
|
+
export const ProductOfferSchema = Schema.Struct({
|
|
56
|
+
'@type': schemaType('Offer'),
|
|
57
|
+
price: Schema.optional(
|
|
58
|
+
Schema.Union(Schema.String, Schema.Number).annotations({
|
|
59
|
+
description: 'Product price',
|
|
60
|
+
})
|
|
61
|
+
),
|
|
62
|
+
priceCurrency: Schema.optional(CurrencyCodeSchema),
|
|
63
|
+
availability: Schema.optional(
|
|
64
|
+
Schema.String.annotations({
|
|
65
|
+
description: 'Stock availability status',
|
|
66
|
+
})
|
|
67
|
+
),
|
|
68
|
+
url: Schema.optional(
|
|
69
|
+
Schema.String.annotations({
|
|
70
|
+
description: 'URL to purchase page',
|
|
71
|
+
format: 'uri',
|
|
72
|
+
})
|
|
73
|
+
),
|
|
74
|
+
}).annotations({
|
|
75
|
+
description: 'Product offer',
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Aggregate rating
|
|
80
|
+
*
|
|
81
|
+
* Average rating and review count for a product.
|
|
82
|
+
* - @type: "AggregateRating"
|
|
83
|
+
* - ratingValue: Average rating (e.g., 4.5 out of 5)
|
|
84
|
+
* - reviewCount: Total number of reviews (integer)
|
|
85
|
+
*/
|
|
86
|
+
export const AggregateRatingSchema = Schema.Struct({
|
|
87
|
+
'@type': schemaType('AggregateRating'),
|
|
88
|
+
ratingValue: Schema.optional(
|
|
89
|
+
Schema.Number.annotations({
|
|
90
|
+
description: 'Average rating value',
|
|
91
|
+
})
|
|
92
|
+
),
|
|
93
|
+
reviewCount: Schema.optional(
|
|
94
|
+
Schema.Int.annotations({
|
|
95
|
+
description: 'Total number of reviews',
|
|
96
|
+
})
|
|
97
|
+
),
|
|
98
|
+
}).annotations({
|
|
99
|
+
description: 'Aggregate rating',
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Schema.org Product structured data
|
|
104
|
+
*
|
|
105
|
+
* Represents a product for e-commerce rich results in Google Search.
|
|
106
|
+
* Enables product cards with images, prices, availability, and star ratings
|
|
107
|
+
* directly in search results, dramatically increasing click-through rates.
|
|
108
|
+
*
|
|
109
|
+
* Required properties:
|
|
110
|
+
* - @context: "https://schema.org" (Schema.org vocabulary)
|
|
111
|
+
* - @type: "Product" (Schema.org type identifier)
|
|
112
|
+
* - name: Product name (e.g., "iPhone 15 Pro", "Nike Air Max 90")
|
|
113
|
+
*
|
|
114
|
+
* Optional properties:
|
|
115
|
+
* - description: Product description
|
|
116
|
+
* - image: Product image(s) - string or array (photos, angles, colors)
|
|
117
|
+
* - brand: Product brand (Brand object with name)
|
|
118
|
+
* - sku: Stock Keeping Unit (internal product ID)
|
|
119
|
+
* - gtin: Global Trade Item Number (UPC, EAN, ISBN - standardized ID)
|
|
120
|
+
* - offers: Pricing information (Offer object with price, currency, availability, URL)
|
|
121
|
+
* - aggregateRating: Average rating (AggregateRating object with ratingValue, reviewCount)
|
|
122
|
+
*
|
|
123
|
+
* E-commerce SEO impact:
|
|
124
|
+
* - **Product rich results**: Cards with image, price, availability, ratings in search
|
|
125
|
+
* - **Google Shopping**: Eligible for Google Shopping results (with additional requirements)
|
|
126
|
+
* - **Star ratings**: Visual star ratings increase CTR by 20-30%
|
|
127
|
+
* - **Price display**: Price shown directly in search results
|
|
128
|
+
* - **Availability**: "In Stock" / "Out of Stock" status shown in results
|
|
129
|
+
* - **Mobile optimization**: Tap to purchase, quick product comparison
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```typescript
|
|
133
|
+
* const product = {
|
|
134
|
+
* "@context": "https://schema.org",
|
|
135
|
+
* "@type": "Product",
|
|
136
|
+
* name: "iPhone 15 Pro",
|
|
137
|
+
* description: "Advanced camera system, A17 Pro chip, titanium design",
|
|
138
|
+
* image: [
|
|
139
|
+
* "https://example.com/iphone-front.jpg",
|
|
140
|
+
* "https://example.com/iphone-back.jpg"
|
|
141
|
+
* ],
|
|
142
|
+
* brand: {
|
|
143
|
+
* "@type": "Brand",
|
|
144
|
+
* name: "Apple"
|
|
145
|
+
* },
|
|
146
|
+
* sku: "IPHONE15PRO-256-TIT",
|
|
147
|
+
* gtin: "0194253779999",
|
|
148
|
+
* offers: {
|
|
149
|
+
* "@type": "Offer",
|
|
150
|
+
* price: "999.00",
|
|
151
|
+
* priceCurrency: "USD",
|
|
152
|
+
* availability: "https://schema.org/InStock",
|
|
153
|
+
* url: "https://example.com/products/iphone-15-pro"
|
|
154
|
+
* },
|
|
155
|
+
* aggregateRating: {
|
|
156
|
+
* "@type": "AggregateRating",
|
|
157
|
+
* ratingValue: 4.8,
|
|
158
|
+
* reviewCount: 2547
|
|
159
|
+
* }
|
|
160
|
+
* }
|
|
161
|
+
* ```
|
|
162
|
+
*
|
|
163
|
+
* @see specs/app/pages/meta/structured-data/product.schema.json
|
|
164
|
+
*/
|
|
165
|
+
export const ProductSchema = Schema.Struct({
|
|
166
|
+
'@context': SchemaOrgContext,
|
|
167
|
+
'@type': schemaType('Product'),
|
|
168
|
+
name: Schema.String.annotations({
|
|
169
|
+
description: 'Product name',
|
|
170
|
+
}),
|
|
171
|
+
description: Schema.optional(
|
|
172
|
+
Schema.String.annotations({
|
|
173
|
+
description: 'Product description',
|
|
174
|
+
})
|
|
175
|
+
),
|
|
176
|
+
image: Schema.optional(
|
|
177
|
+
Schema.Union(
|
|
178
|
+
Schema.String.annotations({
|
|
179
|
+
description: 'Product image URL',
|
|
180
|
+
format: 'uri',
|
|
181
|
+
}),
|
|
182
|
+
Schema.Array(
|
|
183
|
+
Schema.String.annotations({
|
|
184
|
+
description: 'Product image URL',
|
|
185
|
+
format: 'uri',
|
|
186
|
+
})
|
|
187
|
+
)
|
|
188
|
+
).annotations({
|
|
189
|
+
description: 'Product image(s)',
|
|
190
|
+
})
|
|
191
|
+
),
|
|
192
|
+
brand: Schema.optional(ProductBrandSchema),
|
|
193
|
+
sku: Schema.optional(
|
|
194
|
+
Schema.String.annotations({
|
|
195
|
+
description: 'Stock Keeping Unit',
|
|
196
|
+
})
|
|
197
|
+
),
|
|
198
|
+
gtin: Schema.optional(
|
|
199
|
+
Schema.String.annotations({
|
|
200
|
+
description: 'Global Trade Item Number (UPC, EAN, ISBN)',
|
|
201
|
+
})
|
|
202
|
+
),
|
|
203
|
+
offers: Schema.optional(ProductOfferSchema),
|
|
204
|
+
aggregateRating: Schema.optional(AggregateRatingSchema),
|
|
205
|
+
}).annotations({
|
|
206
|
+
title: 'Product Schema',
|
|
207
|
+
description: 'Schema.org Product structured data',
|
|
208
|
+
})
|
|
209
|
+
|
|
210
|
+
export type ProductBrand = Schema.Schema.Type<typeof ProductBrandSchema>
|
|
211
|
+
export type CurrencyCode = Schema.Schema.Type<typeof CurrencyCodeSchema>
|
|
212
|
+
export type ProductOffer = Schema.Schema.Type<typeof ProductOfferSchema>
|
|
213
|
+
export type AggregateRating = Schema.Schema.Type<typeof AggregateRatingSchema>
|
|
214
|
+
export type Product = Schema.Schema.Type<typeof ProductSchema>
|
|
@@ -0,0 +1,217 @@
|
|
|
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
|
+
* Twitter Card type
|
|
12
|
+
*
|
|
13
|
+
* 4 card formats for different content types:
|
|
14
|
+
* - summary: Small square image (144x144px, 1:1 aspect) - compact card for brief updates
|
|
15
|
+
* - summary_large_image: Large rectangular image (800x418px, 1.91:1) - most popular, highest engagement
|
|
16
|
+
* - app: Mobile app promotion with install button - links to App Store/Google Play
|
|
17
|
+
* - player: Video/audio player embed - plays inline in Twitter feed
|
|
18
|
+
*/
|
|
19
|
+
export const TwitterCardTypeSchema = Schema.Literal(
|
|
20
|
+
'summary',
|
|
21
|
+
'summary_large_image',
|
|
22
|
+
'app',
|
|
23
|
+
'player'
|
|
24
|
+
).annotations({
|
|
25
|
+
description: 'Type of Twitter Card',
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Twitter username pattern
|
|
30
|
+
*
|
|
31
|
+
* Twitter @username format: starts with @ followed by alphanumeric and underscores.
|
|
32
|
+
* - Pattern: ^@[A-Za-z0-9_]+$ (must start with @)
|
|
33
|
+
* - Valid: @mysite, @johndoe, @acmeblog123
|
|
34
|
+
* - Invalid: mysite (missing @), @my-site (hyphen not allowed)
|
|
35
|
+
*/
|
|
36
|
+
export const TwitterUsernameSchema = Schema.String.pipe(
|
|
37
|
+
Schema.pattern(/^@[A-Za-z0-9_]+$/, {
|
|
38
|
+
message: () =>
|
|
39
|
+
'Twitter username must start with @ and contain only letters, numbers, and underscores (e.g., @mysite, @johndoe)',
|
|
40
|
+
})
|
|
41
|
+
).annotations({
|
|
42
|
+
description: 'Twitter @username',
|
|
43
|
+
examples: ['@mysite', '@johndoe'],
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* App name configuration for Twitter App Card
|
|
48
|
+
*
|
|
49
|
+
* App names per platform (iPhone, iPad, Google Play).
|
|
50
|
+
* Used in App Card to show app name and link to app store.
|
|
51
|
+
*/
|
|
52
|
+
export const TwitterAppNameSchema = Schema.Struct({
|
|
53
|
+
iPhone: Schema.optional(Schema.String.annotations({ description: 'App name for iPhone' })),
|
|
54
|
+
iPad: Schema.optional(Schema.String.annotations({ description: 'App name for iPad' })),
|
|
55
|
+
googlePlay: Schema.optional(
|
|
56
|
+
Schema.String.annotations({ description: 'App name for Google Play' })
|
|
57
|
+
),
|
|
58
|
+
}).annotations({
|
|
59
|
+
description: 'Name of app (for app cards)',
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* App ID configuration for Twitter App Card
|
|
64
|
+
*
|
|
65
|
+
* App Store IDs per platform (iPhone, iPad, Google Play).
|
|
66
|
+
* Used in App Card to link directly to app store listing.
|
|
67
|
+
*/
|
|
68
|
+
export const TwitterAppIdSchema = Schema.Struct({
|
|
69
|
+
iPhone: Schema.optional(Schema.String.annotations({ description: 'App Store ID for iPhone' })),
|
|
70
|
+
iPad: Schema.optional(Schema.String.annotations({ description: 'App Store ID for iPad' })),
|
|
71
|
+
googlePlay: Schema.optional(
|
|
72
|
+
Schema.String.annotations({ description: 'Google Play package name (e.g., com.example.myapp)' })
|
|
73
|
+
),
|
|
74
|
+
}).annotations({
|
|
75
|
+
description: 'App ID in respective stores',
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* CORS setting for Twitter Card resources
|
|
80
|
+
*
|
|
81
|
+
* 3 options:
|
|
82
|
+
* - true: Anonymous CORS (no credentials)
|
|
83
|
+
* - false: No CORS
|
|
84
|
+
* - 'anonymous': Explicit anonymous CORS
|
|
85
|
+
* - 'use-credentials': CORS with credentials
|
|
86
|
+
*/
|
|
87
|
+
export const TwitterCrossOriginSchema = Schema.Union(
|
|
88
|
+
Schema.Boolean,
|
|
89
|
+
Schema.Literal('anonymous', 'use-credentials')
|
|
90
|
+
).annotations({
|
|
91
|
+
description: 'CORS setting for the resource',
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Twitter Card metadata for rich Twitter/X sharing
|
|
96
|
+
*
|
|
97
|
+
* Defines how pages appear when shared on Twitter/X platform.
|
|
98
|
+
* Creates rich preview cards with images, titles, and descriptions to
|
|
99
|
+
* dramatically increase engagement and click-through rates.
|
|
100
|
+
*
|
|
101
|
+
* Required properties:
|
|
102
|
+
* - card: Card type (summary, summary_large_image, app, player)
|
|
103
|
+
*
|
|
104
|
+
* Optional properties:
|
|
105
|
+
* - title: Card title (max 70 chars, shorter than Open Graph's 90)
|
|
106
|
+
* - description: Card description (max 200 chars, same as Open Graph)
|
|
107
|
+
* - image: Image URL (min 144x144px for summary, 300x157px for large)
|
|
108
|
+
* - imageAlt: Image alternative text (max 420 chars, longer than Open Graph)
|
|
109
|
+
* - site: Twitter @username of website (e.g., @acmeblog)
|
|
110
|
+
* - creator: Twitter @username of content author (e.g., @johndoe)
|
|
111
|
+
*
|
|
112
|
+
* Player card properties (for video/audio):
|
|
113
|
+
* - player: HTTPS URL to player iframe
|
|
114
|
+
* - playerWidth: Player width in pixels
|
|
115
|
+
* - playerHeight: Player height in pixels
|
|
116
|
+
*
|
|
117
|
+
* App card properties (for mobile apps):
|
|
118
|
+
* - appName: App names per platform (iPhone, iPad, Google Play)
|
|
119
|
+
* - appId: App Store IDs per platform
|
|
120
|
+
*
|
|
121
|
+
* Card types comparison:
|
|
122
|
+
* 1. **summary**: Small square image (144x144px), compact format
|
|
123
|
+
* - Good for: news updates, blog posts, simple links
|
|
124
|
+
* - Layout: [Square image] [Title + Description]
|
|
125
|
+
*
|
|
126
|
+
* 2. **summary_large_image**: Large rectangular image (800x418px), most popular
|
|
127
|
+
* - Good for: featured content, product launches, visual content
|
|
128
|
+
* - Layout: [Large image full width] [Title] [Description]
|
|
129
|
+
* - Highest engagement (most popular card type)
|
|
130
|
+
*
|
|
131
|
+
* 3. **app**: Mobile app promotion with install button
|
|
132
|
+
* - Good for: app launches, mobile-first products
|
|
133
|
+
* - Layout: [App icon] [Title + Description] [Install button]
|
|
134
|
+
* - Click: opens App Store/Google Play directly
|
|
135
|
+
*
|
|
136
|
+
* 4. **player**: Video/audio player embed
|
|
137
|
+
* - Good for: video content, podcasts, demos
|
|
138
|
+
* - Layout: [Video thumbnail] [Play button]
|
|
139
|
+
* - Click: embeds player iframe inline in Twitter feed
|
|
140
|
+
*
|
|
141
|
+
* Impact:
|
|
142
|
+
* - Rich cards get 2-3x more clicks than plain links
|
|
143
|
+
* - Large image card most effective (highest engagement)
|
|
144
|
+
* - Without Twitter Card: falls back to Open Graph or generic unfurl
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```typescript
|
|
148
|
+
* const twitterCard = {
|
|
149
|
+
* card: 'summary_large_image',
|
|
150
|
+
* title: 'Transform Your Business with AI-Powered Analytics',
|
|
151
|
+
* description: 'Get real-time insights and automated reporting. Start free trial.',
|
|
152
|
+
* image: 'https://example.com/twitter-800x418.jpg',
|
|
153
|
+
* imageAlt: 'Dashboard screenshot showing analytics graphs',
|
|
154
|
+
* site: '@acmeanalytics',
|
|
155
|
+
* creator: '@johndoe'
|
|
156
|
+
* }
|
|
157
|
+
* ```
|
|
158
|
+
*
|
|
159
|
+
* @see specs/app/pages/meta/social/twitter-card.schema.json
|
|
160
|
+
*/
|
|
161
|
+
export const TwitterCardSchema = Schema.Struct({
|
|
162
|
+
card: TwitterCardTypeSchema,
|
|
163
|
+
title: Schema.optional(
|
|
164
|
+
Schema.String.pipe(Schema.maxLength(70)).annotations({
|
|
165
|
+
description: 'Twitter Card title',
|
|
166
|
+
})
|
|
167
|
+
),
|
|
168
|
+
description: Schema.optional(
|
|
169
|
+
Schema.String.pipe(Schema.maxLength(200)).annotations({
|
|
170
|
+
description: 'Twitter Card description',
|
|
171
|
+
})
|
|
172
|
+
),
|
|
173
|
+
image: Schema.optional(
|
|
174
|
+
Schema.String.annotations({
|
|
175
|
+
description: 'Image URL (min 144x144px for summary, 300x157px for large)',
|
|
176
|
+
format: 'uri',
|
|
177
|
+
})
|
|
178
|
+
),
|
|
179
|
+
imageAlt: Schema.optional(
|
|
180
|
+
Schema.String.pipe(Schema.maxLength(420)).annotations({
|
|
181
|
+
description: 'Alternative text for the image',
|
|
182
|
+
})
|
|
183
|
+
),
|
|
184
|
+
site: Schema.optional(
|
|
185
|
+
TwitterUsernameSchema.annotations({ description: 'Twitter @username of website' })
|
|
186
|
+
),
|
|
187
|
+
creator: Schema.optional(
|
|
188
|
+
TwitterUsernameSchema.annotations({ description: 'Twitter @username of content creator' })
|
|
189
|
+
),
|
|
190
|
+
player: Schema.optional(
|
|
191
|
+
Schema.String.annotations({
|
|
192
|
+
description: 'HTTPS URL to video player (for player cards)',
|
|
193
|
+
format: 'uri',
|
|
194
|
+
})
|
|
195
|
+
),
|
|
196
|
+
playerWidth: Schema.optional(
|
|
197
|
+
Schema.Int.pipe(Schema.greaterThanOrEqualTo(1)).annotations({
|
|
198
|
+
description: 'Width of video player in pixels',
|
|
199
|
+
})
|
|
200
|
+
),
|
|
201
|
+
playerHeight: Schema.optional(
|
|
202
|
+
Schema.Int.pipe(Schema.greaterThanOrEqualTo(1)).annotations({
|
|
203
|
+
description: 'Height of video player in pixels',
|
|
204
|
+
})
|
|
205
|
+
),
|
|
206
|
+
appName: Schema.optional(TwitterAppNameSchema),
|
|
207
|
+
appId: Schema.optional(TwitterAppIdSchema),
|
|
208
|
+
}).annotations({
|
|
209
|
+
title: 'Twitter Card Metadata',
|
|
210
|
+
description: 'Twitter Card metadata for rich Twitter/X sharing',
|
|
211
|
+
})
|
|
212
|
+
|
|
213
|
+
export type TwitterCardType = Schema.Schema.Type<typeof TwitterCardTypeSchema>
|
|
214
|
+
export type TwitterUsername = Schema.Schema.Type<typeof TwitterUsernameSchema>
|
|
215
|
+
export type TwitterAppName = Schema.Schema.Type<typeof TwitterAppNameSchema>
|
|
216
|
+
export type TwitterAppId = Schema.Schema.Type<typeof TwitterAppIdSchema>
|
|
217
|
+
export type TwitterCard = Schema.Schema.Type<typeof TwitterCardSchema>
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
* Page Name (human-readable display name for the page)
|
|
12
|
+
*
|
|
13
|
+
* Unlike the common NameSchema (database identifier with snake_case), page names
|
|
14
|
+
* are human-readable labels used in admin interfaces, logs, and internal references.
|
|
15
|
+
* They can contain spaces, capital letters, and other readable characters.
|
|
16
|
+
*
|
|
17
|
+
* Must be non-empty with max 63 characters to match database constraints for
|
|
18
|
+
* internal identifiers, but doesn't enforce snake_case pattern since this is
|
|
19
|
+
* a display name, not a database column name.
|
|
20
|
+
*
|
|
21
|
+
* @example "Home"
|
|
22
|
+
* @example "About Us"
|
|
23
|
+
* @example "Home Page"
|
|
24
|
+
* @example "Pricing Plans"
|
|
25
|
+
*
|
|
26
|
+
* @see specs/app/pages/name/name.schema.json
|
|
27
|
+
*/
|
|
28
|
+
export const PageNameSchema = Schema.String.pipe(
|
|
29
|
+
Schema.minLength(1),
|
|
30
|
+
Schema.maxLength(63),
|
|
31
|
+
Schema.annotations({
|
|
32
|
+
title: 'Page Name',
|
|
33
|
+
description: 'Human-readable name for the page',
|
|
34
|
+
examples: ['Home', 'About Us', 'Home Page', 'Pricing', 'Contact'],
|
|
35
|
+
})
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
export type PageName = Schema.Schema.Type<typeof PageNameSchema>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ESSENTIAL SERVICES
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Business Source License 1.1
|
|
5
|
+
* found in the LICENSE.md file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { PathSchema as CommonPathSchema } from '../common/definitions'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* URL Path (where the page is accessible)
|
|
12
|
+
*
|
|
13
|
+
* Re-exports the common Path schema from definitions.
|
|
14
|
+
* See PathSchema in common/definitions for full documentation.
|
|
15
|
+
*
|
|
16
|
+
* @see specs/app/pages/path/path.schema.json
|
|
17
|
+
* @see specs/app/common/definitions.schema.json#/definitions/path
|
|
18
|
+
*/
|
|
19
|
+
export const PagePathSchema = CommonPathSchema
|
|
20
|
+
|
|
21
|
+
export type PagePath = typeof PagePathSchema.Type
|
|
@@ -0,0 +1,163 @@
|
|
|
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
|
+
* CORS settings for external scripts
|
|
12
|
+
*
|
|
13
|
+
* Controls cross-origin resource sharing:
|
|
14
|
+
* - anonymous: No credentials sent (default for public CDN scripts)
|
|
15
|
+
* - use-credentials: Send credentials (cookies, auth headers)
|
|
16
|
+
*/
|
|
17
|
+
export const CrossOriginSchema = Schema.Literal('anonymous', 'use-credentials').annotations({
|
|
18
|
+
description: 'CORS setting for cross-origin scripts',
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Script insertion position in HTML document
|
|
23
|
+
*
|
|
24
|
+
* Controls where the script tag is inserted:
|
|
25
|
+
* - head: In document <head> (loads before DOM)
|
|
26
|
+
* - body-start: At start of <body> (loads before content)
|
|
27
|
+
* - body-end: At end of <body> (default, loads after content)
|
|
28
|
+
*
|
|
29
|
+
* Performance impact:
|
|
30
|
+
* - head: Blocks rendering, use with defer/async
|
|
31
|
+
* - body-start: Blocks content, use sparingly
|
|
32
|
+
* - body-end: Non-blocking, best for most scripts
|
|
33
|
+
*/
|
|
34
|
+
export const ScriptPositionSchema = Schema.Literal('head', 'body-start', 'body-end').annotations({
|
|
35
|
+
description: 'Where to insert the script in the document',
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* External JavaScript dependency
|
|
40
|
+
*
|
|
41
|
+
* Defines an external script loaded from a URL (CDN or local path).
|
|
42
|
+
*
|
|
43
|
+
* Required properties:
|
|
44
|
+
* - src: Script source URL (https:// for CDN, relative for local)
|
|
45
|
+
*
|
|
46
|
+
* Optional properties:
|
|
47
|
+
* - async: Load asynchronously (non-blocking, execute when ready)
|
|
48
|
+
* - defer: Defer execution until DOM loaded (preserves order)
|
|
49
|
+
* - module: Load as ES module (type="module")
|
|
50
|
+
* - integrity: Subresource integrity hash for security
|
|
51
|
+
* - crossorigin: CORS setting (anonymous or use-credentials)
|
|
52
|
+
* - position: Where to insert script (head, body-start, body-end)
|
|
53
|
+
*
|
|
54
|
+
* Loading strategies:
|
|
55
|
+
* - async: Best for analytics, ads (execute ASAP, order doesn't matter)
|
|
56
|
+
* - defer: Best for frameworks (preserve order, non-blocking)
|
|
57
|
+
* - neither: Blocking (avoid unless script must execute before DOM)
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* const alpineJS = {
|
|
62
|
+
* src: 'https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js',
|
|
63
|
+
* defer: true,
|
|
64
|
+
* position: 'head'
|
|
65
|
+
* }
|
|
66
|
+
*
|
|
67
|
+
* const chartJS = {
|
|
68
|
+
* src: 'https://cdn.jsdelivr.net/npm/chart.js',
|
|
69
|
+
* async: true
|
|
70
|
+
* }
|
|
71
|
+
*
|
|
72
|
+
* const localApp = {
|
|
73
|
+
* src: './js/app.js',
|
|
74
|
+
* module: true,
|
|
75
|
+
* position: 'body-end'
|
|
76
|
+
* }
|
|
77
|
+
* ```
|
|
78
|
+
*
|
|
79
|
+
* @see specs/app/pages/scripts/external-scripts/external-scripts.schema.json
|
|
80
|
+
*/
|
|
81
|
+
export const ExternalScriptSchema = Schema.Struct({
|
|
82
|
+
src: Schema.String.annotations({
|
|
83
|
+
description: 'Script source URL',
|
|
84
|
+
format: 'uri',
|
|
85
|
+
}),
|
|
86
|
+
async: Schema.optional(
|
|
87
|
+
Schema.Boolean.annotations({
|
|
88
|
+
description: 'Load script asynchronously',
|
|
89
|
+
default: false,
|
|
90
|
+
})
|
|
91
|
+
),
|
|
92
|
+
defer: Schema.optional(
|
|
93
|
+
Schema.Boolean.annotations({
|
|
94
|
+
description: 'Defer script execution',
|
|
95
|
+
default: false,
|
|
96
|
+
})
|
|
97
|
+
),
|
|
98
|
+
module: Schema.optional(
|
|
99
|
+
Schema.Boolean.annotations({
|
|
100
|
+
description: 'Load as ES module',
|
|
101
|
+
default: false,
|
|
102
|
+
})
|
|
103
|
+
),
|
|
104
|
+
integrity: Schema.optional(
|
|
105
|
+
Schema.String.annotations({
|
|
106
|
+
description: 'Subresource integrity hash',
|
|
107
|
+
})
|
|
108
|
+
),
|
|
109
|
+
crossorigin: Schema.optional(CrossOriginSchema),
|
|
110
|
+
position: Schema.optional(ScriptPositionSchema),
|
|
111
|
+
}).annotations({
|
|
112
|
+
description: 'External JavaScript dependency',
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* External JavaScript dependencies
|
|
117
|
+
*
|
|
118
|
+
* Array of external scripts loaded from CDN or local paths.
|
|
119
|
+
* Scripts are loaded in order when using defer or blocking mode.
|
|
120
|
+
*
|
|
121
|
+
* Common use cases:
|
|
122
|
+
* - Frameworks: Alpine.js, htmx (defer for order preservation)
|
|
123
|
+
* - Libraries: Chart.js, D3.js (async for parallel loading)
|
|
124
|
+
* - Analytics: Google Analytics, Plausible (async, non-blocking)
|
|
125
|
+
* - UI widgets: Intercom, Crisp chat (async, low priority)
|
|
126
|
+
*
|
|
127
|
+
* Performance best practices:
|
|
128
|
+
* - Use async for non-dependent scripts (analytics, ads)
|
|
129
|
+
* - Use defer for frameworks/libraries that depend on each other
|
|
130
|
+
* - Add integrity hashes for security (CDN scripts)
|
|
131
|
+
* - Prefer body-end position for non-critical scripts
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```typescript
|
|
135
|
+
* const externalScripts = [
|
|
136
|
+
* {
|
|
137
|
+
* src: 'https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js',
|
|
138
|
+
* defer: true,
|
|
139
|
+
* position: 'head'
|
|
140
|
+
* },
|
|
141
|
+
* {
|
|
142
|
+
* src: 'https://cdn.jsdelivr.net/npm/chart.js',
|
|
143
|
+
* async: true
|
|
144
|
+
* },
|
|
145
|
+
* {
|
|
146
|
+
* src: './js/app.js',
|
|
147
|
+
* module: true,
|
|
148
|
+
* position: 'body-end'
|
|
149
|
+
* }
|
|
150
|
+
* ]
|
|
151
|
+
* ```
|
|
152
|
+
*
|
|
153
|
+
* @see specs/app/pages/scripts/external-scripts/external-scripts.schema.json
|
|
154
|
+
*/
|
|
155
|
+
export const ExternalScriptsSchema = Schema.Array(ExternalScriptSchema).annotations({
|
|
156
|
+
title: 'External Scripts',
|
|
157
|
+
description: 'External JavaScript dependencies',
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
export type CrossOrigin = Schema.Schema.Type<typeof CrossOriginSchema>
|
|
161
|
+
export type ScriptPosition = Schema.Schema.Type<typeof ScriptPositionSchema>
|
|
162
|
+
export type ExternalScript = Schema.Schema.Type<typeof ExternalScriptSchema>
|
|
163
|
+
export type ExternalScripts = Schema.Schema.Type<typeof ExternalScriptsSchema>
|