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,444 @@
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 { z } from 'zod'
9
+ import { paginationSchema, timestampSchema } from './common'
10
+
11
+ // ============================================================================
12
+ // Field Schemas
13
+ // ============================================================================
14
+
15
+ /**
16
+ * Base field schema
17
+ *
18
+ * Common properties for all field types.
19
+ */
20
+ export const baseFieldSchema = z.object({
21
+ id: z.string().describe('Field identifier'),
22
+ name: z.string().describe('Field name'),
23
+ type: z.string().describe('Field type'),
24
+ required: z.boolean().optional().describe('Whether field is required'),
25
+ unique: z.boolean().optional().describe('Whether field must be unique'),
26
+ indexed: z.boolean().optional().describe('Whether field is indexed'),
27
+ description: z.string().optional().describe('Field description'),
28
+ })
29
+
30
+ /**
31
+ * Field value schema (for record data)
32
+ *
33
+ * Represents a value in a record field.
34
+ */
35
+ export const fieldValueSchema = z.union([
36
+ z.string(),
37
+ z.number(),
38
+ z.boolean(),
39
+ z.null(),
40
+ z.array(z.unknown()),
41
+ z.record(z.string(), z.unknown()),
42
+ ])
43
+
44
+ /**
45
+ * Formatted field value schema (for display formatting)
46
+ *
47
+ * When format=display is requested, fields may include both value and displayValue.
48
+ */
49
+ export const formattedFieldValueSchema = z.union([
50
+ fieldValueSchema,
51
+ z.object({
52
+ value: fieldValueSchema,
53
+ displayValue: z.string().optional(),
54
+ }),
55
+ ])
56
+
57
+ // ============================================================================
58
+ // Table Schemas
59
+ // ============================================================================
60
+
61
+ /**
62
+ * Table schema
63
+ *
64
+ * Represents a table definition in API responses.
65
+ */
66
+ export const tableSchema = z
67
+ .object({
68
+ id: z.string().describe('Table identifier'),
69
+ name: z.string().describe('Table name'),
70
+ description: z.string().optional().describe('Table description'),
71
+ fields: z.array(baseFieldSchema).describe('Table fields'),
72
+ primaryKey: z.string().optional().describe('Primary key field'),
73
+ views: z.array(z.unknown()).describe('Table views'),
74
+ permissions: z
75
+ .object({
76
+ read: z
77
+ .union([z.array(z.string()).readonly(), z.literal('all'), z.literal('authenticated')])
78
+ .optional(),
79
+ create: z
80
+ .union([z.array(z.string()).readonly(), z.literal('all'), z.literal('authenticated')])
81
+ .optional(),
82
+ update: z
83
+ .union([z.array(z.string()).readonly(), z.literal('all'), z.literal('authenticated')])
84
+ .optional(),
85
+ delete: z
86
+ .union([z.array(z.string()).readonly(), z.literal('all'), z.literal('authenticated')])
87
+ .optional(),
88
+ })
89
+ .optional()
90
+ .describe('Table permissions'),
91
+ })
92
+ .extend(timestampSchema.shape)
93
+
94
+ /**
95
+ * Table summary schema (for list endpoints)
96
+ */
97
+ export const tableSummarySchema = z
98
+ .object({
99
+ id: z.string().describe('Table identifier'),
100
+ name: z.string().describe('Table name'),
101
+ description: z.string().optional().describe('Table description'),
102
+ fieldCount: z.number().describe('Number of fields'),
103
+ recordCount: z.number().optional().describe('Number of records'),
104
+ })
105
+ .extend(timestampSchema.shape)
106
+
107
+ // ============================================================================
108
+ // Record Schemas
109
+ // ============================================================================
110
+
111
+ /**
112
+ * Record schema (Airtable-style)
113
+ *
114
+ * Represents a record in a table.
115
+ * User-defined fields are nested under the `fields` property.
116
+ * System fields (id, createdAt, updatedAt) remain at root level.
117
+ */
118
+ /**
119
+ * User reference schema for authorship fields
120
+ */
121
+ export const userRefSchema = z.object({
122
+ id: z.string().describe('User identifier'),
123
+ name: z.string().optional().describe('User display name'),
124
+ email: z.string().optional().describe('User email address'),
125
+ })
126
+
127
+ export const recordSchema = z
128
+ .object({
129
+ id: z.union([z.string(), z.number()]).describe('Record identifier'),
130
+ fields: z
131
+ .record(z.string(), formattedFieldValueSchema)
132
+ .describe('User-defined field values (may include display formatting)'),
133
+ createdBy: z.string().optional().describe('User who created the record'),
134
+ updatedBy: z.string().optional().describe('User who last updated the record'),
135
+ deletedBy: userRefSchema.optional().describe('User who deleted the record'),
136
+ })
137
+ .extend(timestampSchema.shape)
138
+
139
+ // ============================================================================
140
+ // Table API Response Schemas
141
+ // ============================================================================
142
+
143
+ /**
144
+ * List tables response schema
145
+ */
146
+ export const listTablesResponseSchema = z.object({
147
+ tables: z.array(tableSummarySchema).describe('List of tables'),
148
+ pagination: paginationSchema.optional().describe('Pagination metadata'),
149
+ })
150
+
151
+ /**
152
+ * Get table response schema
153
+ */
154
+ export const getTableResponseSchema = z.object({
155
+ table: tableSchema.describe('Table details'),
156
+ })
157
+
158
+ /**
159
+ * Create table response schema
160
+ */
161
+ export const createTableResponseSchema = z.object({
162
+ table: tableSchema.describe('Created table'),
163
+ })
164
+
165
+ /**
166
+ * Update table response schema
167
+ */
168
+ export const updateTableResponseSchema = z.object({
169
+ table: tableSchema.describe('Updated table'),
170
+ })
171
+
172
+ /**
173
+ * Delete table response schema
174
+ */
175
+ export const deleteTableResponseSchema = z.object({
176
+ success: z.literal(true).describe('Table deleted'),
177
+ })
178
+
179
+ // ============================================================================
180
+ // Record API Response Schemas
181
+ // ============================================================================
182
+
183
+ /**
184
+ * List records response schema
185
+ */
186
+ export const listRecordsResponseSchema = z.object({
187
+ records: z.array(recordSchema).describe('List of records'),
188
+ pagination: paginationSchema.optional().describe('Pagination metadata'),
189
+ aggregations: z
190
+ .object({
191
+ count: z.string().optional().describe('Total count of records'),
192
+ sum: z.record(z.string(), z.number()).optional().describe('Sum aggregations by field'),
193
+ avg: z.record(z.string(), z.number()).optional().describe('Average aggregations by field'),
194
+ min: z.record(z.string(), z.number()).optional().describe('Minimum aggregations by field'),
195
+ max: z.record(z.string(), z.number()).optional().describe('Maximum aggregations by field'),
196
+ })
197
+ .optional()
198
+ .describe('Aggregation results'),
199
+ })
200
+
201
+ /**
202
+ * Get record response schema
203
+ *
204
+ * Returns record in flattened format (id, fields, timestamps, authorship at root level)
205
+ * to match test expectations and provide consistent API response structure.
206
+ */
207
+ export const getRecordResponseSchema = z
208
+ .object({
209
+ id: z.union([z.string(), z.number()]).describe('Record identifier'),
210
+ fields: z
211
+ .record(z.string(), formattedFieldValueSchema)
212
+ .describe('User-defined field values (may include display formatting)'),
213
+ createdBy: z.string().optional().describe('User who created the record'),
214
+ updatedBy: z.string().optional().describe('User who last updated the record'),
215
+ deletedBy: userRefSchema.optional().describe('User who deleted the record'),
216
+ })
217
+ .extend(timestampSchema.shape)
218
+
219
+ /**
220
+ * Create record response schema
221
+ *
222
+ * Returns record in flattened format (id, fields, timestamps at root level)
223
+ * to match test expectations and provide consistent API response structure.
224
+ */
225
+ export const createRecordResponseSchema = z
226
+ .object({
227
+ id: z.string().describe('Record identifier'),
228
+ fields: z.record(z.string(), fieldValueSchema).describe('User-defined field values'),
229
+ createdBy: z.string().optional().describe('User who created the record'),
230
+ updatedBy: z.string().optional().describe('User who last updated the record'),
231
+ })
232
+ .extend(timestampSchema.shape)
233
+
234
+ /**
235
+ * Update record response schema
236
+ */
237
+ export const updateRecordResponseSchema = z.object({
238
+ record: recordSchema.describe('Updated record'),
239
+ })
240
+
241
+ /**
242
+ * Delete record response schema
243
+ */
244
+ export const deleteRecordResponseSchema = z.object({
245
+ success: z.literal(true).describe('Record deleted'),
246
+ })
247
+
248
+ /**
249
+ * Restore record response schema
250
+ */
251
+ export const restoreRecordResponseSchema = z.object({
252
+ success: z.literal(true).describe('Record restored'),
253
+ record: recordSchema.describe('Restored record'),
254
+ })
255
+
256
+ // ============================================================================
257
+ // Batch Operation Schemas
258
+ // ============================================================================
259
+
260
+ /**
261
+ * Batch create records response schema
262
+ */
263
+ export const batchCreateRecordsResponseSchema = z.object({
264
+ created: z.number().describe('Number of records created'),
265
+ records: z
266
+ .array(recordSchema)
267
+ .optional()
268
+ .describe('Created records (only if returnRecords=true)'),
269
+ })
270
+
271
+ /**
272
+ * Batch update records response schema
273
+ */
274
+ export const batchUpdateRecordsResponseSchema = z.object({
275
+ updated: z.number().describe('Number of records updated'),
276
+ records: z
277
+ .array(recordSchema)
278
+ .optional()
279
+ .describe('Updated records (only if returnRecords=true)'),
280
+ })
281
+
282
+ /**
283
+ * Batch delete records response schema
284
+ */
285
+ export const batchDeleteRecordsResponseSchema = z.object({
286
+ deleted: z.number().describe('Number of records deleted'),
287
+ })
288
+
289
+ /**
290
+ * Batch restore records response schema
291
+ */
292
+ export const batchRestoreRecordsResponseSchema = z.object({
293
+ success: z.literal(true).describe('Batch restore succeeded'),
294
+ restored: z.number().describe('Number of records restored'),
295
+ })
296
+
297
+ /**
298
+ * Upsert records response schema
299
+ */
300
+ export const upsertRecordsResponseSchema = z.object({
301
+ records: z.array(recordSchema).describe('Upserted records'),
302
+ created: z.number().describe('Number of records created'),
303
+ updated: z.number().describe('Number of records updated'),
304
+ })
305
+
306
+ // ============================================================================
307
+ // View Schemas
308
+ // ============================================================================
309
+
310
+ /**
311
+ * View schema
312
+ */
313
+ export const viewSchema = z
314
+ .object({
315
+ id: z.string().describe('View identifier'),
316
+ name: z.string().describe('View name'),
317
+ tableId: z.string().describe('Parent table ID'),
318
+ fields: z.array(z.string()).optional().describe('Visible field IDs'),
319
+ filters: z.array(z.unknown()).optional().describe('View filters'),
320
+ sorts: z.array(z.unknown()).optional().describe('View sorts'),
321
+ groupBy: z.string().optional().describe('Group by field'),
322
+ })
323
+ .extend(timestampSchema.shape)
324
+
325
+ /**
326
+ * List views response schema
327
+ */
328
+ export const listViewsResponseSchema = z.object({
329
+ views: z.array(viewSchema).describe('List of views'),
330
+ })
331
+
332
+ /**
333
+ * Get view response schema
334
+ * Returns view properties directly at root level
335
+ */
336
+ export const getViewResponseSchema = z.object({
337
+ id: z.string().describe('View identifier'),
338
+ name: z.string().describe('View name'),
339
+ filters: z
340
+ .object({
341
+ and: z
342
+ .array(
343
+ z.object({
344
+ field: z.string(),
345
+ operator: z.string(),
346
+ value: z.unknown(),
347
+ })
348
+ )
349
+ .optional(),
350
+ or: z
351
+ .array(
352
+ z.object({
353
+ field: z.string(),
354
+ operator: z.string(),
355
+ value: z.unknown(),
356
+ })
357
+ )
358
+ .optional(),
359
+ })
360
+ .optional()
361
+ .describe('View filters'),
362
+ sorts: z
363
+ .array(
364
+ z.object({
365
+ field: z.string(),
366
+ direction: z.enum(['asc', 'desc']),
367
+ })
368
+ )
369
+ .optional()
370
+ .describe('View sorts'),
371
+ fields: z.array(z.string()).optional().describe('Visible field names'),
372
+ groupBy: z
373
+ .object({
374
+ field: z.string(),
375
+ direction: z.enum(['asc', 'desc']).optional(),
376
+ })
377
+ .optional()
378
+ .describe('Group by configuration'),
379
+ isDefault: z.boolean().optional().describe('Whether this is the default view'),
380
+ })
381
+
382
+ /**
383
+ * Get view records response schema
384
+ */
385
+ export const getViewRecordsResponseSchema = z.object({
386
+ records: z.array(recordSchema).describe('Records matching view'),
387
+ pagination: paginationSchema.optional().describe('Pagination metadata'),
388
+ })
389
+
390
+ // ============================================================================
391
+ // Permission Schemas
392
+ // ============================================================================
393
+
394
+ /**
395
+ * Table permission schema
396
+ */
397
+ export const tablePermissionSchema = z.object({
398
+ read: z.boolean().describe('Can read records'),
399
+ create: z.boolean().describe('Can create records'),
400
+ update: z.boolean().describe('Can update records'),
401
+ delete: z.boolean().describe('Can delete records'),
402
+ manage: z.boolean().describe('Can manage table schema'),
403
+ })
404
+
405
+ /**
406
+ * Field permission schema
407
+ */
408
+ export const fieldPermissionSchema = z.object({
409
+ read: z.boolean().describe('Can read field'),
410
+ write: z.boolean().describe('Can write field'),
411
+ })
412
+
413
+ /**
414
+ * Get table permissions response schema
415
+ */
416
+ export const getTablePermissionsResponseSchema = z.object({
417
+ table: z
418
+ .object({
419
+ read: z.boolean().describe('Can read records'),
420
+ create: z.boolean().describe('Can create records'),
421
+ update: z.boolean().describe('Can update records'),
422
+ delete: z.boolean().describe('Can delete records'),
423
+ })
424
+ .describe('Table-level permissions'),
425
+ fields: z.record(z.string(), fieldPermissionSchema).describe('Field-level permissions'),
426
+ })
427
+
428
+ // ============================================================================
429
+ // TypeScript Types
430
+ // ============================================================================
431
+
432
+ export type BaseField = z.infer<typeof baseFieldSchema>
433
+ export type FieldValue = z.infer<typeof fieldValueSchema>
434
+ export type Table = z.infer<typeof tableSchema>
435
+ export type TableSummary = z.infer<typeof tableSummarySchema>
436
+ export type Record = z.infer<typeof recordSchema>
437
+ export type View = z.infer<typeof viewSchema>
438
+ export type TablePermission = z.infer<typeof tablePermissionSchema>
439
+ export type ListTablesResponse = z.infer<typeof listTablesResponseSchema>
440
+ export type GetTableResponse = z.infer<typeof getTableResponseSchema>
441
+ export type ListRecordsResponse = z.infer<typeof listRecordsResponseSchema>
442
+ export type GetRecordResponse = z.infer<typeof getRecordResponseSchema>
443
+ export type RestoreRecordResponse = z.infer<typeof restoreRecordResponseSchema>
444
+ export type BatchRestoreRecordsResponse = z.infer<typeof batchRestoreRecordsResponseSchema>
@@ -0,0 +1,129 @@
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
+ * Built-in Analytics Configuration Schema
12
+ *
13
+ * Configures the first-party, privacy-friendly analytics engine.
14
+ * When this property exists in the app config, analytics is enabled.
15
+ * When omitted, no analytics endpoints are available.
16
+ *
17
+ * Configuration forms:
18
+ * - `true` — Enable analytics with all defaults
19
+ * - `false` — Explicitly disable analytics
20
+ * - `{ ... }` — Enable analytics with custom options
21
+ *
22
+ * Design principles:
23
+ * - No cookies (visitor hashing via SHA-256)
24
+ * - No external dependencies
25
+ * - GDPR-friendly by default (respectDoNotTrack: true)
26
+ * - Configurable data retention
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * // Enable with all defaults
31
+ * true
32
+ *
33
+ * // Explicitly disabled
34
+ * false
35
+ *
36
+ * // Custom retention and excluded paths
37
+ * {
38
+ * retentionDays: 90,
39
+ * excludedPaths: ['/admin/*', '/api/*'],
40
+ * sessionTimeout: 15
41
+ * }
42
+ * ```
43
+ */
44
+ export const BuiltInAnalyticsSchema = Schema.Union(
45
+ Schema.Boolean,
46
+ Schema.Struct({
47
+ /**
48
+ * Number of days to retain analytics data (optional).
49
+ *
50
+ * Must be between 1 and 730 days (2 years).
51
+ * Defaults to 365 days. Data older than this is automatically purged.
52
+ */
53
+ retentionDays: Schema.optional(
54
+ Schema.Number.pipe(
55
+ Schema.int(),
56
+ Schema.between(1, 730),
57
+ Schema.annotations({
58
+ title: 'Retention Days',
59
+ description: 'Number of days to retain analytics data (1-730)',
60
+ })
61
+ )
62
+ ),
63
+
64
+ /**
65
+ * URL path patterns to exclude from tracking (optional).
66
+ *
67
+ * Glob patterns matching page paths that should not be tracked.
68
+ * Useful for excluding admin pages, API docs, or internal routes.
69
+ */
70
+ excludedPaths: Schema.optional(
71
+ Schema.Array(Schema.String).pipe(
72
+ Schema.annotations({
73
+ title: 'Excluded Paths',
74
+ description: 'Glob patterns for paths excluded from tracking',
75
+ })
76
+ )
77
+ ),
78
+
79
+ /**
80
+ * Whether to honor the Do Not Track browser setting (optional).
81
+ *
82
+ * When true, visitors with DNT:1 header will not be tracked.
83
+ * Defaults to true for privacy compliance.
84
+ */
85
+ respectDoNotTrack: Schema.optional(Schema.Boolean),
86
+
87
+ /**
88
+ * Session timeout in minutes (optional).
89
+ *
90
+ * Time of inactivity before a new session is created.
91
+ * Must be between 1 and 120 minutes. Defaults to 30 minutes.
92
+ */
93
+ sessionTimeout: Schema.optional(
94
+ Schema.Number.pipe(
95
+ Schema.int(),
96
+ Schema.between(1, 120),
97
+ Schema.annotations({
98
+ title: 'Session Timeout',
99
+ description: 'Session timeout in minutes (1-120)',
100
+ })
101
+ )
102
+ ),
103
+ })
104
+ ).pipe(
105
+ Schema.annotations({
106
+ title: 'Built-in Analytics Configuration',
107
+ description:
108
+ 'First-party, privacy-friendly analytics engine. No cookies, no external dependencies, GDPR-compliant.',
109
+ examples: [
110
+ true,
111
+ {
112
+ retentionDays: 90,
113
+ excludedPaths: ['/admin/*', '/api/*'],
114
+ sessionTimeout: 15,
115
+ },
116
+ false,
117
+ ],
118
+ })
119
+ )
120
+
121
+ /**
122
+ * TypeScript type inferred from BuiltInAnalyticsSchema
123
+ */
124
+ export type BuiltInAnalytics = Schema.Schema.Type<typeof BuiltInAnalyticsSchema>
125
+
126
+ /**
127
+ * Encoded type of BuiltInAnalyticsSchema (what goes in before validation)
128
+ */
129
+ export type BuiltInAnalyticsEncoded = Schema.Schema.Encoded<typeof BuiltInAnalyticsSchema>
@@ -0,0 +1,116 @@
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
+ * Auth Email Template Schema
12
+ *
13
+ * Configuration for a single authentication email template.
14
+ * Templates support variable substitution using $variable syntax.
15
+ *
16
+ * Available variables depend on the email type:
17
+ * - $url: Link URL (verification, password reset, magic link)
18
+ * - $name: User's name
19
+ * - $email: User's email address
20
+ * - $code: OTP code (for email-otp)
21
+ * - $organizationName: Organization name (for invitations)
22
+ * - $inviterName: Name of person who sent invitation
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * {
27
+ * subject: 'Reset your password',
28
+ * text: 'Click the link to reset your password: $url'
29
+ * }
30
+ * ```
31
+ */
32
+ export const AuthEmailTemplateSchema = Schema.Struct({
33
+ /** Email subject line (can include $variables) */
34
+ subject: Schema.String.pipe(
35
+ Schema.annotations({ description: 'Email subject line with optional $variable substitution' })
36
+ ),
37
+ /** Plain text email body (can include $variables) */
38
+ text: Schema.optional(
39
+ Schema.String.pipe(
40
+ Schema.annotations({
41
+ description: 'Plain text email body with optional $variable substitution',
42
+ })
43
+ )
44
+ ),
45
+ /** HTML email body (can include $variables) */
46
+ html: Schema.optional(
47
+ Schema.String.pipe(
48
+ Schema.annotations({ description: 'HTML email body with optional $variable substitution' })
49
+ )
50
+ ),
51
+ }).pipe(
52
+ Schema.annotations({
53
+ title: 'Auth Email Template',
54
+ description: 'Email template configuration with subject and body content',
55
+ examples: [
56
+ { subject: 'Verify your email', text: 'Click here to verify: $url' },
57
+ {
58
+ subject: 'Reset your password',
59
+ text: 'Click the link to reset your password: $url',
60
+ html: '<p>Click <a href="$url">here</a> to reset your password.</p>',
61
+ },
62
+ ],
63
+ })
64
+ )
65
+
66
+ export type AuthEmailTemplate = Schema.Schema.Type<typeof AuthEmailTemplateSchema>
67
+
68
+ /**
69
+ * Auth Email Templates Schema
70
+ *
71
+ * All available email templates for authentication flows.
72
+ * Each template is optional - Better Auth provides sensible defaults.
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * {
77
+ * verification: {
78
+ * subject: 'Verify your email for MyApp',
79
+ * text: 'Hi $name, click here to verify your email: $url'
80
+ * },
81
+ * resetPassword: {
82
+ * subject: 'Reset your password',
83
+ * text: 'Click the link to reset your password: $url'
84
+ * }
85
+ * }
86
+ * ```
87
+ */
88
+ export const AuthEmailTemplatesSchema = Schema.Struct({
89
+ /** Email verification after signup */
90
+ verification: Schema.optional(AuthEmailTemplateSchema),
91
+ /** Password reset email */
92
+ resetPassword: Schema.optional(AuthEmailTemplateSchema),
93
+ /** Magic link login email */
94
+ magicLink: Schema.optional(AuthEmailTemplateSchema),
95
+ /** Email OTP code email */
96
+ emailOtp: Schema.optional(AuthEmailTemplateSchema),
97
+ /** Two-factor authentication backup codes email */
98
+ twoFactorBackupCodes: Schema.optional(AuthEmailTemplateSchema),
99
+ /** Welcome email after verification */
100
+ welcome: Schema.optional(AuthEmailTemplateSchema),
101
+ /** Account deletion confirmation email */
102
+ accountDeletion: Schema.optional(AuthEmailTemplateSchema),
103
+ }).pipe(
104
+ Schema.annotations({
105
+ title: 'Auth Email Templates',
106
+ description: 'Templates for all authentication-related emails',
107
+ examples: [
108
+ {
109
+ verification: { subject: 'Verify your email', text: 'Click to verify: $url' },
110
+ resetPassword: { subject: 'Reset your password', text: 'Reset link: $url' },
111
+ },
112
+ ],
113
+ })
114
+ )
115
+
116
+ export type AuthEmailTemplates = Schema.Schema.Type<typeof AuthEmailTemplatesSchema>