@br-validators/core 1.1.0 → 1.5.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 +67 -3
- package/dist/aeroportos.d.ts +46 -0
- package/dist/aeroportos.js +4316 -0
- package/dist/aeroportos.js.map +1 -0
- package/dist/bancos.js +1 -1
- package/dist/batch.js +19 -18
- package/dist/brcode.js +5 -5
- package/dist/cbo.d.ts +41 -0
- package/dist/cbo.js +10832 -0
- package/dist/cbo.js.map +1 -0
- package/dist/cep.d.ts +38 -1
- package/dist/cep.js +4 -3
- package/dist/cest.d.ts +44 -0
- package/dist/cest.js +8253 -0
- package/dist/cest.js.map +1 -0
- package/dist/cfop.d.ts +41 -0
- package/dist/cfop.js +2812 -0
- package/dist/cfop.js.map +1 -0
- package/dist/chunk-475HS4CJ.js +30 -0
- package/dist/chunk-475HS4CJ.js.map +1 -0
- package/dist/chunk-5CBVZIQC.js +30 -0
- package/dist/chunk-5CBVZIQC.js.map +1 -0
- package/dist/{chunk-LAEUXOF6.js → chunk-5EJAENH5.js} +3 -3
- package/dist/{chunk-LAEUXOF6.js.map → chunk-5EJAENH5.js.map} +1 -1
- package/dist/chunk-6EF7GQRS.js +30 -0
- package/dist/chunk-6EF7GQRS.js.map +1 -0
- package/dist/{chunk-PCP77SLS.js → chunk-6UEXR2MQ.js} +13 -13
- package/dist/{chunk-PCP77SLS.js.map → chunk-6UEXR2MQ.js.map} +1 -1
- package/dist/chunk-7JCJGLA3.js +30 -0
- package/dist/chunk-7JCJGLA3.js.map +1 -0
- package/dist/chunk-DQUMIETC.js +30 -0
- package/dist/chunk-DQUMIETC.js.map +1 -0
- package/dist/chunk-EKOSTVIA.js +30 -0
- package/dist/chunk-EKOSTVIA.js.map +1 -0
- package/dist/{chunk-TJCE4TVX.js → chunk-EN7PVDYB.js} +4 -4
- package/dist/{chunk-TJCE4TVX.js.map → chunk-EN7PVDYB.js.map} +1 -1
- package/dist/{chunk-VWVQWN2G.js → chunk-EQV33L7H.js} +3 -3
- package/dist/{chunk-VWVQWN2G.js.map → chunk-EQV33L7H.js.map} +1 -1
- package/dist/chunk-F7IEPT22.js +30 -0
- package/dist/chunk-F7IEPT22.js.map +1 -0
- package/dist/chunk-FUYDR7JI.js +44 -0
- package/dist/chunk-FUYDR7JI.js.map +1 -0
- package/dist/{chunk-5V6N4JWQ.js → chunk-GWAYWBHN.js} +5 -5
- package/dist/{chunk-5V6N4JWQ.js.map → chunk-GWAYWBHN.js.map} +1 -1
- package/dist/chunk-ILKF7HP7.js +31 -0
- package/dist/chunk-ILKF7HP7.js.map +1 -0
- package/dist/{chunk-IYOPXJLY.js → chunk-JSNXKBZA.js} +3 -3
- package/dist/{chunk-IYOPXJLY.js.map → chunk-JSNXKBZA.js.map} +1 -1
- package/dist/{chunk-P2KNN6ZR.js → chunk-KGCLQ7QX.js} +3 -3
- package/dist/{chunk-P2KNN6ZR.js.map → chunk-KGCLQ7QX.js.map} +1 -1
- package/dist/{chunk-H3MLGGFI.js → chunk-KLONQL76.js} +5 -5
- package/dist/{chunk-H3MLGGFI.js.map → chunk-KLONQL76.js.map} +1 -1
- package/dist/{chunk-63G7QO73.js → chunk-L7PF4KD6.js} +3 -3
- package/dist/{chunk-63G7QO73.js.map → chunk-L7PF4KD6.js.map} +1 -1
- package/dist/{chunk-PNPESCSP.js → chunk-MAM4U3UR.js} +3 -3
- package/dist/{chunk-PNPESCSP.js.map → chunk-MAM4U3UR.js.map} +1 -1
- package/dist/{chunk-V7UJ55KW.js → chunk-MZDCVTN6.js} +3 -3
- package/dist/{chunk-V7UJ55KW.js.map → chunk-MZDCVTN6.js.map} +1 -1
- package/dist/{chunk-I66ZRSEN.js → chunk-NT3TNF3R.js} +3 -3
- package/dist/{chunk-I66ZRSEN.js.map → chunk-NT3TNF3R.js.map} +1 -1
- package/dist/chunk-NTVB7R3A.js +30 -0
- package/dist/chunk-NTVB7R3A.js.map +1 -0
- package/dist/{chunk-N5CER3QZ.js → chunk-NXS343IJ.js} +14 -14
- package/dist/{chunk-N5CER3QZ.js.map → chunk-NXS343IJ.js.map} +1 -1
- package/dist/{chunk-EVULAGR5.js → chunk-O3T7PUBI.js} +3 -3
- package/dist/{chunk-EVULAGR5.js.map → chunk-O3T7PUBI.js.map} +1 -1
- package/dist/chunk-O4AO4YWC.js +30 -0
- package/dist/chunk-O4AO4YWC.js.map +1 -0
- package/dist/{chunk-EFEE6CMO.js → chunk-OOUEURR7.js} +3 -3
- package/dist/{chunk-EFEE6CMO.js.map → chunk-OOUEURR7.js.map} +1 -1
- package/dist/chunk-P6TOL5VY.js +147973 -0
- package/dist/chunk-P6TOL5VY.js.map +1 -0
- package/dist/{chunk-BA3FAVK4.js → chunk-Q5QBTTNC.js} +25 -25
- package/dist/{chunk-BA3FAVK4.js.map → chunk-Q5QBTTNC.js.map} +1 -1
- package/dist/{chunk-ASQ2XIN2.js → chunk-QU4HTXM5.js} +12 -12
- package/dist/{chunk-ASQ2XIN2.js.map → chunk-QU4HTXM5.js.map} +1 -1
- package/dist/{chunk-KTEQPYYN.js → chunk-RRVGW333.js} +6 -6
- package/dist/{chunk-KTEQPYYN.js.map → chunk-RRVGW333.js.map} +1 -1
- package/dist/chunk-RWO34ORS.js +33 -0
- package/dist/chunk-RWO34ORS.js.map +1 -0
- package/dist/chunk-SC6YCHT7.js +30 -0
- package/dist/chunk-SC6YCHT7.js.map +1 -0
- package/dist/{chunk-MESOO5GZ.js → chunk-SDEJD2J7.js} +3 -3
- package/dist/{chunk-MESOO5GZ.js.map → chunk-SDEJD2J7.js.map} +1 -1
- package/dist/chunk-UGW266DF.js +30 -0
- package/dist/chunk-UGW266DF.js.map +1 -0
- package/dist/{chunk-YNVMVDFN.js → chunk-VKG7UEN5.js} +3 -3
- package/dist/{chunk-YNVMVDFN.js.map → chunk-VKG7UEN5.js.map} +1 -1
- package/dist/{chunk-LRUZVPLR.js → chunk-VWS4AWCI.js} +3 -3
- package/dist/{chunk-LRUZVPLR.js.map → chunk-VWS4AWCI.js.map} +1 -1
- package/dist/{chunk-XADVBV73.js → chunk-WH6W3NUA.js} +6 -6
- package/dist/{chunk-XADVBV73.js.map → chunk-WH6W3NUA.js.map} +1 -1
- package/dist/{chunk-UCNPXHIJ.js → chunk-WSUAPD5M.js} +6 -6
- package/dist/{chunk-UCNPXHIJ.js.map → chunk-WSUAPD5M.js.map} +1 -1
- package/dist/{chunk-JCWQDTZB.js → chunk-X7XQRG4X.js} +3 -3
- package/dist/{chunk-JCWQDTZB.js.map → chunk-X7XQRG4X.js.map} +1 -1
- package/dist/{chunk-CSVGWTCG.js → chunk-XHDRWM46.js} +3 -3
- package/dist/{chunk-CSVGWTCG.js.map → chunk-XHDRWM46.js.map} +1 -1
- package/dist/chunk-XQ6MMGV2.js +30 -0
- package/dist/chunk-XQ6MMGV2.js.map +1 -0
- package/dist/{chunk-FOP5LO7W.js → chunk-YNUYQKUW.js} +15 -15
- package/dist/{chunk-FOP5LO7W.js.map → chunk-YNUYQKUW.js.map} +1 -1
- package/dist/chunk-YOL43ZNQ.js +35 -0
- package/dist/chunk-YOL43ZNQ.js.map +1 -0
- package/dist/chunk-ZWAYSR5K.js +30 -0
- package/dist/chunk-ZWAYSR5K.js.map +1 -0
- package/dist/{chunk-MKYCKCZ6.js → chunk-ZYWBWXTJ.js} +13 -13
- package/dist/{chunk-MKYCKCZ6.js.map → chunk-ZYWBWXTJ.js.map} +1 -1
- package/dist/cnaes.d.ts +41 -0
- package/dist/cnaes.js +5384 -0
- package/dist/cnaes.js.map +1 -0
- package/dist/cnh.js +4 -4
- package/dist/compare.js +21 -20
- package/dist/cpf.js +4 -4
- package/dist/data-catalog.js +38 -4
- package/dist/data-catalog.js.map +1 -1
- package/dist/detect.js +18 -17
- package/dist/diff.js +21 -20
- package/dist/feriados.d.ts +73 -0
- package/dist/feriados.js +243 -0
- package/dist/feriados.js.map +1 -0
- package/dist/generate.js +29 -28
- package/dist/ibge.js +1 -1
- package/dist/incoterms.d.ts +36 -0
- package/dist/incoterms.js +87 -0
- package/dist/incoterms.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +49 -48
- package/dist/index.js.map +1 -1
- package/dist/inscricao-estadual-produtor-rural.js +1 -1
- package/dist/mask.js +28 -27
- package/dist/moedas.d.ts +42 -0
- package/dist/moedas.js +977 -0
- package/dist/moedas.js.map +1 -0
- package/dist/natureza-juridica.d.ts +37 -0
- package/dist/natureza-juridica.js +398 -0
- package/dist/natureza-juridica.js.map +1 -0
- package/dist/nbs.d.ts +40 -0
- package/dist/nbs.js +3728 -0
- package/dist/nbs.js.map +1 -0
- package/dist/ncm.d.ts +41 -0
- package/dist/ncm.js +42116 -0
- package/dist/ncm.js.map +1 -0
- package/dist/paises-bacen.d.ts +35 -0
- package/dist/paises-bacen.js +1044 -0
- package/dist/paises-bacen.js.map +1 -0
- package/dist/pix.js +5 -5
- package/dist/placa.js +1 -1
- package/dist/pncp-reference.d.ts +56 -0
- package/dist/pncp-reference.js +1560 -0
- package/dist/pncp-reference.js.map +1 -0
- package/dist/portos.d.ts +48 -0
- package/dist/portos.js +12094 -0
- package/dist/portos.js.map +1 -0
- package/dist/renavam.js +4 -4
- package/dist/sanitize.js +16 -15
- package/dist/telefone.js +3 -3
- package/dist/titulo-eleitor.js +4 -4
- package/dist/transparencia-snapshots.d.ts +61 -0
- package/dist/transparencia-snapshots.js +119 -0
- package/dist/transparencia-snapshots.js.map +1 -0
- package/dist/tse-municipios.d.ts +39 -0
- package/dist/tse-municipios.js +33469 -0
- package/dist/tse-municipios.js.map +1 -0
- package/package.json +81 -1
- package/dist/chunk-TE6NSONR.js +0 -43
- package/dist/chunk-TE6NSONR.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@br-validators/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "The Brazilian document validation library for TypeScript — CPF, CNPJ (alphanumeric), NF-e, PIX, boleto, IE (27 UFs), and 15+ more. Zero deps, fully typed, never throws.",
|
|
5
5
|
"homepage": "https://www.npmjs.com/package/@br-validators/core",
|
|
6
6
|
"license": "MIT",
|
|
@@ -40,6 +40,22 @@
|
|
|
40
40
|
"diff",
|
|
41
41
|
"ibge",
|
|
42
42
|
"bancos",
|
|
43
|
+
"aeroportos",
|
|
44
|
+
"tse-municipios",
|
|
45
|
+
"moedas",
|
|
46
|
+
"paises-bacen",
|
|
47
|
+
"incoterms",
|
|
48
|
+
"feriados",
|
|
49
|
+
"cnaes",
|
|
50
|
+
"cfop",
|
|
51
|
+
"natureza-juridica",
|
|
52
|
+
"nbs",
|
|
53
|
+
"cest",
|
|
54
|
+
"ncm",
|
|
55
|
+
"cbo",
|
|
56
|
+
"portos",
|
|
57
|
+
"pncp-reference",
|
|
58
|
+
"transparencia-snapshots",
|
|
43
59
|
"data-catalog",
|
|
44
60
|
"typescript"
|
|
45
61
|
],
|
|
@@ -154,6 +170,70 @@
|
|
|
154
170
|
"types": "./dist/bancos.d.ts",
|
|
155
171
|
"import": "./dist/bancos.js"
|
|
156
172
|
},
|
|
173
|
+
"./aeroportos": {
|
|
174
|
+
"types": "./dist/aeroportos.d.ts",
|
|
175
|
+
"import": "./dist/aeroportos.js"
|
|
176
|
+
},
|
|
177
|
+
"./tse-municipios": {
|
|
178
|
+
"types": "./dist/tse-municipios.d.ts",
|
|
179
|
+
"import": "./dist/tse-municipios.js"
|
|
180
|
+
},
|
|
181
|
+
"./moedas": {
|
|
182
|
+
"types": "./dist/moedas.d.ts",
|
|
183
|
+
"import": "./dist/moedas.js"
|
|
184
|
+
},
|
|
185
|
+
"./paises-bacen": {
|
|
186
|
+
"types": "./dist/paises-bacen.d.ts",
|
|
187
|
+
"import": "./dist/paises-bacen.js"
|
|
188
|
+
},
|
|
189
|
+
"./incoterms": {
|
|
190
|
+
"types": "./dist/incoterms.d.ts",
|
|
191
|
+
"import": "./dist/incoterms.js"
|
|
192
|
+
},
|
|
193
|
+
"./feriados": {
|
|
194
|
+
"types": "./dist/feriados.d.ts",
|
|
195
|
+
"import": "./dist/feriados.js"
|
|
196
|
+
},
|
|
197
|
+
"./cnaes": {
|
|
198
|
+
"types": "./dist/cnaes.d.ts",
|
|
199
|
+
"import": "./dist/cnaes.js"
|
|
200
|
+
},
|
|
201
|
+
"./cfop": {
|
|
202
|
+
"types": "./dist/cfop.d.ts",
|
|
203
|
+
"import": "./dist/cfop.js"
|
|
204
|
+
},
|
|
205
|
+
"./natureza-juridica": {
|
|
206
|
+
"types": "./dist/natureza-juridica.d.ts",
|
|
207
|
+
"import": "./dist/natureza-juridica.js"
|
|
208
|
+
},
|
|
209
|
+
"./nbs": {
|
|
210
|
+
"types": "./dist/nbs.d.ts",
|
|
211
|
+
"import": "./dist/nbs.js"
|
|
212
|
+
},
|
|
213
|
+
"./cest": {
|
|
214
|
+
"types": "./dist/cest.d.ts",
|
|
215
|
+
"import": "./dist/cest.js"
|
|
216
|
+
},
|
|
217
|
+
"./ncm": {
|
|
218
|
+
"types": "./dist/ncm.d.ts",
|
|
219
|
+
"import": "./dist/ncm.js"
|
|
220
|
+
},
|
|
221
|
+
"./cbo": {
|
|
222
|
+
"types": "./dist/cbo.d.ts",
|
|
223
|
+
"import": "./dist/cbo.js"
|
|
224
|
+
},
|
|
225
|
+
"./portos": {
|
|
226
|
+
"types": "./dist/portos.d.ts",
|
|
227
|
+
"import": "./dist/portos.js"
|
|
228
|
+
},
|
|
229
|
+
"./pncp-reference": {
|
|
230
|
+
"types": "./dist/pncp-reference.d.ts",
|
|
231
|
+
"import": "./dist/pncp-reference.js"
|
|
232
|
+
},
|
|
233
|
+
"./transparencia-snapshots": {
|
|
234
|
+
"types": "./dist/transparencia-snapshots.d.ts",
|
|
235
|
+
"import": "./dist/transparencia-snapshots.js"
|
|
236
|
+
},
|
|
157
237
|
"./data-catalog": {
|
|
158
238
|
"types": "./dist/data-catalog.d.ts",
|
|
159
239
|
"import": "./dist/data-catalog.js"
|
package/dist/chunk-TE6NSONR.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { stripCep } from './chunk-YYHS5WQN.js';
|
|
2
|
-
import { brandCep } from './chunk-NUQSMT4Y.js';
|
|
3
|
-
|
|
4
|
-
// src/core/cep/constants.ts
|
|
5
|
-
var CEP_LENGTH = 8;
|
|
6
|
-
var CEP_MASK_PATTERN = /^(\d{5})(\d{3})$/;
|
|
7
|
-
var CEP_GOLDEN_PRIMARY = "01310100";
|
|
8
|
-
var CEP_GOLDEN_SECONDARY = "20040020";
|
|
9
|
-
var CEP_GOLDEN_PRIMARY_MASKED = "01310-100";
|
|
10
|
-
var CEP_OFFICIAL_SOURCE_URL = "https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep";
|
|
11
|
-
|
|
12
|
-
// src/core/cep/index.ts
|
|
13
|
-
function failure(code, message) {
|
|
14
|
-
return { ok: false, code, message };
|
|
15
|
-
}
|
|
16
|
-
function validateStructure(input, stripped) {
|
|
17
|
-
if (stripped.length === 0) {
|
|
18
|
-
return failure("EMPTY_INPUT", "CEP input is empty");
|
|
19
|
-
}
|
|
20
|
-
const withoutMask = input.replace(/[-\s]/g, "");
|
|
21
|
-
if (/[^0-9]/.test(withoutMask)) {
|
|
22
|
-
return failure("INVALID_CHARACTER", "CEP contains invalid characters");
|
|
23
|
-
}
|
|
24
|
-
if (stripped.length !== CEP_LENGTH) {
|
|
25
|
-
return failure("INVALID_LENGTH", `CEP must have ${CEP_LENGTH} digits after normalization`);
|
|
26
|
-
}
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
function isValidCep(input) {
|
|
30
|
-
return validateCep(input).ok;
|
|
31
|
-
}
|
|
32
|
-
function validateCep(input) {
|
|
33
|
-
const stripped = stripCep(input);
|
|
34
|
-
const structural = validateStructure(input, stripped);
|
|
35
|
-
if (structural) {
|
|
36
|
-
return structural;
|
|
37
|
-
}
|
|
38
|
-
return { ok: true, value: brandCep(stripped), format: "numeric" };
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export { CEP_GOLDEN_PRIMARY, CEP_GOLDEN_PRIMARY_MASKED, CEP_GOLDEN_SECONDARY, CEP_MASK_PATTERN, CEP_OFFICIAL_SOURCE_URL, isValidCep, validateCep };
|
|
42
|
-
//# sourceMappingURL=chunk-TE6NSONR.js.map
|
|
43
|
-
//# sourceMappingURL=chunk-TE6NSONR.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/cep/constants.ts","../src/core/cep/index.ts"],"names":[],"mappings":";;;;AAKO,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,gBAAA,GAAmB;AAGzB,IAAM,kBAAA,GAAqB;AAC3B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,yBAAA,GAA4B;AAClC,IAAM,uBAAA,GACX;;;ACMF,SAAS,OAAA,CAAQ,MAA4B,OAAA,EAA+B;AAC1E,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AACpC;AAEA,SAAS,iBAAA,CAAkB,OAAe,QAAA,EAAuC;AAC/E,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,OAAA,CAAQ,eAAe,oBAAoB,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAC9C,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,OAAA,CAAQ,qBAAqB,iCAAiC,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,UAAA,EAAY;AAClC,IAAA,OAAO,OAAA,CAAQ,gBAAA,EAAkB,CAAA,cAAA,EAAiB,UAAU,CAAA,2BAAA,CAA6B,CAAA;AAAA,EAC3F;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,OAAO,WAAA,CAAY,KAAK,CAAA,CAAE,EAAA;AAC5B;AAEO,SAAS,YAAY,KAAA,EAAiC;AAC3D,EAAA,MAAM,QAAA,GAAW,SAAS,KAAK,CAAA;AAC/B,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA;AACpD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,SAAS,QAAQ,CAAA,EAAG,QAAQ,SAAA,EAAU;AAClE","file":"chunk-TE6NSONR.js","sourcesContent":["/**\n * CEP constants — 8 digits, no check digit (Correios).\n * @see https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep\n * @see docs/VALIDATION-RULES.md BR-CEP-001 — golden vector 01310100\n */\nexport const CEP_LENGTH = 8;\nexport const CEP_MASK_PATTERN = /^(\\d{5})(\\d{3})$/;\nexport const CEP_NUMERIC_PATTERN = /^\\d{8}$/;\n\nexport const CEP_GOLDEN_PRIMARY = '01310100';\nexport const CEP_GOLDEN_SECONDARY = '20040020';\nexport const CEP_GOLDEN_PRIMARY_MASKED = '01310-100';\nexport const CEP_OFFICIAL_SOURCE_URL =\n 'https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep';\n","/**\n * CEP validation — structural only, no check digit (Correios).\n * @see https://www.correios.com.br/atendimento/developers/manuais/manual-api-busca-cep\n * @see docs/VALIDATION-RULES.md BR-CEP-001 — golden vector 01310100\n */\nimport { stripCep } from '../../strip/index.js';\nimport type { ValidationResult } from '../../types/validation-result.js';\nimport { brandCep } from '../../types/validation-result.js';\nimport { CEP_LENGTH } from './constants.js';\n\nexport {\n CEP_GOLDEN_PRIMARY,\n CEP_GOLDEN_PRIMARY_MASKED,\n CEP_GOLDEN_SECONDARY,\n CEP_OFFICIAL_SOURCE_URL,\n} from './constants.js';\n\ntype FailedResult = Extract<ValidationResult, { ok: false }>;\n\nfunction failure(code: FailedResult['code'], message: string): FailedResult {\n return { ok: false, code, message };\n}\n\nfunction validateStructure(input: string, stripped: string): FailedResult | null {\n if (stripped.length === 0) {\n return failure('EMPTY_INPUT', 'CEP input is empty');\n }\n\n const withoutMask = input.replace(/[-\\s]/g, '');\n if (/[^0-9]/.test(withoutMask)) {\n return failure('INVALID_CHARACTER', 'CEP contains invalid characters');\n }\n\n if (stripped.length !== CEP_LENGTH) {\n return failure('INVALID_LENGTH', `CEP must have ${CEP_LENGTH} digits after normalization`);\n }\n\n return null;\n}\n\nexport function isValidCep(input: string): boolean {\n return validateCep(input).ok;\n}\n\nexport function validateCep(input: string): ValidationResult {\n const stripped = stripCep(input);\n const structural = validateStructure(input, stripped);\n if (structural) {\n return structural;\n }\n\n return { ok: true, value: brandCep(stripped), format: 'numeric' };\n}\n"]}
|