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.
Files changed (527) hide show
  1. package/CHANGELOG.md +3497 -0
  2. package/LICENSE.md +147 -0
  3. package/LICENSE_EE.md +297 -0
  4. package/README.md +321 -0
  5. package/drizzle/0000_melted_kabuki.sql +163 -0
  6. package/drizzle/meta/0000_snapshot.json +1216 -0
  7. package/drizzle/meta/_journal.json +13 -0
  8. package/package.json +167 -0
  9. package/schemas/0.0.1/app.openapi.json +70 -0
  10. package/schemas/0.0.1/app.schema.json +7961 -0
  11. package/schemas/0.0.2/app.openapi.json +80 -0
  12. package/schemas/0.0.2/app.schema.json +8829 -0
  13. package/schemas/development/app.openapi.json +70 -0
  14. package/schemas/development/app.schema.json +7456 -0
  15. package/src/application/errors/app-validation-error.ts +14 -0
  16. package/src/application/errors/static-generation-error.ts +16 -0
  17. package/src/application/metadata/favicon-transformer.ts +127 -0
  18. package/src/application/models/server.ts +27 -0
  19. package/src/application/ports/models/user-metadata.ts +36 -0
  20. package/src/application/ports/models/user-session.ts +34 -0
  21. package/src/application/ports/repositories/activity-log-repository.ts +68 -0
  22. package/src/application/ports/repositories/activity-repository.ts +49 -0
  23. package/src/application/ports/repositories/analytics-repository.ts +164 -0
  24. package/src/application/ports/repositories/auth-repository.ts +33 -0
  25. package/src/application/ports/repositories/batch-repository.ts +86 -0
  26. package/src/application/ports/repositories/comment-repository.ts +150 -0
  27. package/src/application/ports/repositories/index.ts +41 -0
  28. package/src/application/ports/repositories/table-repository.ts +139 -0
  29. package/src/application/ports/services/css-compiler.ts +55 -0
  30. package/src/application/ports/services/index.ts +16 -0
  31. package/src/application/ports/services/page-renderer.ts +79 -0
  32. package/src/application/ports/services/server-factory.ts +80 -0
  33. package/src/application/ports/services/static-site-generator.ts +82 -0
  34. package/src/application/use-cases/activity/programs.ts +66 -0
  35. package/src/application/use-cases/analytics/collect-page-view.ts +114 -0
  36. package/src/application/use-cases/analytics/purge-old-data.ts +40 -0
  37. package/src/application/use-cases/analytics/query-campaigns.ts +43 -0
  38. package/src/application/use-cases/analytics/query-devices.ts +36 -0
  39. package/src/application/use-cases/analytics/query-overview.ts +50 -0
  40. package/src/application/use-cases/analytics/query-pages.ts +40 -0
  41. package/src/application/use-cases/analytics/query-referrers.ts +43 -0
  42. package/src/application/use-cases/analytics/ua-parser.ts +89 -0
  43. package/src/application/use-cases/analytics/visitor-hash.ts +77 -0
  44. package/src/application/use-cases/auth/bootstrap-admin.ts +270 -0
  45. package/src/application/use-cases/list-activity-logs.ts +123 -0
  46. package/src/application/use-cases/server/generate-static-helpers.ts +374 -0
  47. package/src/application/use-cases/server/generate-static.ts +287 -0
  48. package/src/application/use-cases/server/start-server.ts +118 -0
  49. package/src/application/use-cases/server/startup-error-handler.ts +69 -0
  50. package/src/application/use-cases/server/static-content-generators.ts +182 -0
  51. package/src/application/use-cases/server/static-language-generators.ts +181 -0
  52. package/src/application/use-cases/server/static-url-rewriter.ts +237 -0
  53. package/src/application/use-cases/server/translation-replacer.ts +164 -0
  54. package/src/application/use-cases/tables/activity-programs.ts +93 -0
  55. package/src/application/use-cases/tables/batch-operations.ts +156 -0
  56. package/src/application/use-cases/tables/comment-programs.ts +436 -0
  57. package/src/application/use-cases/tables/permissions/permissions.ts +25 -0
  58. package/src/application/use-cases/tables/programs.ts +435 -0
  59. package/src/application/use-cases/tables/table-operations.ts +412 -0
  60. package/src/application/use-cases/tables/user-role.ts +52 -0
  61. package/src/application/use-cases/tables/utils/display-formatter.ts +471 -0
  62. package/src/application/use-cases/tables/utils/field-read-filter.ts +189 -0
  63. package/src/application/use-cases/tables/utils/list-helpers.ts +122 -0
  64. package/src/application/use-cases/tables/utils/record-transformer.ts +319 -0
  65. package/src/cli.ts +370 -0
  66. package/src/domain/errors/create-tagged-error.ts +36 -0
  67. package/src/domain/errors/index.ts +78 -0
  68. package/src/domain/models/api/analytics.ts +179 -0
  69. package/src/domain/models/api/auth.ts +231 -0
  70. package/src/domain/models/api/common.ts +60 -0
  71. package/src/domain/models/api/error.ts +89 -0
  72. package/src/domain/models/api/health.ts +38 -0
  73. package/src/domain/models/api/index.ts +42 -0
  74. package/src/domain/models/api/request.ts +132 -0
  75. package/src/domain/models/api/tables.ts +444 -0
  76. package/src/domain/models/app/analytics/index.ts +129 -0
  77. package/src/domain/models/app/auth/config.ts +116 -0
  78. package/src/domain/models/app/auth/index.ts +230 -0
  79. package/src/domain/models/app/auth/methods/email-and-password.ts +67 -0
  80. package/src/domain/models/app/auth/methods/index.ts +11 -0
  81. package/src/domain/models/app/auth/methods/magic-link.ts +54 -0
  82. package/src/domain/models/app/auth/oauth/index.ts +8 -0
  83. package/src/domain/models/app/auth/oauth/providers.ts +105 -0
  84. package/src/domain/models/app/auth/plugins/admin.ts +130 -0
  85. package/src/domain/models/app/auth/plugins/index.ts +74 -0
  86. package/src/domain/models/app/auth/plugins/two-factor.ts +63 -0
  87. package/src/domain/models/app/auth/roles.ts +179 -0
  88. package/src/domain/models/app/auth/strategies.ts +191 -0
  89. package/src/domain/models/app/auth/validation.ts +127 -0
  90. package/src/domain/models/app/common/branded-ids.ts +200 -0
  91. package/src/domain/models/app/common/definitions.ts +187 -0
  92. package/src/domain/models/app/component/common/component-children.ts +119 -0
  93. package/src/domain/models/app/component/common/component-props.ts +89 -0
  94. package/src/domain/models/app/component/common/component-reference.ts +170 -0
  95. package/src/domain/models/app/component/component.ts +81 -0
  96. package/src/domain/models/app/components.ts +65 -0
  97. package/src/domain/models/app/description.ts +83 -0
  98. package/src/domain/models/app/index.ts +258 -0
  99. package/src/domain/models/app/language/language-config.ts +200 -0
  100. package/src/domain/models/app/languages.ts +205 -0
  101. package/src/domain/models/app/name.ts +66 -0
  102. package/src/domain/models/app/page/common/interactions/click-interaction.ts +116 -0
  103. package/src/domain/models/app/page/common/interactions/entrance-animation.ts +84 -0
  104. package/src/domain/models/app/page/common/interactions/hover-interaction.ts +144 -0
  105. package/src/domain/models/app/page/common/interactions/interactions.ts +64 -0
  106. package/src/domain/models/app/page/common/interactions/scroll-interaction.ts +93 -0
  107. package/src/domain/models/app/page/common/responsive.ts +114 -0
  108. package/src/domain/models/app/page/common/url.ts +35 -0
  109. package/src/domain/models/app/page/common/variable-reference.ts +53 -0
  110. package/src/domain/models/app/page/id.ts +44 -0
  111. package/src/domain/models/app/page/index.ts +270 -0
  112. package/src/domain/models/app/page/meta/analytics.ts +248 -0
  113. package/src/domain/models/app/page/meta/custom-elements.ts +180 -0
  114. package/src/domain/models/app/page/meta/dns-prefetch.ts +77 -0
  115. package/src/domain/models/app/page/meta/favicon-set.ts +203 -0
  116. package/src/domain/models/app/page/meta/favicon.ts +50 -0
  117. package/src/domain/models/app/page/meta/favicons-config.ts +73 -0
  118. package/src/domain/models/app/page/meta/index.ts +278 -0
  119. package/src/domain/models/app/page/meta/open-graph.ts +166 -0
  120. package/src/domain/models/app/page/meta/preload.ts +190 -0
  121. package/src/domain/models/app/page/meta/structured-data/article.ts +211 -0
  122. package/src/domain/models/app/page/meta/structured-data/breadcrumb.ts +115 -0
  123. package/src/domain/models/app/page/meta/structured-data/common-fields.ts +201 -0
  124. package/src/domain/models/app/page/meta/structured-data/education-event.ts +256 -0
  125. package/src/domain/models/app/page/meta/structured-data/faq-page.ts +127 -0
  126. package/src/domain/models/app/page/meta/structured-data/index.ts +95 -0
  127. package/src/domain/models/app/page/meta/structured-data/local-business.ts +247 -0
  128. package/src/domain/models/app/page/meta/structured-data/organization.ts +171 -0
  129. package/src/domain/models/app/page/meta/structured-data/person.ts +138 -0
  130. package/src/domain/models/app/page/meta/structured-data/postal-address.ts +106 -0
  131. package/src/domain/models/app/page/meta/structured-data/product.ts +214 -0
  132. package/src/domain/models/app/page/meta/twitter-card.ts +217 -0
  133. package/src/domain/models/app/page/name.ts +38 -0
  134. package/src/domain/models/app/page/path.ts +21 -0
  135. package/src/domain/models/app/page/scripts/external-scripts.ts +163 -0
  136. package/src/domain/models/app/page/scripts/features.ts +135 -0
  137. package/src/domain/models/app/page/scripts/inline-scripts.ts +114 -0
  138. package/src/domain/models/app/page/scripts/scripts.ts +102 -0
  139. package/src/domain/models/app/page/sections.ts +298 -0
  140. package/src/domain/models/app/pages.ts +61 -0
  141. package/src/domain/models/app/permissions/index.ts +61 -0
  142. package/src/domain/models/app/permissions/resource-action.ts +114 -0
  143. package/src/domain/models/app/permissions/roles.ts +120 -0
  144. package/src/domain/models/app/table/check-constraints.ts +105 -0
  145. package/src/domain/models/app/table/cycle-detection.ts +124 -0
  146. package/src/domain/models/app/table/database-identifier.ts +153 -0
  147. package/src/domain/models/app/table/field-name.ts +36 -0
  148. package/src/domain/models/app/table/field-types/advanced/array-field.ts +33 -0
  149. package/src/domain/models/app/table/field-types/advanced/autonumber-field.ts +54 -0
  150. package/src/domain/models/app/table/field-types/advanced/button-field.ts +56 -0
  151. package/src/domain/models/app/table/field-types/advanced/color-field.ts +57 -0
  152. package/src/domain/models/app/table/field-types/advanced/count-field.ts +54 -0
  153. package/src/domain/models/app/table/field-types/advanced/formula-field.ts +58 -0
  154. package/src/domain/models/app/table/field-types/advanced/geolocation-field.ts +49 -0
  155. package/src/domain/models/app/table/field-types/advanced/index.ts +16 -0
  156. package/src/domain/models/app/table/field-types/advanced/json-field.ts +25 -0
  157. package/src/domain/models/app/table/field-types/advanced/unknown-field.ts +85 -0
  158. package/src/domain/models/app/table/field-types/base-field.ts +42 -0
  159. package/src/domain/models/app/table/field-types/date-time/created-at-field.ts +49 -0
  160. package/src/domain/models/app/table/field-types/date-time/date-field.ts +95 -0
  161. package/src/domain/models/app/table/field-types/date-time/deleted-at-field.ts +56 -0
  162. package/src/domain/models/app/table/field-types/date-time/duration-field.ts +73 -0
  163. package/src/domain/models/app/table/field-types/date-time/index.ts +12 -0
  164. package/src/domain/models/app/table/field-types/date-time/updated-at-field.ts +50 -0
  165. package/src/domain/models/app/table/field-types/index.ts +19 -0
  166. package/src/domain/models/app/table/field-types/media/barcode-field.ts +58 -0
  167. package/src/domain/models/app/table/field-types/media/index.ts +10 -0
  168. package/src/domain/models/app/table/field-types/media/multiple-attachments-field.ts +80 -0
  169. package/src/domain/models/app/table/field-types/media/single-attachment-field.ts +81 -0
  170. package/src/domain/models/app/table/field-types/numeric/currency-field.ts +144 -0
  171. package/src/domain/models/app/table/field-types/numeric/decimal-field.ts +113 -0
  172. package/src/domain/models/app/table/field-types/numeric/index.ts +13 -0
  173. package/src/domain/models/app/table/field-types/numeric/integer-field.ts +98 -0
  174. package/src/domain/models/app/table/field-types/numeric/percentage-field.ts +115 -0
  175. package/src/domain/models/app/table/field-types/numeric/progress-field.ts +71 -0
  176. package/src/domain/models/app/table/field-types/numeric/rating-field.ts +74 -0
  177. package/src/domain/models/app/table/field-types/relational/index.ts +10 -0
  178. package/src/domain/models/app/table/field-types/relational/lookup-field.ts +46 -0
  179. package/src/domain/models/app/table/field-types/relational/relationship-field.ts +112 -0
  180. package/src/domain/models/app/table/field-types/relational/rollup-field.ts +58 -0
  181. package/src/domain/models/app/table/field-types/selection/checkbox-field.ts +51 -0
  182. package/src/domain/models/app/table/field-types/selection/index.ts +11 -0
  183. package/src/domain/models/app/table/field-types/selection/multi-select-field.ts +68 -0
  184. package/src/domain/models/app/table/field-types/selection/single-select-field.ts +54 -0
  185. package/src/domain/models/app/table/field-types/selection/status-field.ts +37 -0
  186. package/src/domain/models/app/table/field-types/text/email-field.ts +80 -0
  187. package/src/domain/models/app/table/field-types/text/index.ts +13 -0
  188. package/src/domain/models/app/table/field-types/text/long-text-field.ts +77 -0
  189. package/src/domain/models/app/table/field-types/text/phone-number-field.ts +82 -0
  190. package/src/domain/models/app/table/field-types/text/rich-text-field.ts +66 -0
  191. package/src/domain/models/app/table/field-types/text/single-line-text-field.ts +79 -0
  192. package/src/domain/models/app/table/field-types/text/url-field.ts +81 -0
  193. package/src/domain/models/app/table/field-types/user/created-by-field.ts +50 -0
  194. package/src/domain/models/app/table/field-types/user/deleted-by-field.ts +57 -0
  195. package/src/domain/models/app/table/field-types/user/index.ts +11 -0
  196. package/src/domain/models/app/table/field-types/user/updated-by-field.ts +51 -0
  197. package/src/domain/models/app/table/field-types/user/user-field.ts +52 -0
  198. package/src/domain/models/app/table/field-types/validation-utils.ts +166 -0
  199. package/src/domain/models/app/table/fields.ts +216 -0
  200. package/src/domain/models/app/table/foreign-keys.ts +111 -0
  201. package/src/domain/models/app/table/formula-keywords.ts +326 -0
  202. package/src/domain/models/app/table/id.ts +31 -0
  203. package/src/domain/models/app/table/index.ts +290 -0
  204. package/src/domain/models/app/table/indexes.ts +80 -0
  205. package/src/domain/models/app/table/name.ts +37 -0
  206. package/src/domain/models/app/table/permissions/field-permission.ts +83 -0
  207. package/src/domain/models/app/table/permissions/index.ts +167 -0
  208. package/src/domain/models/app/table/permissions/permission-evaluator.ts +372 -0
  209. package/src/domain/models/app/table/permissions/permission.ts +49 -0
  210. package/src/domain/models/app/table/primary-key.ts +62 -0
  211. package/src/domain/models/app/table/table-formula-validation.ts +168 -0
  212. package/src/domain/models/app/table/table-indexes-validation.ts +38 -0
  213. package/src/domain/models/app/table/table-permissions-validation.ts +77 -0
  214. package/src/domain/models/app/table/table-primary-key-validation.ts +49 -0
  215. package/src/domain/models/app/table/table-views-validation.ts +408 -0
  216. package/src/domain/models/app/table/unique-constraints.ts +79 -0
  217. package/src/domain/models/app/table/views/fields.ts +28 -0
  218. package/src/domain/models/app/table/views/filters.ts +162 -0
  219. package/src/domain/models/app/table/views/group-by.ts +32 -0
  220. package/src/domain/models/app/table/views/id.ts +50 -0
  221. package/src/domain/models/app/table/views/index.ts +177 -0
  222. package/src/domain/models/app/table/views/name.ts +32 -0
  223. package/src/domain/models/app/table/views/permissions.ts +98 -0
  224. package/src/domain/models/app/table/views/sorts.ts +31 -0
  225. package/src/domain/models/app/tables.ts +695 -0
  226. package/src/domain/models/app/theme/animations.ts +208 -0
  227. package/src/domain/models/app/theme/border-radius.ts +58 -0
  228. package/src/domain/models/app/theme/breakpoints.ts +62 -0
  229. package/src/domain/models/app/theme/colors.ts +110 -0
  230. package/src/domain/models/app/theme/fonts.ts +164 -0
  231. package/src/domain/models/app/theme/shadows.ts +61 -0
  232. package/src/domain/models/app/theme/spacing.ts +115 -0
  233. package/src/domain/models/app/theme.ts +66 -0
  234. package/src/domain/models/app/version.ts +87 -0
  235. package/src/domain/models/record-comment.ts +91 -0
  236. package/src/domain/utils/content-parsing.ts +49 -0
  237. package/src/domain/utils/format-detection.ts +69 -0
  238. package/src/domain/utils/index.ts +9 -0
  239. package/src/domain/utils/route-matcher.ts +184 -0
  240. package/src/domain/utils/translation-resolver.ts +170 -0
  241. package/src/index.ts +208 -0
  242. package/src/infrastructure/analytics/tracking-script.ts +48 -0
  243. package/src/infrastructure/auth/better-auth/auth.ts +216 -0
  244. package/src/infrastructure/auth/better-auth/email-handlers.ts +162 -0
  245. package/src/infrastructure/auth/better-auth/index.ts +16 -0
  246. package/src/infrastructure/auth/better-auth/layer.ts +97 -0
  247. package/src/infrastructure/auth/better-auth/plugins/admin.ts +56 -0
  248. package/src/infrastructure/auth/better-auth/plugins/magic-link.ts +31 -0
  249. package/src/infrastructure/auth/better-auth/plugins/two-factor.ts +19 -0
  250. package/src/infrastructure/auth/better-auth/schema.ts +152 -0
  251. package/src/infrastructure/auth/index.ts +27 -0
  252. package/src/infrastructure/css/cache/css-cache-service.ts +130 -0
  253. package/src/infrastructure/css/compiler.ts +210 -0
  254. package/src/infrastructure/css/css-compiler-live.ts +20 -0
  255. package/src/infrastructure/css/index.ts +25 -0
  256. package/src/infrastructure/css/styles/animation-styles-generator.ts +177 -0
  257. package/src/infrastructure/css/styles/click-animations.ts +147 -0
  258. package/src/infrastructure/css/styles/component-layer-generators.ts +147 -0
  259. package/src/infrastructure/css/theme/theme-generators.ts +130 -0
  260. package/src/infrastructure/css/theme/theme-layer-generators.ts +219 -0
  261. package/src/infrastructure/css/theme/theme-token-resolver.ts +76 -0
  262. package/src/infrastructure/database/activity-queries.ts +111 -0
  263. package/src/infrastructure/database/auth/auth-validation.ts +101 -0
  264. package/src/infrastructure/database/drizzle/db-bun.ts +17 -0
  265. package/src/infrastructure/database/drizzle/db.ts +17 -0
  266. package/src/infrastructure/database/drizzle/index.ts +16 -0
  267. package/src/infrastructure/database/drizzle/layer.ts +34 -0
  268. package/src/infrastructure/database/drizzle/migrate.ts +77 -0
  269. package/src/infrastructure/database/drizzle/schema/activity-log.ts +111 -0
  270. package/src/infrastructure/database/drizzle/schema/analytics-page-views.ts +116 -0
  271. package/src/infrastructure/database/drizzle/schema/migration-audit.ts +68 -0
  272. package/src/infrastructure/database/drizzle/schema/record-comments.ts +79 -0
  273. package/src/infrastructure/database/drizzle/schema.ts +12 -0
  274. package/src/infrastructure/database/field-utils.ts +87 -0
  275. package/src/infrastructure/database/filter-operators.ts +136 -0
  276. package/src/infrastructure/database/formula/formula-trigger-generators.ts +114 -0
  277. package/src/infrastructure/database/formula/formula-utils.ts +440 -0
  278. package/src/infrastructure/database/generators/index-generators.ts +152 -0
  279. package/src/infrastructure/database/generators/trigger-generators.ts +154 -0
  280. package/src/infrastructure/database/index.ts +35 -0
  281. package/src/infrastructure/database/lookup/lookup-expression-generators.ts +356 -0
  282. package/src/infrastructure/database/lookup/lookup-expressions.ts +116 -0
  283. package/src/infrastructure/database/lookup/lookup-view-generators.ts +403 -0
  284. package/src/infrastructure/database/lookup/lookup-view-helpers.ts +65 -0
  285. package/src/infrastructure/database/lookup/lookup-view-triggers.ts +121 -0
  286. package/src/infrastructure/database/migration-audit-trail.ts +375 -0
  287. package/src/infrastructure/database/repositories/activity-log-repository-live.ts +99 -0
  288. package/src/infrastructure/database/repositories/activity-repository-live.ts +21 -0
  289. package/src/infrastructure/database/repositories/analytics-repository-live.ts +316 -0
  290. package/src/infrastructure/database/repositories/auth-repository-live.ts +42 -0
  291. package/src/infrastructure/database/repositories/batch-repository-live.ts +29 -0
  292. package/src/infrastructure/database/repositories/comment-repository-live.ts +39 -0
  293. package/src/infrastructure/database/repositories/table-repository-live.ts +38 -0
  294. package/src/infrastructure/database/schema/schema-dependency-sorting.ts +142 -0
  295. package/src/infrastructure/database/schema/schema-initializer.ts +598 -0
  296. package/src/infrastructure/database/schema-migration/column-detection.ts +286 -0
  297. package/src/infrastructure/database/schema-migration/constants.ts +31 -0
  298. package/src/infrastructure/database/schema-migration/constraint-sync.ts +288 -0
  299. package/src/infrastructure/database/schema-migration/index-sync.ts +108 -0
  300. package/src/infrastructure/database/schema-migration/index.ts +66 -0
  301. package/src/infrastructure/database/schema-migration/migration-statements.ts +106 -0
  302. package/src/infrastructure/database/schema-migration/rename-detection.ts +87 -0
  303. package/src/infrastructure/database/schema-migration/table-operations.ts +65 -0
  304. package/src/infrastructure/database/schema-migration/type-utils.ts +98 -0
  305. package/src/infrastructure/database/schema-migration/types.ts +14 -0
  306. package/src/infrastructure/database/schema-migration-helpers.ts +53 -0
  307. package/src/infrastructure/database/session-context.ts +20 -0
  308. package/src/infrastructure/database/sql/sql-check-constraints.ts +252 -0
  309. package/src/infrastructure/database/sql/sql-column-generators.ts +174 -0
  310. package/src/infrastructure/database/sql/sql-execution.ts +245 -0
  311. package/src/infrastructure/database/sql/sql-field-predicates.ts +81 -0
  312. package/src/infrastructure/database/sql/sql-generators.ts +91 -0
  313. package/src/infrastructure/database/sql/sql-junction-tables.ts +79 -0
  314. package/src/infrastructure/database/sql/sql-key-constraints.ts +210 -0
  315. package/src/infrastructure/database/sql/sql-type-mappings.ts +106 -0
  316. package/src/infrastructure/database/sql/sql-utils.ts +53 -0
  317. package/src/infrastructure/database/table-live-layers.ts +30 -0
  318. package/src/infrastructure/database/table-operations/column-generators.ts +82 -0
  319. package/src/infrastructure/database/table-operations/create-table-sql.ts +81 -0
  320. package/src/infrastructure/database/table-operations/index.ts +55 -0
  321. package/src/infrastructure/database/table-operations/migration-utils.ts +157 -0
  322. package/src/infrastructure/database/table-operations/table-effects.ts +234 -0
  323. package/src/infrastructure/database/table-operations/table-features.ts +96 -0
  324. package/src/infrastructure/database/table-operations/type-compatibility.ts +58 -0
  325. package/src/infrastructure/database/table-operations.ts +47 -0
  326. package/src/infrastructure/database/table-queries/batch/batch-create.ts +80 -0
  327. package/src/infrastructure/database/table-queries/batch/batch-delete.ts +212 -0
  328. package/src/infrastructure/database/table-queries/batch/batch-helpers.ts +124 -0
  329. package/src/infrastructure/database/table-queries/batch/batch-restore.ts +161 -0
  330. package/src/infrastructure/database/table-queries/batch/batch-update.ts +146 -0
  331. package/src/infrastructure/database/table-queries/batch/batch-upsert.ts +357 -0
  332. package/src/infrastructure/database/table-queries/batch/batch.ts +14 -0
  333. package/src/infrastructure/database/table-queries/crud/crud-read.ts +351 -0
  334. package/src/infrastructure/database/table-queries/crud/crud-write.ts +399 -0
  335. package/src/infrastructure/database/table-queries/crud/crud.ts +16 -0
  336. package/src/infrastructure/database/table-queries/index.ts +11 -0
  337. package/src/infrastructure/database/table-queries/mutation-helpers/authorship-helpers.ts +152 -0
  338. package/src/infrastructure/database/table-queries/mutation-helpers/create-record-helpers.ts +90 -0
  339. package/src/infrastructure/database/table-queries/mutation-helpers/delete-helpers.ts +163 -0
  340. package/src/infrastructure/database/table-queries/mutation-helpers/record-fetch-helpers.ts +79 -0
  341. package/src/infrastructure/database/table-queries/mutation-helpers/update-helpers.ts +74 -0
  342. package/src/infrastructure/database/table-queries/query-helpers/activity-log-helpers.ts +53 -0
  343. package/src/infrastructure/database/table-queries/query-helpers/activity-queries.ts +106 -0
  344. package/src/infrastructure/database/table-queries/query-helpers/aggregation-helpers.ts +314 -0
  345. package/src/infrastructure/database/table-queries/query-helpers/comment-queries.ts +414 -0
  346. package/src/infrastructure/database/table-queries/query-helpers/record-validation-queries.ts +126 -0
  347. package/src/infrastructure/database/table-queries/query-helpers/trash-helpers.ts +58 -0
  348. package/src/infrastructure/database/table-queries/shared/error-handling.ts +47 -0
  349. package/src/infrastructure/database/table-queries/shared/typed-execute.ts +27 -0
  350. package/src/infrastructure/database/table-queries/shared/user-join-helpers.ts +38 -0
  351. package/src/infrastructure/database/table-queries/shared/validation.ts +39 -0
  352. package/src/infrastructure/database/views/view-generators.ts +258 -0
  353. package/src/infrastructure/devtools/devtools-layer.ts +43 -0
  354. package/src/infrastructure/devtools/index.ts +8 -0
  355. package/src/infrastructure/email/email-config.ts +103 -0
  356. package/src/infrastructure/email/email-service.ts +152 -0
  357. package/src/infrastructure/email/index.ts +107 -0
  358. package/src/infrastructure/email/nodemailer.ts +125 -0
  359. package/src/infrastructure/email/templates.ts +244 -0
  360. package/src/infrastructure/errors/auth-config-required-error.ts +21 -0
  361. package/src/infrastructure/errors/auth-error.ts +16 -0
  362. package/src/infrastructure/errors/css-compilation-error.ts +14 -0
  363. package/src/infrastructure/errors/index.ts +26 -0
  364. package/src/infrastructure/errors/schema-initialization-error.ts +19 -0
  365. package/src/infrastructure/errors/server-creation-error.ts +14 -0
  366. package/src/infrastructure/filesystem/copy-directory.ts +136 -0
  367. package/src/infrastructure/layers/app-layer.ts +61 -0
  368. package/src/infrastructure/layers/page-renderer-layer.ts +41 -0
  369. package/src/infrastructure/logging/index.ts +8 -0
  370. package/src/infrastructure/logging/logger.ts +204 -0
  371. package/src/infrastructure/schema/file-loader.ts +53 -0
  372. package/src/infrastructure/schema/index.ts +15 -0
  373. package/src/infrastructure/schema/remote-loader.ts +48 -0
  374. package/src/infrastructure/server/index.ts +26 -0
  375. package/src/infrastructure/server/language-detection.ts +87 -0
  376. package/src/infrastructure/server/lifecycle.ts +67 -0
  377. package/src/infrastructure/server/route-setup/api-routes.ts +310 -0
  378. package/src/infrastructure/server/route-setup/auth-route-utils.ts +399 -0
  379. package/src/infrastructure/server/route-setup/auth-routes.ts +245 -0
  380. package/src/infrastructure/server/route-setup/openapi-routes.ts +45 -0
  381. package/src/infrastructure/server/route-setup/openapi-schema.ts +120 -0
  382. package/src/infrastructure/server/route-setup/page-routes.ts +219 -0
  383. package/src/infrastructure/server/route-setup/static-assets.ts +191 -0
  384. package/src/infrastructure/server/server-factory-live.ts +45 -0
  385. package/src/infrastructure/server/server.ts +275 -0
  386. package/src/infrastructure/server/ssg-adapter.ts +196 -0
  387. package/src/infrastructure/server/static-site-generator-live.ts +20 -0
  388. package/src/infrastructure/utils/accept-language-parser.ts +106 -0
  389. package/src/infrastructure/utils/glob-matcher.ts +50 -0
  390. package/src/presentation/api/client.ts +114 -0
  391. package/src/presentation/api/middleware/auth.ts +233 -0
  392. package/src/presentation/api/middleware/table.ts +155 -0
  393. package/src/presentation/api/middleware/validation.ts +88 -0
  394. package/src/presentation/api/routes/activity/get-activity-by-id-handler.ts +77 -0
  395. package/src/presentation/api/routes/activity/index.ts +28 -0
  396. package/src/presentation/api/routes/activity.ts +339 -0
  397. package/src/presentation/api/routes/analytics.ts +328 -0
  398. package/src/presentation/api/routes/auth.ts +169 -0
  399. package/src/presentation/api/routes/index.ts +11 -0
  400. package/src/presentation/api/routes/tables/activity-handlers.ts +57 -0
  401. package/src/presentation/api/routes/tables/batch-permission-helpers.ts +163 -0
  402. package/src/presentation/api/routes/tables/batch-routes.ts +355 -0
  403. package/src/presentation/api/routes/tables/comment-handlers.ts +377 -0
  404. package/src/presentation/api/routes/tables/create-record-helpers.ts +179 -0
  405. package/src/presentation/api/routes/tables/effect-runner.ts +58 -0
  406. package/src/presentation/api/routes/tables/error-handlers.ts +53 -0
  407. package/src/presentation/api/routes/tables/field-permission-validation.ts +167 -0
  408. package/src/presentation/api/routes/tables/filter-parser.ts +75 -0
  409. package/src/presentation/api/routes/tables/formula-parser.ts +118 -0
  410. package/src/presentation/api/routes/tables/index.ts +113 -0
  411. package/src/presentation/api/routes/tables/list-records-filter.ts +54 -0
  412. package/src/presentation/api/routes/tables/param-parsers.ts +59 -0
  413. package/src/presentation/api/routes/tables/record-handlers.ts +484 -0
  414. package/src/presentation/api/routes/tables/record-routes.ts +53 -0
  415. package/src/presentation/api/routes/tables/record-update-handler.ts +200 -0
  416. package/src/presentation/api/routes/tables/sort-validation.ts +85 -0
  417. package/src/presentation/api/routes/tables/table-routes.ts +76 -0
  418. package/src/presentation/api/routes/tables/timezone-validation.ts +41 -0
  419. package/src/presentation/api/routes/tables/upsert-helpers.ts +471 -0
  420. package/src/presentation/api/routes/tables/utils.ts +159 -0
  421. package/src/presentation/api/routes/tables/view-routes.ts +51 -0
  422. package/src/presentation/api/routes/tables.ts +9 -0
  423. package/src/presentation/api/utils/context-helpers.ts +43 -0
  424. package/src/presentation/api/utils/error-sanitizer.ts +235 -0
  425. package/src/presentation/api/utils/field-permission-validator.ts +53 -0
  426. package/src/presentation/api/utils/filter-field-validator.ts +90 -0
  427. package/src/presentation/api/utils/index.ts +13 -0
  428. package/src/presentation/api/utils/run-effect.ts +94 -0
  429. package/src/presentation/api/utils/validate-request.ts +89 -0
  430. package/src/presentation/api/validation/index.ts +29 -0
  431. package/src/presentation/api/validation/rules/field-rules.ts +158 -0
  432. package/src/presentation/api/validation/rules/record-rules.ts +73 -0
  433. package/src/presentation/cli/index.ts +19 -0
  434. package/src/presentation/cli/schema-loader.ts +172 -0
  435. package/src/presentation/hooks/use-breakpoint.ts +155 -0
  436. package/src/presentation/rendering/render-error-pages.tsx +60 -0
  437. package/src/presentation/rendering/render-homepage.tsx +137 -0
  438. package/src/presentation/scripts/script-renderers.ts +112 -0
  439. package/src/presentation/styling/animation-composer.ts +117 -0
  440. package/src/presentation/styling/index.ts +13 -0
  441. package/src/presentation/styling/parse-style.ts +243 -0
  442. package/src/presentation/styling/style-utils.ts +50 -0
  443. package/src/presentation/styling/theme-colors.ts +53 -0
  444. package/src/presentation/translations/component-utils.ts +54 -0
  445. package/src/presentation/translations/index.ts +16 -0
  446. package/src/presentation/translations/translation-resolver.ts +22 -0
  447. package/src/presentation/ui/languages/language-switcher.tsx +119 -0
  448. package/src/presentation/ui/metadata/analytics-builders.tsx +174 -0
  449. package/src/presentation/ui/metadata/analytics-head.tsx +39 -0
  450. package/src/presentation/ui/metadata/custom-elements-builders.tsx +157 -0
  451. package/src/presentation/ui/metadata/extract-component-meta.ts +108 -0
  452. package/src/presentation/ui/metadata/head-elements.tsx +164 -0
  453. package/src/presentation/ui/metadata/index.tsx +35 -0
  454. package/src/presentation/ui/metadata/meta-utils.tsx +42 -0
  455. package/src/presentation/ui/metadata/open-graph-meta.tsx +57 -0
  456. package/src/presentation/ui/metadata/structured-data-from-component.tsx +134 -0
  457. package/src/presentation/ui/metadata/structured-data.tsx +88 -0
  458. package/src/presentation/ui/metadata/twitter-card-meta.tsx +80 -0
  459. package/src/presentation/ui/pages/DefaultHomePage.tsx +43 -0
  460. package/src/presentation/ui/pages/DefaultPageConfigs.ts +220 -0
  461. package/src/presentation/ui/pages/DynamicPage.tsx +307 -0
  462. package/src/presentation/ui/pages/ErrorPage.tsx +25 -0
  463. package/src/presentation/ui/pages/NotFoundPage.tsx +25 -0
  464. package/src/presentation/ui/pages/PageBodyScripts.tsx +242 -0
  465. package/src/presentation/ui/pages/PageBodyStyles.ts +52 -0
  466. package/src/presentation/ui/pages/PageHead.tsx +380 -0
  467. package/src/presentation/ui/pages/PageLangResolver.ts +58 -0
  468. package/src/presentation/ui/pages/PageMain.tsx +58 -0
  469. package/src/presentation/ui/pages/PageMetadata.ts +168 -0
  470. package/src/presentation/ui/pages/PageMetadataI18n.ts +169 -0
  471. package/src/presentation/ui/pages/PageScripts.ts +78 -0
  472. package/src/presentation/ui/pages/SectionRenderer.tsx +67 -0
  473. package/src/presentation/ui/pages/SectionSpacing.tsx +131 -0
  474. package/src/presentation/ui/sections/component-renderer.tsx +426 -0
  475. package/src/presentation/ui/sections/component-renderer.types.ts +33 -0
  476. package/src/presentation/ui/sections/components/component-reference-handler.tsx +74 -0
  477. package/src/presentation/ui/sections/components/component-resolution.ts +65 -0
  478. package/src/presentation/ui/sections/components/index.ts +9 -0
  479. package/src/presentation/ui/sections/hero.tsx +394 -0
  480. package/src/presentation/ui/sections/props/component-builder.ts +183 -0
  481. package/src/presentation/ui/sections/props/element-props.ts +179 -0
  482. package/src/presentation/ui/sections/props/index.ts +9 -0
  483. package/src/presentation/ui/sections/props/prop-conversion.ts +171 -0
  484. package/src/presentation/ui/sections/props/props-builder-config.ts +42 -0
  485. package/src/presentation/ui/sections/props/props-builder.ts +296 -0
  486. package/src/presentation/ui/sections/renderers/element-renderers/html-element-renderer.tsx +124 -0
  487. package/src/presentation/ui/sections/renderers/element-renderers/index.ts +59 -0
  488. package/src/presentation/ui/sections/renderers/element-renderers/interactive-renderers.tsx +231 -0
  489. package/src/presentation/ui/sections/renderers/element-renderers/media-renderers.tsx +102 -0
  490. package/src/presentation/ui/sections/renderers/element-renderers/text-content-renderers.tsx +42 -0
  491. package/src/presentation/ui/sections/renderers/element-renderers.ts +53 -0
  492. package/src/presentation/ui/sections/renderers/html-element-helpers.ts +100 -0
  493. package/src/presentation/ui/sections/renderers/specialized-renderers.tsx +212 -0
  494. package/src/presentation/ui/sections/rendering/component-dispatch-config.ts +31 -0
  495. package/src/presentation/ui/sections/rendering/component-registry/index.ts +39 -0
  496. package/src/presentation/ui/sections/rendering/component-registry/interactive-components.ts +54 -0
  497. package/src/presentation/ui/sections/rendering/component-registry/media-components.ts +36 -0
  498. package/src/presentation/ui/sections/rendering/component-registry/special-components.tsx +153 -0
  499. package/src/presentation/ui/sections/rendering/component-registry/structural-components.ts +215 -0
  500. package/src/presentation/ui/sections/rendering/component-registry/text-components.ts +57 -0
  501. package/src/presentation/ui/sections/rendering/component-registry-helpers.tsx +29 -0
  502. package/src/presentation/ui/sections/rendering/component-registry.tsx +21 -0
  503. package/src/presentation/ui/sections/rendering/component-type-dispatcher.tsx +33 -0
  504. package/src/presentation/ui/sections/rendering/index.ts +9 -0
  505. package/src/presentation/ui/sections/responsive/responsive-children-builder.tsx +96 -0
  506. package/src/presentation/ui/sections/responsive/responsive-content-builder.tsx +95 -0
  507. package/src/presentation/ui/sections/responsive/responsive-props-merger.ts +195 -0
  508. package/src/presentation/ui/sections/responsive/responsive-resolver.ts +213 -0
  509. package/src/presentation/ui/sections/styling/animation-composer-wrapper.ts +65 -0
  510. package/src/presentation/ui/sections/styling/class-builders.ts +45 -0
  511. package/src/presentation/ui/sections/styling/color-resolver.ts +43 -0
  512. package/src/presentation/ui/sections/styling/hover-interaction-handler.ts +107 -0
  513. package/src/presentation/ui/sections/styling/index.ts +9 -0
  514. package/src/presentation/ui/sections/styling/interaction-props-builder.ts +55 -0
  515. package/src/presentation/ui/sections/styling/shadow-resolver.ts +83 -0
  516. package/src/presentation/ui/sections/styling/spacing-resolver.ts +104 -0
  517. package/src/presentation/ui/sections/styling/style-processor.ts +170 -0
  518. package/src/presentation/ui/sections/styling/theme-tokens.ts +184 -0
  519. package/src/presentation/ui/sections/translations/i18n-content-resolver.ts +198 -0
  520. package/src/presentation/ui/sections/translations/index.ts +9 -0
  521. package/src/presentation/ui/sections/translations/translation-handler.ts +143 -0
  522. package/src/presentation/ui/sections/translations/variable-substitution.ts +225 -0
  523. package/src/presentation/ui/sections/utils/time-parser.ts +82 -0
  524. package/src/presentation/utils/link-attributes.ts +50 -0
  525. package/src/presentation/utils/string-utils.ts +58 -0
  526. package/src/presentation/utils/styles.ts +50 -0
  527. 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>