xovris 0.1.0 → 0.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.
@@ -1,4 +1,4 @@
1
- import { createRequire } from "node:module";
1
+ import { builtinModules, createRequire } from "node:module";
2
2
  import { tmpdir } from "node:os";
3
3
  import { basename, dirname, extname, isAbsolute, join, relative, resolve, sep } from "node:path";
4
4
  import { cpSync, existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, realpathSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from "node:fs";
@@ -263,7 +263,7 @@ function sideTexts(f) {
263
263
 
264
264
  //#endregion
265
265
  //#region ../review/src/rules.ts
266
- const JS$4 = /\.(?:m?[jt]sx?|c[jt]s)$/;
266
+ const JS$5 = /\.(?:m?[jt]sx?|c[jt]s)$/;
267
267
  /** A for loop from 0 while its index is at most a list's length: its index and the list. */
268
268
  const LOOP_PAST_END = /\bfor\s*\(\s*(?:let|var)?\s*([A-Za-z_$][\w$]*)\s*=\s*0\s*;\s*\1\s*<=\s*([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)\.length\s*;/;
269
269
  const TS = /\.(?:m?tsx?|cts)$/;
@@ -507,7 +507,7 @@ const RULES = [
507
507
  severity: "major",
508
508
  category: "security",
509
509
  aliases: ["math.random", "insecure random"],
510
- files: JS$4,
510
+ files: JS$5,
511
511
  match: (l) => /Math\.random\(\)/.test(l) && /(token|secret|password|passwd|nonce|otp|salt|session|apikey|api_key|reset)/i.test(l),
512
512
  why: "Math.random is predictable; a token made from it can be guessed.",
513
513
  suggestion: "Use crypto.randomUUID() or crypto.getRandomValues / randomBytes."
@@ -560,7 +560,7 @@ const RULES = [
560
560
  severity: "minor",
561
561
  category: "stability",
562
562
  aliases: ["debugger"],
563
- files: JS$4,
563
+ files: JS$5,
564
564
  match: (l) => /^\s*debugger\s*;?\s*$/.test(l),
565
565
  fix: () => null,
566
566
  why: "It pauses the app wherever developer tools are open.",
@@ -572,7 +572,7 @@ const RULES = [
572
572
  severity: "major",
573
573
  category: "stability",
574
574
  aliases: ["empty catch", "swallowed error"],
575
- files: JS$4,
575
+ files: JS$5,
576
576
  match: (l) => /\bcatch\s*(\([^)]*\))?\s*\{\s*\}/.test(l) || /\.catch\(\s*\(\s*\w*\s*\)\s*=>\s*\{\s*\}\s*\)/.test(l),
577
577
  why: "A failure here disappears without a trace; the next error happens somewhere it is harder to explain.",
578
578
  suggestion: "Handle it, report it, or let it reach the caller."
@@ -607,7 +607,7 @@ const RULES = [
607
607
  severity: "minor",
608
608
  category: "stability",
609
609
  aliases: ["process.exit"],
610
- files: JS$4,
610
+ files: JS$5,
611
611
  match: (l) => /\bprocess\.exit\s*\(/.test(l),
612
612
  why: "Ending the process from inside a module skips cleanup and kills unrelated work.",
613
613
  suggestion: "Throw or return an error and let the entry point decide to exit."
@@ -629,7 +629,7 @@ const RULES = [
629
629
  "==",
630
630
  "double equals"
631
631
  ],
632
- files: JS$4,
632
+ files: JS$5,
633
633
  match: (l) => looseOp(l) !== null,
634
634
  fix: (l) => {
635
635
  const o = looseOp(l);
@@ -644,7 +644,7 @@ const RULES = [
644
644
  severity: "minor",
645
645
  category: "correctness",
646
646
  aliases: ["parseint", "radix"],
647
- files: JS$4,
647
+ files: JS$5,
648
648
  match: (l) => /\bparseInt\(\s*[^,()]+\)/.test(l),
649
649
  fix: (l) => l.replace(/\bparseInt\(\s*([^,()]+?)\s*\)/, "parseInt($1, 10)"),
650
650
  why: "Without a base, text such as \"0x1A\" is read in another base.",
@@ -656,7 +656,7 @@ const RULES = [
656
656
  severity: "major",
657
657
  category: "correctness",
658
658
  aliases: ["typeof undefined"],
659
- files: JS$4,
659
+ files: JS$5,
660
660
  match: (l) => /typeof\s+[\w.$[\]]+\s*[!=]==?\s*undefined\b/.test(l),
661
661
  fix: (l) => l.replace(/(typeof\s+[\w.$[\]]+\s*[!=]==?\s*)undefined\b/, "$1'undefined'"),
662
662
  why: "typeof always gives a string, so comparing it with undefined is never true.",
@@ -668,7 +668,7 @@ const RULES = [
668
668
  severity: "major",
669
669
  category: "correctness",
670
670
  aliases: ["nan"],
671
- files: JS$4,
671
+ files: JS$5,
672
672
  match: (l) => /[\w.$\])]\s*[!=]==?\s*NaN\b|\bNaN\s*[!=]==?\s*[\w.$]/.test(l),
673
673
  fix: (l) => {
674
674
  const m = /([\w.$[\]]+)\s*(===?|!==?)\s*NaN\b/.exec(l) ?? /\bNaN\s*(===?|!==?)\s*([\w.$[\]]+)/.exec(l);
@@ -685,7 +685,7 @@ const RULES = [
685
685
  severity: "major",
686
686
  category: "correctness",
687
687
  aliases: ["off by one", "last index"],
688
- files: JS$4,
688
+ files: JS$5,
689
689
  match: (l) => /([\w.$]+)\[\1\.length\]/.test(l),
690
690
  fix: (l) => l.replace(/([\w.$]+)\[\1\.length\]/, "$1[$1.length - 1]"),
691
691
  why: "xs[xs.length] is always undefined; the last item is at length - 1.",
@@ -701,7 +701,7 @@ const RULES = [
701
701
  "loop bound",
702
702
  "last index"
703
703
  ],
704
- files: JS$4,
704
+ files: JS$5,
705
705
  match: (l, c) => {
706
706
  const m = LOOP_PAST_END.exec(l);
707
707
  if (!m) return false;
@@ -718,7 +718,7 @@ const RULES = [
718
718
  severity: "major",
719
719
  category: "correctness",
720
720
  aliases: ["assignment in condition"],
721
- files: JS$4,
721
+ files: JS$5,
722
722
  match: (l) => /\b(if|while)\s*\(\s*[\w.$[\]]+\s=(?!=)\s*[^=]/.test(l),
723
723
  why: "The condition assigns and then tests the new value, so the branch runs whenever the value is truthy.",
724
724
  suggestion: "Use === to compare."
@@ -729,7 +729,7 @@ const RULES = [
729
729
  severity: "major",
730
730
  category: "correctness",
731
731
  aliases: ["async foreach"],
732
- files: JS$4,
732
+ files: JS$5,
733
733
  match: (l) => /\.forEach\(\s*async\b/.test(l),
734
734
  why: "forEach ignores the promises, so the code after it runs before the work is done and errors go unhandled.",
735
735
  suggestion: "Use for...of with await, or await Promise.all(items.map(...))."
@@ -866,7 +866,7 @@ const RULES = [
866
866
  severity: "trivial",
867
867
  category: "performance",
868
868
  aliases: ["json clone"],
869
- files: JS$4,
869
+ files: JS$5,
870
870
  match: (l) => /JSON\.parse\(\s*JSON\.stringify\(/.test(l),
871
871
  why: "It is slow on large objects and silently drops dates, maps, undefined and functions.",
872
872
  suggestion: "Use structuredClone(value)."
@@ -930,7 +930,7 @@ const RULES = [
930
930
  "console logs",
931
931
  "logging"
932
932
  ],
933
- files: JS$4,
933
+ files: JS$5,
934
934
  match: (l) => /^\s*console\.(log|debug|trace)\(.*\);?\s*$/.test(l) && balanced(l),
935
935
  fix: () => null,
936
936
  why: "Debug output leaks into the browser console or server logs.",
@@ -1282,10 +1282,10 @@ function linkedIssues(...texts) {
1282
1282
  /** Calls the change adds from one module into another it imports, as a Mermaid sequence diagram (null when there are none). */
1283
1283
  function sequenceDiagram(files, contents = {}) {
1284
1284
  const arrows = [];
1285
- const parts$1 = /* @__PURE__ */ new Map();
1285
+ const parts$2 = /* @__PURE__ */ new Map();
1286
1286
  const alias = (p$1) => {
1287
- if (!parts$1.has(p$1)) parts$1.set(p$1, `P${parts$1.size + 1}`);
1288
- return parts$1.get(p$1);
1287
+ if (!parts$2.has(p$1)) parts$2.set(p$1, `P${parts$2.size + 1}`);
1288
+ return parts$2.get(p$1);
1289
1289
  };
1290
1290
  for (const f of files) {
1291
1291
  if (!/\.(m?[jt]sx?|c[jt]s)$/.test(f.path) || TEST_PATH.test(f.path)) continue;
@@ -1313,7 +1313,7 @@ function sequenceDiagram(files, contents = {}) {
1313
1313
  if (!arrows.length) return null;
1314
1314
  return [
1315
1315
  "sequenceDiagram",
1316
- ...[...parts$1].map(([p$1, a]) => ` participant ${a} as ${p$1}`),
1316
+ ...[...parts$2].map(([p$1, a]) => ` participant ${a} as ${p$1}`),
1317
1317
  ...arrows.slice(0, 12)
1318
1318
  ].join("\n");
1319
1319
  }
@@ -1850,9 +1850,9 @@ const day = (iso) => iso.slice(0, 10);
1850
1850
  * Each assumption that is not true where the code runs right now, with the reading that says so. A kind with no reading says
1851
1851
  * nothing: Xovris never guesses what production holds.
1852
1852
  */
1853
- function assumedFindings(files, live, zones = [], now = /* @__PURE__ */ new Date()) {
1853
+ function assumedFindings(files, live$1, zones = [], now = /* @__PURE__ */ new Date()) {
1854
1854
  const out = [];
1855
- const read = live ? `read ${live.at} from ${live.source}` : "";
1855
+ const read = live$1 ? `read ${live$1.at} from ${live$1.source}` : "";
1856
1856
  const add = (a, rule, severity, category, title, reading, why, suggestion, key = "") => {
1857
1857
  out.push({
1858
1858
  id: findingId(`assumes.${rule}`, a.file, `${a.what}|${key}`),
@@ -1870,18 +1870,18 @@ function assumedFindings(files, live, zones = [], now = /* @__PURE__ */ new Date
1870
1870
  ref: `live:${a.kind}`
1871
1871
  });
1872
1872
  };
1873
- for (const a of assumptionsOf(files)) if (a.kind === "variable" && live?.env && !live.env.includes(a.what)) add(a, "variable", "major", "stability", `${a.what} is not set where this code runs`, `${live.env.length} variable${live.env.length === 1 ? " is" : "s are"} set and none is called ${a.what} (${read})`, "The line reads a variable that production does not have, so it gets nothing where it expects a value - and the code that follows runs on that.", `Set ${a.what} where the code runs before this merges, or give the line what to do when it is missing.`);
1874
- else if (a.kind === "table" && live?.schema) {
1875
- const tables = Object.keys(live.schema);
1873
+ for (const a of assumptionsOf(files)) if (a.kind === "variable" && live$1?.env && !live$1.env.includes(a.what)) add(a, "variable", "major", "stability", `${a.what} is not set where this code runs`, `${live$1.env.length} variable${live$1.env.length === 1 ? " is" : "s are"} set and none is called ${a.what} (${read})`, "The line reads a variable that production does not have, so it gets nothing where it expects a value - and the code that follows runs on that.", `Set ${a.what} where the code runs before this merges, or give the line what to do when it is missing.`);
1874
+ else if (a.kind === "table" && live$1?.schema) {
1875
+ const tables = Object.keys(live$1.schema);
1876
1876
  const t = tables.find((x) => x.toLowerCase() === a.what);
1877
- const missing = t ? (a.columns ?? []).filter((c) => !live.schema[t].some((x) => x.toLowerCase() === c)) : [];
1877
+ const missing = t ? (a.columns ?? []).filter((c) => !live$1.schema[t].some((x) => x.toLowerCase() === c)) : [];
1878
1878
  if (!t) add(a, "table", "major", "data", `The database has no table called ${a.what}`, `${tables.length} table${tables.length === 1 ? "" : "s"} and none is called ${a.what} (${read})`, "The statement names a table the database does not have, so it fails the first time it runs.", `Ship the migration that creates ${a.what} before this, or point the statement at the table that holds this.`);
1879
- else if (missing.length) add(a, "column", "major", "data", `${t} has no column${missing.length === 1 ? "" : "s"} called ${missing.join(" and ")}`, `${t} has ${live.schema[t].join(", ")} (${read})`, "The statement names a column the table does not have, so it fails the first time it runs.", `Ship the migration that adds ${missing.join(" and ")} to ${t} before this merges, or use the columns the table has.`);
1880
- } else if (a.kind === "flag" && live?.flags) {
1881
- if (!(a.what in live.flags)) add(a, "flag", "major", "correctness", `There is no flag called ${a.what} where this code runs`, `${Object.keys(live.flags).length} flag${Object.keys(live.flags).length === 1 ? "" : "s"} and none is called ${a.what} (${read})`, "A flag that does not exist is read as off, so the code behind it never runs - for anyone.", `Create ${a.what}, or use the name of the flag that exists.`);
1882
- else if (!live.flags[a.what]) add(a, "flag", "minor", "correctness", `${a.what} is off where this code runs`, `${a.what} is off (${read})`, "The code behind this flag runs for nobody until the flag is turned on, so merging this changes nothing yet - and what it replaces must still work.", `Turn ${a.what} on when this is meant to run, and keep the path it replaces working until then.`);
1879
+ else if (missing.length) add(a, "column", "major", "data", `${t} has no column${missing.length === 1 ? "" : "s"} called ${missing.join(" and ")}`, `${t} has ${live$1.schema[t].join(", ")} (${read})`, "The statement names a column the table does not have, so it fails the first time it runs.", `Ship the migration that adds ${missing.join(" and ")} to ${t} before this merges, or use the columns the table has.`);
1880
+ } else if (a.kind === "flag" && live$1?.flags) {
1881
+ if (!(a.what in live$1.flags)) add(a, "flag", "major", "correctness", `There is no flag called ${a.what} where this code runs`, `${Object.keys(live$1.flags).length} flag${Object.keys(live$1.flags).length === 1 ? "" : "s"} and none is called ${a.what} (${read})`, "A flag that does not exist is read as off, so the code behind it never runs - for anyone.", `Create ${a.what}, or use the name of the flag that exists.`);
1882
+ else if (!live$1.flags[a.what]) add(a, "flag", "minor", "correctness", `${a.what} is off where this code runs`, `${a.what} is off (${read})`, "The code behind this flag runs for nobody until the flag is turned on, so merging this changes nothing yet - and what it replaces must still work.", `Turn ${a.what} on when this is meant to run, and keep the path it replaces working until then.`);
1883
1883
  } else if (a.kind === "name") {
1884
- const n$1 = live?.names?.[a.what];
1884
+ const n$1 = live$1?.names?.[a.what];
1885
1885
  const zone = zones.find((z) => a.what === z.zone.toLowerCase() || a.what.endsWith(`.${z.zone.toLowerCase()}`));
1886
1886
  const named = (r) => {
1887
1887
  const x = r.name.toLowerCase().replace(/\.$/, "");
@@ -1890,10 +1890,10 @@ function assumedFindings(files, live, zones = [], now = /* @__PURE__ */ new Date
1890
1890
  if (n$1 && !n$1.resolves) add(a, "name", "major", "stability", `${a.what} does not answer`, `${a.what} does not resolve${n$1.why ? ` (${n$1.why})` : ""} (${read})`, "The line calls a name that nothing answers on, so every call it makes fails.", `Create the record for ${a.what}, or call the name that answers.`);
1891
1891
  else if (n$1?.certificateUntil && Date.parse(n$1.certificateUntil) - now.getTime() < 7 * 864e5) add(a, "certificate", Date.parse(n$1.certificateUntil) < now.getTime() ? "major" : "minor", "security", Date.parse(n$1.certificateUntil) < now.getTime() ? `The certificate of ${a.what} ran out on ${day(n$1.certificateUntil)}` : `The certificate of ${a.what} runs out on ${day(n$1.certificateUntil)}`, `the certificate ${a.what} presents is good until ${day(n$1.certificateUntil)} (${read})`, "A call to a name whose certificate has run out is refused before it is sent.", `Renew the certificate of ${a.what} before this merges.`);
1892
1892
  else if (!n$1 && zone && !zone.records.some(named)) add(a, "name", "major", "stability", `${a.what} has no record in ${zone.zone}`, `the zone ${zone.zone}, as Xovris last read it from its provider, has ${zone.records.length} record${zone.records.length === 1 ? "" : "s"} and none for ${a.what}`, "The line calls a name its own zone has no record for, so every call it makes fails.", `Create the record for ${a.what} in ${zone.zone}, or call the name that has one.`);
1893
- } else if (a.kind === "permission" && live?.permissions && !granted(a.what, live.permissions)) add(a, "permission", "major", "security", `The service account may not ${a.what}`, `it holds ${live.permissions.length ? live.permissions.join(", ") : "nothing"} - not ${a.what} (${read})`, "The call is refused where the code runs, because the account it runs as was never given this.", `Grant ${a.what} to the service account, on the one thing this call touches, before this merges.`);
1894
- else if (a.kind === "quota" && live?.quotas) {
1893
+ } else if (a.kind === "permission" && live$1?.permissions && !granted(a.what, live$1.permissions)) add(a, "permission", "major", "security", `The service account may not ${a.what}`, `it holds ${live$1.permissions.length ? live$1.permissions.join(", ") : "nothing"} - not ${a.what} (${read})`, "The call is refused where the code runs, because the account it runs as was never given this.", `Grant ${a.what} to the service account, on the one thing this call touches, before this merges.`);
1894
+ else if (a.kind === "quota" && live$1?.quotas) {
1895
1895
  const service = a.what.split(":")[0].toLowerCase();
1896
- for (const [name, q] of Object.entries(live.quotas)) {
1896
+ for (const [name, q] of Object.entries(live$1.quotas)) {
1897
1897
  const share = q.limit > 0 ? q.used / q.limit : 0;
1898
1898
  if ((name.toLowerCase() === a.what.toLowerCase() || name.toLowerCase().startsWith(`${service}.`)) && share >= .8) add(a, "quota", share >= .95 ? "major" : "minor", "stability", `${name} is at ${Math.floor(share * 100)}% of its limit`, `${name}: ${q.used.toLocaleString("en-GB")} of ${q.limit.toLocaleString("en-GB")} used (${read})`, "The calls this change adds draw on a limit that is nearly reached; past it they are refused.", `Raise the limit for ${name}, or make these calls fewer, before this merges.`, name);
1899
1899
  }
@@ -25614,20 +25614,20 @@ function liveZoneFindings(files, zones) {
25614
25614
  return out;
25615
25615
  }
25616
25616
  /** The zone after the change, held to what mail and the site need; each outage named with the record that causes it. */
25617
- function liveConfigFindings(files, live) {
25618
- const changes = zoneChanges(files, live.zone);
25617
+ function liveConfigFindings(files, live$1) {
25618
+ const changes = zoneChanges(files, live$1.zone);
25619
25619
  if (!changes.length) return [];
25620
25620
  const key = (r) => `${r.name}|${r.type}|${lower(r.value)}`;
25621
25621
  const removed = new Set(changes.filter((c) => c.op === "remove").map((c) => key(c.record)));
25622
- const after = [...live.records.map((r) => ({
25622
+ const after = [...live$1.records.map((r) => ({
25623
25623
  ...r,
25624
- name: fqdn(r.name, live.zone),
25624
+ name: fqdn(r.name, live$1.zone),
25625
25625
  value: unq(r.value)
25626
25626
  })).filter((r) => !removed.has(key(r))), ...changes.filter((c) => c.op === "add").map((c) => c.record)];
25627
25627
  const at$3 = (name, type) => after.filter((r) => r.name === name && (!type || r.type === type));
25628
- const apex = lower(live.zone);
25628
+ const apex = lower(live$1.zone);
25629
25629
  const out = [];
25630
- const liveMx = live.records.filter((r) => r.type === "MX" && fqdn(r.name, live.zone) === apex);
25630
+ const liveMx = live$1.records.filter((r) => r.type === "MX" && fqdn(r.name, live$1.zone) === apex);
25631
25631
  const where = (pred) => changes.find(pred) ?? changes[0];
25632
25632
  const asRepaired = (code$1, lead) => {
25633
25633
  const r = deriveMailRepair(code$1, mailStateOfZone(after.map((x) => ({
@@ -25644,23 +25644,23 @@ function liveConfigFindings(files, live) {
25644
25644
  if (host.endsWith(apex) && !at$3(host, "A").length && !at$3(host, "AAAA").length && !at$3(host, "CNAME").length) out.push(finding(where((c) => c.record.type === "MX" || c.record.name === host), "mx-dangling", "Mail is pointed at a name that does not resolve", `The MX record sends mail to ${host}, which has no address in the zone after this change, so mail cannot be delivered.`, `Add an A or AAAA record for ${host}, or point the MX at the mail provider's host.`));
25645
25645
  }
25646
25646
  const spf = at$3(apex, "TXT").filter((r) => /^v=spf1\b/i.test(r.value));
25647
- const hadSpf = live.records.some((r) => fqdn(r.name, live.zone) === apex && r.type === "TXT" && /^v=spf1\b/i.test(unq(r.value)));
25647
+ const hadSpf = live$1.records.some((r) => fqdn(r.name, live$1.zone) === apex && r.type === "TXT" && /^v=spf1\b/i.test(unq(r.value)));
25648
25648
  if (spf.length > 1) out.push(finding(where((c) => /^v=spf1/i.test(c.record.value)), "spf-twice", "Two SPF records make every SPF check fail", `${apex} would publish ${spf.length} SPF records; RFC 7208 section 3.2 makes that a permanent error, so receivers treat the domain's mail as unauthenticated.`, asRepaired("spf.multiple", "Merge them into one v=spf1 record")));
25649
25649
  else if (hadSpf && !spf.length) out.push(finding(where((c) => c.record.type === "TXT"), "spf-gone", "This change removes the domain's SPF record", `${apex} authenticates its mail with SPF today; without it, mail from the domain is more likely to be rejected or marked as spam.`, "Keep the v=spf1 record.", "major"));
25650
25650
  else if (spf[0] && /\s[+]?all\b/.test(` ${spf[0].value}`)) out.push(finding(where((c) => /^v=spf1/i.test(c.record.value)), "spf-open", "This SPF record lets anyone send as the domain", `"${spf[0].value}" ends in +all, which authorises every server on the internet.`, asRepaired("spf.open_all", "End it in ~all"), "major"));
25651
25651
  const dmarcName = `_dmarc.${apex}`;
25652
- if (live.records.some((r) => fqdn(r.name, live.zone) === dmarcName) && !at$3(dmarcName, "TXT").length) out.push(finding(where((c) => c.record.name === dmarcName), "dmarc-gone", "This change removes DMARC", `${dmarcName} protects the domain from spoofing today; without it receivers have no policy and the reports stop.`, "Keep the _dmarc TXT record.", "major"));
25653
- for (const sel of live.dkimSelectors ?? []) {
25652
+ if (live$1.records.some((r) => fqdn(r.name, live$1.zone) === dmarcName) && !at$3(dmarcName, "TXT").length) out.push(finding(where((c) => c.record.name === dmarcName), "dmarc-gone", "This change removes DMARC", `${dmarcName} protects the domain from spoofing today; without it receivers have no policy and the reports stop.`, "Keep the _dmarc TXT record.", "major"));
25653
+ for (const sel of live$1.dkimSelectors ?? []) {
25654
25654
  const n$1 = `${lower(sel)}._domainkey.${apex}`;
25655
- if (live.records.some((r) => fqdn(r.name, live.zone) === n$1) && !at$3(n$1).length) out.push(finding(where((c) => c.record.name === n$1), "dkim-gone", "This change removes a DKIM key that is signing mail now", `Mail was signed with the selector ${sel} in the last 30 days; removing ${n$1} makes those signatures fail.`, `Keep ${n$1} until no mail is signed with ${sel}.`));
25655
+ if (live$1.records.some((r) => fqdn(r.name, live$1.zone) === n$1) && !at$3(n$1).length) out.push(finding(where((c) => c.record.name === n$1), "dkim-gone", "This change removes a DKIM key that is signing mail now", `Mail was signed with the selector ${sel} in the last 30 days; removing ${n$1} makes those signatures fail.`, `Keep ${n$1} until no mail is signed with ${sel}.`));
25656
25656
  }
25657
25657
  for (const name of new Set(after.map((r) => r.name))) {
25658
25658
  const recs = at$3(name);
25659
25659
  if (recs.some((r) => r.type === "CNAME") && recs.length > 1) out.push(finding(where((c) => c.record.name === name), "cname-beside", name === apex ? "A CNAME at the apex breaks the domain" : "A CNAME cannot sit beside other records", `${name} would have a CNAME and ${recs.length - 1} other record${recs.length > 2 ? "s" : ""}; RFC 1034 section 3.6.2 forbids it, and resolvers answer unpredictably.`, name === apex ? "Use the provider's flattened apex record (ALIAS or CNAME flattening) instead." : "Remove the other records or the CNAME."));
25660
25660
  }
25661
- for (const name of live.inUse ?? []) {
25662
- const n$1 = fqdn(name, live.zone);
25663
- if (live.records.some((r) => fqdn(r.name, live.zone) === n$1 && [
25661
+ for (const name of live$1.inUse ?? []) {
25662
+ const n$1 = fqdn(name, live$1.zone);
25663
+ if (live$1.records.some((r) => fqdn(r.name, live$1.zone) === n$1 && [
25664
25664
  "A",
25665
25665
  "AAAA",
25666
25666
  "CNAME"
@@ -25879,7 +25879,7 @@ const A = (id$1, languages, files, kind, sarif) => ({
25879
25879
  kind,
25880
25880
  sarif
25881
25881
  });
25882
- const JS$3 = /\.(m|c)?(j|t)sx?$/;
25882
+ const JS$4 = /\.(m|c)?(j|t)sx?$/;
25883
25883
  const PY = /\.py$/;
25884
25884
  const GO = /\.go$/;
25885
25885
  const RB = /\.rb$/;
@@ -25888,12 +25888,12 @@ const SH = /\.(sh|bash)$/;
25888
25888
  const TF = /\.tf$/;
25889
25889
  const YML = /\.ya?ml$/;
25890
25890
  const ANALYZERS = [
25891
- A("eslint", ["javascript", "typescript"], JS$3, "lint", "eslint -f @microsoft/eslint-formatter-sarif"),
25892
- A("biome", ["javascript", "typescript"], JS$3, "lint", "biome lint --reporter=sarif"),
25893
- A("oxlint", ["javascript", "typescript"], JS$3, "lint", "oxlint --format sarif"),
25891
+ A("eslint", ["javascript", "typescript"], JS$4, "lint", "eslint -f @microsoft/eslint-formatter-sarif"),
25892
+ A("biome", ["javascript", "typescript"], JS$4, "lint", "biome lint --reporter=sarif"),
25893
+ A("oxlint", ["javascript", "typescript"], JS$4, "lint", "oxlint --format sarif"),
25894
25894
  A("semgrep", ["*"], /./, "sast", "semgrep --sarif"),
25895
25895
  A("codeql", ["*"], /./, "sast", "codeql database analyze --format=sarif-latest"),
25896
- A("njsscan", ["javascript"], JS$3, "sast", "njsscan --sarif"),
25896
+ A("njsscan", ["javascript"], JS$4, "sast", "njsscan --sarif"),
25897
25897
  A("ruff", ["python"], PY, "lint", "ruff check --output-format sarif"),
25898
25898
  A("pylint", ["python"], PY, "lint", "pylint --output-format=sarif"),
25899
25899
  A("bandit", ["python"], PY, "sast", "bandit -f sarif"),
@@ -26263,9 +26263,9 @@ function exportsOf(text) {
26263
26263
  /** Every place a repository imports `symbol` from `pkg` and calls it, with the number of arguments it passes. */
26264
26264
  function callersOf(repo, files, pkg, symbol) {
26265
26265
  const out = [];
26266
- const esc$1 = pkg.replace(/[.*+?^${}()|[\]\\/]/g, "\\$&");
26266
+ const esc$2 = pkg.replace(/[.*+?^${}()|[\]\\/]/g, "\\$&");
26267
26267
  for (const f of files) {
26268
- const imp = new RegExp(`import\\s*(?:type\\s*)?\\{([^}]*)\\}\\s*from\\s*['"]${esc$1}(?:/[^'"]*)?['"]|const\\s*\\{([^}]*)\\}\\s*=\\s*require\\(\\s*['"]${esc$1}['"]\\s*\\)`, "g");
26268
+ const imp = new RegExp(`import\\s*(?:type\\s*)?\\{([^}]*)\\}\\s*from\\s*['"]${esc$2}(?:/[^'"]*)?['"]|const\\s*\\{([^}]*)\\}\\s*=\\s*require\\(\\s*['"]${esc$2}['"]\\s*\\)`, "g");
26269
26269
  let local = null;
26270
26270
  for (const m of f.text.matchAll(imp)) for (const part of (m[1] ?? m[2] ?? "").split(",")) {
26271
26271
  const [name, as] = part.trim().replace(/^type\s+/, "").split(/\s+as\s+|\s*:\s*/);
@@ -26338,9 +26338,9 @@ function beforeText(f, now) {
26338
26338
  }
26339
26339
  /** The package a file belongs to: the name in the nearest package.json at or above it, among the files the door could read. */
26340
26340
  function packageOf(path, contents) {
26341
- const parts$1 = path.replace(/\\/g, "/").split("/");
26342
- for (let i = parts$1.length - 1; i >= 0; i -= 1) {
26343
- const root = parts$1.slice(0, i).join("/");
26341
+ const parts$2 = path.replace(/\\/g, "/").split("/");
26342
+ for (let i = parts$2.length - 1; i >= 0; i -= 1) {
26343
+ const root = parts$2.slice(0, i).join("/");
26344
26344
  const text = contents[root ? `${root}/package.json` : "package.json"];
26345
26345
  if (text === void 0) continue;
26346
26346
  try {
@@ -33899,6 +33899,1702 @@ function applyConfig(findings, files, cfg) {
33899
33899
  return out;
33900
33900
  }
33901
33901
 
33902
+ //#endregion
33903
+ //#region ../review/src/deprecations-feed.ts
33904
+ const NODE_DEPRECATIONS_URL = "https://nodejs.org/api/deprecations.json";
33905
+ const NODE_RELEASES_URL = "https://nodejs.org/dist/index.json";
33906
+ const JS$3 = /\.(m|c)?(j|t)sx?$/;
33907
+ const esc$1 = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
33908
+ const parts$1 = (v) => v.replace(/^v/, "").split(".").map((x) => Number.parseInt(x, 10) || 0);
33909
+ const newer = (a, b) => {
33910
+ const x = parts$1(a), y = parts$1(b);
33911
+ for (let i = 0; i < 3; i += 1) if ((x[i] ?? 0) !== (y[i] ?? 0)) return (x[i] ?? 0) > (y[i] ?? 0);
33912
+ return false;
33913
+ };
33914
+ /** The version a change landed in on the newest release line it names (a backport's older lines are the same change). */
33915
+ const versionOf = (v) => {
33916
+ const all$1 = (Array.isArray(v) ? v : v ? [v] : []).map((x) => x.replace(/^v/, "")).filter((x) => /^\d+\.\d+\.\d+$/.test(x));
33917
+ return all$1.length ? all$1.reduce((a, b) => newer(b, a) ? b : a) : null;
33918
+ };
33919
+ const unhtml = (s) => s.replace(/<[^>]+>/g, "").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, "\"").replace(/&#39;/g, "'").replace(/&amp;/g, "&").trim();
33920
+ /** `util.isArray()` -> \butil\.isArray\s*\(, `new Buffer()` -> \bnew\s+Buffer\s*\( - only a callable API in the heading; anything else is
33921
+ * a module, an option or an event, which no single line pattern names truthfully, so it is left to the hand-written floor. */
33922
+ function patternFor(api) {
33923
+ const m = /^(new\s+)?([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)\(\)$/.exec(api.trim());
33924
+ if (!m) return null;
33925
+ const path = m[2].split(".").map(esc$1).join("\\.");
33926
+ return /* @__PURE__ */ new RegExp(`${m[1] ? "\\bnew\\s+" : "\\b"}${path}\\s*\\(`);
33927
+ }
33928
+ const BUILTINS = new Set(builtinModules.map((m) => m.replace(/^node:/, "")));
33929
+ const dotted = (p$1) => p$1.split(".").map(esc$1).join("\\.");
33930
+ const IDENT$1 = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/;
33931
+ const distinct = (m) => /_/.test(m) || /[a-z][A-Z]/.test(m) || /[A-Z].*[A-Z]/.test(m);
33932
+ const member = (name) => {
33933
+ const [mod, ...rest] = name.split(".");
33934
+ const tail$2 = rest.join(".");
33935
+ return BUILTINS.has(mod) && rest.length === 1 && distinct(tail$2) ? `(?:\\b${esc$1(mod)}\\.|(?<![\\w$.]))${dotted(tail$2)}\\b` : `\\b${dotted(name)}\\b`;
33936
+ };
33937
+ const PLAIN = new Set([
33938
+ "and",
33939
+ "or",
33940
+ "the",
33941
+ "a",
33942
+ "an",
33943
+ "module",
33944
+ "modules",
33945
+ "class",
33946
+ "classes",
33947
+ "function",
33948
+ "functions",
33949
+ "method",
33950
+ "methods",
33951
+ "property",
33952
+ "properties",
33953
+ "option",
33954
+ "options",
33955
+ "of",
33956
+ "http/2",
33957
+ "servers",
33958
+ "server",
33959
+ "api",
33960
+ "apis"
33961
+ ]);
33962
+ function headingPattern(heading) {
33963
+ const h = unhtml(heading).trim();
33964
+ const ticks = [...h.matchAll(/`([^`]+)`/g)].map((m) => m[1].trim());
33965
+ if (!ticks.length) return null;
33966
+ const pass = /^Passing `options\.([A-Za-z_$][\w$]*)` to `([A-Za-z_$][\w$.]*)\(\)`/.exec(h);
33967
+ if (pass) return /* @__PURE__ */ new RegExp(`\\b${dotted(pass[2])}\\s*\\([^;]*\\b${esc$1(pass[1])}\\s*:`);
33968
+ const empty = /`options\.([A-Za-z_$][\w$]*)` as an empty string/.exec(h);
33969
+ if (empty) return /* @__PURE__ */ new RegExp(`\\b${esc$1(empty[1])}\\s*:\\s*(['"\`])\\1`);
33970
+ const bare$1 = /^Instantiating `node:([a-z_]+)` classes without `new`/.exec(h);
33971
+ if (bare$1) return /* @__PURE__ */ new RegExp(`(?<!new\\s+)\\b${esc$1(bare$1[1])}\\.[A-Z][A-Za-z0-9]*\\s*\\(`);
33972
+ if (/^(Passing|Calling|Creating|Using|Closing)\b|\bwithout\b/.test(h)) return null;
33973
+ if (/^(new\s+)?([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)\(\)$/.exec(ticks[0]) && h.startsWith("`")) return patternFor(ticks[0]);
33974
+ const words = h.replace(/`[^`]+`/g, " ").toLowerCase().split(/[\s,]+/).filter(Boolean);
33975
+ if (words.some((w) => !PLAIN.has(w) && !(w === "constructor" && words.length === 1))) return null;
33976
+ const alts = [];
33977
+ for (const t of ticks) {
33978
+ const req = /^require\('(?:node:)?([\w*]+)'\)$/.exec(t);
33979
+ const call = /^(new\s+)?([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)\(\)$/.exec(t);
33980
+ const proto = /^[A-Za-z_$][\w$]*\.prototype\.(_[\w$]+)$/.exec(t);
33981
+ const star = /^([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)_\*$/.exec(t);
33982
+ if (req) alts.push(`(?:require\\s*\\(|import\\s*\\(|from)\\s*['"](?:node:)?${esc$1(req[1]).replace(/\\\*/g, "\\w+")}['"]`);
33983
+ else if (call) alts.push(`${call[1] ? "\\bnew\\s+" : "\\b"}${dotted(call[2])}\\s*\\(`);
33984
+ else if (proto) alts.push(`\\.${esc$1(proto[1])}\\b`);
33985
+ else if (star) alts.push(`\\b${dotted(star[1])}_\\w+`);
33986
+ else if (IDENT$1.test(t) && / constructor$/.test(h)) alts.push(`\\b(?:new\\s+)?${dotted(t)}\\s*\\(`);
33987
+ else if (IDENT$1.test(t) && (t.includes(".") || /^[A-Z][A-Za-z0-9]+$/.test(t) && !BUILTINS.has(t.toLowerCase()))) alts.push(member(t));
33988
+ }
33989
+ return alts.length ? new RegExp(alts.join("|")) : null;
33990
+ }
33991
+ /** Node's own deprecation list and release dates read into catalogue entries (read: the day both were read). */
33992
+ function fromNodeDocs(docs, releases, read) {
33993
+ const dates = new Map((Array.isArray(releases) ? releases : []).flatMap((r) => typeof r?.version === "string" && typeof r?.date === "string" ? [[r.version.replace(/^v/, ""), r.date]] : []));
33994
+ const list$1 = (docs?.miscs?.[0]?.miscs ?? []).find((x) => /list of deprecated apis/i.test(x.textRaw ?? ""))?.modules ?? [];
33995
+ const out = [];
33996
+ for (const s of list$1) {
33997
+ const head = /^(DEP\d{4}):\s*(.+)$/.exec(s.textRaw ?? "");
33998
+ if (!head) continue;
33999
+ const pattern = headingPattern(head[2]);
34000
+ if (!pattern) continue;
34001
+ const changes = s.meta?.changes ?? [];
34002
+ const at$3 = (re) => versionOf(changes.find((c) => re.test(c.description ?? ""))?.version);
34003
+ const deprecatedIn = at$3(/runtime deprecation/i) ?? at$3(/documentation-only/i);
34004
+ if (!deprecatedIn) continue;
34005
+ const removedIn = at$3(/end-of-life/i);
34006
+ const use = /use\s+(?:<a[^>]*>)?<code>([^<]+)<\/code>/i.exec(s.desc ?? "")?.[1];
34007
+ out.push({
34008
+ id: head[1],
34009
+ ecosystem: "node",
34010
+ pkg: "node",
34011
+ pattern: pattern.source,
34012
+ deprecatedIn,
34013
+ deprecatedOn: dates.get(deprecatedIn) ?? read,
34014
+ removedIn,
34015
+ removedOn: removedIn ? dates.get(removedIn) ?? null : null,
34016
+ replacement: use ? unhtml(use) : `what Node's page for ${head[1]} names`,
34017
+ source: `https://nodejs.org/api/deprecations.html#${head[1].toLowerCase()}`,
34018
+ read
34019
+ });
34020
+ }
34021
+ return out;
34022
+ }
34023
+ /** The catalogue a review matches: the hand-written floor, then every generated entry whose id the floor does not hold. */
34024
+ function withGenerated(floor, kept) {
34025
+ const have = new Set(floor.map((d) => d.id));
34026
+ return [...floor, ...kept.filter((k) => !have.has(k.id)).map((k) => ({
34027
+ ...k,
34028
+ pattern: new RegExp(k.pattern),
34029
+ files: JS$3
34030
+ }))];
34031
+ }
34032
+
34033
+ //#endregion
34034
+ //#region ../review/data/node-deprecations.json
34035
+ var entries = [
34036
+ {
34037
+ "id": "DEP0001",
34038
+ "ecosystem": "node",
34039
+ "pkg": "node",
34040
+ "pattern": "\\bhttp\\.OutgoingMessage\\.prototype\\.flush\\b",
34041
+ "deprecatedIn": "1.6.0",
34042
+ "deprecatedOn": "2026-10-19",
34043
+ "removedIn": "14.0.0",
34044
+ "removedOn": "2020-04-21",
34045
+ "replacement": "OutgoingMessage.prototype.flushHeaders()",
34046
+ "source": "https://nodejs.org/api/deprecations.html#dep0001",
34047
+ "read": "2026-10-19"
34048
+ },
34049
+ {
34050
+ "id": "DEP0002",
34051
+ "ecosystem": "node",
34052
+ "pkg": "node",
34053
+ "pattern": "(?:require\\s*\\(|import\\s*\\(|from)\\s*['\"](?:node:)?_linklist['\"]",
34054
+ "deprecatedIn": "5.0.0",
34055
+ "deprecatedOn": "2015-10-29",
34056
+ "removedIn": "8.0.0",
34057
+ "removedOn": "2017-05-30",
34058
+ "replacement": "what Node's page for DEP0002 names",
34059
+ "source": "https://nodejs.org/api/deprecations.html#dep0002",
34060
+ "read": "2026-10-19"
34061
+ },
34062
+ {
34063
+ "id": "DEP0003",
34064
+ "ecosystem": "node",
34065
+ "pkg": "node",
34066
+ "pattern": "\\b_writableState\\.buffer\\b",
34067
+ "deprecatedIn": "0.11.15",
34068
+ "deprecatedOn": "2015-01-20",
34069
+ "removedIn": "14.0.0",
34070
+ "removedOn": "2020-04-21",
34071
+ "replacement": "_writableState.getBuffer()",
34072
+ "source": "https://nodejs.org/api/deprecations.html#dep0003",
34073
+ "read": "2026-10-19"
34074
+ },
34075
+ {
34076
+ "id": "DEP0004",
34077
+ "ecosystem": "node",
34078
+ "pkg": "node",
34079
+ "pattern": "\\bCryptoStream\\.prototype\\.readyState\\b",
34080
+ "deprecatedIn": "0.4.0",
34081
+ "deprecatedOn": "2011-08-26",
34082
+ "removedIn": "10.0.0",
34083
+ "removedOn": "2018-04-24",
34084
+ "replacement": "what Node's page for DEP0004 names",
34085
+ "source": "https://nodejs.org/api/deprecations.html#dep0004",
34086
+ "read": "2026-10-19"
34087
+ },
34088
+ {
34089
+ "id": "DEP0005",
34090
+ "ecosystem": "node",
34091
+ "pkg": "node",
34092
+ "pattern": "\\bBuffer\\s*\\(",
34093
+ "deprecatedIn": "10.0.0",
34094
+ "deprecatedOn": "2018-04-24",
34095
+ "removedIn": null,
34096
+ "removedOn": null,
34097
+ "replacement": "what Node's page for DEP0005 names",
34098
+ "source": "https://nodejs.org/api/deprecations.html#dep0005",
34099
+ "read": "2026-10-19"
34100
+ },
34101
+ {
34102
+ "id": "DEP0006",
34103
+ "ecosystem": "node",
34104
+ "pkg": "node",
34105
+ "pattern": "\\boptions\\.customFds\\b",
34106
+ "deprecatedIn": "0.11.14",
34107
+ "deprecatedOn": "2014-08-19",
34108
+ "removedIn": "12.0.0",
34109
+ "removedOn": "2019-04-23",
34110
+ "replacement": "what Node's page for DEP0006 names",
34111
+ "source": "https://nodejs.org/api/deprecations.html#dep0006",
34112
+ "read": "2026-10-19"
34113
+ },
34114
+ {
34115
+ "id": "DEP0008",
34116
+ "ecosystem": "node",
34117
+ "pkg": "node",
34118
+ "pattern": "(?:require\\s*\\(|import\\s*\\(|from)\\s*['\"](?:node:)?constants['\"]",
34119
+ "deprecatedIn": "6.3.0",
34120
+ "deprecatedOn": "2016-07-06",
34121
+ "removedIn": null,
34122
+ "removedOn": null,
34123
+ "replacement": "what Node's page for DEP0008 names",
34124
+ "source": "https://nodejs.org/api/deprecations.html#dep0008",
34125
+ "read": "2026-10-19"
34126
+ },
34127
+ {
34128
+ "id": "DEP0010",
34129
+ "ecosystem": "node",
34130
+ "pkg": "node",
34131
+ "pattern": "(?:\\bcrypto\\.|(?<![\\w$.]))createCredentials\\b",
34132
+ "deprecatedIn": "0.11.13",
34133
+ "deprecatedOn": "2014-05-02",
34134
+ "removedIn": "11.0.0",
34135
+ "removedOn": "2018-10-23",
34136
+ "replacement": "tls.createSecureContext()",
34137
+ "source": "https://nodejs.org/api/deprecations.html#dep0010",
34138
+ "read": "2026-10-19"
34139
+ },
34140
+ {
34141
+ "id": "DEP0011",
34142
+ "ecosystem": "node",
34143
+ "pkg": "node",
34144
+ "pattern": "\\bcrypto\\.Credentials\\b",
34145
+ "deprecatedIn": "0.11.13",
34146
+ "deprecatedOn": "2014-05-02",
34147
+ "removedIn": "11.0.0",
34148
+ "removedOn": "2018-10-23",
34149
+ "replacement": "tls.SecureContext",
34150
+ "source": "https://nodejs.org/api/deprecations.html#dep0011",
34151
+ "read": "2026-10-19"
34152
+ },
34153
+ {
34154
+ "id": "DEP0012",
34155
+ "ecosystem": "node",
34156
+ "pkg": "node",
34157
+ "pattern": "\\bDomain\\.dispose\\b",
34158
+ "deprecatedIn": "0.11.7",
34159
+ "deprecatedOn": "2013-09-04",
34160
+ "removedIn": "9.0.0",
34161
+ "removedOn": "2017-10-31",
34162
+ "replacement": "what Node's page for DEP0012 names",
34163
+ "source": "https://nodejs.org/api/deprecations.html#dep0012",
34164
+ "read": "2026-10-19"
34165
+ },
34166
+ {
34167
+ "id": "DEP0017",
34168
+ "ecosystem": "node",
34169
+ "pkg": "node",
34170
+ "pattern": "\\bIntl\\.v8BreakIterator\\b",
34171
+ "deprecatedIn": "7.0.0",
34172
+ "deprecatedOn": "2016-10-25",
34173
+ "removedIn": "9.0.0",
34174
+ "removedOn": "2017-10-31",
34175
+ "replacement": "what Node's page for DEP0017 names",
34176
+ "source": "https://nodejs.org/api/deprecations.html#dep0017",
34177
+ "read": "2026-10-19"
34178
+ },
34179
+ {
34180
+ "id": "DEP0020",
34181
+ "ecosystem": "node",
34182
+ "pkg": "node",
34183
+ "pattern": "\\bServer\\.connections\\b",
34184
+ "deprecatedIn": "0.9.7",
34185
+ "deprecatedOn": "2013-01-18",
34186
+ "removedIn": null,
34187
+ "removedOn": null,
34188
+ "replacement": "what Node's page for DEP0020 names",
34189
+ "source": "https://nodejs.org/api/deprecations.html#dep0020",
34190
+ "read": "2026-10-19"
34191
+ },
34192
+ {
34193
+ "id": "DEP0021",
34194
+ "ecosystem": "node",
34195
+ "pkg": "node",
34196
+ "pattern": "\\bServer\\.listenFD\\b",
34197
+ "deprecatedIn": "0.7.12",
34198
+ "deprecatedOn": "2012-06-19",
34199
+ "removedIn": "12.0.0",
34200
+ "removedOn": "2019-04-23",
34201
+ "replacement": "Server.listen({fd: &#x3C;number>})",
34202
+ "source": "https://nodejs.org/api/deprecations.html#dep0021",
34203
+ "read": "2026-10-19"
34204
+ },
34205
+ {
34206
+ "id": "DEP0022",
34207
+ "ecosystem": "node",
34208
+ "pkg": "node",
34209
+ "pattern": "\\bos\\.tmpDir\\s*\\(",
34210
+ "deprecatedIn": "7.0.0",
34211
+ "deprecatedOn": "2016-10-25",
34212
+ "removedIn": "14.0.0",
34213
+ "removedOn": "2020-04-21",
34214
+ "replacement": "os.tmpdir()",
34215
+ "source": "https://nodejs.org/api/deprecations.html#dep0022",
34216
+ "read": "2026-10-19"
34217
+ },
34218
+ {
34219
+ "id": "DEP0023",
34220
+ "ecosystem": "node",
34221
+ "pkg": "node",
34222
+ "pattern": "\\bos\\.getNetworkInterfaces\\s*\\(",
34223
+ "deprecatedIn": "0.6.0",
34224
+ "deprecatedOn": "2011-11-04",
34225
+ "removedIn": "12.0.0",
34226
+ "removedOn": "2019-04-23",
34227
+ "replacement": "what Node's page for DEP0023 names",
34228
+ "source": "https://nodejs.org/api/deprecations.html#dep0023",
34229
+ "read": "2026-10-19"
34230
+ },
34231
+ {
34232
+ "id": "DEP0024",
34233
+ "ecosystem": "node",
34234
+ "pkg": "node",
34235
+ "pattern": "\\bREPLServer\\.prototype\\.convertToContext\\s*\\(",
34236
+ "deprecatedIn": "7.0.0",
34237
+ "deprecatedOn": "2016-10-25",
34238
+ "removedIn": "9.0.0",
34239
+ "removedOn": "2017-10-31",
34240
+ "replacement": "what Node's page for DEP0024 names",
34241
+ "source": "https://nodejs.org/api/deprecations.html#dep0024",
34242
+ "read": "2026-10-19"
34243
+ },
34244
+ {
34245
+ "id": "DEP0025",
34246
+ "ecosystem": "node",
34247
+ "pkg": "node",
34248
+ "pattern": "(?:require\\s*\\(|import\\s*\\(|from)\\s*['\"](?:node:)?sys['\"]",
34249
+ "deprecatedIn": "1.0.0",
34250
+ "deprecatedOn": "2026-10-19",
34251
+ "removedIn": null,
34252
+ "removedOn": null,
34253
+ "replacement": "what Node's page for DEP0025 names",
34254
+ "source": "https://nodejs.org/api/deprecations.html#dep0025",
34255
+ "read": "2026-10-19"
34256
+ },
34257
+ {
34258
+ "id": "DEP0026",
34259
+ "ecosystem": "node",
34260
+ "pkg": "node",
34261
+ "pattern": "\\butil\\.print\\s*\\(",
34262
+ "deprecatedIn": "0.11.3",
34263
+ "deprecatedOn": "2013-06-26",
34264
+ "removedIn": "12.0.0",
34265
+ "removedOn": "2019-04-23",
34266
+ "replacement": "console.log()",
34267
+ "source": "https://nodejs.org/api/deprecations.html#dep0026",
34268
+ "read": "2026-10-19"
34269
+ },
34270
+ {
34271
+ "id": "DEP0027",
34272
+ "ecosystem": "node",
34273
+ "pkg": "node",
34274
+ "pattern": "\\butil\\.puts\\s*\\(",
34275
+ "deprecatedIn": "0.11.3",
34276
+ "deprecatedOn": "2013-06-26",
34277
+ "removedIn": "12.0.0",
34278
+ "removedOn": "2019-04-23",
34279
+ "replacement": "console.log()",
34280
+ "source": "https://nodejs.org/api/deprecations.html#dep0027",
34281
+ "read": "2026-10-19"
34282
+ },
34283
+ {
34284
+ "id": "DEP0028",
34285
+ "ecosystem": "node",
34286
+ "pkg": "node",
34287
+ "pattern": "\\butil\\.debug\\s*\\(",
34288
+ "deprecatedIn": "0.11.3",
34289
+ "deprecatedOn": "2013-06-26",
34290
+ "removedIn": "12.0.0",
34291
+ "removedOn": "2019-04-23",
34292
+ "replacement": "console.error()",
34293
+ "source": "https://nodejs.org/api/deprecations.html#dep0028",
34294
+ "read": "2026-10-19"
34295
+ },
34296
+ {
34297
+ "id": "DEP0029",
34298
+ "ecosystem": "node",
34299
+ "pkg": "node",
34300
+ "pattern": "\\butil\\.error\\s*\\(",
34301
+ "deprecatedIn": "0.11.3",
34302
+ "deprecatedOn": "2013-06-26",
34303
+ "removedIn": "12.0.0",
34304
+ "removedOn": "2019-04-23",
34305
+ "replacement": "console.error()",
34306
+ "source": "https://nodejs.org/api/deprecations.html#dep0029",
34307
+ "read": "2026-10-19"
34308
+ },
34309
+ {
34310
+ "id": "DEP0030",
34311
+ "ecosystem": "node",
34312
+ "pkg": "node",
34313
+ "pattern": "\\bSlowBuffer\\b",
34314
+ "deprecatedIn": "24.0.0",
34315
+ "deprecatedOn": "2025-05-06",
34316
+ "removedIn": "25.0.0",
34317
+ "removedOn": "2025-10-15",
34318
+ "replacement": "Buffer.allocUnsafeSlow(size)",
34319
+ "source": "https://nodejs.org/api/deprecations.html#dep0030",
34320
+ "read": "2026-10-19"
34321
+ },
34322
+ {
34323
+ "id": "DEP0031",
34324
+ "ecosystem": "node",
34325
+ "pkg": "node",
34326
+ "pattern": "\\becdh\\.setPublicKey\\s*\\(",
34327
+ "deprecatedIn": "25.0.0",
34328
+ "deprecatedOn": "2025-10-15",
34329
+ "removedIn": null,
34330
+ "removedOn": null,
34331
+ "replacement": "what Node's page for DEP0031 names",
34332
+ "source": "https://nodejs.org/api/deprecations.html#dep0031",
34333
+ "read": "2026-10-19"
34334
+ },
34335
+ {
34336
+ "id": "DEP0033",
34337
+ "ecosystem": "node",
34338
+ "pkg": "node",
34339
+ "pattern": "\\bEventEmitter\\.listenerCount\\s*\\(",
34340
+ "deprecatedIn": "3.2.0",
34341
+ "deprecatedOn": "2026-10-19",
34342
+ "removedIn": null,
34343
+ "removedOn": null,
34344
+ "replacement": "what Node's page for DEP0033 names",
34345
+ "source": "https://nodejs.org/api/deprecations.html#dep0033",
34346
+ "read": "2026-10-19"
34347
+ },
34348
+ {
34349
+ "id": "DEP0039",
34350
+ "ecosystem": "node",
34351
+ "pkg": "node",
34352
+ "pattern": "\\brequire\\.extensions\\b",
34353
+ "deprecatedIn": "0.10.6",
34354
+ "deprecatedOn": "2013-05-14",
34355
+ "removedIn": null,
34356
+ "removedOn": null,
34357
+ "replacement": "what Node's page for DEP0039 names",
34358
+ "source": "https://nodejs.org/api/deprecations.html#dep0039",
34359
+ "read": "2026-10-19"
34360
+ },
34361
+ {
34362
+ "id": "DEP0042",
34363
+ "ecosystem": "node",
34364
+ "pkg": "node",
34365
+ "pattern": "(?:\\btls\\.|(?<![\\w$.]))CryptoStream\\b",
34366
+ "deprecatedIn": "0.11.3",
34367
+ "deprecatedOn": "2013-06-26",
34368
+ "removedIn": "10.0.0",
34369
+ "removedOn": "2018-04-24",
34370
+ "replacement": "tls.TLSSocket",
34371
+ "source": "https://nodejs.org/api/deprecations.html#dep0042",
34372
+ "read": "2026-10-19"
34373
+ },
34374
+ {
34375
+ "id": "DEP0043",
34376
+ "ecosystem": "node",
34377
+ "pkg": "node",
34378
+ "pattern": "(?:\\btls\\.|(?<![\\w$.]))SecurePair\\b",
34379
+ "deprecatedIn": "8.0.0",
34380
+ "deprecatedOn": "2017-05-30",
34381
+ "removedIn": "24.0.0",
34382
+ "removedOn": "2025-05-06",
34383
+ "replacement": "tls.TLSSocket",
34384
+ "source": "https://nodejs.org/api/deprecations.html#dep0043",
34385
+ "read": "2026-10-19"
34386
+ },
34387
+ {
34388
+ "id": "DEP0044",
34389
+ "ecosystem": "node",
34390
+ "pkg": "node",
34391
+ "pattern": "\\butil\\.isArray\\s*\\(",
34392
+ "deprecatedIn": "22.0.0",
34393
+ "deprecatedOn": "2024-04-24",
34394
+ "removedIn": null,
34395
+ "removedOn": null,
34396
+ "replacement": "Array.isArray()",
34397
+ "source": "https://nodejs.org/api/deprecations.html#dep0044",
34398
+ "read": "2026-10-19"
34399
+ },
34400
+ {
34401
+ "id": "DEP0045",
34402
+ "ecosystem": "node",
34403
+ "pkg": "node",
34404
+ "pattern": "\\butil\\.isBoolean\\s*\\(",
34405
+ "deprecatedIn": "22.0.0",
34406
+ "deprecatedOn": "2024-04-24",
34407
+ "removedIn": "23.0.0",
34408
+ "removedOn": "2024-10-16",
34409
+ "replacement": "typeof arg === 'boolean'",
34410
+ "source": "https://nodejs.org/api/deprecations.html#dep0045",
34411
+ "read": "2026-10-19"
34412
+ },
34413
+ {
34414
+ "id": "DEP0046",
34415
+ "ecosystem": "node",
34416
+ "pkg": "node",
34417
+ "pattern": "\\butil\\.isBuffer\\s*\\(",
34418
+ "deprecatedIn": "22.0.0",
34419
+ "deprecatedOn": "2024-04-24",
34420
+ "removedIn": "23.0.0",
34421
+ "removedOn": "2024-10-16",
34422
+ "replacement": "Buffer.isBuffer()",
34423
+ "source": "https://nodejs.org/api/deprecations.html#dep0046",
34424
+ "read": "2026-10-19"
34425
+ },
34426
+ {
34427
+ "id": "DEP0047",
34428
+ "ecosystem": "node",
34429
+ "pkg": "node",
34430
+ "pattern": "\\butil\\.isDate\\s*\\(",
34431
+ "deprecatedIn": "22.0.0",
34432
+ "deprecatedOn": "2024-04-24",
34433
+ "removedIn": "23.0.0",
34434
+ "removedOn": "2024-10-16",
34435
+ "replacement": "arg instanceof Date",
34436
+ "source": "https://nodejs.org/api/deprecations.html#dep0047",
34437
+ "read": "2026-10-19"
34438
+ },
34439
+ {
34440
+ "id": "DEP0048",
34441
+ "ecosystem": "node",
34442
+ "pkg": "node",
34443
+ "pattern": "\\butil\\.isError\\s*\\(",
34444
+ "deprecatedIn": "22.0.0",
34445
+ "deprecatedOn": "2024-04-24",
34446
+ "removedIn": "23.0.0",
34447
+ "removedOn": "2024-10-16",
34448
+ "replacement": "Error.isError(arg)",
34449
+ "source": "https://nodejs.org/api/deprecations.html#dep0048",
34450
+ "read": "2026-10-19"
34451
+ },
34452
+ {
34453
+ "id": "DEP0049",
34454
+ "ecosystem": "node",
34455
+ "pkg": "node",
34456
+ "pattern": "\\butil\\.isFunction\\s*\\(",
34457
+ "deprecatedIn": "22.0.0",
34458
+ "deprecatedOn": "2024-04-24",
34459
+ "removedIn": "23.0.0",
34460
+ "removedOn": "2024-10-16",
34461
+ "replacement": "typeof arg === 'function'",
34462
+ "source": "https://nodejs.org/api/deprecations.html#dep0049",
34463
+ "read": "2026-10-19"
34464
+ },
34465
+ {
34466
+ "id": "DEP0050",
34467
+ "ecosystem": "node",
34468
+ "pkg": "node",
34469
+ "pattern": "\\butil\\.isNull\\s*\\(",
34470
+ "deprecatedIn": "22.0.0",
34471
+ "deprecatedOn": "2024-04-24",
34472
+ "removedIn": "23.0.0",
34473
+ "removedOn": "2024-10-16",
34474
+ "replacement": "arg === null",
34475
+ "source": "https://nodejs.org/api/deprecations.html#dep0050",
34476
+ "read": "2026-10-19"
34477
+ },
34478
+ {
34479
+ "id": "DEP0051",
34480
+ "ecosystem": "node",
34481
+ "pkg": "node",
34482
+ "pattern": "\\butil\\.isNullOrUndefined\\s*\\(",
34483
+ "deprecatedIn": "22.0.0",
34484
+ "deprecatedOn": "2024-04-24",
34485
+ "removedIn": "23.0.0",
34486
+ "removedOn": "2024-10-16",
34487
+ "replacement": "arg === null || arg === undefined",
34488
+ "source": "https://nodejs.org/api/deprecations.html#dep0051",
34489
+ "read": "2026-10-19"
34490
+ },
34491
+ {
34492
+ "id": "DEP0052",
34493
+ "ecosystem": "node",
34494
+ "pkg": "node",
34495
+ "pattern": "\\butil\\.isNumber\\s*\\(",
34496
+ "deprecatedIn": "22.0.0",
34497
+ "deprecatedOn": "2024-04-24",
34498
+ "removedIn": "23.0.0",
34499
+ "removedOn": "2024-10-16",
34500
+ "replacement": "typeof arg === 'number'",
34501
+ "source": "https://nodejs.org/api/deprecations.html#dep0052",
34502
+ "read": "2026-10-19"
34503
+ },
34504
+ {
34505
+ "id": "DEP0053",
34506
+ "ecosystem": "node",
34507
+ "pkg": "node",
34508
+ "pattern": "\\butil\\.isObject\\s*\\(",
34509
+ "deprecatedIn": "22.0.0",
34510
+ "deprecatedOn": "2024-04-24",
34511
+ "removedIn": "23.0.0",
34512
+ "removedOn": "2024-10-16",
34513
+ "replacement": "arg &#x26;&#x26; typeof arg === 'object'",
34514
+ "source": "https://nodejs.org/api/deprecations.html#dep0053",
34515
+ "read": "2026-10-19"
34516
+ },
34517
+ {
34518
+ "id": "DEP0054",
34519
+ "ecosystem": "node",
34520
+ "pkg": "node",
34521
+ "pattern": "\\butil\\.isPrimitive\\s*\\(",
34522
+ "deprecatedIn": "22.0.0",
34523
+ "deprecatedOn": "2024-04-24",
34524
+ "removedIn": "23.0.0",
34525
+ "removedOn": "2024-10-16",
34526
+ "replacement": "Object(arg) !== arg",
34527
+ "source": "https://nodejs.org/api/deprecations.html#dep0054",
34528
+ "read": "2026-10-19"
34529
+ },
34530
+ {
34531
+ "id": "DEP0055",
34532
+ "ecosystem": "node",
34533
+ "pkg": "node",
34534
+ "pattern": "\\butil\\.isRegExp\\s*\\(",
34535
+ "deprecatedIn": "22.0.0",
34536
+ "deprecatedOn": "2024-04-24",
34537
+ "removedIn": "23.0.0",
34538
+ "removedOn": "2024-10-16",
34539
+ "replacement": "arg instanceof RegExp",
34540
+ "source": "https://nodejs.org/api/deprecations.html#dep0055",
34541
+ "read": "2026-10-19"
34542
+ },
34543
+ {
34544
+ "id": "DEP0056",
34545
+ "ecosystem": "node",
34546
+ "pkg": "node",
34547
+ "pattern": "\\butil\\.isString\\s*\\(",
34548
+ "deprecatedIn": "22.0.0",
34549
+ "deprecatedOn": "2024-04-24",
34550
+ "removedIn": "23.0.0",
34551
+ "removedOn": "2024-10-16",
34552
+ "replacement": "typeof arg === 'string'",
34553
+ "source": "https://nodejs.org/api/deprecations.html#dep0056",
34554
+ "read": "2026-10-19"
34555
+ },
34556
+ {
34557
+ "id": "DEP0057",
34558
+ "ecosystem": "node",
34559
+ "pkg": "node",
34560
+ "pattern": "\\butil\\.isSymbol\\s*\\(",
34561
+ "deprecatedIn": "22.0.0",
34562
+ "deprecatedOn": "2024-04-24",
34563
+ "removedIn": "23.0.0",
34564
+ "removedOn": "2024-10-16",
34565
+ "replacement": "typeof arg === 'symbol'",
34566
+ "source": "https://nodejs.org/api/deprecations.html#dep0057",
34567
+ "read": "2026-10-19"
34568
+ },
34569
+ {
34570
+ "id": "DEP0058",
34571
+ "ecosystem": "node",
34572
+ "pkg": "node",
34573
+ "pattern": "\\butil\\.isUndefined\\s*\\(",
34574
+ "deprecatedIn": "22.0.0",
34575
+ "deprecatedOn": "2024-04-24",
34576
+ "removedIn": "23.0.0",
34577
+ "removedOn": "2024-10-16",
34578
+ "replacement": "arg === undefined",
34579
+ "source": "https://nodejs.org/api/deprecations.html#dep0058",
34580
+ "read": "2026-10-19"
34581
+ },
34582
+ {
34583
+ "id": "DEP0059",
34584
+ "ecosystem": "node",
34585
+ "pkg": "node",
34586
+ "pattern": "\\butil\\.log\\s*\\(",
34587
+ "deprecatedIn": "22.0.0",
34588
+ "deprecatedOn": "2024-04-24",
34589
+ "removedIn": "23.0.0",
34590
+ "removedOn": "2024-10-16",
34591
+ "replacement": "console.log(new Date().toLocaleString(), message)",
34592
+ "source": "https://nodejs.org/api/deprecations.html#dep0059",
34593
+ "read": "2026-10-19"
34594
+ },
34595
+ {
34596
+ "id": "DEP0060",
34597
+ "ecosystem": "node",
34598
+ "pkg": "node",
34599
+ "pattern": "\\butil\\._extend\\s*\\(",
34600
+ "deprecatedIn": "22.0.0",
34601
+ "deprecatedOn": "2024-04-24",
34602
+ "removedIn": null,
34603
+ "removedOn": null,
34604
+ "replacement": "target = Object.assign(target, source)",
34605
+ "source": "https://nodejs.org/api/deprecations.html#dep0060",
34606
+ "read": "2026-10-19"
34607
+ },
34608
+ {
34609
+ "id": "DEP0061",
34610
+ "ecosystem": "node",
34611
+ "pkg": "node",
34612
+ "pattern": "(?:\\bfs\\.|(?<![\\w$.]))SyncWriteStream\\b",
34613
+ "deprecatedIn": "8.0.0",
34614
+ "deprecatedOn": "2017-05-30",
34615
+ "removedIn": "11.0.0",
34616
+ "removedOn": "2018-10-23",
34617
+ "replacement": "what Node's page for DEP0061 names",
34618
+ "source": "https://nodejs.org/api/deprecations.html#dep0061",
34619
+ "read": "2026-10-19"
34620
+ },
34621
+ {
34622
+ "id": "DEP0063",
34623
+ "ecosystem": "node",
34624
+ "pkg": "node",
34625
+ "pattern": "\\bServerResponse\\.prototype\\.writeHeader\\s*\\(",
34626
+ "deprecatedIn": "25.0.0",
34627
+ "deprecatedOn": "2025-10-15",
34628
+ "removedIn": "26.0.0",
34629
+ "removedOn": "2026-05-05",
34630
+ "replacement": "ServerResponse.prototype.writeHead()",
34631
+ "source": "https://nodejs.org/api/deprecations.html#dep0063",
34632
+ "read": "2026-10-19"
34633
+ },
34634
+ {
34635
+ "id": "DEP0064",
34636
+ "ecosystem": "node",
34637
+ "pkg": "node",
34638
+ "pattern": "\\btls\\.createSecurePair\\s*\\(",
34639
+ "deprecatedIn": "8.0.0",
34640
+ "deprecatedOn": "2017-05-30",
34641
+ "removedIn": "24.0.0",
34642
+ "removedOn": "2025-05-06",
34643
+ "replacement": "tls.Socket",
34644
+ "source": "https://nodejs.org/api/deprecations.html#dep0064",
34645
+ "read": "2026-10-19"
34646
+ },
34647
+ {
34648
+ "id": "DEP0065",
34649
+ "ecosystem": "node",
34650
+ "pkg": "node",
34651
+ "pattern": "(?:\\brepl\\.|(?<![\\w$.]))REPL_MODE_MAGIC\\b",
34652
+ "deprecatedIn": "8.0.0",
34653
+ "deprecatedOn": "2017-05-30",
34654
+ "removedIn": "10.0.0",
34655
+ "removedOn": "2018-04-24",
34656
+ "replacement": "REPL_MODE_SLOPPY",
34657
+ "source": "https://nodejs.org/api/deprecations.html#dep0065",
34658
+ "read": "2026-10-19"
34659
+ },
34660
+ {
34661
+ "id": "DEP0067",
34662
+ "ecosystem": "node",
34663
+ "pkg": "node",
34664
+ "pattern": "\\._renderHeaders\\b",
34665
+ "deprecatedIn": "8.0.0",
34666
+ "deprecatedOn": "2017-05-30",
34667
+ "removedIn": null,
34668
+ "removedOn": null,
34669
+ "replacement": "what Node's page for DEP0067 names",
34670
+ "source": "https://nodejs.org/api/deprecations.html#dep0067",
34671
+ "read": "2026-10-19"
34672
+ },
34673
+ {
34674
+ "id": "DEP0070",
34675
+ "ecosystem": "node",
34676
+ "pkg": "node",
34677
+ "pattern": "\\basync_hooks\\.currentId\\s*\\(",
34678
+ "deprecatedIn": "8.2.0",
34679
+ "deprecatedOn": "2017-07-19",
34680
+ "removedIn": "9.0.0",
34681
+ "removedOn": "2017-10-31",
34682
+ "replacement": "what Node's page for DEP0070 names",
34683
+ "source": "https://nodejs.org/api/deprecations.html#dep0070",
34684
+ "read": "2026-10-19"
34685
+ },
34686
+ {
34687
+ "id": "DEP0071",
34688
+ "ecosystem": "node",
34689
+ "pkg": "node",
34690
+ "pattern": "\\basync_hooks\\.triggerId\\s*\\(",
34691
+ "deprecatedIn": "8.2.0",
34692
+ "deprecatedOn": "2017-07-19",
34693
+ "removedIn": "9.0.0",
34694
+ "removedOn": "2017-10-31",
34695
+ "replacement": "what Node's page for DEP0071 names",
34696
+ "source": "https://nodejs.org/api/deprecations.html#dep0071",
34697
+ "read": "2026-10-19"
34698
+ },
34699
+ {
34700
+ "id": "DEP0072",
34701
+ "ecosystem": "node",
34702
+ "pkg": "node",
34703
+ "pattern": "\\basync_hooks\\.AsyncResource\\.triggerId\\s*\\(",
34704
+ "deprecatedIn": "8.2.0",
34705
+ "deprecatedOn": "2017-07-19",
34706
+ "removedIn": "9.0.0",
34707
+ "removedOn": "2017-10-31",
34708
+ "replacement": "what Node's page for DEP0072 names",
34709
+ "source": "https://nodejs.org/api/deprecations.html#dep0072",
34710
+ "read": "2026-10-19"
34711
+ },
34712
+ {
34713
+ "id": "DEP0074",
34714
+ "ecosystem": "node",
34715
+ "pkg": "node",
34716
+ "pattern": "\\bREPLServer\\.bufferedCommand\\b",
34717
+ "deprecatedIn": "9.0.0",
34718
+ "deprecatedOn": "2017-10-31",
34719
+ "removedIn": "15.0.0",
34720
+ "removedOn": "2020-10-20",
34721
+ "replacement": "what Node's page for DEP0074 names",
34722
+ "source": "https://nodejs.org/api/deprecations.html#dep0074",
34723
+ "read": "2026-10-19"
34724
+ },
34725
+ {
34726
+ "id": "DEP0075",
34727
+ "ecosystem": "node",
34728
+ "pkg": "node",
34729
+ "pattern": "\\bREPLServer\\.parseREPLKeyword\\s*\\(",
34730
+ "deprecatedIn": "9.0.0",
34731
+ "deprecatedOn": "2017-10-31",
34732
+ "removedIn": "15.0.0",
34733
+ "removedOn": "2020-10-20",
34734
+ "replacement": "what Node's page for DEP0075 names",
34735
+ "source": "https://nodejs.org/api/deprecations.html#dep0075",
34736
+ "read": "2026-10-19"
34737
+ },
34738
+ {
34739
+ "id": "DEP0076",
34740
+ "ecosystem": "node",
34741
+ "pkg": "node",
34742
+ "pattern": "\\btls\\.parseCertString\\s*\\(",
34743
+ "deprecatedIn": "9.0.0",
34744
+ "deprecatedOn": "2017-10-31",
34745
+ "removedIn": "18.0.0",
34746
+ "removedOn": "2022-04-18",
34747
+ "replacement": "what Node's page for DEP0076 names",
34748
+ "source": "https://nodejs.org/api/deprecations.html#dep0076",
34749
+ "read": "2026-10-19"
34750
+ },
34751
+ {
34752
+ "id": "DEP0077",
34753
+ "ecosystem": "node",
34754
+ "pkg": "node",
34755
+ "pattern": "\\bModule\\._debug\\s*\\(",
34756
+ "deprecatedIn": "9.0.0",
34757
+ "deprecatedOn": "2017-10-31",
34758
+ "removedIn": "25.0.0",
34759
+ "removedOn": "2025-10-15",
34760
+ "replacement": "what Node's page for DEP0077 names",
34761
+ "source": "https://nodejs.org/api/deprecations.html#dep0077",
34762
+ "read": "2026-10-19"
34763
+ },
34764
+ {
34765
+ "id": "DEP0078",
34766
+ "ecosystem": "node",
34767
+ "pkg": "node",
34768
+ "pattern": "\\bREPLServer\\.turnOffEditorMode\\s*\\(",
34769
+ "deprecatedIn": "9.0.0",
34770
+ "deprecatedOn": "2017-10-31",
34771
+ "removedIn": "15.0.0",
34772
+ "removedOn": "2020-10-20",
34773
+ "replacement": "what Node's page for DEP0078 names",
34774
+ "source": "https://nodejs.org/api/deprecations.html#dep0078",
34775
+ "read": "2026-10-19"
34776
+ },
34777
+ {
34778
+ "id": "DEP0080",
34779
+ "ecosystem": "node",
34780
+ "pkg": "node",
34781
+ "pattern": "\\bpath\\._makeLong\\s*\\(",
34782
+ "deprecatedIn": "9.0.0",
34783
+ "deprecatedOn": "2017-10-31",
34784
+ "removedIn": null,
34785
+ "removedOn": null,
34786
+ "replacement": "what Node's page for DEP0080 names",
34787
+ "source": "https://nodejs.org/api/deprecations.html#dep0080",
34788
+ "read": "2026-10-19"
34789
+ },
34790
+ {
34791
+ "id": "DEP0081",
34792
+ "ecosystem": "node",
34793
+ "pkg": "node",
34794
+ "pattern": "\\bfs\\.truncate\\s*\\(",
34795
+ "deprecatedIn": "9.0.0",
34796
+ "deprecatedOn": "2017-10-31",
34797
+ "removedIn": "24.0.0",
34798
+ "removedOn": "2025-05-06",
34799
+ "replacement": "fs.ftruncate()",
34800
+ "source": "https://nodejs.org/api/deprecations.html#dep0081",
34801
+ "read": "2026-10-19"
34802
+ },
34803
+ {
34804
+ "id": "DEP0082",
34805
+ "ecosystem": "node",
34806
+ "pkg": "node",
34807
+ "pattern": "\\bREPLServer\\.prototype\\.memory\\s*\\(",
34808
+ "deprecatedIn": "9.0.0",
34809
+ "deprecatedOn": "2017-10-31",
34810
+ "removedIn": "15.0.0",
34811
+ "removedOn": "2020-10-20",
34812
+ "replacement": "what Node's page for DEP0082 names",
34813
+ "source": "https://nodejs.org/api/deprecations.html#dep0082",
34814
+ "read": "2026-10-19"
34815
+ },
34816
+ {
34817
+ "id": "DEP0089",
34818
+ "ecosystem": "node",
34819
+ "pkg": "node",
34820
+ "pattern": "(?:require\\s*\\(|import\\s*\\(|from)\\s*['\"](?:node:)?assert['\"]",
34821
+ "deprecatedIn": "9.9.0",
34822
+ "deprecatedOn": "2018-03-21",
34823
+ "removedIn": null,
34824
+ "removedOn": null,
34825
+ "replacement": "what Node's page for DEP0089 names",
34826
+ "source": "https://nodejs.org/api/deprecations.html#dep0089",
34827
+ "read": "2026-10-19"
34828
+ },
34829
+ {
34830
+ "id": "DEP0091",
34831
+ "ecosystem": "node",
34832
+ "pkg": "node",
34833
+ "pattern": "(?:\\bcrypto\\.|(?<![\\w$.]))DEFAULT_ENCODING\\b",
34834
+ "deprecatedIn": "10.0.0",
34835
+ "deprecatedOn": "2018-04-24",
34836
+ "removedIn": "20.0.0",
34837
+ "removedOn": "2023-04-17",
34838
+ "replacement": "what Node's page for DEP0091 names",
34839
+ "source": "https://nodejs.org/api/deprecations.html#dep0091",
34840
+ "read": "2026-10-19"
34841
+ },
34842
+ {
34843
+ "id": "DEP0095",
34844
+ "ecosystem": "node",
34845
+ "pkg": "node",
34846
+ "pattern": "\\btimers\\.enroll\\s*\\(",
34847
+ "deprecatedIn": "10.0.0",
34848
+ "deprecatedOn": "2018-04-24",
34849
+ "removedIn": "24.0.0",
34850
+ "removedOn": "2025-05-06",
34851
+ "replacement": "what Node's page for DEP0095 names",
34852
+ "source": "https://nodejs.org/api/deprecations.html#dep0095",
34853
+ "read": "2026-10-19"
34854
+ },
34855
+ {
34856
+ "id": "DEP0096",
34857
+ "ecosystem": "node",
34858
+ "pkg": "node",
34859
+ "pattern": "\\btimers\\.unenroll\\s*\\(",
34860
+ "deprecatedIn": "10.0.0",
34861
+ "deprecatedOn": "2018-04-24",
34862
+ "removedIn": "24.0.0",
34863
+ "removedOn": "2025-05-06",
34864
+ "replacement": "what Node's page for DEP0096 names",
34865
+ "source": "https://nodejs.org/api/deprecations.html#dep0096",
34866
+ "read": "2026-10-19"
34867
+ },
34868
+ {
34869
+ "id": "DEP0100",
34870
+ "ecosystem": "node",
34871
+ "pkg": "node",
34872
+ "pattern": "\\bprocess\\.assert\\s*\\(",
34873
+ "deprecatedIn": "10.0.0",
34874
+ "deprecatedOn": "2018-04-24",
34875
+ "removedIn": "23.0.0",
34876
+ "removedOn": "2024-10-16",
34877
+ "replacement": "what Node's page for DEP0100 names",
34878
+ "source": "https://nodejs.org/api/deprecations.html#dep0100",
34879
+ "read": "2026-10-19"
34880
+ },
34881
+ {
34882
+ "id": "DEP0105",
34883
+ "ecosystem": "node",
34884
+ "pkg": "node",
34885
+ "pattern": "\\bdecipher\\.finaltol\\b",
34886
+ "deprecatedIn": "10.0.0",
34887
+ "deprecatedOn": "2018-04-24",
34888
+ "removedIn": "11.0.0",
34889
+ "removedOn": "2018-10-23",
34890
+ "replacement": "decipher.final()",
34891
+ "source": "https://nodejs.org/api/deprecations.html#dep0105",
34892
+ "read": "2026-10-19"
34893
+ },
34894
+ {
34895
+ "id": "DEP0106",
34896
+ "ecosystem": "node",
34897
+ "pkg": "node",
34898
+ "pattern": "(?:\\bcrypto\\.|(?<![\\w$.]))createCipher\\b|(?:\\bcrypto\\.|(?<![\\w$.]))createDecipher\\b",
34899
+ "deprecatedIn": "11.0.0",
34900
+ "deprecatedOn": "2018-10-23",
34901
+ "removedIn": "22.0.0",
34902
+ "removedOn": "2024-04-24",
34903
+ "replacement": "crypto.createCipheriv()",
34904
+ "source": "https://nodejs.org/api/deprecations.html#dep0106",
34905
+ "read": "2026-10-19"
34906
+ },
34907
+ {
34908
+ "id": "DEP0107",
34909
+ "ecosystem": "node",
34910
+ "pkg": "node",
34911
+ "pattern": "\\btls\\.convertNPNProtocols\\s*\\(",
34912
+ "deprecatedIn": "10.0.0",
34913
+ "deprecatedOn": "2018-04-24",
34914
+ "removedIn": "11.0.0",
34915
+ "removedOn": "2018-10-23",
34916
+ "replacement": "what Node's page for DEP0107 names",
34917
+ "source": "https://nodejs.org/api/deprecations.html#dep0107",
34918
+ "read": "2026-10-19"
34919
+ },
34920
+ {
34921
+ "id": "DEP0108",
34922
+ "ecosystem": "node",
34923
+ "pkg": "node",
34924
+ "pattern": "(?:\\bzlib\\.|(?<![\\w$.]))bytesRead\\b",
34925
+ "deprecatedIn": "11.0.0",
34926
+ "deprecatedOn": "2018-10-23",
34927
+ "removedIn": "23.0.0",
34928
+ "removedOn": "2024-10-16",
34929
+ "replacement": "what Node's page for DEP0108 names",
34930
+ "source": "https://nodejs.org/api/deprecations.html#dep0108",
34931
+ "read": "2026-10-19"
34932
+ },
34933
+ {
34934
+ "id": "DEP0111",
34935
+ "ecosystem": "node",
34936
+ "pkg": "node",
34937
+ "pattern": "\\bprocess\\.binding\\s*\\(",
34938
+ "deprecatedIn": "10.9.0",
34939
+ "deprecatedOn": "2018-08-15",
34940
+ "removedIn": null,
34941
+ "removedOn": null,
34942
+ "replacement": "what Node's page for DEP0111 names",
34943
+ "source": "https://nodejs.org/api/deprecations.html#dep0111",
34944
+ "read": "2026-10-19"
34945
+ },
34946
+ {
34947
+ "id": "DEP0113",
34948
+ "ecosystem": "node",
34949
+ "pkg": "node",
34950
+ "pattern": "\\bCipher\\.setAuthTag\\s*\\(",
34951
+ "deprecatedIn": "11.0.0",
34952
+ "deprecatedOn": "2018-10-23",
34953
+ "removedIn": "12.0.0",
34954
+ "removedOn": "2019-04-23",
34955
+ "replacement": "what Node's page for DEP0113 names",
34956
+ "source": "https://nodejs.org/api/deprecations.html#dep0113",
34957
+ "read": "2026-10-19"
34958
+ },
34959
+ {
34960
+ "id": "DEP0114",
34961
+ "ecosystem": "node",
34962
+ "pkg": "node",
34963
+ "pattern": "\\bcrypto\\._toBuf\\s*\\(",
34964
+ "deprecatedIn": "11.0.0",
34965
+ "deprecatedOn": "2018-10-23",
34966
+ "removedIn": "12.0.0",
34967
+ "removedOn": "2019-04-23",
34968
+ "replacement": "what Node's page for DEP0114 names",
34969
+ "source": "https://nodejs.org/api/deprecations.html#dep0114",
34970
+ "read": "2026-10-19"
34971
+ },
34972
+ {
34973
+ "id": "DEP0115",
34974
+ "ecosystem": "node",
34975
+ "pkg": "node",
34976
+ "pattern": "\\bcrypto\\.prng\\s*\\(",
34977
+ "deprecatedIn": "11.0.0",
34978
+ "deprecatedOn": "2018-10-23",
34979
+ "removedIn": null,
34980
+ "removedOn": null,
34981
+ "replacement": "what Node's page for DEP0115 names",
34982
+ "source": "https://nodejs.org/api/deprecations.html#dep0115",
34983
+ "read": "2026-10-19"
34984
+ },
34985
+ {
34986
+ "id": "DEP0118",
34987
+ "ecosystem": "node",
34988
+ "pkg": "node",
34989
+ "pattern": "\\bdns\\.lookup\\s*\\(",
34990
+ "deprecatedIn": "11.0.0",
34991
+ "deprecatedOn": "2018-10-23",
34992
+ "removedIn": "25.0.0",
34993
+ "removedOn": "2025-10-15",
34994
+ "replacement": "what Node's page for DEP0118 names",
34995
+ "source": "https://nodejs.org/api/deprecations.html#dep0118",
34996
+ "read": "2026-10-19"
34997
+ },
34998
+ {
34999
+ "id": "DEP0121",
35000
+ "ecosystem": "node",
35001
+ "pkg": "node",
35002
+ "pattern": "\\bnet\\._setSimultaneousAccepts\\s*\\(",
35003
+ "deprecatedIn": "12.0.0",
35004
+ "deprecatedOn": "2019-04-23",
35005
+ "removedIn": "24.0.0",
35006
+ "removedOn": "2025-05-06",
35007
+ "replacement": "what Node's page for DEP0121 names",
35008
+ "source": "https://nodejs.org/api/deprecations.html#dep0121",
35009
+ "read": "2026-10-19"
35010
+ },
35011
+ {
35012
+ "id": "DEP0122",
35013
+ "ecosystem": "node",
35014
+ "pkg": "node",
35015
+ "pattern": "\\bServer\\.prototype\\.setOptions\\s*\\(",
35016
+ "deprecatedIn": "12.0.0",
35017
+ "deprecatedOn": "2019-04-23",
35018
+ "removedIn": "24.0.0",
35019
+ "removedOn": "2025-05-06",
35020
+ "replacement": "Server.prototype.setSecureContext()",
35021
+ "source": "https://nodejs.org/api/deprecations.html#dep0122",
35022
+ "read": "2026-10-19"
35023
+ },
35024
+ {
35025
+ "id": "DEP0125",
35026
+ "ecosystem": "node",
35027
+ "pkg": "node",
35028
+ "pattern": "(?:require\\s*\\(|import\\s*\\(|from)\\s*['\"](?:node:)?_stream_wrap['\"]",
35029
+ "deprecatedIn": "12.0.0",
35030
+ "deprecatedOn": "2019-04-23",
35031
+ "removedIn": "26.0.0",
35032
+ "removedOn": "2026-05-05",
35033
+ "replacement": "what Node's page for DEP0125 names",
35034
+ "source": "https://nodejs.org/api/deprecations.html#dep0125",
35035
+ "read": "2026-10-19"
35036
+ },
35037
+ {
35038
+ "id": "DEP0126",
35039
+ "ecosystem": "node",
35040
+ "pkg": "node",
35041
+ "pattern": "\\btimers\\.active\\s*\\(",
35042
+ "deprecatedIn": "11.14.0",
35043
+ "deprecatedOn": "2019-04-10",
35044
+ "removedIn": "24.0.0",
35045
+ "removedOn": "2025-05-06",
35046
+ "replacement": "what Node's page for DEP0126 names",
35047
+ "source": "https://nodejs.org/api/deprecations.html#dep0126",
35048
+ "read": "2026-10-19"
35049
+ },
35050
+ {
35051
+ "id": "DEP0127",
35052
+ "ecosystem": "node",
35053
+ "pkg": "node",
35054
+ "pattern": "\\btimers\\._unrefActive\\s*\\(",
35055
+ "deprecatedIn": "11.14.0",
35056
+ "deprecatedOn": "2019-04-10",
35057
+ "removedIn": "24.0.0",
35058
+ "removedOn": "2025-05-06",
35059
+ "replacement": "what Node's page for DEP0127 names",
35060
+ "source": "https://nodejs.org/api/deprecations.html#dep0127",
35061
+ "read": "2026-10-19"
35062
+ },
35063
+ {
35064
+ "id": "DEP0129",
35065
+ "ecosystem": "node",
35066
+ "pkg": "node",
35067
+ "pattern": "\\bChildProcess\\._channel\\b",
35068
+ "deprecatedIn": "13.0.0",
35069
+ "deprecatedOn": "2019-10-22",
35070
+ "removedIn": "25.0.0",
35071
+ "removedOn": "2025-10-15",
35072
+ "replacement": "ChildProcess.channel",
35073
+ "source": "https://nodejs.org/api/deprecations.html#dep0129",
35074
+ "read": "2026-10-19"
35075
+ },
35076
+ {
35077
+ "id": "DEP0130",
35078
+ "ecosystem": "node",
35079
+ "pkg": "node",
35080
+ "pattern": "\\bModule\\.createRequireFromPath\\s*\\(",
35081
+ "deprecatedIn": "13.0.0",
35082
+ "deprecatedOn": "2019-10-22",
35083
+ "removedIn": "16.0.0",
35084
+ "removedOn": "2021-04-20",
35085
+ "replacement": "module.createRequire()",
35086
+ "source": "https://nodejs.org/api/deprecations.html#dep0130",
35087
+ "read": "2026-10-19"
35088
+ },
35089
+ {
35090
+ "id": "DEP0132",
35091
+ "ecosystem": "node",
35092
+ "pkg": "node",
35093
+ "pattern": "\\bworker\\.terminate\\s*\\(",
35094
+ "deprecatedIn": "12.5.0",
35095
+ "deprecatedOn": "2019-06-26",
35096
+ "removedIn": "25.0.0",
35097
+ "removedOn": "2025-10-15",
35098
+ "replacement": "what Node's page for DEP0132 names",
35099
+ "source": "https://nodejs.org/api/deprecations.html#dep0132",
35100
+ "read": "2026-10-19"
35101
+ },
35102
+ {
35103
+ "id": "DEP0134",
35104
+ "ecosystem": "node",
35105
+ "pkg": "node",
35106
+ "pattern": "(?:\\bprocess\\.|(?<![\\w$.]))_tickCallback\\b",
35107
+ "deprecatedIn": "12.12.0",
35108
+ "deprecatedOn": "2019-10-11",
35109
+ "removedIn": null,
35110
+ "removedOn": null,
35111
+ "replacement": "what Node's page for DEP0134 names",
35112
+ "source": "https://nodejs.org/api/deprecations.html#dep0134",
35113
+ "read": "2026-10-19"
35114
+ },
35115
+ {
35116
+ "id": "DEP0135",
35117
+ "ecosystem": "node",
35118
+ "pkg": "node",
35119
+ "pattern": "\\bWriteStream\\.open\\s*\\(",
35120
+ "deprecatedIn": "13.0.0",
35121
+ "deprecatedOn": "2019-10-22",
35122
+ "removedIn": "25.0.0",
35123
+ "removedOn": "2025-10-15",
35124
+ "replacement": "what Node's page for DEP0135 names",
35125
+ "source": "https://nodejs.org/api/deprecations.html#dep0135",
35126
+ "read": "2026-10-19"
35127
+ },
35128
+ {
35129
+ "id": "DEP0138",
35130
+ "ecosystem": "node",
35131
+ "pkg": "node",
35132
+ "pattern": "(?:\\bprocess\\.|(?<![\\w$.]))mainModule\\b",
35133
+ "deprecatedIn": "14.0.0",
35134
+ "deprecatedOn": "2020-04-21",
35135
+ "removedIn": null,
35136
+ "removedOn": null,
35137
+ "replacement": "what Node's page for DEP0138 names",
35138
+ "source": "https://nodejs.org/api/deprecations.html#dep0138",
35139
+ "read": "2026-10-19"
35140
+ },
35141
+ {
35142
+ "id": "DEP0139",
35143
+ "ecosystem": "node",
35144
+ "pkg": "node",
35145
+ "pattern": "\\bprocess\\.umask\\s*\\(",
35146
+ "deprecatedIn": "14.0.0",
35147
+ "deprecatedOn": "2020-04-21",
35148
+ "removedIn": null,
35149
+ "removedOn": null,
35150
+ "replacement": "what Node's page for DEP0139 names",
35151
+ "source": "https://nodejs.org/api/deprecations.html#dep0139",
35152
+ "read": "2026-10-19"
35153
+ },
35154
+ {
35155
+ "id": "DEP0141",
35156
+ "ecosystem": "node",
35157
+ "pkg": "node",
35158
+ "pattern": "(?:\\brepl\\.|(?<![\\w$.]))inputStream\\b|(?:\\brepl\\.|(?<![\\w$.]))outputStream\\b",
35159
+ "deprecatedIn": "14.3.0",
35160
+ "deprecatedOn": "2020-05-19",
35161
+ "removedIn": null,
35162
+ "removedOn": null,
35163
+ "replacement": ".input",
35164
+ "source": "https://nodejs.org/api/deprecations.html#dep0141",
35165
+ "read": "2026-10-19"
35166
+ },
35167
+ {
35168
+ "id": "DEP0142",
35169
+ "ecosystem": "node",
35170
+ "pkg": "node",
35171
+ "pattern": "(?:\\brepl\\.|(?<![\\w$.]))_builtinLibs\\b",
35172
+ "deprecatedIn": "14.3.0",
35173
+ "deprecatedOn": "2020-05-19",
35174
+ "removedIn": null,
35175
+ "removedOn": null,
35176
+ "replacement": "what Node's page for DEP0142 names",
35177
+ "source": "https://nodejs.org/api/deprecations.html#dep0142",
35178
+ "read": "2026-10-19"
35179
+ },
35180
+ {
35181
+ "id": "DEP0143",
35182
+ "ecosystem": "node",
35183
+ "pkg": "node",
35184
+ "pattern": "\\bTransform\\._transformState\\b",
35185
+ "deprecatedIn": "14.5.0",
35186
+ "deprecatedOn": "2020-06-30",
35187
+ "removedIn": "15.0.0",
35188
+ "removedOn": "2020-10-20",
35189
+ "replacement": "what Node's page for DEP0143 names",
35190
+ "source": "https://nodejs.org/api/deprecations.html#dep0143",
35191
+ "read": "2026-10-19"
35192
+ },
35193
+ {
35194
+ "id": "DEP0144",
35195
+ "ecosystem": "node",
35196
+ "pkg": "node",
35197
+ "pattern": "\\bmodule\\.parent\\b",
35198
+ "deprecatedIn": "14.6.0",
35199
+ "deprecatedOn": "2020-07-20",
35200
+ "removedIn": null,
35201
+ "removedOn": null,
35202
+ "replacement": "what Node's page for DEP0144 names",
35203
+ "source": "https://nodejs.org/api/deprecations.html#dep0144",
35204
+ "read": "2026-10-19"
35205
+ },
35206
+ {
35207
+ "id": "DEP0145",
35208
+ "ecosystem": "node",
35209
+ "pkg": "node",
35210
+ "pattern": "\\bsocket\\.bufferSize\\b",
35211
+ "deprecatedIn": "14.6.0",
35212
+ "deprecatedOn": "2020-07-20",
35213
+ "removedIn": null,
35214
+ "removedOn": null,
35215
+ "replacement": "what Node's page for DEP0145 names",
35216
+ "source": "https://nodejs.org/api/deprecations.html#dep0145",
35217
+ "read": "2026-10-19"
35218
+ },
35219
+ {
35220
+ "id": "DEP0146",
35221
+ "ecosystem": "node",
35222
+ "pkg": "node",
35223
+ "pattern": "\\bnew\\s+crypto\\.Certificate\\s*\\(",
35224
+ "deprecatedIn": "14.9.0",
35225
+ "deprecatedOn": "2020-08-27",
35226
+ "removedIn": null,
35227
+ "removedOn": null,
35228
+ "replacement": "what Node's page for DEP0146 names",
35229
+ "source": "https://nodejs.org/api/deprecations.html#dep0146",
35230
+ "read": "2026-10-19"
35231
+ },
35232
+ {
35233
+ "id": "DEP0161",
35234
+ "ecosystem": "node",
35235
+ "pkg": "node",
35236
+ "pattern": "\\bprocess\\._getActiveRequests\\s*\\(",
35237
+ "deprecatedIn": "17.6.0",
35238
+ "deprecatedOn": "2022-02-22",
35239
+ "removedIn": null,
35240
+ "removedOn": null,
35241
+ "replacement": "process.getActiveResourcesInfo()",
35242
+ "source": "https://nodejs.org/api/deprecations.html#dep0161",
35243
+ "read": "2026-10-19"
35244
+ },
35245
+ {
35246
+ "id": "DEP0162",
35247
+ "ecosystem": "node",
35248
+ "pkg": "node",
35249
+ "pattern": "\\bfs\\.write\\s*\\(",
35250
+ "deprecatedIn": "18.0.0",
35251
+ "deprecatedOn": "2022-04-18",
35252
+ "removedIn": "19.0.0",
35253
+ "removedOn": "2022-10-17",
35254
+ "replacement": "what Node's page for DEP0162 names",
35255
+ "source": "https://nodejs.org/api/deprecations.html#dep0162",
35256
+ "read": "2026-10-19"
35257
+ },
35258
+ {
35259
+ "id": "DEP0173",
35260
+ "ecosystem": "node",
35261
+ "pkg": "node",
35262
+ "pattern": "(?:\\bassert\\.|(?<![\\w$.]))CallTracker\\b",
35263
+ "deprecatedIn": "20.1.0",
35264
+ "deprecatedOn": "2023-05-03",
35265
+ "removedIn": "25.0.0",
35266
+ "removedOn": "2025-10-15",
35267
+ "replacement": "what Node's page for DEP0173 names",
35268
+ "source": "https://nodejs.org/api/deprecations.html#dep0173",
35269
+ "read": "2026-10-19"
35270
+ },
35271
+ {
35272
+ "id": "DEP0175",
35273
+ "ecosystem": "node",
35274
+ "pkg": "node",
35275
+ "pattern": "(?:\\butil\\.|(?<![\\w$.]))toUSVString\\b",
35276
+ "deprecatedIn": "20.8.0",
35277
+ "deprecatedOn": "2023-09-28",
35278
+ "removedIn": null,
35279
+ "removedOn": null,
35280
+ "replacement": "String.prototype.toWellFormed",
35281
+ "source": "https://nodejs.org/api/deprecations.html#dep0175",
35282
+ "read": "2026-10-19"
35283
+ },
35284
+ {
35285
+ "id": "DEP0176",
35286
+ "ecosystem": "node",
35287
+ "pkg": "node",
35288
+ "pattern": "(?:\\bfs\\.|(?<![\\w$.]))F_OK\\b|(?:\\bfs\\.|(?<![\\w$.]))R_OK\\b|(?:\\bfs\\.|(?<![\\w$.]))W_OK\\b|(?:\\bfs\\.|(?<![\\w$.]))X_OK\\b",
35289
+ "deprecatedIn": "24.0.0",
35290
+ "deprecatedOn": "2025-05-06",
35291
+ "removedIn": "25.0.0",
35292
+ "removedOn": "2025-10-15",
35293
+ "replacement": "what Node's page for DEP0176 names",
35294
+ "source": "https://nodejs.org/api/deprecations.html#dep0176",
35295
+ "read": "2026-10-19"
35296
+ },
35297
+ {
35298
+ "id": "DEP0177",
35299
+ "ecosystem": "node",
35300
+ "pkg": "node",
35301
+ "pattern": "\\butil\\.types\\.isWebAssemblyCompiledModule\\b",
35302
+ "deprecatedIn": "14.0.0",
35303
+ "deprecatedOn": "2020-04-21",
35304
+ "removedIn": "21.7.0",
35305
+ "removedOn": "2024-03-06",
35306
+ "replacement": "value instanceof WebAssembly.Module",
35307
+ "source": "https://nodejs.org/api/deprecations.html#dep0177",
35308
+ "read": "2026-10-19"
35309
+ },
35310
+ {
35311
+ "id": "DEP0178",
35312
+ "ecosystem": "node",
35313
+ "pkg": "node",
35314
+ "pattern": "\\bdirent\\.path\\b",
35315
+ "deprecatedIn": "23.0.0",
35316
+ "deprecatedOn": "2024-10-16",
35317
+ "removedIn": "24.0.0",
35318
+ "removedOn": "2025-05-06",
35319
+ "replacement": "dirent.parentPath",
35320
+ "source": "https://nodejs.org/api/deprecations.html#dep0178",
35321
+ "read": "2026-10-19"
35322
+ },
35323
+ {
35324
+ "id": "DEP0179",
35325
+ "ecosystem": "node",
35326
+ "pkg": "node",
35327
+ "pattern": "\\b(?:new\\s+)?Hash\\s*\\(",
35328
+ "deprecatedIn": "22.0.0",
35329
+ "deprecatedOn": "2024-04-24",
35330
+ "removedIn": null,
35331
+ "removedOn": null,
35332
+ "replacement": "what Node's page for DEP0179 names",
35333
+ "source": "https://nodejs.org/api/deprecations.html#dep0179",
35334
+ "read": "2026-10-19"
35335
+ },
35336
+ {
35337
+ "id": "DEP0180",
35338
+ "ecosystem": "node",
35339
+ "pkg": "node",
35340
+ "pattern": "\\b(?:new\\s+)?fs\\.Stats\\s*\\(",
35341
+ "deprecatedIn": "22.0.0",
35342
+ "deprecatedOn": "2024-04-24",
35343
+ "removedIn": null,
35344
+ "removedOn": null,
35345
+ "replacement": "what Node's page for DEP0180 names",
35346
+ "source": "https://nodejs.org/api/deprecations.html#dep0180",
35347
+ "read": "2026-10-19"
35348
+ },
35349
+ {
35350
+ "id": "DEP0181",
35351
+ "ecosystem": "node",
35352
+ "pkg": "node",
35353
+ "pattern": "\\b(?:new\\s+)?Hmac\\s*\\(",
35354
+ "deprecatedIn": "22.0.0",
35355
+ "deprecatedOn": "2024-04-24",
35356
+ "removedIn": null,
35357
+ "removedOn": null,
35358
+ "replacement": "what Node's page for DEP0181 names",
35359
+ "source": "https://nodejs.org/api/deprecations.html#dep0181",
35360
+ "read": "2026-10-19"
35361
+ },
35362
+ {
35363
+ "id": "DEP0184",
35364
+ "ecosystem": "node",
35365
+ "pkg": "node",
35366
+ "pattern": "(?<!new\\s+)\\bzlib\\.[A-Z][A-Za-z0-9]*\\s*\\(",
35367
+ "deprecatedIn": "24.0.0",
35368
+ "deprecatedOn": "2025-05-06",
35369
+ "removedIn": null,
35370
+ "removedOn": null,
35371
+ "replacement": "what Node's page for DEP0184 names",
35372
+ "source": "https://nodejs.org/api/deprecations.html#dep0184",
35373
+ "read": "2026-10-19"
35374
+ },
35375
+ {
35376
+ "id": "DEP0185",
35377
+ "ecosystem": "node",
35378
+ "pkg": "node",
35379
+ "pattern": "(?<!new\\s+)\\brepl\\.[A-Z][A-Za-z0-9]*\\s*\\(",
35380
+ "deprecatedIn": "24.0.0",
35381
+ "deprecatedOn": "2025-05-06",
35382
+ "removedIn": "25.0.0",
35383
+ "removedOn": "2025-10-15",
35384
+ "replacement": "what Node's page for DEP0185 names",
35385
+ "source": "https://nodejs.org/api/deprecations.html#dep0185",
35386
+ "read": "2026-10-19"
35387
+ },
35388
+ {
35389
+ "id": "DEP0188",
35390
+ "ecosystem": "node",
35391
+ "pkg": "node",
35392
+ "pattern": "\\bprocess\\.features\\.ipv6\\b|\\bprocess\\.features\\.uv\\b",
35393
+ "deprecatedIn": "23.4.0",
35394
+ "deprecatedOn": "2024-12-10",
35395
+ "removedIn": null,
35396
+ "removedOn": null,
35397
+ "replacement": "what Node's page for DEP0188 names",
35398
+ "source": "https://nodejs.org/api/deprecations.html#dep0188",
35399
+ "read": "2026-10-19"
35400
+ },
35401
+ {
35402
+ "id": "DEP0189",
35403
+ "ecosystem": "node",
35404
+ "pkg": "node",
35405
+ "pattern": "\\bprocess\\.features\\.tls_\\w+",
35406
+ "deprecatedIn": "23.4.0",
35407
+ "deprecatedOn": "2024-12-10",
35408
+ "removedIn": null,
35409
+ "removedOn": null,
35410
+ "replacement": "what Node's page for DEP0189 names",
35411
+ "source": "https://nodejs.org/api/deprecations.html#dep0189",
35412
+ "read": "2026-10-19"
35413
+ },
35414
+ {
35415
+ "id": "DEP0191",
35416
+ "ecosystem": "node",
35417
+ "pkg": "node",
35418
+ "pattern": "(?:\\brepl\\.|(?<![\\w$.]))builtinModules\\b",
35419
+ "deprecatedIn": "24.0.0",
35420
+ "deprecatedOn": "2025-05-06",
35421
+ "removedIn": null,
35422
+ "removedOn": null,
35423
+ "replacement": "what Node's page for DEP0191 names",
35424
+ "source": "https://nodejs.org/api/deprecations.html#dep0191",
35425
+ "read": "2026-10-19"
35426
+ },
35427
+ {
35428
+ "id": "DEP0192",
35429
+ "ecosystem": "node",
35430
+ "pkg": "node",
35431
+ "pattern": "(?:require\\s*\\(|import\\s*\\(|from)\\s*['\"](?:node:)?_tls_common['\"]|(?:require\\s*\\(|import\\s*\\(|from)\\s*['\"](?:node:)?_tls_wrap['\"]",
35432
+ "deprecatedIn": "24.2.0",
35433
+ "deprecatedOn": "2025-06-09",
35434
+ "removedIn": null,
35435
+ "removedOn": null,
35436
+ "replacement": "node:tls",
35437
+ "source": "https://nodejs.org/api/deprecations.html#dep0192",
35438
+ "read": "2026-10-19"
35439
+ },
35440
+ {
35441
+ "id": "DEP0193",
35442
+ "ecosystem": "node",
35443
+ "pkg": "node",
35444
+ "pattern": "(?:require\\s*\\(|import\\s*\\(|from)\\s*['\"](?:node:)?_stream_\\w+['\"]",
35445
+ "deprecatedIn": "24.2.0",
35446
+ "deprecatedOn": "2025-06-09",
35447
+ "removedIn": "26.0.0",
35448
+ "removedOn": "2026-05-05",
35449
+ "replacement": "node:stream",
35450
+ "source": "https://nodejs.org/api/deprecations.html#dep0193",
35451
+ "read": "2026-10-19"
35452
+ },
35453
+ {
35454
+ "id": "DEP0195",
35455
+ "ecosystem": "node",
35456
+ "pkg": "node",
35457
+ "pattern": "(?<!new\\s+)\\bhttp\\.[A-Z][A-Za-z0-9]*\\s*\\(",
35458
+ "deprecatedIn": "24.2.0",
35459
+ "deprecatedOn": "2025-06-09",
35460
+ "removedIn": null,
35461
+ "removedOn": null,
35462
+ "replacement": "what Node's page for DEP0195 names",
35463
+ "source": "https://nodejs.org/api/deprecations.html#dep0195",
35464
+ "read": "2026-10-19"
35465
+ },
35466
+ {
35467
+ "id": "DEP0196",
35468
+ "ecosystem": "node",
35469
+ "pkg": "node",
35470
+ "pattern": "\\bshell\\s*:\\s*(['\"`])\\1",
35471
+ "deprecatedIn": "24.2.0",
35472
+ "deprecatedOn": "2025-06-09",
35473
+ "removedIn": null,
35474
+ "removedOn": null,
35475
+ "replacement": "{ shell: true }",
35476
+ "source": "https://nodejs.org/api/deprecations.html#dep0196",
35477
+ "read": "2026-10-19"
35478
+ },
35479
+ {
35480
+ "id": "DEP0197",
35481
+ "ecosystem": "node",
35482
+ "pkg": "node",
35483
+ "pattern": "\\butil\\.types\\.isNativeError\\s*\\(",
35484
+ "deprecatedIn": "24.2.0",
35485
+ "deprecatedOn": "2025-06-09",
35486
+ "removedIn": null,
35487
+ "removedOn": null,
35488
+ "replacement": "Error.isError",
35489
+ "source": "https://nodejs.org/api/deprecations.html#dep0197",
35490
+ "read": "2026-10-19"
35491
+ },
35492
+ {
35493
+ "id": "DEP0199",
35494
+ "ecosystem": "node",
35495
+ "pkg": "node",
35496
+ "pattern": "(?:require\\s*\\(|import\\s*\\(|from)\\s*['\"](?:node:)?_http_\\w+['\"]",
35497
+ "deprecatedIn": "24.6.0",
35498
+ "deprecatedOn": "2025-08-14",
35499
+ "removedIn": null,
35500
+ "removedOn": null,
35501
+ "replacement": "node:http",
35502
+ "source": "https://nodejs.org/api/deprecations.html#dep0199",
35503
+ "read": "2026-10-19"
35504
+ },
35505
+ {
35506
+ "id": "DEP0201",
35507
+ "ecosystem": "node",
35508
+ "pkg": "node",
35509
+ "pattern": "\\bDuplex\\.toWeb\\s*\\([^;]*\\btype\\s*:",
35510
+ "deprecatedIn": "26.0.0",
35511
+ "deprecatedOn": "2026-05-05",
35512
+ "removedIn": null,
35513
+ "removedOn": null,
35514
+ "replacement": "what Node's page for DEP0201 names",
35515
+ "source": "https://nodejs.org/api/deprecations.html#dep0201",
35516
+ "read": "2026-10-19"
35517
+ },
35518
+ {
35519
+ "id": "DEP0202",
35520
+ "ecosystem": "node",
35521
+ "pkg": "node",
35522
+ "pattern": "\\bHttp1IncomingMessage\\b|\\bHttp1ServerResponse\\b",
35523
+ "deprecatedIn": "25.7.0",
35524
+ "deprecatedOn": "2026-02-24",
35525
+ "removedIn": null,
35526
+ "removedOn": null,
35527
+ "replacement": "http1Options.IncomingMessage",
35528
+ "source": "https://nodejs.org/api/deprecations.html#dep0202",
35529
+ "read": "2026-10-19"
35530
+ },
35531
+ {
35532
+ "id": "DEP0204",
35533
+ "ecosystem": "node",
35534
+ "pkg": "node",
35535
+ "pattern": "\\bKeyObject\\.from\\s*\\(",
35536
+ "deprecatedIn": "26.0.0",
35537
+ "deprecatedOn": "2026-05-05",
35538
+ "removedIn": null,
35539
+ "removedOn": null,
35540
+ "replacement": "what Node's page for DEP0204 names",
35541
+ "source": "https://nodejs.org/api/deprecations.html#dep0204",
35542
+ "read": "2026-10-19"
35543
+ },
35544
+ {
35545
+ "id": "DEP0205",
35546
+ "ecosystem": "node",
35547
+ "pkg": "node",
35548
+ "pattern": "\\bmodule\\.register\\s*\\(",
35549
+ "deprecatedIn": "26.0.0",
35550
+ "deprecatedOn": "2026-05-05",
35551
+ "removedIn": null,
35552
+ "removedOn": null,
35553
+ "replacement": "module.registerHooks()",
35554
+ "source": "https://nodejs.org/api/deprecations.html#dep0205",
35555
+ "read": "2026-10-19"
35556
+ },
35557
+ {
35558
+ "id": "DEP0208",
35559
+ "ecosystem": "node",
35560
+ "pkg": "node",
35561
+ "pattern": "\\._listen2\\b",
35562
+ "deprecatedIn": "26.8.2",
35563
+ "deprecatedOn": "2026-09-09",
35564
+ "removedIn": null,
35565
+ "removedOn": null,
35566
+ "replacement": "server.listen()",
35567
+ "source": "https://nodejs.org/api/deprecations.html#dep0208",
35568
+ "read": "2026-10-19"
35569
+ },
35570
+ {
35571
+ "id": "DEP0210",
35572
+ "ecosystem": "node",
35573
+ "pkg": "node",
35574
+ "pattern": "(?:\\bsqlite\\.|(?<![\\w$.]))DatabaseSync\\b",
35575
+ "deprecatedIn": "26.11.0",
35576
+ "deprecatedOn": "2026-10-07",
35577
+ "removedIn": null,
35578
+ "removedOn": null,
35579
+ "replacement": "Database",
35580
+ "source": "https://nodejs.org/api/deprecations.html#dep0210",
35581
+ "read": "2026-10-19"
35582
+ },
35583
+ {
35584
+ "id": "DEP0211",
35585
+ "ecosystem": "node",
35586
+ "pkg": "node",
35587
+ "pattern": "(?:\\bsqlite\\.|(?<![\\w$.]))StatementSync\\b",
35588
+ "deprecatedIn": "26.11.0",
35589
+ "deprecatedOn": "2026-10-07",
35590
+ "removedIn": null,
35591
+ "removedOn": null,
35592
+ "replacement": "Statement",
35593
+ "source": "https://nodejs.org/api/deprecations.html#dep0211",
35594
+ "read": "2026-10-19"
35595
+ }
35596
+ ];
35597
+
33902
35598
  //#endregion
33903
35599
  //#region ../review/src/deprecations.ts
33904
35600
  const JS$2 = /\.(m|c)?(j|t)sx?$/;
@@ -34071,8 +35767,47 @@ function declaredVersions(contents) {
34071
35767
  }
34072
35768
  return out;
34073
35769
  }
35770
+ /** The catalogue a review matches: the hand-written floor above, then every Node deprecation its publisher lists that the floor does not. */
35771
+ const CATALOGUE = withGenerated(DEPRECATIONS, entries);
35772
+ let live = null;
35773
+ let restUntil = 0;
35774
+ /** The catalogue a review matches now: the publisher's list as last read here, else the kept file. */
35775
+ const currentCatalogue = () => live?.catalogue ?? CATALOGUE;
35776
+ async function refreshDeprecations(o = {}) {
35777
+ const now = o.now ?? Date.now();
35778
+ if (live && now - live.at < 864e5) return {
35779
+ read: live.read,
35780
+ entries: live.catalogue.length
35781
+ };
35782
+ if (now < restUntil) return { kept: "Node's pages did not answer within the hour - the kept list stands" };
35783
+ const get = o.get ?? (async (url) => {
35784
+ const r = await fetch(url, { signal: AbortSignal.timeout(5e3) });
35785
+ if (!r.ok) throw new Error(`${url} answered ${r.status}`);
35786
+ return r.json();
35787
+ });
35788
+ try {
35789
+ const read = new Date(now).toISOString().slice(0, 10);
35790
+ const entries$1 = fromNodeDocs(await get(NODE_DEPRECATIONS_URL), await get(NODE_RELEASES_URL), read);
35791
+ if (entries$1.length < 20) {
35792
+ restUntil = now + 36e5;
35793
+ return { kept: `Node's pages gave ${entries$1.length} usable entries - the kept list stands` };
35794
+ }
35795
+ live = {
35796
+ at: now,
35797
+ read,
35798
+ catalogue: withGenerated(DEPRECATIONS, entries$1)
35799
+ };
35800
+ return {
35801
+ read,
35802
+ entries: entries$1.length
35803
+ };
35804
+ } catch (e$1) {
35805
+ restUntil = now + 36e5;
35806
+ return { kept: `Node's pages did not answer (${String(e$1?.message ?? e$1).slice(0, 120)}) - the kept list stands` };
35807
+ }
35808
+ }
34074
35809
  /** Each added use of a deprecated or removed API, against the version the repository declares, with its dated source. */
34075
- function deprecationFindings(files, contents = {}, catalogue = DEPRECATIONS) {
35810
+ function deprecationFindings(files, contents = {}, catalogue = currentCatalogue()) {
34076
35811
  const versions = declaredVersions(contents);
34077
35812
  const out = [];
34078
35813
  for (const f of files) for (const { line, text } of addedLines(f)) for (const d of catalogue) {
@@ -37771,6 +39506,9 @@ const SCHEME_FACTS = {
37771
39506
  const UNHELD_REVIEWS_A_DAY = 20;
37772
39507
  /** What a pull request past that bound is told, once, when it opens. */
37773
39508
  const UNHELD_LINE = `Xovris has already reviewed ${UNHELD_REVIEWS_A_DAY} pull requests today for this installation, which no Xovris workspace holds yet, so this one is not reviewed. Connect the repository in Xovris under Connections, GitHub (free to start) and every pull request is reviewed, with each fix proven before it is offered - or say \`@xovris review\` here tomorrow.`;
39509
+ /** KEEP (the provider's own limits, each with its reason): GitHub serves a file's contents up to 100 MB (raw media type); a code search
39510
+ * page holds at most 100 results; and its secondary rate limit refuses bursts, so files are asked for eight at a time. */
39511
+ const GITHUB_RAW_MAX_BYTES = 100 * 1024 * 1024;
37774
39512
 
37775
39513
  //#endregion
37776
39514
  //#region ../review/src/hosts.ts
@@ -39759,11 +41497,11 @@ const SEED_GRAMMARS = [
39759
41497
  /** Splits a file holding git conflict markers (with or without the diff3 base) into its plain lines and its hunks. */
39760
41498
  function parseConflicts(text) {
39761
41499
  const lines = text.split("\n");
39762
- const parts$1 = [];
41500
+ const parts$2 = [];
39763
41501
  const hunks = [];
39764
41502
  for (let i = 0; i < lines.length; i += 1) {
39765
41503
  if (!lines[i].startsWith("<<<<<<< ")) {
39766
- parts$1.push(lines[i]);
41504
+ parts$2.push(lines[i]);
39767
41505
  continue;
39768
41506
  }
39769
41507
  const h = {
@@ -39788,12 +41526,12 @@ function parseConflicts(text) {
39788
41526
  if (l.startsWith(">>>>>>> ") || l === ">>>>>>>") break;
39789
41527
  (side === "ours" ? h.ours : side === "base" ? h.base : h.theirs).push(l);
39790
41528
  }
39791
- parts$1.push(h);
41529
+ parts$2.push(h);
39792
41530
  hunks.push(h);
39793
41531
  i = j;
39794
41532
  }
39795
41533
  return {
39796
- parts: parts$1,
41534
+ parts: parts$2,
39797
41535
  hunks
39798
41536
  };
39799
41537
  }
@@ -39860,11 +41598,11 @@ function resolveHunk(h) {
39860
41598
  }
39861
41599
  /** Every hunk of a file; the file is resolved only when every hunk is, never half. */
39862
41600
  function resolveConflicts(text) {
39863
- const { parts: parts$1, hunks } = parseConflicts(text);
41601
+ const { parts: parts$2, hunks } = parseConflicts(text);
39864
41602
  const resolved = [];
39865
41603
  const unresolved = [];
39866
41604
  const out = [];
39867
- for (const p$1 of parts$1) {
41605
+ for (const p$1 of parts$2) {
39868
41606
  if (typeof p$1 === "string") {
39869
41607
  out.push(p$1);
39870
41608
  continue;
@@ -40313,7 +42051,7 @@ function checkFacetQuery(raw) {
40313
42051
  const run$1 = promisify(execFile);
40314
42052
  const tail = (s) => s.trim().split("\n").slice(-12).join("\n").slice(-1500);
40315
42053
  const names = (xs) => xs.map((x) => x.id).join(", ");
40316
- async function runMergeQueue(entries, o) {
42054
+ async function runMergeQueue(entries$1, o) {
40317
42055
  const from = await o.repo.tip(o.start ?? o.base);
40318
42056
  const out = {
40319
42057
  base: o.base,
@@ -40325,13 +42063,13 @@ async function runMergeQueue(entries, o) {
40325
42063
  said: ""
40326
42064
  };
40327
42065
  if (!from) {
40328
- out.untried = entries.map((e$1) => e$1.id);
42066
+ out.untried = entries$1.map((e$1) => e$1.id);
40329
42067
  out.said = `The base branch ${o.base} was not found, so nothing was merged.`;
40330
42068
  return out;
40331
42069
  }
40332
42070
  let cur = from;
40333
- for (let i = 0; i < entries.length; i += 1) {
40334
- const e$1 = entries[i];
42071
+ for (let i = 0; i < entries$1.length; i += 1) {
42072
+ const e$1 = entries$1[i];
40335
42073
  if (e$1.missing) {
40336
42074
  out.removed.push({
40337
42075
  id: e$1.id,
@@ -40375,7 +42113,7 @@ async function runMergeQueue(entries, o) {
40375
42113
  }
40376
42114
  const moved = await o.repo.advance(o.base, cur, t.sha);
40377
42115
  if (!moved.ok) {
40378
- out.untried = entries.slice(i).map((x) => x.id);
42116
+ out.untried = entries$1.slice(i).map((x) => x.id);
40379
42117
  out.said = `The queue stopped: ${moved.why}. ${out.merged.length} merged before it; the rest were not tried, and run again from the base as it now stands.`;
40380
42118
  out.to = cur;
40381
42119
  return out;
@@ -40388,13 +42126,13 @@ async function runMergeQueue(entries, o) {
40388
42126
  });
40389
42127
  }
40390
42128
  out.to = cur;
40391
- out.said = `${out.merged.length} of ${entries.length} merged into ${o.base}, its tests green on each merge before ${o.base} moved to it${out.removed.length ? `; ${out.removed.length} taken out: ${out.removed.map((r) => `${r.id} - ${r.why}`).join("; ")}` : ""}.`;
42129
+ out.said = `${out.merged.length} of ${entries$1.length} merged into ${o.base}, its tests green on each merge before ${o.base} moved to it${out.removed.length ? `; ${out.removed.length} taken out: ${out.removed.map((r) => `${r.id} - ${r.why}`).join("; ")}` : ""}.`;
40392
42130
  return out;
40393
42131
  }
40394
42132
  /** The order a queue takes: pull requests in the order asked, then Xovris's own proven fix stack in its own order (bottom first). */
40395
- function queueOrder(entries) {
40396
- const fixes = entries.filter((e$1) => /(^|\/)xovris\/fix-/.test(e$1.ref));
40397
- return [...entries.filter((e$1) => !fixes.includes(e$1)), ...fixes];
42133
+ function queueOrder(entries$1) {
42134
+ const fixes = entries$1.filter((e$1) => /(^|\/)xovris\/fix-/.test(e$1.ref));
42135
+ return [...entries$1.filter((e$1) => !fixes.includes(e$1)), ...fixes];
40398
42136
  }
40399
42137
  /**
40400
42138
  * The queue on a real git repository: each trial in a scratch working tree inside the repository's own .git (so the packages it
@@ -42899,4 +44637,4 @@ async function huntRepository(root, o = {}) {
42899
44637
  }
42900
44638
 
42901
44639
  //#endregion
42902
- export { contentDigest as A, readsForShape as B, hostRest as C, filesOf as D, undoFixes as E, leaveBy as F, assumptionsOf as G, census as H, forAgents as I, newFileDiff as J, probeNames as K, readsForReview as L, applyGuarded as M, jobRunner as N, guardStrip as O, handOff as P, reviewChange as R, hostAuth as S, commandRunner as T, dirReader as U, testsFirst as V, workOut as W, SEVERITIES as X, parseDiff as Y, SEVERITY_LABEL as Z, followFix as _, runMergeQueue as a, parseError as b, FACET_AXES as c, generateTests as d, proveResolution as f, fixTraced as g, revertOne as h, queueOrder as i, valueCopy as j, writeProven as k, checkFacetQuery as l, fixAll as m, HUNT_CLASSES as n, EFFORTS as o, touchesFor as p, readingsOf as q, gitQueueRepo as r, EFFORT_UNMEASURED as s, huntRepository as t, applyTouches as u, locate as v, githubRest as w, traceError as x, openTraced as y, stackChain as z };
44640
+ export { contentDigest as A, readsForShape as B, hostRest as C, filesOf as D, undoFixes as E, leaveBy as F, workOut as G, refreshDeprecations as H, forAgents as I, readingsOf as J, assumptionsOf as K, readsForReview as L, applyGuarded as M, jobRunner as N, guardStrip as O, handOff as P, SEVERITY_LABEL as Q, reviewChange as R, hostAuth as S, commandRunner as T, census as U, testsFirst as V, dirReader as W, parseDiff as X, newFileDiff as Y, SEVERITIES as Z, followFix as _, runMergeQueue as a, parseError as b, FACET_AXES as c, generateTests as d, proveResolution as f, fixTraced as g, revertOne as h, queueOrder as i, valueCopy as j, writeProven as k, checkFacetQuery as l, fixAll as m, HUNT_CLASSES as n, EFFORTS as o, touchesFor as p, probeNames as q, gitQueueRepo as r, EFFORT_UNMEASURED as s, huntRepository as t, applyTouches as u, locate as v, githubRest as w, traceError as x, openTraced as y, stackChain as z };