From c8b9b348a0928f797eabd264b0a433458c0b9656 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Tue, 21 Oct 2025 10:56:15 +0200 Subject: [PATCH 01/12] feat(`http2-priority-signaling`): introduce --- package-lock.json | 15 + recipes/http2-priority-signaling/README.md | 53 +++ recipes/http2-priority-signaling/codemod.yaml | 23 ++ recipes/http2-priority-signaling/package.json | 24 ++ .../http2-priority-signaling/src/workflow.ts | 361 ++++++++++++++++++ .../tests/expected/case1-connect-priority.js | 2 + .../tests/expected/case2-request-priority.js | 4 + .../expected/case3-stream-priority-method.js | 1 + .../expected/case4-settings-priority-esm.mjs | 3 + .../tests/input/case1-connect-priority.js | 8 + .../tests/input/case2-request-priority.js | 5 + .../input/case3-stream-priority-method.js | 6 + .../input/case4-settings-priority-esm.mjs | 3 + .../http2-priority-signaling/workflow.yaml | 25 ++ 14 files changed, 533 insertions(+) create mode 100644 recipes/http2-priority-signaling/README.md create mode 100644 recipes/http2-priority-signaling/codemod.yaml create mode 100644 recipes/http2-priority-signaling/package.json create mode 100644 recipes/http2-priority-signaling/src/workflow.ts create mode 100644 recipes/http2-priority-signaling/tests/expected/case1-connect-priority.js create mode 100644 recipes/http2-priority-signaling/tests/expected/case2-request-priority.js create mode 100644 recipes/http2-priority-signaling/tests/expected/case3-stream-priority-method.js create mode 100644 recipes/http2-priority-signaling/tests/expected/case4-settings-priority-esm.mjs create mode 100644 recipes/http2-priority-signaling/tests/input/case1-connect-priority.js create mode 100644 recipes/http2-priority-signaling/tests/input/case2-request-priority.js create mode 100644 recipes/http2-priority-signaling/tests/input/case3-stream-priority-method.js create mode 100644 recipes/http2-priority-signaling/tests/input/case4-settings-priority-esm.mjs create mode 100644 recipes/http2-priority-signaling/workflow.yaml diff --git a/package-lock.json b/package-lock.json index 802c1bd9..20131783 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1485,6 +1485,10 @@ "resolved": "recipes/http-classes-with-new", "link": true }, + "node_modules/@nodejs/http2-priority-signaling": { + "resolved": "recipes/http2-priority-signaling", + "link": true + }, "node_modules/@nodejs/import-assertions-to-attributes": { "resolved": "recipes/import-assertions-to-attributes", "link": true @@ -4323,6 +4327,17 @@ "@codemod.com/jssg-types": "^1.0.9" } }, + "recipes/http2-priority-signaling": { + "name": "@nodejs/http2-priority-signaling", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@nodejs/codemod-utils": "*" + }, + "devDependencies": { + "@codemod.com/jssg-types": "^1.0.9" + } + }, "recipes/import-assertions-to-attributes": { "name": "@nodejs/import-assertions-to-attributes", "version": "1.0.0", diff --git a/recipes/http2-priority-signaling/README.md b/recipes/http2-priority-signaling/README.md new file mode 100644 index 00000000..9e0bc5a7 --- /dev/null +++ b/recipes/http2-priority-signaling/README.md @@ -0,0 +1,53 @@ +# HTTP/2 Priority Signaling Removal - DEP0194 + +This recipe removes HTTP/2 priority-related options and methods since priority signaling has been deprecated. + +See [DEP0194](https://nodejs.org/api/deprecations.html#DEP0194). + + +## What this codemod does + +- Removes the `priority` property from `http2.connect()` call options +- Removes the `priority` property from `session.request()` call options +- Removes entire `stream.priority()` method call statements +- Removes the `priority` property from `client.settings()` call options +- Handles both CommonJS (`require()`) and ESM (`import`) imports + +## Examples + +**Before:** + +```js +// CommonJS usage +const http2 = require("node:http2"); +const session = http2.connect("https://example.com", { + priority: { weight: 16, parent: 0, exclusive: false } +}); +const stream = session.request({ + ":path": "/api/data", + priority: { weight: 32 } +}); +stream.priority({ exclusive: true, parent: 0, weight: 128 }); + +// ESM usage +import http2 from "node:http2"; +const client = http2.connect("https://example.com"); +client.settings({ enablePush: false, priority: true }); +``` + +**After:** + +```js +// CommonJS usage +const http2 = require("node:http2"); +const session = http2.connect("https://example.com"); +const stream = session.request({ + ":path": "/api/data" +}); +// stream.priority() removed + +// ESM usage +import http2 from "node:http2"; +const client = http2.connect("https://example.com"); +client.settings({ enablePush: false }); +``` diff --git a/recipes/http2-priority-signaling/codemod.yaml b/recipes/http2-priority-signaling/codemod.yaml new file mode 100644 index 00000000..dd78010e --- /dev/null +++ b/recipes/http2-priority-signaling/codemod.yaml @@ -0,0 +1,23 @@ +schema_version: "1.0" +name: "@nodejs/http2-priority-signaling" +version: 1.0.0 +description: Handle DEP0194 via removing HTTP/2 priority-related options and methods. +author: Augustin Mauroy +license: MIT +workflow: workflow.yaml +category: migration + +targets: + languages: + - javascript + - typescript + +keywords: + - transformation + - migration + - http2 + - deprecation + +registry: + access: public + visibility: public diff --git a/recipes/http2-priority-signaling/package.json b/recipes/http2-priority-signaling/package.json new file mode 100644 index 00000000..477c0091 --- /dev/null +++ b/recipes/http2-priority-signaling/package.json @@ -0,0 +1,24 @@ +{ + "name": "@nodejs/http2-priority-signaling", + "version": "1.0.0", + "description": "Handle DEP0194 via removing HTTP/2 priority-related options and methods", + "type": "module", + "scripts": { + "test": "npx codemod jssg test -l typescript ./src/workflow.ts ./" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/nodejs/userland-migrations.git", + "directory": "recipes/http2-priority-signaling", + "bugs": "https://github.com/nodejs/userland-migrations/issues" + }, + "author": "Augustin Mauroy", + "license": "MIT", + "homepage": "https://github.com/nodejs/userland-migrations/blob/main/recipes/http2-priority-signaling/README.md", + "devDependencies": { + "@codemod.com/jssg-types": "^1.0.9" + }, + "dependencies": { + "@nodejs/codemod-utils": "*" + } +} diff --git a/recipes/http2-priority-signaling/src/workflow.ts b/recipes/http2-priority-signaling/src/workflow.ts new file mode 100644 index 00000000..3afc5470 --- /dev/null +++ b/recipes/http2-priority-signaling/src/workflow.ts @@ -0,0 +1,361 @@ +import type { + Edit, + Range, + SgNode, + SgRoot, +} from "@codemod.com/jssg-types/main"; +import type Js from "@codemod.com/jssg-types/langs/javascript"; +import { getNodeRequireCalls } from "@nodejs/codemod-utils/ast-grep/require-call"; +import { getNodeImportStatements } from "@nodejs/codemod-utils/ast-grep/import-statement"; +import { removeLines } from "@nodejs/codemod-utils/ast-grep/remove-lines"; + +/* + * Transforms HTTP/2 priority-related options and methods. + * + * Steps: + * + * 1. Find all http2 imports and require calls + * 2. Find and remove priority property from connect() options + * 3. Find and remove priority property from request() options + * 4. Find and remove complete stream.priority() calls + * 5. Find and remove priority property from settings() options + */ +export default function transform(root: SgRoot): string | null { + const rootNode = root.root(); + const edits: Edit[] = []; + const linesToRemove: Range[] = []; + + // Get all http2 imports/requires + const http2Imports = getNodeImportStatements(root, "http2"); + const http2Requires = getNodeRequireCalls(root, "http2"); + const http2Statements = [...http2Imports, ...http2Requires]; + + if (!http2Statements.length) return null; + + // Case 1: Remove priority object from http2.connect() options + edits.push(...removeConnectPriority(rootNode)); + + // Case 2: Remove priority object from session.request() options + edits.push(...removeRequestPriority(rootNode)); + + // Case 3: Remove entire stream.priority() method calls + const result3 = removePriorityMethodCalls(rootNode); + edits.push(...result3.edits); + linesToRemove.push(...result3.linesToRemove); + + // Case 4: Remove priority property from client.settings() options + edits.push(...removeSettingsPriority(rootNode)); + + if (!edits.length && linesToRemove.length === 0) return null; + + const sourceCode = rootNode.commitEdits(edits); + return removeLines(sourceCode, linesToRemove); +} + +/** + * Remove priority property from http2.connect() call options + */ +function removeConnectPriority(rootNode: SgNode): Edit[] { + const edits: Edit[] = []; + + // Match any connect() call + const connectCalls = rootNode.findAll({ + rule: { + pattern: "$HTTP2.connect($$$ARGS)", + }, + }); + + for (const call of connectCalls) { + const objects = call.findAll({ + rule: { + kind: "object", + }, + }); + + for (const obj of objects) { + // Check if object only contains priority properties + // Get immediate children pairs only (not nested) + const pairs = obj.children().filter((child) => child.kind() === "pair"); + + let hasPriority = false; + let allPriority = true; + + for (const pair of pairs) { + const keyNode = pair.find({ + rule: { + kind: "property_identifier", + regex: "^priority$", + }, + }); + + if (keyNode) { + hasPriority = true; + } else { + allPriority = false; + } + } + + if (allPriority && hasPriority) { + // Remove the entire object argument from the call + const callText = call.text(); + const objText = obj.text(); + // Use s flag to match across newlines (including the multiline object) + const cleanedCall = callText.replace(new RegExp(`(,\\s*)?${escapeRegex(objText)}(,\\s*)?`, "s"), ""); + const finalCall = cleanedCall.replace(/,\s*\)/, ")"); + + if (finalCall !== callText) { + edits.push(call.replace(finalCall)); + } + } else if (hasPriority) { + // Object has other properties, so just remove priority pair + edits.push(...removePriorityPairFromObject(obj)); + } + } + } + + return edits; +} + +/** + * Remove priority property from session.request() call options + */ +function removeRequestPriority(rootNode: SgNode): Edit[] { + const edits: Edit[] = []; + + // Find all request calls and clean priority from their options + const requestCalls = rootNode.findAll({ + rule: { + pattern: "$SESSION.request($$$_ARGS)", + }, + }); + + for (const call of requestCalls) { + const objects = call.findAll({ + rule: { + kind: "object", + }, + }); + + for (const obj of objects) { + // Check if object only contains priority properties + // Get immediate children pairs only (not nested) + const pairs = obj.children().filter((child) => child.kind() === "pair"); + + let hasPriority = false; + let allPriority = true; + + for (const pair of pairs) { + const keyNode = pair.find({ + rule: { + kind: "property_identifier", + regex: "^priority$", + }, + }); + + if (keyNode) { + hasPriority = true; + } else { + allPriority = false; + } + } + + if (allPriority && hasPriority) { + // Remove the entire object argument from the call + const callText = call.text(); + const objText = obj.text(); + const cleanedCall = callText.replace(new RegExp(`(,\\s*)?${escapeRegex(objText)}(,\\s*)?`, "s"), ""); + const finalCall = cleanedCall.replace(/,\s*\)/, ")"); + + if (finalCall !== callText) { + edits.push(call.replace(finalCall)); + } + } else if (hasPriority) { + // Object has other properties, so just remove priority pair + edits.push(...removePriorityPairFromObject(obj)); + } + } + } + + return edits; +} + +/** + * Remove entire stream.priority() method calls + */ +function removePriorityMethodCalls( + rootNode: SgNode, +): { edits: Edit[]; linesToRemove: Range[] } { + const edits: Edit[] = []; + const linesToRemove: Range[] = []; + + const priorityCalls = rootNode.findAll({ + rule: { + pattern: "$STREAM.priority($$$ARGS)", + }, + }); + + for (const call of priorityCalls) { + // Find the statement containing this call and remove it with its newline + let node: SgNode | undefined = call; + while (node) { + const parent = node.parent(); + const parentKind = parent?.kind(); + + // Found the statement level + if (parentKind === "expression_statement") { + // Add this line to the lines to remove + linesToRemove.push(parent!.range()); + break; + } + + node = parent; + } + } + + return { edits, linesToRemove }; +} + +/** + * Remove priority from settings() call + */ +function removeSettingsPriority(rootNode: SgNode): Edit[] { + const edits: Edit[] = []; + + const settingsCalls = rootNode.findAll({ + rule: { + pattern: "$SESSION.settings($$$_ARGS)", + }, + }); + + for (const call of settingsCalls) { + const objects = call.findAll({ + rule: { + kind: "object", + }, + }); + + for (const obj of objects) { + // Check if object only contains priority properties + // Get immediate children pairs only (not nested) + const pairs = obj.children().filter((child) => child.kind() === "pair"); + + let hasPriority = false; + let allPriority = true; + + for (const pair of pairs) { + const keyNode = pair.find({ + rule: { + kind: "property_identifier", + regex: "^priority$", + }, + }); + + if (keyNode) { + hasPriority = true; + } else { + allPriority = false; + } + } + + if (allPriority && hasPriority) { + // Remove the entire object argument from the call + const callText = call.text(); + const objText = obj.text(); + const cleanedCall = callText.replace(new RegExp(`(,\\s*)?${escapeRegex(objText)}(,\\s*)?`, "s"), ""); + const finalCall = cleanedCall.replace(/,\s*\)/, ")"); + + if (finalCall !== callText) { + edits.push(call.replace(finalCall)); + } + } else if (hasPriority) { + // Object has other properties, so just remove priority pair + edits.push(...removePriorityPairFromObject(obj)); + } + } + } + + return edits; +} + +/** + * Find and remove priority pair from an object, handling commas properly + */ +function removePriorityPairFromObject(obj: SgNode): Edit[] { + const edits: Edit[] = []; + + const pairs = obj.findAll({ + rule: { + kind: "pair", + }, + }); + + // Find all priority pairs + const priorityPairs: SgNode[] = []; + for (const pair of pairs) { + const keyNode = pair.find({ + rule: { + kind: "property_identifier", + regex: "^priority$", + }, + }); + + if (keyNode) { + priorityPairs.push(pair); + } + } + + if (priorityPairs.length === 0) { + return edits; + } + + // If all pairs are priority, remove the entire object + if (priorityPairs.length === pairs.length) { + edits.push(obj.replace("")); + return edits; + } + + // Otherwise, we need to remove pairs and clean up commas + // Strategy: replace the object with a cleaned version + const objText = obj.text(); + let result = objText; + + // For each priority pair, remove it along with associated comma + for (const pair of priorityPairs) { + const pairText = pair.text(); + + // Try to match and remove: ", priority: {...}" or similar + // First try with leading comma + const leadingCommaPattern = `,\\s*${escapeRegex(pairText)}`; + if (result.includes(",") && result.includes(pairText)) { + result = result.replace(new RegExp(leadingCommaPattern), ""); + } + + // If still not removed, try with trailing comma + if (result.includes(pairText)) { + const trailingCommaPattern = `${escapeRegex(pairText)},`; + result = result.replace(new RegExp(trailingCommaPattern), ""); + } + + // If still not removed, just remove the pair + if (result.includes(pairText)) { + result = result.replace(pairText, ""); + } + } + + // Clean up any resulting spacing issues + result = result.replace(/,\s*,/g, ","); + result = result.replace(/{\s*,/g, "{"); + result = result.replace(/,\s*}/g, "}"); + result = result.replace(/{(\S)/g, "{ $1"); + result = result.replace(/(\S)}/g, "$1 }"); + + if (result !== objText) { + edits.push(obj.replace(result)); + } + + return edits; +} + +function escapeRegex(str: string): string { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +} diff --git a/recipes/http2-priority-signaling/tests/expected/case1-connect-priority.js b/recipes/http2-priority-signaling/tests/expected/case1-connect-priority.js new file mode 100644 index 00000000..2e9c114d --- /dev/null +++ b/recipes/http2-priority-signaling/tests/expected/case1-connect-priority.js @@ -0,0 +1,2 @@ +const http2 = require("node:http2"); +const session = http2.connect("https://example.com"); diff --git a/recipes/http2-priority-signaling/tests/expected/case2-request-priority.js b/recipes/http2-priority-signaling/tests/expected/case2-request-priority.js new file mode 100644 index 00000000..a307a8d1 --- /dev/null +++ b/recipes/http2-priority-signaling/tests/expected/case2-request-priority.js @@ -0,0 +1,4 @@ +const http2 = require("node:http2"); +const stream = session.request({ + ":path": "/api/data" +}); diff --git a/recipes/http2-priority-signaling/tests/expected/case3-stream-priority-method.js b/recipes/http2-priority-signaling/tests/expected/case3-stream-priority-method.js new file mode 100644 index 00000000..ff4a2e31 --- /dev/null +++ b/recipes/http2-priority-signaling/tests/expected/case3-stream-priority-method.js @@ -0,0 +1 @@ +const http2 = require("node:http2"); diff --git a/recipes/http2-priority-signaling/tests/expected/case4-settings-priority-esm.mjs b/recipes/http2-priority-signaling/tests/expected/case4-settings-priority-esm.mjs new file mode 100644 index 00000000..d14019cf --- /dev/null +++ b/recipes/http2-priority-signaling/tests/expected/case4-settings-priority-esm.mjs @@ -0,0 +1,3 @@ +import http2 from "node:http2"; +const client = http2.connect("https://example.com"); +client.settings({ enablePush: false }); diff --git a/recipes/http2-priority-signaling/tests/input/case1-connect-priority.js b/recipes/http2-priority-signaling/tests/input/case1-connect-priority.js new file mode 100644 index 00000000..de8e7bad --- /dev/null +++ b/recipes/http2-priority-signaling/tests/input/case1-connect-priority.js @@ -0,0 +1,8 @@ +const http2 = require("node:http2"); +const session = http2.connect("https://example.com", { + priority: { + weight: 16, + parent: 0, + exclusive: false + } +}); diff --git a/recipes/http2-priority-signaling/tests/input/case2-request-priority.js b/recipes/http2-priority-signaling/tests/input/case2-request-priority.js new file mode 100644 index 00000000..2ea08793 --- /dev/null +++ b/recipes/http2-priority-signaling/tests/input/case2-request-priority.js @@ -0,0 +1,5 @@ +const http2 = require("node:http2"); +const stream = session.request({ + ":path": "/api/data", + priority: { weight: 32 } +}); diff --git a/recipes/http2-priority-signaling/tests/input/case3-stream-priority-method.js b/recipes/http2-priority-signaling/tests/input/case3-stream-priority-method.js new file mode 100644 index 00000000..6c9f968f --- /dev/null +++ b/recipes/http2-priority-signaling/tests/input/case3-stream-priority-method.js @@ -0,0 +1,6 @@ +const http2 = require("node:http2"); +stream.priority({ + exclusive: true, + parent: 0, + weight: 128 +}); diff --git a/recipes/http2-priority-signaling/tests/input/case4-settings-priority-esm.mjs b/recipes/http2-priority-signaling/tests/input/case4-settings-priority-esm.mjs new file mode 100644 index 00000000..47b8911c --- /dev/null +++ b/recipes/http2-priority-signaling/tests/input/case4-settings-priority-esm.mjs @@ -0,0 +1,3 @@ +import http2 from "node:http2"; +const client = http2.connect("https://example.com"); +client.settings({ enablePush: false, priority: true }); diff --git a/recipes/http2-priority-signaling/workflow.yaml b/recipes/http2-priority-signaling/workflow.yaml new file mode 100644 index 00000000..4d7dac7f --- /dev/null +++ b/recipes/http2-priority-signaling/workflow.yaml @@ -0,0 +1,25 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/codemod-com/codemod/refs/heads/main/schemas/workflow.json + +version: "1" + +nodes: + - id: apply-transforms + name: Apply AST Transformations + type: automatic + steps: + - name: Handle DEP0194 via removing HTTP/2 priority-related options and methods + js-ast-grep: + js_file: src/workflow.ts + base_path: . + include: + - "**/*.cjs" + - "**/*.cts" + - "**/*.js" + - "**/*.jsx" + - "**/*.mjs" + - "**/*.mts" + - "**/*.ts" + - "**/*.tsx" + exclude: + - "**/node_modules/**" + language: typescript From e539b2fe0e21546f89d460e602a5224141353f0d Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Tue, 21 Oct 2025 10:58:09 +0200 Subject: [PATCH 02/12] Update workflow.ts --- recipes/http2-priority-signaling/src/workflow.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/recipes/http2-priority-signaling/src/workflow.ts b/recipes/http2-priority-signaling/src/workflow.ts index 3afc5470..a69c0d73 100644 --- a/recipes/http2-priority-signaling/src/workflow.ts +++ b/recipes/http2-priority-signaling/src/workflow.ts @@ -26,9 +26,10 @@ export default function transform(root: SgRoot): string | null { const linesToRemove: Range[] = []; // Get all http2 imports/requires - const http2Imports = getNodeImportStatements(root, "http2"); - const http2Requires = getNodeRequireCalls(root, "http2"); - const http2Statements = [...http2Imports, ...http2Requires]; + const http2Statements = [ + ...getNodeImportStatements(root, "http2"), + ...getNodeRequireCalls(root, "http2") + ]; if (!http2Statements.length) return null; @@ -49,6 +50,7 @@ export default function transform(root: SgRoot): string | null { if (!edits.length && linesToRemove.length === 0) return null; const sourceCode = rootNode.commitEdits(edits); + return removeLines(sourceCode, linesToRemove); } From 17c111ab856d23ee8c7f3fa7885f157b1a36ac47 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Wed, 29 Oct 2025 21:03:28 +0100 Subject: [PATCH 03/12] Update workflow.ts --- .../http2-priority-signaling/src/workflow.ts | 136 +++++++++++++++--- 1 file changed, 113 insertions(+), 23 deletions(-) diff --git a/recipes/http2-priority-signaling/src/workflow.ts b/recipes/http2-priority-signaling/src/workflow.ts index a69c0d73..44fd3038 100644 --- a/recipes/http2-priority-signaling/src/workflow.ts +++ b/recipes/http2-priority-signaling/src/workflow.ts @@ -10,16 +10,16 @@ import { getNodeImportStatements } from "@nodejs/codemod-utils/ast-grep/import-s import { removeLines } from "@nodejs/codemod-utils/ast-grep/remove-lines"; /* - * Transforms HTTP/2 priority-related options and methods. - * - * Steps: - * - * 1. Find all http2 imports and require calls - * 2. Find and remove priority property from connect() options - * 3. Find and remove priority property from request() options - * 4. Find and remove complete stream.priority() calls - * 5. Find and remove priority property from settings() options - */ +* Transforms HTTP/2 priority-related options and methods. +* +* Steps: +* +* 1. Find all http2 imports and require calls +* 2. Find and remove priority property from connect() options +* 3. Find and remove priority property from request() options +* 4. Find and remove complete stream.priority() calls +* 5. Find and remove priority property from settings() options +*/ export default function transform(root: SgRoot): string | null { const rootNode = root.root(); const edits: Edit[] = []; @@ -190,22 +190,79 @@ function removePriorityMethodCalls( const edits: Edit[] = []; const linesToRemove: Range[] = []; - const priorityCalls = rootNode.findAll({ - rule: { - pattern: "$STREAM.priority($$$ARGS)", - }, + // Build a restricted set of "safe" priority() calls to remove. + // We only want to remove calls that we can reasonably verify are + // HTTP/2 streams created by `session.request()` or by + // `http2.connect(...).request()`. + + // 1) priority() called directly on the result of a request()-call + const chainedSessionPriorityCalls = rootNode.findAll({ + rule: { pattern: "$SESSION.request($$$_ARGS).priority($$$ARGS)" }, + }); + + // 2) priority() called directly on the result of http2.connect(...).request(...) + const chainedConnectPriorityCalls = rootNode.findAll({ + rule: { pattern: "$HTTP2.connect($$$_ARGS).request($$ARGS).priority($$$ARGS)" }, + }); + + // 3) find variables that are assigned from session.request(...) or + // http2.connect(...).request(...) so we can later match `stream.priority()` + const assignedFromSessionRequest = rootNode.findAll({ + rule: { pattern: "$NAME = $SESSION.request($$$_ARGS)" }, }); + const assignedFromConnectRequest = rootNode.findAll({ + rule: { pattern: "$NAME = $HTTP2.connect($$$_ARGS).request($$ARGS)" }, + }); + + const creatorNames = new Set(); + function addCreatorNames(nodes: SgNode[]) { + for (const n of nodes) { + const t = n.text(); + // Try to extract a simple identifier on the left-hand side. + // Matches: "const stream = ...", "let s = ...", "s = ..." + const m = t.match(/(?:const|let|var)?\s*([A-Za-z_$][\w$]*)\s*=/); + if (m) creatorNames.add(m[1]); + } + } + + addCreatorNames(assignedFromSessionRequest); + addCreatorNames(assignedFromConnectRequest); + + // 4) All other priority() calls we will inspect, but only accept those + // whose receiver is a simple identifier that we found in creatorNames. + const allPriorityCalls = rootNode.findAll({ + rule: { pattern: "$STREAM.priority($$$ARGS)" }, + }); + + // Consolidate safe calls into a single array (use Set to avoid dupes) + const safeCalls = new Set>([ + ...chainedSessionPriorityCalls, + ...chainedConnectPriorityCalls, + ]); + + for (const call of allPriorityCalls) { + const callText = call.text(); + // Try to capture simple identifier receivers like `stream.priority(...)`. + const m = callText.match(/^\s*([A-Za-z_$][\w$]*)\.priority\s*\(/); + // If the receiver is a simple identifier (e.g. `stream.priority(...)`), + // accept it as a safe call. This function is only invoked when the + // file contains an `http2` import/require (see transform), so a simple + // identifier receiver is likely an HTTP/2 Stream. + if (m) { + safeCalls.add(call); + } + } - for (const call of priorityCalls) { - // Find the statement containing this call and remove it with its newline + // Now remove only the safe calls (we still remove the containing + // expression statements as before). + for (const call of safeCalls) { let node: SgNode | undefined = call; + while (node) { const parent = node.parent(); const parentKind = parent?.kind(); - // Found the statement level if (parentKind === "expression_statement") { - // Add this line to the lines to remove linesToRemove.push(parent!.range()); break; } @@ -223,13 +280,46 @@ function removePriorityMethodCalls( function removeSettingsPriority(rootNode: SgNode): Edit[] { const edits: Edit[] = []; - const settingsCalls = rootNode.findAll({ - rule: { - pattern: "$SESSION.settings($$$_ARGS)", - }, + // Guardrails: only modify settings() when it's clearly an http2 session. + // Accept: + // - http2.connect(...).settings(...) + // - = http2.connect(...); .settings(...) + + const chainedConnectSettingsCalls = rootNode.findAll({ + rule: { pattern: "$HTTP2.connect($$$_ARGS).settings($$$_ARGS)" }, + }); + + const assignedFromConnect = rootNode.findAll({ + rule: { pattern: "$NAME = $HTTP2.connect($$$_ARGS)" }, }); - for (const call of settingsCalls) { + const creatorNames = new Set(); + for (const n of assignedFromConnect) { + const t = n.text(); + const m = t.match(/(?:const|let|var)?\s*([A-Za-z_$][\w$]*)\s*=/); + if (m) creatorNames.add(m[1]); + } + + // All settings() calls in the file + const allSettingsCalls = rootNode.findAll({ + rule: { pattern: "$SESSION.settings($$$_ARGS)" }, + }); + + const safeCalls = new Set>([...chainedConnectSettingsCalls]); + + for (const call of allSettingsCalls) { + const callText = call.text(); + const m = callText.match(/^\s*([A-Za-z_$][\w$]*)\.settings\s*\(/); + // Accept simple identifier receivers (e.g. `client.settings(...)`) as + // safe when http2 is present in the file — this matches common usage + // like `const client = http2.connect(...); client.settings(...)`. + if (m) { + safeCalls.add(call); + } + } + + // Process only safe settings() calls + for (const call of safeCalls) { const objects = call.findAll({ rule: { kind: "object", From 676ec7769af8fa19c366766dad8723d6d68c08a1 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sat, 8 Nov 2025 11:11:02 +0100 Subject: [PATCH 04/12] fix --- .../http2-priority-signaling/src/workflow.ts | 414 +++++++++--------- .../tests/expected/case2-request-priority.js | 1 + .../expected/case3-stream-priority-method.js | 2 + .../tests/input/case2-request-priority.js | 1 + .../input/case3-stream-priority-method.js | 2 + 5 files changed, 219 insertions(+), 201 deletions(-) diff --git a/recipes/http2-priority-signaling/src/workflow.ts b/recipes/http2-priority-signaling/src/workflow.ts index 44fd3038..a6339039 100644 --- a/recipes/http2-priority-signaling/src/workflow.ts +++ b/recipes/http2-priority-signaling/src/workflow.ts @@ -1,13 +1,33 @@ import type { - Edit, - Range, - SgNode, - SgRoot, + Edit, + Range, + SgNode, + SgRoot, } from "@codemod.com/jssg-types/main"; import type Js from "@codemod.com/jssg-types/langs/javascript"; import { getNodeRequireCalls } from "@nodejs/codemod-utils/ast-grep/require-call"; import { getNodeImportStatements } from "@nodejs/codemod-utils/ast-grep/import-statement"; import { removeLines } from "@nodejs/codemod-utils/ast-grep/remove-lines"; +// Lightweight lexical scope resolver (subset of functionality from PR #248 get-scope util) +// Ascends parents until it finds a block/function/program and returns the innermost block-like +// container to limit member searches to the variable's lexical region. +function getLexicalScope(node: SgNode): SgNode { + let current = node.parent(); + let candidate: SgNode | undefined; + while (current) { + const kind = current.kind(); + if (kind === "block" || kind === "program") { + candidate = current; + } + if (kind === "program") break; + current = current.parent(); + } + if (candidate) return candidate; + // Ascend to top-most ancestor (program) + let top: SgNode = node; + while (top.parent()) top = top.parent() as SgNode; + return top; +} /* * Transforms HTTP/2 priority-related options and methods. @@ -25,32 +45,51 @@ export default function transform(root: SgRoot): string | null { const edits: Edit[] = []; const linesToRemove: Range[] = []; - // Get all http2 imports/requires + // Gather all http2 import/require statements. If none, abort early. const http2Statements = [ ...getNodeImportStatements(root, "http2"), - ...getNodeRequireCalls(root, "http2") + ...getNodeRequireCalls(root, "http2"), ]; - if (!http2Statements.length) return null; - // Case 1: Remove priority object from http2.connect() options + // Discover session variables created via http2.connect (await or not) by + // locating call expressions and climbing to the variable declarator. + const sessionVars: { name: string; decl: SgNode; scope: SgNode }[] = []; + const connectCalls = [ + ...rootNode.findAll({ rule: { pattern: "$HTTP2.connect($$$_ARGS)" } }), + ]; + for (const call of connectCalls) { + let n: SgNode | undefined = call; + while (n && n.kind() !== "variable_declarator") { + n = n.parent(); + } + if (!n) continue; + const nameNode = (n as SgNode).field("name"); + if (!nameNode) continue; + sessionVars.push({ name: nameNode.text(), decl: n, scope: getLexicalScope(n) }); + } + + // Case 1: Remove priority object from http2.connect() options (direct call sites) edits.push(...removeConnectPriority(rootNode)); - // Case 2: Remove priority object from session.request() options - edits.push(...removeRequestPriority(rootNode)); + // Case 2: Remove priority from session.request() options scoped to discovered session vars + chained connect().request. + edits.push(...removeRequestPriority(rootNode, sessionVars)); - // Case 3: Remove entire stream.priority() method calls - const result3 = removePriorityMethodCalls(rootNode); + // Determine stream variables created from session.request() or connect().request(). + const streamVars = collectStreamVars(rootNode, sessionVars); + + // Case 3: Remove entire stream.priority() calls only for: + // - chained request().priority() + // - variables assigned from session.request/connect().request + const result3 = removePriorityMethodCalls(rootNode, streamVars); edits.push(...result3.edits); linesToRemove.push(...result3.linesToRemove); - // Case 4: Remove priority property from client.settings() options - edits.push(...removeSettingsPriority(rootNode)); - - if (!edits.length && linesToRemove.length === 0) return null; + // Case 4: Remove priority property from session.settings() options scoped to session vars + chained connect().settings. + edits.push(...removeSettingsPriority(rootNode, sessionVars)); + if (!edits.length && !linesToRemove.length) return null; const sourceCode = rootNode.commitEdits(edits); - return removeLines(sourceCode, linesToRemove); } @@ -121,63 +160,64 @@ function removeConnectPriority(rootNode: SgNode): Edit[] { /** * Remove priority property from session.request() call options */ -function removeRequestPriority(rootNode: SgNode): Edit[] { +function removeRequestPriority( + rootNode: SgNode, + sessionVars: { name: string; scope: SgNode }[], +): Edit[] { const edits: Edit[] = []; - // Find all request calls and clean priority from their options - const requestCalls = rootNode.findAll({ - rule: { - pattern: "$SESSION.request($$$_ARGS)", - }, + // Chained connect().request(...) still safe regardless of variable binding. + const chained = rootNode.findAll({ + rule: { pattern: "$HTTP2.connect($$$_ARGS).request($$ARGS)" }, }); + const allCalls: SgNode[] = [...chained]; - for (const call of requestCalls) { + // Scoped session.request calls based on discovered session variables. + for (const sess of sessionVars) { + const calls = sess.scope.findAll({ + rule: { + kind: "call_expression", + has: { + field: "function", + kind: "member_expression", + pattern: `${sess.name}.request`, + }, + }, + }); + allCalls.push(...calls); + } + + for (const call of allCalls) { const objects = call.findAll({ rule: { kind: "object", }, }); - for (const obj of objects) { - // Check if object only contains priority properties - // Get immediate children pairs only (not nested) const pairs = obj.children().filter((child) => child.kind() === "pair"); - let hasPriority = false; let allPriority = true; - for (const pair of pairs) { const keyNode = pair.find({ - rule: { - kind: "property_identifier", - regex: "^priority$", - }, + rule: { kind: "property_identifier", regex: "^priority$" }, }); - - if (keyNode) { - hasPriority = true; - } else { - allPriority = false; - } + if (keyNode) hasPriority = true; else allPriority = false; } - if (allPriority && hasPriority) { - // Remove the entire object argument from the call const callText = call.text(); const objText = obj.text(); - const cleanedCall = callText.replace(new RegExp(`(,\\s*)?${escapeRegex(objText)}(,\\s*)?`, "s"), ""); - const finalCall = cleanedCall.replace(/,\s*\)/, ")"); - - if (finalCall !== callText) { - edits.push(call.replace(finalCall)); - } + // Remove object argument (with potential surrounding commas) + let cleanedCall = callText; + cleanedCall = cleanedCall.replace(objText, ""); + cleanedCall = cleanedCall.replace(/,\s*\)/, ")"); + cleanedCall = cleanedCall.replace(/\(\s*,/, "("); + const finalCall = cleanedCall; + if (finalCall !== callText) edits.push(call.replace(finalCall)); } else if (hasPriority) { - // Object has other properties, so just remove priority pair edits.push(...removePriorityPairFromObject(obj)); } } } - return edits; } @@ -185,190 +225,162 @@ function removeRequestPriority(rootNode: SgNode): Edit[] { * Remove entire stream.priority() method calls */ function removePriorityMethodCalls( - rootNode: SgNode, + rootNode: SgNode, + streamVars: { name: string; scope: SgNode }[], ): { edits: Edit[]; linesToRemove: Range[] } { - const edits: Edit[] = []; - const linesToRemove: Range[] = []; - - // Build a restricted set of "safe" priority() calls to remove. - // We only want to remove calls that we can reasonably verify are - // HTTP/2 streams created by `session.request()` or by - // `http2.connect(...).request()`. - - // 1) priority() called directly on the result of a request()-call - const chainedSessionPriorityCalls = rootNode.findAll({ - rule: { pattern: "$SESSION.request($$$_ARGS).priority($$$ARGS)" }, - }); - - // 2) priority() called directly on the result of http2.connect(...).request(...) - const chainedConnectPriorityCalls = rootNode.findAll({ - rule: { pattern: "$HTTP2.connect($$$_ARGS).request($$ARGS).priority($$$ARGS)" }, - }); - - // 3) find variables that are assigned from session.request(...) or - // http2.connect(...).request(...) so we can later match `stream.priority()` - const assignedFromSessionRequest = rootNode.findAll({ - rule: { pattern: "$NAME = $SESSION.request($$$_ARGS)" }, - }); - const assignedFromConnectRequest = rootNode.findAll({ - rule: { pattern: "$NAME = $HTTP2.connect($$$_ARGS).request($$ARGS)" }, - }); - - const creatorNames = new Set(); - function addCreatorNames(nodes: SgNode[]) { - for (const n of nodes) { - const t = n.text(); - // Try to extract a simple identifier on the left-hand side. - // Matches: "const stream = ...", "let s = ...", "s = ..." - const m = t.match(/(?:const|let|var)?\s*([A-Za-z_$][\w$]*)\s*=/); - if (m) creatorNames.add(m[1]); - } - } - - addCreatorNames(assignedFromSessionRequest); - addCreatorNames(assignedFromConnectRequest); - - // 4) All other priority() calls we will inspect, but only accept those - // whose receiver is a simple identifier that we found in creatorNames. - const allPriorityCalls = rootNode.findAll({ - rule: { pattern: "$STREAM.priority($$$ARGS)" }, - }); - - // Consolidate safe calls into a single array (use Set to avoid dupes) - const safeCalls = new Set>([ - ...chainedSessionPriorityCalls, - ...chainedConnectPriorityCalls, - ]); - - for (const call of allPriorityCalls) { - const callText = call.text(); - // Try to capture simple identifier receivers like `stream.priority(...)`. - const m = callText.match(/^\s*([A-Za-z_$][\w$]*)\.priority\s*\(/); - // If the receiver is a simple identifier (e.g. `stream.priority(...)`), - // accept it as a safe call. This function is only invoked when the - // file contains an `http2` import/require (see transform), so a simple - // identifier receiver is likely an HTTP/2 Stream. - if (m) { - safeCalls.add(call); - } - } - - // Now remove only the safe calls (we still remove the containing - // expression statements as before). - for (const call of safeCalls) { - let node: SgNode | undefined = call; - - while (node) { - const parent = node.parent(); - const parentKind = parent?.kind(); - - if (parentKind === "expression_statement") { - linesToRemove.push(parent!.range()); - break; - } - - node = parent; - } - } - - return { edits, linesToRemove }; + const edits: Edit[] = []; + const linesToRemove: Range[] = []; + + // Chained request(...).priority(...) directly (session or connect chains) + const chained = rootNode.findAll({ + rule: { pattern: "$SESSION.request($$$_ARGS).priority($$$ARGS)" }, + }); + const chainedConnect = rootNode.findAll({ + rule: { pattern: "$HTTP2.connect($$$_ARGS).request($$ARGS).priority($$$ARGS)" }, + }); + + const safeCalls = new Set>([...chained, ...chainedConnect]); + + // Priority on identified stream variable names within their scope. + for (const stream of streamVars) { + const calls = stream.scope.findAll({ + rule: { + kind: "call_expression", + has: { + field: "function", + kind: "member_expression", + pattern: `${stream.name}.priority`, + }, + }, + }); + for (const c of calls) safeCalls.add(c); + } + + // Remove expression statements containing safe priority calls. + for (const call of safeCalls) { + let node: SgNode | undefined = call; + while (node) { + const parent = node.parent(); + if (parent?.kind() === "expression_statement") { + linesToRemove.push(parent.range()); + break; + } + node = parent; + } + } + return { edits, linesToRemove }; } /** * Remove priority from settings() call */ -function removeSettingsPriority(rootNode: SgNode): Edit[] { +function removeSettingsPriority( + rootNode: SgNode, + sessionVars: { name: string; scope: SgNode }[], +): Edit[] { const edits: Edit[] = []; - - // Guardrails: only modify settings() when it's clearly an http2 session. - // Accept: - // - http2.connect(...).settings(...) - // - = http2.connect(...); .settings(...) - - const chainedConnectSettingsCalls = rootNode.findAll({ + // Chained connect().settings(...) + const chained = rootNode.findAll({ rule: { pattern: "$HTTP2.connect($$$_ARGS).settings($$$_ARGS)" }, }); - const assignedFromConnect = rootNode.findAll({ - rule: { pattern: "$NAME = $HTTP2.connect($$$_ARGS)" }, - }); - - const creatorNames = new Set(); - for (const n of assignedFromConnect) { - const t = n.text(); - const m = t.match(/(?:const|let|var)?\s*([A-Za-z_$][\w$]*)\s*=/); - if (m) creatorNames.add(m[1]); - } - - // All settings() calls in the file - const allSettingsCalls = rootNode.findAll({ - rule: { pattern: "$SESSION.settings($$$_ARGS)" }, - }); - - const safeCalls = new Set>([...chainedConnectSettingsCalls]); + const safeCalls = new Set>([...chained]); - for (const call of allSettingsCalls) { - const callText = call.text(); - const m = callText.match(/^\s*([A-Za-z_$][\w$]*)\.settings\s*\(/); - // Accept simple identifier receivers (e.g. `client.settings(...)`) as - // safe when http2 is present in the file — this matches common usage - // like `const client = http2.connect(...); client.settings(...)`. - if (m) { - safeCalls.add(call); - } - } - - // Process only safe settings() calls - for (const call of safeCalls) { - const objects = call.findAll({ + // Scoped session.settings calls for discovered session variables. + for (const sess of sessionVars) { + const calls = sess.scope.findAll({ rule: { - kind: "object", + kind: "call_expression", + has: { + field: "function", + kind: "member_expression", + pattern: `${sess.name}.settings`, + }, }, }); + for (const c of calls) safeCalls.add(c); + } + for (const call of safeCalls) { + const objects = call.findAll({ rule: { kind: "object" } }); for (const obj of objects) { - // Check if object only contains priority properties - // Get immediate children pairs only (not nested) const pairs = obj.children().filter((child) => child.kind() === "pair"); - let hasPriority = false; let allPriority = true; - for (const pair of pairs) { - const keyNode = pair.find({ - rule: { - kind: "property_identifier", - regex: "^priority$", - }, - }); - - if (keyNode) { - hasPriority = true; - } else { - allPriority = false; - } + const keyNode = pair.find({ rule: { kind: "property_identifier", regex: "^priority$" } }); + if (keyNode) hasPriority = true; else allPriority = false; } - if (allPriority && hasPriority) { - // Remove the entire object argument from the call const callText = call.text(); const objText = obj.text(); - const cleanedCall = callText.replace(new RegExp(`(,\\s*)?${escapeRegex(objText)}(,\\s*)?`, "s"), ""); - const finalCall = cleanedCall.replace(/,\s*\)/, ")"); - - if (finalCall !== callText) { - edits.push(call.replace(finalCall)); - } + let cleanedCall = callText; + cleanedCall = cleanedCall.replace(objText, ""); + cleanedCall = cleanedCall.replace(/,\s*\)/, ")"); + cleanedCall = cleanedCall.replace(/\(\s*,/, "("); + const finalCall = cleanedCall; + if (finalCall !== callText) edits.push(call.replace(finalCall)); } else if (hasPriority) { - // Object has other properties, so just remove priority pair edits.push(...removePriorityPairFromObject(obj)); } } } - return edits; } +// Collect stream variables created from session.request() or connect().request() patterns. +function collectStreamVars( + rootNode: SgNode, + sessionVars: { name: string; scope: SgNode }[], +): { name: string; scope: SgNode }[] { + const streamVars: { name: string; scope: SgNode }[] = []; + // From sessionVar.request(...) + for (const sess of sessionVars) { + const decls = sess.scope.findAll({ + rule: { + kind: "variable_declarator", + has: { + field: "value", + kind: "call_expression", + has: { + field: "function", + kind: "member_expression", + pattern: `${sess.name}.request`, + }, + }, + }, + }); + for (const d of decls) { + const nameNode = (d as SgNode).field("name"); + streamVars.push({ name: nameNode.text(), scope: getLexicalScope(d) }); + } + } + // From connect().request(...) chained assignments. + const chainedDecls = rootNode.findAll({ + rule: { + kind: "variable_declarator", + has: { + field: "value", + kind: "call_expression", + has: { + field: "function", + kind: "member_expression", + pattern: "request", // we will validate parent chain text + }, + }, + }, + }); + for (const d of chainedDecls) { + const valueText = (d as SgNode).field("value").text(); + // Quick heuristic: contains ".connect(" before ".request(". + if (/connect\s*\([^)]*\).*\.request\s*\(/.test(valueText)) { + const nameNode = (d as SgNode).field("name"); + streamVars.push({ name: nameNode.text(), scope: getLexicalScope(d) }); + } + } + return streamVars; +} + /** * Find and remove priority pair from an object, handling commas properly */ diff --git a/recipes/http2-priority-signaling/tests/expected/case2-request-priority.js b/recipes/http2-priority-signaling/tests/expected/case2-request-priority.js index a307a8d1..971e5117 100644 --- a/recipes/http2-priority-signaling/tests/expected/case2-request-priority.js +++ b/recipes/http2-priority-signaling/tests/expected/case2-request-priority.js @@ -1,4 +1,5 @@ const http2 = require("node:http2"); +const session = http2.connect("https://example.com"); const stream = session.request({ ":path": "/api/data" }); diff --git a/recipes/http2-priority-signaling/tests/expected/case3-stream-priority-method.js b/recipes/http2-priority-signaling/tests/expected/case3-stream-priority-method.js index ff4a2e31..e21ea359 100644 --- a/recipes/http2-priority-signaling/tests/expected/case3-stream-priority-method.js +++ b/recipes/http2-priority-signaling/tests/expected/case3-stream-priority-method.js @@ -1 +1,3 @@ const http2 = require("node:http2"); +const session = http2.connect("https://example.com"); +const stream = session.request({ ":path": "/" }); diff --git a/recipes/http2-priority-signaling/tests/input/case2-request-priority.js b/recipes/http2-priority-signaling/tests/input/case2-request-priority.js index 2ea08793..f2d57dc8 100644 --- a/recipes/http2-priority-signaling/tests/input/case2-request-priority.js +++ b/recipes/http2-priority-signaling/tests/input/case2-request-priority.js @@ -1,4 +1,5 @@ const http2 = require("node:http2"); +const session = http2.connect("https://example.com"); const stream = session.request({ ":path": "/api/data", priority: { weight: 32 } diff --git a/recipes/http2-priority-signaling/tests/input/case3-stream-priority-method.js b/recipes/http2-priority-signaling/tests/input/case3-stream-priority-method.js index 6c9f968f..e7cc4bad 100644 --- a/recipes/http2-priority-signaling/tests/input/case3-stream-priority-method.js +++ b/recipes/http2-priority-signaling/tests/input/case3-stream-priority-method.js @@ -1,4 +1,6 @@ const http2 = require("node:http2"); +const session = http2.connect("https://example.com"); +const stream = session.request({ ":path": "/" }); stream.priority({ exclusive: true, parent: 0, From 5426e07353161a4b256c612801c4073f8d2e539c Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sat, 8 Nov 2025 11:28:49 +0100 Subject: [PATCH 05/12] WIP --- .../http2-priority-signaling/src/workflow.ts | 18 ++++++++++++++++-- .../tests/expected/case10-import-namespace.mjs | 5 +++++ .../tests/expected/case11-import-connect.mjs | 5 +++++ .../expected/case12-import-connect-alias.mjs | 5 +++++ .../tests/expected/case5-dynamic-import.mjs | 6 ++++++ .../expected/case6-dynamic-import-await.mjs | 5 +++++ .../tests/expected/case7-require-myHttp2.js | 5 +++++ .../tests/expected/case8-require-connect.js | 5 +++++ .../expected/case9-require-connect-alias.js | 5 +++++ .../tests/input/case10-import-namespace.mjs | 6 ++++++ .../tests/input/case11-import-connect.mjs | 6 ++++++ .../input/case12-import-connect-alias.mjs | 6 ++++++ .../tests/input/case5-dynamic-import.mjs | 7 +++++++ .../tests/input/case6-dynamic-import-await.mjs | 6 ++++++ .../tests/input/case7-require-myHttp2.js | 6 ++++++ .../tests/input/case8-require-connect.js | 6 ++++++ .../tests/input/case9-require-connect-alias.js | 6 ++++++ 17 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 recipes/http2-priority-signaling/tests/expected/case10-import-namespace.mjs create mode 100644 recipes/http2-priority-signaling/tests/expected/case11-import-connect.mjs create mode 100644 recipes/http2-priority-signaling/tests/expected/case12-import-connect-alias.mjs create mode 100644 recipes/http2-priority-signaling/tests/expected/case5-dynamic-import.mjs create mode 100644 recipes/http2-priority-signaling/tests/expected/case6-dynamic-import-await.mjs create mode 100644 recipes/http2-priority-signaling/tests/expected/case7-require-myHttp2.js create mode 100644 recipes/http2-priority-signaling/tests/expected/case8-require-connect.js create mode 100644 recipes/http2-priority-signaling/tests/expected/case9-require-connect-alias.js create mode 100644 recipes/http2-priority-signaling/tests/input/case10-import-namespace.mjs create mode 100644 recipes/http2-priority-signaling/tests/input/case11-import-connect.mjs create mode 100644 recipes/http2-priority-signaling/tests/input/case12-import-connect-alias.mjs create mode 100644 recipes/http2-priority-signaling/tests/input/case5-dynamic-import.mjs create mode 100644 recipes/http2-priority-signaling/tests/input/case6-dynamic-import-await.mjs create mode 100644 recipes/http2-priority-signaling/tests/input/case7-require-myHttp2.js create mode 100644 recipes/http2-priority-signaling/tests/input/case8-require-connect.js create mode 100644 recipes/http2-priority-signaling/tests/input/case9-require-connect-alias.js diff --git a/recipes/http2-priority-signaling/src/workflow.ts b/recipes/http2-priority-signaling/src/workflow.ts index a6339039..ad2a65a3 100644 --- a/recipes/http2-priority-signaling/src/workflow.ts +++ b/recipes/http2-priority-signaling/src/workflow.ts @@ -6,7 +6,7 @@ import type { } from "@codemod.com/jssg-types/main"; import type Js from "@codemod.com/jssg-types/langs/javascript"; import { getNodeRequireCalls } from "@nodejs/codemod-utils/ast-grep/require-call"; -import { getNodeImportStatements } from "@nodejs/codemod-utils/ast-grep/import-statement"; +import { getNodeImportStatements, getNodeImportCalls } from "@nodejs/codemod-utils/ast-grep/import-statement"; import { removeLines } from "@nodejs/codemod-utils/ast-grep/remove-lines"; // Lightweight lexical scope resolver (subset of functionality from PR #248 get-scope util) // Ascends parents until it finds a block/function/program and returns the innermost block-like @@ -45,10 +45,11 @@ export default function transform(root: SgRoot): string | null { const edits: Edit[] = []; const linesToRemove: Range[] = []; - // Gather all http2 import/require statements. If none, abort early. + // Gather all http2 import/require statements/calls const http2Statements = [ ...getNodeImportStatements(root, "http2"), ...getNodeRequireCalls(root, "http2"), + ...getNodeImportCalls(root, "http2"), ]; if (!http2Statements.length) return null; @@ -69,6 +70,19 @@ export default function transform(root: SgRoot): string | null { sessionVars.push({ name: nameNode.text(), decl: n, scope: getLexicalScope(n) }); } + // Handle dynamic imports of http2 + const dynamicHttp2Imports = getNodeImportCalls(root, "http2"); + for (const importNode of dynamicHttp2Imports) { + const binding = importNode.field("name"); + if (binding) { + sessionVars.push({ + name: binding.text(), + decl: importNode, + scope: getLexicalScope(importNode), + }); + } + } + // Case 1: Remove priority object from http2.connect() options (direct call sites) edits.push(...removeConnectPriority(rootNode)); diff --git a/recipes/http2-priority-signaling/tests/expected/case10-import-namespace.mjs b/recipes/http2-priority-signaling/tests/expected/case10-import-namespace.mjs new file mode 100644 index 00000000..304f0952 --- /dev/null +++ b/recipes/http2-priority-signaling/tests/expected/case10-import-namespace.mjs @@ -0,0 +1,5 @@ +import * as foo from "node:http2"; +const session = foo.connect("https://example.com"); +session.settings({ + enablePush: true +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/expected/case11-import-connect.mjs b/recipes/http2-priority-signaling/tests/expected/case11-import-connect.mjs new file mode 100644 index 00000000..d735082a --- /dev/null +++ b/recipes/http2-priority-signaling/tests/expected/case11-import-connect.mjs @@ -0,0 +1,5 @@ +import { connect } from "node:http2"; +const session = connect("https://example.com"); +session.settings({ + enablePush: true +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/expected/case12-import-connect-alias.mjs b/recipes/http2-priority-signaling/tests/expected/case12-import-connect-alias.mjs new file mode 100644 index 00000000..c5571604 --- /dev/null +++ b/recipes/http2-priority-signaling/tests/expected/case12-import-connect-alias.mjs @@ -0,0 +1,5 @@ +import { connect as bar } from "node:http2"; +const session = bar("https://example.com"); +session.settings({ + enablePush: true +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/expected/case5-dynamic-import.mjs b/recipes/http2-priority-signaling/tests/expected/case5-dynamic-import.mjs new file mode 100644 index 00000000..d12f1455 --- /dev/null +++ b/recipes/http2-priority-signaling/tests/expected/case5-dynamic-import.mjs @@ -0,0 +1,6 @@ +import("node:http2").then((http2) => { + const session = http2.connect("https://example.com"); + session.settings({ + enablePush: true + }); +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/expected/case6-dynamic-import-await.mjs b/recipes/http2-priority-signaling/tests/expected/case6-dynamic-import-await.mjs new file mode 100644 index 00000000..2f55bbe5 --- /dev/null +++ b/recipes/http2-priority-signaling/tests/expected/case6-dynamic-import-await.mjs @@ -0,0 +1,5 @@ +const http2 = await import("node:http2"); +const session = http2.connect("https://example.com"); +session.settings({ + enablePush: true +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/expected/case7-require-myHttp2.js b/recipes/http2-priority-signaling/tests/expected/case7-require-myHttp2.js new file mode 100644 index 00000000..024af2dc --- /dev/null +++ b/recipes/http2-priority-signaling/tests/expected/case7-require-myHttp2.js @@ -0,0 +1,5 @@ +const myHttp2 = require("http2"); +const session = myHttp2.connect("https://example.com"); +session.settings({ + enablePush: true +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/expected/case8-require-connect.js b/recipes/http2-priority-signaling/tests/expected/case8-require-connect.js new file mode 100644 index 00000000..39545416 --- /dev/null +++ b/recipes/http2-priority-signaling/tests/expected/case8-require-connect.js @@ -0,0 +1,5 @@ +const { connect } = require("http2"); +const session = connect("https://example.com"); +session.settings({ + enablePush: true +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/expected/case9-require-connect-alias.js b/recipes/http2-priority-signaling/tests/expected/case9-require-connect-alias.js new file mode 100644 index 00000000..940abcda --- /dev/null +++ b/recipes/http2-priority-signaling/tests/expected/case9-require-connect-alias.js @@ -0,0 +1,5 @@ +const { connect: bar } = require("http2"); +const session = bar("https://example.com"); +session.settings({ + enablePush: true +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/input/case10-import-namespace.mjs b/recipes/http2-priority-signaling/tests/input/case10-import-namespace.mjs new file mode 100644 index 00000000..0961cf8e --- /dev/null +++ b/recipes/http2-priority-signaling/tests/input/case10-import-namespace.mjs @@ -0,0 +1,6 @@ +import * as foo from "node:http2"; +const session = foo.connect("https://example.com"); +session.settings({ + enablePush: true, + priority: { weight: 16 } +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/input/case11-import-connect.mjs b/recipes/http2-priority-signaling/tests/input/case11-import-connect.mjs new file mode 100644 index 00000000..0fead604 --- /dev/null +++ b/recipes/http2-priority-signaling/tests/input/case11-import-connect.mjs @@ -0,0 +1,6 @@ +import { connect } from "node:http2"; +const session = connect("https://example.com"); +session.settings({ + enablePush: true, + priority: { weight: 16 } +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/input/case12-import-connect-alias.mjs b/recipes/http2-priority-signaling/tests/input/case12-import-connect-alias.mjs new file mode 100644 index 00000000..da3dc534 --- /dev/null +++ b/recipes/http2-priority-signaling/tests/input/case12-import-connect-alias.mjs @@ -0,0 +1,6 @@ +import { connect as bar } from "node:http2"; +const session = bar("https://example.com"); +session.settings({ + enablePush: true, + priority: { weight: 16 } +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/input/case5-dynamic-import.mjs b/recipes/http2-priority-signaling/tests/input/case5-dynamic-import.mjs new file mode 100644 index 00000000..9b1cd0d2 --- /dev/null +++ b/recipes/http2-priority-signaling/tests/input/case5-dynamic-import.mjs @@ -0,0 +1,7 @@ +import("node:http2").then((http2) => { + const session = http2.connect("https://example.com"); + session.settings({ + enablePush: true, + priority: { weight: 16 } + }); +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/input/case6-dynamic-import-await.mjs b/recipes/http2-priority-signaling/tests/input/case6-dynamic-import-await.mjs new file mode 100644 index 00000000..1f550f3e --- /dev/null +++ b/recipes/http2-priority-signaling/tests/input/case6-dynamic-import-await.mjs @@ -0,0 +1,6 @@ +const http2 = await import("node:http2"); +const session = http2.connect("https://example.com"); +session.settings({ + enablePush: true, + priority: { weight: 16 } +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/input/case7-require-myHttp2.js b/recipes/http2-priority-signaling/tests/input/case7-require-myHttp2.js new file mode 100644 index 00000000..c0e60b30 --- /dev/null +++ b/recipes/http2-priority-signaling/tests/input/case7-require-myHttp2.js @@ -0,0 +1,6 @@ +const myHttp2 = require("http2"); +const session = myHttp2.connect("https://example.com"); +session.settings({ + enablePush: true, + priority: { weight: 16 } +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/input/case8-require-connect.js b/recipes/http2-priority-signaling/tests/input/case8-require-connect.js new file mode 100644 index 00000000..b3d9aea3 --- /dev/null +++ b/recipes/http2-priority-signaling/tests/input/case8-require-connect.js @@ -0,0 +1,6 @@ +const { connect } = require("http2"); +const session = connect("https://example.com"); +session.settings({ + enablePush: true, + priority: { weight: 16 } +}); \ No newline at end of file diff --git a/recipes/http2-priority-signaling/tests/input/case9-require-connect-alias.js b/recipes/http2-priority-signaling/tests/input/case9-require-connect-alias.js new file mode 100644 index 00000000..43902c0d --- /dev/null +++ b/recipes/http2-priority-signaling/tests/input/case9-require-connect-alias.js @@ -0,0 +1,6 @@ +const { connect: bar } = require("http2"); +const session = bar("https://example.com"); +session.settings({ + enablePush: true, + priority: { weight: 16 } +}); \ No newline at end of file From 6946d109853743110b253b1b35bc3a76eb2671df Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sat, 8 Nov 2025 11:45:51 +0100 Subject: [PATCH 06/12] update --- .../http2-priority-signaling/src/workflow.ts | 31 +++++++++++++++++-- .../expected/case10-import-namespace.mjs | 2 +- .../tests/expected/case11-import-connect.mjs | 2 +- .../expected/case12-import-connect-alias.mjs | 2 +- .../expected/case6-dynamic-import-await.mjs | 2 +- .../tests/expected/case7-require-myHttp2.js | 2 +- .../tests/expected/case8-require-connect.js | 2 +- .../expected/case9-require-connect-alias.js | 2 +- .../tests/input/case10-import-namespace.mjs | 2 +- .../tests/input/case11-import-connect.mjs | 2 +- .../input/case12-import-connect-alias.mjs | 2 +- .../input/case6-dynamic-import-await.mjs | 2 +- .../tests/input/case7-require-myHttp2.js | 2 +- .../tests/input/case8-require-connect.js | 2 +- .../input/case9-require-connect-alias.js | 2 +- 15 files changed, 43 insertions(+), 16 deletions(-) diff --git a/recipes/http2-priority-signaling/src/workflow.ts b/recipes/http2-priority-signaling/src/workflow.ts index ad2a65a3..65536842 100644 --- a/recipes/http2-priority-signaling/src/workflow.ts +++ b/recipes/http2-priority-signaling/src/workflow.ts @@ -7,6 +7,7 @@ import type { import type Js from "@codemod.com/jssg-types/langs/javascript"; import { getNodeRequireCalls } from "@nodejs/codemod-utils/ast-grep/require-call"; import { getNodeImportStatements, getNodeImportCalls } from "@nodejs/codemod-utils/ast-grep/import-statement"; +import { resolveBindingPath } from "@nodejs/codemod-utils/ast-grep/resolve-binding-path"; import { removeLines } from "@nodejs/codemod-utils/ast-grep/remove-lines"; // Lightweight lexical scope resolver (subset of functionality from PR #248 get-scope util) // Ascends parents until it finds a block/function/program and returns the innermost block-like @@ -53,12 +54,35 @@ export default function transform(root: SgRoot): string | null { ]; if (!http2Statements.length) return null; - // Discover session variables created via http2.connect (await or not) by + // Debug: Log all http2 statements (disabled in production) + // console.log("http2Statements:", http2Statements.map(stmt => stmt.text())); + + // Resolve all local callee names for http2.connect (handles namespace, default, named, alias, require/import) + const connectCallees = new Set(); + for (const stmt of http2Statements) { + try { + const resolved = resolveBindingPath(stmt, "$.connect"); + if (resolved) connectCallees.add(resolved); + } catch { + // ignore unsupported node kinds + } + } + + // Discover session variables created via http2.connect or destructured connect calls by // locating call expressions and climbing to the variable declarator. const sessionVars: { name: string; decl: SgNode; scope: SgNode }[] = []; - const connectCalls = [ + const connectCalls: SgNode[] = [ ...rootNode.findAll({ rule: { pattern: "$HTTP2.connect($$$_ARGS)" } }), + // Also include direct calls when `connect` is imported as a named binding or alias (e.g., `connect(...)` or `bar(...)`). + ...Array.from(connectCallees).flatMap((callee) => { + // If callee already includes a dot (e.g., http2.connect), the pattern above already matches it. + if (callee.includes(".")) return [] as SgNode[]; + return rootNode.findAll({ rule: { pattern: `${callee}($$$_ARGS)` } }); + }), ]; + + // Debug: Log all connect calls (disabled in production) + // console.log("connectCalls:", connectCalls.map(call => call.text())); for (const call of connectCalls) { let n: SgNode | undefined = call; while (n && n.kind() !== "variable_declarator") { @@ -89,6 +113,9 @@ export default function transform(root: SgRoot): string | null { // Case 2: Remove priority from session.request() options scoped to discovered session vars + chained connect().request. edits.push(...removeRequestPriority(rootNode, sessionVars)); + // Debug: Log session variables (disabled in production) + // console.log("sessionVars:", sessionVars.map(sess => ({ name: sess.name, scope: sess.scope.text() }))); + // Determine stream variables created from session.request() or connect().request(). const streamVars = collectStreamVars(rootNode, sessionVars); diff --git a/recipes/http2-priority-signaling/tests/expected/case10-import-namespace.mjs b/recipes/http2-priority-signaling/tests/expected/case10-import-namespace.mjs index 304f0952..55c03124 100644 --- a/recipes/http2-priority-signaling/tests/expected/case10-import-namespace.mjs +++ b/recipes/http2-priority-signaling/tests/expected/case10-import-namespace.mjs @@ -2,4 +2,4 @@ import * as foo from "node:http2"; const session = foo.connect("https://example.com"); session.settings({ enablePush: true -}); \ No newline at end of file +}); diff --git a/recipes/http2-priority-signaling/tests/expected/case11-import-connect.mjs b/recipes/http2-priority-signaling/tests/expected/case11-import-connect.mjs index d735082a..d9970988 100644 --- a/recipes/http2-priority-signaling/tests/expected/case11-import-connect.mjs +++ b/recipes/http2-priority-signaling/tests/expected/case11-import-connect.mjs @@ -2,4 +2,4 @@ import { connect } from "node:http2"; const session = connect("https://example.com"); session.settings({ enablePush: true -}); \ No newline at end of file +}); diff --git a/recipes/http2-priority-signaling/tests/expected/case12-import-connect-alias.mjs b/recipes/http2-priority-signaling/tests/expected/case12-import-connect-alias.mjs index c5571604..55380e67 100644 --- a/recipes/http2-priority-signaling/tests/expected/case12-import-connect-alias.mjs +++ b/recipes/http2-priority-signaling/tests/expected/case12-import-connect-alias.mjs @@ -2,4 +2,4 @@ import { connect as bar } from "node:http2"; const session = bar("https://example.com"); session.settings({ enablePush: true -}); \ No newline at end of file +}); diff --git a/recipes/http2-priority-signaling/tests/expected/case6-dynamic-import-await.mjs b/recipes/http2-priority-signaling/tests/expected/case6-dynamic-import-await.mjs index 2f55bbe5..903aa689 100644 --- a/recipes/http2-priority-signaling/tests/expected/case6-dynamic-import-await.mjs +++ b/recipes/http2-priority-signaling/tests/expected/case6-dynamic-import-await.mjs @@ -2,4 +2,4 @@ const http2 = await import("node:http2"); const session = http2.connect("https://example.com"); session.settings({ enablePush: true -}); \ No newline at end of file +}); diff --git a/recipes/http2-priority-signaling/tests/expected/case7-require-myHttp2.js b/recipes/http2-priority-signaling/tests/expected/case7-require-myHttp2.js index 024af2dc..864b4111 100644 --- a/recipes/http2-priority-signaling/tests/expected/case7-require-myHttp2.js +++ b/recipes/http2-priority-signaling/tests/expected/case7-require-myHttp2.js @@ -2,4 +2,4 @@ const myHttp2 = require("http2"); const session = myHttp2.connect("https://example.com"); session.settings({ enablePush: true -}); \ No newline at end of file +}); diff --git a/recipes/http2-priority-signaling/tests/expected/case8-require-connect.js b/recipes/http2-priority-signaling/tests/expected/case8-require-connect.js index 39545416..b2eb4cd2 100644 --- a/recipes/http2-priority-signaling/tests/expected/case8-require-connect.js +++ b/recipes/http2-priority-signaling/tests/expected/case8-require-connect.js @@ -2,4 +2,4 @@ const { connect } = require("http2"); const session = connect("https://example.com"); session.settings({ enablePush: true -}); \ No newline at end of file +}); diff --git a/recipes/http2-priority-signaling/tests/expected/case9-require-connect-alias.js b/recipes/http2-priority-signaling/tests/expected/case9-require-connect-alias.js index 940abcda..96525956 100644 --- a/recipes/http2-priority-signaling/tests/expected/case9-require-connect-alias.js +++ b/recipes/http2-priority-signaling/tests/expected/case9-require-connect-alias.js @@ -2,4 +2,4 @@ const { connect: bar } = require("http2"); const session = bar("https://example.com"); session.settings({ enablePush: true -}); \ No newline at end of file +}); diff --git a/recipes/http2-priority-signaling/tests/input/case10-import-namespace.mjs b/recipes/http2-priority-signaling/tests/input/case10-import-namespace.mjs index 0961cf8e..5a034232 100644 --- a/recipes/http2-priority-signaling/tests/input/case10-import-namespace.mjs +++ b/recipes/http2-priority-signaling/tests/input/case10-import-namespace.mjs @@ -3,4 +3,4 @@ const session = foo.connect("https://example.com"); session.settings({ enablePush: true, priority: { weight: 16 } -}); \ No newline at end of file +}); diff --git a/recipes/http2-priority-signaling/tests/input/case11-import-connect.mjs b/recipes/http2-priority-signaling/tests/input/case11-import-connect.mjs index 0fead604..719abde2 100644 --- a/recipes/http2-priority-signaling/tests/input/case11-import-connect.mjs +++ b/recipes/http2-priority-signaling/tests/input/case11-import-connect.mjs @@ -3,4 +3,4 @@ const session = connect("https://example.com"); session.settings({ enablePush: true, priority: { weight: 16 } -}); \ No newline at end of file +}); diff --git a/recipes/http2-priority-signaling/tests/input/case12-import-connect-alias.mjs b/recipes/http2-priority-signaling/tests/input/case12-import-connect-alias.mjs index da3dc534..f2678568 100644 --- a/recipes/http2-priority-signaling/tests/input/case12-import-connect-alias.mjs +++ b/recipes/http2-priority-signaling/tests/input/case12-import-connect-alias.mjs @@ -3,4 +3,4 @@ const session = bar("https://example.com"); session.settings({ enablePush: true, priority: { weight: 16 } -}); \ No newline at end of file +}); diff --git a/recipes/http2-priority-signaling/tests/input/case6-dynamic-import-await.mjs b/recipes/http2-priority-signaling/tests/input/case6-dynamic-import-await.mjs index 1f550f3e..52085605 100644 --- a/recipes/http2-priority-signaling/tests/input/case6-dynamic-import-await.mjs +++ b/recipes/http2-priority-signaling/tests/input/case6-dynamic-import-await.mjs @@ -3,4 +3,4 @@ const session = http2.connect("https://example.com"); session.settings({ enablePush: true, priority: { weight: 16 } -}); \ No newline at end of file +}); diff --git a/recipes/http2-priority-signaling/tests/input/case7-require-myHttp2.js b/recipes/http2-priority-signaling/tests/input/case7-require-myHttp2.js index c0e60b30..f8aa4670 100644 --- a/recipes/http2-priority-signaling/tests/input/case7-require-myHttp2.js +++ b/recipes/http2-priority-signaling/tests/input/case7-require-myHttp2.js @@ -3,4 +3,4 @@ const session = myHttp2.connect("https://example.com"); session.settings({ enablePush: true, priority: { weight: 16 } -}); \ No newline at end of file +}); diff --git a/recipes/http2-priority-signaling/tests/input/case8-require-connect.js b/recipes/http2-priority-signaling/tests/input/case8-require-connect.js index b3d9aea3..8ee32803 100644 --- a/recipes/http2-priority-signaling/tests/input/case8-require-connect.js +++ b/recipes/http2-priority-signaling/tests/input/case8-require-connect.js @@ -3,4 +3,4 @@ const session = connect("https://example.com"); session.settings({ enablePush: true, priority: { weight: 16 } -}); \ No newline at end of file +}); diff --git a/recipes/http2-priority-signaling/tests/input/case9-require-connect-alias.js b/recipes/http2-priority-signaling/tests/input/case9-require-connect-alias.js index 43902c0d..45b0f136 100644 --- a/recipes/http2-priority-signaling/tests/input/case9-require-connect-alias.js +++ b/recipes/http2-priority-signaling/tests/input/case9-require-connect-alias.js @@ -3,4 +3,4 @@ const session = bar("https://example.com"); session.settings({ enablePush: true, priority: { weight: 16 } -}); \ No newline at end of file +}); From 3f6a3175a3ec9f929a6c53e1f1ab027a18d660c4 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sat, 8 Nov 2025 11:56:39 +0100 Subject: [PATCH 07/12] clean --- .../http2-priority-signaling/src/workflow.ts | 315 +++++++++--------- utils/src/ast-grep/resolve-binding-path.ts | 2 +- 2 files changed, 165 insertions(+), 152 deletions(-) diff --git a/recipes/http2-priority-signaling/src/workflow.ts b/recipes/http2-priority-signaling/src/workflow.ts index 65536842..ba870e7c 100644 --- a/recipes/http2-priority-signaling/src/workflow.ts +++ b/recipes/http2-priority-signaling/src/workflow.ts @@ -1,26 +1,22 @@ -import type { - Edit, - Range, - SgNode, - SgRoot, -} from "@codemod.com/jssg-types/main"; -import type Js from "@codemod.com/jssg-types/langs/javascript"; -import { getNodeRequireCalls } from "@nodejs/codemod-utils/ast-grep/require-call"; -import { getNodeImportStatements, getNodeImportCalls } from "@nodejs/codemod-utils/ast-grep/import-statement"; -import { resolveBindingPath } from "@nodejs/codemod-utils/ast-grep/resolve-binding-path"; -import { removeLines } from "@nodejs/codemod-utils/ast-grep/remove-lines"; -// Lightweight lexical scope resolver (subset of functionality from PR #248 get-scope util) -// Ascends parents until it finds a block/function/program and returns the innermost block-like -// container to limit member searches to the variable's lexical region. +import type { Edit, Range, SgNode, SgRoot } from '@codemod.com/jssg-types/main'; +import type Js from '@codemod.com/jssg-types/langs/javascript'; +import { getNodeRequireCalls } from '@nodejs/codemod-utils/ast-grep/require-call'; +import { + getNodeImportStatements, + getNodeImportCalls, +} from '@nodejs/codemod-utils/ast-grep/import-statement'; +import { resolveBindingPath } from '@nodejs/codemod-utils/ast-grep/resolve-binding-path'; +import { removeLines } from '@nodejs/codemod-utils/ast-grep/remove-lines'; + function getLexicalScope(node: SgNode): SgNode { let current = node.parent(); let candidate: SgNode | undefined; while (current) { const kind = current.kind(); - if (kind === "block" || kind === "program") { + if (kind === 'block' || kind === 'program') { candidate = current; } - if (kind === "program") break; + if (kind === 'program') break; current = current.parent(); } if (candidate) return candidate; @@ -31,73 +27,73 @@ function getLexicalScope(node: SgNode): SgNode { } /* -* Transforms HTTP/2 priority-related options and methods. -* -* Steps: -* -* 1. Find all http2 imports and require calls -* 2. Find and remove priority property from connect() options -* 3. Find and remove priority property from request() options -* 4. Find and remove complete stream.priority() calls -* 5. Find and remove priority property from settings() options -*/ + * Transforms HTTP/2 priority-related options and methods. + * + * Steps: + * + * 1. Find all http2 imports and require calls + * 2. Find and remove priority property from connect() options + * 3. Find and remove priority property from request() options + * 4. Find and remove complete stream.priority() calls + * 5. Find and remove priority property from settings() options + */ export default function transform(root: SgRoot): string | null { const rootNode = root.root(); const edits: Edit[] = []; const linesToRemove: Range[] = []; // Gather all http2 import/require statements/calls + const dynamicHttp2Imports = getNodeImportCalls(root, 'http2'); const http2Statements = [ - ...getNodeImportStatements(root, "http2"), - ...getNodeRequireCalls(root, "http2"), - ...getNodeImportCalls(root, "http2"), + ...getNodeImportStatements(root, 'http2'), + ...getNodeRequireCalls(root, 'http2'), + ...dynamicHttp2Imports, ]; - if (!http2Statements.length) return null; - // Debug: Log all http2 statements (disabled in production) - // console.log("http2Statements:", http2Statements.map(stmt => stmt.text())); + // If any import do nothing + if (!http2Statements.length) return null; // Resolve all local callee names for http2.connect (handles namespace, default, named, alias, require/import) const connectCallees = new Set(); for (const stmt of http2Statements) { - try { - const resolved = resolveBindingPath(stmt, "$.connect"); - if (resolved) connectCallees.add(resolved); - } catch { - // ignore unsupported node kinds - } + if (stmt.kind() === 'expression_statement') continue; // skip dynamic imports + + const resolved = resolveBindingPath(stmt, '$.connect'); + if (resolved) connectCallees.add(resolved); } // Discover session variables created via http2.connect or destructured connect calls by // locating call expressions and climbing to the variable declarator. - const sessionVars: { name: string; decl: SgNode; scope: SgNode }[] = []; + const sessionVars: { name: string; decl: SgNode; scope: SgNode }[] = + []; const connectCalls: SgNode[] = [ - ...rootNode.findAll({ rule: { pattern: "$HTTP2.connect($$$_ARGS)" } }), + ...rootNode.findAll({ rule: { pattern: '$HTTP2.connect($$$_ARGS)' } }), // Also include direct calls when `connect` is imported as a named binding or alias (e.g., `connect(...)` or `bar(...)`). ...Array.from(connectCallees).flatMap((callee) => { // If callee already includes a dot (e.g., http2.connect), the pattern above already matches it. - if (callee.includes(".")) return [] as SgNode[]; + if (callee.includes('.')) return [] as SgNode[]; return rootNode.findAll({ rule: { pattern: `${callee}($$$_ARGS)` } }); }), ]; - // Debug: Log all connect calls (disabled in production) - // console.log("connectCalls:", connectCalls.map(call => call.text())); for (const call of connectCalls) { let n: SgNode | undefined = call; - while (n && n.kind() !== "variable_declarator") { + while (n && n.kind() !== 'variable_declarator') { n = n.parent(); } if (!n) continue; - const nameNode = (n as SgNode).field("name"); + const nameNode = (n as SgNode).field('name'); if (!nameNode) continue; - sessionVars.push({ name: nameNode.text(), decl: n, scope: getLexicalScope(n) }); + sessionVars.push({ + name: nameNode.text(), + decl: n, + scope: getLexicalScope(n), + }); } // Handle dynamic imports of http2 - const dynamicHttp2Imports = getNodeImportCalls(root, "http2"); for (const importNode of dynamicHttp2Imports) { - const binding = importNode.field("name"); + const binding = importNode.field('name'); if (binding) { sessionVars.push({ name: binding.text(), @@ -113,9 +109,6 @@ export default function transform(root: SgRoot): string | null { // Case 2: Remove priority from session.request() options scoped to discovered session vars + chained connect().request. edits.push(...removeRequestPriority(rootNode, sessionVars)); - // Debug: Log session variables (disabled in production) - // console.log("sessionVars:", sessionVars.map(sess => ({ name: sess.name, scope: sess.scope.text() }))); - // Determine stream variables created from session.request() or connect().request(). const streamVars = collectStreamVars(rootNode, sessionVars); @@ -130,7 +123,9 @@ export default function transform(root: SgRoot): string | null { edits.push(...removeSettingsPriority(rootNode, sessionVars)); if (!edits.length && !linesToRemove.length) return null; + const sourceCode = rootNode.commitEdits(edits); + return removeLines(sourceCode, linesToRemove); } @@ -143,21 +138,21 @@ function removeConnectPriority(rootNode: SgNode): Edit[] { // Match any connect() call const connectCalls = rootNode.findAll({ rule: { - pattern: "$HTTP2.connect($$$ARGS)", + pattern: '$HTTP2.connect($$$ARGS)', }, }); for (const call of connectCalls) { const objects = call.findAll({ rule: { - kind: "object", + kind: 'object', }, }); for (const obj of objects) { // Check if object only contains priority properties // Get immediate children pairs only (not nested) - const pairs = obj.children().filter((child) => child.kind() === "pair"); + const pairs = obj.children().filter((child) => child.kind() === 'pair'); let hasPriority = false; let allPriority = true; @@ -165,8 +160,8 @@ function removeConnectPriority(rootNode: SgNode): Edit[] { for (const pair of pairs) { const keyNode = pair.find({ rule: { - kind: "property_identifier", - regex: "^priority$", + kind: 'property_identifier', + regex: '^priority$', }, }); @@ -182,8 +177,11 @@ function removeConnectPriority(rootNode: SgNode): Edit[] { const callText = call.text(); const objText = obj.text(); // Use s flag to match across newlines (including the multiline object) - const cleanedCall = callText.replace(new RegExp(`(,\\s*)?${escapeRegex(objText)}(,\\s*)?`, "s"), ""); - const finalCall = cleanedCall.replace(/,\s*\)/, ")"); + const cleanedCall = callText.replace( + new RegExp(`(,\\s*)?${escapeRegex(objText)}(,\\s*)?`, 's'), + '', + ); + const finalCall = cleanedCall.replace(/,\s*\)/, ')'); if (finalCall !== callText) { edits.push(call.replace(finalCall)); @@ -209,7 +207,7 @@ function removeRequestPriority( // Chained connect().request(...) still safe regardless of variable binding. const chained = rootNode.findAll({ - rule: { pattern: "$HTTP2.connect($$$_ARGS).request($$ARGS)" }, + rule: { pattern: '$HTTP2.connect($$$_ARGS).request($$ARGS)' }, }); const allCalls: SgNode[] = [...chained]; @@ -217,10 +215,10 @@ function removeRequestPriority( for (const sess of sessionVars) { const calls = sess.scope.findAll({ rule: { - kind: "call_expression", + kind: 'call_expression', has: { - field: "function", - kind: "member_expression", + field: 'function', + kind: 'member_expression', pattern: `${sess.name}.request`, }, }, @@ -231,27 +229,30 @@ function removeRequestPriority( for (const call of allCalls) { const objects = call.findAll({ rule: { - kind: "object", + kind: 'object', }, }); for (const obj of objects) { - const pairs = obj.children().filter((child) => child.kind() === "pair"); + const pairs = obj.children().filter((child) => child.kind() === 'pair'); + let hasPriority = false; let allPriority = true; + for (const pair of pairs) { const keyNode = pair.find({ - rule: { kind: "property_identifier", regex: "^priority$" }, + rule: { kind: 'property_identifier', regex: '^priority$' }, }); - if (keyNode) hasPriority = true; else allPriority = false; + if (keyNode) hasPriority = true; + else allPriority = false; } if (allPriority && hasPriority) { const callText = call.text(); const objText = obj.text(); // Remove object argument (with potential surrounding commas) let cleanedCall = callText; - cleanedCall = cleanedCall.replace(objText, ""); - cleanedCall = cleanedCall.replace(/,\s*\)/, ")"); - cleanedCall = cleanedCall.replace(/\(\s*,/, "("); + cleanedCall = cleanedCall.replace(objText, ''); + cleanedCall = cleanedCall.replace(/,\s*\)/, ')'); + cleanedCall = cleanedCall.replace(/\(\s*,/, '('); const finalCall = cleanedCall; if (finalCall !== callText) edits.push(call.replace(finalCall)); } else if (hasPriority) { @@ -266,50 +267,54 @@ function removeRequestPriority( * Remove entire stream.priority() method calls */ function removePriorityMethodCalls( - rootNode: SgNode, - streamVars: { name: string; scope: SgNode }[], + rootNode: SgNode, + streamVars: { name: string; scope: SgNode }[], ): { edits: Edit[]; linesToRemove: Range[] } { - const edits: Edit[] = []; - const linesToRemove: Range[] = []; - - // Chained request(...).priority(...) directly (session or connect chains) - const chained = rootNode.findAll({ - rule: { pattern: "$SESSION.request($$$_ARGS).priority($$$ARGS)" }, - }); - const chainedConnect = rootNode.findAll({ - rule: { pattern: "$HTTP2.connect($$$_ARGS).request($$ARGS).priority($$$ARGS)" }, - }); - - const safeCalls = new Set>([...chained, ...chainedConnect]); - - // Priority on identified stream variable names within their scope. - for (const stream of streamVars) { - const calls = stream.scope.findAll({ - rule: { - kind: "call_expression", - has: { - field: "function", - kind: "member_expression", - pattern: `${stream.name}.priority`, - }, - }, - }); - for (const c of calls) safeCalls.add(c); - } - - // Remove expression statements containing safe priority calls. - for (const call of safeCalls) { - let node: SgNode | undefined = call; - while (node) { - const parent = node.parent(); - if (parent?.kind() === "expression_statement") { - linesToRemove.push(parent.range()); - break; - } - node = parent; - } - } - return { edits, linesToRemove }; + const edits: Edit[] = []; + const linesToRemove: Range[] = []; + + // Chained request(...).priority(...) directly (session or connect chains) + const chained = rootNode.findAll({ + rule: { pattern: '$SESSION.request($$$_ARGS).priority($$$ARGS)' }, + }); + const chainedConnect = rootNode.findAll({ + rule: { + pattern: '$HTTP2.connect($$$_ARGS).request($$ARGS).priority($$$ARGS)', + }, + }); + + const safeCalls = new Set>([...chained, ...chainedConnect]); + + // Priority on identified stream variable names within their scope. + for (const stream of streamVars) { + const calls = stream.scope.findAll({ + rule: { + kind: 'call_expression', + has: { + field: 'function', + kind: 'member_expression', + pattern: `${stream.name}.priority`, + }, + }, + }); + for (const c of calls) safeCalls.add(c); + } + + // Remove expression statements containing safe priority calls. + for (const call of safeCalls) { + let node: SgNode | undefined = call; + + while (node) { + const parent = node.parent(); + + if (parent?.kind() === 'expression_statement') { + linesToRemove.push(parent.range()); + break; + } + node = parent; + } + } + return { edits, linesToRemove }; } /** @@ -322,7 +327,7 @@ function removeSettingsPriority( const edits: Edit[] = []; // Chained connect().settings(...) const chained = rootNode.findAll({ - rule: { pattern: "$HTTP2.connect($$$_ARGS).settings($$$_ARGS)" }, + rule: { pattern: '$HTTP2.connect($$$_ARGS).settings($$$_ARGS)' }, }); const safeCalls = new Set>([...chained]); @@ -331,10 +336,10 @@ function removeSettingsPriority( for (const sess of sessionVars) { const calls = sess.scope.findAll({ rule: { - kind: "call_expression", + kind: 'call_expression', has: { - field: "function", - kind: "member_expression", + field: 'function', + kind: 'member_expression', pattern: `${sess.name}.settings`, }, }, @@ -343,22 +348,28 @@ function removeSettingsPriority( } for (const call of safeCalls) { - const objects = call.findAll({ rule: { kind: "object" } }); + const objects = call.findAll({ rule: { kind: 'object' } }); + for (const obj of objects) { - const pairs = obj.children().filter((child) => child.kind() === "pair"); + const pairs = obj.children().filter((child) => child.kind() === 'pair'); + let hasPriority = false; let allPriority = true; + for (const pair of pairs) { - const keyNode = pair.find({ rule: { kind: "property_identifier", regex: "^priority$" } }); - if (keyNode) hasPriority = true; else allPriority = false; + const keyNode = pair.find({ + rule: { kind: 'property_identifier', regex: '^priority$' }, + }); + if (keyNode) hasPriority = true; + else allPriority = false; } if (allPriority && hasPriority) { const callText = call.text(); const objText = obj.text(); let cleanedCall = callText; - cleanedCall = cleanedCall.replace(objText, ""); - cleanedCall = cleanedCall.replace(/,\s*\)/, ")"); - cleanedCall = cleanedCall.replace(/\(\s*,/, "("); + cleanedCall = cleanedCall.replace(objText, ''); + cleanedCall = cleanedCall.replace(/,\s*\)/, ')'); + cleanedCall = cleanedCall.replace(/\(\s*,/, '('); const finalCall = cleanedCall; if (finalCall !== callText) edits.push(call.replace(finalCall)); } else if (hasPriority) { @@ -379,43 +390,45 @@ function collectStreamVars( for (const sess of sessionVars) { const decls = sess.scope.findAll({ rule: { - kind: "variable_declarator", + kind: 'variable_declarator', has: { - field: "value", - kind: "call_expression", + field: 'value', + kind: 'call_expression', has: { - field: "function", - kind: "member_expression", + field: 'function', + kind: 'member_expression', pattern: `${sess.name}.request`, }, }, }, }); for (const d of decls) { - const nameNode = (d as SgNode).field("name"); + const nameNode = (d as SgNode).field('name'); streamVars.push({ name: nameNode.text(), scope: getLexicalScope(d) }); } } // From connect().request(...) chained assignments. const chainedDecls = rootNode.findAll({ rule: { - kind: "variable_declarator", + kind: 'variable_declarator', has: { - field: "value", - kind: "call_expression", + field: 'value', + kind: 'call_expression', has: { - field: "function", - kind: "member_expression", - pattern: "request", // we will validate parent chain text + field: 'function', + kind: 'member_expression', + pattern: 'request', // we will validate parent chain text }, }, }, }); for (const d of chainedDecls) { - const valueText = (d as SgNode).field("value").text(); + const valueText = (d as SgNode) + .field('value') + .text(); // Quick heuristic: contains ".connect(" before ".request(". if (/connect\s*\([^)]*\).*\.request\s*\(/.test(valueText)) { - const nameNode = (d as SgNode).field("name"); + const nameNode = (d as SgNode).field('name'); streamVars.push({ name: nameNode.text(), scope: getLexicalScope(d) }); } } @@ -430,7 +443,7 @@ function removePriorityPairFromObject(obj: SgNode): Edit[] { const pairs = obj.findAll({ rule: { - kind: "pair", + kind: 'pair', }, }); @@ -439,8 +452,8 @@ function removePriorityPairFromObject(obj: SgNode): Edit[] { for (const pair of pairs) { const keyNode = pair.find({ rule: { - kind: "property_identifier", - regex: "^priority$", + kind: 'property_identifier', + regex: '^priority$', }, }); @@ -455,7 +468,7 @@ function removePriorityPairFromObject(obj: SgNode): Edit[] { // If all pairs are priority, remove the entire object if (priorityPairs.length === pairs.length) { - edits.push(obj.replace("")); + edits.push(obj.replace('')); return edits; } @@ -471,28 +484,28 @@ function removePriorityPairFromObject(obj: SgNode): Edit[] { // Try to match and remove: ", priority: {...}" or similar // First try with leading comma const leadingCommaPattern = `,\\s*${escapeRegex(pairText)}`; - if (result.includes(",") && result.includes(pairText)) { - result = result.replace(new RegExp(leadingCommaPattern), ""); + if (result.includes(',') && result.includes(pairText)) { + result = result.replace(new RegExp(leadingCommaPattern), ''); } // If still not removed, try with trailing comma if (result.includes(pairText)) { const trailingCommaPattern = `${escapeRegex(pairText)},`; - result = result.replace(new RegExp(trailingCommaPattern), ""); + result = result.replace(new RegExp(trailingCommaPattern), ''); } // If still not removed, just remove the pair if (result.includes(pairText)) { - result = result.replace(pairText, ""); + result = result.replace(pairText, ''); } } // Clean up any resulting spacing issues - result = result.replace(/,\s*,/g, ","); - result = result.replace(/{\s*,/g, "{"); - result = result.replace(/,\s*}/g, "}"); - result = result.replace(/{(\S)/g, "{ $1"); - result = result.replace(/(\S)}/g, "$1 }"); + result = result.replace(/,\s*,/g, ','); + result = result.replace(/{\s*,/g, '{'); + result = result.replace(/,\s*}/g, '}'); + result = result.replace(/{(\S)/g, '{ $1'); + result = result.replace(/(\S)}/g, '$1 }'); if (result !== objText) { edits.push(obj.replace(result)); @@ -502,5 +515,5 @@ function removePriorityPairFromObject(obj: SgNode): Edit[] { } function escapeRegex(str: string): string { - return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } diff --git a/utils/src/ast-grep/resolve-binding-path.ts b/utils/src/ast-grep/resolve-binding-path.ts index 42a06391..8363a538 100644 --- a/utils/src/ast-grep/resolve-binding-path.ts +++ b/utils/src/ast-grep/resolve-binding-path.ts @@ -42,7 +42,7 @@ export function resolveBindingPath(node: SgNode, path: string) { if (!supportedKinds.includes(rootKind.toString())) { throw Error( - `Invalid node kind. To resolve binding path, one of these types must be provided: ${supportedKinds.join(', ')}`, + `Invalid node kind. To resolve binding path, one of these types must be provided: ${supportedKinds.join(', ')}\n received: ${rootKind}`, ); } From 0fb206800dd9466ba96594b1dc0a9e4647bb7d11 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sat, 20 Dec 2025 17:56:03 +0100 Subject: [PATCH 08/12] Update workflow.ts --- .../http2-priority-signaling/src/workflow.ts | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/recipes/http2-priority-signaling/src/workflow.ts b/recipes/http2-priority-signaling/src/workflow.ts index ba870e7c..fa6ec9c4 100644 --- a/recipes/http2-priority-signaling/src/workflow.ts +++ b/recipes/http2-priority-signaling/src/workflow.ts @@ -11,6 +11,7 @@ import { removeLines } from '@nodejs/codemod-utils/ast-grep/remove-lines'; function getLexicalScope(node: SgNode): SgNode { let current = node.parent(); let candidate: SgNode | undefined; + while (current) { const kind = current.kind(); if (kind === 'block' || kind === 'program') { @@ -19,10 +20,12 @@ function getLexicalScope(node: SgNode): SgNode { if (kind === 'program') break; current = current.parent(); } + if (candidate) return candidate; + // Ascend to top-most ancestor (program) - let top: SgNode = node; - while (top.parent()) top = top.parent() as SgNode; + let top = node; + while (top.parent()) top = top.parent(); return top; } @@ -43,11 +46,10 @@ export default function transform(root: SgRoot): string | null { const linesToRemove: Range[] = []; // Gather all http2 import/require statements/calls - const dynamicHttp2Imports = getNodeImportCalls(root, 'http2'); const http2Statements = [ ...getNodeImportStatements(root, 'http2'), ...getNodeRequireCalls(root, 'http2'), - ...dynamicHttp2Imports, + ...getNodeImportCalls(root, 'http2'), ]; // If any import do nothing @@ -55,17 +57,27 @@ export default function transform(root: SgRoot): string | null { // Resolve all local callee names for http2.connect (handles namespace, default, named, alias, require/import) const connectCallees = new Set(); - for (const stmt of http2Statements) { - if (stmt.kind() === 'expression_statement') continue; // skip dynamic imports + const sessionVars: { name: string; decl: SgNode; scope: SgNode }[] = + []; - const resolved = resolveBindingPath(stmt, '$.connect'); - if (resolved) connectCallees.add(resolved); + for (const stmt of http2Statements) { + if (stmt.kind() === 'expression_statement') { + const binding = stmt.field('name'); + if (binding) { + sessionVars.push({ + name: binding.text(), + decl: stmt, + scope: getLexicalScope(stmt), + }); + } + } else { + const resolved = resolveBindingPath(stmt, '$.connect'); + if (resolved) connectCallees.add(resolved); + } } // Discover session variables created via http2.connect or destructured connect calls by // locating call expressions and climbing to the variable declarator. - const sessionVars: { name: string; decl: SgNode; scope: SgNode }[] = - []; const connectCalls: SgNode[] = [ ...rootNode.findAll({ rule: { pattern: '$HTTP2.connect($$$_ARGS)' } }), // Also include direct calls when `connect` is imported as a named binding or alias (e.g., `connect(...)` or `bar(...)`). @@ -91,18 +103,6 @@ export default function transform(root: SgRoot): string | null { }); } - // Handle dynamic imports of http2 - for (const importNode of dynamicHttp2Imports) { - const binding = importNode.field('name'); - if (binding) { - sessionVars.push({ - name: binding.text(), - decl: importNode, - scope: getLexicalScope(importNode), - }); - } - } - // Case 1: Remove priority object from http2.connect() options (direct call sites) edits.push(...removeConnectPriority(rootNode)); From fa95f4fddabb9d818d374afec1c6493523f3d429 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sat, 20 Dec 2025 18:08:00 +0100 Subject: [PATCH 09/12] simplify --- .../http2-priority-signaling/src/workflow.ts | 78 ++++--------------- 1 file changed, 17 insertions(+), 61 deletions(-) diff --git a/recipes/http2-priority-signaling/src/workflow.ts b/recipes/http2-priority-signaling/src/workflow.ts index fa6ec9c4..d683c534 100644 --- a/recipes/http2-priority-signaling/src/workflow.ts +++ b/recipes/http2-priority-signaling/src/workflow.ts @@ -7,27 +7,7 @@ import { } from '@nodejs/codemod-utils/ast-grep/import-statement'; import { resolveBindingPath } from '@nodejs/codemod-utils/ast-grep/resolve-binding-path'; import { removeLines } from '@nodejs/codemod-utils/ast-grep/remove-lines'; - -function getLexicalScope(node: SgNode): SgNode { - let current = node.parent(); - let candidate: SgNode | undefined; - - while (current) { - const kind = current.kind(); - if (kind === 'block' || kind === 'program') { - candidate = current; - } - if (kind === 'program') break; - current = current.parent(); - } - - if (candidate) return candidate; - - // Ascend to top-most ancestor (program) - let top = node; - while (top.parent()) top = top.parent(); - return top; -} +import { getScope } from '@nodejs/codemod-utils/ast-grep/get-scope'; /* * Transforms HTTP/2 priority-related options and methods. @@ -67,7 +47,7 @@ export default function transform(root: SgRoot): string | null { sessionVars.push({ name: binding.text(), decl: stmt, - scope: getLexicalScope(stmt), + scope: getScope(stmt), }); } } else { @@ -99,7 +79,7 @@ export default function transform(root: SgRoot): string | null { sessionVars.push({ name: nameNode.text(), decl: n, - scope: getLexicalScope(n), + scope: getScope(n), }); } @@ -181,10 +161,9 @@ function removeConnectPriority(rootNode: SgNode): Edit[] { new RegExp(`(,\\s*)?${escapeRegex(objText)}(,\\s*)?`, 's'), '', ); - const finalCall = cleanedCall.replace(/,\s*\)/, ')'); - if (finalCall !== callText) { - edits.push(call.replace(finalCall)); + if (cleanedCall !== callText) { + edits.push(call.replace(cleanedCall)); } } else if (hasPriority) { // Object has other properties, so just remove priority pair @@ -245,17 +224,8 @@ function removeRequestPriority( if (keyNode) hasPriority = true; else allPriority = false; } - if (allPriority && hasPriority) { - const callText = call.text(); - const objText = obj.text(); - // Remove object argument (with potential surrounding commas) - let cleanedCall = callText; - cleanedCall = cleanedCall.replace(objText, ''); - cleanedCall = cleanedCall.replace(/,\s*\)/, ')'); - cleanedCall = cleanedCall.replace(/\(\s*,/, '('); - const finalCall = cleanedCall; - if (finalCall !== callText) edits.push(call.replace(finalCall)); - } else if (hasPriority) { + + if (!allPriority || !hasPriority) { edits.push(...removePriorityPairFromObject(obj)); } } @@ -297,6 +267,7 @@ function removePriorityMethodCalls( }, }, }); + for (const c of calls) safeCalls.add(c); } @@ -363,16 +334,8 @@ function removeSettingsPriority( if (keyNode) hasPriority = true; else allPriority = false; } - if (allPriority && hasPriority) { - const callText = call.text(); - const objText = obj.text(); - let cleanedCall = callText; - cleanedCall = cleanedCall.replace(objText, ''); - cleanedCall = cleanedCall.replace(/,\s*\)/, ')'); - cleanedCall = cleanedCall.replace(/\(\s*,/, '('); - const finalCall = cleanedCall; - if (finalCall !== callText) edits.push(call.replace(finalCall)); - } else if (hasPriority) { + + if (!allPriority || !hasPriority) { edits.push(...removePriorityPairFromObject(obj)); } } @@ -386,6 +349,7 @@ function collectStreamVars( sessionVars: { name: string; scope: SgNode }[], ): { name: string; scope: SgNode }[] { const streamVars: { name: string; scope: SgNode }[] = []; + // From sessionVar.request(...) for (const sess of sessionVars) { const decls = sess.scope.findAll({ @@ -403,8 +367,8 @@ function collectStreamVars( }, }); for (const d of decls) { - const nameNode = (d as SgNode).field('name'); - streamVars.push({ name: nameNode.text(), scope: getLexicalScope(d) }); + const nameNode = d.field('name'); + streamVars.push({ name: nameNode.text(), scope: getScope(d) }); } } // From connect().request(...) chained assignments. @@ -423,13 +387,11 @@ function collectStreamVars( }, }); for (const d of chainedDecls) { - const valueText = (d as SgNode) - .field('value') - .text(); + const valueText = d.field('value').text(); // Quick heuristic: contains ".connect(" before ".request(". if (/connect\s*\([^)]*\).*\.request\s*\(/.test(valueText)) { - const nameNode = (d as SgNode).field('name'); - streamVars.push({ name: nameNode.text(), scope: getLexicalScope(d) }); + const nameNode = d.field('name'); + streamVars.push({ name: nameNode.text(), scope: getScope(d) }); } } return streamVars; @@ -500,13 +462,7 @@ function removePriorityPairFromObject(obj: SgNode): Edit[] { } } - // Clean up any resulting spacing issues - result = result.replace(/,\s*,/g, ','); - result = result.replace(/{\s*,/g, '{'); - result = result.replace(/,\s*}/g, '}'); - result = result.replace(/{(\S)/g, '{ $1'); - result = result.replace(/(\S)}/g, '$1 }'); - + // if changes were made, create the edit if (result !== objText) { edits.push(obj.replace(result)); } From 17048416f79ee58d7bca5080da5ff709e0455e61 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sat, 20 Dec 2025 18:12:40 +0100 Subject: [PATCH 10/12] Update workflow.ts --- .../http2-priority-signaling/src/workflow.ts | 135 +++++++----------- 1 file changed, 51 insertions(+), 84 deletions(-) diff --git a/recipes/http2-priority-signaling/src/workflow.ts b/recipes/http2-priority-signaling/src/workflow.ts index d683c534..13f64ef7 100644 --- a/recipes/http2-priority-signaling/src/workflow.ts +++ b/recipes/http2-priority-signaling/src/workflow.ts @@ -117,20 +117,13 @@ function removeConnectPriority(rootNode: SgNode): Edit[] { // Match any connect() call const connectCalls = rootNode.findAll({ - rule: { - pattern: '$HTTP2.connect($$$ARGS)', - }, + rule: { pattern: '$HTTP2.connect($$$ARGS)' }, }); for (const call of connectCalls) { - const objects = call.findAll({ - rule: { - kind: 'object', - }, - }); + const objects = call.findAll({ rule: { kind: 'object' } }); for (const obj of objects) { - // Check if object only contains priority properties // Get immediate children pairs only (not nested) const pairs = obj.children().filter((child) => child.kind() === 'pair'); @@ -139,34 +132,17 @@ function removeConnectPriority(rootNode: SgNode): Edit[] { for (const pair of pairs) { const keyNode = pair.find({ - rule: { - kind: 'property_identifier', - regex: '^priority$', - }, + rule: { kind: 'property_identifier', regex: '^priority$' }, }); - - if (keyNode) { - hasPriority = true; - } else { - allPriority = false; - } + if (keyNode) hasPriority = true; + else allPriority = false; } if (allPriority && hasPriority) { - // Remove the entire object argument from the call - const callText = call.text(); - const objText = obj.text(); - // Use s flag to match across newlines (including the multiline object) - const cleanedCall = callText.replace( - new RegExp(`(,\\s*)?${escapeRegex(objText)}(,\\s*)?`, 's'), - '', - ); - - if (cleanedCall !== callText) { - edits.push(call.replace(cleanedCall)); - } + // Remove the entire object argument from the call using AST ranges + edits.push(buildDeletionEdit(obj)); } else if (hasPriority) { - // Object has other properties, so just remove priority pair + // Object has other properties, so just remove priority pair(s) edits.push(...removePriorityPairFromObject(obj)); } } @@ -387,9 +363,12 @@ function collectStreamVars( }, }); for (const d of chainedDecls) { - const valueText = d.field('value').text(); - // Quick heuristic: contains ".connect(" before ".request(". - if (/connect\s*\([^)]*\).*\.request\s*\(/.test(valueText)) { + const valueNode = d.field('value'); + // Prefer AST matching over string heuristics: look for connect().request() chains + const chainMatch = valueNode?.find({ + rule: { pattern: '$X.connect($$$_ARGS).request($$ARGS)' }, + }); + if (chainMatch) { const nameNode = d.field('name'); streamVars.push({ name: nameNode.text(), scope: getScope(d) }); } @@ -403,73 +382,61 @@ function collectStreamVars( function removePriorityPairFromObject(obj: SgNode): Edit[] { const edits: Edit[] = []; - const pairs = obj.findAll({ - rule: { - kind: 'pair', - }, - }); + const pairs = obj.findAll({ rule: { kind: 'pair' } }); // Find all priority pairs const priorityPairs: SgNode[] = []; for (const pair of pairs) { const keyNode = pair.find({ - rule: { - kind: 'property_identifier', - regex: '^priority$', - }, + rule: { kind: 'property_identifier', regex: '^priority$' }, }); - - if (keyNode) { - priorityPairs.push(pair); - } + if (keyNode) priorityPairs.push(pair); } - if (priorityPairs.length === 0) { - return edits; - } + // If no priority pairs, nothing to do + if (priorityPairs.length === 0) return edits; // If all pairs are priority, remove the entire object if (priorityPairs.length === pairs.length) { - edits.push(obj.replace('')); + edits.push(buildDeletionEdit(obj)); + return edits; } - // Otherwise, we need to remove pairs and clean up commas - // Strategy: replace the object with a cleaned version - const objText = obj.text(); - let result = objText; - - // For each priority pair, remove it along with associated comma + // Otherwise remove each priority pair while preserving comma separators. + // Build deletion edits for each pair, preferring to include an adjacent comma. for (const pair of priorityPairs) { - const pairText = pair.text(); - - // Try to match and remove: ", priority: {...}" or similar - // First try with leading comma - const leadingCommaPattern = `,\\s*${escapeRegex(pairText)}`; - if (result.includes(',') && result.includes(pairText)) { - result = result.replace(new RegExp(leadingCommaPattern), ''); - } - - // If still not removed, try with trailing comma - if (result.includes(pairText)) { - const trailingCommaPattern = `${escapeRegex(pairText)},`; - result = result.replace(new RegExp(trailingCommaPattern), ''); - } - - // If still not removed, just remove the pair - if (result.includes(pairText)) { - result = result.replace(pairText, ''); - } - } - - // if changes were made, create the edit - if (result !== objText) { - edits.push(obj.replace(result)); + edits.push(buildDeletionEdit(pair)); } return edits; } -function escapeRegex(str: string): string { - return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +/** + * Build an `Edit` that deletes `node` from the source while attempting to + * preserve surrounding punctuation. The helper will: + * + * - Prefer to include a preceding comma if present (to avoid leaving a + * leading comma on the remaining properties). + * - Otherwise include a following comma if present. + * - Fall back to deleting the node's exact range if neither comma is found. + * + * @param node - The AST node to remove. + * @returns An `Edit` with `startPos`, `endPos`, and empty `insertedText`. + */ +function buildDeletionEdit(node: SgNode): Edit { + const rng = node.range(); + let start = rng.start.index; + let end = rng.end.index; + + const prev = node.prev?.(); + const next = node.next?.(); + + if (prev && prev.text().trim() === ',') { + start = prev.range().start.index; + } else if (next && next.text().trim() === ',') { + end = next.range().end.index; + } + + return { startPos: start, endPos: end, insertedText: '' }; } From 441abd54c765cbc3a3ff0dc8691df2cd507d7af7 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sun, 29 Mar 2026 13:40:49 +0200 Subject: [PATCH 11/12] update test struct --- recipes/http2-priority-signaling/package.json | 2 +- .../expected.js} | 0 .../input.js} | 0 .../expected.mjs} | 0 .../input.mjs} | 0 .../expected.mjs} | 0 .../input.mjs} | 0 .../expected.mjs} | 0 .../input.mjs} | 0 .../expected.js} | 0 .../input.js} | 0 .../expected.js} | 0 .../input.js} | 0 .../expected.mjs} | 0 .../input.mjs} | 0 .../expected.mjs} | 0 .../case5-dynamic-import.mjs => case5-dynamic-import/input.mjs} | 0 .../expected.mjs} | 0 .../input.mjs} | 0 .../expected.js} | 0 .../case7-require-myHttp2.js => case7-require-myHttp2/input.js} | 0 .../expected.js} | 0 .../case8-require-connect.js => case8-require-connect/input.js} | 0 .../expected.js} | 0 .../input.js} | 0 25 files changed, 1 insertion(+), 1 deletion(-) rename recipes/http2-priority-signaling/tests/{expected/case1-connect-priority.js => case1-connect-priority/expected.js} (100%) rename recipes/http2-priority-signaling/tests/{input/case1-connect-priority.js => case1-connect-priority/input.js} (100%) rename recipes/http2-priority-signaling/tests/{expected/case10-import-namespace.mjs => case10-import-namespace/expected.mjs} (100%) rename recipes/http2-priority-signaling/tests/{input/case10-import-namespace.mjs => case10-import-namespace/input.mjs} (100%) rename recipes/http2-priority-signaling/tests/{expected/case11-import-connect.mjs => case11-import-connect/expected.mjs} (100%) rename recipes/http2-priority-signaling/tests/{input/case11-import-connect.mjs => case11-import-connect/input.mjs} (100%) rename recipes/http2-priority-signaling/tests/{expected/case12-import-connect-alias.mjs => case12-import-connect-alias/expected.mjs} (100%) rename recipes/http2-priority-signaling/tests/{input/case12-import-connect-alias.mjs => case12-import-connect-alias/input.mjs} (100%) rename recipes/http2-priority-signaling/tests/{expected/case2-request-priority.js => case2-request-priority/expected.js} (100%) rename recipes/http2-priority-signaling/tests/{input/case2-request-priority.js => case2-request-priority/input.js} (100%) rename recipes/http2-priority-signaling/tests/{expected/case3-stream-priority-method.js => case3-stream-priority-method/expected.js} (100%) rename recipes/http2-priority-signaling/tests/{input/case3-stream-priority-method.js => case3-stream-priority-method/input.js} (100%) rename recipes/http2-priority-signaling/tests/{expected/case4-settings-priority-esm.mjs => case4-settings-priority-esm/expected.mjs} (100%) rename recipes/http2-priority-signaling/tests/{input/case4-settings-priority-esm.mjs => case4-settings-priority-esm/input.mjs} (100%) rename recipes/http2-priority-signaling/tests/{expected/case5-dynamic-import.mjs => case5-dynamic-import/expected.mjs} (100%) rename recipes/http2-priority-signaling/tests/{input/case5-dynamic-import.mjs => case5-dynamic-import/input.mjs} (100%) rename recipes/http2-priority-signaling/tests/{expected/case6-dynamic-import-await.mjs => case6-dynamic-import-await/expected.mjs} (100%) rename recipes/http2-priority-signaling/tests/{input/case6-dynamic-import-await.mjs => case6-dynamic-import-await/input.mjs} (100%) rename recipes/http2-priority-signaling/tests/{expected/case7-require-myHttp2.js => case7-require-myHttp2/expected.js} (100%) rename recipes/http2-priority-signaling/tests/{input/case7-require-myHttp2.js => case7-require-myHttp2/input.js} (100%) rename recipes/http2-priority-signaling/tests/{expected/case8-require-connect.js => case8-require-connect/expected.js} (100%) rename recipes/http2-priority-signaling/tests/{input/case8-require-connect.js => case8-require-connect/input.js} (100%) rename recipes/http2-priority-signaling/tests/{expected/case9-require-connect-alias.js => case9-require-connect-alias/expected.js} (100%) rename recipes/http2-priority-signaling/tests/{input/case9-require-connect-alias.js => case9-require-connect-alias/input.js} (100%) diff --git a/recipes/http2-priority-signaling/package.json b/recipes/http2-priority-signaling/package.json index 477c0091..8b8e26cd 100644 --- a/recipes/http2-priority-signaling/package.json +++ b/recipes/http2-priority-signaling/package.json @@ -4,7 +4,7 @@ "description": "Handle DEP0194 via removing HTTP/2 priority-related options and methods", "type": "module", "scripts": { - "test": "npx codemod jssg test -l typescript ./src/workflow.ts ./" + "test": "npx codemod jssg test -l typescript ./src/workflow.ts ./tests/" }, "repository": { "type": "git", diff --git a/recipes/http2-priority-signaling/tests/expected/case1-connect-priority.js b/recipes/http2-priority-signaling/tests/case1-connect-priority/expected.js similarity index 100% rename from recipes/http2-priority-signaling/tests/expected/case1-connect-priority.js rename to recipes/http2-priority-signaling/tests/case1-connect-priority/expected.js diff --git a/recipes/http2-priority-signaling/tests/input/case1-connect-priority.js b/recipes/http2-priority-signaling/tests/case1-connect-priority/input.js similarity index 100% rename from recipes/http2-priority-signaling/tests/input/case1-connect-priority.js rename to recipes/http2-priority-signaling/tests/case1-connect-priority/input.js diff --git a/recipes/http2-priority-signaling/tests/expected/case10-import-namespace.mjs b/recipes/http2-priority-signaling/tests/case10-import-namespace/expected.mjs similarity index 100% rename from recipes/http2-priority-signaling/tests/expected/case10-import-namespace.mjs rename to recipes/http2-priority-signaling/tests/case10-import-namespace/expected.mjs diff --git a/recipes/http2-priority-signaling/tests/input/case10-import-namespace.mjs b/recipes/http2-priority-signaling/tests/case10-import-namespace/input.mjs similarity index 100% rename from recipes/http2-priority-signaling/tests/input/case10-import-namespace.mjs rename to recipes/http2-priority-signaling/tests/case10-import-namespace/input.mjs diff --git a/recipes/http2-priority-signaling/tests/expected/case11-import-connect.mjs b/recipes/http2-priority-signaling/tests/case11-import-connect/expected.mjs similarity index 100% rename from recipes/http2-priority-signaling/tests/expected/case11-import-connect.mjs rename to recipes/http2-priority-signaling/tests/case11-import-connect/expected.mjs diff --git a/recipes/http2-priority-signaling/tests/input/case11-import-connect.mjs b/recipes/http2-priority-signaling/tests/case11-import-connect/input.mjs similarity index 100% rename from recipes/http2-priority-signaling/tests/input/case11-import-connect.mjs rename to recipes/http2-priority-signaling/tests/case11-import-connect/input.mjs diff --git a/recipes/http2-priority-signaling/tests/expected/case12-import-connect-alias.mjs b/recipes/http2-priority-signaling/tests/case12-import-connect-alias/expected.mjs similarity index 100% rename from recipes/http2-priority-signaling/tests/expected/case12-import-connect-alias.mjs rename to recipes/http2-priority-signaling/tests/case12-import-connect-alias/expected.mjs diff --git a/recipes/http2-priority-signaling/tests/input/case12-import-connect-alias.mjs b/recipes/http2-priority-signaling/tests/case12-import-connect-alias/input.mjs similarity index 100% rename from recipes/http2-priority-signaling/tests/input/case12-import-connect-alias.mjs rename to recipes/http2-priority-signaling/tests/case12-import-connect-alias/input.mjs diff --git a/recipes/http2-priority-signaling/tests/expected/case2-request-priority.js b/recipes/http2-priority-signaling/tests/case2-request-priority/expected.js similarity index 100% rename from recipes/http2-priority-signaling/tests/expected/case2-request-priority.js rename to recipes/http2-priority-signaling/tests/case2-request-priority/expected.js diff --git a/recipes/http2-priority-signaling/tests/input/case2-request-priority.js b/recipes/http2-priority-signaling/tests/case2-request-priority/input.js similarity index 100% rename from recipes/http2-priority-signaling/tests/input/case2-request-priority.js rename to recipes/http2-priority-signaling/tests/case2-request-priority/input.js diff --git a/recipes/http2-priority-signaling/tests/expected/case3-stream-priority-method.js b/recipes/http2-priority-signaling/tests/case3-stream-priority-method/expected.js similarity index 100% rename from recipes/http2-priority-signaling/tests/expected/case3-stream-priority-method.js rename to recipes/http2-priority-signaling/tests/case3-stream-priority-method/expected.js diff --git a/recipes/http2-priority-signaling/tests/input/case3-stream-priority-method.js b/recipes/http2-priority-signaling/tests/case3-stream-priority-method/input.js similarity index 100% rename from recipes/http2-priority-signaling/tests/input/case3-stream-priority-method.js rename to recipes/http2-priority-signaling/tests/case3-stream-priority-method/input.js diff --git a/recipes/http2-priority-signaling/tests/expected/case4-settings-priority-esm.mjs b/recipes/http2-priority-signaling/tests/case4-settings-priority-esm/expected.mjs similarity index 100% rename from recipes/http2-priority-signaling/tests/expected/case4-settings-priority-esm.mjs rename to recipes/http2-priority-signaling/tests/case4-settings-priority-esm/expected.mjs diff --git a/recipes/http2-priority-signaling/tests/input/case4-settings-priority-esm.mjs b/recipes/http2-priority-signaling/tests/case4-settings-priority-esm/input.mjs similarity index 100% rename from recipes/http2-priority-signaling/tests/input/case4-settings-priority-esm.mjs rename to recipes/http2-priority-signaling/tests/case4-settings-priority-esm/input.mjs diff --git a/recipes/http2-priority-signaling/tests/expected/case5-dynamic-import.mjs b/recipes/http2-priority-signaling/tests/case5-dynamic-import/expected.mjs similarity index 100% rename from recipes/http2-priority-signaling/tests/expected/case5-dynamic-import.mjs rename to recipes/http2-priority-signaling/tests/case5-dynamic-import/expected.mjs diff --git a/recipes/http2-priority-signaling/tests/input/case5-dynamic-import.mjs b/recipes/http2-priority-signaling/tests/case5-dynamic-import/input.mjs similarity index 100% rename from recipes/http2-priority-signaling/tests/input/case5-dynamic-import.mjs rename to recipes/http2-priority-signaling/tests/case5-dynamic-import/input.mjs diff --git a/recipes/http2-priority-signaling/tests/expected/case6-dynamic-import-await.mjs b/recipes/http2-priority-signaling/tests/case6-dynamic-import-await/expected.mjs similarity index 100% rename from recipes/http2-priority-signaling/tests/expected/case6-dynamic-import-await.mjs rename to recipes/http2-priority-signaling/tests/case6-dynamic-import-await/expected.mjs diff --git a/recipes/http2-priority-signaling/tests/input/case6-dynamic-import-await.mjs b/recipes/http2-priority-signaling/tests/case6-dynamic-import-await/input.mjs similarity index 100% rename from recipes/http2-priority-signaling/tests/input/case6-dynamic-import-await.mjs rename to recipes/http2-priority-signaling/tests/case6-dynamic-import-await/input.mjs diff --git a/recipes/http2-priority-signaling/tests/expected/case7-require-myHttp2.js b/recipes/http2-priority-signaling/tests/case7-require-myHttp2/expected.js similarity index 100% rename from recipes/http2-priority-signaling/tests/expected/case7-require-myHttp2.js rename to recipes/http2-priority-signaling/tests/case7-require-myHttp2/expected.js diff --git a/recipes/http2-priority-signaling/tests/input/case7-require-myHttp2.js b/recipes/http2-priority-signaling/tests/case7-require-myHttp2/input.js similarity index 100% rename from recipes/http2-priority-signaling/tests/input/case7-require-myHttp2.js rename to recipes/http2-priority-signaling/tests/case7-require-myHttp2/input.js diff --git a/recipes/http2-priority-signaling/tests/expected/case8-require-connect.js b/recipes/http2-priority-signaling/tests/case8-require-connect/expected.js similarity index 100% rename from recipes/http2-priority-signaling/tests/expected/case8-require-connect.js rename to recipes/http2-priority-signaling/tests/case8-require-connect/expected.js diff --git a/recipes/http2-priority-signaling/tests/input/case8-require-connect.js b/recipes/http2-priority-signaling/tests/case8-require-connect/input.js similarity index 100% rename from recipes/http2-priority-signaling/tests/input/case8-require-connect.js rename to recipes/http2-priority-signaling/tests/case8-require-connect/input.js diff --git a/recipes/http2-priority-signaling/tests/expected/case9-require-connect-alias.js b/recipes/http2-priority-signaling/tests/case9-require-connect-alias/expected.js similarity index 100% rename from recipes/http2-priority-signaling/tests/expected/case9-require-connect-alias.js rename to recipes/http2-priority-signaling/tests/case9-require-connect-alias/expected.js diff --git a/recipes/http2-priority-signaling/tests/input/case9-require-connect-alias.js b/recipes/http2-priority-signaling/tests/case9-require-connect-alias/input.js similarity index 100% rename from recipes/http2-priority-signaling/tests/input/case9-require-connect-alias.js rename to recipes/http2-priority-signaling/tests/case9-require-connect-alias/input.js From 910c446315509feb87a4133d740d952487992908 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sun, 29 Mar 2026 13:47:04 +0200 Subject: [PATCH 12/12] Update package-lock.json --- package-lock.json | 1010 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 978 insertions(+), 32 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1e88d74e..d7dba011 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,8 @@ }, "node_modules/@ast-grep/cli": { "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/cli/-/cli-0.25.7.tgz", + "integrity": "sha512-vklcPRFHPHkwHq05nb2Fuaj4BYNWxhr8GIdB6la090jWob9FdbM/Jz86vlQp2tRELb2rKzuHeksG8qDrbX4REg==", "hasInstallScript": true, "dependencies": { "detect-libc": "2.0.3" @@ -43,6 +45,8 @@ }, "node_modules/@ast-grep/cli-darwin-arm64": { "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/cli-darwin-arm64/-/cli-darwin-arm64-0.25.7.tgz", + "integrity": "sha512-dkj8hy32mWuQwCJUEpnKwTS8tLE+e7dhvu6is+v5Q6AumOVlcL6PJWQsyaA4vedDm6XOGK9+WnyFpCnV3b5ouA==", "cpu": [ "arm64" ], @@ -55,8 +59,106 @@ "node": ">= 10" } }, + "node_modules/@ast-grep/cli-darwin-x64": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/cli-darwin-x64/-/cli-darwin-x64-0.25.7.tgz", + "integrity": "sha512-FBdv7GH3llH5LI0S2yeqgQM5QEUHeoYMhw1pv+C439UeL5BBFFjI+LYVALciwsYzuq/DQDTnT2cM0JhYGajDLQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ast-grep/cli-linux-arm64-gnu": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-0.25.7.tgz", + "integrity": "sha512-lsE+cSe4rFO8rvLhMM7PM3T83LlmV60H9dOH+1hq8thkWhLCL6vAJijEVWgAQDDvvZf3xnNVgG2GG4jOMfTuTQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ast-grep/cli-linux-x64-gnu": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/cli-linux-x64-gnu/-/cli-linux-x64-gnu-0.25.7.tgz", + "integrity": "sha512-uuF5GXgeUZtBrftJJYuQU7PvDT7Q9fJkKKwpIscEfQqLndri1tdYzzT9jKj2taWFlhiCVqLaDEHsdfTeWaVjZQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ast-grep/cli-win32-arm64-msvc": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-0.25.7.tgz", + "integrity": "sha512-GSWRjOnWybzNP5rnvPb6lQ7lSPoEIl64gk4uHE1h+a2nnFhT9REWTKFcmNB2aG8VmKEz1gu0pxpg9HmBe2OUBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ast-grep/cli-win32-ia32-msvc": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-0.25.7.tgz", + "integrity": "sha512-5p9PWbTeXaivQYixB+JkkpFKgY7G1Tm6R46Dhq6cHvKksiQ6lWlTOOmhl0QARtY7y3XP0MWuvjDEWCYrvYtO4A==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ast-grep/cli-win32-x64-msvc": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/cli-win32-x64-msvc/-/cli-win32-x64-msvc-0.25.7.tgz", + "integrity": "sha512-WjsRuyKTCeGWpMhvobzU/6HaWbseENPl5mNMZIKs8gsCpkUyTUfvV8/A2W29oHCgbDWRtixYppWtd87Qjpm6cg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@ast-grep/lang-bash": { "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@ast-grep/lang-bash/-/lang-bash-0.0.8.tgz", + "integrity": "sha512-qFykSsOdBv35I1rtt2PstJ4luzV9J1YCiFZBgySI8UPOh+TFnmpdlq9CrryNOj0Q7f6zZhc1OIau+/mUSs6HAg==", "dev": true, "hasInstallScript": true, "license": "ISC", @@ -74,6 +176,8 @@ }, "node_modules/@ast-grep/lang-json": { "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@ast-grep/lang-json/-/lang-json-0.0.7.tgz", + "integrity": "sha512-8wiH+B4Rih8/vHsUB4DOTXnQHMxfWhaBygUEZ036kfr1T9WFvx5E7QYd2WX2Wm1nFCzUmWbIfsoE+cR2G9SJlA==", "dev": true, "hasInstallScript": true, "license": "ISC", @@ -91,6 +195,8 @@ }, "node_modules/@ast-grep/napi": { "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi/-/napi-0.42.0.tgz", + "integrity": "sha512-f3DAjeC657EqbWN2In+girgbpvnKMV77bONyhuezXK4XQtvbGCB55u3CnNvQv6EP0caIBTtDHqO5CVyO6qY4LQ==", "dev": true, "license": "MIT", "engines": { @@ -110,6 +216,8 @@ }, "node_modules/@ast-grep/napi-darwin-arm64": { "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-darwin-arm64/-/napi-darwin-arm64-0.42.0.tgz", + "integrity": "sha512-HOPvjsrsASvfkRJGCd/++KZvfDCtBx6v8DKTEzzlc6fQJlhiRMPKe8T4d5I2T2rgV5pHsyJLSBLqEK7m346NTw==", "cpu": [ "arm64" ], @@ -123,13 +231,153 @@ "node": ">= 10" } }, + "node_modules/@ast-grep/napi-darwin-x64": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-darwin-x64/-/napi-darwin-x64-0.42.0.tgz", + "integrity": "sha512-q3jt+a6kDbXgbCSuIqaxjgLbTCDYGE2yb1o6metpsGbW+xVZR4ATYMJ8izyYhn2sQungTfUNn2/vo/2Bhbvpxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ast-grep/napi-linux-arm64-gnu": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-arm64-gnu/-/napi-linux-arm64-gnu-0.42.0.tgz", + "integrity": "sha512-+e2ThyRiBZATlcdgfrD7uYy9oWVS6/AdUTnC3xOwR+lCz80lr87kmcmeK6XN6hBwaqncBBkKV3ECMA8ibZPUZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ast-grep/napi-linux-arm64-musl": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-arm64-musl/-/napi-linux-arm64-musl-0.42.0.tgz", + "integrity": "sha512-f/oW3KaHuOMuBkCcvI6R71xM9SvkdUVKHhbJEtBFo5D1j6CjY9ipWdjlk9mOJ2KLLM6uYdjjvkJkBPlPuFTukg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ast-grep/napi-linux-x64-gnu": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-x64-gnu/-/napi-linux-x64-gnu-0.42.0.tgz", + "integrity": "sha512-y9T/Tm6V6zkmcAJlWXUO0ACYLSlk5o5NVU+AYun7NzDWIM86Y3lnoDF5WxeZKonVoaGAnkCXVlNH8Tsr/NTQWw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ast-grep/napi-linux-x64-musl": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-x64-musl/-/napi-linux-x64-musl-0.42.0.tgz", + "integrity": "sha512-t1PwL6YweDL63QDK3TC9QTKROcVgN4XoMxlp/zN2NYvCUM90mSvqh/Py/ouchzluHaqCzEeEp9089WFEDWwQOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ast-grep/napi-win32-arm64-msvc": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-arm64-msvc/-/napi-win32-arm64-msvc-0.42.0.tgz", + "integrity": "sha512-bxKLXF1JmU33BoJKrbWcGsG7Xmk2zCQaUjmeHrxhgBhg2w2zo3CSf5S6DOyOp13hefgLXBLn6oXNzXgqpX/+lA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ast-grep/napi-win32-ia32-msvc": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-ia32-msvc/-/napi-win32-ia32-msvc-0.42.0.tgz", + "integrity": "sha512-+/XbHDN+558rXwB2BylWPHj/cczRGDKivToHS2120TGQePmUetspu93wltqzAD7SVJnBILc2sEK1T1/jutZEvw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ast-grep/napi-win32-x64-msvc": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-x64-msvc/-/napi-win32-x64-msvc-0.42.0.tgz", + "integrity": "sha512-/5PTpk7EFuqwdJyKleX2gPztL5j73Nq/cdkEJQq1Fbx+ze+UM75JniW3D7J7WZygN58+EN9DAxpc2QOlK32urQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@ast-grep/setup-lang": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@ast-grep/setup-lang/-/setup-lang-0.0.6.tgz", + "integrity": "sha512-aSYZNF5nGQMxnwiA3Lcc8zi0AtpGlug47ADgqCgP/2n7p922FbnW7vo1rbW4kKjW72B/3mDdN7uvYidv8JnPnw==", "dev": true, "license": "ISC" }, "node_modules/@babel/code-frame": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", @@ -142,6 +390,8 @@ }, "node_modules/@babel/compat-data": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -149,6 +399,8 @@ }, "node_modules/@babel/core": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -177,6 +429,8 @@ }, "node_modules/@babel/generator": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "license": "MIT", "dependencies": { "@babel/parser": "^7.28.5", @@ -191,6 +445,8 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -201,6 +457,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.27.2", @@ -215,6 +473,8 @@ }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -234,6 +494,8 @@ }, "node_modules/@babel/helper-globals": { "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -241,6 +503,8 @@ }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.28.5", @@ -252,6 +516,8 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -263,6 +529,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", @@ -278,6 +546,8 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.1" @@ -288,6 +558,8 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -295,6 +567,8 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "license": "MIT", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", @@ -310,6 +584,8 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -321,6 +597,8 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -328,6 +606,8 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -335,6 +615,8 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -342,6 +624,8 @@ }, "node_modules/@babel/helpers": { "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", @@ -353,6 +637,8 @@ }, "node_modules/@babel/parser": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "license": "MIT", "dependencies": { "@babel/types": "^7.28.5" @@ -366,6 +652,8 @@ }, "node_modules/@babel/plugin-syntax-flow": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", + "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -379,6 +667,8 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -392,6 +682,8 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -405,6 +697,8 @@ }, "node_modules/@babel/plugin-transform-class-properties": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", @@ -419,6 +713,8 @@ }, "node_modules/@babel/plugin-transform-flow-strip-types": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -433,6 +729,8 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", @@ -447,6 +745,8 @@ }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -460,6 +760,8 @@ }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -474,6 +776,8 @@ }, "node_modules/@babel/plugin-transform-private-methods": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", @@ -488,6 +792,8 @@ }, "node_modules/@babel/plugin-transform-typescript": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -505,6 +811,8 @@ }, "node_modules/@babel/preset-flow": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.27.1.tgz", + "integrity": "sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -520,6 +828,8 @@ }, "node_modules/@babel/preset-typescript": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -537,6 +847,8 @@ }, "node_modules/@babel/register": { "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.28.3.tgz", + "integrity": "sha512-CieDOtd8u208eI49bYl4z1J22ySFw87IGwE+IswFEExH7e3rLgKb0WNQeumnacQ1+VoDJLYI5QFA3AJZuyZQfA==", "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", @@ -554,6 +866,8 @@ }, "node_modules/@babel/template": { "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -566,6 +880,8 @@ }, "node_modules/@babel/traverse": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -582,6 +898,8 @@ }, "node_modules/@babel/types": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -756,11 +1074,15 @@ }, "node_modules/@codemod.com/jssg-types": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@codemod.com/jssg-types/-/jssg-types-1.5.0.tgz", + "integrity": "sha512-zChRbxI3hBSGrAHnWlEzOw1FztLWMMiarwcr0Wbk0On4hmv7dVgoUqpIHfxb64mEMKJ5syTIKY3ZNd8DcFQa5w==", "dev": true, "license": "Apache-2.0" }, "node_modules/@codemod.com/workflow": { "version": "0.0.31", + "resolved": "https://registry.npmjs.org/@codemod.com/workflow/-/workflow-0.0.31.tgz", + "integrity": "sha512-8xmbxwjxr6d0ZUm3RS/eQqud2mUGXwQgf2v+YEjwQQVwOse6yShgoFljrg7ujvJlhzymivYloL0T0VSS9YubNw==", "license": "Apache-2.0", "dependencies": { "@ast-grep/cli": "^0.25.4", @@ -789,6 +1111,8 @@ }, "node_modules/@codemod.com/workflow/node_modules/@ast-grep/napi": { "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/napi/-/napi-0.25.7.tgz", + "integrity": "sha512-kDw/JNyOLttVbm2hl+55C9lXuUcuIFt31LQIpSptUkyTgI+2Cdqdeah2bNPe4/GQM2ysDjBDS4y1+9iQxMdJiw==", "license": "MIT", "engines": { "node": ">= 10" @@ -807,6 +1131,8 @@ }, "node_modules/@codemod.com/workflow/node_modules/@ast-grep/napi-darwin-arm64": { "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-darwin-arm64/-/napi-darwin-arm64-0.25.7.tgz", + "integrity": "sha512-qqI1JvB6ULgOUOVE3YviQNQ6KAYOnkiE8W5fNwVJGUgMkUuM8tUm1Nal3vfKCI7dnYgpcNlKxdTWGlbt7aHKNg==", "cpu": [ "arm64" ], @@ -819,8 +1145,138 @@ "node": ">= 10" } }, + "node_modules/@codemod.com/workflow/node_modules/@ast-grep/napi-darwin-x64": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-darwin-x64/-/napi-darwin-x64-0.25.7.tgz", + "integrity": "sha512-gq1Cf7US322ZJYPrVnAnn6eBLS6xi5catb5t99Wu6Rbm67XadEc81gtPTbPeNIu8FGgPjvKUc010rts2ZZbJeA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@codemod.com/workflow/node_modules/@ast-grep/napi-linux-arm64-gnu": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-arm64-gnu/-/napi-linux-arm64-gnu-0.25.7.tgz", + "integrity": "sha512-q+BzEC7wB7pkK+pQKbn4TVJThrEtvxjObz0okscPtxTNYvSJGv9jr3Nde5SYjdkfk8Ab4NgDMshVjKWVz2TSbQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@codemod.com/workflow/node_modules/@ast-grep/napi-linux-arm64-musl": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-arm64-musl/-/napi-linux-arm64-musl-0.25.7.tgz", + "integrity": "sha512-SEqZ6y0UhzmvZS938jIgR04kgHAW70hJ8yF4x9AkcqEhbeyqgElxIE7ve50ukDzs70fAKccdV8zYmebYN/7iPg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@codemod.com/workflow/node_modules/@ast-grep/napi-linux-x64-gnu": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-x64-gnu/-/napi-linux-x64-gnu-0.25.7.tgz", + "integrity": "sha512-8YuE/zTywTBb/iTm601JXTdWV2Redy9L9ab27aRD0hwX8FLmKUy8gK0fSo3xx+FyvSET49xkoR9tYdNaG2Wrkw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@codemod.com/workflow/node_modules/@ast-grep/napi-linux-x64-musl": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-x64-musl/-/napi-linux-x64-musl-0.25.7.tgz", + "integrity": "sha512-sT3eslR50IU6lHfqvq/c7vpxksJiB3h1NjEy1LpG+CYPuoLsQaB8j9OQlX8TqgVlDty/d/13cSls1Y3n/pm9xw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@codemod.com/workflow/node_modules/@ast-grep/napi-win32-arm64-msvc": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-arm64-msvc/-/napi-win32-arm64-msvc-0.25.7.tgz", + "integrity": "sha512-pDi9vyXzUbpiRwFTif6+R7ZIIVB1ZKcRUJLKSIPyYb39DcSX7aOuxQcSZderWnBrwPGxZKzdgztdQ16TuAz2IQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@codemod.com/workflow/node_modules/@ast-grep/napi-win32-ia32-msvc": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-ia32-msvc/-/napi-win32-ia32-msvc-0.25.7.tgz", + "integrity": "sha512-WFSNDMI5L9N9dK5zFQ6N900nhraOSYtKns/2p/EKZIKPBDXJSzzhT/jBakCSDix1GUs8K0XgkDoq2rXmuiBqXA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@codemod.com/workflow/node_modules/@ast-grep/napi-win32-x64-msvc": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-x64-msvc/-/napi-win32-x64-msvc-0.25.7.tgz", + "integrity": "sha512-HlsoVwQ9XrgNZ0JAmXgV5t8Ltx9tGyWZNS2UMY/2cvNU/SG9EpJLm1Bu9Mlk5seiJLbl28QTTbhZdfPKBzGTVQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@inquirer/external-editor": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", "license": "MIT", "dependencies": { "chardet": "^2.1.0", @@ -840,6 +1296,8 @@ }, "node_modules/@inquirer/figures": { "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", + "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", "license": "MIT", "engines": { "node": ">=18" @@ -847,6 +1305,8 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -862,6 +1322,8 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -872,6 +1334,8 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -882,10 +1346,14 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -901,6 +1369,8 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -914,6 +1384,8 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -929,6 +1401,8 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -937,6 +1411,8 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -945,6 +1421,8 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -952,10 +1430,14 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -964,6 +1446,8 @@ }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", "license": "MIT", "dependencies": { "debug": "^4.1.1" @@ -971,10 +1455,14 @@ }, "node_modules/@kwsites/promise-deferred": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", "license": "MIT" }, "node_modules/@nodejs-loaders/alias": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@nodejs-loaders/alias/-/alias-2.1.2.tgz", + "integrity": "sha512-thHaBXfGUbu7WpMqWt6Fw2xA6eN4faMl8kNFO8ufb2Ae4B9+9RhAg4vai1bFvzlBtnSTvUPU6qDz7sbpImFAbA==", "license": "ISC", "dependencies": { "json5": "^2.2.3" @@ -1113,6 +1601,8 @@ }, "node_modules/@octokit/auth-token": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", "license": "MIT", "engines": { "node": ">= 18" @@ -1120,6 +1610,8 @@ }, "node_modules/@octokit/core": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", + "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", "license": "MIT", "dependencies": { "@octokit/auth-token": "^4.0.0", @@ -1136,6 +1628,8 @@ }, "node_modules/@octokit/endpoint": { "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", + "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", @@ -1147,6 +1641,8 @@ }, "node_modules/@octokit/graphql": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", + "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", "license": "MIT", "dependencies": { "@octokit/request": "^8.4.1", @@ -1159,10 +1655,14 @@ }, "node_modules/@octokit/openapi-types": { "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { "version": "11.4.4-cjs.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.4-cjs.2.tgz", + "integrity": "sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==", "license": "MIT", "dependencies": { "@octokit/types": "^13.7.0" @@ -1176,6 +1676,8 @@ }, "node_modules/@octokit/plugin-request-log": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", + "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", "license": "MIT", "engines": { "node": ">= 18" @@ -1186,6 +1688,8 @@ }, "node_modules/@octokit/plugin-rest-endpoint-methods": { "version": "13.3.2-cjs.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.2-cjs.1.tgz", + "integrity": "sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==", "license": "MIT", "dependencies": { "@octokit/types": "^13.8.0" @@ -1199,6 +1703,8 @@ }, "node_modules/@octokit/request": { "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", + "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", "license": "MIT", "dependencies": { "@octokit/endpoint": "^9.0.6", @@ -1212,6 +1718,8 @@ }, "node_modules/@octokit/request-error": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", @@ -1224,6 +1732,8 @@ }, "node_modules/@octokit/rest": { "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.2.tgz", + "integrity": "sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==", "license": "MIT", "dependencies": { "@octokit/core": "^5.0.2", @@ -1237,6 +1747,8 @@ }, "node_modules/@octokit/types": { "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" @@ -1244,6 +1756,8 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", "optional": true, "engines": { @@ -1252,6 +1766,8 @@ }, "node_modules/@sindresorhus/slugify": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", + "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", "license": "MIT", "dependencies": { "@sindresorhus/transliterate": "^1.0.0", @@ -1266,6 +1782,8 @@ }, "node_modules/@sindresorhus/transliterate": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz", + "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==", "license": "MIT", "dependencies": { "escape-string-regexp": "^5.0.0" @@ -1279,6 +1797,8 @@ }, "node_modules/@types/jscodeshift": { "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@types/jscodeshift/-/jscodeshift-0.11.11.tgz", + "integrity": "sha512-d7CAfFGOupj5qCDqMODXxNz2/NwCv/Lha78ZFbnr6qpk3K98iSB8I+ig9ERE2+EeYML352VMRsjPyOpeA+04eQ==", "license": "MIT", "dependencies": { "ast-types": "^0.14.1", @@ -1287,6 +1807,8 @@ }, "node_modules/@types/node": { "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", "license": "MIT", "dependencies": { "undici-types": "~7.18.0" @@ -1294,6 +1816,8 @@ }, "node_modules/@types/node-fetch": { "version": "2.6.13", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -1301,28 +1825,28 @@ } }, "node_modules/@typescript/native-preview": { - "version": "7.0.0-dev.20260329.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20260329.1.tgz", - "integrity": "sha512-v5lJ0TgSt2m9yVk2xoj9+NH/gTDeWTLaWGPx6MJsUKOYd6bmCJhHbMcWmb8d/zlfhE9ffpixUKYj62CdYfriqA==", + "version": "7.0.0-dev.20260323.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20260323.1.tgz", + "integrity": "sha512-e8rnqL5I4DUSjiy6jiWqYFKcgKq8tC4S+uEmJwWiyTgSIGDhaRUujJ2pb6EXmi+NPeXoES6vIG7e9BsEV0WSow==", "dev": true, "license": "Apache-2.0", "bin": { "tsgo": "bin/tsgo.js" }, "optionalDependencies": { - "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260329.1", - "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260329.1", - "@typescript/native-preview-linux-arm": "7.0.0-dev.20260329.1", - "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260329.1", - "@typescript/native-preview-linux-x64": "7.0.0-dev.20260329.1", - "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260329.1", - "@typescript/native-preview-win32-x64": "7.0.0-dev.20260329.1" + "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260323.1", + "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260323.1", + "@typescript/native-preview-linux-arm": "7.0.0-dev.20260323.1", + "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260323.1", + "@typescript/native-preview-linux-x64": "7.0.0-dev.20260323.1", + "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260323.1", + "@typescript/native-preview-win32-x64": "7.0.0-dev.20260323.1" } }, "node_modules/@typescript/native-preview-darwin-arm64": { - "version": "7.0.0-dev.20260329.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20260329.1.tgz", - "integrity": "sha512-zS1thDk7luD82nXVwvMd97F7FgxAE6jGtSmnHeXdaQ+6hJQcQLOVkfUdaehhdodqKDapWA2jEURxQAYjDGvv3g==", + "version": "7.0.0-dev.20260323.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20260323.1.tgz", + "integrity": "sha512-C3tQdgMaYn57xzRUWek+zNKMiP0z9j7fqbCjr0wlyiLNIh5jMwDArjBDKHlqSu58FKvZg7baqbqB5Mcepb3s6w==", "cpu": [ "arm64" ], @@ -1334,9 +1858,9 @@ ] }, "node_modules/@typescript/native-preview-darwin-x64": { - "version": "7.0.0-dev.20260329.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20260329.1.tgz", - "integrity": "sha512-3IJ2qmpjQ1OXpZNUhJRjF1+SbDuqGC14Ug8DjWJlPBp06isi1fcJph90f5qW//FxEsNnJPYRcNwpP0A2RbTASg==", + "version": "7.0.0-dev.20260323.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20260323.1.tgz", + "integrity": "sha512-YE6pD4wdMqNgaBkXicQBLFwABOEmLxDclSM7grl0fw4cQSbfVwFCbSlwFDkmISKdmsgtWdYeMohrsTU710ufpg==", "cpu": [ "x64" ], @@ -1348,9 +1872,9 @@ ] }, "node_modules/@typescript/native-preview-linux-arm": { - "version": "7.0.0-dev.20260329.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20260329.1.tgz", - "integrity": "sha512-WKSSJrH611DFFAg6YCkgbnkdy0a4RRpzvDpNXtPzLTbMYC5oJdq3Dpvncx5nrJvGh4J4yvzXoMxraGPyygqGLw==", + "version": "7.0.0-dev.20260323.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20260323.1.tgz", + "integrity": "sha512-6zFO/SF9Gu8rtRyEt1b10TNapQGq5b/wUjCLG14675n155r4EO3JFMgnltBViV2Eatnq7G+bXD65BUBk7Ixyhw==", "cpu": [ "arm" ], @@ -1362,9 +1886,9 @@ ] }, "node_modules/@typescript/native-preview-linux-arm64": { - "version": "7.0.0-dev.20260329.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20260329.1.tgz", - "integrity": "sha512-gQb6SjB5JlUKDaDuz6mv/m+/OBWVDlcjHINFOykBZZYZtgxBx6nEDjLrT8TiJRjmHEG6hSbv+yisUL9IThWycA==", + "version": "7.0.0-dev.20260323.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20260323.1.tgz", + "integrity": "sha512-Jzr2gBY0ifA3XejAl7kPeHLT72JFBfzLSafOAQbANh5Iag02uPl99k8ORMfKREbYgEMMOzqPpe+r6eaKy+VEfw==", "cpu": [ "arm64" ], @@ -1376,9 +1900,9 @@ ] }, "node_modules/@typescript/native-preview-linux-x64": { - "version": "7.0.0-dev.20260329.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20260329.1.tgz", - "integrity": "sha512-kg4r+ssxoEWruBynUg9bFMdcMpo5NupzAPqNBlV8uWbmYGZjaPLonFWAi9ZZMiVJY/x5ZQ9GBl6xskwLdd3PJQ==", + "version": "7.0.0-dev.20260323.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20260323.1.tgz", + "integrity": "sha512-UvsQdVI/LayXTowltMgtg2GHU/a/lcuOYbaAYm9+/nvgIs01VqVo0s1/lTSNBzepEk0y1EOYQ6SIsRM9lLGHxA==", "cpu": [ "x64" ], @@ -1390,9 +1914,9 @@ ] }, "node_modules/@typescript/native-preview-win32-arm64": { - "version": "7.0.0-dev.20260329.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20260329.1.tgz", - "integrity": "sha512-Qi4lddVxl5MG7Tk67gYhCFnoqqLGd4TvaI8RN4qHFjt3GV8s6c+0cQGsJXJnVgMx27qbyDTdsyAa2pvb42rYcQ==", + "version": "7.0.0-dev.20260323.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20260323.1.tgz", + "integrity": "sha512-3208Xoe+3Xblf6WLVTkIdyh6401zB2eXAhu1UaDpZY0rf8SMHCxKW3TSJDytpri5UivCotZ0CNC2wgJ1TlymUA==", "cpu": [ "arm64" ], @@ -1404,9 +1928,9 @@ ] }, "node_modules/@typescript/native-preview-win32-x64": { - "version": "7.0.0-dev.20260329.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20260329.1.tgz", - "integrity": "sha512-+k5+usuB8HZ6Xc+enLdb95ZJd25bQqsnI1zXxfRCHP+RS9mxs70Mi9ezQz3lKOLZFFXShSH7iW9iulm8KwVzCQ==", + "version": "7.0.0-dev.20260323.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20260323.1.tgz", + "integrity": "sha512-DAiRqrcs58eXwjFOtbklbIHq70IpW7uYz1Bx3kNAzqoWlA7R4mC29N6G0kGEZDalGmj7f0HVuckq9AzaC1r6oQ==", "cpu": [ "x64" ], @@ -1419,6 +1943,8 @@ }, "node_modules/abort-controller": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" @@ -1429,6 +1955,8 @@ }, "node_modules/agentkeepalive": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "license": "MIT", "dependencies": { "humanize-ms": "^1.2.1" @@ -1439,6 +1967,8 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "license": "MIT", "dependencies": { "type-fest": "^0.21.3" @@ -1452,6 +1982,8 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { "node": ">=8" @@ -1459,6 +1991,8 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -1472,6 +2006,8 @@ }, "node_modules/ast-types": { "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", "license": "MIT", "dependencies": { "tslib": "^2.0.1" @@ -1482,10 +2018,14 @@ }, "node_modules/asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, "node_modules/babel-core": { "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", "license": "MIT", "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -1493,13 +2033,19 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/base-64": { - "version": "0.1.0" + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", + "integrity": "sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==" }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -1518,6 +2064,8 @@ }, "node_modules/baseline-browser-mapping": { "version": "2.8.24", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.24.tgz", + "integrity": "sha512-uUhTRDPXamakPyghwrUcjaGvvBqGrWvBHReoiULMIpOJVM9IYzQh83Xk2Onx5HlGI2o10NNCzcs9TG/S3TkwrQ==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -1525,10 +2073,14 @@ }, "node_modules/before-after-hook": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", "license": "Apache-2.0" }, "node_modules/bl": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", "dependencies": { "buffer": "^5.5.0", @@ -1538,6 +2090,8 @@ }, "node_modules/brace-expansion": { "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -1548,6 +2102,8 @@ }, "node_modules/brace-expansion/node_modules/balanced-match": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "license": "MIT", "engines": { "node": "18 || 20 || >=22" @@ -1555,6 +2111,8 @@ }, "node_modules/braces": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -1565,6 +2123,8 @@ }, "node_modules/browserslist": { "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", "funding": [ { "type": "opencollective", @@ -1596,6 +2156,8 @@ }, "node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -1618,10 +2180,14 @@ }, "node_modules/buffer-from": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -1633,6 +2199,8 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001753", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz", + "integrity": "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==", "funding": [ { "type": "opencollective", @@ -1651,6 +2219,8 @@ }, "node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -1665,10 +2235,14 @@ }, "node_modules/chardet": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "license": "MIT" }, "node_modules/charenc": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "license": "BSD-3-Clause", "engines": { "node": "*" @@ -1676,6 +2250,8 @@ }, "node_modules/cli-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" @@ -1686,6 +2262,8 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", "engines": { "node": ">=6" @@ -1696,6 +2274,8 @@ }, "node_modules/cli-width": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "license": "ISC", "engines": { "node": ">= 12" @@ -1703,6 +2283,8 @@ }, "node_modules/clone": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", "engines": { "node": ">=0.8" @@ -1710,6 +2292,8 @@ }, "node_modules/clone-deep": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", @@ -1722,6 +2306,8 @@ }, "node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -1732,10 +2318,14 @@ }, "node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/colors-cli": { "version": "1.0.33", + "resolved": "https://registry.npmjs.org/colors-cli/-/colors-cli-1.0.33.tgz", + "integrity": "sha512-PWGsmoJFdOB0t+BeHgmtuoRZUQucOLl5ii81NBzOOGVxlgE04muFNHlR5j8i8MKbOPELBl3243AI6lGBTj5ICQ==", "license": "MIT", "bin": { "colors": "bin/colors" @@ -1746,6 +2336,8 @@ }, "node_modules/combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -1756,18 +2348,26 @@ }, "node_modules/commondir": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -1780,6 +2380,8 @@ }, "node_modules/crypt": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "license": "BSD-3-Clause", "engines": { "node": "*" @@ -1787,6 +2389,8 @@ }, "node_modules/debug": { "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1802,6 +2406,8 @@ }, "node_modules/dedent": { "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1815,6 +2421,8 @@ }, "node_modules/defaults": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", "dependencies": { "clone": "^1.0.2" @@ -1825,6 +2433,8 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -1832,10 +2442,14 @@ }, "node_modules/deprecation": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "license": "ISC" }, "node_modules/detect-indent": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", "license": "MIT", "engines": { "node": ">=12.20" @@ -1846,6 +2460,8 @@ }, "node_modules/detect-libc": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -1853,6 +2469,8 @@ }, "node_modules/detect-newline": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", + "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -1863,6 +2481,8 @@ }, "node_modules/diff": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -1870,6 +2490,8 @@ }, "node_modules/digest-fetch": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/digest-fetch/-/digest-fetch-1.3.0.tgz", + "integrity": "sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==", "license": "ISC", "dependencies": { "base-64": "^0.1.0", @@ -1878,6 +2500,8 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -1890,18 +2514,26 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, "node_modules/electron-to-chromium": { "version": "1.5.244", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.244.tgz", + "integrity": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==", "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/es-define-property": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -1909,6 +2541,8 @@ }, "node_modules/es-errors": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -1916,6 +2550,8 @@ }, "node_modules/es-object-atoms": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -1926,6 +2562,8 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -1939,6 +2577,8 @@ }, "node_modules/escalade": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" @@ -1946,6 +2586,8 @@ }, "node_modules/escape-string-regexp": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "license": "MIT", "engines": { "node": ">=12" @@ -1956,6 +2598,8 @@ }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -1967,6 +2611,8 @@ }, "node_modules/event-target-shim": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", "engines": { "node": ">=6" @@ -1974,6 +2620,8 @@ }, "node_modules/filename-reserved-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", + "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -1984,6 +2632,8 @@ }, "node_modules/filenamify": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-6.0.0.tgz", + "integrity": "sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ==", "license": "MIT", "dependencies": { "filename-reserved-regex": "^3.0.0" @@ -1997,6 +2647,8 @@ }, "node_modules/fill-range": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -2007,6 +2659,8 @@ }, "node_modules/find-cache-dir": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "license": "MIT", "dependencies": { "commondir": "^1.0.1", @@ -2019,6 +2673,8 @@ }, "node_modules/find-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "license": "MIT", "dependencies": { "locate-path": "^3.0.0" @@ -2029,6 +2685,8 @@ }, "node_modules/flow-parser": { "version": "0.289.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.289.0.tgz", + "integrity": "sha512-w4sVnH6ddNAIxokoz0mGyiIIdzvqncFhAYW+RmkPbPSSTYozG6yhqAixzaWeBCQf2qqXJTlHkoKPnf/BAj8Ofw==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -2036,6 +2694,8 @@ }, "node_modules/foreground-child": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", "dependencies": { "cross-spawn": "^7.0.6", @@ -2050,6 +2710,8 @@ }, "node_modules/form-data": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -2064,10 +2726,14 @@ }, "node_modules/form-data-encoder": { "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", "license": "MIT" }, "node_modules/formdata-node": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", "license": "MIT", "dependencies": { "node-domexception": "1.0.0", @@ -2079,6 +2745,8 @@ }, "node_modules/formdata-node/node_modules/web-streams-polyfill": { "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", "license": "MIT", "engines": { "node": ">= 14" @@ -2086,10 +2754,14 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2097,6 +2769,8 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2104,6 +2778,8 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -2126,6 +2802,8 @@ }, "node_modules/get-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -2137,6 +2815,8 @@ }, "node_modules/git-up": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "license": "MIT", "dependencies": { "is-ssh": "^1.4.0", @@ -2145,6 +2825,8 @@ }, "node_modules/git-url-parse": { "version": "14.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.1.0.tgz", + "integrity": "sha512-8xg65dTxGHST3+zGpycMMFZcoTzAdZ2dOtu4vmgIfkTFnVHBxHMzBC2L1k8To7EmrSiHesT8JgPLT91VKw1B5g==", "license": "MIT", "dependencies": { "git-up": "^7.0.0" @@ -2152,6 +2834,8 @@ }, "node_modules/glob": { "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -2170,6 +2854,8 @@ }, "node_modules/gopd": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2180,10 +2866,14 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, "node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -2191,6 +2881,8 @@ }, "node_modules/has-symbols": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2201,6 +2893,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -2214,6 +2908,8 @@ }, "node_modules/hasown": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -2224,6 +2920,8 @@ }, "node_modules/humanize-ms": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "license": "MIT", "dependencies": { "ms": "^2.0.0" @@ -2231,6 +2929,8 @@ }, "node_modules/iconv-lite": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -2245,6 +2945,8 @@ }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -2263,6 +2965,8 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "license": "MIT", "engines": { "node": ">=0.8.19" @@ -2270,6 +2974,9 @@ }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -2278,10 +2985,14 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/inquirer": { "version": "9.3.8", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.8.tgz", + "integrity": "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==", "license": "MIT", "dependencies": { "@inquirer/external-editor": "^1.0.2", @@ -2303,10 +3014,14 @@ }, "node_modules/is-buffer": { "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "license": "MIT" }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -2314,6 +3029,8 @@ }, "node_modules/is-interactive": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", "engines": { "node": ">=8" @@ -2321,6 +3038,8 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -2328,6 +3047,8 @@ }, "node_modules/is-plain-object": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "license": "MIT", "dependencies": { "isobject": "^3.0.1" @@ -2338,6 +3059,8 @@ }, "node_modules/is-ssh": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", + "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", "license": "MIT", "dependencies": { "protocols": "^2.0.1" @@ -2345,6 +3068,8 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "license": "MIT", "engines": { "node": ">=10" @@ -2355,10 +3080,14 @@ }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -2366,6 +3095,8 @@ }, "node_modules/jackspeak": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -2379,10 +3110,14 @@ }, "node_modules/js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, "node_modules/jscodeshift": { "version": "0.15.2", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz", + "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==", "license": "MIT", "dependencies": { "@babel/core": "^7.23.0", @@ -2420,6 +3155,8 @@ }, "node_modules/jscodeshift/node_modules/ast-types": { "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", "license": "MIT", "dependencies": { "tslib": "^2.0.1" @@ -2430,6 +3167,8 @@ }, "node_modules/jscodeshift/node_modules/recast": { "version": "0.23.11", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", "license": "MIT", "dependencies": { "ast-types": "^0.16.1", @@ -2444,6 +3183,8 @@ }, "node_modules/jsesc": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -2454,6 +3195,8 @@ }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -2464,6 +3207,8 @@ }, "node_modules/kind-of": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -2471,6 +3216,8 @@ }, "node_modules/locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "license": "MIT", "dependencies": { "p-locate": "^3.0.0", @@ -2482,10 +3229,14 @@ }, "node_modules/lodash-es": { "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "license": "MIT", "dependencies": { "chalk": "^4.1.0", @@ -2500,6 +3251,8 @@ }, "node_modules/lru-cache": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -2507,6 +3260,8 @@ }, "node_modules/magic-string": { "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -2514,6 +3269,8 @@ }, "node_modules/make-dir": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "license": "MIT", "dependencies": { "pify": "^4.0.1", @@ -2525,6 +3282,8 @@ }, "node_modules/make-dir/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "license": "ISC", "bin": { "semver": "bin/semver" @@ -2532,6 +3291,8 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2539,6 +3300,8 @@ }, "node_modules/md5": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", "license": "BSD-3-Clause", "dependencies": { "charenc": "0.0.2", @@ -2548,6 +3311,8 @@ }, "node_modules/micromatch": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -2559,6 +3324,8 @@ }, "node_modules/mime-db": { "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -2566,6 +3333,8 @@ }, "node_modules/mime-types": { "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -2576,6 +3345,8 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", "engines": { "node": ">=6" @@ -2583,6 +3354,8 @@ }, "node_modules/minimatch": { "version": "9.0.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", + "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", "license": "ISC", "dependencies": { "brace-expansion": "^5.0.2" @@ -2596,6 +3369,8 @@ }, "node_modules/minipass": { "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" @@ -2603,10 +3378,14 @@ }, "node_modules/ms": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/mute-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -2614,10 +3393,14 @@ }, "node_modules/neo-async": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "license": "MIT" }, "node_modules/node-dir": { "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", "license": "MIT", "dependencies": { "minimatch": "^3.0.2" @@ -2628,6 +3411,8 @@ }, "node_modules/node-dir/node_modules/brace-expansion": { "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -2636,6 +3421,8 @@ }, "node_modules/node-dir/node_modules/minimatch": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -2646,6 +3433,9 @@ }, "node_modules/node-domexception": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", "funding": [ { "type": "github", @@ -2663,6 +3453,8 @@ }, "node_modules/node-fetch": { "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -2681,10 +3473,14 @@ }, "node_modules/node-releases": { "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -2692,6 +3488,8 @@ }, "node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -2705,6 +3503,8 @@ }, "node_modules/openai": { "version": "4.23.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.23.0.tgz", + "integrity": "sha512-ey2CXh1OTcTUa0AWZWuTpgA9t5GuAG3DVU1MofCRUI7fQJij8XJ3Sr0VtgxoAE69C9wbHBMCux8Z/IQZfSwHiA==", "license": "Apache-2.0", "dependencies": { "@types/node": "^18.11.18", @@ -2723,6 +3523,8 @@ }, "node_modules/openai/node_modules/@types/node": { "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", "license": "MIT", "dependencies": { "undici-types": "~5.26.4" @@ -2730,10 +3532,14 @@ }, "node_modules/openai/node_modules/undici-types": { "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "license": "MIT" }, "node_modules/ora": { "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", "dependencies": { "bl": "^4.1.0", @@ -2755,6 +3561,8 @@ }, "node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -2768,6 +3576,8 @@ }, "node_modules/p-locate": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "license": "MIT", "dependencies": { "p-limit": "^2.0.0" @@ -2778,6 +3588,8 @@ }, "node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "license": "MIT", "engines": { "node": ">=6" @@ -2785,10 +3597,14 @@ }, "node_modules/package-json-from-dist": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "license": "BlueOak-1.0.0" }, "node_modules/parse-path": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", + "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", "license": "MIT", "dependencies": { "protocols": "^2.0.0" @@ -2796,6 +3612,8 @@ }, "node_modules/parse-url": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "license": "MIT", "dependencies": { "parse-path": "^7.0.0" @@ -2803,6 +3621,8 @@ }, "node_modules/path-exists": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "license": "MIT", "engines": { "node": ">=4" @@ -2810,6 +3630,8 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -2817,6 +3639,8 @@ }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -2824,6 +3648,8 @@ }, "node_modules/path-scurry": { "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", @@ -2838,14 +3664,20 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, "node_modules/picocolors": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -2856,6 +3688,8 @@ }, "node_modules/pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "license": "MIT", "engines": { "node": ">=6" @@ -2863,6 +3697,8 @@ }, "node_modules/pirates": { "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "license": "MIT", "engines": { "node": ">= 6" @@ -2870,6 +3706,8 @@ }, "node_modules/pkg-dir": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "license": "MIT", "dependencies": { "find-up": "^3.0.0" @@ -2880,6 +3718,8 @@ }, "node_modules/prettier": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" @@ -2893,10 +3733,14 @@ }, "node_modules/protocols": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", + "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", "license": "MIT" }, "node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -2909,6 +3753,8 @@ }, "node_modules/recast": { "version": "0.20.5", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.5.tgz", + "integrity": "sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==", "license": "MIT", "dependencies": { "ast-types": "0.14.2", @@ -2922,6 +3768,8 @@ }, "node_modules/restore-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", "dependencies": { "onetime": "^5.1.0", @@ -2933,10 +3781,15 @@ }, "node_modules/restore-cursor/node_modules/signal-exit": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, "node_modules/rimraf": { "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -2947,6 +3800,8 @@ }, "node_modules/rimraf/node_modules/brace-expansion": { "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -2955,6 +3810,9 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -2973,6 +3831,8 @@ }, "node_modules/rimraf/node_modules/minimatch": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -2983,6 +3843,8 @@ }, "node_modules/run-async": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -2990,6 +3852,8 @@ }, "node_modules/rxjs": { "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -2997,6 +3861,8 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -3015,10 +3881,14 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3026,6 +3896,8 @@ }, "node_modules/shallow-clone": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "license": "MIT", "dependencies": { "kind-of": "^6.0.2" @@ -3036,6 +3908,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -3046,6 +3920,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" @@ -3053,6 +3929,8 @@ }, "node_modules/signal-exit": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "license": "ISC", "engines": { "node": ">=14" @@ -3063,6 +3941,8 @@ }, "node_modules/simple-git": { "version": "3.30.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz", + "integrity": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==", "license": "MIT", "dependencies": { "@kwsites/file-exists": "^1.1.1", @@ -3076,6 +3956,8 @@ }, "node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -3083,6 +3965,8 @@ }, "node_modules/source-map-support": { "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -3091,6 +3975,8 @@ }, "node_modules/string_decoder": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -3098,6 +3984,8 @@ }, "node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -3111,6 +3999,8 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -3123,6 +4013,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -3134,6 +4026,8 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -3144,6 +4038,8 @@ }, "node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -3154,6 +4050,8 @@ }, "node_modules/temp": { "version": "0.8.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", + "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", "license": "MIT", "dependencies": { "rimraf": "~2.6.2" @@ -3164,10 +4062,14 @@ }, "node_modules/tiny-invariant": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -3178,10 +4080,14 @@ }, "node_modules/tr46": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, "node_modules/tree-kill": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "license": "MIT", "bin": { "tree-kill": "cli.js" @@ -3189,6 +4095,8 @@ }, "node_modules/ts-invariant": { "version": "0.10.3", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", + "integrity": "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==", "license": "MIT", "dependencies": { "tslib": "^2.1.0" @@ -3199,10 +4107,14 @@ }, "node_modules/tslib": { "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/type-fest": { "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -3213,14 +4125,20 @@ }, "node_modules/undici-types": { "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "license": "MIT" }, "node_modules/universal-user-agent": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", "license": "ISC" }, "node_modules/update-browserslist-db": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", "funding": [ { "type": "opencollective", @@ -3249,10 +4167,14 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, "node_modules/wcwidth": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", "dependencies": { "defaults": "^1.0.3" @@ -3260,6 +4182,8 @@ }, "node_modules/web-streams-polyfill": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", "license": "MIT", "engines": { "node": ">= 8" @@ -3267,10 +4191,14 @@ }, "node_modules/webidl-conversions": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -3279,6 +4207,8 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -3292,6 +4222,8 @@ }, "node_modules/wrap-ansi": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -3305,6 +4237,8 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -3320,10 +4254,14 @@ }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/write-file-atomic": { "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "license": "ISC", "dependencies": { "graceful-fs": "^4.1.11", @@ -3333,14 +4271,20 @@ }, "node_modules/write-file-atomic/node_modules/signal-exit": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, "node_modules/yallist": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC" }, "node_modules/yaml": { "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -3351,6 +4295,8 @@ }, "node_modules/yoctocolors-cjs": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "license": "MIT", "engines": { "node": ">=18"