IP-Matching
Standalone module with some handy features regarding IPs:
- Quick and easy-to-use way to check whether an IP meets a requirement
- Support for IPv4/IPv6 wildcard addresses, ranges, subnetworks and masks.
- Supports both parsing and outputting all common IPv6 notations
- Utility methods, e.g. next/previous IP, range to a list of CIDRs, ...
- Every release is thoroughly tested and linted before published
Installation
npm install --save ip-matching
yarn add ip-matching
Comes with its own built-in TypeScript declarations
with included documentation.
Example
import { getMatch, IPMatch, IPSubnetwork, IPRange, matches } from 'ip-matching';
matches('10.0.0.1', '10.0.0.0/24');
matches('10.0.1.1', '10.0.0.0/24');
matches('abc::def', 'abc:*::def');
matches('abc::def', 'abc:9::def');
matches('0001:2:3:4:5:6:7', '1:2:3:4:5:6:7');
const mySubnet: IPMatch = getMatch('fefe::0001:abcd/112');
mySubnet.type;
mySubnet instanceof IPSubnetwork;
mySubnet instanceof IPMatch;
mySubnet.toString();
mySubnet.matches('FEFE::1:bbbb');
mySubnet.matches('FEFE::2:bbbb');
mySubnet.equals(new IPSubnetwork(new IPv6('fefe::1:abcd'), 112));
mySubnet.getAmount();
(mySubnet as IPSubnetwork).getLast().toString();
const myIp = new IPv6('a:0:0::B:0:C');
myIp.toString();
myIp.toLongString();
myIp.toFullString();
new IPv6('::ffff:a9db:*').toMixedString();
const myRange = getMatch('10.0.0.0-10.1.2.3') as IPRange;
myRange.convertToMasks().map((mask: IPMask) => mask.convertToSubnet().toString());
const mask1 = getMatch('10.0.1.0/255.0.255.0') as IPMask;
const mask2 = getMatch('10.0.0.0/128.0.0.0') as IPMask;
mask1.isSubsetOf(mask2);
mask2.getAmount();
getMatch('a::abbc:1234/ffff::ff80:000f').toString();
Note: The matches
function and all constructors error for invalid inputs
You can take a look at the test code or the TypeScript declarations for all the features.
Allowed patterns
- IP (IPv4/IPv6)
- Regular IPv4:
10.0.0.0
- Wildcard IPv4:
10.0.0.*
or even 10.*.0.*
- Regular IPv6:
2001:0db8:85a3:0000:0000:8a2e:0370:7334
- Shortened IPv6:
2001:db8:85a3::8a2e:0370:7334
or ::
or ::1
or a::
- Wildcard IPv6:
2001::*
or even 2001::*:abc:*
- Mixed IPv6 (mapped IPv4):
::ffff:127.0.0.1
(no wildcards allowed in IPv4 part) - Not allowed:
10.0.1*.0
or 2001::a*c
- IP Range
- IPv4:
10.0.0.0-10.1.2.3
- IPv6:
2001::abc-2001::1:ffff
- Note: Left side has to be "lower" than the right side
- IP Subnetwork
- IPv4:
10.0.0.0/16
- IPv6:
2001::/123
- IP Mask
- IPv4:
10.0.0.0/255.0.64.0
- IPv6:
2001:abcd::/ffff:ff8::
The IPMask's toString()
method does not automatically simplify e.g. /255.0.0.0
to /8
, even though those are equivalent. Since 2.0.0, IPMask comes with a method convertToSubnet()
which returns an equivalent IPSubnetwork if possible, otherwise undefined
.
Links