create-nextblock 0.12.8 → 0.12.11

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 (293) 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/SignUpForm.tsx +141 -141
  19. package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +46 -46
  20. package/templates/nextblock-template/app/(auth-pages)/two-factor/actions.ts +91 -91
  21. package/templates/nextblock-template/app/(auth-pages)/two-factor/components/TwoFactorForm.tsx +123 -123
  22. package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -51
  23. package/templates/nextblock-template/app/ToasterProvider.tsx +17 -17
  24. package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -7
  25. package/templates/nextblock-template/app/actions/consent.ts +57 -57
  26. package/templates/nextblock-template/app/actions/interactions.test.ts +301 -301
  27. package/templates/nextblock-template/app/actions/interactions.ts +373 -373
  28. package/templates/nextblock-template/app/actions/postActions.ts +146 -146
  29. package/templates/nextblock-template/app/actions/twoFactorEmail.ts +22 -22
  30. package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -153
  31. package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -96
  32. package/templates/nextblock-template/app/api/ai/global-agent/route.ts +964 -964
  33. package/templates/nextblock-template/app/api/brand/email-logo/route.ts +48 -48
  34. package/templates/nextblock-template/app/api/cms/check-updates/route.ts +44 -44
  35. package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -33
  36. package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -63
  37. package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3490 -3490
  38. package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +5597 -5597
  39. package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
  40. package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
  41. package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
  42. package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
  43. package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
  44. package/templates/nextblock-template/app/api/media/record/route.ts +160 -160
  45. package/templates/nextblock-template/app/api/search/route.ts +43 -43
  46. package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +441 -441
  47. package/templates/nextblock-template/app/auth/callback/route.ts +31 -31
  48. package/templates/nextblock-template/app/cart/page.tsx +7 -7
  49. package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
  50. package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -149
  51. package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
  52. package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +29 -29
  53. package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +90 -90
  54. package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
  55. package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -58
  56. package/templates/nextblock-template/app/cms/components/FeatureImageField.tsx +244 -244
  57. package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +36 -36
  58. package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
  59. package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
  60. package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
  61. package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
  62. package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
  63. package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
  64. package/templates/nextblock-template/app/cms/custom-blocks/components/BlockComposer.tsx +1522 -1522
  65. package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
  66. package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
  67. package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
  68. package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
  69. package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
  70. package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -228
  71. package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
  72. package/templates/nextblock-template/app/cms/import-export/ContentTransferControls.tsx +431 -391
  73. package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
  74. package/templates/nextblock-template/app/cms/interactions/InteractionsModerationClient.tsx +408 -408
  75. package/templates/nextblock-template/app/cms/interactions/page.tsx +51 -51
  76. package/templates/nextblock-template/app/cms/layout.tsx +73 -73
  77. package/templates/nextblock-template/app/cms/media/components/FolderNavigator.tsx +273 -273
  78. package/templates/nextblock-template/app/cms/media/components/FolderTree.tsx +122 -122
  79. package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
  80. package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -69
  81. package/templates/nextblock-template/app/cms/media/components/MediaPickerDialog.tsx +149 -149
  82. package/templates/nextblock-template/app/cms/media/components/MediaUploadForm.tsx +101 -101
  83. package/templates/nextblock-template/app/cms/navigation/components/NavigationMenuDnd.tsx +3 -3
  84. package/templates/nextblock-template/app/cms/pages/page.tsx +18 -17
  85. package/templates/nextblock-template/app/cms/posts/page.tsx +19 -18
  86. package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -12
  87. package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
  88. package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -13
  89. package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
  90. package/templates/nextblock-template/app/cms/products/page.tsx +39 -27
  91. package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -133
  92. package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -5
  93. package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
  94. package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
  95. package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
  96. package/templates/nextblock-template/app/cms/revisions/service.ts +19 -19
  97. package/templates/nextblock-template/app/cms/revisions/utils.ts +132 -132
  98. package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
  99. package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
  100. package/templates/nextblock-template/app/cms/settings/bot-protection/actions.ts +93 -93
  101. package/templates/nextblock-template/app/cms/settings/bot-protection/components/BotProtectionForm.tsx +129 -129
  102. package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
  103. package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +497 -497
  104. package/templates/nextblock-template/app/cms/settings/cortex-ai/StoredCortexAiSettingsClient.tsx +410 -410
  105. package/templates/nextblock-template/app/cms/settings/cortex-ai/actions.ts +246 -246
  106. package/templates/nextblock-template/app/cms/settings/cortex-ai/page.tsx +80 -80
  107. package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -331
  108. package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -494
  109. package/templates/nextblock-template/app/cms/settings/email/actions.ts +64 -64
  110. package/templates/nextblock-template/app/cms/settings/email/components/EmailForm.tsx +181 -181
  111. package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
  112. package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -767
  113. package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -93
  114. package/templates/nextblock-template/app/cms/settings/google-analytics/actions.ts +60 -60
  115. package/templates/nextblock-template/app/cms/settings/google-analytics/components/GoogleAnalyticsForm.tsx +129 -129
  116. package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
  117. package/templates/nextblock-template/app/cms/settings/languages/actions.ts +16 -16
  118. package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
  119. package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -339
  120. package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
  121. package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +20 -20
  122. package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
  123. package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
  124. package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
  125. package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -122
  126. package/templates/nextblock-template/app/cms/settings/privacy/actions.ts +52 -52
  127. package/templates/nextblock-template/app/cms/settings/privacy/components/PrivacyForm.tsx +148 -148
  128. package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
  129. package/templates/nextblock-template/app/cms/settings/registration/actions.ts +44 -44
  130. package/templates/nextblock-template/app/cms/settings/registration/components/RegistrationForm.tsx +65 -65
  131. package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
  132. package/templates/nextblock-template/app/cms/settings/security/actions.ts +284 -284
  133. package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +522 -522
  134. package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
  135. package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -21
  136. package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -20
  137. package/templates/nextblock-template/app/cms/users/actions.ts +222 -222
  138. package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
  139. package/templates/nextblock-template/app/cms/users/components/UserForm.tsx +44 -44
  140. package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
  141. package/templates/nextblock-template/app/lib/sitemap-utils.ts +253 -253
  142. package/templates/nextblock-template/app/profile/ProfileAccountSidebar.tsx +73 -73
  143. package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -16
  144. package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -9
  145. package/templates/nextblock-template/app/profile/account-data.ts +37 -37
  146. package/templates/nextblock-template/app/profile/account-links.ts +22 -22
  147. package/templates/nextblock-template/app/profile/account-types.ts +11 -11
  148. package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
  149. package/templates/nextblock-template/app/profile/orders/[id]/CustomerOrderDetailPageClient.tsx +79 -79
  150. package/templates/nextblock-template/app/profile/orders/[id]/page.tsx +32 -32
  151. package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
  152. package/templates/nextblock-template/app/profile/page.tsx +42 -42
  153. package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -128
  154. package/templates/nextblock-template/app/profile/password/actions.ts +59 -59
  155. package/templates/nextblock-template/app/profile/password/page.tsx +27 -27
  156. package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
  157. package/templates/nextblock-template/app/setup/layout.tsx +13 -13
  158. package/templates/nextblock-template/app/setup/page.tsx +111 -111
  159. package/templates/nextblock-template/app/sitemap.ts +130 -130
  160. package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -7
  161. package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -23
  162. package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
  163. package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -70
  164. package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -69
  165. package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
  166. package/templates/nextblock-template/components/FooterNavigation.tsx +32 -32
  167. package/templates/nextblock-template/components/GitHubLoginButton.tsx +15 -15
  168. package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
  169. package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
  170. package/templates/nextblock-template/components/PostCommentsSection.tsx +369 -369
  171. package/templates/nextblock-template/components/ProductReviewsSection.tsx +419 -419
  172. package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
  173. package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
  174. package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
  175. package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -12
  176. package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -12
  177. package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -23
  178. package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +249 -249
  179. package/templates/nextblock-template/components/blocks/types.ts +7 -7
  180. package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
  181. package/templates/nextblock-template/components/form-message.tsx +32 -32
  182. package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
  183. package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
  184. package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
  185. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
  186. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +464 -464
  187. package/templates/nextblock-template/components/submit-button.tsx +23 -23
  188. package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
  189. package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
  190. package/templates/nextblock-template/context/AuthContext.tsx +23 -23
  191. package/templates/nextblock-template/context/LanguageContext.tsx +16 -16
  192. package/templates/nextblock-template/context/language-rest-client.ts +32 -32
  193. package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
  194. package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
  195. package/templates/nextblock-template/docker/kong/kong.yml +112 -112
  196. package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
  197. package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
  198. package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -202
  199. package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +246 -246
  200. package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +176 -176
  201. package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
  202. package/templates/nextblock-template/docs/08-NEXTBLOCK-CORTEX-AI-ARCHITECTURE.md +1319 -1319
  203. package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
  204. package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +173 -173
  205. package/templates/nextblock-template/docs/12-VERCEL-DEPLOYMENT.md +170 -170
  206. package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +151 -151
  207. package/templates/nextblock-template/docs/README.md +39 -39
  208. package/templates/nextblock-template/docs/TECHNICAL_SPECIFICATION.md +12505 -12505
  209. package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -21
  210. package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -101
  211. package/templates/nextblock-template/index.d.ts +7 -7
  212. package/templates/nextblock-template/lib/app-secrets.ts +39 -39
  213. package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
  214. package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
  215. package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
  216. package/templates/nextblock-template/lib/auth/twoFactor.ts +208 -208
  217. package/templates/nextblock-template/lib/auth-redirects.ts +46 -46
  218. package/templates/nextblock-template/lib/blocks/README.md +13 -13
  219. package/templates/nextblock-template/lib/blocks/blockRegistry.ts +6 -6
  220. package/templates/nextblock-template/lib/blocks/blockTypes.ts +18 -18
  221. package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
  222. package/templates/nextblock-template/lib/cms-transfer/csv.test.ts +100 -77
  223. package/templates/nextblock-template/lib/cms-transfer/csv.ts +403 -399
  224. package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -2243
  225. package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
  226. package/templates/nextblock-template/lib/config/email-settings.ts +217 -217
  227. package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
  228. package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
  229. package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
  230. package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
  231. package/templates/nextblock-template/lib/custom-block-relation-registry.ts +256 -256
  232. package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
  233. package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
  234. package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
  235. package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
  236. package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
  237. package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
  238. package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
  239. package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
  240. package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
  241. package/templates/nextblock-template/lib/email/branding.ts +76 -76
  242. package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
  243. package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
  244. package/templates/nextblock-template/lib/full-backup/server.ts +743 -743
  245. package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
  246. package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +54 -54
  247. package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
  248. package/templates/nextblock-template/lib/onboarding/status.ts +222 -222
  249. package/templates/nextblock-template/lib/posts/readTime.ts +60 -60
  250. package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
  251. package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
  252. package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
  253. package/templates/nextblock-template/lib/privacy/types.ts +69 -69
  254. package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
  255. package/templates/nextblock-template/lib/promotions/server.ts +741 -741
  256. package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
  257. package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
  258. package/templates/nextblock-template/lib/search/server.ts +585 -585
  259. package/templates/nextblock-template/lib/search/types.ts +27 -27
  260. package/templates/nextblock-template/lib/setup/actions.ts +460 -460
  261. package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
  262. package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
  263. package/templates/nextblock-template/lib/setup/migrations-bundle.ts +37 -37
  264. package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
  265. package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
  266. package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
  267. package/templates/nextblock-template/lib/setup/types.ts +18 -18
  268. package/templates/nextblock-template/lib/site-url.ts +48 -48
  269. package/templates/nextblock-template/lib/storage/provider.ts +66 -66
  270. package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
  271. package/templates/nextblock-template/lib/updates/check-upstream.ts +441 -441
  272. package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
  273. package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
  274. package/templates/nextblock-template/next.config.js +6 -0
  275. package/templates/nextblock-template/package.json +1 -1
  276. package/templates/nextblock-template/postcss.config.js +6 -6
  277. package/templates/nextblock-template/scripts/backup.js +115 -115
  278. package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
  279. package/templates/nextblock-template/scripts/restore.js +385 -385
  280. package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
  281. package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
  282. package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
  283. package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
  284. package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
  285. package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
  286. package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
  287. package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
  288. package/templates/nextblock-template/tailwind.config.js +25 -25
  289. package/templates/nextblock-template/tools/build-migrate.mjs +209 -209
  290. package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -282
  291. package/templates/nextblock-template/types/jsdom.d.ts +6 -6
  292. package/tsconfig.base.json +3 -3
  293. package/templates/nextblock-template/tsconfig.tsbuildinfo +0 -1
@@ -1,3 +1,3 @@
1
- {
2
- "extends": "../../../../libs/utils/tsconfig.json"
3
- }
1
+ {
2
+ "extends": "../../../../libs/utils/tsconfig.json"
3
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-nextblock",
3
- "version": "0.12.8",
3
+ "version": "0.12.11",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "bin": {
package/project.json CHANGED
@@ -1,19 +1,19 @@
1
- {
2
- "name": "create-nextblock",
3
- "projectType": "application",
4
- "root": "apps/create-nextblock",
5
- "sourceRoot": "apps/create-nextblock",
6
- "targets": {
7
- "lint": {
8
- "executor": "@nx/eslint:lint",
9
- "outputs": ["{options.outputFile}"],
10
- "options": {
11
- "lintFilePatterns": [
12
- "apps/create-nextblock/bin/**/*.js",
13
- "apps/create-nextblock/scripts/**/*.js"
14
- ]
15
- }
16
- }
17
- },
18
- "tags": []
19
- }
1
+ {
2
+ "name": "create-nextblock",
3
+ "projectType": "application",
4
+ "root": "apps/create-nextblock",
5
+ "sourceRoot": "apps/create-nextblock",
6
+ "targets": {
7
+ "lint": {
8
+ "executor": "@nx/eslint:lint",
9
+ "outputs": ["{options.outputFile}"],
10
+ "options": {
11
+ "lintFilePatterns": [
12
+ "apps/create-nextblock/bin/**/*.js",
13
+ "apps/create-nextblock/scripts/**/*.js"
14
+ ]
15
+ }
16
+ }
17
+ },
18
+ "tags": []
19
+ }
@@ -1,11 +1,11 @@
1
- chrome >= 109
2
- edge >= 109
3
- firefox >= 115
4
- safari >= 15.4
5
- ios_saf >= 15.4
6
- and_chr >= 109
7
- and_ff >= 115
8
- samsung >= 21
9
- opera >= 95
10
- not dead
11
- not op_mini all
1
+ chrome >= 109
2
+ edge >= 109
3
+ firefox >= 115
4
+ safari >= 15.4
5
+ ios_saf >= 15.4
6
+ and_chr >= 109
7
+ and_ff >= 115
8
+ samsung >= 21
9
+ opera >= 95
10
+ not dead
11
+ not op_mini all
@@ -1,23 +1,23 @@
1
- # Keep the build context lean; deps are reinstalled in the image and secrets stay out.
2
- node_modules
3
- .git
4
- .github
5
- .next
6
- out
7
- dist
8
- coverage
9
- tmp
10
- backup
11
- backups
12
- *.log
13
- npm-debug.log*
14
-
15
- # Secrets never enter the image (NEXT_PUBLIC_* arrive as build args).
16
- .env
17
- .env.*
18
- !.env.docker.example
19
-
20
- # Not needed inside the app image (mounted/used by other compose services instead).
21
- docker
22
- supabase/.branches
23
- supabase/.temp
1
+ # Keep the build context lean; deps are reinstalled in the image and secrets stay out.
2
+ node_modules
3
+ .git
4
+ .github
5
+ .next
6
+ out
7
+ dist
8
+ coverage
9
+ tmp
10
+ backup
11
+ backups
12
+ *.log
13
+ npm-debug.log*
14
+
15
+ # Secrets never enter the image (NEXT_PUBLIC_* arrive as build args).
16
+ .env
17
+ .env.*
18
+ !.env.docker.example
19
+
20
+ # Not needed inside the app image (mounted/used by other compose services instead).
21
+ docker
22
+ supabase/.branches
23
+ supabase/.temp
@@ -1,34 +1,34 @@
1
- # apps/nextblock
2
-
3
- `apps/nextblock` is the canonical NextBlock™ application. It contains:
4
-
5
- - the public site
6
- - the authenticated CMS
7
- - checkout and webhook routes
8
- - cron routes
9
- - the route tree used as the source for the scaffold template
10
-
11
- If you are trying to understand current runtime behavior, start here before you
12
- look at generated template output.
13
-
14
- ## Related Docs
15
-
16
- - [Project Overview](../../docs/01-PROJECT-OVERVIEW.md)
17
- - [Ecommerce Capabilities](../../docs/02-ECOMMERCE-CAPABILITIES.md)
18
- - [CMS and Editor](../../docs/03-CMS-AND-EDITOR.md)
19
- - [Database and Auth](../../docs/04-DATABASE-AND-AUTH.md)
20
- - [Developer Guide](../../docs/05-DEVELOPER-GUIDE.md)
21
- - [CLI and Scaffolding](../../docs/06-CLI-AND-SCAFFOLDING.md)
22
-
23
- ## Common Workflows
24
-
25
- From the repo root:
26
-
27
- ```bash
28
- npx nx serve nextblock
29
- npx nx build nextblock
30
- npx nx lint nextblock --skip-nx-cache
31
- ```
32
-
33
- Use the root docs for architecture and workflow details instead of maintaining a
34
- second app-specific guide here.
1
+ # apps/nextblock
2
+
3
+ `apps/nextblock` is the canonical NextBlock™ application. It contains:
4
+
5
+ - the public site
6
+ - the authenticated CMS
7
+ - checkout and webhook routes
8
+ - cron routes
9
+ - the route tree used as the source for the scaffold template
10
+
11
+ If you are trying to understand current runtime behavior, start here before you
12
+ look at generated template output.
13
+
14
+ ## Related Docs
15
+
16
+ - [Project Overview](../../docs/01-PROJECT-OVERVIEW.md)
17
+ - [Ecommerce Capabilities](../../docs/02-ECOMMERCE-CAPABILITIES.md)
18
+ - [CMS and Editor](../../docs/03-CMS-AND-EDITOR.md)
19
+ - [Database and Auth](../../docs/04-DATABASE-AND-AUTH.md)
20
+ - [Developer Guide](../../docs/05-DEVELOPER-GUIDE.md)
21
+ - [CLI and Scaffolding](../../docs/06-CLI-AND-SCAFFOLDING.md)
22
+
23
+ ## Common Workflows
24
+
25
+ From the repo root:
26
+
27
+ ```bash
28
+ npx nx serve nextblock
29
+ npx nx build nextblock
30
+ npx nx lint nextblock --skip-nx-cache
31
+ ```
32
+
33
+ Use the root docs for architecture and workflow details instead of maintaining a
34
+ second app-specific guide here.
@@ -1,9 +1,9 @@
1
- export default async function Layout({
2
- children,
3
- }: {
4
- children: React.ReactNode;
5
- }) {
6
- return (
7
- <div className="max-w-7xl mx-auto flex flex-col gap-12 items-start mb-4">{children}</div>
8
- );
9
- }
1
+ export default async function Layout({
2
+ children,
3
+ }: {
4
+ children: React.ReactNode;
5
+ }) {
6
+ return (
7
+ <div className="max-w-7xl mx-auto flex flex-col gap-12 items-start mb-4">{children}</div>
8
+ );
9
+ }
@@ -1,27 +1,27 @@
1
- import { createClient } from '@nextblock-cms/db/server';
2
- import { redirect } from 'next/navigation';
3
- import { resolvePostAuthRedirect } from '../../../lib/auth-redirects';
4
-
5
- export default async function PostSignIn({
6
- searchParams,
7
- }: {
8
- searchParams: Promise<{ redirect_to?: string }>;
9
- }) {
10
- const params = await searchParams;
11
- const supabase = createClient();
12
- const {
13
- data: { user },
14
- } = await supabase.auth.getUser();
15
-
16
- if (!user) {
17
- redirect('/sign-in');
18
- }
19
-
20
- const { data: profile } = await supabase
21
- .from('profiles')
22
- .select('role, full_name')
23
- .eq('id', user.id)
24
- .single();
25
-
26
- redirect(resolvePostAuthRedirect(profile ?? null, params.redirect_to));
27
- }
1
+ import { createClient } from '@nextblock-cms/db/server';
2
+ import { redirect } from 'next/navigation';
3
+ import { resolvePostAuthRedirect } from '../../../lib/auth-redirects';
4
+
5
+ export default async function PostSignIn({
6
+ searchParams,
7
+ }: {
8
+ searchParams: Promise<{ redirect_to?: string }>;
9
+ }) {
10
+ const params = await searchParams;
11
+ const supabase = createClient();
12
+ const {
13
+ data: { user },
14
+ } = await supabase.auth.getUser();
15
+
16
+ if (!user) {
17
+ redirect('/sign-in');
18
+ }
19
+
20
+ const { data: profile } = await supabase
21
+ .from('profiles')
22
+ .select('role, full_name')
23
+ .eq('id', user.id)
24
+ .single();
25
+
26
+ redirect(resolvePostAuthRedirect(profile ?? null, params.redirect_to));
27
+ }
@@ -1,141 +1,141 @@
1
- 'use client';
2
-
3
- import { signUpAction } from "../../actions";
4
- import { FormMessage, Message } from "../../../components/form-message";
5
- import { SubmitButton } from "../../../components/submit-button";
6
- import { Button, Input, Label } from "@nextblock-cms/ui";
7
- import Link from "next/link";
8
- import { useTranslations } from "@nextblock-cms/utils";
9
- import { useSearchParams } from "next/navigation";
10
- import { GitHubLoginButton } from "../../../components/GitHubLoginButton";
11
- import { ArrowRight, CheckCircle2, Mail } from "lucide-react";
12
-
13
- import { SandboxCredentialsAlert } from "../../../components/SandboxCredentialsAlert";
14
- import { AuthBotProtection } from "../../../components/auth/AuthBotProtection";
15
-
16
- type BotProtectionProvider = 'none' | 'turnstile' | 'recaptcha';
17
-
18
- interface SignUpFormProps {
19
- botProtection: { provider: BotProtectionProvider; siteKey: string };
20
- scriptNonce?: string;
21
- }
22
-
23
- function getMessage(searchParams: URLSearchParams): Message | undefined {
24
- if (searchParams.has('error')) {
25
- const error = searchParams.get('error');
26
- if (error) return { error };
27
- }
28
- if (searchParams.has('success')) {
29
- const success = searchParams.get('success');
30
- if (success) return { success };
31
- }
32
- if (searchParams.has('message')) {
33
- const message = searchParams.get('message');
34
- if (message) return { message };
35
- }
36
- return undefined;
37
- }
38
-
39
- export default function SignUpForm({ botProtection, scriptNonce }: SignUpFormProps) {
40
- const { t } = useTranslations();
41
- const searchParams = useSearchParams();
42
- const formMessage = getMessage(searchParams);
43
- const successKey = searchParams.get('success');
44
-
45
- if (successKey) {
46
- return (
47
- <div className="flex-1 flex flex-col w-full max-w-160 mx-auto">
48
- <div className="mb-4 flex h-11 w-11 items-center justify-center rounded-full bg-primary/10 text-primary">
49
- <CheckCircle2 className="h-5 w-5" />
50
- </div>
51
- <p className="text-xs font-medium uppercase tracking-[0.18em] text-muted-foreground">
52
- {t('auth.signup_success_badge')}
53
- </p>
54
- <h1 className="mt-3 text-2xl font-medium">{t('auth.signup_success_title')}</h1>
55
- <p className="mt-2 text-sm leading-6 text-muted-foreground">
56
- {t(successKey)}
57
- </p>
58
-
59
- <div className="mt-8 rounded-lg border p-5">
60
- <div className="flex items-start gap-3">
61
- <div className="mt-0.5 rounded-full bg-muted p-2 text-muted-foreground">
62
- <Mail className="h-4 w-4" />
63
- </div>
64
- <div className="space-y-3 text-sm text-muted-foreground">
65
- <p>{t('auth.signup_success_step_confirm')}</p>
66
- <p>{t('auth.signup_success_step_profile')}</p>
67
- <p>{t('auth.signup_success_step_spam')}</p>
68
- </div>
69
- </div>
70
- </div>
71
-
72
- <div className="mt-6 flex flex-col gap-3 sm:flex-row">
73
- <Button asChild>
74
- <Link href="/sign-in">
75
- {t('auth.back_to_sign_in')}
76
- <ArrowRight className="ml-2 h-4 w-4" />
77
- </Link>
78
- </Button>
79
- <Button asChild variant="outline">
80
- <Link href="/sign-up">{t('auth.signup_use_different_email')}</Link>
81
- </Button>
82
- </div>
83
- </div>
84
- );
85
- }
86
-
87
- return (
88
- <div className="flex-1 flex flex-col w-full max-w-160 mx-auto">
89
- <form className="flex flex-col">
90
- <SandboxCredentialsAlert />
91
- <h1 className="text-2xl font-medium">{t('sign_up')}</h1>
92
- <p className="mt-2 text-sm leading-6 text-muted-foreground">
93
- {t('auth.signup_form_description')}
94
- </p>
95
- <p className="text-sm text-foreground">
96
- {t('already_have_account')}{" "}
97
- <Link className="text-foreground font-medium underline" href="/sign-in">
98
- {t('sign_in')}
99
- </Link>
100
- </p>
101
-
102
- <div className="mt-8 flex flex-col gap-2">
103
- <GitHubLoginButton t={t} redirectTo="/profile" />
104
-
105
- <div className="relative py-2">
106
- <div className="absolute inset-0 flex items-center">
107
- <span className="w-full border-t" />
108
- </div>
109
- <div className="relative flex justify-center text-xs uppercase">
110
- <span className="bg-background px-2 text-muted-foreground">
111
- {t('or_continue_with') || "Or continue with"}
112
- </span>
113
- </div>
114
- </div>
115
-
116
- <div className="flex flex-col gap-2 [&>input]:mb-3">
117
- <Label htmlFor="email">{t('email')}</Label>
118
- <Input name="email" placeholder={t('you_at_example_com')} required />
119
- <Label htmlFor="password">{t('password')}</Label>
120
- <Input
121
- type="password"
122
- name="password"
123
- placeholder={t('your_password')}
124
- minLength={6}
125
- required
126
- />
127
- <AuthBotProtection
128
- provider={botProtection.provider}
129
- siteKey={botProtection.siteKey}
130
- scriptNonce={scriptNonce}
131
- />
132
- <SubmitButton formAction={signUpAction} pendingText={t('signing_up_pending')}>
133
- {t('sign_up')}
134
- </SubmitButton>
135
- <FormMessage message={formMessage} />
136
- </div>
137
- </div>
138
- </form>
139
- </div>
140
- );
141
- }
1
+ 'use client';
2
+
3
+ import { signUpAction } from "../../actions";
4
+ import { FormMessage, Message } from "../../../components/form-message";
5
+ import { SubmitButton } from "../../../components/submit-button";
6
+ import { Button, Input, Label } from "@nextblock-cms/ui";
7
+ import Link from "next/link";
8
+ import { useTranslations } from "@nextblock-cms/utils";
9
+ import { useSearchParams } from "next/navigation";
10
+ import { GitHubLoginButton } from "../../../components/GitHubLoginButton";
11
+ import { ArrowRight, CheckCircle2, Mail } from "lucide-react";
12
+
13
+ import { SandboxCredentialsAlert } from "../../../components/SandboxCredentialsAlert";
14
+ import { AuthBotProtection } from "../../../components/auth/AuthBotProtection";
15
+
16
+ type BotProtectionProvider = 'none' | 'turnstile' | 'recaptcha';
17
+
18
+ interface SignUpFormProps {
19
+ botProtection: { provider: BotProtectionProvider; siteKey: string };
20
+ scriptNonce?: string;
21
+ }
22
+
23
+ function getMessage(searchParams: URLSearchParams): Message | undefined {
24
+ if (searchParams.has('error')) {
25
+ const error = searchParams.get('error');
26
+ if (error) return { error };
27
+ }
28
+ if (searchParams.has('success')) {
29
+ const success = searchParams.get('success');
30
+ if (success) return { success };
31
+ }
32
+ if (searchParams.has('message')) {
33
+ const message = searchParams.get('message');
34
+ if (message) return { message };
35
+ }
36
+ return undefined;
37
+ }
38
+
39
+ export default function SignUpForm({ botProtection, scriptNonce }: SignUpFormProps) {
40
+ const { t } = useTranslations();
41
+ const searchParams = useSearchParams();
42
+ const formMessage = getMessage(searchParams);
43
+ const successKey = searchParams.get('success');
44
+
45
+ if (successKey) {
46
+ return (
47
+ <div className="flex-1 flex flex-col w-full max-w-160 mx-auto">
48
+ <div className="mb-4 flex h-11 w-11 items-center justify-center rounded-full bg-primary/10 text-primary">
49
+ <CheckCircle2 className="h-5 w-5" />
50
+ </div>
51
+ <p className="text-xs font-medium uppercase tracking-[0.18em] text-muted-foreground">
52
+ {t('auth.signup_success_badge')}
53
+ </p>
54
+ <h1 className="mt-3 text-2xl font-medium">{t('auth.signup_success_title')}</h1>
55
+ <p className="mt-2 text-sm leading-6 text-muted-foreground">
56
+ {t(successKey)}
57
+ </p>
58
+
59
+ <div className="mt-8 rounded-lg border p-5">
60
+ <div className="flex items-start gap-3">
61
+ <div className="mt-0.5 rounded-full bg-muted p-2 text-muted-foreground">
62
+ <Mail className="h-4 w-4" />
63
+ </div>
64
+ <div className="space-y-3 text-sm text-muted-foreground">
65
+ <p>{t('auth.signup_success_step_confirm')}</p>
66
+ <p>{t('auth.signup_success_step_profile')}</p>
67
+ <p>{t('auth.signup_success_step_spam')}</p>
68
+ </div>
69
+ </div>
70
+ </div>
71
+
72
+ <div className="mt-6 flex flex-col gap-3 sm:flex-row">
73
+ <Button asChild>
74
+ <Link href="/sign-in">
75
+ {t('auth.back_to_sign_in')}
76
+ <ArrowRight className="ml-2 h-4 w-4" />
77
+ </Link>
78
+ </Button>
79
+ <Button asChild variant="outline">
80
+ <Link href="/sign-up">{t('auth.signup_use_different_email')}</Link>
81
+ </Button>
82
+ </div>
83
+ </div>
84
+ );
85
+ }
86
+
87
+ return (
88
+ <div className="flex-1 flex flex-col w-full max-w-160 mx-auto">
89
+ <form className="flex flex-col">
90
+ <SandboxCredentialsAlert />
91
+ <h1 className="text-2xl font-medium">{t('sign_up')}</h1>
92
+ <p className="mt-2 text-sm leading-6 text-muted-foreground">
93
+ {t('auth.signup_form_description')}
94
+ </p>
95
+ <p className="text-sm text-foreground">
96
+ {t('already_have_account')}{" "}
97
+ <Link className="text-foreground font-medium underline" href="/sign-in">
98
+ {t('sign_in')}
99
+ </Link>
100
+ </p>
101
+
102
+ <div className="mt-8 flex flex-col gap-2">
103
+ <GitHubLoginButton t={t} redirectTo="/profile" />
104
+
105
+ <div className="relative py-2">
106
+ <div className="absolute inset-0 flex items-center">
107
+ <span className="w-full border-t" />
108
+ </div>
109
+ <div className="relative flex justify-center text-xs uppercase">
110
+ <span className="bg-background px-2 text-muted-foreground">
111
+ {t('or_continue_with') || "Or continue with"}
112
+ </span>
113
+ </div>
114
+ </div>
115
+
116
+ <div className="flex flex-col gap-2 [&>input]:mb-3">
117
+ <Label htmlFor="email">{t('email')}</Label>
118
+ <Input name="email" placeholder={t('you_at_example_com')} required />
119
+ <Label htmlFor="password">{t('password')}</Label>
120
+ <Input
121
+ type="password"
122
+ name="password"
123
+ placeholder={t('your_password')}
124
+ minLength={6}
125
+ required
126
+ />
127
+ <AuthBotProtection
128
+ provider={botProtection.provider}
129
+ siteKey={botProtection.siteKey}
130
+ scriptNonce={scriptNonce}
131
+ />
132
+ <SubmitButton formAction={signUpAction} pendingText={t('signing_up_pending')}>
133
+ {t('sign_up')}
134
+ </SubmitButton>
135
+ <FormMessage message={formMessage} />
136
+ </div>
137
+ </div>
138
+ </form>
139
+ </div>
140
+ );
141
+ }
@@ -1,46 +1,46 @@
1
- import { Suspense } from "react";
2
- import { headers } from "next/headers";
3
- import { createClient } from "@nextblock-cms/db/server";
4
- import SignUpForm from "./SignUpForm";
5
-
6
- type BotProtectionProvider = 'none' | 'turnstile' | 'recaptcha';
7
-
8
- // Server wrapper: resolves the site-wide bot-protection provider + site key
9
- // (CMS → Settings → Bot Protection) and the CSP nonce, then hands them to the
10
- // interactive client form. Mirrors the read in components/BlockRenderer.tsx.
11
- export default async function SignUpPage() {
12
- let scriptNonce = '';
13
- try {
14
- scriptNonce = (await headers()).get('x-nonce') || '';
15
- } catch (e) {
16
- console.error('[Bot Protection] Error loading CSP nonce on sign-up page:', e);
17
- }
18
-
19
- let botProtection: { provider: BotProtectionProvider; siteKey: string } = {
20
- provider: 'none',
21
- siteKey: '',
22
- };
23
- try {
24
- const supabase = createClient();
25
- const { data: publicSetting } = await supabase
26
- .from('site_settings')
27
- .select('value')
28
- .eq('key', 'bot_protection_public')
29
- .maybeSingle();
30
- if (publicSetting?.value) {
31
- const publicVal = publicSetting.value as Record<string, any>;
32
- botProtection = {
33
- provider: publicVal.provider || 'none',
34
- siteKey: publicVal.siteKey || '',
35
- };
36
- }
37
- } catch (e) {
38
- console.error('[Bot Protection] Error loading settings on sign-up page:', e);
39
- }
40
-
41
- return (
42
- <Suspense fallback={null}>
43
- <SignUpForm botProtection={botProtection} scriptNonce={scriptNonce} />
44
- </Suspense>
45
- );
46
- }
1
+ import { Suspense } from "react";
2
+ import { headers } from "next/headers";
3
+ import { createClient } from "@nextblock-cms/db/server";
4
+ import SignUpForm from "./SignUpForm";
5
+
6
+ type BotProtectionProvider = 'none' | 'turnstile' | 'recaptcha';
7
+
8
+ // Server wrapper: resolves the site-wide bot-protection provider + site key
9
+ // (CMS → Settings → Bot Protection) and the CSP nonce, then hands them to the
10
+ // interactive client form. Mirrors the read in components/BlockRenderer.tsx.
11
+ export default async function SignUpPage() {
12
+ let scriptNonce = '';
13
+ try {
14
+ scriptNonce = (await headers()).get('x-nonce') || '';
15
+ } catch (e) {
16
+ console.error('[Bot Protection] Error loading CSP nonce on sign-up page:', e);
17
+ }
18
+
19
+ let botProtection: { provider: BotProtectionProvider; siteKey: string } = {
20
+ provider: 'none',
21
+ siteKey: '',
22
+ };
23
+ try {
24
+ const supabase = createClient();
25
+ const { data: publicSetting } = await supabase
26
+ .from('site_settings')
27
+ .select('value')
28
+ .eq('key', 'bot_protection_public')
29
+ .maybeSingle();
30
+ if (publicSetting?.value) {
31
+ const publicVal = publicSetting.value as Record<string, any>;
32
+ botProtection = {
33
+ provider: publicVal.provider || 'none',
34
+ siteKey: publicVal.siteKey || '',
35
+ };
36
+ }
37
+ } catch (e) {
38
+ console.error('[Bot Protection] Error loading settings on sign-up page:', e);
39
+ }
40
+
41
+ return (
42
+ <Suspense fallback={null}>
43
+ <SignUpForm botProtection={botProtection} scriptNonce={scriptNonce} />
44
+ </Suspense>
45
+ );
46
+ }