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.
- package/dist/index.js +56 -54
- 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
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
parsed.
|
|
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
|
-
|
|
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 =
|
|
163
|
-
const
|
|
164
|
-
|
|
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:
|
|
179
|
+
const maps = { 4: /* @__PURE__ */ new Map(), 6: /* @__PURE__ */ new Map() };
|
|
169
180
|
for (const { start, end, version } of nets) {
|
|
170
|
-
|
|
171
|
-
if (!
|
|
172
|
-
|
|
173
|
-
|
|
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 =
|
|
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
|
|
189
|
-
if (start === null && marker.start) start =
|
|
190
|
-
if (marker.end) end =
|
|
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 &&
|
|
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(
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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
|
|
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
|
|
259
|
-
const
|
|
260
|
-
|
|
261
|
-
|
|
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
|
|
278
|
-
const
|
|
279
|
-
|
|
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.
|
|
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.
|
|
20
|
+
"ip-bigint": "^8.2.4"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
23
|
+
"@typescript/native-preview": "7.0.0-dev.20260202.1",
|
|
24
24
|
"eslint": "9.39.2",
|
|
25
|
-
"eslint-config-silverwind": "
|
|
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
|
|
29
|
-
"versions": "14.0
|
|
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
|
+
}
|