pagarme-js icon indicating copy to clipboard operation
pagarme-js copied to clipboard

Typescript support

Open outerlook opened this issue 4 years ago • 14 comments

Oi! Vocês tem planos para suportar typescript? É um requisito para a empresa que trabalho utilizar

outerlook avatar Dec 07 '19 00:12 outerlook

@outerlook não deveria ser um problema, todo código JavaScript é TypeScript válido. Você pode usar a biblioteca sem problemas 😉

evaporei avatar Dec 09 '19 12:12 evaporei

Desculpa, me expressei mal. Sim, com o código é compatível, é pelo acoplamento da tipagem com nossa API que vem a necessidade. Prevenir e diminuir custos se viermos a precisar trocar para versões mais recentes da API de vocês, por exemplo. Algum plano para manter um arquivo de definição das respostas e das requests, por exemplo?

outerlook avatar Dec 09 '19 14:12 outerlook

@outerlook infelizmente não vejo isso acontecendo, pois já tivemos muitos problemas em mapear as respostas da nossa API.

Isso é um problema pois imagine que temos várias SDKs (Python, C#, PHP, JS, Java, etc), cada uma tem n versões e nossa API possui 3 versões atualmente. Caso fizermos o mapeamento de cada rota para cada uma das SDKs, isso seria inviável, visto que podemos adicionar campos a qualquer momento, e isso exigiria constante atualização de todas as SDKs.

Sinto por não podermos ajudar nesse aspecto no momento 😞

evaporei avatar Dec 09 '19 15:12 evaporei

Entendi! Tudo bem, obrigado

outerlook avatar Dec 09 '19 17:12 outerlook

Alguma coisa mudou desde a ultima resposta? Talvez escrever um arquivo de types pro DefinitelyTyped pra ultima versão da API seja uma boa... É uma tarefa razoavelmente extensa, mas depois de pronta, não seria tanto overhead manter o arquivo atualizado :thinking:

flasd avatar Mar 20 '20 23:03 flasd

https://pastebin.com/B8TDNFDR

eu comecei um arquivo onde até então fui colocando os que tenho usado, nada muito padronizado nos nomes, mas se for útil de alguma forma, aqui está. :)

a versão que estou usando é v4

outerlook avatar Mar 21 '20 12:03 outerlook

https://pastebin.com/B8TDNFDR

eu comecei um arquivo onde até então fui colocando os que tenho usado, nada muito padronizado nos nomes, mas se for útil de alguma forma, aqui está. :)

a versão que estou usando é v4

Como faço para utilizar?

demmorou avatar Apr 29 '20 12:04 demmorou

um bom padrão para mim é

  • crie uma pasta "types" na raiz do seu projeto (que poderia ser em qualquer lugar)
  • certifique-se que e este caminho está dentro do definido no seu 'tsconfig'```
// tsconfig.json
...
  "include": [
    "types/**/*.d.ts"
  ]
...
  • crie um arquivo, por exemplo pra essa definiçao dentro de types ex: pagarme.d.ts
  • copie e cole o que está no link pra este arquivo e pronto.

declare module faz exatamente isso, você declara as types de um modulo em sua definição :) se estiver utilizando no frontend, que rodará num browser, se não me engano voce precisa declarar pagarme/browser

outerlook avatar Apr 29 '20 13:04 outerlook

Boa @outerlook ainda ta mantendo isso? o que acha de colocar como um repo no github?

neuberoliveira avatar Jun 19 '20 13:06 neuberoliveira

Partindo do principio que o Pagar.me não irá manter a tipagem desse repositório, acho que seria bacana a comunidade manter o projeto la no DefinitelyTyped como o @flasd sugeriu ou criar um repo. Estou sentido falta da tipagem desse projeto. Poderiamos começar com o trabalho que o @outerlook começou. Apoio e queria ajudar com a ideia

jonyw4 avatar Jul 14 '20 13:07 jonyw4

Olha pessoal, eu estou criando um plugin para o Vendure usando essa lib e estou mantendo a tipagem usando a API v4 do Pagar.me partindo do que o @outerlook mandou aqui. Estou atualizando de acordo com a minha necessidade retirando os textos e nome dos campos direto da documentação. Acredito que seria legal manter um repo ou algo do tipo como mandei no comentário acima, porém enquanto isso irei mantendo o meu direto no meu repo. Se alguém quiser usar estará nesse aquivo:

https://github.com/jonyw4/vendure-pagarme-plugin/blob/master/src/types/pagarme.d.ts

jonyw4 avatar Jul 16 '20 19:07 jonyw4

@jonyw4 eu comecei algo partidndo do outerlook tambem, posso se ainda quiser dar continudade cria um repo e me chama, ou avisa que eu crio, é que eu ainda nao to mexendo com tanta intessidade nessa parte do meu projeto, mas acho uma boa iniciativa

neuberoliveira avatar Jul 20 '20 16:07 neuberoliveira

Beleza então. Eu vou criar um repo contendo apenas a tipagem que compartilhei aqui com vocês e de acordo com que eu for trabalhando eu vou completando e deixo aberto pra todo mundo fazer PR. 👌

jonyw4 avatar Jul 20 '20 17:07 jonyw4

Eu acabei de criar o repositório. Quem puder e quiser contribuir é só mandar PR lá https://github.com/jonyw4/pagarme-js-type

jonyw4 avatar Jul 20 '20 18:07 jonyw4

Uma atualização sobre o uso de typescript com API do pagarme.

Por algum motivo eu não consegui seguir as instruções da api.readme.dev para instalar @pagarme/v4#dkjdl7jqwf92 com as tipagens corretas, apenas conseguiria usar de forma dinamica, portanto sem types.

Então consegui acessar a API do pagarme na registry em: https://dash.readme.com/api/v1/api-registry/dkjdl7jqwf92

Salvei este resultado json, e com ajuda de https://github.com/drwpow/openapi-typescript gerei pagarmeOAS.ts

Depois para gerar um fetcher e funcionar, bastou:

import type { paths } from "./pagarmeOAS";
import { Fetcher } from "openapi-typescript-fetch";
import './fetch-polyfill' // https://github.com/ajaishankar/openapi-typescript-fetch#server-side-usage

// declare fetcher for paths
export const fetcher = Fetcher.for<paths>()

// global configuration
fetcher.configure({
    baseUrl: "https://api.pagar.me/1",
    init: {
        headers: {
            accept: 'application/json',
            'content-type': 'application/json',
        },
    },
    use: [
    (url, init, next) => {
      const urlObject = new URL(url);
      urlObject.searchParams.append("api_key", process.env.API_KEY_PAGARME!);
      const newUrlString = urlObject.toString();
      return next(newUrlString, init);
    },
  ]
})

E aí só ir seguindo, tudo certo:

export const criarCliente = fetcher.path('/customers').method('post').create()

Lamento se tinha forma mais fácil, mas assim funcionou =)

Edit: As tipagens ainda não estão 100% pelo que estive utilizando. Parece que não está totalmente completo em alguns objetos mais profundos nos inputs. E alguns unknowns gerados. Mas está satisfatório. Se houver alguma repo em que eu possa reportar coisas faltantes / erradas neste documento da OAS, seria bacana.

outerlook avatar Oct 27 '22 13:10 outerlook