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,230 @@
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 { AuthEmailTemplatesSchema } from './config'
10
+ import { TwoFactorConfigSchema } from './plugins/two-factor'
11
+ import { DefaultRoleSchema, RolesConfigSchema } from './roles'
12
+ import { AuthStrategiesSchema, type AuthStrategy } from './strategies'
13
+
14
+ // Re-export all auth-related schemas and types for convenient imports
15
+ export * from './config'
16
+ export * from './methods/email-and-password'
17
+ export * from './methods/magic-link'
18
+ export * from './oauth'
19
+ export * from './plugins/admin'
20
+ export * from './plugins/two-factor'
21
+ export * from './roles'
22
+ export * from './strategies'
23
+
24
+ /**
25
+ * Strategy type names
26
+ */
27
+ type StrategyType = 'emailAndPassword' | 'magicLink' | 'oauth'
28
+
29
+ /**
30
+ * Check if a specific strategy type is present in the strategies array
31
+ */
32
+ export const hasStrategy = (auth: Auth | undefined, strategyType: StrategyType): boolean => {
33
+ if (!auth?.strategies) return false
34
+ return auth.strategies.some((s) => s.type === strategyType)
35
+ }
36
+
37
+ /**
38
+ * Get a specific strategy configuration by type
39
+ */
40
+ export const getStrategy = <T extends StrategyType>(
41
+ auth: Auth | undefined,
42
+ strategyType: T
43
+ ): Extract<AuthStrategy, { readonly type: T }> | undefined => {
44
+ if (!auth?.strategies) return undefined
45
+ return auth.strategies.find((s) => s.type === strategyType) as
46
+ | Extract<AuthStrategy, { readonly type: T }>
47
+ | undefined
48
+ }
49
+
50
+ /**
51
+ * Get all strategy type names that are enabled
52
+ */
53
+ export const getEnabledStrategies = (auth: Auth | undefined): readonly StrategyType[] => {
54
+ if (!auth?.strategies) return []
55
+ return auth.strategies.map((s) => s.type)
56
+ }
57
+
58
+ // Legacy aliases for backward compatibility during migration
59
+ export const isMethodEnabled = (auth: Auth | undefined, method: StrategyType): boolean =>
60
+ hasStrategy(auth, method)
61
+
62
+ export const getEnabledMethods = (auth: Auth | undefined): readonly StrategyType[] =>
63
+ getEnabledStrategies(auth)
64
+
65
+ export const hasAnyMethodEnabled = (auth: Auth | undefined): boolean =>
66
+ (auth?.strategies?.length ?? 0) > 0
67
+
68
+ /**
69
+ * Authentication Configuration Schema
70
+ *
71
+ * Comprehensive authentication configuration supporting all Better Auth features.
72
+ * If this config exists, authentication is enabled.
73
+ * If omitted from the app config, no auth endpoints are available.
74
+ *
75
+ * Admin features (user management, role assignment, impersonation) are always
76
+ * enabled when auth is configured — no separate toggle needed.
77
+ *
78
+ * Infrastructure configuration (secrets, URLs, credentials) is handled via
79
+ * environment variables, not in this schema. See .env.example for details.
80
+ *
81
+ * Structure:
82
+ * - strategies: Array of authentication strategy objects (required, at least one)
83
+ * - roles: Custom role definitions with hierarchy (optional)
84
+ * - defaultRole: Role assigned to new users (optional, defaults to 'member')
85
+ * - twoFactor: TOTP-based two-factor authentication (optional)
86
+ * - emailTemplates: Custom email templates (optional)
87
+ *
88
+ * @example
89
+ * ```typescript
90
+ * // Minimal
91
+ * { strategies: [{ type: 'emailAndPassword' }] }
92
+ *
93
+ * // With custom roles and defaultRole
94
+ * {
95
+ * strategies: [{ type: 'emailAndPassword', minPasswordLength: 12 }],
96
+ * defaultRole: 'viewer',
97
+ * roles: [{ name: 'editor', description: 'Can edit content', level: 30 }]
98
+ * }
99
+ *
100
+ * // Multiple strategies
101
+ * {
102
+ * strategies: [
103
+ * { type: 'emailAndPassword' },
104
+ * { type: 'oauth', providers: ['google', 'github'] }
105
+ * ]
106
+ * }
107
+ * ```
108
+ */
109
+ export const AuthSchema = Schema.Struct({
110
+ // ============================================================================
111
+ // Authentication Strategies (required)
112
+ // ============================================================================
113
+
114
+ /**
115
+ * Array of authentication strategies.
116
+ * At least one strategy must be defined. No duplicate types allowed.
117
+ */
118
+ strategies: AuthStrategiesSchema,
119
+
120
+ // ============================================================================
121
+ // Role Configuration (optional)
122
+ // ============================================================================
123
+
124
+ /**
125
+ * Custom role definitions (optional)
126
+ *
127
+ * Define additional roles beyond the built-in ones (admin, member, viewer).
128
+ * Empty array means only built-in roles are available.
129
+ */
130
+ roles: Schema.optional(RolesConfigSchema),
131
+
132
+ /**
133
+ * Default role for new users (optional)
134
+ *
135
+ * Role assigned to users on registration. Defaults to 'member'.
136
+ * Must reference a built-in role or a custom role name.
137
+ */
138
+ defaultRole: Schema.optional(DefaultRoleSchema),
139
+
140
+ // ============================================================================
141
+ // Feature Extensions (optional)
142
+ // ============================================================================
143
+
144
+ /**
145
+ * Two-factor authentication plugin configuration (optional)
146
+ *
147
+ * Enable TOTP-based two-factor authentication. Users can set up 2FA
148
+ * using authenticator apps. Requires emailAndPassword strategy.
149
+ */
150
+ twoFactor: Schema.optional(TwoFactorConfigSchema),
151
+
152
+ /**
153
+ * Email templates for authentication flows (optional)
154
+ *
155
+ * Customize the subject and content of emails sent during authentication.
156
+ * Templates support variable substitution using $variable syntax.
157
+ */
158
+ emailTemplates: Schema.optional(AuthEmailTemplatesSchema),
159
+ }).pipe(
160
+ Schema.filter((config) => {
161
+ // Validate two-factor requires emailAndPassword strategy
162
+ if (config.twoFactor) {
163
+ const hasEmailPassword = config.strategies.some((s) => s.type === 'emailAndPassword')
164
+ if (!hasEmailPassword) {
165
+ return 'Two-factor authentication requires emailAndPassword strategy'
166
+ }
167
+ }
168
+
169
+ // Validate defaultRole references a defined role (if custom role name)
170
+ if (config.defaultRole && config.roles) {
171
+ const builtInRoles = ['admin', 'member', 'viewer']
172
+ const customRoleNames = config.roles.map((r) => r.name)
173
+ const allValidRoles = [...builtInRoles, ...customRoleNames]
174
+ if (!allValidRoles.includes(config.defaultRole)) {
175
+ return `Default role '${config.defaultRole}' is not a built-in role or defined in auth.roles`
176
+ }
177
+ }
178
+
179
+ return undefined
180
+ }),
181
+ Schema.annotations({
182
+ title: 'Authentication Configuration',
183
+ description:
184
+ 'Authentication configuration with strategies, roles, and plugins. Admin features are always enabled when auth is configured.',
185
+ examples: [
186
+ { strategies: [{ type: 'emailAndPassword' as const }] },
187
+ {
188
+ strategies: [{ type: 'emailAndPassword' as const, minPasswordLength: 12 }],
189
+ defaultRole: 'viewer',
190
+ roles: [{ name: 'editor', description: 'Can edit content', level: 30 }],
191
+ },
192
+ {
193
+ strategies: [
194
+ { type: 'emailAndPassword' as const },
195
+ { type: 'oauth' as const, providers: ['google', 'github'] },
196
+ ],
197
+ },
198
+ ],
199
+ })
200
+ )
201
+
202
+ /**
203
+ * TypeScript type inferred from AuthSchema
204
+ */
205
+ export type Auth = Schema.Schema.Type<typeof AuthSchema>
206
+
207
+ /**
208
+ * Encoded type of AuthSchema (what goes in before validation)
209
+ */
210
+ export type AuthEncoded = Schema.Schema.Encoded<typeof AuthSchema>
211
+
212
+ /**
213
+ * Helper to check if auth is configured with a specific strategy
214
+ */
215
+ export const hasAuthenticationMethod = (auth: Auth, strategyType: StrategyType): boolean =>
216
+ hasStrategy(auth, strategyType)
217
+
218
+ /**
219
+ * Plugin names that can be checked
220
+ */
221
+ type PluginName = 'twoFactor'
222
+
223
+ /**
224
+ * Helper to check if auth has a specific plugin enabled
225
+ */
226
+ export const hasPlugin = (auth: Auth, pluginName: PluginName): boolean => {
227
+ const plugin = auth[pluginName]
228
+ if (typeof plugin === 'boolean') return plugin
229
+ return plugin !== undefined
230
+ }
@@ -0,0 +1,67 @@
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
+ * Email and Password Authentication Method Configuration
12
+ *
13
+ * Traditional credential-based authentication using email and password.
14
+ * This is the most common authentication method.
15
+ *
16
+ * Can be:
17
+ * - A boolean (true to enable with defaults)
18
+ * - A configuration object for customization
19
+ *
20
+ * Configuration options:
21
+ * - requireEmailVerification: Require email verification before allowing sign-in
22
+ * - minPasswordLength: Minimum password length (default: 8, range: 6-128)
23
+ * - maxPasswordLength: Maximum password length (default: 128)
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * // Simple enable (as strategy)
28
+ * { type: 'emailAndPassword' }
29
+ *
30
+ * // With configuration
31
+ * {
32
+ * type: 'emailAndPassword',
33
+ * requireEmailVerification: true,
34
+ * minPasswordLength: 12
35
+ * }
36
+ * ```
37
+ */
38
+ export const EmailAndPasswordConfigSchema = Schema.Union(
39
+ Schema.Boolean,
40
+ Schema.Struct({
41
+ requireEmailVerification: Schema.optional(
42
+ Schema.Boolean.pipe(
43
+ Schema.annotations({ description: 'Require email verification before sign-in' })
44
+ )
45
+ ),
46
+ minPasswordLength: Schema.optional(
47
+ Schema.Number.pipe(
48
+ Schema.between(6, 128),
49
+ Schema.annotations({ description: 'Minimum password length (6-128)' })
50
+ )
51
+ ),
52
+ maxPasswordLength: Schema.optional(
53
+ Schema.Number.pipe(
54
+ Schema.between(8, 256),
55
+ Schema.annotations({ description: 'Maximum password length (8-256)' })
56
+ )
57
+ ),
58
+ })
59
+ ).pipe(
60
+ Schema.annotations({
61
+ title: 'Email and Password Configuration',
62
+ description: 'Configuration for email and password authentication',
63
+ examples: [true, { requireEmailVerification: true }, { minPasswordLength: 12 }],
64
+ })
65
+ )
66
+
67
+ export type EmailAndPasswordConfig = Schema.Schema.Type<typeof EmailAndPasswordConfigSchema>
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Copyright (c) 2025 ESSENTIAL SERVICES
3
+ *
4
+ * This source code is licensed under the Business Source License 1.1
5
+ * found in the LICENSE.md file in the root directory of this source tree.
6
+ */
7
+
8
+ // Export individual method schemas
9
+ // These are used directly in the flattened AuthSchema
10
+ export * from './email-and-password'
11
+ export * from './magic-link'
@@ -0,0 +1,54 @@
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
+ * Magic Link Authentication Method Configuration
12
+ *
13
+ * Passwordless authentication via email link.
14
+ * User receives an email with a one-time link to sign in.
15
+ *
16
+ * Can be:
17
+ * - A boolean (true to enable with defaults)
18
+ * - A configuration object for customization
19
+ *
20
+ * Configuration options:
21
+ * - expirationMinutes: How long the magic link is valid (default: 15)
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * // Simple enable
26
+ * { magicLink: true }
27
+ *
28
+ * // With configuration
29
+ * {
30
+ * magicLink: {
31
+ * expirationMinutes: 30
32
+ * }
33
+ * }
34
+ * ```
35
+ */
36
+ export const MagicLinkConfigSchema = Schema.Union(
37
+ Schema.Boolean,
38
+ Schema.Struct({
39
+ expirationMinutes: Schema.optional(
40
+ Schema.Number.pipe(
41
+ Schema.positive(),
42
+ Schema.annotations({ description: 'Link expiration time in minutes' })
43
+ )
44
+ ),
45
+ })
46
+ ).pipe(
47
+ Schema.annotations({
48
+ title: 'Magic Link Configuration',
49
+ description: 'Configuration for magic link authentication',
50
+ examples: [true, { expirationMinutes: 30 }],
51
+ })
52
+ )
53
+
54
+ export type MagicLinkConfig = Schema.Schema.Type<typeof MagicLinkConfigSchema>
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Copyright (c) 2025 ESSENTIAL SERVICES
3
+ *
4
+ * This source code is licensed under the Business Source License 1.1
5
+ * found in the LICENSE.md file in the root directory of this source tree.
6
+ */
7
+
8
+ export * from './providers'
@@ -0,0 +1,105 @@
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
+ * OAuth Provider Schema
12
+ *
13
+ * Essential OAuth providers for v1.
14
+ * Focused on enterprise and developer use cases.
15
+ *
16
+ * Providers:
17
+ * - google: Google Workspace integration
18
+ * - github: Developer authentication
19
+ * - microsoft: Enterprise/Azure AD
20
+ * - slack: Workspace communication
21
+ * - gitlab: Developer/CI-CD integration
22
+ *
23
+ * Credentials are loaded from environment variables:
24
+ * - {PROVIDER}_CLIENT_ID (e.g., GOOGLE_CLIENT_ID)
25
+ * - {PROVIDER}_CLIENT_SECRET (e.g., GOOGLE_CLIENT_SECRET)
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const providers = ['google', 'github', 'slack']
30
+ * ```
31
+ */
32
+ export const OAuthProviderSchema = Schema.Literal(
33
+ 'google',
34
+ 'github',
35
+ 'microsoft',
36
+ 'slack',
37
+ 'gitlab'
38
+ ).pipe(
39
+ Schema.annotations({
40
+ title: 'OAuth Provider',
41
+ description: 'Supported OAuth providers for social login',
42
+ })
43
+ )
44
+
45
+ export type OAuthProvider = Schema.Schema.Type<typeof OAuthProviderSchema>
46
+
47
+ /**
48
+ * OAuth Configuration Schema
49
+ *
50
+ * Simple provider list using environment variables for credentials.
51
+ * For each provider enabled, the system expects:
52
+ * - {PROVIDER}_CLIENT_ID environment variable
53
+ * - {PROVIDER}_CLIENT_SECRET environment variable
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * // Enable Google and GitHub OAuth
58
+ * { providers: ['google', 'github'] }
59
+ *
60
+ * // Required environment variables:
61
+ * // GOOGLE_CLIENT_ID=your-google-client-id
62
+ * // GOOGLE_CLIENT_SECRET=your-google-client-secret
63
+ * // GITHUB_CLIENT_ID=your-github-client-id
64
+ * // GITHUB_CLIENT_SECRET=your-github-client-secret
65
+ * ```
66
+ */
67
+ export const OAuthConfigSchema = Schema.Struct({
68
+ /** List of OAuth providers to enable */
69
+ providers: Schema.NonEmptyArray(OAuthProviderSchema),
70
+ }).pipe(
71
+ Schema.annotations({
72
+ title: 'OAuth Configuration',
73
+ description:
74
+ 'OAuth social login configuration. Credentials loaded from environment variables ({PROVIDER}_CLIENT_ID, {PROVIDER}_CLIENT_SECRET).',
75
+ examples: [
76
+ { providers: ['google'] },
77
+ { providers: ['google', 'github'] },
78
+ { providers: ['google', 'github', 'microsoft'] },
79
+ ],
80
+ })
81
+ )
82
+
83
+ export type OAuthConfig = Schema.Schema.Type<typeof OAuthConfigSchema>
84
+
85
+ /**
86
+ * Get environment variable names for a provider
87
+ *
88
+ * @param provider - OAuth provider name
89
+ * @returns Object with clientId and clientSecret env var names
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * getProviderEnvVars('google')
94
+ * // Returns: { clientId: 'GOOGLE_CLIENT_ID', clientSecret: 'GOOGLE_CLIENT_SECRET' }
95
+ * ```
96
+ */
97
+ export const getProviderEnvVars = (
98
+ provider: OAuthProvider
99
+ ): { readonly clientId: string; readonly clientSecret: string } => {
100
+ const upper = provider.toUpperCase()
101
+ return {
102
+ clientId: `${upper}_CLIENT_ID`,
103
+ clientSecret: `${upper}_CLIENT_SECRET`,
104
+ }
105
+ }
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Copyright (c) 2025 ESSENTIAL SERVICES
3
+ *
4
+ * This source code is licensed under the Business Source License 1.1
5
+ * found in the LICENSE.md file in the root directory of this source tree.
6
+ */
7
+
8
+ import { Schema } from 'effect'
9
+ import {
10
+ ResourceActionPermissionsSchema,
11
+ UserLevelRoleSchema,
12
+ } from '@/domain/models/app/permissions'
13
+
14
+ /**
15
+ * Role Management Configuration
16
+ *
17
+ * Controls admin role assignment and revocation capabilities.
18
+ * Presence of this config enables role management features.
19
+ */
20
+ export const RoleManagementSchema = Schema.Struct({
21
+ assignAdmin: Schema.optional(
22
+ Schema.Boolean.pipe(
23
+ Schema.annotations({ description: 'Allow admins to grant admin role to users' })
24
+ )
25
+ ),
26
+ revokeAdmin: Schema.optional(
27
+ Schema.Boolean.pipe(
28
+ Schema.annotations({ description: 'Allow admins to revoke admin role from users' })
29
+ )
30
+ ),
31
+ preventSelfRevocation: Schema.optional(
32
+ Schema.Boolean.pipe(
33
+ Schema.annotations({ description: 'Prevent admins from revoking their own admin role' })
34
+ )
35
+ ),
36
+ }).pipe(
37
+ Schema.annotations({
38
+ title: 'Role Management',
39
+ description: 'Admin role assignment and revocation capabilities',
40
+ examples: [{ assignAdmin: true, revokeAdmin: true, preventSelfRevocation: true }],
41
+ })
42
+ )
43
+
44
+ export type RoleManagement = Schema.Schema.Type<typeof RoleManagementSchema>
45
+
46
+ /**
47
+ * Admin Plugin Configuration
48
+ *
49
+ * Enables administrative features for user management.
50
+ * Includes capabilities for managing roles, impersonating users,
51
+ * and custom permissions.
52
+ *
53
+ * Configuration options:
54
+ * - impersonation: Allow admins to impersonate other users
55
+ * - userManagement: Enable user CRUD operations
56
+ * - firstUserAdmin: Make first registered user an admin
57
+ * - defaultRole: Default role for new users
58
+ * - customPermissions: Granular resource:action permissions
59
+ * - roleManagement: Admin role assignment/revocation
60
+ *
61
+ * Default admin user is configured via environment variables:
62
+ * - ADMIN_EMAIL: Admin email address
63
+ * - ADMIN_PASSWORD: Admin password
64
+ * - ADMIN_NAME: Admin display name (optional)
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * // Simple enable
69
+ * { plugins: { admin: true } }
70
+ *
71
+ * // With configuration
72
+ * { plugins: { admin: { impersonation: true, firstUserAdmin: true } } }
73
+ *
74
+ * // With custom permissions
75
+ * { plugins: { admin: {
76
+ * customPermissions: {
77
+ * posts: ['create', 'read', 'update', 'delete'],
78
+ * analytics: ['read']
79
+ * }
80
+ * } } }
81
+ * ```
82
+ */
83
+ export const AdminConfigSchema = Schema.Union(
84
+ Schema.Boolean,
85
+ Schema.Struct({
86
+ // ========== Existing Fields ==========
87
+ impersonation: Schema.optional(
88
+ Schema.Boolean.pipe(Schema.annotations({ description: 'Allow admin impersonation of users' }))
89
+ ),
90
+ userManagement: Schema.optional(
91
+ Schema.Boolean.pipe(Schema.annotations({ description: 'Enable user management features' }))
92
+ ),
93
+
94
+ // ========== Admin Options ==========
95
+ firstUserAdmin: Schema.optional(
96
+ Schema.Boolean.pipe(
97
+ Schema.annotations({ description: 'Automatically make the first registered user an admin' })
98
+ )
99
+ ),
100
+ defaultRole: Schema.optional(
101
+ UserLevelRoleSchema.pipe(
102
+ Schema.annotations({
103
+ description: 'Default role assigned to new users',
104
+ message: () => 'Invalid default role. Must be one of: admin, member, viewer',
105
+ })
106
+ )
107
+ ),
108
+
109
+ // ========== Advanced Features ==========
110
+ customPermissions: Schema.optional(ResourceActionPermissionsSchema),
111
+ roleManagement: Schema.optional(RoleManagementSchema),
112
+ })
113
+ ).pipe(
114
+ Schema.annotations({
115
+ title: 'Admin Plugin Configuration',
116
+ description:
117
+ 'Administrative features for user management. Default admin user configured via ADMIN_EMAIL, ADMIN_PASSWORD, ADMIN_NAME environment variables.',
118
+ examples: [
119
+ true,
120
+ { impersonation: true },
121
+ { impersonation: true, userManagement: true, firstUserAdmin: true },
122
+ {
123
+ customPermissions: { posts: ['create', 'read', 'update', 'delete'] },
124
+ roleManagement: { assignAdmin: true, revokeAdmin: true },
125
+ },
126
+ ],
127
+ })
128
+ )
129
+
130
+ export type AdminConfig = Schema.Schema.Type<typeof AdminConfigSchema>
@@ -0,0 +1,74 @@
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 { AdminConfigSchema } from './admin'
10
+ import { TwoFactorConfigSchema } from './two-factor'
11
+
12
+ // Export individual plugin schemas
13
+ export * from './admin'
14
+ export * from './two-factor'
15
+
16
+ /**
17
+ * Unified Plugins Configuration Schema
18
+ *
19
+ * All authentication plugins in a single configuration object.
20
+ * Each plugin is optional and can be:
21
+ * - A boolean (true to enable with defaults)
22
+ * - A configuration object for customization
23
+ *
24
+ * Plugin categories:
25
+ * - Admin: admin
26
+ * - Security: twoFactor
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * // Simple plugins
31
+ * {
32
+ * plugins: {
33
+ * admin: true,
34
+ * twoFactor: true
35
+ * }
36
+ * }
37
+ *
38
+ * // Configured plugins
39
+ * {
40
+ * plugins: {
41
+ * admin: { impersonation: true },
42
+ * twoFactor: { issuer: 'MyApp', backupCodes: true }
43
+ * }
44
+ * }
45
+ * ```
46
+ */
47
+ export const PluginsConfigSchema = Schema.Struct({
48
+ // Admin features
49
+ admin: Schema.optional(AdminConfigSchema),
50
+
51
+ // Security plugins
52
+ twoFactor: Schema.optional(TwoFactorConfigSchema),
53
+ }).pipe(
54
+ Schema.annotations({
55
+ title: 'Plugins Configuration',
56
+ description: 'All authentication plugins configuration',
57
+ examples: [{ admin: true }, { twoFactor: { issuer: 'MyApp' } }],
58
+ })
59
+ )
60
+
61
+ export type PluginsConfig = Schema.Schema.Type<typeof PluginsConfigSchema>
62
+
63
+ /**
64
+ * Helper to check if a plugin is enabled
65
+ */
66
+ export const isPluginEnabled = (
67
+ plugins: PluginsConfig | undefined,
68
+ plugin: keyof PluginsConfig
69
+ ): boolean => {
70
+ if (!plugins) return false
71
+ const value = plugins[plugin]
72
+ if (typeof value === 'boolean') return value
73
+ return value !== undefined
74
+ }