Executando verificação de segurança...
1

Uma alternativa de estrutura de Projetos em Next.js

Introdução

Se você trabalha com React ou qualquer framework derivado dele então você provavelmente já está familiarizado com o termo Server actions.

Sendo assim, você talvez já deve tenha escutado falar ou visto ao menos uma vez sobre um package chamado ZSA.

O que é?

ZSA é um package que usa como base o Zod para criar server actions mais robustas e semanticamente separadas, como por exemplo:

const double = createServerAction.input(z.number()).output(z.number()).handler(({ input }) => input * 2)

O código acima é só um exemplo básico de como funciona por cima.

Está função irá aceitar um número como input/entrada e retornada o número passado multiplicado por 2.

Insatisfações

Por mais organizado e robusto que ele pareça, ainda assim, eu tenho algumas insatisfações referentes a ele.

Bom, não entrarei muito em detalhes para não deixar a leitura muito longa, mas, sempre que crio um input e coloco um .or(...) ou já inicio ele sendo uma z.union([...]), ele sempre irá me retornar uma issue no meu console independente do valor passado, por exemplo:

Se eu crio o input sendo:

.input(z.string().or(z.number())).handler(...)

E na hora de chamar a função eu passo o valor 1 ou "1", em ambos os casos terei uma issue sendo printada, pois, quando passo o number, ele "espera" uma string e vice-versa.

A partir desse problema e de algumas ideias de melhorias, eu tentei recriar esse package com algumas melhorias eu diria.

Caso tenha interesse em estar utilizando, clique aqui.

Caso tenha dúvidas de como usar, ainda estou desenvolvendo e não tive tempo suficiente para criar a documentação inteira, porém, ele é baseado no ZSA, portanto, se você já trabalha com essa biblioteca não terá problemas ao usa-lá.

Mas caso tenha dúvidas, segue um breve tutorial.

Como usar?

Vamos supor que estou criando uma função para achar meu usuário, portanto, ficaria algo próximo disso:

const findUser = createServerAction()
    .input(( input: number ) => return isFinite(input) ? input : 0)
    .handler(({ input }) => {
        const user = users.findUnique({ where: { id: input }});
        if (!user) throw new Error('Not found');
        return user;
    })
    .onComplete(() => {
        console.log("Completed!");
    })

Conclusão

Mas enfim, criei esse package com o intuito de permitir o usuário total controle e também por conta do ZSA conter alguns bugs e "limitações" para meus casos de uso.

O package ainda está em desenvolvimento, porém é possível que ainda tenha bugs ou coisas do tipo, mas estou comprometido em tentar melhorá-lo e torna-lo o mais "completo" possível.

Ele ainda é open source, você pode estar vendo o repósitorio dele clicando aqui

Agradeço por ter lido até aqui, segue o link do package novamente: Advanced server actions.

Carregando publicação patrocinada...