@f-o-t/brasil-api 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +243 -0
- package/dist/index.d.ts +1442 -0
- package/dist/index.js +523 -0
- package/package.json +63 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
// src/config.ts
|
|
2
|
+
var defaultConfig = {
|
|
3
|
+
baseUrl: "https://brasilapi.com.br/api",
|
|
4
|
+
timeout: 1e4
|
|
5
|
+
};
|
|
6
|
+
var currentConfig = { ...defaultConfig };
|
|
7
|
+
function getConfig() {
|
|
8
|
+
return currentConfig;
|
|
9
|
+
}
|
|
10
|
+
function configureBrasilApi(config) {
|
|
11
|
+
currentConfig = { ...currentConfig, ...config };
|
|
12
|
+
}
|
|
13
|
+
function setConfig(config) {
|
|
14
|
+
configureBrasilApi(config);
|
|
15
|
+
}
|
|
16
|
+
function resetConfig() {
|
|
17
|
+
currentConfig = { ...defaultConfig };
|
|
18
|
+
}
|
|
19
|
+
// src/errors.ts
|
|
20
|
+
class BrasilApiError extends Error {
|
|
21
|
+
constructor(message) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = "BrasilApiError";
|
|
24
|
+
Object.setPrototypeOf(this, BrasilApiError.prototype);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
class BrasilApiNetworkError extends BrasilApiError {
|
|
29
|
+
statusCode;
|
|
30
|
+
endpoint;
|
|
31
|
+
constructor(message, statusCode, endpoint) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = "BrasilApiNetworkError";
|
|
34
|
+
this.statusCode = statusCode;
|
|
35
|
+
this.endpoint = endpoint;
|
|
36
|
+
Object.setPrototypeOf(this, BrasilApiNetworkError.prototype);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
class BrasilApiValidationError extends BrasilApiError {
|
|
41
|
+
zodError;
|
|
42
|
+
validationType;
|
|
43
|
+
constructor(message, zodError, validationType) {
|
|
44
|
+
const formattedMessage = formatValidationError(message, zodError, validationType);
|
|
45
|
+
super(formattedMessage);
|
|
46
|
+
this.name = "BrasilApiValidationError";
|
|
47
|
+
this.zodError = zodError;
|
|
48
|
+
this.validationType = validationType;
|
|
49
|
+
Object.setPrototypeOf(this, BrasilApiValidationError.prototype);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
class BrasilApiResponseError extends BrasilApiValidationError {
|
|
54
|
+
constructor(message, zodError) {
|
|
55
|
+
super(message, zodError, "response");
|
|
56
|
+
this.name = "BrasilApiResponseError";
|
|
57
|
+
Object.setPrototypeOf(this, BrasilApiResponseError.prototype);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function formatValidationError(baseMessage, zodError, validationType) {
|
|
61
|
+
const issues = zodError.issues.map((err) => {
|
|
62
|
+
const path = err.path.join(".");
|
|
63
|
+
return ` - ${path}: ${err.message}`;
|
|
64
|
+
}).join(`
|
|
65
|
+
`);
|
|
66
|
+
return `${baseMessage} (${validationType} validation failed):
|
|
67
|
+
${issues}`;
|
|
68
|
+
}
|
|
69
|
+
// src/cep.ts
|
|
70
|
+
import { z } from "zod";
|
|
71
|
+
|
|
72
|
+
// src/client.ts
|
|
73
|
+
async function fetchApi(endpoint, schema) {
|
|
74
|
+
const config = getConfig();
|
|
75
|
+
const url = `${config.baseUrl}${endpoint}`;
|
|
76
|
+
const controller = new AbortController;
|
|
77
|
+
const timeoutId = setTimeout(() => controller.abort(), config.timeout);
|
|
78
|
+
try {
|
|
79
|
+
const response = await fetch(url, {
|
|
80
|
+
signal: controller.signal
|
|
81
|
+
});
|
|
82
|
+
clearTimeout(timeoutId);
|
|
83
|
+
if (!response.ok) {
|
|
84
|
+
throw new BrasilApiNetworkError(`HTTP ${response.status}: ${response.statusText}`, response.status, endpoint);
|
|
85
|
+
}
|
|
86
|
+
const data = await response.json();
|
|
87
|
+
const result = schema.safeParse(data);
|
|
88
|
+
if (!result.success) {
|
|
89
|
+
throw new BrasilApiResponseError("Invalid API response format", result.error);
|
|
90
|
+
}
|
|
91
|
+
return result.data;
|
|
92
|
+
} catch (error) {
|
|
93
|
+
clearTimeout(timeoutId);
|
|
94
|
+
if (error instanceof BrasilApiNetworkError) {
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
if (error instanceof BrasilApiResponseError) {
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
101
|
+
throw new BrasilApiNetworkError(`Request timeout after ${config.timeout}ms`, undefined, endpoint);
|
|
102
|
+
}
|
|
103
|
+
throw new BrasilApiNetworkError(`Network request failed: ${error instanceof Error ? error.message : "Unknown error"}`, undefined, endpoint);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// src/cep.ts
|
|
108
|
+
var CepInputSchema = z.string().regex(/^\d{5}-?\d{3}$/, "CEP must be in format 12345-678 or 12345678");
|
|
109
|
+
var CepResponseSchema = z.object({
|
|
110
|
+
cep: z.string(),
|
|
111
|
+
state: z.string(),
|
|
112
|
+
city: z.string(),
|
|
113
|
+
neighborhood: z.string(),
|
|
114
|
+
street: z.string(),
|
|
115
|
+
service: z.string()
|
|
116
|
+
});
|
|
117
|
+
var CepV2ResponseSchema = CepResponseSchema.extend({
|
|
118
|
+
location: z.object({
|
|
119
|
+
type: z.literal("Point"),
|
|
120
|
+
coordinates: z.object({
|
|
121
|
+
longitude: z.string(),
|
|
122
|
+
latitude: z.string()
|
|
123
|
+
})
|
|
124
|
+
})
|
|
125
|
+
});
|
|
126
|
+
async function getCep(cep) {
|
|
127
|
+
const validationResult = CepInputSchema.safeParse(cep);
|
|
128
|
+
if (!validationResult.success) {
|
|
129
|
+
throw new BrasilApiValidationError("Invalid CEP format", validationResult.error, "input");
|
|
130
|
+
}
|
|
131
|
+
const cleanCep = cep.replace("-", "");
|
|
132
|
+
return fetchApi(`/cep/v1/${cleanCep}`, CepResponseSchema);
|
|
133
|
+
}
|
|
134
|
+
async function getCepV2(cep) {
|
|
135
|
+
const validationResult = CepInputSchema.safeParse(cep);
|
|
136
|
+
if (!validationResult.success) {
|
|
137
|
+
throw new BrasilApiValidationError("Invalid CEP format", validationResult.error, "input");
|
|
138
|
+
}
|
|
139
|
+
const cleanCep = cep.replace("-", "");
|
|
140
|
+
return fetchApi(`/cep/v2/${cleanCep}`, CepV2ResponseSchema);
|
|
141
|
+
}
|
|
142
|
+
// src/banks.ts
|
|
143
|
+
import { z as z2 } from "zod";
|
|
144
|
+
var BankCodeInputSchema = z2.number().int().positive();
|
|
145
|
+
var BankSchema = z2.object({
|
|
146
|
+
ispb: z2.string(),
|
|
147
|
+
name: z2.string(),
|
|
148
|
+
code: z2.number().nullable(),
|
|
149
|
+
fullName: z2.string()
|
|
150
|
+
});
|
|
151
|
+
async function getBanks() {
|
|
152
|
+
return fetchApi("/banks/v1", z2.array(BankSchema));
|
|
153
|
+
}
|
|
154
|
+
async function getBank(code) {
|
|
155
|
+
const validationResult = BankCodeInputSchema.safeParse(code);
|
|
156
|
+
if (!validationResult.success) {
|
|
157
|
+
throw new BrasilApiValidationError("Invalid bank code", validationResult.error, "input");
|
|
158
|
+
}
|
|
159
|
+
return fetchApi(`/banks/v1/${code}`, BankSchema);
|
|
160
|
+
}
|
|
161
|
+
// src/cnpj.ts
|
|
162
|
+
import { z as z3 } from "zod";
|
|
163
|
+
var CnpjInputSchema = z3.string().regex(/^\d{2}\.?\d{3}\.?\d{3}\/?\d{4}-?\d{2}$/, "CNPJ must be 14 digits with optional punctuation");
|
|
164
|
+
var CnpjResponseSchema = z3.object({
|
|
165
|
+
cnpj: z3.string(),
|
|
166
|
+
razao_social: z3.string().optional(),
|
|
167
|
+
nome_fantasia: z3.string().optional(),
|
|
168
|
+
uf: z3.string().optional(),
|
|
169
|
+
municipio: z3.string().optional(),
|
|
170
|
+
natureza_juridica: z3.string().optional(),
|
|
171
|
+
situacao_cadastral: z3.string().optional(),
|
|
172
|
+
data_inicio_atividade: z3.string().optional(),
|
|
173
|
+
cnae_fiscal: z3.string().optional(),
|
|
174
|
+
qsa: z3.array(z3.any())
|
|
175
|
+
});
|
|
176
|
+
async function getCnpj(cnpj) {
|
|
177
|
+
const validationResult = CnpjInputSchema.safeParse(cnpj);
|
|
178
|
+
if (!validationResult.success) {
|
|
179
|
+
throw new BrasilApiValidationError("Invalid CNPJ format", validationResult.error, "input");
|
|
180
|
+
}
|
|
181
|
+
const cleanCnpj = cnpj.replace(/[.\-/]/g, "");
|
|
182
|
+
return fetchApi(`/cnpj/v1/${cleanCnpj}`, CnpjResponseSchema);
|
|
183
|
+
}
|
|
184
|
+
// src/ddd.ts
|
|
185
|
+
import { z as z4 } from "zod";
|
|
186
|
+
var DddInputSchema = z4.union([
|
|
187
|
+
z4.number().int().min(10).max(99),
|
|
188
|
+
z4.string().regex(/^\d{2}$/, "DDD must be 2 digits")
|
|
189
|
+
]);
|
|
190
|
+
var DddResponseSchema = z4.object({
|
|
191
|
+
state: z4.string(),
|
|
192
|
+
cities: z4.array(z4.string())
|
|
193
|
+
});
|
|
194
|
+
async function getDdd(ddd) {
|
|
195
|
+
const validationResult = DddInputSchema.safeParse(ddd);
|
|
196
|
+
if (!validationResult.success) {
|
|
197
|
+
throw new BrasilApiValidationError("Invalid DDD format", validationResult.error, "input");
|
|
198
|
+
}
|
|
199
|
+
return fetchApi(`/ddd/v1/${ddd}`, DddResponseSchema);
|
|
200
|
+
}
|
|
201
|
+
// src/feriados.ts
|
|
202
|
+
import { z as z5 } from "zod";
|
|
203
|
+
var YearInputSchema = z5.number().int({ message: "Year must be an integer" }).min(1900, { message: "Year must be between 1900 and 2199" }).max(2199, { message: "Year must be between 1900 and 2199" });
|
|
204
|
+
var FeriadoSchema = z5.object({
|
|
205
|
+
date: z5.string(),
|
|
206
|
+
name: z5.string(),
|
|
207
|
+
type: z5.string()
|
|
208
|
+
});
|
|
209
|
+
var FeriadosArraySchema = z5.array(FeriadoSchema);
|
|
210
|
+
var BRASIL_API_BASE_URL = "https://brasilapi.com.br/api";
|
|
211
|
+
async function getFeriados(year) {
|
|
212
|
+
const yearValidation = YearInputSchema.safeParse(year);
|
|
213
|
+
if (!yearValidation.success) {
|
|
214
|
+
throw new BrasilApiValidationError("Invalid year parameter", yearValidation.error, "input");
|
|
215
|
+
}
|
|
216
|
+
const url = `${BRASIL_API_BASE_URL}/feriados/v1/${year}`;
|
|
217
|
+
const response = await fetch(url);
|
|
218
|
+
if (!response.ok) {
|
|
219
|
+
throw new Error(`Failed to fetch holidays: ${response.status} ${response.statusText}`);
|
|
220
|
+
}
|
|
221
|
+
const data = await response.json();
|
|
222
|
+
const parsed = FeriadosArraySchema.parse(data);
|
|
223
|
+
return parsed;
|
|
224
|
+
}
|
|
225
|
+
// src/ibge.ts
|
|
226
|
+
import { z as z6 } from "zod";
|
|
227
|
+
var StateCodeInputSchema = z6.string().regex(/^[A-Z]{2}$/i, "State code must be 2 letters");
|
|
228
|
+
var RegiaoSchema = z6.object({
|
|
229
|
+
id: z6.number(),
|
|
230
|
+
sigla: z6.string(),
|
|
231
|
+
nome: z6.string()
|
|
232
|
+
});
|
|
233
|
+
var EstadoSchema = z6.object({
|
|
234
|
+
id: z6.number(),
|
|
235
|
+
sigla: z6.string(),
|
|
236
|
+
nome: z6.string(),
|
|
237
|
+
regiao: RegiaoSchema
|
|
238
|
+
});
|
|
239
|
+
var EstadosArraySchema = z6.array(EstadoSchema);
|
|
240
|
+
var MunicipioSchema = z6.object({
|
|
241
|
+
nome: z6.string(),
|
|
242
|
+
codigo_ibge: z6.string()
|
|
243
|
+
});
|
|
244
|
+
var MunicipiosArraySchema = z6.array(MunicipioSchema);
|
|
245
|
+
async function getEstados() {
|
|
246
|
+
return fetchApi("/ibge/uf/v1", EstadosArraySchema);
|
|
247
|
+
}
|
|
248
|
+
async function getMunicipios(uf) {
|
|
249
|
+
const validationResult = StateCodeInputSchema.safeParse(uf);
|
|
250
|
+
if (!validationResult.success) {
|
|
251
|
+
throw new BrasilApiValidationError("Invalid state code format", validationResult.error, "input");
|
|
252
|
+
}
|
|
253
|
+
const ufUpper = uf.toUpperCase();
|
|
254
|
+
return fetchApi(`/ibge/municipios/v1/${ufUpper}`, MunicipiosArraySchema);
|
|
255
|
+
}
|
|
256
|
+
// src/isbn.ts
|
|
257
|
+
import { z as z7 } from "zod";
|
|
258
|
+
var IsbnInputSchema = z7.string().regex(/^(?:\d{10}|\d{13})$/, "ISBN must be 10 or 13 digits");
|
|
259
|
+
var DimensionsSchema = z7.object({}).passthrough();
|
|
260
|
+
var IsbnResponseSchema = z7.object({
|
|
261
|
+
isbn: z7.string(),
|
|
262
|
+
title: z7.string(),
|
|
263
|
+
subtitle: z7.string().nullable(),
|
|
264
|
+
authors: z7.array(z7.string()),
|
|
265
|
+
publisher: z7.string(),
|
|
266
|
+
synopsis: z7.string().nullable(),
|
|
267
|
+
dimensions: DimensionsSchema.nullable(),
|
|
268
|
+
year: z7.number().nullable(),
|
|
269
|
+
format: z7.string(),
|
|
270
|
+
page_count: z7.number(),
|
|
271
|
+
subjects: z7.array(z7.string()),
|
|
272
|
+
location: z7.string().nullable(),
|
|
273
|
+
retail_price: z7.string().nullable(),
|
|
274
|
+
cover_url: z7.string().nullable(),
|
|
275
|
+
provider: z7.string()
|
|
276
|
+
});
|
|
277
|
+
async function getIsbn(isbn) {
|
|
278
|
+
const validationResult = IsbnInputSchema.safeParse(isbn);
|
|
279
|
+
if (!validationResult.success) {
|
|
280
|
+
throw new BrasilApiValidationError("Invalid ISBN format", validationResult.error, "input");
|
|
281
|
+
}
|
|
282
|
+
return fetchApi(`/isbn/v1/${isbn}`, IsbnResponseSchema);
|
|
283
|
+
}
|
|
284
|
+
// src/ncm.ts
|
|
285
|
+
import { z as z8 } from "zod";
|
|
286
|
+
var NcmSchema = z8.object({
|
|
287
|
+
codigo: z8.string(),
|
|
288
|
+
descricao: z8.string(),
|
|
289
|
+
data_inicio: z8.string(),
|
|
290
|
+
data_fim: z8.string(),
|
|
291
|
+
tipo_ato: z8.string(),
|
|
292
|
+
numero_ato: z8.string(),
|
|
293
|
+
ano_ato: z8.string()
|
|
294
|
+
});
|
|
295
|
+
var NcmsArraySchema = z8.array(NcmSchema);
|
|
296
|
+
async function getNcms() {
|
|
297
|
+
return fetchApi("/ncm/v1", NcmsArraySchema);
|
|
298
|
+
}
|
|
299
|
+
async function getNcm(code) {
|
|
300
|
+
return fetchApi(`/ncm/v1/${code}`, NcmSchema);
|
|
301
|
+
}
|
|
302
|
+
// src/pix.ts
|
|
303
|
+
import { z as z9 } from "zod";
|
|
304
|
+
var PixParticipantSchema = z9.object({
|
|
305
|
+
ispb: z9.string(),
|
|
306
|
+
nome: z9.string(),
|
|
307
|
+
nome_reduzido: z9.string(),
|
|
308
|
+
modalidade_participacao: z9.string(),
|
|
309
|
+
tipo_participacao: z9.string(),
|
|
310
|
+
inicio_operacao: z9.string()
|
|
311
|
+
});
|
|
312
|
+
var PixParticipantsArraySchema = z9.array(PixParticipantSchema);
|
|
313
|
+
async function getPixParticipants() {
|
|
314
|
+
return fetchApi("/pix/v1/participants", PixParticipantsArraySchema);
|
|
315
|
+
}
|
|
316
|
+
// src/registrobr.ts
|
|
317
|
+
import { z as z10 } from "zod";
|
|
318
|
+
var DomainStatusSchema = z10.object({
|
|
319
|
+
status_code: z10.number(),
|
|
320
|
+
status: z10.string(),
|
|
321
|
+
fqdn: z10.string(),
|
|
322
|
+
hosts: z10.array(z10.string()),
|
|
323
|
+
"publication-status": z10.string(),
|
|
324
|
+
"expires-at": z10.string(),
|
|
325
|
+
suggestions: z10.array(z10.string())
|
|
326
|
+
});
|
|
327
|
+
async function getDomainStatus(domain) {
|
|
328
|
+
return fetchApi(`/registrobr/v1/${domain}`, DomainStatusSchema);
|
|
329
|
+
}
|
|
330
|
+
// src/taxas.ts
|
|
331
|
+
import { z as z11 } from "zod";
|
|
332
|
+
var TaxaSchema = z11.object({
|
|
333
|
+
nome: z11.string(),
|
|
334
|
+
valor: z11.number().nullable()
|
|
335
|
+
});
|
|
336
|
+
var TaxasArraySchema = z11.array(TaxaSchema);
|
|
337
|
+
async function getTaxas() {
|
|
338
|
+
return fetchApi("/taxas/v1", TaxasArraySchema);
|
|
339
|
+
}
|
|
340
|
+
async function getTaxa(sigla) {
|
|
341
|
+
return fetchApi(`/taxas/v1/${sigla}`, TaxaSchema);
|
|
342
|
+
}
|
|
343
|
+
// src/corretoras.ts
|
|
344
|
+
import { z as z12 } from "zod";
|
|
345
|
+
var CorretoraSchema = z12.object({
|
|
346
|
+
cnpj: z12.string(),
|
|
347
|
+
type: z12.string(),
|
|
348
|
+
nome_social: z12.string(),
|
|
349
|
+
nome_comercial: z12.string(),
|
|
350
|
+
status: z12.string(),
|
|
351
|
+
email: z12.string().optional(),
|
|
352
|
+
telefone: z12.string().optional(),
|
|
353
|
+
cep: z12.string().optional(),
|
|
354
|
+
pais: z12.string().optional(),
|
|
355
|
+
uf: z12.string().optional(),
|
|
356
|
+
municipio: z12.string().optional(),
|
|
357
|
+
bairro: z12.string().optional(),
|
|
358
|
+
complemento: z12.string().optional(),
|
|
359
|
+
logradouro: z12.string().optional(),
|
|
360
|
+
data_patrimonio_liquido: z12.string().optional(),
|
|
361
|
+
valor_patrimonio_liquido: z12.string().optional(),
|
|
362
|
+
codigo_cvm: z12.string().optional(),
|
|
363
|
+
data_inicio_situacao: z12.string().optional(),
|
|
364
|
+
data_registro: z12.string().optional()
|
|
365
|
+
});
|
|
366
|
+
var CorretorasArraySchema = z12.array(CorretoraSchema);
|
|
367
|
+
async function getCorretoras() {
|
|
368
|
+
return fetchApi("/cvm/corretoras/v1", CorretorasArraySchema);
|
|
369
|
+
}
|
|
370
|
+
async function getCorretora(cnpj) {
|
|
371
|
+
return fetchApi(`/cvm/corretoras/v1/${cnpj}`, CorretoraSchema);
|
|
372
|
+
}
|
|
373
|
+
// src/cptec.ts
|
|
374
|
+
import { z as z13 } from "zod";
|
|
375
|
+
var CidadeSchema = z13.object({
|
|
376
|
+
id: z13.number(),
|
|
377
|
+
nome: z13.string(),
|
|
378
|
+
estado: z13.string()
|
|
379
|
+
});
|
|
380
|
+
var CidadesArraySchema = z13.array(CidadeSchema);
|
|
381
|
+
var ClimaSchema = z13.object({
|
|
382
|
+
data: z13.string(),
|
|
383
|
+
condicao: z13.string(),
|
|
384
|
+
condicao_desc: z13.string().optional(),
|
|
385
|
+
min: z13.number(),
|
|
386
|
+
max: z13.number(),
|
|
387
|
+
indice_uv: z13.number()
|
|
388
|
+
});
|
|
389
|
+
var PrevisaoSchema = z13.object({
|
|
390
|
+
cidade: z13.string(),
|
|
391
|
+
estado: z13.string(),
|
|
392
|
+
atualizado_em: z13.string(),
|
|
393
|
+
clima: z13.array(ClimaSchema)
|
|
394
|
+
});
|
|
395
|
+
var OndaDadoSchema = z13.object({
|
|
396
|
+
hora: z13.string().optional(),
|
|
397
|
+
vento: z13.number(),
|
|
398
|
+
direcao_vento: z13.string(),
|
|
399
|
+
direcao_vento_desc: z13.string().optional(),
|
|
400
|
+
altura_onda: z13.number(),
|
|
401
|
+
direcao_onda: z13.string().optional(),
|
|
402
|
+
direcao_onda_desc: z13.string().optional(),
|
|
403
|
+
agitation: z13.string()
|
|
404
|
+
});
|
|
405
|
+
var OndaDiariaSchema = z13.object({
|
|
406
|
+
data: z13.string(),
|
|
407
|
+
dados_ondas: z13.array(OndaDadoSchema)
|
|
408
|
+
});
|
|
409
|
+
var PrevisaoOndasSchema = z13.object({
|
|
410
|
+
cidade: z13.string(),
|
|
411
|
+
estado: z13.string(),
|
|
412
|
+
atualizado_em: z13.string(),
|
|
413
|
+
ondas: z13.array(OndaDiariaSchema)
|
|
414
|
+
});
|
|
415
|
+
async function getCidades() {
|
|
416
|
+
return fetchApi("/cptec/v1/cidade", CidadesArraySchema);
|
|
417
|
+
}
|
|
418
|
+
async function getPrevisao(cityCode, days = 1) {
|
|
419
|
+
return fetchApi(`/cptec/v1/clima/previsao/${cityCode}/${days}`, PrevisaoSchema);
|
|
420
|
+
}
|
|
421
|
+
async function getPrevisaoOndas(cityCode) {
|
|
422
|
+
return fetchApi(`/cptec/v1/ondas/${cityCode}`, PrevisaoOndasSchema);
|
|
423
|
+
}
|
|
424
|
+
// src/cambio.ts
|
|
425
|
+
import { z as z14 } from "zod";
|
|
426
|
+
var MoedaSchema = z14.object({
|
|
427
|
+
simbolo: z14.string(),
|
|
428
|
+
nome: z14.string(),
|
|
429
|
+
tipo_moeda: z14.string()
|
|
430
|
+
});
|
|
431
|
+
var MoedasArraySchema = z14.array(MoedaSchema);
|
|
432
|
+
var CotacaoItemSchema = z14.object({
|
|
433
|
+
paridade_compra: z14.number(),
|
|
434
|
+
paridade_venda: z14.number(),
|
|
435
|
+
cotacao_compra: z14.number(),
|
|
436
|
+
cotacao_venda: z14.number(),
|
|
437
|
+
data_hora_cotacao: z14.string(),
|
|
438
|
+
tipo_boletim: z14.string()
|
|
439
|
+
});
|
|
440
|
+
var CotacaoResponseSchema = z14.object({
|
|
441
|
+
moeda: z14.string(),
|
|
442
|
+
data: z14.string(),
|
|
443
|
+
cotacoes: z14.array(CotacaoItemSchema)
|
|
444
|
+
});
|
|
445
|
+
async function getMoedas() {
|
|
446
|
+
return fetchApi("/cambio/v1/moedas", MoedasArraySchema);
|
|
447
|
+
}
|
|
448
|
+
async function getCotacao(moeda, data) {
|
|
449
|
+
return fetchApi(`/cambio/v1/cotacao/${moeda}/${data}`, CotacaoResponseSchema);
|
|
450
|
+
}
|
|
451
|
+
// src/fipe.ts
|
|
452
|
+
import { z as z15 } from "zod";
|
|
453
|
+
var FipeMarcaSchema = z15.object({
|
|
454
|
+
nome: z15.string(),
|
|
455
|
+
valor: z15.string()
|
|
456
|
+
});
|
|
457
|
+
var FipeMarcasArraySchema = z15.array(FipeMarcaSchema);
|
|
458
|
+
var FipePrecoSchema = z15.object({
|
|
459
|
+
valor: z15.string(),
|
|
460
|
+
marca: z15.string(),
|
|
461
|
+
modelo: z15.string(),
|
|
462
|
+
anoModelo: z15.number(),
|
|
463
|
+
combustivel: z15.string(),
|
|
464
|
+
codigoFipe: z15.string(),
|
|
465
|
+
mesReferencia: z15.string(),
|
|
466
|
+
tipoVeiculo: z15.number(),
|
|
467
|
+
siglaCombustivel: z15.string(),
|
|
468
|
+
dataConsulta: z15.string().optional()
|
|
469
|
+
});
|
|
470
|
+
var FipeTabelaSchema = z15.object({
|
|
471
|
+
codigo: z15.number(),
|
|
472
|
+
mes: z15.string()
|
|
473
|
+
});
|
|
474
|
+
var FipeTabelasArraySchema = z15.array(FipeTabelaSchema);
|
|
475
|
+
async function getFipeMarcas(tipoVeiculo) {
|
|
476
|
+
return fetchApi(`/fipe/marcas/v1/${tipoVeiculo}`, FipeMarcasArraySchema);
|
|
477
|
+
}
|
|
478
|
+
async function getFipePreco(codigoFipe) {
|
|
479
|
+
return fetchApi(`/fipe/preco/v1/${codigoFipe}`, FipePrecoSchema);
|
|
480
|
+
}
|
|
481
|
+
async function getFipeTabelas() {
|
|
482
|
+
return fetchApi("/fipe/tabelas/v1", FipeTabelasArraySchema);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// src/index.ts
|
|
486
|
+
var VERSION = "0.1.0";
|
|
487
|
+
export {
|
|
488
|
+
setConfig,
|
|
489
|
+
resetConfig,
|
|
490
|
+
getTaxas,
|
|
491
|
+
getTaxa,
|
|
492
|
+
getPrevisaoOndas,
|
|
493
|
+
getPrevisao,
|
|
494
|
+
getPixParticipants,
|
|
495
|
+
getNcms,
|
|
496
|
+
getNcm,
|
|
497
|
+
getMunicipios,
|
|
498
|
+
getMoedas,
|
|
499
|
+
getIsbn,
|
|
500
|
+
getFipeTabelas,
|
|
501
|
+
getFipePreco,
|
|
502
|
+
getFipeMarcas,
|
|
503
|
+
getFeriados,
|
|
504
|
+
getEstados,
|
|
505
|
+
getDomainStatus,
|
|
506
|
+
getDdd,
|
|
507
|
+
getCotacao,
|
|
508
|
+
getCorretoras,
|
|
509
|
+
getCorretora,
|
|
510
|
+
getConfig,
|
|
511
|
+
getCnpj,
|
|
512
|
+
getCidades,
|
|
513
|
+
getCepV2,
|
|
514
|
+
getCep,
|
|
515
|
+
getBanks,
|
|
516
|
+
getBank,
|
|
517
|
+
configureBrasilApi,
|
|
518
|
+
VERSION,
|
|
519
|
+
BrasilApiValidationError,
|
|
520
|
+
BrasilApiResponseError,
|
|
521
|
+
BrasilApiNetworkError,
|
|
522
|
+
BrasilApiError
|
|
523
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@f-o-t/brasil-api",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Type-safe Brasil API wrapper with Zod validation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"homepage": "https://github.com/F-O-T/montte-nx/blob/master/libraries/brasil-api",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/F-O-T/montte-nx.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/F-O-T/montte-nx/issues"
|
|
14
|
+
},
|
|
15
|
+
"private": false,
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"module": "./dist/index.js",
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"bun": "./src/index.ts",
|
|
24
|
+
"import": {
|
|
25
|
+
"default": "./dist/index.js",
|
|
26
|
+
"types": "./dist/index.d.ts"
|
|
27
|
+
},
|
|
28
|
+
"types": "./src/index.ts"
|
|
29
|
+
},
|
|
30
|
+
"./package.json": "./package.json"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist"
|
|
34
|
+
],
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "bunup",
|
|
37
|
+
"dev": "bunup --watch",
|
|
38
|
+
"test": "bun test",
|
|
39
|
+
"test:watch": "bun test --watch",
|
|
40
|
+
"test:coverage": "bun test --coverage",
|
|
41
|
+
"typecheck": "tsc",
|
|
42
|
+
"check": "biome check --write .",
|
|
43
|
+
"release": "bumpp --commit --push --tag"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"zod": "^3.23.8"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@biomejs/biome": "2.3.10",
|
|
50
|
+
"@types/bun": "1.3.5",
|
|
51
|
+
"bumpp": "10.3.2",
|
|
52
|
+
"bunup": "0.16.11",
|
|
53
|
+
"typescript": "5.9.3"
|
|
54
|
+
},
|
|
55
|
+
"peerDependencies": {
|
|
56
|
+
"typescript": ">=4.5.0"
|
|
57
|
+
},
|
|
58
|
+
"peerDependenciesMeta": {
|
|
59
|
+
"typescript": {
|
|
60
|
+
"optional": true
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|