<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Blog · Alexandre Axioma</title><description>Notas sobre o que ando aprendendo, construindo e pensando.</description><link>https://blog.alexandreaxioma.com/</link><language>pt-BR</language><item><title>Como eu construi meu blog com Notion</title><link>https://blog.alexandreaxioma.com/como-criei-meu-blog-com-notion/</link><guid isPermaLink="true">https://blog.alexandreaxioma.com/como-criei-meu-blog-com-notion/</guid><description>Explicar como usei o Notion para criar o meu blog</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Tem um tempo que eu queria um lugar pra publicar o que escrevo. Anotações, ideias soltas, coisas que vão aparecendo (uma espécie de digital garden). E também precisava de algo mais estruturado, pra servir de material pros vídeos que vou começar a fazer no YouTube.&lt;/p&gt;
&lt;p&gt;Durante muito tempo usei o Obsidian como meu segundo cérebro, e há pouco migrei pro Notion pela facilidade de compartilhar com o meu time de desenvolvimento. Foi aí que veio a pergunta óbvia: por que não montar meu próprio blog usando o Notion como CMS, com o meu visual, do jeito que eu quiser? Se todo mundo precisa construir suas próprias coisas, essa seria mais uma delas.&lt;/p&gt;
&lt;p&gt;E foi o que eu fiz. Hoje eu escrevo no Notion como já tô acostumado, e o que marco como pronto aparece no meu site, com o meu endereço, aberto pra qualquer um ler.&lt;/p&gt;
&lt;p&gt;Tudo meu, do conteúdo ao design.
Documentei caso você queira se inspirar, ou copiar direto o que montei. É o que vem na sequência.&lt;/p&gt;
&lt;h3 id=&quot;o-que-voce-vai-fazer&quot;&gt;O que você vai fazer&lt;/h3&gt;
&lt;p&gt;A montagem é basicamente duplicar dois templates que já deixei prontos: um com o código do blog, no GitHub, e outro com a database dos posts, no Notion. Depois é juntar os dois na Vercel, que é onde o site fica hospedado.&lt;/p&gt;
&lt;p&gt;Seguindo o passo a passo, dá pra ter tudo isso no ar sem programar nem abrir um terminal, só clicando e copiando o que eu fiz. No fim você vai ter um blog funcionando, idêntico ao meu.&lt;/p&gt;
&lt;p&gt;Mas a graça não é você ter o MEU blog. A graça é você ter o seu. Aí é com você e um agente de programação, iterando até o design ficar do seu jeito. Mais pra frente coloquei algumas dicas, mas a construção é tua.&lt;/p&gt;
&lt;p&gt;Uma última coisa antes de começar: a configuração vem em duas rodadas. Primeiro você prepara o Notion e separa alguns valores. Depois cria o projeto na Vercel, porque parte das informações só passa a existir quando o site já está no ar.&lt;/p&gt;
&lt;h3 id=&quot;antes-de-comecar-as-contas&quot;&gt;Antes de começar: as contas&lt;/h3&gt;
&lt;p&gt;Você vai usar três serviços, e provavelmente já tem conta em algum deles. Se faltar algum, é só criar, todos têm plano gratuito que já é suficiente pra gente.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Notion&lt;/strong&gt; (&lt;a href=&quot;https://notion.so/&quot; rel=&quot;noopener&quot;&gt;notion.so&lt;/a&gt;), que vai virar o painel dos posts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt; (&lt;a href=&quot;https://github.com/&quot; rel=&quot;noopener&quot;&gt;github.com&lt;/a&gt;), onde o código do blog vai morar.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Vercel&lt;/strong&gt; (&lt;a href=&quot;https://vercel.com/&quot; rel=&quot;noopener&quot;&gt;vercel.com&lt;/a&gt;), que hospeda o site e coloca no ar.&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;preparar-o-notion&quot;&gt;Preparar o Notion&lt;/h3&gt;
&lt;h4&gt;Duplicar o template do GitHub&lt;/h4&gt;
&lt;p&gt;Esse é o template com o código do blog. Abre o repositório:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/alexandre-axioma/blog-notion-template&quot; rel=&quot;noopener&quot;&gt;https://github.com/alexandre-axioma/blog-notion-template&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Clica em &lt;code&gt;Use this template&lt;/code&gt; e cria um repositório novo na sua conta. Pode dar o nome que quiser, tipo &lt;code&gt;meu-blog&lt;/code&gt;, tanto faz.&lt;/p&gt;
&lt;p&gt;Não precisa baixar nem clonar nada agora. Mais pra frente a Vercel puxa esse repositório direto do GitHub.&lt;/p&gt;
&lt;h4&gt;Duplicar o template do Notion&lt;/h4&gt;
&lt;p&gt;Esse é o outro template, o que vira o painel dos seus posts. Você vai abrir ele aqui:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://fixed-sushi-1bf.notion.site/Blog-Notion-Template-f1d13d4a408c8285a99c01101e736767&quot; rel=&quot;noopener&quot;&gt;https://fixed-sushi-1bf.notion.site/Blog-Notion-Template-f1d13d4a408c8285a99c01101e736767&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Clica em &lt;code&gt;Duplicate&lt;/code&gt; e escolhe a workspace onde você quer o blog. Vem tudo junto, a página, a database e alguns posts de exemplo.&lt;/p&gt;
&lt;p&gt;Vale entender o que você acabou de copiar, porque são duas coisas com nomes parecidos. A database &lt;code&gt;Blog Content Management&lt;/code&gt; é onde os posts realmente vivem, cada post é uma linha, com título, status, data e o resto. Já a página &lt;code&gt;Blog Notion Template&lt;/code&gt; é só uma tela montada por cima dessa database, com algumas views pra você visualizar e organizar os posts de um jeito mais agradável. O conteúdo é o mesmo, a página é só uma janela pra ele.&lt;/p&gt;
&lt;p&gt;Essa diferença importa porque mais pra frente a Vercel vai pedir o ID da database, e não o da página. São coisas distintas no Notion e têm IDs distintos. Te mostro como pegar o certo na hora.&lt;/p&gt;
&lt;h4&gt;Entender a database&lt;/h4&gt;
&lt;p&gt;Não precisa criar nada disso, as propriedades já vêm no template. Essa lista é só pra você saber pra que serve cada campo quando for escrever.&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot;&gt;&lt;table class=&quot;prose-table&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Propriedade&lt;/th&gt;&lt;th&gt;Para que serve&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Titulo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;O título do post. Se você deixar o &lt;code&gt;Slug&lt;/code&gt; vazio, o site gera a URL a partir daqui.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Status&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Decide se o post aparece no blog. Use &lt;code&gt;Publicado&lt;/code&gt; pra publicar.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Data de Publicação&lt;/code&gt;&lt;/td&gt;&lt;td&gt;A data do post. Também é o que permite agendar (veja abaixo).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Resumo do Conteúdo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;O texto curto que aparece na home, nos previews e no SEO.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Categoria&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Agrupa os posts por tema.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Tags&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Palavras-chave ou temas secundários.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Slug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;A URL do post, tipo &lt;code&gt;meu-primeiro-post&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Link&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Opcional, pra guardar uma referência externa.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Quantidade de Palavras&lt;/code&gt;&lt;/td&gt;&lt;td&gt;O blog usa pra estimar o tempo de leitura.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Hero&lt;/code&gt;&lt;/td&gt;&lt;td&gt;A imagem principal do post.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Thumb&lt;/code&gt;&lt;/td&gt;&lt;td&gt;A imagem dos cards e listagens.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;SEO Score&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Opcional, preenchido pelo extra de auditoria de SEO.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;As duas que mais importam são &lt;code&gt;Status&lt;/code&gt; e &lt;code&gt;Data de Publicação&lt;/code&gt;. Pra um post ir pro ar, o &lt;code&gt;Status&lt;/code&gt; precisa estar como &lt;code&gt;Publicado&lt;/code&gt; (também vale &lt;code&gt;Published&lt;/code&gt; ou &lt;code&gt;Publish&lt;/code&gt;). E pra agendar, deixa o &lt;code&gt;Status&lt;/code&gt; como &lt;code&gt;Programado&lt;/code&gt; ou &lt;code&gt;Scheduled&lt;/code&gt; e põe uma data futura em &lt;code&gt;Data de Publicação&lt;/code&gt;. O post fica guardado e só aparece quando a data chega.&lt;/p&gt;
&lt;p&gt;O resto dos campos eu não detalhei de propósito, ficaria longo demais e a maioria é autoexplicativa. No vídeo eu explico com mais calma cada um.&lt;/p&gt;
&lt;h4&gt;Criar a integration do Notion&lt;/h4&gt;
&lt;p&gt;Pro site conseguir ler a sua database, o Notion exige que você crie uma integration e dê pra ela uma chave de acesso. É isso que essa etapa faz, e é tudo numa tela só.&lt;/p&gt;
&lt;p&gt;Vai na área de integrations do Notion:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.notion.so/profile/integrations&quot; rel=&quot;noopener&quot;&gt;https://www.notion.so/profile/integrations&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Clica em &lt;code&gt;New integration&lt;/code&gt; (ou &lt;code&gt;New connection&lt;/code&gt;, dependendo da versão), dá um nome tipo &lt;code&gt;Meu Blog&lt;/code&gt;, escolhe a workspace onde você duplicou o template e cria. Isso te leva pra tela da connection, e o resto da configuração acontece toda aqui.&lt;/p&gt;
&lt;p&gt;Primeiro, o &lt;code&gt;Access token&lt;/code&gt;, na aba &lt;code&gt;Configuration&lt;/code&gt;. Copia ele e guarda, é o valor que a Vercel vai pedir depois como &lt;code&gt;NOTION_TOKEN&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ainda nessa aba, ajusta as capabilities. A ideia é dar pra integration só o acesso que o blog precisa:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;code&gt;Read content&lt;/code&gt;: ligado, é o que deixa o site ler os posts&lt;/li&gt;&lt;li&gt;&lt;code&gt;Update content&lt;/code&gt;: depende, veja abaixo&lt;/li&gt;&lt;li&gt;&lt;code&gt;Insert content&lt;/code&gt;: desligado&lt;/li&gt;&lt;li&gt;&lt;code&gt;No user information&lt;/code&gt;: selecionado&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;O &lt;code&gt;Update content&lt;/code&gt; é a única decisão aqui, e ela tem a ver com um extra opcional de SEO. Esse extra roda de tempos em tempos, passa nos seus posts publicados e grava em cada um a nota que o Google dá de SEO, ali no próprio Notion. Serve só pra você ter uma noção de como seus posts estão ranqueando, nada além disso. Pra ele conseguir escrever essa nota de volta, a integration precisa do &lt;code&gt;Update content&lt;/code&gt; ligado.&lt;/p&gt;
&lt;p&gt;Se isso te interessa, liga o &lt;code&gt;Update content&lt;/code&gt; agora e já deixa pronto. A configuração do resto (uma chave do Google, basicamente) fica pra mais pra frente, num bloco só sobre isso. Se você só quer escrever e publicar, deixa desligado e esquece, o blog funciona perfeitamente sem.&lt;/p&gt;
&lt;p&gt;Por último, falta liberar o acesso. O token diz quem é a integration, mas não dá acesso a nada por padrão, você ainda precisa apontar quais páginas e databases ela pode ler. Vai na aba &lt;code&gt;Content access&lt;/code&gt;, clica em &lt;code&gt;Edit access&lt;/code&gt;, marca a página &lt;code&gt;Blog Notion Template&lt;/code&gt; (e a &lt;code&gt;Blog Content Management&lt;/code&gt;, se ela aparecer separada) e salva.&lt;/p&gt;
&lt;p&gt;Antes de sair, confere uma coisa: a aba &lt;code&gt;Content access&lt;/code&gt; não pode estar vazia. Se ficar, o site não lê os seus posts por mais que o token esteja certo.&lt;/p&gt;
&lt;h4&gt;Copiar o ID da database&lt;/h4&gt;
&lt;p&gt;Essa é a hora que eu prometi lá atrás. Você precisa do ID da database &lt;code&gt;Blog Content Management&lt;/code&gt;, não o da página.&lt;/p&gt;
&lt;p&gt;No menu lateral, abre a &lt;code&gt;Blog Content Management&lt;/code&gt; em tela cheia e copia a URL. O ID é a sequência de letras e números do endereço. Se tiver um &lt;code&gt;?v=&lt;/code&gt;, pega só o que vem antes; o que vem depois é o ID da view.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://www.notion.so/2dfd76f2b52383c690cb01b9164f0ff7?v=48ad76f2b52383d29bf3887c4474f1fd&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Nesse caso, o ID é:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;2dfd76f2b52383c690cb01b9164f0ff7&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;É esse valor que vai na variável &lt;code&gt;NOTION_BLOG_DATABASE_ID&lt;/code&gt; na Vercel.&lt;/p&gt;
&lt;h4&gt;Ativar o SEO (opcional)&lt;/h4&gt;
&lt;p&gt;Esse é o extra que comentei lá em cima, quando você decidiu sobre o &lt;code&gt;Update content&lt;/code&gt;. Se deixou desligado, pula pra próxima etapa. Nada aqui é necessário pro blog funcionar.&lt;/p&gt;
&lt;p&gt;Se ligou, o que falta agora são duas chaves. Te adianto que a config do SEO se divide em dois momentos por causa do fluxo. Essas chaves entram como variáveis na criação do projeto, então têm que ficar prontas antes da Vercel. Já a parte que faz tudo rodar sozinho depende de o site ter um endereço público, então só dá pra ligar lá na frente, num bloco à parte. Por enquanto, as chaves.&lt;/p&gt;
&lt;p&gt;Uma delas é um segredo seu, pra proteger a rota de auditoria de quem não deveria estar chamando ela. Gera uma senha longa, uns 32 caracteres pra cima, no gerador do Bitwarden ou onde você quiser.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bitwarden.com/password-generator/&quot; rel=&quot;noopener&quot;&gt;https://bitwarden.com/password-generator/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SEO_AUDIT_SECRET=uma_senha_longa_e_aleatoria&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A outra é uma chave do Google PageSpeed, e essa é opcional até dentro do opcional. A API roda sem chave, mas o Google recomenda uma quando as consultas são frequentes, que é o que acontece num audit automático. Se quiser, começa sem e adiciona depois.&lt;/p&gt;
&lt;p&gt;Pra gerar, abre a API do PageSpeed no Google Cloud e habilita ela:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://console.cloud.google.com/apis/library/pagespeedonline.googleapis.com&quot; rel=&quot;noopener&quot;&gt;https://console.cloud.google.com/apis/library/pagespeedonline.googleapis.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Depois vai em credenciais e cria uma API key:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://console.cloud.google.com/apis/credentials&quot; rel=&quot;noopener&quot;&gt;https://console.cloud.google.com/apis/credentials&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Clica em &lt;code&gt;Create credentials&lt;/code&gt; e escolhe &lt;code&gt;API key&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Dá um nome qualquer, tipo &lt;code&gt;Blog&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Em &lt;code&gt;API restrictions&lt;/code&gt;, seleciona &lt;code&gt;PageSpeed Insights API&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Em &lt;code&gt;Application restrictions&lt;/code&gt;, deixa &lt;code&gt;None&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Clica em &lt;code&gt;Create&lt;/code&gt; e copia a chave.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Quem usa essa chave é o backend do site, não o navegador, então não tem por que prender ela a um domínio em &lt;code&gt;Application restrictions&lt;/code&gt;. O que vale restringir mesmo é a API, no passo 3.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PAGESPEED_API_KEY=sua_chave_do_pagespeed&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;publicar-na-vercel&quot;&gt;Publicar na Vercel&lt;/h3&gt;
&lt;h4&gt;Juntar tudo antes da Vercel&lt;/h4&gt;
&lt;p&gt;Agora é só reunir o que você separou até aqui, porque tudo isso vai ser colado de uma vez na criação do projeto.&lt;/p&gt;
&lt;p&gt;Pra qualquer blog, os dois essenciais são:&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot;&gt;&lt;table class=&quot;prose-table&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Nome&lt;/th&gt;&lt;th&gt;Valor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;NOTION_TOKEN&lt;/code&gt;&lt;/td&gt;&lt;td&gt;O access token da integration&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;NOTION_BLOG_DATABASE_ID&lt;/code&gt;&lt;/td&gt;&lt;td&gt;O ID da database &lt;code&gt;Blog Content Management&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;E se você foi pelo caminho do SEO, junta também estes:&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot;&gt;&lt;table class=&quot;prose-table&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Nome&lt;/th&gt;&lt;th&gt;Valor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;SEO_AUDIT_SECRET&lt;/code&gt;&lt;/td&gt;&lt;td&gt;A senha que você gerou&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;PAGESPEED_API_KEY&lt;/code&gt;&lt;/td&gt;&lt;td&gt;A chave do Google (se você criou)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Deixa esses valores à mão. No próximo passo você cria o projeto na Vercel e cola todos eles de uma vez.&lt;/p&gt;
&lt;h4&gt;Criar o projeto&lt;/h4&gt;
&lt;p&gt;Entra na Vercel, clica em &lt;code&gt;Add New&lt;/code&gt; e depois em &lt;code&gt;Project&lt;/code&gt;, e importa o repositório que você criou lá no GitHub.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vercel.com/&quot; rel=&quot;noopener&quot;&gt;https://vercel.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ela vai identificar que é um projeto Astro, não precisa mexer em nada disso. Antes de dar o deploy, vai ter um espaço pra adicionar as variáveis de ambiente, e é ali que entram os valores que você juntou no passo anterior. Se você não foi pelo SEO, são só os dois primeiros.&lt;/p&gt;
&lt;p&gt;Com tudo no lugar, dá o deploy e espera terminar.&lt;/p&gt;
&lt;p&gt;Quando terminar, abre a URL que aparecer e dá uma olhada se os posts em &lt;code&gt;Publicado&lt;/code&gt; estão lá. Se estiverem, deu certo, tá tudo funcionando.&lt;/p&gt;
&lt;h4&gt;Escolher a URL do blog&lt;/h4&gt;
&lt;p&gt;Depois do primeiro deploy, abre o &lt;code&gt;Overview&lt;/code&gt; do projeto na Vercel. Em &lt;code&gt;Production Deployment&lt;/code&gt; tem um campo &lt;code&gt;Domains&lt;/code&gt;, e é ali que está a URL boa do seu blog, algo tipo &lt;code&gt;meu-blog-chi.vercel.app&lt;/code&gt;. Essa é a que você vai usar pra tudo daqui pra frente.&lt;/p&gt;
&lt;p&gt;A Vercel também mostra uma URL bem mais longa, do deployment específico. Essa não serve, ela muda a cada deploy. Fica sempre com a do &lt;code&gt;Domains&lt;/code&gt;, que é estável.&lt;/p&gt;
&lt;p&gt;Se você quiser usar um domínio seu, tipo &lt;code&gt;blog.seudominio.com&lt;/code&gt;, dá pra configurar agora em &lt;code&gt;Add Custom Domain&lt;/code&gt;. É seguir as instruções de DNS que a Vercel mostra e esperar ficar ativo, e aí é esse domínio que você usa no lugar do &lt;code&gt;.vercel.app&lt;/code&gt; nos próximos passos.&lt;/p&gt;
&lt;p&gt;Guarda essa URL, qualquer que seja a sua. Ela é a base do webhook que a gente vai montar pra publicação automática.&lt;/p&gt;
&lt;h3 id=&quot;ligar-a-publicacao-automatica&quot;&gt;Ligar a publicação automática&lt;/h3&gt;
&lt;h4&gt;Criar o deploy hook da Vercel&lt;/h4&gt;
&lt;p&gt;O deploy hook é uma URL especial da Vercel. Quem chamar ela dispara um rebuild do site, e é exatamente isso que o Notion vai fazer toda vez que você publicar um post.&lt;/p&gt;
&lt;p&gt;Na Vercel, vai em &lt;code&gt;Settings&lt;/code&gt;, depois &lt;code&gt;Git&lt;/code&gt;, e procura por &lt;code&gt;Deploy Hooks&lt;/code&gt;. Cria um com um nome qualquer, tipo &lt;code&gt;notion-blog-publish&lt;/code&gt;, aponta pra branch principal (normalmente &lt;code&gt;main&lt;/code&gt;) e copia a URL que ela gera.&lt;/p&gt;
&lt;p&gt;Essa URL vira mais uma variável de ambiente. Volta em &lt;code&gt;Settings&lt;/code&gt;, depois &lt;code&gt;Environment Variables&lt;/code&gt;, e adiciona ela como &lt;code&gt;VERCEL_DEPLOY_HOOK_URL&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;Criar o webhook do Notion&lt;/h4&gt;
&lt;p&gt;Agora é avisar o Notion pra chamar aquele deploy hook sempre que algo mudar nos seus posts. Isso é um webhook, e ele aponta pra uma rota que já existe no seu site, a sua URL com &lt;code&gt;/api/notion-webhook&lt;/code&gt; no final.&lt;/p&gt;
&lt;p&gt;Então se o seu blog está em &lt;code&gt;meu-blog-chi.vercel.app&lt;/code&gt;, o endereço do webhook é:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://meu-blog-chi.vercel.app/api/notion-webhook&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Se você pôs domínio próprio, usa ele no lugar, mesma coisa com &lt;code&gt;/api/notion-webhook&lt;/code&gt; no fim.&lt;/p&gt;
&lt;p&gt;Esse webhook se cria na mesma connection do Notion de antes, na aba &lt;code&gt;Webhooks&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.notion.so/profile/integrations&quot; rel=&quot;noopener&quot;&gt;https://www.notion.so/profile/integrations&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cria uma nova subscription, cola a URL do seu site e, em &lt;code&gt;API version&lt;/code&gt;, deixa a mais recente que aparecer. Aí vem a parte que exige atenção, os eventos. O Notion deixa marcar um monte deles, mas o template só usa três. Expande o grupo &lt;code&gt;Page&lt;/code&gt; e marca só estes:&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot;&gt;&lt;table class=&quot;prose-table&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Evento&lt;/th&gt;&lt;th&gt;Dispara quando&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;page.created&lt;/code&gt;&lt;/td&gt;&lt;td&gt;você cria um post novo na database&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;page.properties_updated&lt;/code&gt;&lt;/td&gt;&lt;td&gt;você muda uma propriedade, tipo &lt;code&gt;Status&lt;/code&gt;, &lt;code&gt;Slug&lt;/code&gt; ou &lt;code&gt;Data de Publicação&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;page.deleted&lt;/code&gt;&lt;/td&gt;&lt;td&gt;um post vai pra lixeira&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Todo o resto fica desmarcado, inclusive o &lt;code&gt;page.content_updated&lt;/code&gt;. Esse último é de propósito: ele dispararia a cada vez que o Notion salva o corpo do texto sozinho, e você acabaria com um rebuild a cada palavra digitada. O blog publica com base nas propriedades, não no autosave.&lt;/p&gt;
&lt;p&gt;Vai parecer que o grupo &lt;code&gt;Page&lt;/code&gt; ficou só parcialmente marcado, uns &lt;code&gt;3/8 events&lt;/code&gt;. É assim mesmo. Clica em &lt;code&gt;Create subscription&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;Verificar o webhook&lt;/h4&gt;
&lt;p&gt;Assim que você cria a subscription, o Notion avisa que o endpoint ainda precisa ser verificado. Isso é esperado. Por baixo, o Notion mandou um token pra sua rota no momento da criação, e o código do template já pega esse token e joga ele nos logs da Vercel pra você.&lt;/p&gt;
&lt;p&gt;Então vai nos logs da função na Vercel e procura uma linha assim:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Notion webhook verification token: ...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Copia o que vem depois dos dois pontos. Esse é o token, e ele vira a última variável de ambiente do projeto. Adiciona ele na Vercel como &lt;code&gt;NOTION_WEBHOOK_VERIFICATION_TOKEN&lt;/code&gt; e agora sim faz o redeploy, que de quebra também ativa o &lt;code&gt;VERCEL_DEPLOY_HOOK_URL&lt;/code&gt; que você tinha salvado antes.&lt;/p&gt;
&lt;p&gt;Com o site no ar de novo, volta na aba &lt;code&gt;Webhooks&lt;/code&gt; do Notion, clica em &lt;code&gt;Verify&lt;/code&gt;, cola o mesmo token e confirma.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.notion.so/profile/integrations&quot; rel=&quot;noopener&quot;&gt;https://www.notion.so/profile/integrations&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pronto, o webhook fica ativo e o Notion já consegue avisar o site quando você mexer nos posts.&lt;/p&gt;
&lt;h4&gt;Testar a publicação automática&lt;/h4&gt;
&lt;p&gt;Agora o teste que vale por tudo. Vai no Notion e cria um post novo na database, preenche os campos como faria de verdade, &lt;code&gt;Titulo&lt;/code&gt;, &lt;code&gt;Resumo do Conteúdo&lt;/code&gt;, &lt;code&gt;Categoria&lt;/code&gt;, &lt;code&gt;Slug&lt;/code&gt;, &lt;code&gt;Data de Publicação&lt;/code&gt;, e escreve algumas linhas no corpo do post também, qualquer coisa, só pra ele não nascer vazio. Aí põe o &lt;code&gt;Status&lt;/code&gt; como &lt;code&gt;Publicado&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Volta na Vercel e fica de olho. Em alguns segundos um deployment novo começa sozinho, sem você ter feito nada. Esse é o webhook funcionando. O Notion avisou a Vercel, e ela está reconstruindo o site. Quando terminar, abre a home do blog e o post novo tem que estar lá.&lt;/p&gt;
&lt;p&gt;Se apareceu, acabou. O ciclo inteiro está de pé, você escreve no Notion, marca como publicado, e o blog se atualiza sozinho. É isso que você montou.&lt;/p&gt;
&lt;h3 id=&quot;depois-que-estiver-no-ar&quot;&gt;Depois que estiver no ar&lt;/h3&gt;
&lt;h4&gt;Como atualizar um post&lt;/h4&gt;
&lt;p&gt;Tem um detalhe no uso do dia a dia que vale saber. Como o blog ignora mudanças no corpo do texto (pra não ficar republicando a cada autosave), editar só um parágrafo do post nem sempre dispara um novo deploy. O texto muda no Notion, mas o site não percebe.&lt;/p&gt;
&lt;p&gt;Pra forçar a republicação, é só mexer numa propriedade depois de editar, porque é isso que o webhook escuta. O truque mais fácil é mudar o &lt;code&gt;Status&lt;/code&gt; pra qualquer outra coisa e voltar pra &lt;code&gt;Publicado&lt;/code&gt;. Isso conta como uma mudança de propriedade e o site reconstrói com o texto novo.&lt;/p&gt;
&lt;h4&gt;Rodar o SEO audit&lt;/h4&gt;
&lt;p&gt;Se você foi pelo caminho do SEO lá atrás, é aqui que ele entra em operação. Quem deixou desligado pode pular essa parte inteira.&lt;/p&gt;
&lt;p&gt;A boa notícia é que metade do trabalho já está feito. Aquelas duas chaves que você gerou (o &lt;code&gt;SEO_AUDIT_SECRET&lt;/code&gt; e o &lt;code&gt;PAGESPEED_API_KEY&lt;/code&gt;) já estão na Vercel desde a criação do projeto, e o GitHub Action que faz tudo rodar sozinho já vem junto no template, em &lt;code&gt;.github/workflows/seo-audit.yml&lt;/code&gt;. Você não precisa criar nem colar nada.&lt;/p&gt;
&lt;p&gt;O que falta é só dar pro GitHub as duas informações que ele precisa pra chamar a rota do audit no seu site. Isso vai como repository secret. No repositório do seu blog no GitHub, vai em &lt;code&gt;Settings&lt;/code&gt;, depois &lt;code&gt;Secrets and variables&lt;/code&gt;, depois &lt;code&gt;Actions&lt;/code&gt;, e cria dois novos secrets:&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot;&gt;&lt;table class=&quot;prose-table&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Nome&lt;/th&gt;&lt;th&gt;Valor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;SEO_AUDIT_SECRET&lt;/code&gt;&lt;/td&gt;&lt;td&gt;O mesmo valor que você colocou na Vercel&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;SEO_AUDIT_URL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;A URL do seu blog com &lt;code&gt;/api/seo-audit&lt;/code&gt; no final&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Com os dois salvos, o Action já passa a rodar sozinho perto de quatro vezes por hora, passando nos seus posts publicados e gravando a nota de SEO no Notion. Se quiser ver acontecendo agora, vai na aba &lt;code&gt;Actions&lt;/code&gt; do repositório, abre o workflow &lt;code&gt;SEO audit&lt;/code&gt; e clica em &lt;code&gt;Run workflow&lt;/code&gt;. Em alguns segundos a propriedade &lt;code&gt;SEO Score&lt;/code&gt; no Notion deve começar a aparecer preenchida.&lt;/p&gt;
&lt;p&gt;Vale dizer que isso aqui é independente da publicação. Quando você publica um post, é o webhook do Notion que faz a Vercel reconstruir o site, e isso já tinha sido configurado lá atrás. O Action de SEO só entra depois, lendo o post que já está no ar pra medir e anotar a nota. Os dois sistemas não se misturam.&lt;/p&gt;
&lt;p&gt;Um detalhe da aba &lt;code&gt;Actions&lt;/code&gt;: o GitHub às vezes atrasa ou pula execuções agendadas em horários de muita carga, então os horários podem sair irregulares. Isso é normal e não tem o que fazer, faz parte do plano grátis. Pra blogs pequenos não chega a ser um problema, o score continua aparecendo perto da publicação.&lt;/p&gt;
&lt;h4&gt;Customizar a UI&lt;/h4&gt;
&lt;p&gt;Daqui pra frente é design, e isso eu não vou conseguir fazer por você. É escolha sua, e a melhor forma de chegar onde você quer é trabalhar com um agente de programação em cima do código, descrevendo o que quer, vendo o resultado e refinando. Eu uso o Claude Code com o Opus 4.7, que hoje é o melhor pra frontend, mas Codex ou outro também resolvem.&lt;/p&gt;
&lt;p&gt;Uma coisa que faz bastante diferença é mandar referência visual em vez de tentar descrever o estilo com palavra. Dizer &amp;quot;deixa mais limpo&amp;quot; não leva a lugar nenhum, enquanto um screenshot de um blog que você acha bonito passa em segundos uma informação que você levaria parágrafos pra explicar mal. E isso funciona ainda melhor agora porque o Opus 4.7 lê imagem numa resolução bem mais alta que os modelos anteriores, então um print de uma página inteira que antes chegava borrado e fazia ele perder detalhe agora é lido com nitidez de tipografia, espaçamento e cor. Vale juntar quantas referências você tiver.&lt;/p&gt;
&lt;p&gt;Outra coisa é resolver o design aos poucos em vez de pedir pra ele refazer tudo de uma vez, que costuma dar errado. Começando pela home, depois a página de post, e assim por diante, fica mais fácil acompanhar o que mudou e voltar atrás quando alguma coisa sai errado.&lt;/p&gt;
&lt;p&gt;Vale dar uma olhada na skill &lt;code&gt;frontend-design&lt;/code&gt;, da Anthropic, que carrega no agente um monte de boa prática de design e ajuda principalmente quando você sente que algo está errado mas não sabe dizer o quê.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.skills.sh/anthropics/skills/frontend-design&quot; rel=&quot;noopener&quot;&gt;https://www.skills.sh/anthropics/skills/frontend-design&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tô preparando um conteúdo só sobre fazer um bom UI/UX com agente, com bem mais profundidade que essas dicas soltas. Quando sair, atualizo esse post com o link, então se chegou até aqui, fica de olho.&lt;/p&gt;
&lt;h3 id=&quot;e-isso&quot;&gt;É isso&lt;/h3&gt;
&lt;p&gt;No fim das contas, o que você montou é simples de dizer. Um lugar seu na internet, alimentado pelo Notion, que se você ainda não usa, deveria. Você escreve lá dentro, marca o post como pronto, e o resto acontece sozinho.&lt;/p&gt;
&lt;p&gt;A parte técnica acaba aqui, mas o blog em si tá só começando. Ele ainda tem a minha cara, não a sua. O que vai fazer ele virar seu de verdade é o que você vai fazer a partir de agora, escrevendo nele e deixando ele com o seu jeito.&lt;/p&gt;
&lt;p&gt;Se montar o seu, queria muito ver.&lt;/p&gt;</content:encoded></item><item><title>O Guia do Mochileiro das Galáxias</title><link>https://blog.alexandreaxioma.com/teste/</link><guid isPermaLink="true">https://blog.alexandreaxioma.com/teste/</guid><description>Falar sobre o livro</description><pubDate>Thu, 15 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;essa-e-a-h1-do-post&quot;&gt;Essa é a H1 do Post&lt;/h2&gt;
&lt;h3 id=&quot;e-essa-e-a-h2&quot;&gt;E essa é a  H2&lt;/h3&gt;
&lt;p&gt;Oi&lt;/p&gt;
&lt;p&gt;Teste Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of &amp;quot;de Finibus Bonorum et Malorum&amp;quot; (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, &amp;quot;Lorem ipsum dolor sit amet..&amp;quot;, comes from a line in section 1.10.32.&lt;/p&gt;
&lt;p&gt;The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from &amp;quot;de Finibus Bonorum et Malorum&amp;quot; by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Bullet list 1&lt;/li&gt;&lt;li&gt;Bullet list 2&lt;/li&gt;&lt;li&gt;Bullet list 3&lt;/li&gt;&lt;li&gt;Bullet list 4&lt;ul&gt;&lt;li&gt;Nested Bullet 1&lt;ul&gt;&lt;li&gt;Nested Bullet 2&lt;ul&gt;&lt;li&gt;Neste Bullet 3&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;ol&gt;&lt;li&gt;Teste 1&lt;/li&gt;&lt;li&gt;2&lt;/li&gt;&lt;li&gt;3&lt;/li&gt;&lt;/ol&gt;
&lt;aside class=&quot;callout callout--gray&quot;&gt;
        
        &lt;div class=&quot;callout__body&quot;&gt;
          &lt;p&gt;Esse é um callout legal!&lt;/p&gt;
          
        &lt;/div&gt;
      &lt;/aside&gt;
&lt;div class=&quot;todo-list&quot;&gt;&lt;div class=&quot;todo&quot;&gt;
    &lt;span class=&quot;todo__check&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
    &lt;div class=&quot;todo__body&quot;&gt;
      &lt;span class=&quot;todo__text&quot;&gt;Check 1&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;&lt;div class=&quot;todo&quot;&gt;
    &lt;span class=&quot;todo__check&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
    &lt;div class=&quot;todo__body&quot;&gt;
      &lt;span class=&quot;todo__text&quot;&gt;Check 2&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;&lt;/div&gt;
&lt;details class=&quot;toggle&quot;&gt;
        &lt;summary&gt;&lt;span class=&quot;toggle__label&quot;&gt;Toggle 1&lt;/span&gt;&lt;/summary&gt;
        &lt;div class=&quot;toggle__body&quot;&gt;&lt;/div&gt;
      &lt;/details&gt;
&lt;details class=&quot;toggle&quot;&gt;
        &lt;summary&gt;&lt;span class=&quot;toggle__label&quot;&gt;Toogle2&lt;/span&gt;&lt;/summary&gt;
        &lt;div class=&quot;toggle__body&quot;&gt;&lt;details class=&quot;toggle&quot;&gt;
        &lt;summary&gt;&lt;span class=&quot;toggle__label&quot;&gt;Toogle dentro de Toogle&lt;/span&gt;&lt;/summary&gt;
        &lt;div class=&quot;toggle__body&quot;&gt;&lt;/div&gt;
      &lt;/details&gt;&lt;/div&gt;
      &lt;/details&gt;
&lt;blockquote&gt;Quote é massa tambem.&lt;/blockquote&gt;
&lt;div class=&quot;table-wrap&quot;&gt;&lt;table class=&quot;prose-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Como &lt;/td&gt;&lt;td&gt;Que &lt;/td&gt;&lt;td&gt;Fica uma tabela&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;item 1&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;item 2&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;figure&gt;
        &lt;img src=&quot;/static/notion/35b45c19f43480fcb532e5e85fe674ab.png&quot; alt=&quot;Tem como eu colocar uma Caption aqui!&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
        &lt;figcaption&gt;Tem como eu colocar uma Caption aqui!&lt;/figcaption&gt;
      &lt;/figure&gt;
&lt;figure class=&quot;video-figure&quot;&gt;
          &lt;video controls preload=&quot;metadata&quot; src=&quot;/static/notion/35b45c19f43480f7879bd547c2341df4.mp4&quot;&gt;&lt;/video&gt;
          &lt;figcaption&gt;E tem como eu colocar aqui tambem&lt;/figcaption&gt;
        &lt;/figure&gt;
&lt;div class=&quot;code-block&quot;&gt;
        &lt;div class=&quot;code-block__bar&quot;&gt;&lt;span class=&quot;code-block__lang&quot;&gt;javascript&lt;/span&gt;&lt;button class=&quot;code-block__copy&quot; type=&quot;button&quot; aria-label=&quot;Copiar código&quot;&gt;&lt;span class=&quot;code-block__copy-label&quot;&gt;Copiar&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;
        &lt;pre class=&quot;shiki rose-pine-moon&quot; style=&quot;background-color:#232136;color:#e0def4&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;import type &lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; VercelRequest&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; VercelResponse&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; from &lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;@vercel/node&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;import &lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; createHmac&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; timingSafeEqual&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; from &lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;node:crypto&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;import &lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; Client&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; from &lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;@notionhq/client&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; publishedStatuses&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; Set&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;published&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; &quot;publicado&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; &quot;publish&quot;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; statusPropertyNames&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;Status&quot;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;export default async function &lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;handler&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#C4A7E7;font-style:italic&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt;VercelRequest&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#C4A7E7;font-style:italic&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt;VercelResponse&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  if &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;method&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; !== &lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;POST&quot;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;    response&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;405&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ok&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; error&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; &quot;Method not allowed&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;JSON&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;stringify&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ?? &lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;verificationToken&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; =&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;    request&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;verification_token&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ??&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;    request&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;verificationToken&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  if &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;verificationToken&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;Notion webhook verification token:&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; verificationToken&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;    response&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;      ok&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;      verification_token&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; verificationToken&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;notionWebhookToken&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;process&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;NOTION_WEBHOOK_VERIFICATION_TOKEN&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;signature&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;headers&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;x-notion-signature&quot;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  if &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;    notionWebhookToken&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    typeof &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;signature&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; === &lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    !&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;isValidSignature&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; signature&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; notionWebhookToken&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;  )&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;    response&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;401&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ok&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; error&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; &quot;Invalid Notion signature&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;shouldDeploy&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; = await &lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;shouldTriggerDeploy&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  if &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;shouldDeploy&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;    response&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ok&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; deployTriggered&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; skipped&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;deployHookUrl&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;process&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;VERCEL_DEPLOY_HOOK_URL&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  if &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;deployHookUrl&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;warn&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;VERCEL_DEPLOY_HOOK_URL is missing. Webhook received, but deploy was not triggered.&quot;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;    response&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ok&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; deployTriggered&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;deployResponse&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; = await &lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;fetch&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;deployHookUrl&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; method&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; &quot;POST&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  if &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;deployResponse&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;ok&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;warn&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;Deploy hook failed:&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; deployResponse&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; await &lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;deployResponse&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;())&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;  response&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    ok&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    deployTriggered&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; deployResponse&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;ok&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    status&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; deployResponse&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; shouldTriggerDeploy&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#C4A7E7;font-style:italic&quot;&gt;payload&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; any&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt;boolean&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; eventType&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; payload&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;eventType&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; &quot;page.deleted&quot;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;page.content_updated&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; &quot;page.properties_updated&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; &quot;page.created&quot;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;includes&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;eventType&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; pageId&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; payload&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;entity&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; &quot;page&quot;&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; payload&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;entity&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;pageId&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; retrieveNotionPage&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;pageId&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;isBlogPage&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; status&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; getProperty&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;properties&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ??&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {},&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; statusPropertyNames&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ??&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;eventType&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; &quot;page.properties_updated&quot;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; publishedStatuses&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;has&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;toLowerCase&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;())&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; retrieveNotionPage&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#C4A7E7;font-style:italic&quot;&gt;pageId&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt;any&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; notionToken&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; process&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;NOTION_TOKEN&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;notionToken&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;warn&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;NOTION_TOKEN is missing. Skipping webhook-triggered deploy.&quot;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; notion&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; Client&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt; auth&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; notionToken&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; notion&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;pages&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;retrieve&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt; page_id&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; pageId&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; catch&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;    console&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;warn&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;Unable to retrieve Notion page for webhook event:&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; error&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; isBlogPage&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#C4A7E7;font-style:italic&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; any&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; boolean&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; databaseId&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; normalizeId&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;process&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;NOTION_BLOG_DATABASE_ID&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ??&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; parentId&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; normalizeId&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;database_id&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ??&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; Boolean&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;databaseId&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; parentId&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; databaseId&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; parentId&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; isValidSignature&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#C4A7E7;font-style:italic&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#C4A7E7;font-style:italic&quot;&gt; signature&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#C4A7E7;font-style:italic&quot;&gt; verificationToken&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; boolean&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; calculatedSignature&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; `sha256=&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;createHmac&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;sha256&quot;&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; verificationToken&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;update&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;digest&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;&quot;hex&quot;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; timingSafeEqual&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;Buffer&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;calculatedSignature&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; Buffer&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;signature&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; catch&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; normalizeId&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#C4A7E7;font-style:italic&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; value&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt;/-/&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;g&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#F6C177&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt;toLowerCase&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; getProperty&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#C4A7E7;font-style:italic&quot;&gt;pageProperties&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; Record&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; any&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#C4A7E7;font-style:italic&quot;&gt; names&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;[]&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9CCFD8&quot;&gt; any&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; names&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;pageProperties&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;]) &lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;      return&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt; pageProperties&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4;font-style:italic&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E0DEF4&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#3E8FB0&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#EA9A97&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#908CAA&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
      &lt;/div&gt;
&lt;p&gt;
Código!&lt;/p&gt;
&lt;figure class=&quot;embed&quot;&gt;&lt;a class=&quot;embed__card embed__card--rich&quot; href=&quot;http://alexandreaxioma.com&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;
    &lt;div class=&quot;embed__card-info&quot;&gt;
      &lt;span class=&quot;embed__card-title&quot;&gt;Alexandre Axioma&lt;/span&gt;
      &lt;span class=&quot;embed__card-desc&quot;&gt;Todos os meus links em um só lugar.&lt;/span&gt;
      &lt;span class=&quot;embed__card-meta&quot;&gt;
        &lt;img class=&quot;embed__card-favicon&quot; src=&quot;https://www.google.com/s2/favicons?domain=alexandreaxioma.com&amp;amp;sz=64&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
        &lt;span class=&quot;embed__card-host&quot;&gt;alexandreaxioma.com&lt;/span&gt;
      &lt;/span&gt;
    &lt;/div&gt;
    &lt;div class=&quot;embed__card-thumb&quot;&gt;&lt;img src=&quot;https://www.alexandreaxioma.com/static/images/og-image.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;embed&quot;&gt;&lt;a class=&quot;embed__card embed__card--rich&quot; href=&quot;http://goodreads.com&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;
    &lt;div class=&quot;embed__card-info&quot;&gt;
      &lt;span class=&quot;embed__card-title&quot;&gt;Goodreads&lt;/span&gt;
      &lt;span class=&quot;embed__card-desc&quot;&gt;Discover and share books you love on Goodreads, the world&lt;/span&gt;
      &lt;span class=&quot;embed__card-meta&quot;&gt;
        &lt;img class=&quot;embed__card-favicon&quot; src=&quot;https://www.google.com/s2/favicons?domain=goodreads.com&amp;amp;sz=64&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
        &lt;span class=&quot;embed__card-host&quot;&gt;goodreads.com&lt;/span&gt;
      &lt;/span&gt;
    &lt;/div&gt;
    &lt;div class=&quot;embed__card-thumb&quot;&gt;&lt;img src=&quot;https://s.gr-assets.com/assets/facebook/goodreads_wide-5b93ced856c0da068d73467d3cb82a2c.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;</content:encoded></item></channel></rss>