@nextblock-cms/db 0.11.3 → 0.12.1

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 (62) hide show
  1. package/lib/supabase/server.d.ts +9 -0
  2. package/lib/supabase/types.d.ts +9 -0
  3. package/package.json +1 -1
  4. package/supabase/migrations/00000000000000_baseline_schema.sql +2454 -0
  5. package/supabase/migrations/00000000000001_baseline_constraints_and_indexes.sql +1071 -0
  6. package/supabase/migrations/00000000000002_baseline_security_and_grants.sql +1335 -0
  7. package/supabase/migrations/00000000000003_baseline_seed.sql +468 -0
  8. package/supabase/migrations/00000000000004_default_logo_email_safe.sql +24 -0
  9. package/supabase/migrations/00000000000005_add_custom_canonical.sql +13 -0
  10. package/supabase/migrations/00000000000006_home_live_demo_promo.sql +67 -0
  11. package/supabase/migrations/00000000000007_home_live_demo_promo_copy_fix.sql +49 -0
  12. package/supabase/templates/confirmation.html +1 -1
  13. package/supabase/templates/email_change.html +1 -1
  14. package/supabase/templates/invite.html +1 -1
  15. package/supabase/templates/magic_link.html +1 -1
  16. package/supabase/templates/reauthentication.html +1 -1
  17. package/supabase/templates/recovery.html +1 -1
  18. package/supabase/migrations/00000000000000_setup_foundation_and_enums.sql +0 -40
  19. package/supabase/migrations/00000000000001_setup_cms_core.sql +0 -124
  20. package/supabase/migrations/00000000000002_setup_content_tables.sql +0 -138
  21. package/supabase/migrations/00000000000003_setup_catalog_and_licensing.sql +0 -160
  22. package/supabase/migrations/00000000000004_setup_fulfillment_shipping_taxes_and_currencies.sql +0 -797
  23. package/supabase/migrations/00000000000005_setup_functions_and_triggers.sql +0 -767
  24. package/supabase/migrations/00000000000006_setup_rls_and_grants.sql +0 -872
  25. package/supabase/migrations/00000000000007_setup_indexes.sql +0 -158
  26. package/supabase/migrations/00000000000008_seed_platform_defaults.sql +0 -155
  27. package/supabase/migrations/00000000000009_seed_translations.sql +0 -801
  28. package/supabase/migrations/00000000000010_seed_content_scaffold.sql +0 -1088
  29. package/supabase/migrations/00000000000011_setup_cortex_ai_settings.sql +0 -81
  30. package/supabase/migrations/00000000000012_setup_commerce_coupons.sql +0 -275
  31. package/supabase/migrations/00000000000013_setup_cortex_ai_db_mutation_audit.sql +0 -47
  32. package/supabase/migrations/00000000000014_setup_content_drafts.sql +0 -119
  33. package/supabase/migrations/00000000000015_setup_product_drafts.sql +0 -97
  34. package/supabase/migrations/00000000000016_add_feature_image_to_pages.sql +0 -8
  35. package/supabase/migrations/00000000000017_add_product_blocks.sql +0 -118
  36. package/supabase/migrations/00000000000018_setup_bot_protection_settings.sql +0 -77
  37. package/supabase/migrations/00000000000019_add_product_categories.sql +0 -64
  38. package/supabase/migrations/00000000000020_add_category_translations.sql +0 -10
  39. package/supabase/migrations/00000000000021_migrate_hero_blocks_to_sections.sql +0 -29
  40. package/supabase/migrations/00000000000022_seed_cortex_ai_guide_post.sql +0 -184
  41. package/supabase/migrations/00000000000023_setup_custom_block_definitions.sql +0 -183
  42. package/supabase/migrations/00000000000024_setup_ucp_cart_sessions.sql +0 -72
  43. package/supabase/migrations/00000000000025_add_sale_schedule_columns.sql +0 -406
  44. package/supabase/migrations/00000000000026_seed_on_sale_translation.sql +0 -9
  45. package/supabase/migrations/00000000000027_setup_privacy_and_mfa.sql +0 -479
  46. package/supabase/migrations/00000000000028_clear_advisor_warnings.sql +0 -93
  47. package/supabase/migrations/00000000000029_refresh_setup_article.sql +0 -252
  48. package/supabase/migrations/00000000000030_setup_system_configuration.sql +0 -80
  49. package/supabase/migrations/00000000000031_seed_footer_navigation.sql +0 -85
  50. package/supabase/migrations/00000000000032_neutralize_seeded_contact_emails.sql +0 -34
  51. package/supabase/migrations/00000000000033_setup_config_settings.sql +0 -99
  52. package/supabase/migrations/00000000000034_enable_staff_2fa_reminder_default.sql +0 -15
  53. package/supabase/migrations/00000000000035_reassert_advisor_fixes.sql +0 -33
  54. package/supabase/migrations/00000000000036_setup_system_alerts.sql +0 -72
  55. package/supabase/migrations/00000000000037_refresh_setup_article_install_paths.sql +0 -317
  56. package/supabase/migrations/00000000000038_seed_consent_banner_translations.sql +0 -126
  57. package/supabase/migrations/00000000000039_setup_interactions.sql +0 -153
  58. package/supabase/migrations/00000000000040_add_profiles_fk_to_interactions.sql +0 -8
  59. package/supabase/migrations/00000000000041_seed_interactions_translations.sql +0 -145
  60. package/supabase/migrations/00000000000042_seed_deploy_to_vercel_ctas.sql +0 -72
  61. package/supabase/migrations/00000000000043_swap_home_hero_media_to_youtube.sql +0 -42
  62. package/supabase/migrations/00000000000044_swap_article_nx_graph_for_youtube.sql +0 -66
@@ -1,72 +0,0 @@
1
- -- System notification layer for the automated upstream-update architecture.
2
- --
3
- -- `system_alerts` is the single sink that every update track writes into:
4
- -- * Track A (the .github/workflows/nextblock-sync.yml GitHub Action) inserts a
5
- -- 'merge_conflict' row via the Supabase REST API when an upstream merge can't be
6
- -- auto-resolved, so the CMS dashboard can point an operator at GitHub to sort it.
7
- -- * Track B (the runtime update engine, app/api/cms/check-updates) inserts a
8
- -- 'runtime_update_available' row for non-git installs (npm create / local / Docker)
9
- -- with a download link to the latest verified release tarball.
10
- -- The dashboard banner (cms/layout.tsx -> SystemAlertsBanner) renders unresolved rows.
11
- --
12
- -- Writers always use the service-role key (REST API / getServiceRoleSupabaseClient),
13
- -- which bypasses RLS; RLS below only governs who can READ/RESOLVE from the dashboard.
14
-
15
- create table if not exists public.system_alerts (
16
- id uuid primary key default gen_random_uuid(),
17
- -- The notification kind. Constrained to the two tracks this system emits; widen the
18
- -- CHECK in a later migration if new alert kinds are added.
19
- alert_type text not null check (alert_type in ('merge_conflict', 'runtime_update_available')),
20
- title text not null,
21
- message text not null,
22
- -- Structured context for deep-linking the banner CTA, e.g.
23
- -- merge_conflict -> { "repo": "owner/name", "branch": "...", "action_url": "https://github.com/owner/name/branches" }
24
- -- runtime_update_available -> { "latest_version": "0.11.0", "download_url": "https://github.com/.../v0.11.0.tar.gz" }
25
- metadata jsonb not null default '{}'::jsonb,
26
- is_resolved boolean not null default false,
27
- resolved_at timestamptz,
28
- created_at timestamptz not null default now(),
29
- updated_at timestamptz not null default now()
30
- );
31
-
32
- comment on table public.system_alerts is 'System notifications for the automated upstream-update architecture (merge conflicts, runtime updates available). Written by service-role; read by ADMINs.';
33
- comment on column public.system_alerts.alert_type is 'One of: merge_conflict, runtime_update_available.';
34
- comment on column public.system_alerts.metadata is 'Structured deep-link context for the dashboard banner CTA (repo/branch/action_url or latest_version/download_url).';
35
- comment on column public.system_alerts.is_resolved is 'When true the alert is hidden from the dashboard banner.';
36
-
37
- -- Banner query: unresolved alerts, newest first.
38
- create index if not exists idx_system_alerts_unresolved
39
- on public.system_alerts (is_resolved, created_at desc);
40
-
41
- -- Keep updated_at fresh on every mutation (same helper used across the schema).
42
- drop trigger if exists trg_system_alerts_updated_at on public.system_alerts;
43
- create trigger trg_system_alerts_updated_at
44
- before update on public.system_alerts
45
- for each row
46
- execute function public.set_current_timestamp_updated_at();
47
-
48
- alter table public.system_alerts enable row level security;
49
-
50
- -- Only authenticated ADMINs may view alerts in the dashboard. WRITERs and the public
51
- -- anon role get zero rows (RLS default-deny: no policy applies to them).
52
- drop policy if exists system_alerts_select_admin on public.system_alerts;
53
- create policy system_alerts_select_admin
54
- on public.system_alerts
55
- for select
56
- to authenticated
57
- using ((select public.get_current_user_role()) = 'ADMIN');
58
-
59
- -- ADMINs may resolve (dismiss) alerts from the dashboard. Inserts are service-role only
60
- -- (RLS-bypassing), so there is intentionally no INSERT policy.
61
- drop policy if exists system_alerts_update_admin on public.system_alerts;
62
- create policy system_alerts_update_admin
63
- on public.system_alerts
64
- for update
65
- to authenticated
66
- using ((select public.get_current_user_role()) = 'ADMIN')
67
- with check ((select public.get_current_user_role()) = 'ADMIN');
68
-
69
- -- Base table privileges (RLS still filters rows on top of these). Mirrors the grant
70
- -- model the rest of the schema uses; service_role keeps full access for the writers.
71
- grant select, update on public.system_alerts to authenticated;
72
- grant all on public.system_alerts to service_role;
@@ -1,317 +0,0 @@
1
- -- Rewrite the seeded "How to Setup NextBlock" tutorial (EN + FR) around the four
2
- -- current installation paths:
3
- -- 1. One-click Deploy on Vercel (Supabase Marketplace integration, zero env vars),
4
- -- 2. npm create nextblock (standalone app, browser /setup wizard on :3000),
5
- -- 3. git clone -> npm install -> npx nx serve nextblock (browser /setup wizard on :4200),
6
- -- 4. git clone -> npm install -> npm run docker:setup (fully local, non-interactive).
7
- --
8
- -- Also sets the posts' meta_title / meta_description (previously unset — SEO title fell
9
- -- back to posts.title and the description to posts.subtitle) and refreshes
10
- -- title / subtitle / excerpt for both languages. Slugs are intentionally unchanged:
11
- -- 'how-to-setup-nextblock' and 'comment-configurer-nextblock' are public URLs and are
12
- -- also mapped to the tutorial presentation (post-article--tutorial) by slug.
13
- --
14
- -- Forward-only and idempotent: it updates the two posts rows and replaces their single
15
- -- text block (same pattern as 00000000000029). Safe to re-run; a no-op if the posts
16
- -- do not exist.
17
-
18
- -- EN post metadata
19
- UPDATE public.posts
20
- SET
21
- title = 'How to Install NextBlock: Every Setup Option Explained',
22
- subtitle = 'Four ways to launch NextBlock: a one-click Vercel deploy, npm create nextblock, git clone with the browser setup wizard, or a fully local Docker stack.',
23
- excerpt = 'Every way to install NextBlock — one-click cloud deploy, CLI scaffold, git clone, or self-hosted Docker — with copy-paste steps for each.',
24
- meta_title = 'How to Install NextBlock CMS — Vercel, CLI, Git or Docker',
25
- meta_description = 'Install NextBlock in minutes — one-click Vercel deploy, npm create nextblock, git clone, or self-hosted Docker. No config files, no manual SQL.'
26
- WHERE slug = 'how-to-setup-nextblock';
27
-
28
- -- FR post metadata
29
- UPDATE public.posts
30
- SET
31
- title = $meta$Installer NextBlock : toutes les options expliquées$meta$,
32
- subtitle = $meta$Quatre façons de lancer NextBlock : déploiement Vercel en un clic, npm create nextblock, git clone avec l'assistant dans le navigateur, ou une pile Docker 100 % locale.$meta$,
33
- excerpt = $meta$Toutes les façons d'installer NextBlock — cloud en un clic, CLI, git clone ou Docker auto-hébergé — avec les étapes à copier-coller.$meta$,
34
- meta_title = $meta$Installer NextBlock — Vercel, CLI, Git ou Docker$meta$,
35
- meta_description = $meta$Installez NextBlock en quelques minutes : déploiement Vercel en un clic, npm create nextblock, git clone ou Docker auto-hébergé. Sans config ni SQL.$meta$
36
- WHERE slug = 'comment-configurer-nextblock';
37
-
38
- WITH target_posts AS (
39
- SELECT id, language_id, slug
40
- FROM public.posts
41
- WHERE slug IN ('how-to-setup-nextblock', 'comment-configurer-nextblock')
42
- ),
43
- purged AS (
44
- DELETE FROM public.blocks
45
- WHERE post_id IN (SELECT id FROM target_posts)
46
- )
47
- INSERT INTO public.blocks (post_id, language_id, block_type, content, "order")
48
-
49
- -- EN: How to Install NextBlock
50
- SELECT tp.id, tp.language_id, 'text', jsonb_build_object('html_content',
51
- $$<p class='text-lg leading-8 text-slate-700 dark:text-slate-300'>NextBlock is an open-source, AI-native Next.js CMS built on Supabase — and installing it no longer involves config files, terminal wizards, or manual SQL. There are four ways to get running, and they all end in the same place: a browser <strong>setup wizard</strong> that connects your database, configures media storage, and creates your admin account for you. Pick the path that fits, follow the steps, and you will be publishing in minutes.</p>
52
-
53
- <div class='grid gap-5 md:grid-cols-2 my-10'>
54
- <a href='#one-click-vercel' class='block rounded-[1.75rem] border border-blue-200 bg-blue-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-blue-500/20 dark:bg-blue-500/10'>
55
- <p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-blue-700 dark:text-blue-200'>Fastest &middot; about 3 minutes</p>
56
- <h3 class='mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white'>One-click deploy on Vercel</h3>
57
- <p class='mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300'>A live production site with a managed database. No terminal, no environment variables, nothing to copy.</p>
58
- </a>
59
- <a href='#npm-create' class='block rounded-[1.75rem] border border-violet-200 bg-violet-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-violet-500/20 dark:bg-violet-500/10'>
60
- <p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200'>Recommended for new projects</p>
61
- <h3 class='mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white'>npm create nextblock</h3>
62
- <p class='mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300'>Scaffold a standalone Next.js app with NextBlock built in, then finish setup in your browser.</p>
63
- </a>
64
- <a href='#git-clone' class='block rounded-[1.75rem] border border-emerald-200 bg-emerald-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-emerald-500/20 dark:bg-emerald-500/10'>
65
- <p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200'>Full source code</p>
66
- <h3 class='mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white'>Clone the repository</h3>
67
- <p class='mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300'>Run the complete monorepo — the CMS, every package, and the docs. Made for contributors and platform teams.</p>
68
- </a>
69
- <a href='#docker' class='block rounded-[1.75rem] border border-amber-200 bg-amber-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-amber-500/20 dark:bg-amber-500/10'>
70
- <p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-amber-700 dark:text-amber-200'>100% local &middot; no accounts</p>
71
- <h3 class='mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white'>Self-hosted with Docker</h3>
72
- <p class='mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300'>One command boots the entire stack on your machine — database, auth, storage, and the CMS. No cloud services at all.</p>
73
- </a>
74
- </div>
75
-
76
- <p class='text-sm text-slate-500 dark:text-slate-400'>Not sure which to pick? If you want a live website with the least effort, choose <a href='#one-click-vercel'>Vercel</a>. If you want a local project to build on, choose <a href='#npm-create'>npm create nextblock</a>.</p>
77
-
78
- <figure class='my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10'>
79
- <img src='/images/included.webp' alt='NextBlock CMS platform overview showing the block editor, CMS dashboard, and integrations included with every installation' class='w-full h-auto object-cover' />
80
- <figcaption class='border-t border-white/10 px-6 py-4 text-sm text-slate-300'>Whichever path you choose, you get the same block editor, the same CMS, and the same database schema.</figcaption>
81
- </figure>
82
-
83
- <h2 id='one-click-vercel'>Option 1: One-Click Deploy on Vercel</h2>
84
- <p>The fastest way to get a production NextBlock site. One button creates your own copy of NextBlock on GitHub, provisions a managed Supabase database, and deploys the site — you never open a terminal or copy a single key.</p>
85
- <ol class='space-y-2'>
86
- <li><strong>Click Deploy to Vercel</strong> and sign in — Vercel clones NextBlock into a new repository you own.</li>
87
- <li><strong>Create the Supabase database</strong> when prompted: pick a name and a region. Vercel connects it to the project and injects the keys before the first build.</li>
88
- <li><strong>Open your new site</strong> once the build finishes. Every fresh instance takes you straight to the setup wizard.</li>
89
- <li><strong>Create your administrator account.</strong> It is confirmed instantly — no verification email — and you land in the CMS dashboard.</li>
90
- </ol>
91
- <div class='my-8'>
92
- <a href='https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fnextblock-cms%2Fnextblock&amp;project-name=nextblock&amp;repository-name=nextblock&amp;stores=%5B%7B%22type%22%3A%22integration%22%2C%22integrationSlug%22%3A%22supabase%22%2C%22productSlug%22%3A%22supabase%22%7D%5D' target='_blank' rel='noopener' class='inline-flex items-center rounded-full bg-slate-900 px-6 py-3 text-sm font-semibold text-white no-underline shadow-lg hover:bg-slate-700 dark:bg-white dark:text-slate-900 dark:hover:bg-slate-200'>Deploy to Vercel &rarr;</a>
93
- </div>
94
- <div class='rounded-3xl border border-blue-200 bg-blue-50/80 p-6 my-8 dark:border-blue-500/20 dark:bg-blue-500/10'>
95
- <p class='mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-blue-700 dark:text-blue-200'>Zero configuration</p>
96
- <p class='mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200'>There are no environment variables to fill in. Media storage automatically uses your connected Supabase project, security secrets are derived for you, and database migrations run automatically on every production build. Adding a custom domain later? Set <code>NEXT_PUBLIC_URL</code> in your Vercel project and redeploy.</p>
97
- </div>
98
- <p>Your site also keeps itself current: the dashboard checklist includes a one-click <strong>Connect GitHub</strong> step that installs a daily workflow syncing your copy with the latest NextBlock release.</p>
99
-
100
- <h2 id='npm-create'>Option 2: Scaffold a Project with npm create nextblock</h2>
101
- <p>The best starting point for building your own site. The CLI scaffolds a standalone Next.js application with NextBlock already wired in — no monorepo, no workspace tooling — and hands everything else to the browser wizard.</p>
102
- <p>Before you start, install <a href='https://nodejs.org' target='_blank' rel='noopener'>Node.js 20 or newer</a> (it includes npm), then create a free project at <a href='https://supabase.com' target='_blank' rel='noopener'>supabase.com</a> (or pick the CLI's Docker mode during creation and skip cloud accounts entirely).</p>
103
- <pre><code>npm create nextblock@latest my-site
104
- cd my-site
105
- npm run dev</code></pre>
106
- <p>Open <code>http://localhost:3000/setup</code> and let the wizard take over:</p>
107
- <ol class='space-y-2'>
108
- <li><strong>Connect Supabase</strong> — paste your project URL, publishable (anon) key, secret (service role) key, and a personal access token so the wizard can apply the database schema for you.</li>
109
- <li><strong>Choose media storage</strong> — plug in a Cloudflare R2 bucket for images and files, or leave it blank to use your connected Supabase project's storage.</li>
110
- <li><strong>Create your administrator</strong> — the wizard applies every migration, generates the app secrets, writes <code>.env.local</code>, creates your confirmed admin account, and signs you in. Restart <code>npm run dev</code> once afterwards so the fresh environment is baked into the app.</li>
111
- </ol>
112
- <div class='rounded-3xl border border-violet-200 bg-violet-50/80 p-6 my-8 dark:border-violet-500/20 dark:bg-violet-500/10'>
113
- <p class='mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200'>Premium modules</p>
114
- <p class='mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200'>Need a store? One command adds products, checkout, orders, and coupons — license-gated and ready when you are: <code>npx create-nextblock activate ecommerce</code></p>
115
- </div>
116
-
117
- <h2 id='git-clone'>Option 3: Clone the Repository</h2>
118
- <p>Run the full Nx monorepo: the CMS application, every shared package, the CLI source, and the documentation. This is the path for contributors, plugin authors, and teams that customize the platform itself.</p>
119
- <pre><code>git clone https://github.com/nextblock-cms/nextblock.git
120
- cd nextblock
121
- npm install
122
- npx nx serve nextblock</code></pre>
123
- <p>Open <code>http://localhost:4200</code> — a fresh install redirects every page to <code>/setup</code>, where the same three-step wizard connects Supabase, configures storage, and creates your admin. It validates your keys, writes <code>.env.local</code> with generated secrets, and applies all migrations over the Supabase Management API — no Supabase CLI required.</p>
124
- <div class='rounded-3xl border border-emerald-200 bg-emerald-50/80 p-6 my-8 dark:border-emerald-500/20 dark:bg-emerald-500/10'>
125
- <p class='mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200'>No terminal setup</p>
126
- <p class='mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200'>Configuration moved entirely to the browser — there is no interactive terminal step anymore. When the wizard finishes you are signed in as the administrator; restart the dev server once afterwards so the fresh environment is baked into the app bundle.</p>
127
- </div>
128
-
129
- <h2 id='docker'>Option 4: Self-Hosted with Docker</h2>
130
- <p>Everything runs on your machine: Supabase's Postgres and auth engines, a PostgREST API behind a Kong gateway, S3-compatible MinIO storage, and the CMS itself. No Supabase account, no Vercel, no email service — ideal for evaluations, air-gapped environments, and anyone who wants a fully self-hosted CMS with complete data ownership.</p>
131
- <p>With <a href='https://www.docker.com/products/docker-desktop/' target='_blank' rel='noopener'>Docker Desktop</a> installed and running:</p>
132
- <pre><code>git clone https://github.com/nextblock-cms/nextblock.git
133
- cd nextblock
134
- npm install
135
- npm run docker:setup</code></pre>
136
- <p>The command asks nothing: it generates secure keys, builds the stack, applies every migration, and starts the services. When it finishes, open <code>http://localhost:3000</code> — the setup wizard already has the database and MinIO storage wired up, so the only step left is creating your administrator (confirmed instantly, no email required).</p>
137
- <div class='rounded-3xl border border-amber-200 bg-amber-50/80 p-6 my-8 dark:border-amber-500/20 dark:bg-amber-500/10'>
138
- <p class='mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-amber-700 dark:text-amber-200'>Day-2 commands</p>
139
- <pre class='mt-4 mb-0'><code># rebuild and restart the stack
140
- npm run docker:up
141
-
142
- # stop the stack (your data persists in Docker volumes)
143
- npm run docker:down
144
-
145
- # follow the application logs
146
- npm run docker:logs</code></pre>
147
- </div>
148
-
149
- <h2 id='after-install'>After You Install: Your First 10 Minutes</h2>
150
- <p>Every path drops you at <code>/cms/dashboard</code>, signed in as the first administrator. A built-in onboarding checklist walks you through the rest:</p>
151
- <ul class='space-y-2'>
152
- <li><strong>Add your branding</strong> — upload your logo and set the site title.</li>
153
- <li><strong>Set your footer</strong> — copyright line and footer navigation.</li>
154
- <li><strong>Configure email (SMTP)</strong> — under Settings, so password resets and invitations can send.</li>
155
- <li><strong>Optional extras</strong> — connect analytics, enable bot protection, and (on Vercel) turn on automatic updates.</li>
156
- </ul>
157
- <p>From there, see how the platform fits together in <a href='/article/how-nextblock-works'>How NextBlock Works</a>, add a storefront with the <a href='/article/nextblock-commerce-guide'>Commerce guide</a>, or meet your AI copilot in the <a href='/article/nextblock-cortex-ai-guide'>Cortex AI guide</a>.</p>
158
-
159
- <h2 id='faq'>Installation FAQ</h2>
160
- <h3>What do I need installed?</h3>
161
- <p>Nothing for the Vercel path — it runs entirely in the browser. For <code>npm create nextblock</code>: <a href='https://nodejs.org' target='_blank' rel='noopener'>Node.js 20+</a> (which includes npm). For the cloned repository: Node.js 20+ and git. For Docker: those plus Docker Desktop.</p>
162
- <h3>Is NextBlock free?</h3>
163
- <p>Yes — the core of NextBlock is a 100% free, open-source CMS (AGPL). Premium packages such as e-commerce and Cortex AI are optional and activate with a license key. Both Vercel and Supabase offer free tiers, so a starter site can run at no cost.</p>
164
- <h3>Do I need a Supabase account?</h3>
165
- <p>On Vercel, the database is created for you during the deploy. For <code>npm create nextblock</code> and the cloned repository you bring a free Supabase project. With Docker you need no cloud accounts at all.</p>
166
- <h3>Do I have to run migrations or SQL by hand?</h3>
167
- <p>No. The setup wizard, the Vercel build, and the Docker stack all apply the database schema automatically — and re-running is always safe.</p>
168
- <h3>Can I switch paths later?</h3>
169
- <p>Yes. Every path runs the same application and the same database schema, so you can prototype locally with Docker today and deploy to Vercel tomorrow. NextBlock deploys like any standard Next.js app.</p>
170
- <h3>How do I update NextBlock?</h3>
171
- <p>On Vercel, the Connect GitHub onboarding step enables a daily automatic sync with upstream. On a cloned repository, <code>git pull</code>, run <code>npm run db:migrate</code>, then restart (on production builds, pending migrations apply automatically). With Docker, pull the latest code and run <code>npm run docker:up</code>.</p>
172
-
173
- <div class='rounded-[2rem] border border-slate-200/80 bg-slate-50 p-8 my-12 text-center dark:border-white/10 dark:bg-white/5'>
174
- <p class='mt-0 text-2xl font-semibold text-slate-900 dark:text-white'>Ready to launch?</p>
175
- <p class='text-sm text-slate-600 dark:text-slate-300'>Pick your path above, or jump straight to the fastest one.</p>
176
- <div class='mt-5 flex flex-wrap justify-center gap-3'>
177
- <a href='https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fnextblock-cms%2Fnextblock&amp;project-name=nextblock&amp;repository-name=nextblock&amp;stores=%5B%7B%22type%22%3A%22integration%22%2C%22integrationSlug%22%3A%22supabase%22%2C%22productSlug%22%3A%22supabase%22%7D%5D' target='_blank' rel='noopener' class='inline-flex items-center rounded-full bg-slate-900 px-6 py-3 text-sm font-semibold text-white no-underline shadow-lg hover:bg-slate-700 dark:bg-white dark:text-slate-900 dark:hover:bg-slate-200'>Deploy on Vercel</a>
178
- <a href='https://github.com/nextblock-cms/nextblock' target='_blank' rel='noopener' class='inline-flex items-center rounded-full border border-slate-300 px-6 py-3 text-sm font-semibold text-slate-700 no-underline hover:border-slate-500 dark:border-white/20 dark:text-slate-200 dark:hover:border-white/50'>View on GitHub</a>
179
- </div>
180
- </div>$$
181
- ), 0 FROM target_posts tp WHERE tp.slug = 'how-to-setup-nextblock'
182
-
183
- UNION ALL
184
-
185
- -- FR: Installer NextBlock
186
- SELECT tp.id, tp.language_id, 'text', jsonb_build_object('html_content',
187
- $$<p class='text-lg leading-8 text-slate-700 dark:text-slate-300'>NextBlock est un CMS open source et natif IA, construit sur Next.js et Supabase — et son installation ne passe plus par des fichiers de configuration, des assistants en ligne de commande ou du SQL manuel. Il existe quatre façons de démarrer, et elles aboutissent toutes au même endroit : un <strong>assistant de configuration</strong> dans le navigateur qui connecte votre base de données, configure le stockage des médias et crée votre compte administrateur. Choisissez le chemin qui vous convient, suivez les étapes, et vous publierez en quelques minutes.</p>
188
-
189
- <div class='grid gap-5 md:grid-cols-2 my-10'>
190
- <a href='#one-click-vercel' class='block rounded-[1.75rem] border border-blue-200 bg-blue-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-blue-500/20 dark:bg-blue-500/10'>
191
- <p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-blue-700 dark:text-blue-200'>Le plus rapide &middot; environ 3 minutes</p>
192
- <h3 class='mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white'>Déploiement Vercel en un clic</h3>
193
- <p class='mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300'>Un site de production en ligne avec une base de données gérée. Pas de terminal, pas de variables d'environnement, rien à copier.</p>
194
- </a>
195
- <a href='#npm-create' class='block rounded-[1.75rem] border border-violet-200 bg-violet-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-violet-500/20 dark:bg-violet-500/10'>
196
- <p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200'>Recommandé pour les nouveaux projets</p>
197
- <h3 class='mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white'>npm create nextblock</h3>
198
- <p class='mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300'>Générez une app Next.js autonome avec NextBlock intégré, puis terminez la configuration dans votre navigateur.</p>
199
- </a>
200
- <a href='#git-clone' class='block rounded-[1.75rem] border border-emerald-200 bg-emerald-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-emerald-500/20 dark:bg-emerald-500/10'>
201
- <p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200'>Code source complet</p>
202
- <h3 class='mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white'>Cloner le dépôt</h3>
203
- <p class='mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300'>Faites tourner le monorepo complet — le CMS, tous les packages et la documentation. Conçu pour les contributeurs et les équipes plateforme.</p>
204
- </a>
205
- <a href='#docker' class='block rounded-[1.75rem] border border-amber-200 bg-amber-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-amber-500/20 dark:bg-amber-500/10'>
206
- <p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-amber-700 dark:text-amber-200'>100 % local &middot; aucun compte</p>
207
- <h3 class='mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white'>Auto-hébergé avec Docker</h3>
208
- <p class='mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300'>Une seule commande démarre toute la pile sur votre machine — base de données, auth, stockage et le CMS. Aucun service cloud.</p>
209
- </a>
210
- </div>
211
-
212
- <p class='text-sm text-slate-500 dark:text-slate-400'>Vous hésitez ? Pour un site en ligne avec le minimum d'effort, choisissez <a href='#one-click-vercel'>Vercel</a>. Pour un projet local à personnaliser, choisissez <a href='#npm-create'>npm create nextblock</a>.</p>
213
-
214
- <figure class='my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10'>
215
- <img src='/images/included.webp' alt='Aperçu de la plateforme NextBlock : éditeur de blocs, tableau de bord CMS et intégrations incluses dans chaque installation' class='w-full h-auto object-cover' />
216
- <figcaption class='border-t border-white/10 px-6 py-4 text-sm text-slate-300'>Quel que soit le chemin choisi, vous obtenez le même éditeur de blocs, le même CMS et le même schéma de base de données.</figcaption>
217
- </figure>
218
-
219
- <h2 id='one-click-vercel'>Option 1 : Déploiement Vercel en un clic</h2>
220
- <p>Le moyen le plus rapide d'obtenir un site NextBlock en production. Un seul bouton crée votre propre copie de NextBlock sur GitHub, provisionne une base de données Supabase gérée et déploie le site — sans jamais ouvrir un terminal ni copier la moindre clé.</p>
221
- <ol class='space-y-2'>
222
- <li><strong>Cliquez sur Deploy to Vercel</strong> et connectez-vous — Vercel clone NextBlock dans un nouveau dépôt qui vous appartient.</li>
223
- <li><strong>Créez la base de données Supabase</strong> quand on vous le demande : choisissez un nom et une région. Vercel la connecte au projet et injecte les clés avant le premier build.</li>
224
- <li><strong>Ouvrez votre nouveau site</strong> une fois le build terminé. Toute nouvelle instance vous amène directement à l'assistant de configuration.</li>
225
- <li><strong>Créez votre compte administrateur.</strong> Il est confirmé instantanément — aucun email de vérification — et vous arrivez dans le tableau de bord du CMS.</li>
226
- </ol>
227
- <div class='my-8'>
228
- <a href='https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fnextblock-cms%2Fnextblock&amp;project-name=nextblock&amp;repository-name=nextblock&amp;stores=%5B%7B%22type%22%3A%22integration%22%2C%22integrationSlug%22%3A%22supabase%22%2C%22productSlug%22%3A%22supabase%22%7D%5D' target='_blank' rel='noopener' class='inline-flex items-center rounded-full bg-slate-900 px-6 py-3 text-sm font-semibold text-white no-underline shadow-lg hover:bg-slate-700 dark:bg-white dark:text-slate-900 dark:hover:bg-slate-200'>Déployer sur Vercel &rarr;</a>
229
- </div>
230
- <div class='rounded-3xl border border-blue-200 bg-blue-50/80 p-6 my-8 dark:border-blue-500/20 dark:bg-blue-500/10'>
231
- <p class='mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-blue-700 dark:text-blue-200'>Zéro configuration</p>
232
- <p class='mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200'>Aucune variable d'environnement à remplir. Le stockage des médias utilise automatiquement votre projet Supabase connecté, les secrets de sécurité sont dérivés pour vous, et les migrations de base de données s'exécutent automatiquement à chaque build de production. Un domaine personnalisé plus tard ? Définissez <code>NEXT_PUBLIC_URL</code> dans votre projet Vercel et redéployez.</p>
233
- </div>
234
- <p>Par ailleurs, votre site reste à jour tout seul : la checklist du tableau de bord inclut une étape <strong>Connect GitHub</strong> en un clic qui installe un workflow quotidien synchronisant votre copie avec la dernière version de NextBlock.</p>
235
-
236
- <h2 id='npm-create'>Option 2 : Créer un projet avec npm create nextblock</h2>
237
- <p>Le meilleur point de départ pour construire votre propre site. Le CLI génère une application Next.js autonome avec NextBlock déjà intégré — sans monorepo ni outillage de workspace — et confie tout le reste à l'assistant dans le navigateur.</p>
238
- <p>Avant de commencer, installez <a href='https://nodejs.org' target='_blank' rel='noopener'>Node.js 20 ou plus récent</a> (npm inclus), puis créez un projet gratuit sur <a href='https://supabase.com' target='_blank' rel='noopener'>supabase.com</a> (ou choisissez le mode Docker du CLI pendant la création et passez-vous entièrement de comptes cloud).</p>
239
- <pre><code>npm create nextblock@latest mon-site
240
- cd mon-site
241
- npm run dev</code></pre>
242
- <p>Ouvrez <code>http://localhost:3000/setup</code> et laissez l'assistant faire le travail :</p>
243
- <ol class='space-y-2'>
244
- <li><strong>Connectez Supabase</strong> — collez l'URL du projet, la clé publiable (anon), la clé secrète (service role) et un jeton d'accès personnel pour que l'assistant applique le schéma de base de données à votre place.</li>
245
- <li><strong>Choisissez le stockage des médias</strong> — branchez un bucket Cloudflare R2 pour les images et les fichiers, ou laissez les champs vides pour utiliser le stockage de votre projet Supabase.</li>
246
- <li><strong>Créez votre administrateur</strong> — l'assistant applique toutes les migrations, génère les secrets de l'application, écrit <code>.env.local</code>, crée votre compte admin confirmé et vous connecte. Redémarrez ensuite <code>npm run dev</code> une fois pour que le nouvel environnement soit intégré à l'application.</li>
247
- </ol>
248
- <div class='rounded-3xl border border-violet-200 bg-violet-50/80 p-6 my-8 dark:border-violet-500/20 dark:bg-violet-500/10'>
249
- <p class='mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200'>Modules premium</p>
250
- <p class='mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200'>Besoin d'une boutique ? Une seule commande ajoute produits, paiement, commandes et coupons — activés par clé de licence, prêts quand vous l'êtes : <code>npx create-nextblock activate ecommerce</code></p>
251
- </div>
252
-
253
- <h2 id='git-clone'>Option 3 : Cloner le dépôt</h2>
254
- <p>Faites tourner le monorepo Nx complet : l'application CMS, tous les packages partagés, le code du CLI et la documentation. C'est le chemin des contributeurs, des auteurs de plugins et des équipes qui personnalisent la plateforme elle-même.</p>
255
- <pre><code>git clone https://github.com/nextblock-cms/nextblock.git
256
- cd nextblock
257
- npm install
258
- npx nx serve nextblock</code></pre>
259
- <p>Ouvrez <code>http://localhost:4200</code> — une nouvelle installation redirige chaque page vers <code>/setup</code>, où le même assistant en trois étapes connecte Supabase, configure le stockage et crée votre admin. Il valide vos clés, écrit <code>.env.local</code> avec des secrets générés, et applique toutes les migrations via l'API de management Supabase — sans CLI Supabase.</p>
260
- <div class='rounded-3xl border border-emerald-200 bg-emerald-50/80 p-6 my-8 dark:border-emerald-500/20 dark:bg-emerald-500/10'>
261
- <p class='mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200'>Zéro configuration dans le terminal</p>
262
- <p class='mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200'>La configuration se fait entièrement dans le navigateur — il n'y a plus d'étape interactive en ligne de commande. Quand l'assistant termine, vous êtes connecté en administrateur ; redémarrez ensuite le serveur de développement une fois pour que le nouvel environnement soit intégré au bundle de l'application.</p>
263
- </div>
264
-
265
- <h2 id='docker'>Option 4 : Auto-hébergé avec Docker</h2>
266
- <p>Tout tourne sur votre machine : les moteurs Postgres et auth de Supabase, une API PostgREST derrière une passerelle Kong, un stockage MinIO compatible S3 et le CMS lui-même. Pas de compte Supabase, pas de Vercel, pas de service d'email — idéal pour les évaluations, les environnements isolés et la pleine propriété de vos données.</p>
267
- <p>Avec <a href='https://www.docker.com/products/docker-desktop/' target='_blank' rel='noopener'>Docker Desktop</a> installé et démarré :</p>
268
- <pre><code>git clone https://github.com/nextblock-cms/nextblock.git
269
- cd nextblock
270
- npm install
271
- npm run docker:setup</code></pre>
272
- <p>La commande ne pose aucune question : elle génère des clés sécurisées, construit la pile, applique toutes les migrations et démarre les services. Quand elle se termine, ouvrez <code>http://localhost:3000</code> — la base de données et le stockage MinIO sont déjà connectés dans l'assistant de configuration, il ne reste qu'à créer votre administrateur (confirmé instantanément, sans email).</p>
273
- <div class='rounded-3xl border border-amber-200 bg-amber-50/80 p-6 my-8 dark:border-amber-500/20 dark:bg-amber-500/10'>
274
- <p class='mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-amber-700 dark:text-amber-200'>Commandes du quotidien</p>
275
- <pre class='mt-4 mb-0'><code># reconstruire et redémarrer la pile
276
- npm run docker:up
277
-
278
- # arrêter la pile (vos données persistent dans les volumes Docker)
279
- npm run docker:down
280
-
281
- # suivre les logs de l'application
282
- npm run docker:logs</code></pre>
283
- </div>
284
-
285
- <h2 id='after-install'>Après l'installation : vos 10 premières minutes</h2>
286
- <p>Chaque chemin vous dépose sur <code>/cms/dashboard</code>, connecté en tant que premier administrateur. Une checklist de démarrage intégrée vous guide pour la suite :</p>
287
- <ul class='space-y-2'>
288
- <li><strong>Ajoutez votre identité visuelle</strong> — téléversez votre logo et définissez le titre du site.</li>
289
- <li><strong>Réglez votre pied de page</strong> — mention de copyright et navigation du pied de page.</li>
290
- <li><strong>Configurez l'email (SMTP)</strong> — dans les réglages, pour que les réinitialisations de mot de passe et les invitations partent bien.</li>
291
- <li><strong>Extras optionnels</strong> — connectez vos outils d'analytics, activez la protection anti-bots et (sur Vercel) les mises à jour automatiques.</li>
292
- </ul>
293
- <p>Ensuite, découvrez comment la plateforme s'articule dans <a href='/article/comment-nextblock-fonctionne'>Comment NextBlock fonctionne</a>, ou ajoutez une boutique avec le <a href='/article/guide-commerce-nextblock'>guide Commerce</a>.</p>
294
-
295
- <h2 id='faq'>FAQ d'installation</h2>
296
- <h3>Que dois-je installer ?</h3>
297
- <p>Rien pour le chemin Vercel — tout se passe dans le navigateur. Pour <code>npm create nextblock</code> : <a href='https://nodejs.org' target='_blank' rel='noopener'>Node.js 20+</a> (npm inclus). Pour le dépôt cloné : Node.js 20+ et git. Pour Docker : ajoutez Docker Desktop.</p>
298
- <h3>NextBlock est-il gratuit ?</h3>
299
- <p>Oui — le cœur du CMS est 100 % gratuit et open source (AGPL). Les packages premium comme l'e-commerce et Cortex AI sont optionnels et s'activent avec une clé de licence. Vercel et Supabase proposent chacun une offre gratuite : un site de départ peut donc tourner sans frais.</p>
300
- <h3>Ai-je besoin d'un compte Supabase ?</h3>
301
- <p>Sur Vercel, la base de données est créée pour vous pendant le déploiement. Pour <code>npm create nextblock</code> et le dépôt cloné, il vous faut un projet Supabase gratuit. Avec Docker, aucun compte cloud n'est nécessaire.</p>
302
- <h3>Dois-je exécuter des migrations ou du SQL à la main ?</h3>
303
- <p>Non. L'assistant de configuration, le build Vercel et la pile Docker appliquent tous le schéma de base de données automatiquement — et relancer l'opération est toujours sans risque.</p>
304
- <h3>Puis-je changer de chemin plus tard ?</h3>
305
- <p>Oui. Chaque chemin exécute la même application et le même schéma de base de données : vous pouvez prototyper en local avec Docker aujourd'hui et déployer sur Vercel demain. NextBlock se déploie comme n'importe quelle app Next.js.</p>
306
- <h3>Comment mettre à jour NextBlock ?</h3>
307
- <p>Sur Vercel, l'étape Connect GitHub de la checklist active une synchronisation quotidienne automatique. Sur un dépôt cloné, <code>git pull</code>, lancez <code>npm run db:migrate</code>, puis redémarrez (lors des builds de production, les migrations en attente s'appliquent automatiquement). Avec Docker, récupérez le dernier code et lancez <code>npm run docker:up</code>.</p>
308
-
309
- <div class='rounded-[2rem] border border-slate-200/80 bg-slate-50 p-8 my-12 text-center dark:border-white/10 dark:bg-white/5'>
310
- <p class='mt-0 text-2xl font-semibold text-slate-900 dark:text-white'>Prêt à vous lancer ?</p>
311
- <p class='text-sm text-slate-600 dark:text-slate-300'>Choisissez votre chemin ci-dessus, ou passez directement au plus rapide.</p>
312
- <div class='mt-5 flex flex-wrap justify-center gap-3'>
313
- <a href='https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fnextblock-cms%2Fnextblock&amp;project-name=nextblock&amp;repository-name=nextblock&amp;stores=%5B%7B%22type%22%3A%22integration%22%2C%22integrationSlug%22%3A%22supabase%22%2C%22productSlug%22%3A%22supabase%22%7D%5D' target='_blank' rel='noopener' class='inline-flex items-center rounded-full bg-slate-900 px-6 py-3 text-sm font-semibold text-white no-underline shadow-lg hover:bg-slate-700 dark:bg-white dark:text-slate-900 dark:hover:bg-slate-200'>Déployer sur Vercel</a>
314
- <a href='https://github.com/nextblock-cms/nextblock' target='_blank' rel='noopener' class='inline-flex items-center rounded-full border border-slate-300 px-6 py-3 text-sm font-semibold text-slate-700 no-underline hover:border-slate-500 dark:border-white/20 dark:text-slate-200 dark:hover:border-white/50'>Voir sur GitHub</a>
315
- </div>
316
- </div>$$
317
- ), 0 FROM target_posts tp WHERE tp.slug = 'comment-configurer-nextblock';
@@ -1,126 +0,0 @@
1
- -- 00000000000038_seed_consent_banner_translations.sql
2
- -- Consent banner UI copy (EN + FR). Forward-only and idempotent.
3
-
4
- INSERT INTO public.translations (key, translations)
5
- VALUES
6
- (
7
- 'privacy.consent.aria_label',
8
- jsonb_build_object(
9
- 'en', 'Privacy consent',
10
- 'fr', 'Consentement à la confidentialité'
11
- )
12
- ),
13
- (
14
- 'privacy.consent.title',
15
- jsonb_build_object(
16
- 'en', 'We value your privacy',
17
- 'fr', 'Nous respectons votre vie privée'
18
- )
19
- ),
20
- (
21
- 'privacy.consent.description_before_policy_link',
22
- jsonb_build_object(
23
- 'en', 'We use only essential cookies by default. With your consent we also use analytics to improve the site. See our',
24
- 'fr', 'Nous utilisons seulement les témoins essentiels par défaut. Avec votre consentement, nous utilisons aussi l''analytique pour améliorer le site. Consultez notre'
25
- )
26
- ),
27
- (
28
- 'privacy.consent.privacy_policy_link',
29
- jsonb_build_object(
30
- 'en', 'Privacy Policy',
31
- 'fr', 'politique de confidentialité'
32
- )
33
- ),
34
- (
35
- 'privacy.consent.description_after_policy_link',
36
- jsonb_build_object(
37
- 'en', '.',
38
- 'fr', '.'
39
- )
40
- ),
41
- (
42
- 'privacy.consent.privacy_policy_href',
43
- jsonb_build_object(
44
- 'en', '/privacy-policy',
45
- 'fr', '/politique-de-confidentialite'
46
- )
47
- ),
48
- (
49
- 'privacy.consent.necessary_label',
50
- jsonb_build_object(
51
- 'en', 'Necessary',
52
- 'fr', 'Nécessaires'
53
- )
54
- ),
55
- (
56
- 'privacy.consent.necessary_help',
57
- jsonb_build_object(
58
- 'en', 'Always on',
59
- 'fr', 'Toujours actifs'
60
- )
61
- ),
62
- (
63
- 'privacy.consent.analytics_label',
64
- jsonb_build_object(
65
- 'en', 'Analytics',
66
- 'fr', 'Analytique'
67
- )
68
- ),
69
- (
70
- 'privacy.consent.analytics_help',
71
- jsonb_build_object(
72
- 'en', 'Usage insights',
73
- 'fr', 'Statistiques d''utilisation'
74
- )
75
- ),
76
- (
77
- 'privacy.consent.marketing_label',
78
- jsonb_build_object(
79
- 'en', 'Marketing',
80
- 'fr', 'Marketing'
81
- )
82
- ),
83
- (
84
- 'privacy.consent.marketing_help',
85
- jsonb_build_object(
86
- 'en', 'Personalized content',
87
- 'fr', 'Contenu personnalisé'
88
- )
89
- ),
90
- (
91
- 'privacy.consent.save_choices',
92
- jsonb_build_object(
93
- 'en', 'Save choices',
94
- 'fr', 'Enregistrer mes choix'
95
- )
96
- ),
97
- (
98
- 'privacy.consent.accept_all',
99
- jsonb_build_object(
100
- 'en', 'Accept all',
101
- 'fr', 'Tout accepter'
102
- )
103
- ),
104
- (
105
- 'privacy.consent.reject_all',
106
- jsonb_build_object(
107
- 'en', 'Reject all',
108
- 'fr', 'Tout refuser'
109
- )
110
- ),
111
- (
112
- 'privacy.consent.hide_options',
113
- jsonb_build_object(
114
- 'en', 'Hide options',
115
- 'fr', 'Masquer les options'
116
- )
117
- ),
118
- (
119
- 'privacy.consent.manage_options',
120
- jsonb_build_object(
121
- 'en', 'Manage options',
122
- 'fr', 'Gérer les options'
123
- )
124
- )
125
- ON CONFLICT (key) DO UPDATE
126
- SET translations = public.translations.translations || EXCLUDED.translations;