ip-wiki - v1.1.2

ip-wiki — IP Address Utility Library for Wikipedia and NodeJS

ip-wiki is a JavaScript library written in ES6 that provides classes for manipulating IP and CIDR addresses. As the name suggests, it was developed for use on Wikipedia (primarily front-end), but it also works as a Node.js module in back-end environments.

npm

npm install ip-wiki

If you only need type definitions:

npm install -D ip-wiki

In CommonJS:

const { IP, IPUtil } = require('ip-wiki');

In ES modules:

import { IP, IPUtil } from 'ip-wiki';

Then:

Intellisense for NodeJS projects.

Load and import ja:MediaWiki:Gadget-ip-wiki.js. In this case, this package is for Intellisense. (You may also want to install types-mediawiki as a dev dependency.)

/**
* @returns {JQueryPromise<import('ip-wiki')>}
*/
function getIpWiki() {
const gadget = 'ext.gadget.ip-wiki';
return mw.loader.using(gadget).then((req) => req(gadget));
}

getIpWiki().then((ipWiki) => {
const { IP, IPUtil } = ipWiki;
// ...
});

If a module named ip-wiki is not defined in the local Gadgets-definition, you may need to cross-wiki-load the gadget:

/**
* @returns {JQueryPromise<import('ip-wiki')>}
*/
function getIpWikiX() {
const gadget = 'ext.gadget.ip-wiki';
return mw.loader.getScript('https://ja.wikipedia.org/w/load.php?modules=' + gadget).then(() => {
return mw.loader.using(gadget).then((req) => req(gadget));
});
}

Then:

Intellisense for Wikipedia projects.

This library has two main classes: the IP class and the static IPUtil class:

  • Use the IP class when you need to repeatedly manipulate the same IP address. This is more efficient than using IPUtil, as it avoids re-parsing the IP string.
  • Use the IPUtil class for one-off manipulations (i.e. when you don’t need to instantiate a class).

Suppose you want to retrieve the indexes of elements in the ipArr array that match the IP address 192.168.1.1:

const ip = IP.newFromText('192.168.1.1');
if (!ip) {
return;
}
const ipArr = [
'192.168.1.1/32',
'::1',
'192.168.001.001'
];
const indexes = ipArr.reduce(/** @param {number[]} acc */ (acc, ipStr, i) => {
if (ip.equals(ipStr)) { // Not IPUtil.equals('192.168.1.1', ipStr)
acc.push(i);
}
return acc;
}, []);
console.log(indexes); // [ 0, 2 ]

Suppose you want to filter ipArr to include only IPv6 addresses and CIDRs:

const ipArr = [
'192.168.1.1/32',
'::1',
'192.168.001.001'
];
const filtered = ipArr.filter((ip) => IPUtil.isIPv6(ip, true));
console.log(filtered); // [ '::1' ]

Suppose you want to extract an array of IPv6 CIDRs in their sanitized form:

const ipArr = [
'foo',
'192.168.1.0',
'fd12:3456:789a:1::1',
'fd12:3456:789a:0:0:0:0:0/48',
'fd12:3456:789a:1::/64'
];
const ipv6Cidrs = ipArr.reduce(/** @param {string[]} acc */ (acc, ipStr) => {
const sanitized = IPUtil.sanitize(ipStr, false, (version, isCidr) => version === 6 && isCidr);
if (sanitized) {
acc.push(sanitized);
}
return acc;
}, []);
console.log(ipv6Cidrs); // [ 'fd12:3456:789a:0:0:0:0:0/48', 'fd12:3456:789a:1:0:0:0:0/64' ]

For more methods and detailed usage, see the API documentation!