node-ip-ts 1.0.0 → 1.2.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.
@@ -0,0 +1,372 @@
1
+ // Pure IP utility functions — no Node.js built-in dependencies.
2
+ // Safe to use in any environment: Node.js, browser, Deno, edge runtimes.
3
+ // ─── Internal helpers ─────────────────────────────────────────────────────────
4
+ export function normalizeFamily(family) {
5
+ if (family === 4)
6
+ return 'ipv4';
7
+ if (family === 6)
8
+ return 'ipv6';
9
+ return family ? family.toLowerCase() : 'ipv4';
10
+ }
11
+ // ─── Buffer ↔ String conversion ───────────────────────────────────────────────
12
+ /**
13
+ * Convert an IP address string to a Buffer.
14
+ * Optionally write into an existing buffer at a given offset.
15
+ */
16
+ export function toBuffer(ip, buff, offset) {
17
+ const off = offset !== undefined ? ~~offset : 0;
18
+ let result;
19
+ if (isV4Format(ip)) {
20
+ result = buff ?? Buffer.alloc(off + 4);
21
+ let pos = off;
22
+ for (const byte of ip.split('.')) {
23
+ result[pos++] = parseInt(byte, 10) & 0xff;
24
+ }
25
+ return result;
26
+ }
27
+ if (isV6Format(ip)) {
28
+ const sections = ip.split(':', 8);
29
+ for (let i = 0; i < sections.length; i++) {
30
+ if (isV4Format(sections[i])) {
31
+ const v4buf = toBuffer(sections[i]);
32
+ sections[i] = v4buf.subarray(0, 2).toString('hex');
33
+ if (++i < 8) {
34
+ sections.splice(i, 0, v4buf.subarray(2, 4).toString('hex'));
35
+ }
36
+ }
37
+ }
38
+ // Expand ::
39
+ if (sections[0] === '') {
40
+ while (sections.length < 8)
41
+ sections.unshift('0');
42
+ }
43
+ else if (sections[sections.length - 1] === '') {
44
+ while (sections.length < 8)
45
+ sections.push('0');
46
+ }
47
+ else if (sections.length < 8) {
48
+ let emptyIdx = 0;
49
+ for (; emptyIdx < sections.length && sections[emptyIdx] !== ''; emptyIdx++)
50
+ ;
51
+ const toInsert = 9 - sections.length;
52
+ sections.splice(emptyIdx, 1, ...Array(toInsert).fill('0'));
53
+ }
54
+ result = buff ?? Buffer.alloc(off + 16);
55
+ let pos = off;
56
+ for (const section of sections) {
57
+ const word = parseInt(section, 16);
58
+ result[pos++] = (word >> 8) & 0xff;
59
+ result[pos++] = word & 0xff;
60
+ }
61
+ return result;
62
+ }
63
+ throw new Error(`Invalid ip address: ${ip}`);
64
+ }
65
+ /**
66
+ * Convert a Buffer back to an IP address string.
67
+ */
68
+ export function toString(buff, offset = 0, length) {
69
+ const len = length ?? buff.length - offset;
70
+ if (len === 4) {
71
+ const parts = [];
72
+ for (let i = 0; i < 4; i++)
73
+ parts.push(buff[offset + i]);
74
+ return parts.join('.');
75
+ }
76
+ if (len === 16) {
77
+ const parts = [];
78
+ for (let i = 0; i < 16; i += 2) {
79
+ parts.push(buff.readUInt16BE(offset + i).toString(16));
80
+ }
81
+ let result = parts.join(':');
82
+ result = result.replace(/(^|:)0(:0)*:0(:|$)/, '$1::$3');
83
+ result = result.replace(/:{3,4}/, '::');
84
+ return result;
85
+ }
86
+ return '';
87
+ }
88
+ // ─── Format detection ─────────────────────────────────────────────────────────
89
+ const IPV4_REGEX = /^(\d{1,3}\.){3}\d{1,3}$/;
90
+ const IPV6_REGEX = /^(::)?(((\d{1,3}\.){3}(\d{1,3}){1})?([0-9a-f]){0,4}:{0,2}){1,8}(::)?$/i;
91
+ export function isV4Format(ip) {
92
+ return IPV4_REGEX.test(ip);
93
+ }
94
+ export function isV6Format(ip) {
95
+ return IPV6_REGEX.test(ip);
96
+ }
97
+ // ─── Mask / CIDR utilities ───────────────────────────────────────────────────
98
+ /**
99
+ * Create a subnet mask from a prefix length.
100
+ */
101
+ export function fromPrefixLen(prefixlen, family) {
102
+ const fam = prefixlen > 32 ? 'ipv6' : normalizeFamily(family);
103
+ const len = fam === 'ipv6' ? 16 : 4;
104
+ const buff = Buffer.alloc(len);
105
+ let remaining = prefixlen;
106
+ for (let i = 0; i < len; i++) {
107
+ const bits = Math.min(remaining, 8);
108
+ remaining -= bits;
109
+ buff[i] = ~(0xff >> bits) & 0xff;
110
+ }
111
+ return toString(buff);
112
+ }
113
+ /**
114
+ * Apply a subnet mask to an address.
115
+ */
116
+ export function mask(addr, maskStr) {
117
+ const addrBuf = toBuffer(addr);
118
+ const maskBuf = toBuffer(maskStr);
119
+ const result = Buffer.alloc(Math.max(addrBuf.length, maskBuf.length));
120
+ if (addrBuf.length === maskBuf.length) {
121
+ for (let i = 0; i < addrBuf.length; i++) {
122
+ result[i] = addrBuf[i] & maskBuf[i];
123
+ }
124
+ }
125
+ else if (maskBuf.length === 4) {
126
+ // IPv6 address, IPv4 mask → mask low 4 bytes
127
+ for (let i = 0; i < maskBuf.length; i++) {
128
+ result[i] = addrBuf[addrBuf.length - 4 + i] & maskBuf[i];
129
+ }
130
+ }
131
+ else {
132
+ // IPv6 mask, IPv4 address → embed as ::ffff:ipv4
133
+ for (let i = 0; i < result.length - 6; i++)
134
+ result[i] = 0;
135
+ result[10] = 0xff;
136
+ result[11] = 0xff;
137
+ for (let i = 0; i < addrBuf.length; i++) {
138
+ result[i + 12] = addrBuf[i] & maskBuf[i + 12];
139
+ }
140
+ }
141
+ return toString(result);
142
+ }
143
+ /**
144
+ * Return the network address for a CIDR string (e.g. "192.168.1.1/24").
145
+ */
146
+ export function cidr(cidrString) {
147
+ const [addr, prefixStr] = cidrString.split('/');
148
+ if (!prefixStr)
149
+ throw new Error(`invalid CIDR subnet: ${cidrString}`);
150
+ return mask(addr, fromPrefixLen(parseInt(prefixStr, 10)));
151
+ }
152
+ /**
153
+ * Compute full subnet information from address + mask.
154
+ */
155
+ export function subnet(addr, subnetMask) {
156
+ const networkAddress = toLong(mask(addr, subnetMask));
157
+ const maskBuf = toBuffer(subnetMask);
158
+ let maskLength = 0;
159
+ for (const byte of maskBuf) {
160
+ if (byte === 0xff) {
161
+ maskLength += 8;
162
+ }
163
+ else {
164
+ let octet = byte & 0xff;
165
+ while (octet) {
166
+ octet = (octet << 1) & 0xff;
167
+ maskLength++;
168
+ }
169
+ }
170
+ }
171
+ const numberOfAddresses = 2 ** (32 - maskLength);
172
+ return {
173
+ networkAddress: fromLong(networkAddress),
174
+ firstAddress: numberOfAddresses <= 2
175
+ ? fromLong(networkAddress)
176
+ : fromLong(networkAddress + 1),
177
+ lastAddress: numberOfAddresses <= 2
178
+ ? fromLong(networkAddress + numberOfAddresses - 1)
179
+ : fromLong(networkAddress + numberOfAddresses - 2),
180
+ broadcastAddress: fromLong(networkAddress + numberOfAddresses - 1),
181
+ subnetMask,
182
+ subnetMaskLength: maskLength,
183
+ numHosts: numberOfAddresses <= 2 ? numberOfAddresses : numberOfAddresses - 2,
184
+ length: numberOfAddresses,
185
+ contains(other) {
186
+ return networkAddress === toLong(mask(other, subnetMask));
187
+ },
188
+ };
189
+ }
190
+ /**
191
+ * Compute full subnet information from a CIDR string.
192
+ */
193
+ export function cidrSubnet(cidrString) {
194
+ const [addr, prefixStr] = cidrString.split('/');
195
+ if (!prefixStr)
196
+ throw new Error(`invalid CIDR subnet: ${cidrString}`);
197
+ return subnet(addr, fromPrefixLen(parseInt(prefixStr, 10)));
198
+ }
199
+ // ─── Bitwise operations ───────────────────────────────────────────────────────
200
+ /** Bitwise NOT of an IP address. */
201
+ export function not(addr) {
202
+ const buff = toBuffer(addr);
203
+ for (let i = 0; i < buff.length; i++)
204
+ buff[i] ^= 0xff;
205
+ return toString(buff);
206
+ }
207
+ /** Bitwise OR of two IP addresses (supports mixed protocol). */
208
+ export function or(a, b) {
209
+ let bufA = toBuffer(a);
210
+ let bufB = toBuffer(b);
211
+ if (bufA.length === bufB.length) {
212
+ for (let i = 0; i < bufA.length; i++)
213
+ bufA[i] |= bufB[i];
214
+ return toString(bufA);
215
+ }
216
+ // Ensure bufLong is the longer buffer
217
+ let bufLong = bufA.length > bufB.length ? bufA : bufB;
218
+ const bufShort = bufA.length > bufB.length ? bufB : bufA;
219
+ bufLong = Buffer.from(bufLong); // avoid mutating original ref
220
+ const offset = bufLong.length - bufShort.length;
221
+ for (let i = offset; i < bufLong.length; i++) {
222
+ bufLong[i] |= bufShort[i - offset];
223
+ }
224
+ return toString(bufLong);
225
+ }
226
+ /** Deep equality check for two IP addresses (supports mixed IPv4/IPv6). */
227
+ export function isEqual(a, b) {
228
+ let bufA = toBuffer(a);
229
+ let bufB = toBuffer(b);
230
+ if (bufA.length === bufB.length) {
231
+ for (let i = 0; i < bufA.length; i++) {
232
+ if (bufA[i] !== bufB[i])
233
+ return false;
234
+ }
235
+ return true;
236
+ }
237
+ // Ensure bufA is IPv4 (shorter)
238
+ if (bufB.length === 4) {
239
+ const tmp = bufB;
240
+ bufB = bufA;
241
+ bufA = tmp;
242
+ }
243
+ for (let i = 0; i < 10; i++) {
244
+ if (bufB[i] !== 0)
245
+ return false;
246
+ }
247
+ const word = bufB.readUInt16BE(10);
248
+ if (word !== 0 && word !== 0xffff)
249
+ return false;
250
+ for (let i = 0; i < 4; i++) {
251
+ if (bufA[i] !== bufB[i + 12])
252
+ return false;
253
+ }
254
+ return true;
255
+ }
256
+ // ─── Address classification ───────────────────────────────────────────────────
257
+ /** Returns true if the address is a loopback address. */
258
+ export function isLoopback(addr) {
259
+ // Plain long integer (no dots or colons) → convert to dotted decimal
260
+ if (!/\./.test(addr) && !/:/.test(addr)) {
261
+ addr = fromLong(Number(addr));
262
+ }
263
+ return (/^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/.test(addr) ||
264
+ /^0177\./.test(addr) ||
265
+ /^0x7f\./i.test(addr) ||
266
+ /^fe80::1$/i.test(addr) ||
267
+ /^::1$/.test(addr) ||
268
+ /^::$/.test(addr));
269
+ }
270
+ /** Returns true if the address is a private (RFC 1918 / ULA) address. */
271
+ export function isPrivate(addr) {
272
+ if (isLoopback(addr))
273
+ return true;
274
+ // For IPv4-only addresses, normalize first
275
+ if (!isV6Format(addr)) {
276
+ const ipl = normalizeToLong(addr);
277
+ if (ipl < 0)
278
+ throw new Error('invalid ipv4 address');
279
+ addr = fromLong(ipl);
280
+ }
281
+ return (/^(::f{4}:)?10\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) ||
282
+ /^(::f{4}:)?192\.168\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) ||
283
+ /^(::f{4}:)?172\.(1[6-9]|2\d|30|31)\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) ||
284
+ /^(::f{4}:)?169\.254\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) ||
285
+ /^f[cd][0-9a-f]{2}:/i.test(addr) ||
286
+ /^fe80:/i.test(addr) ||
287
+ /^::1$/.test(addr) ||
288
+ /^::$/.test(addr));
289
+ }
290
+ /** Returns true if the address is a publicly routable address. */
291
+ export function isPublic(addr) {
292
+ return !isPrivate(addr);
293
+ }
294
+ // ─── Loopback & address resolution ───────────────────────────────────────────
295
+ /** Return the loopback address for the given IP family. */
296
+ export function loopback(family) {
297
+ const fam = normalizeFamily(family);
298
+ if (fam !== 'ipv4' && fam !== 'ipv6') {
299
+ throw new Error('family must be ipv4 or ipv6');
300
+ }
301
+ return fam === 'ipv4' ? '127.0.0.1' : 'fe80::1';
302
+ }
303
+ /**
304
+ * Return a network interface address.
305
+ * - `name`: interface name, `'public'`, `'private'`, or `undefined` (any private)
306
+ * - `family`: `'ipv4'` (default) or `'ipv6'`
307
+ */
308
+ // ─── Long integer conversion ──────────────────────────────────────────────────
309
+ /** Convert a dotted-decimal IPv4 address to a 32-bit unsigned integer. */
310
+ export function toLong(ip) {
311
+ let ipl = 0;
312
+ for (const octet of ip.split('.')) {
313
+ ipl = (ipl << 8) + parseInt(octet, 10);
314
+ }
315
+ return ipl >>> 0;
316
+ }
317
+ /** Convert a 32-bit unsigned integer to a dotted-decimal IPv4 address. */
318
+ export function fromLong(ipl) {
319
+ return [
320
+ (ipl >>> 24) & 255,
321
+ (ipl >>> 16) & 255,
322
+ (ipl >>> 8) & 255,
323
+ ipl & 255,
324
+ ].join('.');
325
+ }
326
+ /**
327
+ * Normalize an IPv4 address (supports decimal, octal, hex, and compact notations)
328
+ * and return it as a 32-bit unsigned long. Returns -1 on error.
329
+ */
330
+ export function normalizeToLong(addr) {
331
+ const parts = addr.split('.').map((part) => {
332
+ if (part.startsWith('0x') || part.startsWith('0X')) {
333
+ const v = parseInt(part, 16);
334
+ return Number.isNaN(v) ? NaN : v;
335
+ }
336
+ if (part.startsWith('0') && part !== '0' && /^[0-7]+$/.test(part)) {
337
+ return parseInt(part, 8);
338
+ }
339
+ if (/^[1-9]\d*$/.test(part) || part === '0') {
340
+ return parseInt(part, 10);
341
+ }
342
+ return NaN;
343
+ });
344
+ if (parts.some(Number.isNaN))
345
+ return -1;
346
+ const n = parts.length;
347
+ let val = 0;
348
+ switch (n) {
349
+ case 1:
350
+ val = parts[0];
351
+ break;
352
+ case 2:
353
+ if (parts[0] > 0xff || parts[1] > 0xffffff)
354
+ return -1;
355
+ val = (parts[0] << 24) | (parts[1] & 0xffffff);
356
+ break;
357
+ case 3:
358
+ if (parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xffff)
359
+ return -1;
360
+ val = (parts[0] << 24) | (parts[1] << 16) | (parts[2] & 0xffff);
361
+ break;
362
+ case 4:
363
+ if (parts.some((p) => p > 0xff))
364
+ return -1;
365
+ val = (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3];
366
+ break;
367
+ default:
368
+ return -1;
369
+ }
370
+ return val >>> 0;
371
+ }
372
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ // Browser entry point — zero Node.js built-in dependencies.
2
+ // Vite/esbuild/webpack use this file instead of index.ts via
3
+ // the "browser" field in package.json, avoiding any import of `os`.
4
+ export { toBuffer, toString, isV4Format, isV6Format, fromPrefixLen, mask, cidr, subnet, cidrSubnet, not, or, isEqual, isLoopback, isPrivate, isPublic, loopback, toLong, fromLong, normalizeToLong, } from './core.js';
5
+ /**
6
+ * Not available in browser environments.
7
+ * Obtain the IP server-side and pass it to the client, or use `loopback()` as a fallback.
8
+ */
9
+ export function address(_name, _family) {
10
+ throw new Error('[node-ip-ts] ip.address() uses the Node.js `os` module and cannot run in a browser. ' +
11
+ 'Use ip.loopback() as a fallback, or pass the IP from the server.');
12
+ }
13
+ //# sourceMappingURL=index.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../../src/index.browser.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,6DAA6D;AAC7D,oEAAoE;AAEpE,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,UAAU,EACV,aAAa,EACb,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,UAAU,EACV,GAAG,EACH,EAAE,EACF,OAAO,EACP,UAAU,EACV,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,eAAe,GAChB,MAAM,WAAW,CAAC;AAInB;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,KAAc,EAAE,OAAyB;IAC/D,MAAM,IAAI,KAAK,CACb,sFAAsF;QACpF,kEAAkE,CACrE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,39 @@
1
+ // Node.js entry point.
2
+ // Exports all pure functions from core.ts plus address() which uses the `os` module.
3
+ // Browser bundlers (Vite/esbuild/webpack) are redirected to index.browser.ts
4
+ // via the "browser" field in package.json, which never imports `os`.
5
+ import { networkInterfaces as _getNetworkInterfaces } from 'os';
6
+ import { normalizeFamily, isLoopback, isPublic, isPrivate, loopback, } from './core.js';
7
+ export { toBuffer, toString, isV4Format, isV6Format, fromPrefixLen, mask, cidr, subnet, cidrSubnet, not, or, isEqual, isLoopback, isPrivate, isPublic, loopback, toLong, fromLong, normalizeToLong, } from './core.js';
8
+ /**
9
+ * Return a network interface address.
10
+ * - `name`: interface name, `'public'`, `'private'`, or `undefined` (any private)
11
+ * - `family`: `'ipv4'` (default) or `'ipv6'`
12
+ */
13
+ export function address(name, family) {
14
+ const ifaces = _getNetworkInterfaces();
15
+ const fam = normalizeFamily(family);
16
+ if (name && name !== 'private' && name !== 'public') {
17
+ const iface = ifaces[name];
18
+ if (!iface)
19
+ return loopback(fam);
20
+ const match = iface.filter((d) => normalizeFamily(d.family) === fam);
21
+ return match.length ? match[0].address : loopback(fam);
22
+ }
23
+ const all = Object.values(ifaces)
24
+ .flat()
25
+ .filter((d) => {
26
+ if (!d)
27
+ return false;
28
+ if (normalizeFamily(d.family) !== fam)
29
+ return false;
30
+ if (isLoopback(d.address))
31
+ return false;
32
+ if (!name)
33
+ return true;
34
+ return name === 'public' ? isPublic(d.address) : isPrivate(d.address);
35
+ })
36
+ .map((d) => d.address);
37
+ return all.length ? all[0] : loopback(fam);
38
+ }
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,qFAAqF;AACrF,6EAA6E;AAC7E,qEAAqE;AACrE,OAAO,EAAE,iBAAiB,IAAI,qBAAqB,EAAE,MAAM,IAAI,CAAC;AAEhE,OAAO,EACL,eAAe,EACf,UAAU,EACV,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,UAAU,EACV,aAAa,EACb,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,UAAU,EACV,GAAG,EACH,EAAE,EACF,OAAO,EACP,UAAU,EACV,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,eAAe,GAChB,MAAM,WAAW,CAAC;AAInB;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,IAAa,EAAE,MAAwB;IAC7D,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEpC,IAAI,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QACrE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;SAC9B,IAAI,EAAE;SACN,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE;QACxC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACrB,IAAI,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QACpD,IAAI,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEzB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,73 @@
1
+ export type IPFamily = 'ipv4' | 'ipv6';
2
+ export interface SubnetInfo {
3
+ networkAddress: string;
4
+ firstAddress: string;
5
+ lastAddress: string;
6
+ broadcastAddress: string;
7
+ subnetMask: string;
8
+ subnetMaskLength: number;
9
+ numHosts: number;
10
+ length: number;
11
+ contains(other: string): boolean;
12
+ }
13
+ export declare function normalizeFamily(family?: number | string): IPFamily;
14
+ /**
15
+ * Convert an IP address string to a Buffer.
16
+ * Optionally write into an existing buffer at a given offset.
17
+ */
18
+ export declare function toBuffer(ip: string, buff?: Buffer, offset?: number): Buffer;
19
+ /**
20
+ * Convert a Buffer back to an IP address string.
21
+ */
22
+ export declare function toString(buff: Buffer, offset?: number, length?: number): string;
23
+ export declare function isV4Format(ip: string): boolean;
24
+ export declare function isV6Format(ip: string): boolean;
25
+ /**
26
+ * Create a subnet mask from a prefix length.
27
+ */
28
+ export declare function fromPrefixLen(prefixlen: number, family?: number | string): string;
29
+ /**
30
+ * Apply a subnet mask to an address.
31
+ */
32
+ export declare function mask(addr: string, maskStr: string): string;
33
+ /**
34
+ * Return the network address for a CIDR string (e.g. "192.168.1.1/24").
35
+ */
36
+ export declare function cidr(cidrString: string): string;
37
+ /**
38
+ * Compute full subnet information from address + mask.
39
+ */
40
+ export declare function subnet(addr: string, subnetMask: string): SubnetInfo;
41
+ /**
42
+ * Compute full subnet information from a CIDR string.
43
+ */
44
+ export declare function cidrSubnet(cidrString: string): SubnetInfo;
45
+ /** Bitwise NOT of an IP address. */
46
+ export declare function not(addr: string): string;
47
+ /** Bitwise OR of two IP addresses (supports mixed protocol). */
48
+ export declare function or(a: string, b: string): string;
49
+ /** Deep equality check for two IP addresses (supports mixed IPv4/IPv6). */
50
+ export declare function isEqual(a: string, b: string): boolean;
51
+ /** Returns true if the address is a loopback address. */
52
+ export declare function isLoopback(addr: string): boolean;
53
+ /** Returns true if the address is a private (RFC 1918 / ULA) address. */
54
+ export declare function isPrivate(addr: string): boolean;
55
+ /** Returns true if the address is a publicly routable address. */
56
+ export declare function isPublic(addr: string): boolean;
57
+ /** Return the loopback address for the given IP family. */
58
+ export declare function loopback(family?: number | string): string;
59
+ /**
60
+ * Return a network interface address.
61
+ * - `name`: interface name, `'public'`, `'private'`, or `undefined` (any private)
62
+ * - `family`: `'ipv4'` (default) or `'ipv6'`
63
+ */
64
+ /** Convert a dotted-decimal IPv4 address to a 32-bit unsigned integer. */
65
+ export declare function toLong(ip: string): number;
66
+ /** Convert a 32-bit unsigned integer to a dotted-decimal IPv4 address. */
67
+ export declare function fromLong(ipl: number): string;
68
+ /**
69
+ * Normalize an IPv4 address (supports decimal, octal, hex, and compact notations)
70
+ * and return it as a 32-bit unsigned long. Returns -1 on error.
71
+ */
72
+ export declare function normalizeToLong(addr: string): number;
73
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvC,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAClC;AAID,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAIlE;AAID;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAiD3E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAqB1E;AAQD,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE9C;AAID;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAajF;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAyB1D;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,CAsCnE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAIzD;AAID,oCAAoC;AACpC,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIxC;AAED,gEAAgE;AAChE,wBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAoB/C;AAED,2EAA2E;AAC3E,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CA8BrD;AAID,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAchD;AAED,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAoB/C;AAED,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9C;AAKD,2DAA2D;AAC3D,wBAAgB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAMzD;AAED;;;;GAIG;AAIH,0EAA0E;AAC1E,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMzC;AAED,0EAA0E;AAC1E,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO5C;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyCpD"}
@@ -0,0 +1,8 @@
1
+ export { toBuffer, toString, isV4Format, isV6Format, fromPrefixLen, mask, cidr, subnet, cidrSubnet, not, or, isEqual, isLoopback, isPrivate, isPublic, loopback, toLong, fromLong, normalizeToLong, } from './core.js';
2
+ export type { IPFamily, SubnetInfo } from './core.js';
3
+ /**
4
+ * Not available in browser environments.
5
+ * Obtain the IP server-side and pass it to the client, or use `loopback()` as a fallback.
6
+ */
7
+ export declare function address(_name?: string, _family?: number | string): string;
8
+ //# sourceMappingURL=index.browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../../src/index.browser.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,UAAU,EACV,aAAa,EACb,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,UAAU,EACV,GAAG,EACH,EAAE,EACF,OAAO,EACP,UAAU,EACV,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,eAAe,GAChB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEtD;;;GAGG;AACH,wBAAgB,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAKzE"}
@@ -0,0 +1,9 @@
1
+ export { toBuffer, toString, isV4Format, isV6Format, fromPrefixLen, mask, cidr, subnet, cidrSubnet, not, or, isEqual, isLoopback, isPrivate, isPublic, loopback, toLong, fromLong, normalizeToLong, } from './core.js';
2
+ export type { IPFamily, SubnetInfo } from './core.js';
3
+ /**
4
+ * Return a network interface address.
5
+ * - `name`: interface name, `'public'`, `'private'`, or `undefined` (any private)
6
+ * - `family`: `'ipv4'` (default) or `'ipv6'`
7
+ */
8
+ export declare function address(name?: string, family?: number | string): string;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,UAAU,EACV,aAAa,EACb,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,UAAU,EACV,GAAG,EACH,EAAE,EACF,OAAO,EACP,UAAU,EACV,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,eAAe,GAChB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAuBvE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-ip-ts",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "author": "Deni Irawan Nugraha <deni.irawan40563@gmail.com>",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/denycode-dev/node-ip-ts",
@@ -10,31 +10,48 @@
10
10
  "directory": "packages/node-ip-ts"
11
11
  },
12
12
  "keywords": [
13
- "ip",
14
13
  "ip address",
15
14
  "ip address library",
16
15
  "ip address parser",
17
16
  "ip address validator",
18
17
  "ip address converter",
19
18
  "ip address to buffer",
20
- "buffer to ip address"
19
+ "buffer to ip address",
20
+ "ip",
21
+ "address",
22
+ "ipv4",
23
+ "ipv6",
24
+ "subnet",
25
+ "cidr",
26
+ "network",
27
+ "typescript"
28
+ ],
29
+ "files": [
30
+ "dist",
31
+ "README.md",
32
+ "LICENSE"
21
33
  ],
22
- "description": "Modern TypeScript IP address library",
34
+ "sideEffects": false,
35
+ "description": "Modern TypeScript IP address utility library — ESM, CJS, and browser ready",
23
36
  "type": "module",
24
37
  "main": "./dist/cjs/index.js",
25
38
  "module": "./dist/esm/index.js",
39
+ "browser": "./dist/esm/index.browser.js",
26
40
  "types": "./dist/types/index.d.ts",
27
41
  "exports": {
28
42
  ".": {
43
+ "types": "./dist/types/index.d.ts",
44
+ "browser": "./dist/esm/index.browser.js",
29
45
  "import": "./dist/esm/index.js",
30
46
  "require": "./dist/cjs/index.js",
31
- "types": "./dist/types/index.d.ts"
47
+ "default": "./dist/esm/index.js"
32
48
  }
33
49
  },
34
50
  "scripts": {
35
51
  "build": "tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json && tsc -p tsconfig.types.json",
36
52
  "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
37
- "test:watch": "node --experimental-vm-modules node_modules/jest/bin/jest.js --watch"
53
+ "test:watch": "node --experimental-vm-modules node_modules/jest/bin/jest.js --watch",
54
+ "prepublishOnly": "npm run build && npm test"
38
55
  },
39
56
  "devDependencies": {
40
57
  "@types/jest": "^29.5.12",
package/jest.config.js DELETED
@@ -1,22 +0,0 @@
1
- /** @type {import('jest').Config} */
2
- export default {
3
- preset: 'ts-jest/presets/default-esm',
4
- extensionsToTreatAsEsm: ['.ts'],
5
- testEnvironment: 'node',
6
- moduleNameMapper: {
7
- '^(\\.{1,2}/.*)\\.js$': '$1',
8
- },
9
- transform: {
10
- '^.+\\.tsx?$': [
11
- 'ts-jest',
12
- {
13
- useESM: true,
14
- tsconfig: {
15
- module: 'ES2020',
16
- moduleResolution: 'bundler',
17
- },
18
- },
19
- ],
20
- },
21
- testMatch: ['**/*.test.ts'],
22
- };