Colisão de IDs
Tivemos dois pr's para a feature de cards favoritos, o primeiro #77 cria a feature de favoritar cards e coloca uma identificação única sequencial. O pr #87 faz um refactor nessa feature e altera o id sequencial para id baseado no título. Isso é bom pois evita adicionar manualmente o id.
Mas ainda ocorre de o mesmo título servir para conceitos diferentes, ou no caso do gif abaixo onde é removido caracteres que não são letras e o título fica para ambos c
e c
. Como mostrado no gif abaixo, onde o click no segundo card aciona apenas o primeiro já que ambos tem os mesmo id
. Utilizar um UUID dinamicamente também é um problema, pois toda vez que a página for carregada, o id será outro e o id salvo no localStorage não será igual ao id do card.
Para resolver este inconveniente, apliquei um algoritmo de hash simples que gera um id baseado em conteúdo, mais específicamente, a partir da descrição do conceito, que é uma cadeia de caracteres maior. Isso elimina tal problemática e não necessita o uso de dependências externas.
Automação de inserção de termos por CLI
Essa issue também se destina para a discussão de um Script JS executado pelo Node.js com zero dependências externas, no qual já estou desenvolvendo, para adicionar novos conceitos via CLI (Command-line interface).
Por exemplo, para rodar script pode ser com yarn new
ou npm run new
ou então pnpm run new
. Onde new
é um script do package.json
.
$ npm run new
Digite o valor para title: Lambda
Digite o valor para description: Uma função lambda permite a criação de funções anônimas de primeira classe...
Digite o valor para tags: Conceito
Digite o valor para code: quadrado = lambda x: x**2
Por exemplo, a saída seria o novo termo gravado juntamente com o restante do cards_pt-br.json:
[
{},
{},
{
"id": "3090d928-b9a7-4fbd-9089-16d265075ef1",
"title": "Lambda",
"description": "Uma função lambda permite a criação de funções anônimas de primeira classe...",
"tags": [
"Conceito"
],
"content": {
"code": "quadrado = lambda x: x**2"
}
}
]
Nesse caso, o id
é gerado automaticamente pelo crypto.randomUUID
do Node, não seria necessário usar nenhuma biblioteca externa ao Node.js para fazer isso. Nesse caso, quando o termo for gerado pelo Script, terá por padrão um id e o código do card já trabalhará com este id ao invés do id gerado pelo algoritmo de hash de conteúdo descrito acima. Ou seja, ambos são suportados, podendo criar um novo termo manualmente mudando o código ou gerando a partir do CLI.
As bibliotecas utilizadas do Node são:
const fs = require("node:fs");
const path = require("node:path");
const readline = require("node:readline");
const { stdin: input, stdout: output } = require("node:process");
const crypto = require("node:crypto");
Isso visa automatizar o processo de adição de novos termos. Também visa escalabilidade já que após o arquivo cards_pt-br vier a ter milhares de linhas, torna-se mais pesado para abrir e pode ocorrer erros de comma, bracket, etc.