create-nextblock 0.14.1 → 0.14.4

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 (263) hide show
  1. package/docker-template/.dockerignore +23 -23
  2. package/docker-template/.env.docker.example +69 -69
  3. package/docker-template/docker/db/init/99-jwt.sql +6 -6
  4. package/docker-template/docker/db/init/99-roles.sql +25 -25
  5. package/docker-template/docker/kong/kong.yml +112 -112
  6. package/docker-template/scripts/docker-setup.mjs +310 -310
  7. package/libs/db/tsconfig.lib.json +3 -3
  8. package/libs/editor/tsconfig.lib.json +3 -3
  9. package/libs/ui/tsconfig.lib.json +3 -3
  10. package/libs/utils/tsconfig.json +3 -3
  11. package/package.json +1 -1
  12. package/project.json +19 -19
  13. package/templates/nextblock-template/.browserslistrc +11 -11
  14. package/templates/nextblock-template/.dockerignore +23 -23
  15. package/templates/nextblock-template/README.md +34 -34
  16. package/templates/nextblock-template/app/(auth-pages)/layout.tsx +9 -9
  17. package/templates/nextblock-template/app/(auth-pages)/post-sign-in/page.tsx +27 -27
  18. package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +46 -46
  19. package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -51
  20. package/templates/nextblock-template/app/ToasterProvider.tsx +17 -17
  21. package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -7
  22. package/templates/nextblock-template/app/actions/consent.ts +57 -57
  23. package/templates/nextblock-template/app/actions/postActions.ts +146 -146
  24. package/templates/nextblock-template/app/actions/twoFactorEmail.ts +22 -22
  25. package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -153
  26. package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -96
  27. package/templates/nextblock-template/app/api/brand/email-logo/route.ts +48 -48
  28. package/templates/nextblock-template/app/api/cms/check-updates/route.ts +44 -44
  29. package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -33
  30. package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -63
  31. package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3490 -3490
  32. package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +5881 -5623
  33. package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
  34. package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
  35. package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
  36. package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
  37. package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
  38. package/templates/nextblock-template/app/api/media/record/route.ts +160 -160
  39. package/templates/nextblock-template/app/api/search/route.ts +43 -43
  40. package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +441 -441
  41. package/templates/nextblock-template/app/auth/callback/route.ts +31 -31
  42. package/templates/nextblock-template/app/cart/page.tsx +7 -7
  43. package/templates/nextblock-template/app/cms/CmsClientLayout.tsx +2 -2
  44. package/templates/nextblock-template/app/cms/blocks/components/ColumnEditor.tsx +17 -22
  45. package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
  46. package/templates/nextblock-template/app/cms/blocks/components/EditableBlock.tsx +13 -19
  47. package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -149
  48. package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
  49. package/templates/nextblock-template/app/cms/blocks/editors/HeadingBlockEditor.tsx +45 -34
  50. package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +4 -2
  51. package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +90 -90
  52. package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
  53. package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -58
  54. package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +36 -36
  55. package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
  56. package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
  57. package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
  58. package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
  59. package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
  60. package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
  61. package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
  62. package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
  63. package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
  64. package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
  65. package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
  66. package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -228
  67. package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
  68. package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
  69. package/templates/nextblock-template/app/cms/layout.tsx +73 -73
  70. package/templates/nextblock-template/app/cms/media/components/FolderNavigator.tsx +273 -273
  71. package/templates/nextblock-template/app/cms/media/components/FolderTree.tsx +122 -122
  72. package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
  73. package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -69
  74. package/templates/nextblock-template/app/cms/navigation/components/NavigationMenuDnd.tsx +3 -3
  75. package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -12
  76. package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
  77. package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -13
  78. package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
  79. package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -133
  80. package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -5
  81. package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
  82. package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
  83. package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
  84. package/templates/nextblock-template/app/cms/revisions/service.ts +19 -19
  85. package/templates/nextblock-template/app/cms/revisions/utils.ts +132 -132
  86. package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
  87. package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
  88. package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
  89. package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +688 -688
  90. package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -331
  91. package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -494
  92. package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
  93. package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -767
  94. package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -93
  95. package/templates/nextblock-template/app/cms/settings/global-css/components/ThemeEditor.tsx +382 -0
  96. package/templates/nextblock-template/app/cms/settings/global-css/components/ThemeManager.tsx +267 -0
  97. package/templates/nextblock-template/app/cms/settings/global-css/page.tsx +40 -24
  98. package/templates/nextblock-template/app/cms/settings/global-css/theme-actions.ts +259 -0
  99. package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
  100. package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
  101. package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -339
  102. package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
  103. package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +23 -21
  104. package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
  105. package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
  106. package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
  107. package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -122
  108. package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
  109. package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
  110. package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +9 -7
  111. package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
  112. package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -21
  113. package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -20
  114. package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
  115. package/templates/nextblock-template/app/layout.tsx +49 -0
  116. package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
  117. package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -16
  118. package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -9
  119. package/templates/nextblock-template/app/profile/account-links.ts +22 -22
  120. package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
  121. package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
  122. package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -128
  123. package/templates/nextblock-template/app/profile/password/actions.ts +59 -59
  124. package/templates/nextblock-template/app/profile/password/page.tsx +27 -27
  125. package/templates/nextblock-template/app/providers.tsx +16 -4
  126. package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
  127. package/templates/nextblock-template/app/setup/layout.tsx +13 -13
  128. package/templates/nextblock-template/app/setup/page.tsx +111 -111
  129. package/templates/nextblock-template/app/sitemap.ts +130 -130
  130. package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -7
  131. package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -23
  132. package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
  133. package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -70
  134. package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -69
  135. package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
  136. package/templates/nextblock-template/components/FooterNavigation.tsx +32 -32
  137. package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
  138. package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
  139. package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
  140. package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
  141. package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
  142. package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -12
  143. package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -12
  144. package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -23
  145. package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +249 -249
  146. package/templates/nextblock-template/components/blocks/renderers/HeadingBlockRenderer.tsx +7 -10
  147. package/templates/nextblock-template/components/blocks/types.ts +7 -7
  148. package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
  149. package/templates/nextblock-template/components/form-message.tsx +32 -32
  150. package/templates/nextblock-template/components/media/YouTubeFacade.tsx +105 -105
  151. package/templates/nextblock-template/components/media/youtube-embed-replace.tsx +32 -32
  152. package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
  153. package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
  154. package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
  155. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
  156. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +471 -471
  157. package/templates/nextblock-template/components/submit-button.tsx +23 -23
  158. package/templates/nextblock-template/components/theme-icon.tsx +78 -0
  159. package/templates/nextblock-template/components/theme-switcher.tsx +77 -82
  160. package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
  161. package/templates/nextblock-template/context/AuthContext.tsx +23 -23
  162. package/templates/nextblock-template/context/ThemeCatalogContext.tsx +44 -0
  163. package/templates/nextblock-template/context/language-rest-client.ts +32 -32
  164. package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
  165. package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
  166. package/templates/nextblock-template/docker/kong/kong.yml +112 -112
  167. package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
  168. package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
  169. package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +279 -202
  170. package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +246 -246
  171. package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +176 -176
  172. package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
  173. package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
  174. package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +173 -173
  175. package/templates/nextblock-template/docs/12-VERCEL-DEPLOYMENT.md +170 -170
  176. package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +151 -151
  177. package/templates/nextblock-template/docs/README.md +39 -39
  178. package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -21
  179. package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -101
  180. package/templates/nextblock-template/index.d.ts +7 -7
  181. package/templates/nextblock-template/lib/app-secrets.ts +39 -39
  182. package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
  183. package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
  184. package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
  185. package/templates/nextblock-template/lib/auth-redirects.ts +46 -46
  186. package/templates/nextblock-template/lib/blocks/README.md +13 -13
  187. package/templates/nextblock-template/lib/blocks/blockColors.test.ts +114 -0
  188. package/templates/nextblock-template/lib/blocks/blockColors.ts +132 -0
  189. package/templates/nextblock-template/lib/blocks/blockRegistry.ts +17 -1
  190. package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
  191. package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -2243
  192. package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
  193. package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
  194. package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
  195. package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
  196. package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
  197. package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
  198. package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
  199. package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
  200. package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
  201. package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
  202. package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
  203. package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
  204. package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
  205. package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
  206. package/templates/nextblock-template/lib/email/branding.ts +76 -76
  207. package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
  208. package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
  209. package/templates/nextblock-template/lib/full-backup/server.ts +743 -743
  210. package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
  211. package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +54 -54
  212. package/templates/nextblock-template/lib/media/youtube.ts +99 -99
  213. package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
  214. package/templates/nextblock-template/lib/onboarding/status.ts +222 -222
  215. package/templates/nextblock-template/lib/posts/readTime.ts +60 -60
  216. package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
  217. package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
  218. package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
  219. package/templates/nextblock-template/lib/privacy/types.ts +69 -69
  220. package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
  221. package/templates/nextblock-template/lib/promotions/server.ts +741 -741
  222. package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
  223. package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
  224. package/templates/nextblock-template/lib/search/types.ts +27 -27
  225. package/templates/nextblock-template/lib/setup/actions.ts +460 -460
  226. package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
  227. package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
  228. package/templates/nextblock-template/lib/setup/migrations-bundle.ts +15 -10
  229. package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
  230. package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
  231. package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
  232. package/templates/nextblock-template/lib/setup/types.ts +18 -18
  233. package/templates/nextblock-template/lib/site-url.ts +48 -48
  234. package/templates/nextblock-template/lib/storage/provider.ts +66 -66
  235. package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
  236. package/templates/nextblock-template/lib/themes/buildThemeCss.test.ts +163 -0
  237. package/templates/nextblock-template/lib/themes/buildThemeCss.ts +124 -0
  238. package/templates/nextblock-template/lib/themes/tokenColor.ts +31 -0
  239. package/templates/nextblock-template/lib/themes/tokens.ts +143 -0
  240. package/templates/nextblock-template/lib/updates/check-upstream.ts +441 -441
  241. package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
  242. package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
  243. package/templates/nextblock-template/next-env.d.ts +2 -2
  244. package/templates/nextblock-template/package.json +1 -1
  245. package/templates/nextblock-template/postcss.config.js +6 -6
  246. package/templates/nextblock-template/scripts/backup.js +115 -115
  247. package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
  248. package/templates/nextblock-template/scripts/restore.js +385 -385
  249. package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
  250. package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
  251. package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
  252. package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
  253. package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
  254. package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
  255. package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
  256. package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
  257. package/templates/nextblock-template/scripts/verify-site-themes.ts +63 -0
  258. package/templates/nextblock-template/tailwind.config.js +25 -25
  259. package/templates/nextblock-template/tools/build-migrate.mjs +209 -209
  260. package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -282
  261. package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
  262. package/templates/nextblock-template/types/jsdom.d.ts +6 -6
  263. package/tsconfig.base.json +3 -3
@@ -1,246 +1,246 @@
1
- # 04 Database and Auth
2
-
3
- ## Source of Truth
4
-
5
- The database and auth implementation is spread across:
6
-
7
- - `libs/db/src/lib/supabase/*`
8
- - `libs/db/src/lib/package-validation.ts`
9
- - `libs/db/src/supabase/config.toml`
10
- - `libs/db/src/supabase/migrations/*`
11
- - `apps/nextblock/app/auth/callback/route.ts`
12
- - `apps/nextblock/app/cms/*`
13
-
14
- When documentation and a migration disagree, the migration folder is the final
15
- authority for schema, triggers, grants, and policies.
16
-
17
- ## Supabase Client Surfaces
18
-
19
- `libs/db/src/server.ts` currently exports:
20
-
21
- - `createClient()`: request-scoped server client using auth cookies
22
- - `getProfileWithRoleServerSide()`
23
- - `getActiveLanguagesServerSide()`
24
- - `getServiceRoleSupabaseClient()`
25
- - `getSsgSupabaseClient()`
26
- - package activation helpers such as `verifyPackageOnline()`
27
-
28
- Practical usage in the app is split by trust level:
29
-
30
- - normal server routes and components use `createClient()`
31
- - public static-ish reads often use `getSsgSupabaseClient()`
32
- - admin or system workflows use `getServiceRoleSupabaseClient()`
33
-
34
- ## Auth Flow
35
-
36
- ### Session exchange
37
-
38
- `app/auth/callback/route.ts` handles Supabase auth callback exchanges:
39
-
40
- 1. read the `code` query parameter
41
- 2. exchange it for a session with `supabase.auth.exchangeCodeForSession()`
42
- 3. load the user's profile and role
43
- 4. redirect through `resolvePostAuthRedirect()`
44
-
45
- ### Profile creation
46
-
47
- The first-user and profile bootstrap logic lives in the database, not in React
48
- code.
49
-
50
- `00000000000005_setup_functions_and_triggers.sql` defines:
51
-
52
- - `handle_new_user()`
53
- - `on_auth_user_created` trigger on `auth.users`
54
-
55
- That trigger:
56
-
57
- - creates the first local admin automatically
58
- - creates later users as `USER`
59
- - inserts or updates `profiles`
60
- - copies selected metadata such as `full_name`, avatar URL, and GitHub username
61
-
62
- ### CMS authorization
63
-
64
- The CMS shell in `app/cms/CmsClientLayout.tsx` currently expects:
65
-
66
- - an authenticated user
67
- - a resolved profile role of `ADMIN` or `WRITER`
68
-
69
- Writers and admins can enter the CMS. Admin-only navigation is used for
70
- settings such as payments, shipping, users, and some branding/config surfaces.
71
-
72
- ### No live app middleware file
73
-
74
- There is a generic Supabase middleware helper in `libs/db/src/lib/supabase`,
75
- but there is no live `apps/nextblock/middleware.ts` file in the current app.
76
- Document the callback, layout, and RLS model as the active auth path rather
77
- than assuming middleware-based route protection is in use.
78
-
79
- ## Schema Overview
80
-
81
- ### Core platform tables
82
-
83
- Defined primarily in `00000000000001_setup_cms_core.sql`:
84
-
85
- - `site_settings`
86
- - `profiles`
87
- - `user_addresses`
88
- - `languages`
89
- - `media`
90
- - `translations`
91
- - `logos`
92
-
93
- ### Content tables
94
-
95
- Defined primarily in `00000000000002_setup_content_tables.sql`:
96
-
97
- - `posts`
98
- - `pages`
99
- - `blocks`
100
- - `navigation_items`
101
- - `page_revisions`
102
- - `post_revisions`
103
-
104
- ### Commerce tables
105
-
106
- Defined across `00000000000003` and `00000000000004`:
107
-
108
- - `products`
109
- - `product_media`
110
- - `product_attributes`
111
- - `product_attribute_terms`
112
- - `product_variants`
113
- - `inventory_items`
114
- - `variant_attribute_mapping`
115
- - `package_activations`
116
- - `freemius_plans`
117
- - `freemius_pricing`
118
- - `orders`
119
- - `order_items`
120
- - `shipping_zones`
121
- - `shipping_zone_locations`
122
- - `shipping_zone_methods`
123
- - `tax_rates`
124
- - `currencies`
125
-
126
- ### Post-baseline tables
127
-
128
- Added after the squashed baseline by later migrations:
129
-
130
- - `categories` and `product_categories` — catalog organization
131
- (migration `00000000000019`; translated via `00000000000020`)
132
- - `custom_block_definitions` — data-driven custom block registry
133
- (migration `00000000000023`; see [10-CUSTOM-BLOCKS.md](./10-CUSTOM-BLOCKS.md))
134
- - `ucp_cart_sessions` — persisted cart sessions (migration `00000000000024`)
135
- - a `blocks` JSONB column plus `product_id` link for block-based product
136
- descriptions (migration `00000000000017`)
137
-
138
- ## Row Level Security Patterns
139
-
140
- `00000000000006_setup_rls_and_grants.sql` is the consolidated RLS file.
141
-
142
- The high-level access model is:
143
-
144
- - public read access for languages, media, translations, published content, and
145
- several storefront commerce tables
146
- - authenticated self-service access for user addresses and customer-owned
147
- orders
148
- - `ADMIN` or `WRITER` write access for most CMS authoring tables
149
- - `ADMIN`-only write access for higher-risk configuration surfaces
150
- - `service_role` full access where background jobs or system syncs need it
151
-
152
- Commerce-specific policy highlights include:
153
-
154
- - public read access for products, product media, product attributes, variants,
155
- shipping zones, shipping methods, tax rates, and active currencies
156
- - customer-scoped read access for `orders` and `order_items`
157
- - service-role management access for orders, order items, inventory, taxes, and
158
- currencies
159
-
160
- ## Migration Structure
161
-
162
- ### Current reality
163
-
164
- The folder was **re-baselined in 2026-07**: the previous 45 migrations
165
- (`00000000000000`–`00000000000044`) were squashed into a four-file idempotent
166
- baseline, generated from a fresh-apply `pg_dump` by
167
- `tools/scripts/rebaseline-transform.mjs` and verified byte-identical to the old
168
- tree. The current sequence is:
169
-
170
- - `00000000000000_baseline_schema.sql` — enums, functions, tables, sequences
171
- (all `IF NOT EXISTS` / `CREATE OR REPLACE`) plus the re-attached `auth.users`
172
- → `handle_new_user` trigger.
173
- - `00000000000001_baseline_constraints_and_indexes.sql` — primary/unique/check
174
- and foreign-key constraints (guarded) plus all indexes.
175
- - `00000000000002_baseline_security_and_grants.sql` — RLS enablement, policies
176
- (`DROP … IF EXISTS` first), triggers, and grants.
177
- - `00000000000003_baseline_seed.sql` — canonical demo content, `ON CONFLICT DO
178
- NOTHING` (no users, no secrets).
179
-
180
- Every file is fully idempotent. Existing databases already have versions
181
- `000`–`003` recorded, so both appliers skip the baseline — it only runs on a
182
- fresh/empty database. **The next new migration is `00000000000004`**, appended
183
- forward-only.
184
-
185
- ### Production migration policy
186
-
187
- NextBlock has live Supabase data. Treat migrations as append-only for any
188
- production or shared database change.
189
-
190
- - Do not edit, recycle, squash, reorder, or delete migration files that may
191
- already be recorded in a shared or production Supabase project.
192
- - Add a new forward-only `.sql` file under
193
- `libs/db/src/supabase/migrations` for each new schema/data change.
194
- - Keep migrations non-destructive by default. Avoid dropping or rewriting data
195
- that may include orders, users, payments, or customer records.
196
- - Run `npm run db:migrate:check` before `npm run db:migrate`.
197
- - If an existing database lists old baseline files such as
198
- `00000000000000_baseline_schema.sql` as pending, do not replay them. Use
199
- `npm run db:migrate:repair-history:check`, then
200
- `npm run db:migrate:repair-history --through=00000000000003` (the baseline's
201
- top file creates no tables, so auto-detection otherwise stops at `000`), then
202
- rerun `npm run db:migrate:check`.
203
- - Use `npm run db:migrate:fresh` only for a brand-new empty database.
204
-
205
- ### Category map
206
-
207
- | Migration file | Domain | What it covers |
208
- | :-- | :-- | :-- |
209
- | `00000000000000_baseline_schema.sql` | Core, CMS, Commerce | all enums, 40 functions, 49 tables + sequences (idempotent), and the `auth.users` → `handle_new_user` bootstrap trigger |
210
- | `00000000000001_baseline_constraints_and_indexes.sql` | Core, CMS, Commerce | all primary/unique/check + foreign-key constraints (guarded) and every index |
211
- | `00000000000002_baseline_security_and_grants.sql` | Security | RLS enablement on every table, all policies, timestamp/business triggers, grants |
212
- | `00000000000003_baseline_seed.sql` | Seeds | canonical demo content — languages, currencies, site settings, translations, media, pages/posts/blocks, navigation, shipping defaults — all `ON CONFLICT DO NOTHING` |
213
-
214
- The pre-2026-07 history (foundation/enums, cms_core, content_tables, catalog,
215
- fulfillment, functions_and_triggers, rls_and_grants, indexes, the seed files, and
216
- later additions like custom block definitions, product blocks, categories, cart
217
- sessions, drafts, privacy/MFA, system alerts, interactions) is all folded into the
218
- four files above; the earlier per-file boundaries survive only as comment headers
219
- inside the generated SQL.
220
-
221
- ### How to read the folder
222
-
223
- Read the migrations in lexical order from `00000000000000` upward.
224
-
225
- That sequence is the cleanest under-the-hood blueprint for:
226
-
227
- - which tables exist
228
- - what triggers and functions are available
229
- - what security rules are enforced
230
- - what default content and configuration are seeded
231
-
232
- If you need to understand whether the platform really supports something, check
233
- the migration file first, then trace the corresponding route or library code.
234
-
235
- ## Important Site Settings in Active Use
236
-
237
- These keys are actively referenced by the current codebase:
238
-
239
- - `enabled_payment_providers`
240
- - `ecommerce_inventory_settings`
241
- - `invoice_settings`
242
- - `footer_copyright`
243
- - `is_admin_created`
244
-
245
- There are many more seeded settings, but these are the most important ones for
246
- understanding current runtime behavior.
1
+ # 04 Database and Auth
2
+
3
+ ## Source of Truth
4
+
5
+ The database and auth implementation is spread across:
6
+
7
+ - `libs/db/src/lib/supabase/*`
8
+ - `libs/db/src/lib/package-validation.ts`
9
+ - `libs/db/src/supabase/config.toml`
10
+ - `libs/db/src/supabase/migrations/*`
11
+ - `apps/nextblock/app/auth/callback/route.ts`
12
+ - `apps/nextblock/app/cms/*`
13
+
14
+ When documentation and a migration disagree, the migration folder is the final
15
+ authority for schema, triggers, grants, and policies.
16
+
17
+ ## Supabase Client Surfaces
18
+
19
+ `libs/db/src/server.ts` currently exports:
20
+
21
+ - `createClient()`: request-scoped server client using auth cookies
22
+ - `getProfileWithRoleServerSide()`
23
+ - `getActiveLanguagesServerSide()`
24
+ - `getServiceRoleSupabaseClient()`
25
+ - `getSsgSupabaseClient()`
26
+ - package activation helpers such as `verifyPackageOnline()`
27
+
28
+ Practical usage in the app is split by trust level:
29
+
30
+ - normal server routes and components use `createClient()`
31
+ - public static-ish reads often use `getSsgSupabaseClient()`
32
+ - admin or system workflows use `getServiceRoleSupabaseClient()`
33
+
34
+ ## Auth Flow
35
+
36
+ ### Session exchange
37
+
38
+ `app/auth/callback/route.ts` handles Supabase auth callback exchanges:
39
+
40
+ 1. read the `code` query parameter
41
+ 2. exchange it for a session with `supabase.auth.exchangeCodeForSession()`
42
+ 3. load the user's profile and role
43
+ 4. redirect through `resolvePostAuthRedirect()`
44
+
45
+ ### Profile creation
46
+
47
+ The first-user and profile bootstrap logic lives in the database, not in React
48
+ code.
49
+
50
+ `00000000000005_setup_functions_and_triggers.sql` defines:
51
+
52
+ - `handle_new_user()`
53
+ - `on_auth_user_created` trigger on `auth.users`
54
+
55
+ That trigger:
56
+
57
+ - creates the first local admin automatically
58
+ - creates later users as `USER`
59
+ - inserts or updates `profiles`
60
+ - copies selected metadata such as `full_name`, avatar URL, and GitHub username
61
+
62
+ ### CMS authorization
63
+
64
+ The CMS shell in `app/cms/CmsClientLayout.tsx` currently expects:
65
+
66
+ - an authenticated user
67
+ - a resolved profile role of `ADMIN` or `WRITER`
68
+
69
+ Writers and admins can enter the CMS. Admin-only navigation is used for
70
+ settings such as payments, shipping, users, and some branding/config surfaces.
71
+
72
+ ### No live app middleware file
73
+
74
+ There is a generic Supabase middleware helper in `libs/db/src/lib/supabase`,
75
+ but there is no live `apps/nextblock/middleware.ts` file in the current app.
76
+ Document the callback, layout, and RLS model as the active auth path rather
77
+ than assuming middleware-based route protection is in use.
78
+
79
+ ## Schema Overview
80
+
81
+ ### Core platform tables
82
+
83
+ Defined primarily in `00000000000001_setup_cms_core.sql`:
84
+
85
+ - `site_settings`
86
+ - `profiles`
87
+ - `user_addresses`
88
+ - `languages`
89
+ - `media`
90
+ - `translations`
91
+ - `logos`
92
+
93
+ ### Content tables
94
+
95
+ Defined primarily in `00000000000002_setup_content_tables.sql`:
96
+
97
+ - `posts`
98
+ - `pages`
99
+ - `blocks`
100
+ - `navigation_items`
101
+ - `page_revisions`
102
+ - `post_revisions`
103
+
104
+ ### Commerce tables
105
+
106
+ Defined across `00000000000003` and `00000000000004`:
107
+
108
+ - `products`
109
+ - `product_media`
110
+ - `product_attributes`
111
+ - `product_attribute_terms`
112
+ - `product_variants`
113
+ - `inventory_items`
114
+ - `variant_attribute_mapping`
115
+ - `package_activations`
116
+ - `freemius_plans`
117
+ - `freemius_pricing`
118
+ - `orders`
119
+ - `order_items`
120
+ - `shipping_zones`
121
+ - `shipping_zone_locations`
122
+ - `shipping_zone_methods`
123
+ - `tax_rates`
124
+ - `currencies`
125
+
126
+ ### Post-baseline tables
127
+
128
+ Added after the squashed baseline by later migrations:
129
+
130
+ - `categories` and `product_categories` — catalog organization
131
+ (migration `00000000000019`; translated via `00000000000020`)
132
+ - `custom_block_definitions` — data-driven custom block registry
133
+ (migration `00000000000023`; see [10-CUSTOM-BLOCKS.md](./10-CUSTOM-BLOCKS.md))
134
+ - `ucp_cart_sessions` — persisted cart sessions (migration `00000000000024`)
135
+ - a `blocks` JSONB column plus `product_id` link for block-based product
136
+ descriptions (migration `00000000000017`)
137
+
138
+ ## Row Level Security Patterns
139
+
140
+ `00000000000006_setup_rls_and_grants.sql` is the consolidated RLS file.
141
+
142
+ The high-level access model is:
143
+
144
+ - public read access for languages, media, translations, published content, and
145
+ several storefront commerce tables
146
+ - authenticated self-service access for user addresses and customer-owned
147
+ orders
148
+ - `ADMIN` or `WRITER` write access for most CMS authoring tables
149
+ - `ADMIN`-only write access for higher-risk configuration surfaces
150
+ - `service_role` full access where background jobs or system syncs need it
151
+
152
+ Commerce-specific policy highlights include:
153
+
154
+ - public read access for products, product media, product attributes, variants,
155
+ shipping zones, shipping methods, tax rates, and active currencies
156
+ - customer-scoped read access for `orders` and `order_items`
157
+ - service-role management access for orders, order items, inventory, taxes, and
158
+ currencies
159
+
160
+ ## Migration Structure
161
+
162
+ ### Current reality
163
+
164
+ The folder was **re-baselined in 2026-07**: the previous 45 migrations
165
+ (`00000000000000`–`00000000000044`) were squashed into a four-file idempotent
166
+ baseline, generated from a fresh-apply `pg_dump` by
167
+ `tools/scripts/rebaseline-transform.mjs` and verified byte-identical to the old
168
+ tree. The current sequence is:
169
+
170
+ - `00000000000000_baseline_schema.sql` — enums, functions, tables, sequences
171
+ (all `IF NOT EXISTS` / `CREATE OR REPLACE`) plus the re-attached `auth.users`
172
+ → `handle_new_user` trigger.
173
+ - `00000000000001_baseline_constraints_and_indexes.sql` — primary/unique/check
174
+ and foreign-key constraints (guarded) plus all indexes.
175
+ - `00000000000002_baseline_security_and_grants.sql` — RLS enablement, policies
176
+ (`DROP … IF EXISTS` first), triggers, and grants.
177
+ - `00000000000003_baseline_seed.sql` — canonical demo content, `ON CONFLICT DO
178
+ NOTHING` (no users, no secrets).
179
+
180
+ Every file is fully idempotent. Existing databases already have versions
181
+ `000`–`003` recorded, so both appliers skip the baseline — it only runs on a
182
+ fresh/empty database. **The next new migration is `00000000000004`**, appended
183
+ forward-only.
184
+
185
+ ### Production migration policy
186
+
187
+ NextBlock has live Supabase data. Treat migrations as append-only for any
188
+ production or shared database change.
189
+
190
+ - Do not edit, recycle, squash, reorder, or delete migration files that may
191
+ already be recorded in a shared or production Supabase project.
192
+ - Add a new forward-only `.sql` file under
193
+ `libs/db/src/supabase/migrations` for each new schema/data change.
194
+ - Keep migrations non-destructive by default. Avoid dropping or rewriting data
195
+ that may include orders, users, payments, or customer records.
196
+ - Run `npm run db:migrate:check` before `npm run db:migrate`.
197
+ - If an existing database lists old baseline files such as
198
+ `00000000000000_baseline_schema.sql` as pending, do not replay them. Use
199
+ `npm run db:migrate:repair-history:check`, then
200
+ `npm run db:migrate:repair-history --through=00000000000003` (the baseline's
201
+ top file creates no tables, so auto-detection otherwise stops at `000`), then
202
+ rerun `npm run db:migrate:check`.
203
+ - Use `npm run db:migrate:fresh` only for a brand-new empty database.
204
+
205
+ ### Category map
206
+
207
+ | Migration file | Domain | What it covers |
208
+ | :-- | :-- | :-- |
209
+ | `00000000000000_baseline_schema.sql` | Core, CMS, Commerce | all enums, 40 functions, 49 tables + sequences (idempotent), and the `auth.users` → `handle_new_user` bootstrap trigger |
210
+ | `00000000000001_baseline_constraints_and_indexes.sql` | Core, CMS, Commerce | all primary/unique/check + foreign-key constraints (guarded) and every index |
211
+ | `00000000000002_baseline_security_and_grants.sql` | Security | RLS enablement on every table, all policies, timestamp/business triggers, grants |
212
+ | `00000000000003_baseline_seed.sql` | Seeds | canonical demo content — languages, currencies, site settings, translations, media, pages/posts/blocks, navigation, shipping defaults — all `ON CONFLICT DO NOTHING` |
213
+
214
+ The pre-2026-07 history (foundation/enums, cms_core, content_tables, catalog,
215
+ fulfillment, functions_and_triggers, rls_and_grants, indexes, the seed files, and
216
+ later additions like custom block definitions, product blocks, categories, cart
217
+ sessions, drafts, privacy/MFA, system alerts, interactions) is all folded into the
218
+ four files above; the earlier per-file boundaries survive only as comment headers
219
+ inside the generated SQL.
220
+
221
+ ### How to read the folder
222
+
223
+ Read the migrations in lexical order from `00000000000000` upward.
224
+
225
+ That sequence is the cleanest under-the-hood blueprint for:
226
+
227
+ - which tables exist
228
+ - what triggers and functions are available
229
+ - what security rules are enforced
230
+ - what default content and configuration are seeded
231
+
232
+ If you need to understand whether the platform really supports something, check
233
+ the migration file first, then trace the corresponding route or library code.
234
+
235
+ ## Important Site Settings in Active Use
236
+
237
+ These keys are actively referenced by the current codebase:
238
+
239
+ - `enabled_payment_providers`
240
+ - `ecommerce_inventory_settings`
241
+ - `invoice_settings`
242
+ - `footer_copyright`
243
+ - `is_admin_created`
244
+
245
+ There are many more seeded settings, but these are the most important ones for
246
+ understanding current runtime behavior.