{"id":23108531,"url":"https://github.com/brandonburrus/cidr-block","last_synced_at":"2026-01-18T07:13:44.230Z","repository":{"id":41819489,"uuid":"415698760","full_name":"brandonburrus/cidr-block","owner":"brandonburrus","description":"npm package for working with IPv4 and IPv6 addresses and CIDRs 📡","archived":false,"fork":false,"pushed_at":"2026-01-17T20:19:06.000Z","size":254,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-18T05:57:16.727Z","etag":null,"topics":["cidr","cloud","devops","networking","vpc"],"latest_commit_sha":null,"homepage":"https://cidr-block.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/brandonburrus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-10-10T20:57:29.000Z","updated_at":"2026-01-17T20:18:33.000Z","dependencies_parsed_at":"2023-02-08T06:35:13.267Z","dependency_job_id":null,"html_url":"https://github.com/brandonburrus/cidr-block","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/brandonburrus/cidr-block","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brandonburrus%2Fcidr-block","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brandonburrus%2Fcidr-block/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brandonburrus%2Fcidr-block/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brandonburrus%2Fcidr-block/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brandonburrus","download_url":"https://codeload.github.com/brandonburrus/cidr-block/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brandonburrus%2Fcidr-block/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28532783,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cidr","cloud","devops","networking","vpc"],"created_at":"2024-12-17T01:27:46.503Z","updated_at":"2026-01-18T07:13:44.225Z","avatar_url":"https://github.com/brandonburrus.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"IPv4 and IPv6 address and CIDR range utilities for JavaScript and TypeScript.\n\n## Installation\n\n```bash\nnpm install cidr-block\n```\n\n## Features\n\n- Full IPv4 and IPv6 address support\n- CIDR block creation and manipulation\n- Address validation and parsing\n- Network calculations (netmask, hostmask, address count, usable addresses)\n- Subnetting operations\n- Address type detection (private, loopback, multicast, etc.)\n- Full TypeScript support with comprehensive type definitions\n- Zero dependencies\n- Works with ESM and CommonJS\n\n## Quick Start\n\n```typescript\nimport { ipv4, ipv6 } from 'cidr-block';\n\n// Create and work with IPv4 addresses\nconst addr = ipv4.address('192.168.1.1');\nconsole.log(addr.isPrivateAddress()); // true\n\n// Create and work with CIDR blocks\nconst cidr = ipv4.cidr('10.0.0.0/16');\nconsole.log(cidr.addressCount()); // 65536\n\n// IPv6 works the same way\nconst v6addr = ipv6.address('2001:db8::1');\nconsole.log(v6addr.toString()); // \"2001:db8::1\"\n```\n\n## API Reference\n\nFull documentation can be found at [cidr-block.com](https://cidr-block.com).\n\n### IPv4\n\n#### Creating Addresses\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\n// From string\nconst addr1 = ipv4.address('192.168.1.1');\n\n// From number\nconst addr2 = ipv4.address(3232235777);\n\n// From octet array\nconst addr3 = ipv4.address([192, 168, 1, 1]);\n```\n\n#### Address Validation\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nipv4.isValidAddress('192.168.1.1');     // true\nipv4.isValidAddress('256.1.1.1');       // false\nipv4.isValidAddress([10, 0, 0, 1]);     // true\nipv4.isValidAddress(4294967295);        // true (255.255.255.255)\nipv4.isValidAddress(4294967296);        // false (exceeds max)\n```\n\n#### Address Conversion\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nconst addr = ipv4.address('192.168.1.1');\n\naddr.toString();       // \"192.168.1.1\"\naddr.toNumber();       // 3232235777\naddr.octets();         // [192, 168, 1, 1]\naddr.toBinaryString(); // \"11000000.10101000.00000001.00000001\"\n```\n\n#### Address Type Detection\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\n// Private addresses (RFC 1918)\nipv4.address('10.0.0.1').isPrivateAddress();      // true\nipv4.address('172.16.0.1').isPrivateAddress();    // true\nipv4.address('192.168.0.1').isPrivateAddress();   // true\nipv4.address('8.8.8.8').isPrivateAddress();       // false\n\n// Loopback addresses\nipv4.address('127.0.0.1').isLoopbackAddress();    // true\nipv4.address('127.255.255.255').isLoopbackAddress(); // true\n\n// Link-local addresses\nipv4.address('169.254.1.1').isLocalLinkAddress(); // true\n\n// Multicast addresses\nipv4.address('224.0.0.1').isMulticastAddress();   // true\nipv4.address('239.255.255.255').isMulticastAddress(); // true\n```\n\n#### Address Comparison\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nconst addr1 = ipv4.address('192.168.1.1');\nconst addr2 = ipv4.address('192.168.1.2');\n\naddr1.equals('192.168.1.1');           // true\naddr1.equals(addr2);                   // false\naddr1.isLessThan(addr2);               // true\naddr1.isGreaterThan(addr2);            // false\naddr1.isLessThanOrEqual(addr2);        // true\naddr1.isGreaterThanOrEqual(addr2);     // false\n```\n\n#### Address Navigation\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nconst addr = ipv4.address('192.168.1.100');\n\naddr.hasNextAddress();       // true\naddr.nextAddress()?.toString();    // \"192.168.1.101\"\n\naddr.hasPreviousAddress();   // true\naddr.previousAddress()?.toString(); // \"192.168.1.99\"\n\n// Edge cases\nconst maxAddr = ipv4.address('255.255.255.255');\nmaxAddr.hasNextAddress();    // false\nmaxAddr.nextAddress();       // undefined\n\nconst minAddr = ipv4.address('0.0.0.0');\nminAddr.hasPreviousAddress(); // false\nminAddr.previousAddress();    // undefined\n```\n\n#### Creating CIDR Blocks\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\n// From string\nconst cidr1 = ipv4.cidr('192.168.0.0/24');\n\n// From object\nconst cidr2 = ipv4.cidr({ address: '192.168.0.0', range: 24 });\n\n// From tuple\nconst cidr3 = ipv4.cidr(['192.168.0.0', 24]);\n\n// Mixed formats work too\nconst cidr4 = ipv4.cidr({ address: [192, 168, 0, 0], range: 24 });\n```\n\n#### CIDR Validation\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nipv4.isValidCIDR('192.168.0.0/24');   // true\nipv4.isValidCIDR('192.168.0.0/33');   // false (range exceeds 32)\nipv4.isValidCIDR('256.0.0.0/24');     // false (invalid address)\nipv4.isValidCIDR(['10.0.0.0', 8]);    // true\n```\n\n#### CIDR Properties\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nconst cidr = ipv4.cidr('192.168.0.0/24');\n\ncidr.toString();                  // \"192.168.0.0/24\"\ncidr.baseAddress().toString();    // \"192.168.0.0\"\ncidr.range();                     // 24\ncidr.netmask().toString();        // \"255.255.255.0\"\ncidr.hostmask().toString();       // \"0.0.0.255\"\ncidr.addressCount();              // 256\ncidr.rangeParts();                // [Ipv4Address, 24]\n\n// Calculate network address from CIDR with host bits\nconst hostCidr = ipv4.cidr('192.168.1.5/24');\nhostCidr.network().toString();      // \"192.168.1.0\"\nhostCidr.networkCIDR().toString();  // \"192.168.1.0/24\"\n```\n\n#### Usable Addresses\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nconst cidr = ipv4.cidr('192.168.1.0/24');\n\n// First usable (excludes network address)\ncidr.getFirstUsableAddress()?.toString(); // \"192.168.1.1\"\n\n// Last usable (excludes broadcast address)\ncidr.getLastUsableAddress()?.toString();  // \"192.168.1.254\"\n\n// For /32, there are no usable addresses\nconst hostCidr = ipv4.cidr('192.168.1.1/32');\nhostCidr.getFirstUsableAddress(); // undefined\nhostCidr.getLastUsableAddress();  // undefined\n```\n\n#### Iterating Addresses\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nconst cidr = ipv4.cidr('192.168.1.0/30');\n\n// Using the generator\nfor (const addr of cidr.addresses()) {\n  console.log(addr.toString());\n}\n// Output:\n// 192.168.1.0\n// 192.168.1.1\n// 192.168.1.2\n// 192.168.1.3\n\n// Convert to array\nconst allAddresses = [...cidr.addresses()];\nconsole.log(allAddresses.length); // 4\n```\n\n#### Address Containment\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nconst cidr = ipv4.cidr('192.168.0.0/24');\n\ncidr.includes(ipv4.address('192.168.0.100')); // true\ncidr.includes(ipv4.address('192.168.1.1'));   // false\ncidr.includes(ipv4.address('192.168.0.0'));   // true\ncidr.includes(ipv4.address('192.168.0.255')); // true\n```\n\n#### CIDR Overlap Detection\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nconst cidr1 = ipv4.cidr('192.168.0.0/24');\nconst cidr2 = ipv4.cidr('192.168.0.128/25');\nconst cidr3 = ipv4.cidr('192.168.1.0/24');\n\ncidr1.overlaps(cidr2); // true (cidr2 is a subnet of cidr1)\ncidr1.overlaps(cidr3); // false (different networks)\n\n// Also accepts string format\ncidr1.overlaps('10.0.0.0/8'); // false\n```\n\n#### Subnetting\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nconst cidr = ipv4.cidr('192.168.0.0/24');\n\n// Split into equal subnets\nconst subnets = cidr.subnet(26);\nsubnets.forEach(s =\u003e console.log(s.toString()));\n// Output:\n// 192.168.0.0/26\n// 192.168.0.64/26\n// 192.168.0.128/26\n// 192.168.0.192/26\n\n// Split into variable-sized subnets\nconst varSubnets = cidr.subnetBy([26, 27, 27, 26]);\nvarSubnets.forEach(s =\u003e console.log(s.toString()));\n// Output:\n// 192.168.0.0/26\n// 192.168.0.64/27\n// 192.168.0.96/27\n// 192.168.0.128/26\n```\n\n#### CIDR Navigation\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nconst cidr = ipv4.cidr('192.168.0.0/24');\n\ncidr.hasNextCIDR();                    // true\ncidr.nextCIDR()?.toString();           // \"192.168.1.0/24\"\n\ncidr.hasPreviousCIDR();                // true\ncidr.previousCIDR()?.toString();       // \"192.167.255.0/24\"\n```\n\n### IPv6\n\n#### Creating Addresses\n\n```typescript\nimport { ipv6 } from 'cidr-block';\n\n// From string (with :: compression)\nconst addr1 = ipv6.address('2001:db8::1');\n\n// From full string\nconst addr2 = ipv6.address('2001:0db8:0000:0000:0000:0000:0000:0001');\n\n// From BigInt\nconst addr3 = ipv6.address(42540766411282592856903984951653826561n);\n\n// From hextets array\nconst addr4 = ipv6.address([0x2001, 0x0db8, 0, 0, 0, 0, 0, 1]);\n```\n\n#### Address Validation\n\n```typescript\nimport { ipv6 } from 'cidr-block';\n\nipv6.isValidAddress('2001:db8::1');           // true\nipv6.isValidAddress('::1');                   // true\nipv6.isValidAddress('::');                    // true\nipv6.isValidAddress('::ffff:192.168.1.1');    // true (IPv4-mapped)\nipv6.isValidAddress('2001:db8::g');           // false (invalid hex)\nipv6.isValidAddress('2001:db8:::1');          // false (multiple ::)\n```\n\n#### Address Conversion\n\n```typescript\nimport { ipv6 } from 'cidr-block';\n\nconst addr = ipv6.address('2001:db8::1');\n\naddr.toString();     // \"2001:db8::1\" (compressed)\naddr.toFullString(); // \"2001:0db8:0000:0000:0000:0000:0000:0001\"\naddr.toBigInt();     // 42540766411282592856903984951653826561n\naddr.hextets();      // [8193, 3512, 0, 0, 0, 0, 0, 1]\naddr.toBinaryString(); // Binary representation with colons\n```\n\n#### Address Type Detection\n\n```typescript\nimport { ipv6 } from 'cidr-block';\n\n// Loopback\nipv6.address('::1').isLoopbackAddress();          // true\n\n// Unspecified\nipv6.address('::').isUnspecifiedAddress();        // true\n\n// Unique local (private equivalent)\nipv6.address('fc00::1').isUniqueLocalAddress();   // true\nipv6.address('fd00::1').isUniqueLocalAddress();   // true\n\n// Link-local\nipv6.address('fe80::1').isLinkLocalAddress();     // true\n\n// Multicast\nipv6.address('ff02::1').isMulticastAddress();     // true\n\n// IPv4-mapped\nipv6.address('::ffff:192.168.1.1').isIPv4MappedAddress(); // true\n\n// Documentation\nipv6.address('2001:db8::1').isDocumentationAddress(); // true\n```\n\n#### Address Comparison\n\n```typescript\nimport { ipv6 } from 'cidr-block';\n\nconst addr1 = ipv6.address('2001:db8::1');\nconst addr2 = ipv6.address('2001:db8::2');\n\naddr1.equals('2001:db8::1');           // true\naddr1.equals(addr2);                   // false\naddr1.isLessThan(addr2);               // true\naddr1.isGreaterThan(addr2);            // false\naddr1.isLessThanOrEqual(addr2);        // true\naddr1.isGreaterThanOrEqual(addr2);     // false\n```\n\n#### Address Navigation\n\n```typescript\nimport { ipv6 } from 'cidr-block';\n\nconst addr = ipv6.address('2001:db8::1');\n\naddr.hasNextAddress();                // true\naddr.nextAddress()?.toString();       // \"2001:db8::2\"\n\naddr.hasPreviousAddress();            // true\naddr.previousAddress()?.toString();   // \"2001:db8::\"\n```\n\n#### Creating CIDR Blocks\n\n```typescript\nimport { ipv6 } from 'cidr-block';\n\n// From string\nconst cidr1 = ipv6.cidr('2001:db8::/32');\n\n// From object\nconst cidr2 = ipv6.cidr({ address: '2001:db8::', range: 32 });\n\n// From tuple\nconst cidr3 = ipv6.cidr(['2001:db8::', 32]);\n```\n\n#### CIDR Validation\n\n```typescript\nimport { ipv6 } from 'cidr-block';\n\nipv6.isValidCIDR('2001:db8::/32');    // true\nipv6.isValidCIDR('2001:db8::/129');   // false (range exceeds 128)\nipv6.isValidCIDR(['::1', 128]);       // true\n```\n\n#### CIDR Properties\n\n```typescript\nimport { ipv6 } from 'cidr-block';\n\nconst cidr = ipv6.cidr('2001:db8::/32');\n\ncidr.toString();                  // \"2001:db8::/32\"\ncidr.baseAddress().toString();    // \"2001:db8::\"\ncidr.range();                     // 32\ncidr.netmask().toString();        // \"ffff:ffff::\"\ncidr.hostmask().toString();       // \"::ffff:ffff:ffff:ffff:ffff:ffff\"\ncidr.addressCount();              // 79228162514264337593543950336n (BigInt)\n\n// Calculate network address from CIDR with host bits\nconst hostCidr = ipv6.cidr('2001:db8::1234/32');\nhostCidr.network().toString();      // \"2001:db8::\"\nhostCidr.networkCIDR().toString();  // \"2001:db8::/32\"\n```\n\n#### Usable Addresses\n\n```typescript\nimport { ipv6 } from 'cidr-block';\n\nconst cidr = ipv6.cidr('2001:db8::/126');\n\ncidr.getFirstUsableAddress()?.toString(); // \"2001:db8::1\"\ncidr.getLastUsableAddress()?.toString();  // \"2001:db8::2\"\n\n// For /128, there are no usable addresses\nconst hostCidr = ipv6.cidr('2001:db8::1/128');\nhostCidr.getFirstUsableAddress(); // undefined\nhostCidr.getLastUsableAddress();  // undefined\n```\n\n#### Iterating Addresses\n\n```typescript\nimport { ipv6 } from 'cidr-block';\n\nconst cidr = ipv6.cidr('2001:db8::/126');\n\nfor (const addr of cidr.addresses()) {\n  console.log(addr.toString());\n}\n// Output:\n// 2001:db8::\n// 2001:db8::1\n// 2001:db8::2\n// 2001:db8::3\n\n// With limit (useful for large ranges)\nfor (const addr of cidr.addresses(2n)) {\n  console.log(addr.toString());\n}\n// Output:\n// 2001:db8::\n// 2001:db8::1\n```\n\n#### Address Containment and Overlap\n\n```typescript\nimport { ipv6 } from 'cidr-block';\n\nconst cidr = ipv6.cidr('2001:db8::/32');\n\ncidr.includes(ipv6.address('2001:db8::1'));      // true\ncidr.includes(ipv6.address('2001:db9::1'));      // false\n\nconst cidr2 = ipv6.cidr('2001:db8:1::/48');\ncidr.overlaps(cidr2);  // true\n```\n\n#### Subnetting\n\n```typescript\nimport { ipv6 } from 'cidr-block';\n\nconst cidr = ipv6.cidr('2001:db8::/32');\n\n// Split into /34 subnets\nconst subnets = cidr.subnet(34);\nsubnets.forEach(s =\u003e console.log(s.toString()));\n// Output:\n// 2001:db8::/34\n// 2001:db8:4000::/34\n// 2001:db8:8000::/34\n// 2001:db8:c000::/34\n\n// Variable-sized subnets\nconst varSubnets = cidr.subnetBy([34, 34, 33]);\nvarSubnets.forEach(s =\u003e console.log(s.toString()));\n```\n\n#### CIDR Navigation\n\n```typescript\nimport { ipv6 } from 'cidr-block';\n\nconst cidr = ipv6.cidr('2001:db8::/32');\n\ncidr.hasNextCIDR();                  // true\ncidr.nextCIDR()?.toString();         // \"2001:db9::/32\"\n\ncidr.hasPreviousCIDR();              // true\ncidr.previousCIDR()?.toString();     // \"2001:db7::/32\"\n```\n\n### Error Handling\n\n```typescript\nimport {\n  ipv4,\n  ipv6,\n  InvalidIpv4AddressError,\n  InvalidIpv4CidrError,\n  InvalidIpv4CidrRangeError,\n  InvalidIpv6AddressError,\n  InvalidIpv6CidrError,\n  InvalidIpv6CidrRangeError\n} from 'cidr-block';\n\n// Invalid address throws error\ntry {\n  ipv4.address('256.0.0.1');\n} catch (e) {\n  if (e instanceof InvalidIpv4AddressError) {\n    console.log(e.message); // \"256.0.0.1 is not a valid IPv4 address\"\n  }\n}\n\n// Invalid CIDR throws error\ntry {\n  ipv4.cidr('192.168.0.0/33');\n} catch (e) {\n  if (e instanceof InvalidIpv4CidrError) {\n    console.log(e.message); // \"192.168.0.0/33 is not a valid IPv4 CIDR range\"\n  }\n}\n\n// Invalid subnet operation throws error\ntry {\n  const cidr = ipv4.cidr('192.168.0.0/24');\n  cidr.subnet(20); // Can't create larger subnets\n} catch (e) {\n  if (e instanceof InvalidIpv4CidrRangeError) {\n    console.log('Invalid subnet range');\n  }\n}\n\n// Use validation to avoid exceptions\nif (ipv4.isValidAddress(userInput)) {\n  const addr = ipv4.address(userInput);\n  // Safe to use\n}\n```\n\n### Constants\n\n```typescript\nimport { ipv4, ipv6 } from 'cidr-block';\n\n// IPv4 constants\nipv4.MAX_SIZE;   // 0xffffffff (4294967295)\nipv4.MIN_SIZE;   // 0x00000000\nipv4.MAX_RANGE;  // 32\nipv4.MIN_RANGE;  // 0\n\n// IPv6 constants\nipv6.MAX_SIZE;   // (1n \u003c\u003c 128n) - 1n\nipv6.MIN_SIZE;   // 0n\nipv6.MAX_RANGE;  // 128\nipv6.MIN_RANGE;  // 0\n```\n\n### Type Definitions\n\n```typescript\nimport type {\n  // IPv4 types\n  Ipv4AddressLiteral,  // string | number | number[]\n  Ipv4AddressString,   // \"${number}.${number}.${number}.${number}\"\n  Ipv4AddressOctets,   // [number, number, number, number]\n  Ipv4CidrLiteral,     // string | { address, range } | [address, range]\n  Ipv4CidrString,      // \"${number}.${number}.${number}.${number}/${number}\"\n\n  // IPv6 types\n  Ipv6AddressLiteral,  // string | bigint | number[]\n  Ipv6AddressHextets,  // [number, number, number, number, number, number, number, number]\n  Ipv6CidrLiteral,     // string | { address, range } | [address, range]\n} from 'cidr-block';\n```\n\n## Common Use Cases\n\n### Checking if an IP is in a Private Network\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nfunction isInternalIP(ip: string): boolean {\n  if (!ipv4.isValidAddress(ip)) return false;\n  const addr = ipv4.address(ip);\n  return addr.isPrivateAddress() || addr.isLoopbackAddress();\n}\n\nisInternalIP('192.168.1.1');  // true\nisInternalIP('10.0.0.1');     // true\nisInternalIP('8.8.8.8');      // false\n```\n\n### Allocating Subnets from a Pool\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nfunction allocateSubnets(poolCidr: string, subnetSize: number, count: number) {\n  const pool = ipv4.cidr(poolCidr);\n  const subnets = pool.subnet(subnetSize);\n  return subnets.slice(0, count);\n}\n\nconst allocated = allocateSubnets('10.0.0.0/16', 24, 3);\nallocated.forEach(s =\u003e console.log(s.toString()));\n// 10.0.0.0/24\n// 10.0.1.0/24\n// 10.0.2.0/24\n```\n\n### Checking for CIDR Conflicts\n\n```typescript\nimport { ipv4, Ipv4Cidr } from 'cidr-block';\n\nfunction findConflicts(newCidr: string, existing: string[]): string[] {\n  const cidr = ipv4.cidr(newCidr);\n  return existing.filter(e =\u003e cidr.overlaps(e));\n}\n\nconst existingRanges = ['10.0.0.0/24', '10.0.1.0/24', '192.168.0.0/16'];\nconst conflicts = findConflicts('10.0.0.0/16', existingRanges);\n// ['10.0.0.0/24', '10.0.1.0/24']\n```\n\n### Generating IP Addresses in a Range\n\n```typescript\nimport { ipv4 } from 'cidr-block';\n\nfunction getUsableIPs(cidrStr: string): string[] {\n  const cidr = ipv4.cidr(cidrStr);\n  const ips: string[] = [];\n\n  for (const addr of cidr.addresses()) {\n    // Skip network and broadcast addresses for practical use\n    if (addr.equals(cidr.baseAddress())) continue;\n\n    const lastOctet = addr.octets()[3];\n    if (lastOctet === 255) continue; // Skip broadcast\n\n    ips.push(addr.toString());\n  }\n\n  return ips;\n}\n\nconst usable = getUsableIPs('192.168.1.0/29');\n// ['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4', '192.168.1.5', '192.168.1.6']\n```\n\n### Normalizing CIDR Blocks\n\n```typescript\nimport { ipv4, ipv6 } from 'cidr-block';\n\n// Normalize IPv4 CIDR by removing host bits\nfunction normalizeIPv4CIDR(cidrStr: string): string {\n  const cidr = ipv4.cidr(cidrStr);\n  return cidr.networkCIDR().toString();\n}\n\nnormalizeIPv4CIDR('192.168.1.5/24');    // \"192.168.1.0/24\"\nnormalizeIPv4CIDR('10.5.10.20/8');      // \"10.0.0.0/8\"\nnormalizeIPv4CIDR('172.16.50.100/12');  // \"172.16.0.0/12\"\n\n// Normalize IPv6 CIDR by removing host bits\nfunction normalizeIPv6CIDR(cidrStr: string): string {\n  const cidr = ipv6.cidr(cidrStr);\n  return cidr.networkCIDR().toString();\n}\n\nnormalizeIPv6CIDR('2001:db8::1234/32');                   // \"2001:db8::/32\"\nnormalizeIPv6CIDR('2001:db8:1:2:3:4:5:6/64');             // \"2001:db8:1:2::/64\"\nnormalizeIPv6CIDR('2001:db8:abcd:ef01::/48');             // \"2001:db8:abcd::/48\"\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrandonburrus%2Fcidr-block","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrandonburrus%2Fcidr-block","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrandonburrus%2Fcidr-block/lists"}