email-tld-validator 1.0.0 → 1.0.1

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/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var source = "IANA Root Zone Database";
4
- var updatedAt = "2026-06-13";
5
- var count = 1437;
4
+ var updatedAt = "2026-06-14";
5
+ var count = 1285;
6
6
  var tlds = [
7
7
  "aaa",
8
8
  "aarp",
@@ -1241,7 +1241,6 @@ var tlds = [
1241
1241
  "webcam",
1242
1242
  "weber",
1243
1243
  "website",
1244
- "wed",
1245
1244
  "wedding",
1246
1245
  "weibo",
1247
1246
  "weir",
@@ -1267,157 +1266,6 @@ var tlds = [
1267
1266
  "xerox",
1268
1267
  "xihuan",
1269
1268
  "xin",
1270
- "xn--11b4c3d",
1271
- "xn--1ck2e1b",
1272
- "xn--1qqw23a",
1273
- "xn--2scrj9c",
1274
- "xn--30rr7y",
1275
- "xn--3bst00m",
1276
- "xn--3ds443g",
1277
- "xn--3e0b707e",
1278
- "xn--3hcrj9c",
1279
- "xn--3pxu8k",
1280
- "xn--42c2d9a",
1281
- "xn--45br5cyl",
1282
- "xn--45brj9c",
1283
- "xn--45q11c",
1284
- "xn--4dbrk0ce",
1285
- "xn--4gbrim",
1286
- "xn--54b7fta0cc",
1287
- "xn--55qw42g",
1288
- "xn--55qx5d",
1289
- "xn--5su34j936bgsg",
1290
- "xn--5tzm5g",
1291
- "xn--6frz82g",
1292
- "xn--6qq986b3xl",
1293
- "xn--80adxhks",
1294
- "xn--80ao21a",
1295
- "xn--80aqecdr1a",
1296
- "xn--80asehdb",
1297
- "xn--80aswg",
1298
- "xn--8y0a063a",
1299
- "xn--90a3ac",
1300
- "xn--90ae",
1301
- "xn--90ais",
1302
- "xn--9dbq2a",
1303
- "xn--9et52u",
1304
- "xn--9krt00a",
1305
- "xn--b4w605ferd",
1306
- "xn--bck1b9a5dre4c",
1307
- "xn--c1avg",
1308
- "xn--c2br7g",
1309
- "xn--cck2b3b",
1310
- "xn--cckwcxetd",
1311
- "xn--cg4bki",
1312
- "xn--clchc0ea0b2g2a9gcd",
1313
- "xn--czr694b",
1314
- "xn--czrs0t",
1315
- "xn--czru2d",
1316
- "xn--d1acj3b",
1317
- "xn--d1alf",
1318
- "xn--e1a4c",
1319
- "xn--eckvdtc9d",
1320
- "xn--efvy88h",
1321
- "xn--fct429k",
1322
- "xn--fhbei",
1323
- "xn--fiq228c5hs",
1324
- "xn--fiq64b",
1325
- "xn--fiqs8s",
1326
- "xn--fiqz9s",
1327
- "xn--fjq720a",
1328
- "xn--flw351e",
1329
- "xn--fpcrj9c3d",
1330
- "xn--fzc2c9e2c",
1331
- "xn--fzys8d69uvgm",
1332
- "xn--g2xx48c",
1333
- "xn--gckr3f0f",
1334
- "xn--gecrj9c",
1335
- "xn--gk3at1e",
1336
- "xn--h2breg3eve",
1337
- "xn--h2brj9c",
1338
- "xn--h2brj9c8c",
1339
- "xn--hxt814e",
1340
- "xn--i1b6b1a6a2e",
1341
- "xn--imr513n",
1342
- "xn--io0a7i",
1343
- "xn--j1aef",
1344
- "xn--j1amh",
1345
- "xn--j6w193g",
1346
- "xn--jlq480n2rg",
1347
- "xn--jvr189m",
1348
- "xn--kcrx77d1x4a",
1349
- "xn--kprw13d",
1350
- "xn--kpry57d",
1351
- "xn--kput3i",
1352
- "xn--l1acc",
1353
- "xn--lgbbat1ad8j",
1354
- "xn--mgb9awbf",
1355
- "xn--mgba3a3ejt",
1356
- "xn--mgba3a4f16a",
1357
- "xn--mgba7c0bbn0a",
1358
- "xn--mgbaam7a8h",
1359
- "xn--mgbab2bd",
1360
- "xn--mgbah1a3hjkrd",
1361
- "xn--mgbai9azgqp6j",
1362
- "xn--mgbayh7gpa",
1363
- "xn--mgbbh1a",
1364
- "xn--mgbbh1a71e",
1365
- "xn--mgbc0a9azcg",
1366
- "xn--mgbca7dzdo",
1367
- "xn--mgbcpq6gpa1a",
1368
- "xn--mgberp4a5d4ar",
1369
- "xn--mgbgu82a",
1370
- "xn--mgbi4ecexp",
1371
- "xn--mgbpl2fh",
1372
- "xn--mgbt3dhd",
1373
- "xn--mgbtx2b",
1374
- "xn--mgbx4cd0ab",
1375
- "xn--mix891f",
1376
- "xn--mk1bu44c",
1377
- "xn--mxtq1m",
1378
- "xn--ngbc5azd",
1379
- "xn--ngbe9e0a",
1380
- "xn--ngbrx",
1381
- "xn--node",
1382
- "xn--nqv7f",
1383
- "xn--nqv7fs00ema",
1384
- "xn--nyqy26a",
1385
- "xn--o3cw4h",
1386
- "xn--ogbpf8fl",
1387
- "xn--otu796d",
1388
- "xn--p1acf",
1389
- "xn--p1ai",
1390
- "xn--pgbs0dh",
1391
- "xn--pssy2u",
1392
- "xn--q7ce6a",
1393
- "xn--q9jyb4c",
1394
- "xn--qcka1pmc",
1395
- "xn--qxa6a",
1396
- "xn--qxam",
1397
- "xn--rhqv96g",
1398
- "xn--rovu88b",
1399
- "xn--rvc1e0am3e",
1400
- "xn--s9brj9c",
1401
- "xn--ses554g",
1402
- "xn--t60b56a",
1403
- "xn--tckwe",
1404
- "xn--tiq49xqyj",
1405
- "xn--unup4y",
1406
- "xn--vermgensberater-ctb",
1407
- "xn--vermgensberatung-pwb",
1408
- "xn--vhquv",
1409
- "xn--vuq861b",
1410
- "xn--w4r85el8fhu5dnra",
1411
- "xn--w4rs40l",
1412
- "xn--wgbh1c",
1413
- "xn--wgbl6a",
1414
- "xn--xhq521b",
1415
- "xn--xkc2al3hye2a",
1416
- "xn--xkc2dl3a5ee0h",
1417
- "xn--y9a3aq",
1418
- "xn--yfro4i67o",
1419
- "xn--ygbi2ammx",
1420
- "xn--zfr164b",
1421
1269
  "xxx",
1422
1270
  "xyz",
1423
1271
  "yachts",
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/index.js"],"sourcesContent":["import tldData from '../data/tlds.json';\n\nconst VALID_TLDS = new Set(tldData.tlds);\n\n/**\n * Validates the local part (before the @).\n * Max 64 chars, allowed: a-z A-Z 0-9 . _ % + -\n * No leading/trailing/consecutive dots.\n * @param {string} local\n * @returns {boolean}\n */\nfunction isValidLocal(local) {\n if (!local || local.length > 64) return false;\n if (/^\\.|\\.$/.test(local)) return false;\n if (/\\.\\./.test(local)) return false;\n return /^[a-zA-Z0-9._%+\\-]+$/.test(local);\n}\n\n/**\n * Validates the domain part (after the @).\n * Each label: 1–63 chars, alphanumeric + hyphens, no leading/trailing hyphen.\n * Total domain max 253 chars, must have at least 2 labels.\n * @param {string} domain\n * @returns {boolean}\n */\nfunction isValidDomain(domain) {\n if (!domain || domain.length > 253) return false;\n const labels = domain.split('.');\n if (labels.length < 2) return false;\n return labels.every(\n (label) =>\n label.length >= 1 &&\n label.length <= 63 &&\n /^[a-zA-Z0-9]([a-zA-Z0-9\\-]*[a-zA-Z0-9])?$|^[a-zA-Z0-9]$/.test(label),\n );\n}\n\n/**\n * Validates an email address against format rules and the IANA TLD whitelist.\n *\n * @param {string} email\n * @returns {{ valid: boolean, reason?: string }}\n *\n * @example\n * validateEmail('user@example.com') // { valid: true }\n * validateEmail('user@example.invalid') // { valid: false, reason: '\"invalid\" is not a recognized TLD' }\n */\nexport function validateEmail(email) {\n if (typeof email !== 'string' || !email.trim()) {\n return { valid: false, reason: 'Email must be a non-empty string' };\n }\n\n const trimmed = email.trim();\n\n if (trimmed.length > 254) {\n return { valid: false, reason: 'Email address is too long' };\n }\n\n const atIndex = trimmed.lastIndexOf('@');\n if (atIndex === -1) {\n return { valid: false, reason: 'Email address must contain @' };\n }\n\n const local = trimmed.slice(0, atIndex);\n const domain = trimmed.slice(atIndex + 1);\n\n if (!local) {\n return { valid: false, reason: 'Email address must contain @' };\n }\n\n if (!isValidLocal(local)) {\n return {\n valid: false,\n reason: 'Invalid characters or format in local part (before @)',\n };\n }\n\n if (!isValidDomain(domain)) {\n return { valid: false, reason: 'Invalid domain format' };\n }\n\n const tld = domain.split('.').pop().toLowerCase();\n if (!VALID_TLDS.has(tld)) {\n return { valid: false, reason: `\"${tld}\" is not a recognized TLD` };\n }\n\n return { valid: true };\n}\n\n/**\n * Returns true if the email passes all validation checks.\n * Convenience wrapper around validateEmail.\n *\n * @param {string} email\n * @returns {boolean}\n *\n * @example\n * isValidEmail('user@example.com') // true\n * isValidEmail('bad-email') // false\n */\nexport function isValidEmail(email) {\n return validateEmail(email).valid;\n}\n\n/**\n * Returns a copy of the internal IANA TLD set.\n * Useful for inspection or custom filtering.\n *\n * @returns {Set<string>}\n */\nexport function getTLDs() {\n return new Set(VALID_TLDS);\n}\n\n/**\n * Returns TLD metadata from the data file (source, updatedAt, count).\n *\n * @returns {{ source: string, updatedAt: string, count: number }}\n */\nexport function getTLDMeta() {\n const { source, updatedAt, count } = tldData;\n return { source, updatedAt, count };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/index.js"],"sourcesContent":["import tldData from '../data/tlds.json';\n\nconst VALID_TLDS = new Set(tldData.tlds);\n\n/**\n * Validates the local part (before the @).\n * Max 64 chars, allowed: a-z A-Z 0-9 . _ % + -\n * No leading/trailing/consecutive dots.\n * @param {string} local\n * @returns {boolean}\n */\nfunction isValidLocal(local) {\n if (!local || local.length > 64) return false;\n if (/^\\.|\\.$/.test(local)) return false;\n if (/\\.\\./.test(local)) return false;\n return /^[a-zA-Z0-9._%+\\-]+$/.test(local);\n}\n\n/**\n * Validates the domain part (after the @).\n * Each label: 1–63 chars, alphanumeric + hyphens, no leading/trailing hyphen.\n * Total domain max 253 chars, must have at least 2 labels.\n * @param {string} domain\n * @returns {boolean}\n */\nfunction isValidDomain(domain) {\n if (!domain || domain.length > 253) return false;\n const labels = domain.split('.');\n if (labels.length < 2) return false;\n return labels.every(\n (label) =>\n label.length >= 1 &&\n label.length <= 63 &&\n /^[a-zA-Z0-9]([a-zA-Z0-9\\-]*[a-zA-Z0-9])?$|^[a-zA-Z0-9]$/.test(label),\n );\n}\n\n/**\n * Validates an email address against format rules and the IANA TLD whitelist.\n *\n * @param {string} email\n * @returns {{ valid: boolean, reason?: string }}\n *\n * @example\n * validateEmail('user@example.com') // { valid: true }\n * validateEmail('user@example.invalid') // { valid: false, reason: '\"invalid\" is not a recognized TLD' }\n */\nexport function validateEmail(email) {\n if (typeof email !== 'string' || !email.trim()) {\n return { valid: false, reason: 'Email must be a non-empty string' };\n }\n\n const trimmed = email.trim();\n\n if (trimmed.length > 254) {\n return { valid: false, reason: 'Email address is too long' };\n }\n\n const atIndex = trimmed.lastIndexOf('@');\n if (atIndex === -1) {\n return { valid: false, reason: 'Email address must contain @' };\n }\n\n const local = trimmed.slice(0, atIndex);\n const domain = trimmed.slice(atIndex + 1);\n\n if (!local) {\n return { valid: false, reason: 'Email address must contain @' };\n }\n\n if (!isValidLocal(local)) {\n return {\n valid: false,\n reason: 'Invalid characters or format in local part (before @)',\n };\n }\n\n if (!isValidDomain(domain)) {\n return { valid: false, reason: 'Invalid domain format' };\n }\n\n const tld = domain.split('.').pop().toLowerCase();\n if (!VALID_TLDS.has(tld)) {\n return { valid: false, reason: `\"${tld}\" is not a recognized TLD` };\n }\n\n return { valid: true };\n}\n\n/**\n * Returns true if the email passes all validation checks.\n * Convenience wrapper around validateEmail.\n *\n * @param {string} email\n * @returns {boolean}\n *\n * @example\n * isValidEmail('user@example.com') // true\n * isValidEmail('bad-email') // false\n */\nexport function isValidEmail(email) {\n return validateEmail(email).valid;\n}\n\n/**\n * Returns a copy of the internal IANA TLD set.\n * Useful for inspection or custom filtering.\n *\n * @returns {Set<string>}\n */\nexport function getTLDs() {\n return new Set(VALID_TLDS);\n}\n\n/**\n * Returns TLD metadata from the data file (source, updatedAt, count).\n *\n * @returns {{ source: string, updatedAt: string, count: number }}\n */\nexport function getTLDMeta() {\n const { source, updatedAt, count } = tldData;\n return { source, updatedAt, count };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -0,0 +1,40 @@
1
+ export interface ValidationResult {
2
+ valid: boolean;
3
+ /** Human-readable reason, present only when valid is false */
4
+ reason?: string;
5
+ }
6
+
7
+ export interface TLDMeta {
8
+ source: string;
9
+ updatedAt: string;
10
+ count: number;
11
+ }
12
+
13
+ /**
14
+ * Validates an email address against format rules and the IANA TLD whitelist.
15
+ *
16
+ * @example
17
+ * validateEmail('user@example.com') // { valid: true }
18
+ * validateEmail('user@example.invalid') // { valid: false, reason: '"invalid" is not a recognized TLD' }
19
+ */
20
+ export function validateEmail(email: string): ValidationResult;
21
+
22
+ /**
23
+ * Returns true if the email passes all validation checks.
24
+ * Convenience wrapper around validateEmail.
25
+ *
26
+ * @example
27
+ * isValidEmail('user@example.com') // true
28
+ * isValidEmail('bad-email') // false
29
+ */
30
+ export function isValidEmail(email: string): boolean;
31
+
32
+ /**
33
+ * Returns a copy of the internal IANA TLD set.
34
+ */
35
+ export function getTLDs(): Set<string>;
36
+
37
+ /**
38
+ * Returns TLD metadata (source, updatedAt, count) from data/tlds.json.
39
+ */
40
+ export function getTLDMeta(): TLDMeta;
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  var source = "IANA Root Zone Database";
2
- var updatedAt = "2026-06-13";
3
- var count = 1437;
2
+ var updatedAt = "2026-06-14";
3
+ var count = 1285;
4
4
  var tlds = [
5
5
  "aaa",
6
6
  "aarp",
@@ -1239,7 +1239,6 @@ var tlds = [
1239
1239
  "webcam",
1240
1240
  "weber",
1241
1241
  "website",
1242
- "wed",
1243
1242
  "wedding",
1244
1243
  "weibo",
1245
1244
  "weir",
@@ -1265,157 +1264,6 @@ var tlds = [
1265
1264
  "xerox",
1266
1265
  "xihuan",
1267
1266
  "xin",
1268
- "xn--11b4c3d",
1269
- "xn--1ck2e1b",
1270
- "xn--1qqw23a",
1271
- "xn--2scrj9c",
1272
- "xn--30rr7y",
1273
- "xn--3bst00m",
1274
- "xn--3ds443g",
1275
- "xn--3e0b707e",
1276
- "xn--3hcrj9c",
1277
- "xn--3pxu8k",
1278
- "xn--42c2d9a",
1279
- "xn--45br5cyl",
1280
- "xn--45brj9c",
1281
- "xn--45q11c",
1282
- "xn--4dbrk0ce",
1283
- "xn--4gbrim",
1284
- "xn--54b7fta0cc",
1285
- "xn--55qw42g",
1286
- "xn--55qx5d",
1287
- "xn--5su34j936bgsg",
1288
- "xn--5tzm5g",
1289
- "xn--6frz82g",
1290
- "xn--6qq986b3xl",
1291
- "xn--80adxhks",
1292
- "xn--80ao21a",
1293
- "xn--80aqecdr1a",
1294
- "xn--80asehdb",
1295
- "xn--80aswg",
1296
- "xn--8y0a063a",
1297
- "xn--90a3ac",
1298
- "xn--90ae",
1299
- "xn--90ais",
1300
- "xn--9dbq2a",
1301
- "xn--9et52u",
1302
- "xn--9krt00a",
1303
- "xn--b4w605ferd",
1304
- "xn--bck1b9a5dre4c",
1305
- "xn--c1avg",
1306
- "xn--c2br7g",
1307
- "xn--cck2b3b",
1308
- "xn--cckwcxetd",
1309
- "xn--cg4bki",
1310
- "xn--clchc0ea0b2g2a9gcd",
1311
- "xn--czr694b",
1312
- "xn--czrs0t",
1313
- "xn--czru2d",
1314
- "xn--d1acj3b",
1315
- "xn--d1alf",
1316
- "xn--e1a4c",
1317
- "xn--eckvdtc9d",
1318
- "xn--efvy88h",
1319
- "xn--fct429k",
1320
- "xn--fhbei",
1321
- "xn--fiq228c5hs",
1322
- "xn--fiq64b",
1323
- "xn--fiqs8s",
1324
- "xn--fiqz9s",
1325
- "xn--fjq720a",
1326
- "xn--flw351e",
1327
- "xn--fpcrj9c3d",
1328
- "xn--fzc2c9e2c",
1329
- "xn--fzys8d69uvgm",
1330
- "xn--g2xx48c",
1331
- "xn--gckr3f0f",
1332
- "xn--gecrj9c",
1333
- "xn--gk3at1e",
1334
- "xn--h2breg3eve",
1335
- "xn--h2brj9c",
1336
- "xn--h2brj9c8c",
1337
- "xn--hxt814e",
1338
- "xn--i1b6b1a6a2e",
1339
- "xn--imr513n",
1340
- "xn--io0a7i",
1341
- "xn--j1aef",
1342
- "xn--j1amh",
1343
- "xn--j6w193g",
1344
- "xn--jlq480n2rg",
1345
- "xn--jvr189m",
1346
- "xn--kcrx77d1x4a",
1347
- "xn--kprw13d",
1348
- "xn--kpry57d",
1349
- "xn--kput3i",
1350
- "xn--l1acc",
1351
- "xn--lgbbat1ad8j",
1352
- "xn--mgb9awbf",
1353
- "xn--mgba3a3ejt",
1354
- "xn--mgba3a4f16a",
1355
- "xn--mgba7c0bbn0a",
1356
- "xn--mgbaam7a8h",
1357
- "xn--mgbab2bd",
1358
- "xn--mgbah1a3hjkrd",
1359
- "xn--mgbai9azgqp6j",
1360
- "xn--mgbayh7gpa",
1361
- "xn--mgbbh1a",
1362
- "xn--mgbbh1a71e",
1363
- "xn--mgbc0a9azcg",
1364
- "xn--mgbca7dzdo",
1365
- "xn--mgbcpq6gpa1a",
1366
- "xn--mgberp4a5d4ar",
1367
- "xn--mgbgu82a",
1368
- "xn--mgbi4ecexp",
1369
- "xn--mgbpl2fh",
1370
- "xn--mgbt3dhd",
1371
- "xn--mgbtx2b",
1372
- "xn--mgbx4cd0ab",
1373
- "xn--mix891f",
1374
- "xn--mk1bu44c",
1375
- "xn--mxtq1m",
1376
- "xn--ngbc5azd",
1377
- "xn--ngbe9e0a",
1378
- "xn--ngbrx",
1379
- "xn--node",
1380
- "xn--nqv7f",
1381
- "xn--nqv7fs00ema",
1382
- "xn--nyqy26a",
1383
- "xn--o3cw4h",
1384
- "xn--ogbpf8fl",
1385
- "xn--otu796d",
1386
- "xn--p1acf",
1387
- "xn--p1ai",
1388
- "xn--pgbs0dh",
1389
- "xn--pssy2u",
1390
- "xn--q7ce6a",
1391
- "xn--q9jyb4c",
1392
- "xn--qcka1pmc",
1393
- "xn--qxa6a",
1394
- "xn--qxam",
1395
- "xn--rhqv96g",
1396
- "xn--rovu88b",
1397
- "xn--rvc1e0am3e",
1398
- "xn--s9brj9c",
1399
- "xn--ses554g",
1400
- "xn--t60b56a",
1401
- "xn--tckwe",
1402
- "xn--tiq49xqyj",
1403
- "xn--unup4y",
1404
- "xn--vermgensberater-ctb",
1405
- "xn--vermgensberatung-pwb",
1406
- "xn--vhquv",
1407
- "xn--vuq861b",
1408
- "xn--w4r85el8fhu5dnra",
1409
- "xn--w4rs40l",
1410
- "xn--wgbh1c",
1411
- "xn--wgbl6a",
1412
- "xn--xhq521b",
1413
- "xn--xkc2al3hye2a",
1414
- "xn--xkc2dl3a5ee0h",
1415
- "xn--y9a3aq",
1416
- "xn--yfro4i67o",
1417
- "xn--ygbi2ammx",
1418
- "xn--zfr164b",
1419
1267
  "xxx",
1420
1268
  "xyz",
1421
1269
  "yachts",
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/index.js"],"sourcesContent":["import tldData from '../data/tlds.json';\n\nconst VALID_TLDS = new Set(tldData.tlds);\n\n/**\n * Validates the local part (before the @).\n * Max 64 chars, allowed: a-z A-Z 0-9 . _ % + -\n * No leading/trailing/consecutive dots.\n * @param {string} local\n * @returns {boolean}\n */\nfunction isValidLocal(local) {\n if (!local || local.length > 64) return false;\n if (/^\\.|\\.$/.test(local)) return false;\n if (/\\.\\./.test(local)) return false;\n return /^[a-zA-Z0-9._%+\\-]+$/.test(local);\n}\n\n/**\n * Validates the domain part (after the @).\n * Each label: 1–63 chars, alphanumeric + hyphens, no leading/trailing hyphen.\n * Total domain max 253 chars, must have at least 2 labels.\n * @param {string} domain\n * @returns {boolean}\n */\nfunction isValidDomain(domain) {\n if (!domain || domain.length > 253) return false;\n const labels = domain.split('.');\n if (labels.length < 2) return false;\n return labels.every(\n (label) =>\n label.length >= 1 &&\n label.length <= 63 &&\n /^[a-zA-Z0-9]([a-zA-Z0-9\\-]*[a-zA-Z0-9])?$|^[a-zA-Z0-9]$/.test(label),\n );\n}\n\n/**\n * Validates an email address against format rules and the IANA TLD whitelist.\n *\n * @param {string} email\n * @returns {{ valid: boolean, reason?: string }}\n *\n * @example\n * validateEmail('user@example.com') // { valid: true }\n * validateEmail('user@example.invalid') // { valid: false, reason: '\"invalid\" is not a recognized TLD' }\n */\nexport function validateEmail(email) {\n if (typeof email !== 'string' || !email.trim()) {\n return { valid: false, reason: 'Email must be a non-empty string' };\n }\n\n const trimmed = email.trim();\n\n if (trimmed.length > 254) {\n return { valid: false, reason: 'Email address is too long' };\n }\n\n const atIndex = trimmed.lastIndexOf('@');\n if (atIndex === -1) {\n return { valid: false, reason: 'Email address must contain @' };\n }\n\n const local = trimmed.slice(0, atIndex);\n const domain = trimmed.slice(atIndex + 1);\n\n if (!local) {\n return { valid: false, reason: 'Email address must contain @' };\n }\n\n if (!isValidLocal(local)) {\n return {\n valid: false,\n reason: 'Invalid characters or format in local part (before @)',\n };\n }\n\n if (!isValidDomain(domain)) {\n return { valid: false, reason: 'Invalid domain format' };\n }\n\n const tld = domain.split('.').pop().toLowerCase();\n if (!VALID_TLDS.has(tld)) {\n return { valid: false, reason: `\"${tld}\" is not a recognized TLD` };\n }\n\n return { valid: true };\n}\n\n/**\n * Returns true if the email passes all validation checks.\n * Convenience wrapper around validateEmail.\n *\n * @param {string} email\n * @returns {boolean}\n *\n * @example\n * isValidEmail('user@example.com') // true\n * isValidEmail('bad-email') // false\n */\nexport function isValidEmail(email) {\n return validateEmail(email).valid;\n}\n\n/**\n * Returns a copy of the internal IANA TLD set.\n * Useful for inspection or custom filtering.\n *\n * @returns {Set<string>}\n */\nexport function getTLDs() {\n return new Set(VALID_TLDS);\n}\n\n/**\n * Returns TLD metadata from the data file (source, updatedAt, count).\n *\n * @returns {{ source: string, updatedAt: string, count: number }}\n */\nexport function getTLDMeta() {\n const { source, updatedAt, count } = tldData;\n return { source, updatedAt, count };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/index.js"],"sourcesContent":["import tldData from '../data/tlds.json';\n\nconst VALID_TLDS = new Set(tldData.tlds);\n\n/**\n * Validates the local part (before the @).\n * Max 64 chars, allowed: a-z A-Z 0-9 . _ % + -\n * No leading/trailing/consecutive dots.\n * @param {string} local\n * @returns {boolean}\n */\nfunction isValidLocal(local) {\n if (!local || local.length > 64) return false;\n if (/^\\.|\\.$/.test(local)) return false;\n if (/\\.\\./.test(local)) return false;\n return /^[a-zA-Z0-9._%+\\-]+$/.test(local);\n}\n\n/**\n * Validates the domain part (after the @).\n * Each label: 1–63 chars, alphanumeric + hyphens, no leading/trailing hyphen.\n * Total domain max 253 chars, must have at least 2 labels.\n * @param {string} domain\n * @returns {boolean}\n */\nfunction isValidDomain(domain) {\n if (!domain || domain.length > 253) return false;\n const labels = domain.split('.');\n if (labels.length < 2) return false;\n return labels.every(\n (label) =>\n label.length >= 1 &&\n label.length <= 63 &&\n /^[a-zA-Z0-9]([a-zA-Z0-9\\-]*[a-zA-Z0-9])?$|^[a-zA-Z0-9]$/.test(label),\n );\n}\n\n/**\n * Validates an email address against format rules and the IANA TLD whitelist.\n *\n * @param {string} email\n * @returns {{ valid: boolean, reason?: string }}\n *\n * @example\n * validateEmail('user@example.com') // { valid: true }\n * validateEmail('user@example.invalid') // { valid: false, reason: '\"invalid\" is not a recognized TLD' }\n */\nexport function validateEmail(email) {\n if (typeof email !== 'string' || !email.trim()) {\n return { valid: false, reason: 'Email must be a non-empty string' };\n }\n\n const trimmed = email.trim();\n\n if (trimmed.length > 254) {\n return { valid: false, reason: 'Email address is too long' };\n }\n\n const atIndex = trimmed.lastIndexOf('@');\n if (atIndex === -1) {\n return { valid: false, reason: 'Email address must contain @' };\n }\n\n const local = trimmed.slice(0, atIndex);\n const domain = trimmed.slice(atIndex + 1);\n\n if (!local) {\n return { valid: false, reason: 'Email address must contain @' };\n }\n\n if (!isValidLocal(local)) {\n return {\n valid: false,\n reason: 'Invalid characters or format in local part (before @)',\n };\n }\n\n if (!isValidDomain(domain)) {\n return { valid: false, reason: 'Invalid domain format' };\n }\n\n const tld = domain.split('.').pop().toLowerCase();\n if (!VALID_TLDS.has(tld)) {\n return { valid: false, reason: `\"${tld}\" is not a recognized TLD` };\n }\n\n return { valid: true };\n}\n\n/**\n * Returns true if the email passes all validation checks.\n * Convenience wrapper around validateEmail.\n *\n * @param {string} email\n * @returns {boolean}\n *\n * @example\n * isValidEmail('user@example.com') // true\n * isValidEmail('bad-email') // false\n */\nexport function isValidEmail(email) {\n return validateEmail(email).valid;\n}\n\n/**\n * Returns a copy of the internal IANA TLD set.\n * Useful for inspection or custom filtering.\n *\n * @returns {Set<string>}\n */\nexport function getTLDs() {\n return new Set(VALID_TLDS);\n}\n\n/**\n * Returns TLD metadata from the data file (source, updatedAt, count).\n *\n * @returns {{ source: string, updatedAt: string, count: number }}\n */\nexport function getTLDMeta() {\n const { source, updatedAt, count } = tldData;\n return { source, updatedAt, count };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -1,6 +1,6 @@
1
1
  var source = "IANA Root Zone Database";
2
- var updatedAt = "2026-06-13";
3
- var count = 1437;
2
+ var updatedAt = "2026-06-14";
3
+ var count = 1285;
4
4
  var tlds = [
5
5
  "aaa",
6
6
  "aarp",
@@ -1239,7 +1239,6 @@ var tlds = [
1239
1239
  "webcam",
1240
1240
  "weber",
1241
1241
  "website",
1242
- "wed",
1243
1242
  "wedding",
1244
1243
  "weibo",
1245
1244
  "weir",
@@ -1265,157 +1264,6 @@ var tlds = [
1265
1264
  "xerox",
1266
1265
  "xihuan",
1267
1266
  "xin",
1268
- "xn--11b4c3d",
1269
- "xn--1ck2e1b",
1270
- "xn--1qqw23a",
1271
- "xn--2scrj9c",
1272
- "xn--30rr7y",
1273
- "xn--3bst00m",
1274
- "xn--3ds443g",
1275
- "xn--3e0b707e",
1276
- "xn--3hcrj9c",
1277
- "xn--3pxu8k",
1278
- "xn--42c2d9a",
1279
- "xn--45br5cyl",
1280
- "xn--45brj9c",
1281
- "xn--45q11c",
1282
- "xn--4dbrk0ce",
1283
- "xn--4gbrim",
1284
- "xn--54b7fta0cc",
1285
- "xn--55qw42g",
1286
- "xn--55qx5d",
1287
- "xn--5su34j936bgsg",
1288
- "xn--5tzm5g",
1289
- "xn--6frz82g",
1290
- "xn--6qq986b3xl",
1291
- "xn--80adxhks",
1292
- "xn--80ao21a",
1293
- "xn--80aqecdr1a",
1294
- "xn--80asehdb",
1295
- "xn--80aswg",
1296
- "xn--8y0a063a",
1297
- "xn--90a3ac",
1298
- "xn--90ae",
1299
- "xn--90ais",
1300
- "xn--9dbq2a",
1301
- "xn--9et52u",
1302
- "xn--9krt00a",
1303
- "xn--b4w605ferd",
1304
- "xn--bck1b9a5dre4c",
1305
- "xn--c1avg",
1306
- "xn--c2br7g",
1307
- "xn--cck2b3b",
1308
- "xn--cckwcxetd",
1309
- "xn--cg4bki",
1310
- "xn--clchc0ea0b2g2a9gcd",
1311
- "xn--czr694b",
1312
- "xn--czrs0t",
1313
- "xn--czru2d",
1314
- "xn--d1acj3b",
1315
- "xn--d1alf",
1316
- "xn--e1a4c",
1317
- "xn--eckvdtc9d",
1318
- "xn--efvy88h",
1319
- "xn--fct429k",
1320
- "xn--fhbei",
1321
- "xn--fiq228c5hs",
1322
- "xn--fiq64b",
1323
- "xn--fiqs8s",
1324
- "xn--fiqz9s",
1325
- "xn--fjq720a",
1326
- "xn--flw351e",
1327
- "xn--fpcrj9c3d",
1328
- "xn--fzc2c9e2c",
1329
- "xn--fzys8d69uvgm",
1330
- "xn--g2xx48c",
1331
- "xn--gckr3f0f",
1332
- "xn--gecrj9c",
1333
- "xn--gk3at1e",
1334
- "xn--h2breg3eve",
1335
- "xn--h2brj9c",
1336
- "xn--h2brj9c8c",
1337
- "xn--hxt814e",
1338
- "xn--i1b6b1a6a2e",
1339
- "xn--imr513n",
1340
- "xn--io0a7i",
1341
- "xn--j1aef",
1342
- "xn--j1amh",
1343
- "xn--j6w193g",
1344
- "xn--jlq480n2rg",
1345
- "xn--jvr189m",
1346
- "xn--kcrx77d1x4a",
1347
- "xn--kprw13d",
1348
- "xn--kpry57d",
1349
- "xn--kput3i",
1350
- "xn--l1acc",
1351
- "xn--lgbbat1ad8j",
1352
- "xn--mgb9awbf",
1353
- "xn--mgba3a3ejt",
1354
- "xn--mgba3a4f16a",
1355
- "xn--mgba7c0bbn0a",
1356
- "xn--mgbaam7a8h",
1357
- "xn--mgbab2bd",
1358
- "xn--mgbah1a3hjkrd",
1359
- "xn--mgbai9azgqp6j",
1360
- "xn--mgbayh7gpa",
1361
- "xn--mgbbh1a",
1362
- "xn--mgbbh1a71e",
1363
- "xn--mgbc0a9azcg",
1364
- "xn--mgbca7dzdo",
1365
- "xn--mgbcpq6gpa1a",
1366
- "xn--mgberp4a5d4ar",
1367
- "xn--mgbgu82a",
1368
- "xn--mgbi4ecexp",
1369
- "xn--mgbpl2fh",
1370
- "xn--mgbt3dhd",
1371
- "xn--mgbtx2b",
1372
- "xn--mgbx4cd0ab",
1373
- "xn--mix891f",
1374
- "xn--mk1bu44c",
1375
- "xn--mxtq1m",
1376
- "xn--ngbc5azd",
1377
- "xn--ngbe9e0a",
1378
- "xn--ngbrx",
1379
- "xn--node",
1380
- "xn--nqv7f",
1381
- "xn--nqv7fs00ema",
1382
- "xn--nyqy26a",
1383
- "xn--o3cw4h",
1384
- "xn--ogbpf8fl",
1385
- "xn--otu796d",
1386
- "xn--p1acf",
1387
- "xn--p1ai",
1388
- "xn--pgbs0dh",
1389
- "xn--pssy2u",
1390
- "xn--q7ce6a",
1391
- "xn--q9jyb4c",
1392
- "xn--qcka1pmc",
1393
- "xn--qxa6a",
1394
- "xn--qxam",
1395
- "xn--rhqv96g",
1396
- "xn--rovu88b",
1397
- "xn--rvc1e0am3e",
1398
- "xn--s9brj9c",
1399
- "xn--ses554g",
1400
- "xn--t60b56a",
1401
- "xn--tckwe",
1402
- "xn--tiq49xqyj",
1403
- "xn--unup4y",
1404
- "xn--vermgensberater-ctb",
1405
- "xn--vermgensberatung-pwb",
1406
- "xn--vhquv",
1407
- "xn--vuq861b",
1408
- "xn--w4r85el8fhu5dnra",
1409
- "xn--w4rs40l",
1410
- "xn--wgbh1c",
1411
- "xn--wgbl6a",
1412
- "xn--xhq521b",
1413
- "xn--xkc2al3hye2a",
1414
- "xn--xkc2dl3a5ee0h",
1415
- "xn--y9a3aq",
1416
- "xn--yfro4i67o",
1417
- "xn--ygbi2ammx",
1418
- "xn--zfr164b",
1419
1267
  "xxx",
1420
1268
  "xyz",
1421
1269
  "yachts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "email-tld-validator",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Lightweight email validator with IANA TLD whitelist — auto-updated via GitHub Actions",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -9,9 +9,18 @@
9
9
  "react-native": "./dist/index.native.js",
10
10
  "exports": {
11
11
  ".": {
12
- "react-native": "./dist/index.native.js",
13
- "import": "./dist/index.mjs",
14
- "require": "./dist/index.cjs",
12
+ "react-native": {
13
+ "types": "./dist/index.d.ts",
14
+ "default": "./dist/index.native.js"
15
+ },
16
+ "import": {
17
+ "types": "./dist/index.d.ts",
18
+ "default": "./dist/index.mjs"
19
+ },
20
+ "require": {
21
+ "types": "./dist/index.d.ts",
22
+ "default": "./dist/index.cjs"
23
+ },
15
24
  "default": "./dist/index.cjs"
16
25
  }
17
26
  },
@@ -21,7 +30,8 @@
21
30
  "data/tlds.json"
22
31
  ],
23
32
  "scripts": {
24
- "build": "rollup -c rollup.config.mjs",
33
+ "build": "rollup -c rollup.config.mjs && npm run build:types",
34
+ "build:types": "node -e \"require('fs').copyFileSync('src/index.d.ts','dist/index.d.ts')\"",
25
35
  "test": "node --experimental-vm-modules test/index.test.mjs",
26
36
  "update-tlds": "node scripts/update-tlds.mjs"
27
37
  },