{"_id":"@andrevantunes/json-schema-transpiler","name":"@andrevantunes/json-schema-transpiler","dist-tags":{"latest":"1.5.0"},"versions":{"1.5.0":{"name":"@andrevantunes/json-schema-transpiler","version":"1.5.0","repository":{"type":"git","url":"git+https://github.com/andrevantunes/json-schema-transpiler.git"},"author":{"name":"Me Salva! Devs","email":"devs@mesalva.com"},"license":"MIT","types":"dist/index.d.ts","main":"dist/index.js","publishConfig":{"access":"public"},"engines":{"node":">= 16"},"scripts":{"build":"tsc","test":"jest","test:watch":"yarn test --watch","test:coverage":"yarn test --coverage","lint":"eslint .","lint:fix":"yarn lint --fix","prepare":"","prepublishOnly":"yarn build","semantic-release":"semantic-release"},"devDependencies":{"@commitlint/cli":"^16.2.3","@commitlint/config-conventional":"^16.2.1","@semantic-release/changelog":"^6.0.1","@semantic-release/exec":"^6.0.3","@semantic-release/git":"^10.0.1","@types/jest":"^27.4.1","@types/node":"^17.0.21","@typescript-eslint/eslint-plugin":"^5.17.0","@typescript-eslint/parser":"^5.4.0","conventional-changelog-conventionalcommits":"^4.6.3","eslint":"^8.11.0","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^4.0.0","husky":"^7.0.4","jest":"^27.5.1","lint-staged":">=12","prettier":"^2.6.1","semantic-release":"^19.0.2","ts-jest":"^27.1.2","typescript":"^4.5.2"},"_id":"@andrevantunes/json-schema-transpiler@1.5.0","gitHead":"b2f0e2a35787de5d6e67580932bb83bb8c5f9e40","description":"![License](https://img.shields.io/static/v1?label=Licence&message=MIT&color=yellow) ![Coverage](https://img.shields.io/static/v1?label=Coverage&message=100%&color=lemon) ![Build](https://img.shields.io/static/v1?label=Build&message=Success&color=lemon) ![","bugs":{"url":"https://github.com/andrevantunes/json-schema-transpiler/issues"},"homepage":"https://github.com/andrevantunes/json-schema-transpiler#readme","_nodeVersion":"17.9.1","_npmVersion":"10.9.0","dist":{"integrity":"sha512-o/Pod4kStdhc/+mw9zm7JA7ZDA2Z51GBHp3+mCkUojrtKt6HE9cCwr9uRu/kcAUrByTdRiLz/10w610a3/C0hw==","shasum":"6011a749ea3398a29e056f9c51a2cd9a1f3b75e5","tarball":"https://registry.npmjs.org/@andrevantunes/json-schema-transpiler/-/json-schema-transpiler-1.5.0.tgz","fileCount":15,"unpackedSize":26982,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCEfGNuNW0XTG86UR5LZg+Tp0aa3RrM7tObI8kbID1kTQIgETO9iMPbyJpPWjTX4xTCfH+89e3REhjyhKiri8ueVmQ="}]},"_npmUser":{"name":"andrevantunes","email":"andreantunesv@gmail.com"},"directories":{},"maintainers":[{"name":"andrevantunes","email":"andreantunesv@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/json-schema-transpiler_1.5.0_1732747192527_0.6949175526003002"},"_hasShrinkwrap":false}},"time":{"created":"2024-11-27T22:39:52.413Z","1.5.0":"2024-11-27T22:39:52.707Z","modified":"2024-11-27T22:39:53.008Z"},"maintainers":[{"name":"andrevantunes","email":"andreantunesv@gmail.com"}],"description":"![License](https://img.shields.io/static/v1?label=Licence&message=MIT&color=yellow) ![Coverage](https://img.shields.io/static/v1?label=Coverage&message=100%&color=lemon) ![Build](https://img.shields.io/static/v1?label=Build&message=Success&color=lemon) ![","homepage":"https://github.com/andrevantunes/json-schema-transpiler#readme","repository":{"type":"git","url":"git+https://github.com/andrevantunes/json-schema-transpiler.git"},"author":{"name":"Me Salva! Devs","email":"devs@mesalva.com"},"bugs":{"url":"https://github.com/andrevantunes/json-schema-transpiler/issues"},"license":"MIT","readme":"# Me Salva! JSON Schema Transpiler\n\n![License](https://img.shields.io/static/v1?label=Licence&message=MIT&color=yellow)\n![Coverage](https://img.shields.io/static/v1?label=Coverage&message=100%&color=lemon)\n![Build](https://img.shields.io/static/v1?label=Build&message=Success&color=lemon)\n![Version](https://img.shields.io/static/v1?label=Version&message=1.5.0&color=orange)\n\n![JST](https://static.wixstatic.com/media/fb4ae7_9aec879a3605406590d26b71e1ded898~mv2.jpg/v1/fill/w_640,h_250,al_c,q_90/fb4ae7_9aec879a3605406590d26b71e1ded898~mv2.jpg)\n\n<a name=\"sobre\"></a>\n\nO __JSON Schema Transpiler (JST)__ é um biblioteca criada com o intuito de interpolar valores externos (`data`) de acordo com um esquema de dados (`schema`). Ela nasceu da necessidade de serializar os dados provisionados por API externas, de modo que sejam colocados em um formato de fácil utilização no front-end. Além disso, a biblioteca foi planejada para receber plugins que ajudem a formatar os valores, ou seja, é possível converter formatos de data, moedas entre outros, bastando fornecer essa lista de modificadores (`modifiers`) para o JST.\n\n# Tabela de Conteúdo <a name=\"tabela-de-conteudo\"></a>\n\n- [Sobre](#sobre)\n- [Tabela de Conteúdo](#tabela-de-conteudo)\n- [Instalação](#instalacao)\n- [Pré-requisitos](pre-requisitos)\n- [Como usar](#como-usar)\n- [Testes](#testes)\n- [Publicação](#publicacao)\n- [Tecnologias](#tecnologias)\n\n# Instalação <a name=\"instalacao\"></a>\n\nPara adicionar o JST ao seu projeto, rode o seguinte comando:\n\n```bash\n$ yarn add @andrevantunes/json-schema-transpiler\n```\n\nAgora você pode importar a lib no seu projeto. Segue abaixo um exemplo simples de uso:\n\n```js\nconst jsonSchemaTranspiler = require(\"@andrevantunes/json-schema-transpiler\");\n\nconst data = { user: { name: \"André\" }, job: { title: \"Developer\" } };\nconst schema = { title: \"{{user.name}}\", subtitle: \"{{job.title}}\" };\nconst output = jsonSchemaTranspiler(data, schema);\n\n// output\n{\n  title: \"André\",\n  subtitle: \"Developer\",\n}\n\n```\n\n# Pré-requisitos <a name=\"pre-requisitos\"></a>\n\n- Git\n- Node.js >= 14 <= 16 (Recomendado)\n- Yarn >= 1 <= 2\n\n## Os seguintes padrões foram adotados e devem ser seguidos:\n\n- [Conventional Commits](https://www.conventionalcommits.org/)\n- TDD\n\n# Como usar <a name=\"como-usar\"></a>\n\nPara os exemplos de uso à seguir, vamos usar como base o seguinte exemplo de dados:\n\n```js\n// data-mock.js\nconst data = {\n  firstName: \"Ricardo\",\n  lastName: \"Fredes\",\n  birthDate: \"3001-12-31\",\n  isSingle: false,\n  faults: 0,\n  more: null,\n  kids: [\n    {\n      name: \"Lauren\",\n      age: \"2\",\n      hobbies: [\"painting\", \"cooking\"],\n      vaccines: [\n        {\n          name: \"Polio\",\n          date: \"2020-01-01\",\n        },\n        {\n          name: \"Sarampo\",\n          date: \"2020-01-01\",\n        },\n      ],\n    },\n  ],\n  job: {\n    title: \"Developer\",\n    progress: null,\n    company: {\n      name: \"Me Salva!\",\n      group: \"Arco\",\n    },\n  },\n  address: {\n    street: \"Rua da Tecnologia\",\n    number: \"1234\",\n    neighborhood: \"Centro\",\n    state: \"RS\",\n    city: \"Porto Alegre\",\n    complement: \"casa\",\n    zipCode: \"95800-000\",\n  },\n  hobbies: [\"programming\", \"reading\", \"running\"],\n  courses: [\n    {\n      name: \"JavaScript\",\n      duration: \"4 meses\",\n    },\n    {\n      name: \"React\",\n      duration: \"2 meses\",\n    },\n    {\n      name: \"NodeJS\",\n      duration: \"2 meses\",\n    },\n  ],\n};\n\nmodule.exports = { data }\n```\n\n## JSON Schema Transpiler (JST)\n\nA seguir segue um trecho de código servirá como base para os nossos próximos exemplos:\n\n```js\n// index.js\nconst jsonSchemaTranspiler = require(\"@andrevantunes/json-schema-transpiler\");\nconst { data } = require(\"./data-mock\");\n\nconst schema = {};\nconst modifiers = undefined; // opcional\n\nconst result = jsonSchemaTranspiler(data, schema, modifiers);\n```\n\nCada elemento será explicado a seguir:\n- data\n- schema\n- modifiers\n\n## Data\n\nÉ um objeto que servirá como fonte de dados para o `JST` buscar os valores solicitados via `schema`. Geralmente esses dados são provisionados via API e será convertidos em um formato novo de dados que seja compatível com o formato de uso dentro de um componente ou função.\n\n## Schema\n\nO `schema` é um modelo de como o dado deverá ser formato. Os valores deverão ser acessados dentro uma `string` seguindo o seguinte padrão: `{{ DATA_KEY }}`. Veja o exemplo à seguir:\n\n```js\n// index.js\n...\nconst schema = {\n  name: \"{{firstName}}\",\n  job: \"{{job.title}}\",\n  company: \"{{job.company.name}}\",\n};\n\nconst result = jsonSchemaTranspiler(data, schema);\n\n// output\n{\n  name: \"Ricardo\",\n  job: \"Developer\",\n  company: \"Me Salva!\",\n}\n\n```\n\nNote que é possível acessar os dados de dentro do objeto usando o `.`!\nO uso de espaço dentro das chaves não interfere no resultado, portanto esses dois formatos são válidos:\n\n```js\n\"{{firstName}}\"\n// ou\n\"{{ firstName }}\"\n```\n\nTambém é possível concatenar valores dentro de uma mesma `string`:\n\n```js\n// index.js\n...\nconst schema = {\n  title: \"Usuário\",\n  name: \"{{firstName}} {{lastName}}\",\n  from: \"{{address.city}} - {{address.state}}\",\n};\n\nconst result = jsonSchemaTranspiler(data, schema);\n\n// output\n{\n  title: \"Usuário\",\n  name: \"Ricardo Fredes\",\n  from: \"Porto Alegre - RS\",\n}\n\n```\n\nNote também que um valor repassado para o schema como invariável `title`, é devolvido no resultado da mesma forma.\n\n## Modificadores\n\nO `JST` pode receber um objeto com uma lista de modificadores, que podem converter os dados interpolados em outro formato. Isso pode ser muito útil para trabalhar com datas, moedas e textos. Para isso basta fornecer essa lista no seguinte formato:\n\n```ts\nexport type Modifier = (data: any) => any;\nexport type ModifierList = Record<string, Modifier>;\n```\n\nPara interpolar os valores e aplicar o modificador, dentro das chaves use o separador `|`.\nVeja um exemplo de uso:\n\n```js\n// index.js\n...\n\nconst modifiers = {\n  toUpperCase: (value: string) => value.toUpperCase(),\n  formatDate: (value: string) => value.replace(/(\\d{4})-(\\d{2})-(\\d{2})/g, \"$3/$2/$1\"),\n  separateByDots: (value: string) => value.replace(/./g, \"$&.\"),\n};\n\nconst schema = {\n  name: \"{{firstName|toUpperCase}} {{lastName|toUpperCase}}\",\n  birthDate: \"{{birthDate|formatDate}}\",\n};\n\nconst result = jsonSchemaTranspiler(data, schema, modifiers);\n\n// output\n{\n  name: \"RICARDO FREDES\",\n  birthDate: \"31/12/3001\",\n}\n```\n\nMais uma vez os espaços não alteram o uso, portanto as duas formas são válidas:\n\n```js\n\"{{firstName|toUpperCase}}\"\n// ou\n\"{{ firstName | toUpperCase }}\"\n```\n\nNo exemplo à seguir vamos mostrar como encadear dois ou mais modificadores:\n\n```js\n// index.js\n...\n// modifiers\n...\n\nconst schema = { name: \"{{ firstName | toUpperCase | separateByDots }}\" };\n\nconst result = jsonSchemaTranspiler(data, schema, modifiers);\n\n// output\n{\n  name: \"R.I.C.A.R.D.O.\",\n}\n```\n\n## Arrays\n\nPara formatar `array` é necessário que tanto o `schema` como valor alvo dentro do `data` sejam do mesmo tipo: `array`. Para interpolar um `array`, usamos a seguinte nomenclatura: `DATA_KEY[*]`. Para uma interpolação mais avançada é possível usar um sub-schema, o que será apresentado mais à frente. Veja um exemplo mais simples:\n\n```js\n// index.js\n...\n\nconst schema = { courses: \"{{courses[*]}}\" };\n// Teremos o mesmo resultado se fosse declarado sem \"[*]\"\n// const schema = { courses: \"{{courses}}\" };\n\nconst result = jsonSchemaTranspiler(data, schema);\n\n// output\n{\n  courses: [\n    {\n      name: \"JavaScript\",\n      duration: \"4 meses\",\n    },\n    {\n      name: \"React\",\n      duration: \"2 meses\",\n    },\n    {\n      name: \"NodeJS\",\n      duration: \"2 meses\",\n    },\n  ],\n}\n```\n\nNeste próximo exemplo vamos utilizar o método de interpolar um valor específico de dentro de um elemento do `array`:\n\n```js\n// index.js\n...\n\nconst schema = { courses: \"{{courses[*].name}}\" };\n\nconst result = jsonSchemaTranspiler(data, schema);\n\n// output\n{ courses: [\"JavaScript\", \"React\", \"NodeJS\"] }\n\n```\n\nEm caso de erro o valor retornado será o de um `array` vazio `[]`.\n\nA seguir teremos um exemplo avançado, em que o `array` a ser interpolado terá um sub-schema. o padrão utilizado para isso é de ter um array com dois elementos, sendo o primeiro uma interpolação da chave referente ao `data` e o segundo elemento um sub-schema. Veja o exemplo à seguir:\n\n```js\n// index.js\n...\n\n// [datakey, subSchema]\nconst schema = { courses: [\"courses[*]\", { name: \"{{name}}\" }] };\n\nconst result = jsonSchemaTranspiler(data, schema);\n\n// output\n{ courses: [{ name: \"JavaScript\" }, { name: \"React\" }, { name: \"NodeJS\" }] }\n\n```\n\nDá mesma forma como foi mostrado anteriormente, o sub-schema segue as mesmas regras do `schema`:\n\n```js\n// index.js\n...\n// note que o uso do \"[*]\" é facultativo\nconst schema = { courses: [ \"{{courses}}\", \"{{name}} - {{duration}}\"] };\n\nconst result = jsonSchemaTranspiler(data, schema);\n\n// output\n{ courses: [\"JavaScript - 4 meses\", \"React - 2 meses\", \"NodeJS - 2 meses\"] }\n\n```\n\nAlém disso segue mais um exemplo com o uso de modificadores:\n\n```js\n// index.js\n...\n// modifiers\n...\n\nconst schema = { courses: [\"courses[*]\", \"{{name | toUpperCase}}\"] };\n\nconst result = jsonSchemaTranspiler(data, schema, modifiers);\n\n// output\n{ courses: [\"JAVASCRIPT\", \"REACT\", \"NODEJS\"] }\n\n```\n\n# Testes <a name=\"testes\"></a> \n\nEssa lib foi construída seguindo a metodologia de TDD. Para rodar os testes basta rodar os seguintes comandos:\n\n```bash\n# Rodando os testes\n$ yarn test\n\n# Rodando os testes com watch\n$ yarn test:watch\n\n# Rodando os testes com coverage\n$ yarn test:coverage\n```\n\n![image](https://user-images.githubusercontent.com/29892001/163472052-6047604c-7699-4ae0-be7f-cdb1f805e3b7.png)\n\n# Publicação <a name=\"publicacao\"></a>\n\nEsse projeto utiliza o Git flow e o semantic release para tipagem dos commits, portanto, todas as branches de trabalho devem ser criadas à partir da `develop`. Após o PR aberto, revisado e mesclado para a `develop`, é necessário abrir um outro PR de `develop` para `main` com o nome `ci: develop into main`. Assim que esse último for mesclado na `main`, o processo de publicação será realizado automaticamente. Uma nova versão e tag serão geradas com base no semantic release.\n\n# Tecnologias <a name=\"tecnologias\"></a>\n\n- [Jest](https://jestjs.io/pt-BR/)\n- [Node.js](https://nodejs.org/en/)\n- [Semantic Release](https://www.npmjs.com/package/semantic-release)\n- [Typescript](https://www.typescriptlang.org/)\n# json-schema-transpiler\n","readmeFilename":"README.md"}