cidr-tools 11.0.5 → 11.0.8

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.
Files changed (2) hide show
  1. package/dist/index.js +56 -54
  2. package/package.json +8 -7
package/dist/index.js CHANGED
@@ -57,11 +57,10 @@ function parseCidr(str) {
57
57
  parsed.prefix = prefix;
58
58
  parsed.prefixPresent = Boolean(cidrVer);
59
59
  const numBits = bits[version];
60
- const ipBits = number.toString(2).padStart(numBits, "0");
61
- const prefixLen = Number(numBits - Number(prefix));
62
- const startBits = ipBits.substring(0, numBits - prefixLen);
63
- parsed.start = BigInt(`0b${startBits}${"0".repeat(prefixLen)}`);
64
- parsed.end = BigInt(`0b${startBits}${"1".repeat(prefixLen)}`);
60
+ const hostBits = BigInt(numBits - Number(prefix));
61
+ const mask = hostBits > 0n ? (1n << hostBits) - 1n : 0n;
62
+ parsed.start = number & ~mask;
63
+ parsed.end = number | mask;
65
64
  return parsed;
66
65
  }
67
66
  function doNetsOverlap(a, b) {
@@ -107,7 +106,13 @@ function excludeNets(a, b, v) {
107
106
  }
108
107
  function biggestPowerOfTwo(num) {
109
108
  if (num === 0n) return 0n;
110
- return 2n ** BigInt(String(num.toString(2).length - 1));
109
+ let b = 0n;
110
+ let n = num >> 1n;
111
+ while (n > 0n) {
112
+ b++;
113
+ n >>= 1n;
114
+ }
115
+ return 1n << b;
111
116
  }
112
117
  function subparts(part) {
113
118
  if (part.end < part.start) {
@@ -159,40 +164,50 @@ function diff(a, b) {
159
164
  return a + 1n - b;
160
165
  }
161
166
  function formatPart(part, version) {
162
- const ip = normalizeCidr(stringifyIp({ number: BigInt(part.start.toString()), version }));
163
- const zeroes = diff(part.end, part.start).toString(2);
164
- const prefix = bits[version] - (zeroes.match(/0/g) || []).length;
167
+ const ip = normalizeIp(stringifyIp({ number: part.start, version }));
168
+ const size = diff(part.end, part.start);
169
+ let hostBits = 0;
170
+ let s = size >> 1n;
171
+ while (s > 0n) {
172
+ s >>= 1n;
173
+ hostBits++;
174
+ }
175
+ const prefix = bits[version] - hostBits;
165
176
  return `${ip}/${prefix}`;
166
177
  }
167
178
  function mapNets(nets) {
168
- const maps = { 4: {}, 6: {} };
179
+ const maps = { 4: /* @__PURE__ */ new Map(), 6: /* @__PURE__ */ new Map() };
169
180
  for (const { start, end, version } of nets) {
170
- if (!maps[version][String(start)]) maps[version][String(start)] = { start: 0, end: 0 };
171
- if (!maps[version][String(end)]) maps[version][String(end)] = { start: 0, end: 0 };
172
- maps[version][String(start)].start += 1;
173
- maps[version][String(end)].end += 1;
181
+ let startEntry = maps[version].get(start);
182
+ if (!startEntry) {
183
+ startEntry = { start: 0, end: 0 };
184
+ maps[version].set(start, startEntry);
185
+ }
186
+ let endEntry = maps[version].get(end);
187
+ if (!endEntry) {
188
+ endEntry = { start: 0, end: 0 };
189
+ maps[version].set(end, endEntry);
190
+ }
191
+ startEntry.start += 1;
192
+ endEntry.end += 1;
174
193
  }
175
194
  return maps;
176
195
  }
177
196
  function doMerge(maps) {
178
197
  let start = null;
179
198
  let end = null;
180
- const numbers = Object.keys(maps).sort((a, b) => {
181
- const aBig = BigInt(a);
182
- const bBig = BigInt(b);
183
- return aBig > bBig ? 1 : aBig < bBig ? -1 : 0;
184
- });
199
+ const numbers = Array.from(maps.keys()).sort((a, b) => a > b ? 1 : a < b ? -1 : 0);
185
200
  let depth = 0;
186
201
  const merged = [];
187
202
  for (const [index2, number] of numbers.entries()) {
188
- const marker = maps[String(number)];
189
- if (start === null && marker.start) start = BigInt(number);
190
- if (marker.end) end = BigInt(number);
203
+ const marker = maps.get(number);
204
+ if (start === null && marker.start) start = number;
205
+ if (marker.end) end = number;
191
206
  if (start === null) continue;
192
207
  if (marker.start) depth += marker.start;
193
208
  if (marker.end) depth -= marker.end;
194
209
  const next = numbers[index2 + 1];
195
- if (marker.end && depth === 0 && next && BigInt(next) - BigInt(number) > 1) {
210
+ if (marker.end && depth === 0 && next !== void 0 && next - number > 1n) {
196
211
  for (const sub of subparts({ start, end })) {
197
212
  merged.push(sub);
198
213
  }
@@ -207,7 +222,7 @@ function doMerge(maps) {
207
222
  return merged;
208
223
  }
209
224
  function mergeCidr(nets) {
210
- const arr = uniq((Array.isArray(nets) ? nets : [nets]).map(parseCidr));
225
+ const arr = uniq(Array.isArray(nets) ? nets : [nets]).map(parseCidr);
211
226
  const maps = mapNets(arr);
212
227
  const merged = { 4: [], 6: [] };
213
228
  for (const v of [4, 6]) {
@@ -230,15 +245,12 @@ function excludeCidr(base, excl) {
230
245
  }
231
246
  for (const v of [4, 6]) {
232
247
  for (const exclcidr of excls[v]) {
233
- for (const [index2, basecidr] of bases[v].entries()) {
234
- const base2 = parseCidr(basecidr);
235
- const excl2 = parseCidr(exclcidr);
236
- const remainders = excludeNets(base2, excl2, v);
237
- if (base2.cidr !== remainders.toString()) {
238
- bases[v] = bases[v].concat(remainders);
239
- bases[v].splice(index2, 1);
240
- }
248
+ const excl2 = parseCidr(exclcidr);
249
+ const newBases = [];
250
+ for (const basecidr of bases[v]) {
251
+ newBases.push(...excludeNets(parseCidr(basecidr), excl2, v));
241
252
  }
253
+ bases[v] = newBases;
242
254
  }
243
255
  }
244
256
  return bases[4].concat(bases[6]).sort(compare);
@@ -248,39 +260,29 @@ function* expandCidr(nets) {
248
260
  for (const net of mergeCidr(arr)) {
249
261
  const { start, end, version } = parseCidr(net);
250
262
  for (let number = start; number <= end; number++) {
251
- yield normalizeCidr(stringifyIp({ number, version }));
263
+ yield normalizeIp(stringifyIp({ number, version }));
252
264
  }
253
265
  }
254
266
  }
255
267
  function overlapCidr(a, b) {
256
- const aNets = uniq(Array.isArray(a) ? a : [a]);
257
- const bNets = uniq(Array.isArray(b) ? b : [b]);
258
- for (const a2 of aNets) {
259
- const aParsed = parseCidr(a2);
260
- for (const b2 of bNets) {
261
- const bParsed = parseCidr(b2);
262
- if (aParsed.version !== bParsed.version) {
263
- continue;
264
- }
265
- if (doNetsOverlap(aParsed, bParsed)) {
266
- return true;
267
- }
268
+ const aNets = uniq(Array.isArray(a) ? a : [a]).map(parseCidr);
269
+ const bNets = uniq(Array.isArray(b) ? b : [b]).map(parseCidr);
270
+ for (const aParsed of aNets) {
271
+ for (const bParsed of bNets) {
272
+ if (aParsed.version !== bParsed.version) continue;
273
+ if (doNetsOverlap(aParsed, bParsed)) return true;
268
274
  }
269
275
  }
270
276
  return false;
271
277
  }
272
278
  function containsCidr(a, b) {
273
- const aNets = uniq(Array.isArray(a) ? a : [a]);
274
- const bNets = uniq(Array.isArray(b) ? b : [b]);
279
+ const aNets = uniq(Array.isArray(a) ? a : [a]).map(parseCidr);
280
+ const bNets = uniq(Array.isArray(b) ? b : [b]).map(parseCidr);
275
281
  const numExpected = bNets.length;
276
282
  let numFound = 0;
277
- for (const a2 of aNets) {
278
- const aParsed = parseCidr(a2);
279
- for (const b2 of bNets) {
280
- const bParsed = parseCidr(b2);
281
- if (aParsed.version !== bParsed.version) {
282
- continue;
283
- }
283
+ for (const aParsed of aNets) {
284
+ for (const bParsed of bNets) {
285
+ if (aParsed.version !== bParsed.version) continue;
284
286
  if (netContains(aParsed, bParsed)) {
285
287
  numFound++;
286
288
  continue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cidr-tools",
3
- "version": "11.0.5",
3
+ "version": "11.0.8",
4
4
  "author": "silverwind <me@silverwind.io>",
5
5
  "description": "Tools to work with IPv4 and IPv6 CIDR",
6
6
  "repository": "silverwind/cidr-tools",
@@ -17,19 +17,20 @@
17
17
  "node": ">=18"
18
18
  },
19
19
  "dependencies": {
20
- "ip-bigint": "^8.2.3"
20
+ "ip-bigint": "^8.2.4"
21
21
  },
22
22
  "devDependencies": {
23
- "@typescript/native-preview": "7.0.0-dev.20260128.1",
23
+ "@typescript/native-preview": "7.0.0-dev.20260202.1",
24
24
  "eslint": "9.39.2",
25
- "eslint-config-silverwind": "118.0.1",
25
+ "eslint-config-silverwind": "120.1.2",
26
+ "jest-extended": "7.0.0",
26
27
  "typescript": "5.9.3",
27
28
  "typescript-config-silverwind": "14.0.0",
28
- "updates": "17.0.9",
29
- "versions": "14.0.3",
29
+ "updates": "17.1.0",
30
+ "versions": "14.1.0",
30
31
  "vite": "7.3.1",
31
32
  "vite-config-silverwind": "6.0.9",
32
33
  "vitest": "4.0.18",
33
34
  "vitest-config-silverwind": "10.6.1"
34
35
  }
35
- }
36
+ }