create-nextblock 0.13.10 → 0.13.12

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 (259) 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/productGridActions.ts +40 -40
  25. package/templates/nextblock-template/app/actions/twoFactorEmail.ts +22 -22
  26. package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -153
  27. package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -96
  28. package/templates/nextblock-template/app/api/brand/email-logo/route.ts +48 -48
  29. package/templates/nextblock-template/app/api/cms/check-updates/route.ts +44 -44
  30. package/templates/nextblock-template/app/api/cms/ecommerce/product-picker/route.ts +151 -151
  31. package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -33
  32. package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -63
  33. package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3490 -3490
  34. package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +5749 -5609
  35. package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
  36. package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
  37. package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
  38. package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
  39. package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
  40. package/templates/nextblock-template/app/api/media/record/route.ts +160 -160
  41. package/templates/nextblock-template/app/api/search/route.ts +43 -43
  42. package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +441 -441
  43. package/templates/nextblock-template/app/auth/callback/route.ts +31 -31
  44. package/templates/nextblock-template/app/cart/page.tsx +7 -7
  45. package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
  46. package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -149
  47. package/templates/nextblock-template/app/cms/blocks/components/MultiEntityPicker.tsx +263 -263
  48. package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
  49. package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +90 -90
  50. package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
  51. package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -58
  52. package/templates/nextblock-template/app/cms/components/EcommerceActiveContext.tsx +27 -27
  53. package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +36 -36
  54. package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
  55. package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
  56. package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
  57. package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
  58. package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
  59. package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
  60. package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
  61. package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
  62. package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
  63. package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
  64. package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
  65. package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -228
  66. package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
  67. package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
  68. package/templates/nextblock-template/app/cms/interactions/EmailRecipientsInput.tsx +189 -189
  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 +497 -497
  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/google-analytics/page.tsx +26 -26
  96. package/templates/nextblock-template/app/cms/settings/languages/components/LanguageDetectionPanel.tsx +188 -188
  97. package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
  98. package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -339
  99. package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
  100. package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +20 -20
  101. package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
  102. package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
  103. package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
  104. package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -122
  105. package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
  106. package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
  107. package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
  108. package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -21
  109. package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -20
  110. package/templates/nextblock-template/app/cms/users/components/CreateUserForm.tsx +217 -217
  111. package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
  112. package/templates/nextblock-template/app/cms/users/new/page.tsx +44 -44
  113. package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
  114. package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -16
  115. package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -9
  116. package/templates/nextblock-template/app/profile/account-links.ts +22 -22
  117. package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
  118. package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
  119. package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -128
  120. package/templates/nextblock-template/app/profile/password/actions.ts +59 -59
  121. package/templates/nextblock-template/app/profile/password/page.tsx +27 -27
  122. package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
  123. package/templates/nextblock-template/app/setup/layout.tsx +13 -13
  124. package/templates/nextblock-template/app/setup/page.tsx +111 -111
  125. package/templates/nextblock-template/app/sitemap.ts +130 -130
  126. package/templates/nextblock-template/components/BlockRenderer.tsx +4 -0
  127. package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -7
  128. package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -23
  129. package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
  130. package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -70
  131. package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -69
  132. package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
  133. package/templates/nextblock-template/components/FooterNavigation.tsx +32 -32
  134. package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
  135. package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
  136. package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
  137. package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
  138. package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
  139. package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -12
  140. package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -12
  141. package/templates/nextblock-template/components/blocks/ProductGridClient.tsx +114 -114
  142. package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -23
  143. package/templates/nextblock-template/components/blocks/renderers/ClientTextBlockRenderer.tsx +8 -1
  144. package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +249 -249
  145. package/templates/nextblock-template/components/blocks/renderers/SectionBlockRenderer.tsx +3 -0
  146. package/templates/nextblock-template/components/blocks/renderers/VideoEmbedBlockRenderer.tsx +33 -23
  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 -0
  151. package/templates/nextblock-template/components/media/youtube-embed-replace.tsx +32 -0
  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 -464
  157. package/templates/nextblock-template/components/submit-button.tsx +23 -23
  158. package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
  159. package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
  160. package/templates/nextblock-template/context/AuthContext.tsx +23 -23
  161. package/templates/nextblock-template/context/language-rest-client.ts +32 -32
  162. package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
  163. package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
  164. package/templates/nextblock-template/docker/kong/kong.yml +112 -112
  165. package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
  166. package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
  167. package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -202
  168. package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +246 -246
  169. package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +176 -176
  170. package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
  171. package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
  172. package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +173 -173
  173. package/templates/nextblock-template/docs/12-VERCEL-DEPLOYMENT.md +170 -170
  174. package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +151 -151
  175. package/templates/nextblock-template/docs/README.md +39 -39
  176. package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -21
  177. package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -101
  178. package/templates/nextblock-template/index.d.ts +7 -7
  179. package/templates/nextblock-template/lib/app-secrets.ts +39 -39
  180. package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
  181. package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
  182. package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
  183. package/templates/nextblock-template/lib/auth-redirects.ts +46 -46
  184. package/templates/nextblock-template/lib/blocks/ProductGridBlock.tsx +78 -78
  185. package/templates/nextblock-template/lib/blocks/README.md +13 -13
  186. package/templates/nextblock-template/lib/blocks/product-grid-data.ts +210 -210
  187. package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
  188. package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -2243
  189. package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
  190. package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
  191. package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
  192. package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
  193. package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
  194. package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
  195. package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
  196. package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
  197. package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
  198. package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
  199. package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
  200. package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
  201. package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
  202. package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
  203. package/templates/nextblock-template/lib/email/branding.ts +76 -76
  204. package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
  205. package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
  206. package/templates/nextblock-template/lib/full-backup/server.ts +743 -743
  207. package/templates/nextblock-template/lib/i18n/country-languages.ts +247 -247
  208. package/templates/nextblock-template/lib/i18n/detection.test.ts +197 -197
  209. package/templates/nextblock-template/lib/i18n/detection.ts +192 -192
  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 -0
  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 +87 -82
  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/updates/check-upstream.ts +441 -441
  237. package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
  238. package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
  239. package/templates/nextblock-template/next-env.d.ts +1 -1
  240. package/templates/nextblock-template/next.config.js +6 -0
  241. package/templates/nextblock-template/package.json +1 -1
  242. package/templates/nextblock-template/postcss.config.js +6 -6
  243. package/templates/nextblock-template/scripts/backup.js +115 -115
  244. package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
  245. package/templates/nextblock-template/scripts/restore.js +385 -385
  246. package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
  247. package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
  248. package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
  249. package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
  250. package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
  251. package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
  252. package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
  253. package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
  254. package/templates/nextblock-template/tailwind.config.js +25 -25
  255. package/templates/nextblock-template/tools/build-migrate.mjs +209 -209
  256. package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -282
  257. package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
  258. package/templates/nextblock-template/types/jsdom.d.ts +6 -6
  259. 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.