cidr-tools 12.0.1 → 12.0.2

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.d.ts CHANGED
@@ -23,6 +23,7 @@ declare function parseCidr(str: Network): ParsedCidr;
23
23
  declare function mergeCidr(nets: Networks): Array<Network>;
24
24
  /** Returns an array of merged remaining networks of the subtraction of `excludeNetworks` from `baseNetworks`. */
25
25
  declare function excludeCidr(base: Networks, excl: Networks): Array<Network>;
26
+ /** Returns a generator for individual IPs contained in the networks. */
26
27
  declare function expandCidr(nets: Networks): Generator<Network>;
27
28
  /** Returns a boolean that indicates if `networksA` overlap (intersect) with `networksB`. */
28
29
  declare function overlapCidr(a: Networks, b: Networks): boolean;
package/dist/index.js CHANGED
@@ -93,8 +93,7 @@ function doNormalize(cidr, opts) {
93
93
  }
94
94
  /** Returns a string or array (depending on input) with a normalized representation. Will not include a prefix on single IPs. Will set network address to the start of the network. */
95
95
  function normalizeCidr(cidr, opts) {
96
- if (Array.isArray(cidr)) return cidr.map((entry) => normalizeCidr(entry, opts));
97
- else return doNormalize(cidr, opts);
96
+ return Array.isArray(cidr) ? cidr.map((entry) => doNormalize(entry, opts)) : doNormalize(cidr, opts);
98
97
  }
99
98
  /** Returns a `parsed` Object which is used internally by this module. It can be used to test whether the passed network is IPv4 or IPv6 or to work with the BigInts directly. */
100
99
  function parseCidr(str) {
@@ -207,108 +206,37 @@ function biggestPowerOfTwo4(num) {
207
206
  return 1 << 31 - Math.clz32(num) >>> 0;
208
207
  }
209
208
  function subparts4(pStart, pEnd, output) {
210
- if (pEnd < pStart) return;
211
- if (pEnd === pStart) {
209
+ let start = pStart;
210
+ while (start <= pEnd) {
211
+ const size = pEnd - start + 1;
212
+ const lowBit = (start & -start) >>> 0;
213
+ const blockSize = lowBit !== 0 && lowBit <= size ? lowBit : biggestPowerOfTwo4(size);
212
214
  output.push({
213
- start: pStart,
214
- end: pEnd
215
- });
216
- return;
217
- }
218
- if (pEnd - pStart === 1) {
219
- if (pEnd % 2 === 0) output.push({
220
- start: pStart,
221
- end: pStart
222
- }, {
223
- start: pEnd,
224
- end: pEnd
225
- });
226
- else output.push({
227
- start: pStart,
228
- end: pEnd
215
+ start,
216
+ end: start + blockSize - 1
229
217
  });
230
- return;
218
+ start += blockSize;
231
219
  }
232
- const size = pEnd - pStart + 1;
233
- if ((size & size - 1) === 0 && pStart % size === 0) {
234
- output.push({
235
- start: pStart,
236
- end: pEnd
237
- });
238
- return;
239
- }
240
- let biggest = biggestPowerOfTwo4(size);
241
- let start;
242
- if (pStart % biggest === 0) start = pStart;
243
- else {
244
- start = Math.floor(pEnd / biggest) * biggest;
245
- if (start + biggest - 1 > pEnd) {
246
- start -= biggest;
247
- while (start < pStart) {
248
- biggest /= 2;
249
- start = (Math.floor(pEnd / biggest) - 1) * biggest;
250
- }
251
- }
252
- }
253
- const end = start + biggest - 1;
254
- if (start !== pStart) subparts4(pStart, start - 1, output);
255
- output.push({
256
- start,
257
- end
258
- });
259
- if (end !== pEnd) subparts4(end + 1, pEnd, output);
260
220
  }
261
221
  function subparts6(pStart, pEnd, output) {
262
- if (pEnd < pStart) return;
263
- if (pEnd === pStart) {
264
- output.push({
265
- start: pStart,
266
- end: pEnd
267
- });
268
- return;
269
- }
270
- if (pEnd - pStart === 1n) {
271
- if (pEnd % 2n === 0n) output.push({
272
- start: pStart,
273
- end: pStart
274
- }, {
275
- start: pEnd,
276
- end: pEnd
277
- });
278
- else output.push({
279
- start: pStart,
280
- end: pEnd
281
- });
282
- return;
283
- }
284
- const size = pEnd - pStart + 1n;
285
- if ((size & size - 1n) === 0n && (pStart & size - 1n) === 0n) {
222
+ let start = pStart;
223
+ while (start <= pEnd) {
224
+ const size = pEnd - start + 1n;
225
+ const lowBit = start & -start;
226
+ if ((size & size - 1n) === 0n && (lowBit === 0n || lowBit >= size)) {
227
+ output.push({
228
+ start,
229
+ end: pEnd
230
+ });
231
+ return;
232
+ }
233
+ const blockSize = lowBit !== 0n && lowBit <= size ? lowBit : biggestPowerOfTwo(size);
286
234
  output.push({
287
- start: pStart,
288
- end: pEnd
235
+ start,
236
+ end: start + blockSize - 1n
289
237
  });
290
- return;
291
- }
292
- let biggest = biggestPowerOfTwo(size);
293
- let start;
294
- if ((pStart & biggest - 1n) === 0n) start = pStart;
295
- else {
296
- start = pEnd & -biggest;
297
- if (start + biggest - 1n > pEnd) {
298
- start -= biggest;
299
- while (start < pStart) {
300
- biggest >>= 1n;
301
- start = (pEnd & -biggest) - biggest;
302
- }
303
- }
238
+ start += blockSize;
304
239
  }
305
- const end = start + biggest - 1n;
306
- if (start !== pStart) subparts6(pStart, start - 1n, output);
307
- output.push({
308
- start,
309
- end
310
- });
311
- if (end !== pEnd) subparts6(end + 1n, pEnd, output);
312
240
  }
313
241
  function formatPart4(part) {
314
242
  return formatIPv4Fast(part.start) + prefixStrings[Math.clz32(part.end - part.start)];
@@ -475,6 +403,7 @@ function excludeCidr(base, excl) {
475
403
  }
476
404
  return result;
477
405
  }
406
+ /** Returns a generator for individual IPs contained in the networks. */
478
407
  function* expandCidr(nets) {
479
408
  const arr = Array.isArray(nets) ? nets : [nets];
480
409
  const v4 = [];
@@ -487,13 +416,13 @@ function* expandCidr(nets) {
487
416
  if (v4.length > 0) for (const part of mergeIntervalsRaw4(v4)) {
488
417
  let prevHigh = -1;
489
418
  let prefix = "";
490
- for (let n = part.start; n <= part.end; n++) {
491
- const high = n >>> 8;
419
+ for (let num = part.start; num <= part.end; num++) {
420
+ const high = num >>> 8;
492
421
  if (high !== prevHigh) {
493
- prefix = octetDotStrings[n >>> 24 & 255] + octetDotStrings[n >>> 16 & 255] + octetDotStrings[n >>> 8 & 255];
422
+ prefix = octetDotStrings[num >>> 24 & 255] + octetDotStrings[num >>> 16 & 255] + octetDotStrings[num >>> 8 & 255];
494
423
  prevHigh = high;
495
424
  }
496
- yield prefix + octetStrings[n & 255];
425
+ yield prefix + octetStrings[num & 255];
497
426
  }
498
427
  }
499
428
  if (v6.length > 0) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cidr-tools",
3
- "version": "12.0.1",
3
+ "version": "12.0.2",
4
4
  "author": "silverwind <me@silverwind.io>",
5
5
  "description": "Tools to work with IPv4 and IPv6 CIDR",
6
6
  "keywords": [
@@ -26,23 +26,23 @@
26
26
  "bun": "*"
27
27
  },
28
28
  "dependencies": {
29
- "ip-bigint": "^9.0.3"
29
+ "ip-bigint": "^9.0.5"
30
30
  },
31
31
  "devDependencies": {
32
- "@types/node": "25.8.0",
33
- "@typescript/native-preview": "7.0.0-dev.20260516.1",
34
- "@vitest/coverage-v8": "4.1.6",
32
+ "@types/node": "25.9.1",
33
+ "@typescript/native-preview": "7.0.0-dev.20260527.2",
34
+ "@vitest/coverage-v8": "4.1.7",
35
35
  "eslint": "10.4.0",
36
- "eslint-config-silverwind": "133.0.3",
36
+ "eslint-config-silverwind": "133.0.5",
37
37
  "jest-extended": "7.0.0",
38
- "tsdown": "0.22.0",
39
- "tsdown-config-silverwind": "3.0.1",
38
+ "tsdown": "0.22.1",
39
+ "tsdown-config-silverwind": "3.0.2",
40
40
  "typescript": "6.0.3",
41
41
  "typescript-config-silverwind": "18.0.0",
42
- "updates": "17.16.12",
42
+ "updates": "17.17.3",
43
43
  "updates-config-silverwind": "3.0.2",
44
- "versions": "15.0.4",
45
- "vitest": "4.1.6",
44
+ "versions": "15.1.0",
45
+ "vitest": "4.1.7",
46
46
  "vitest-config-silverwind": "11.3.5"
47
47
  }
48
48
  }