[{"data":1,"prerenderedAt":1004},["ShallowReactive",2],{"page-\u002Fsupabase":3,"pieces-supabase":975,"autour-\u002Fsupabase":989,"prerequis-\u002Fsupabase":992,"plan-supabase":993},{"id":4,"title":5,"body":6,"description":949,"extension":950,"ligne":463,"meta":951,"motsCles":952,"navigation":556,"niveau":962,"path":963,"prerequis":964,"ressources":964,"seo":965,"sources":966,"stem":973,"__hash__":974},"docs\u002Fsupabase\u002Findex.md","Supabase",{"type":7,"value":8,"toc":939},"minimark",[9,13,18,75,84,88,119,146,209,215,219,394,405,409,453,510,515,519,653,686,691,695,781,787,791,888,908,912,916,935],[10,11,12],"p",{},"Ce mémo résume l'essentiel de Supabase dans un projet Nuxt. Chaque section renvoie au cours qui l'explique.",[14,15,17],"h2",{"id":16},"les-clés","Les clés",[19,20,21,37],"table",{},[22,23,24],"thead",{},[25,26,27,31,34],"tr",{},[28,29,30],"th",{},"Clé",[28,32,33],{},"Préfixe",[28,35,36],{},"Où",[38,39,40,59],"tbody",{},[25,41,42,51,56],{},[43,44,45,46,50],"td",{},"Publishable (ancien ",[47,48,49],"code",{},"anon",")",[43,52,53],{},[47,54,55],{},"sb_publishable_",[43,57,58],{},"Navigateur, protégée par la RLS",[25,60,61,67,72],{},[43,62,63,64,50],{},"Secrète (ancien ",[47,65,66],{},"service_role",[43,68,69],{},[47,70,71],{},"sb_secret_",[43,73,74],{},"Serveur uniquement, jamais commitée",[10,76,77,78,83],{},"Détails : ",[79,80,82],"a",{"href":81},"\u002Fsupabase\u002Fdecouvrir-supabase","Découvrir Supabase",".",[14,85,87],{"id":86},"configuration-nuxt","Configuration Nuxt",[89,90,95],"pre",{"className":91,"code":92,"language":93,"meta":94,"style":94},"language-bash shiki shiki-themes github-light-default github-dark-default github-dark-default","npx nuxi@latest module add supabase\n","bash","",[47,96,97],{"__ignoreMap":94},[98,99,102,106,110,113,116],"span",{"class":100,"line":101},"line",1,[98,103,105],{"class":104},"sIXEE","npx",[98,107,109],{"class":108},"shWOn"," nuxi@latest",[98,111,112],{"class":108}," module",[98,114,115],{"class":108}," add",[98,117,118],{"class":108}," supabase\n",[89,120,125],{"className":121,"code":122,"filename":123,"language":124,"meta":94,"style":94},"language-ini shiki shiki-themes github-light-default github-dark-default github-dark-default","NUXT_PUBLIC_SUPABASE_URL=https:\u002F\u002Fxxxx.supabase.co\nNUXT_PUBLIC_SUPABASE_KEY=sb_publishable_...\n",".env","ini",[47,126,127,137],{"__ignoreMap":94},[98,128,129,133],{"class":100,"line":101},[98,130,132],{"class":131},"sOnC1","NUXT_PUBLIC_SUPABASE_URL",[98,134,136],{"class":135},"scfrF","=https:\u002F\u002Fxxxx.supabase.co\n",[98,138,140,143],{"class":100,"line":139},2,[98,141,142],{"class":131},"NUXT_PUBLIC_SUPABASE_KEY",[98,144,145],{"class":135},"=sb_publishable_...\n",[19,147,148,158],{},[22,149,150],{},[25,151,152,155],{},[28,153,154],{},"Fonction",[28,156,157],{},"Usage",[38,159,160,170,191],{},[25,161,162,167],{},[43,163,164],{},[47,165,166],{},"useSupabaseClient()",[43,168,169],{},"Client dans les pages et composants.",[25,171,172,177],{},[43,173,174],{},[47,175,176],{},"useSupabaseUser()",[43,178,179,180,183,184,187,188,83],{},"Utilisateur connecté (claims : ",[47,181,182],{},"sub",", ",[47,185,186],{},"email",") ou ",[47,189,190],{},"null",[25,192,193,198],{},[43,194,195],{},[47,196,197],{},"serverSupabaseClient(event)",[43,199,200,201,204,205,208],{},"Client dans ",[47,202,203],{},"server\u002F"," (",[47,206,207],{},"#supabase\u002Fserver",").",[10,210,77,211,83],{},[79,212,214],{"href":213},"\u002Fsupabase\u002Fbrancher-a-nuxt","Brancher Supabase à Nuxt",[14,216,218],{"id":217},"lire-et-écrire","Lire et écrire",[89,220,224],{"className":221,"code":222,"language":223,"meta":94,"style":94},"language-ts shiki shiki-themes github-light-default github-dark-default github-dark-default","await supabase.from('recettes').select('id, titre').eq('id', 1).order('created_at').limit(10)\nawait supabase.from('recettes').insert({ titre: 'Crêpes' }).select()\nawait supabase.from('recettes').update({ titre: 'Galettes' }).eq('id', 1)\nawait supabase.from('recettes').delete().eq('id', 1)\n","ts",[47,225,226,293,324,361],{"__ignoreMap":94},[98,227,228,231,234,238,241,244,246,249,251,254,256,259,261,264,266,270,272,275,277,280,282,285,287,290],{"class":100,"line":101},[98,229,230],{"class":131},"await",[98,232,233],{"class":135}," supabase.",[98,235,237],{"class":236},"syCW7","from",[98,239,240],{"class":135},"(",[98,242,243],{"class":108},"'recettes'",[98,245,208],{"class":135},[98,247,248],{"class":236},"select",[98,250,240],{"class":135},[98,252,253],{"class":108},"'id, titre'",[98,255,208],{"class":135},[98,257,258],{"class":236},"eq",[98,260,240],{"class":135},[98,262,263],{"class":108},"'id'",[98,265,183],{"class":135},[98,267,269],{"class":268},"s5iOY","1",[98,271,208],{"class":135},[98,273,274],{"class":236},"order",[98,276,240],{"class":135},[98,278,279],{"class":108},"'created_at'",[98,281,208],{"class":135},[98,283,284],{"class":236},"limit",[98,286,240],{"class":135},[98,288,289],{"class":268},"10",[98,291,292],{"class":135},")\n",[98,294,295,297,299,301,303,305,307,310,313,316,319,321],{"class":100,"line":139},[98,296,230],{"class":131},[98,298,233],{"class":135},[98,300,237],{"class":236},[98,302,240],{"class":135},[98,304,243],{"class":108},[98,306,208],{"class":135},[98,308,309],{"class":236},"insert",[98,311,312],{"class":135},"({ titre: ",[98,314,315],{"class":108},"'Crêpes'",[98,317,318],{"class":135}," }).",[98,320,248],{"class":236},[98,322,323],{"class":135},"()\n",[98,325,327,329,331,333,335,337,339,342,344,347,349,351,353,355,357,359],{"class":100,"line":326},3,[98,328,230],{"class":131},[98,330,233],{"class":135},[98,332,237],{"class":236},[98,334,240],{"class":135},[98,336,243],{"class":108},[98,338,208],{"class":135},[98,340,341],{"class":236},"update",[98,343,312],{"class":135},[98,345,346],{"class":108},"'Galettes'",[98,348,318],{"class":135},[98,350,258],{"class":236},[98,352,240],{"class":135},[98,354,263],{"class":108},[98,356,183],{"class":135},[98,358,269],{"class":268},[98,360,292],{"class":135},[98,362,364,366,368,370,372,374,376,379,382,384,386,388,390,392],{"class":100,"line":363},4,[98,365,230],{"class":131},[98,367,233],{"class":135},[98,369,237],{"class":236},[98,371,240],{"class":135},[98,373,243],{"class":108},[98,375,208],{"class":135},[98,377,378],{"class":236},"delete",[98,380,381],{"class":135},"().",[98,383,258],{"class":236},[98,385,240],{"class":135},[98,387,263],{"class":108},[98,389,183],{"class":135},[98,391,269],{"class":268},[98,393,292],{"class":135},[10,395,396,397,400,401,83],{},"Chaque appel renvoie ",[47,398,399],{},"{ data, error }",". Détails : ",[79,402,404],{"href":403},"\u002Fsupabase\u002Flire-et-ecrire","Lire et écrire des données",[14,406,408],{"id":407},"authentification","Authentification",[19,410,411,421],{},[22,412,413],{},[25,414,415,418],{},[28,416,417],{},"Appel",[28,419,420],{},"Effet",[38,422,423,433,443],{},[25,424,425,430],{},[43,426,427],{},[47,428,429],{},"auth.signUp({ email, password })",[43,431,432],{},"Crée un compte.",[25,434,435,440],{},[43,436,437],{},[47,438,439],{},"auth.signInWithPassword({ email, password })",[43,441,442],{},"Connecte.",[25,444,445,450],{},[43,446,447],{},[47,448,449],{},"auth.signOut()",[43,451,452],{},"Déconnecte (tous les appareils par défaut).",[89,454,457],{"className":221,"code":455,"filename":456,"language":223,"meta":94,"style":94},"supabase: { redirectOptions: { login: '\u002Flogin', callback: '\u002Fconfirm', exclude: ['\u002F', '\u002Frecettes'] } }\n","nuxt.config.ts",[47,458,459],{"__ignoreMap":94},[98,460,461,464,467,470,472,475,478,481,483,486,488,491,493,496,499,502,504,507],{"class":100,"line":101},[98,462,463],{"class":104},"supabase",[98,465,466],{"class":135},": { ",[98,468,469],{"class":104},"redirectOptions",[98,471,466],{"class":135},[98,473,474],{"class":104},"login",[98,476,477],{"class":135},": ",[98,479,480],{"class":108},"'\u002Flogin'",[98,482,183],{"class":135},[98,484,485],{"class":104},"callback",[98,487,477],{"class":135},[98,489,490],{"class":108},"'\u002Fconfirm'",[98,492,183],{"class":135},[98,494,495],{"class":104},"exclude",[98,497,498],{"class":135},": [",[98,500,501],{"class":108},"'\u002F'",[98,503,183],{"class":135},[98,505,506],{"class":108},"'\u002Frecettes'",[98,508,509],{"class":135},"] } }\n",[10,511,77,512,83],{},[79,513,408],{"href":514},"\u002Fsupabase\u002Fauthentification",[14,516,518],{"id":517},"row-level-security","Row Level Security",[89,520,524],{"className":521,"code":522,"language":523,"meta":94,"style":94},"language-sql shiki shiki-themes github-light-default github-dark-default github-dark-default","alter table recettes enable row level security;\n\ncreate policy \"Lire\"\non recettes for select to anon, authenticated using ( true );\n\ncreate policy \"Supprimer ses recettes\"\non recettes for delete to authenticated\nusing ( (select auth.uid()) = user_id );\n","sql",[47,525,526,552,558,569,594,599,609,626],{"__ignoreMap":94},[98,527,528,531,534,537,540,543,546,549],{"class":100,"line":101},[98,529,530],{"class":131},"alter",[98,532,533],{"class":131}," table",[98,535,536],{"class":135}," recettes ",[98,538,539],{"class":131},"enable",[98,541,542],{"class":131}," row",[98,544,545],{"class":131}," level",[98,547,548],{"class":131}," security",[98,550,551],{"class":135},";\n",[98,553,554],{"class":100,"line":139},[98,555,557],{"emptyLinePlaceholder":556},true,"\n",[98,559,560,563,566],{"class":100,"line":326},[98,561,562],{"class":131},"create",[98,564,565],{"class":131}," policy",[98,567,568],{"class":108}," \"Lire\"\n",[98,570,571,574,576,579,582,585,588,591],{"class":100,"line":363},[98,572,573],{"class":131},"on",[98,575,536],{"class":135},[98,577,578],{"class":131},"for",[98,580,581],{"class":131}," select",[98,583,584],{"class":131}," to",[98,586,587],{"class":135}," anon, authenticated ",[98,589,590],{"class":131},"using",[98,592,593],{"class":135}," ( true );\n",[98,595,597],{"class":100,"line":596},5,[98,598,557],{"emptyLinePlaceholder":556},[98,600,602,604,606],{"class":100,"line":601},6,[98,603,562],{"class":131},[98,605,565],{"class":131},[98,607,608],{"class":108}," \"Supprimer ses recettes\"\n",[98,610,612,614,616,618,621,623],{"class":100,"line":611},7,[98,613,573],{"class":131},[98,615,536],{"class":135},[98,617,578],{"class":131},[98,619,620],{"class":131}," delete",[98,622,584],{"class":131},[98,624,625],{"class":135}," authenticated\n",[98,627,629,631,634,636,639,641,644,647,650],{"class":100,"line":628},8,[98,630,590],{"class":131},[98,632,633],{"class":135}," ( (",[98,635,248],{"class":131},[98,637,638],{"class":268}," auth",[98,640,83],{"class":135},[98,642,643],{"class":268},"uid",[98,645,646],{"class":135},"()) ",[98,648,649],{"class":131},"=",[98,651,652],{"class":135}," user_id );\n",[19,654,655,665],{},[22,656,657],{},[25,658,659,662],{},[28,660,661],{},"Clause",[28,663,664],{},"Teste",[38,666,667,676],{},[25,668,669,673],{},[43,670,671],{},[47,672,590],{},[43,674,675],{},"Les lignes existantes.",[25,677,678,683],{},[43,679,680],{},[47,681,682],{},"with check",[43,684,685],{},"Les lignes écrites.",[10,687,77,688,83],{},[79,689,518],{"href":690},"\u002Fsupabase\u002Frow-level-security",[14,692,694],{"id":693},"stockage","Stockage",[89,696,698],{"className":221,"code":697,"language":223,"meta":94,"style":94},"await supabase.storage.from('photos-recettes').upload('dossier\u002Fphoto.jpg', fichier)\nsupabase.storage.from('photos-recettes').getPublicUrl('dossier\u002Fphoto.jpg').data.publicUrl\n(await supabase.storage.from('photos-recettes').createSignedUrl('dossier\u002Fphoto.jpg', 3600)).data?.signedUrl\n",[47,699,700,727,750],{"__ignoreMap":94},[98,701,702,704,707,709,711,714,716,719,721,724],{"class":100,"line":101},[98,703,230],{"class":131},[98,705,706],{"class":135}," supabase.storage.",[98,708,237],{"class":236},[98,710,240],{"class":135},[98,712,713],{"class":108},"'photos-recettes'",[98,715,208],{"class":135},[98,717,718],{"class":236},"upload",[98,720,240],{"class":135},[98,722,723],{"class":108},"'dossier\u002Fphoto.jpg'",[98,725,726],{"class":135},", fichier)\n",[98,728,729,732,734,736,738,740,743,745,747],{"class":100,"line":139},[98,730,731],{"class":135},"supabase.storage.",[98,733,237],{"class":236},[98,735,240],{"class":135},[98,737,713],{"class":108},[98,739,208],{"class":135},[98,741,742],{"class":236},"getPublicUrl",[98,744,240],{"class":135},[98,746,723],{"class":108},[98,748,749],{"class":135},").data.publicUrl\n",[98,751,752,754,756,758,760,762,764,766,769,771,773,775,778],{"class":100,"line":326},[98,753,240],{"class":135},[98,755,230],{"class":131},[98,757,706],{"class":135},[98,759,237],{"class":236},[98,761,240],{"class":135},[98,763,713],{"class":108},[98,765,208],{"class":135},[98,767,768],{"class":236},"createSignedUrl",[98,770,240],{"class":135},[98,772,723],{"class":108},[98,774,183],{"class":135},[98,776,777],{"class":268},"3600",[98,779,780],{"class":135},")).data?.signedUrl\n",[10,782,77,783,83],{},[79,784,786],{"href":785},"\u002Fsupabase\u002Fstockage-et-temps-reel","Stockage et temps réel",[14,788,790],{"id":789},"temps-réel","Temps réel",[89,792,794],{"className":221,"code":793,"language":223,"meta":94,"style":94},"const canal = supabase.channel('nom')\n  .on('postgres_changes', { event: '*', schema: 'public', table: 'recettes' }, (p) => console.log(p))\n  .subscribe()\nsupabase.removeChannel(canal)\n",[47,795,796,819,868,877],{"__ignoreMap":94},[98,797,798,801,804,807,809,812,814,817],{"class":100,"line":101},[98,799,800],{"class":131},"const",[98,802,803],{"class":268}," canal",[98,805,806],{"class":131}," =",[98,808,233],{"class":135},[98,810,811],{"class":236},"channel",[98,813,240],{"class":135},[98,815,816],{"class":108},"'nom'",[98,818,292],{"class":135},[98,820,821,824,826,828,831,834,837,840,843,846,848,851,853,856,859,862,865],{"class":100,"line":139},[98,822,823],{"class":135},"  .",[98,825,573],{"class":236},[98,827,240],{"class":135},[98,829,830],{"class":108},"'postgres_changes'",[98,832,833],{"class":135},", { event: ",[98,835,836],{"class":108},"'*'",[98,838,839],{"class":135},", schema: ",[98,841,842],{"class":108},"'public'",[98,844,845],{"class":135},", table: ",[98,847,243],{"class":108},[98,849,850],{"class":135}," }, (",[98,852,10],{"class":104},[98,854,855],{"class":135},") ",[98,857,858],{"class":131},"=>",[98,860,861],{"class":135}," console.",[98,863,864],{"class":236},"log",[98,866,867],{"class":135},"(p))\n",[98,869,870,872,875],{"class":100,"line":326},[98,871,823],{"class":135},[98,873,874],{"class":236},"subscribe",[98,876,323],{"class":135},[98,878,879,882,885],{"class":100,"line":363},[98,880,881],{"class":135},"supabase.",[98,883,884],{"class":236},"removeChannel",[98,886,887],{"class":135},"(canal)\n",[89,889,891],{"className":521,"code":890,"language":523,"meta":94,"style":94},"alter publication supabase_realtime add table recettes;\n",[47,892,893],{"__ignoreMap":94},[98,894,895,897,900,903,905],{"class":100,"line":101},[98,896,530],{"class":131},[98,898,899],{"class":135}," publication supabase_realtime ",[98,901,902],{"class":131},"add",[98,904,533],{"class":131},[98,906,907],{"class":135}," recettes;\n",[10,909,77,910,83],{},[79,911,786],{"href":785},[14,913,915],{"id":914},"sécurité","Sécurité",[917,918,919,923,932],"ul",{},[920,921,922],"li",{},"RLS activée sur chaque table exposée.",[920,924,925,926,928,929,83],{},"Clé secrète jamais dans le navigateur ni dans Git, ",[47,927,123],{}," dans ",[47,930,931],{},".gitignore",[920,933,934],{},"Une redirection de page ne protège pas les données : seule la RLS le fait.",[936,937,938],"style",{},"html pre.shiki code .sIXEE, html code.shiki .sIXEE{--shiki-light:#953800;--shiki-default:#FFA657;--shiki-dark:#FFA657}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sOnC1, html code.shiki .sOnC1{--shiki-light:#CF222E;--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .scfrF, html code.shiki .scfrF{--shiki-light:#1F2328;--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}html pre.shiki code .syCW7, html code.shiki .syCW7{--shiki-light:#8250DF;--shiki-default:#D2A8FF;--shiki-dark:#D2A8FF}html pre.shiki code .s5iOY, html code.shiki .s5iOY{--shiki-light:#0550AE;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}",{"title":94,"searchDepth":139,"depth":326,"links":940},[941,942,943,944,945,946,947,948],{"id":16,"depth":139,"text":17},{"id":86,"depth":139,"text":87},{"id":217,"depth":139,"text":218},{"id":407,"depth":139,"text":408},{"id":517,"depth":139,"text":518},{"id":693,"depth":139,"text":694},{"id":789,"depth":139,"text":790},{"id":914,"depth":139,"text":915},"Le mémo de Supabase avec Nuxt : clés, configuration, requêtes, authentification, RLS, stockage et temps réel.","md",{},[953,954,5,955,956,957,958,959,960,961],"mémo","aide-mémoire","@nuxtjs\u002Fsupabase","supabase-js","RLS","auth","storage","realtime","clé publishable","memo","\u002Fsupabase",null,{"title":5,"description":949},[967,970],{"nom":968,"url":969},"Documentation de Supabase (en anglais)","https:\u002F\u002Fsupabase.com\u002Fdocs",{"nom":971,"url":972},"Module Nuxt Supabase (en anglais)","https:\u002F\u002Fsupabase.nuxtjs.org\u002F","supabase\u002Findex","5F4KeE1-sajuHK-lnOI8TkgIjjMcYL5Sn_WepUk98qw",[976,978,980,982,984,986,988],{"path":81,"title":82,"stem":977},"supabase\u002F01.decouvrir-supabase",{"path":213,"title":214,"stem":979},"supabase\u002F02.brancher-a-nuxt",{"path":403,"title":404,"stem":981},"supabase\u002F03.lire-et-ecrire",{"path":514,"title":408,"stem":983},"supabase\u002F04.authentification",{"path":690,"title":518,"stem":985},"supabase\u002F05.row-level-security",{"path":785,"title":786,"stem":987},"supabase\u002F06.stockage-et-temps-reel",{"path":963,"title":5,"stem":973},[964,990],{"title":82,"path":81,"stem":977,"description":991,"children":-1},"Ce qu'est Supabase, comment créer un projet et une première table de recettes, et quelle clé peut être publique.",[],[994,996,997,998,1000,1001,1003],{"path":81,"title":82,"niveau":995,"stem":977},"debutant",{"path":213,"title":214,"niveau":995,"stem":979},{"path":403,"title":404,"niveau":995,"stem":981},{"path":514,"title":408,"niveau":999,"stem":983},"intermediaire",{"path":690,"title":518,"niveau":999,"stem":985},{"path":785,"title":786,"niveau":1002,"stem":987},"avance",{"path":963,"title":5,"niveau":962,"stem":973},1794583430471]