From 21b6e0b71182b7556b8b4886b6a702befb4dee6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Sun, 3 Aug 2025 22:59:12 +0530 Subject: [PATCH 01/43] feat(tls.createSecureContext): introduce --- recipes/crypto-createCredentials/README.md | 51 +++ recipes/crypto-createCredentials/codemod.yaml | 21 ++ recipes/crypto-createCredentials/package.json | 25 ++ .../crypto-createCredentials/src/workflow.ts | 328 ++++++++++++++++++ .../tests/expected/file-1.js | 7 + .../tests/expected/file-2.js | 6 + .../tests/expected/file-3.js | 10 + .../tests/expected/file-4.mjs | 7 + .../tests/expected/file-5.mjs | 6 + .../tests/input/file-1.js | 7 + .../tests/input/file-2.js | 6 + .../tests/input/file-3.js | 9 + .../tests/input/file-4.mjs | 7 + .../tests/input/file-5.mjs | 6 + .../crypto-createCredentials/tsconfig.json | 23 ++ .../crypto-createCredentials/workflow.yaml | 25 ++ 16 files changed, 544 insertions(+) create mode 100644 recipes/crypto-createCredentials/README.md create mode 100644 recipes/crypto-createCredentials/codemod.yaml create mode 100644 recipes/crypto-createCredentials/package.json create mode 100644 recipes/crypto-createCredentials/src/workflow.ts create mode 100644 recipes/crypto-createCredentials/tests/expected/file-1.js create mode 100644 recipes/crypto-createCredentials/tests/expected/file-2.js create mode 100644 recipes/crypto-createCredentials/tests/expected/file-3.js create mode 100644 recipes/crypto-createCredentials/tests/expected/file-4.mjs create mode 100644 recipes/crypto-createCredentials/tests/expected/file-5.mjs create mode 100644 recipes/crypto-createCredentials/tests/input/file-1.js create mode 100644 recipes/crypto-createCredentials/tests/input/file-2.js create mode 100644 recipes/crypto-createCredentials/tests/input/file-3.js create mode 100644 recipes/crypto-createCredentials/tests/input/file-4.mjs create mode 100644 recipes/crypto-createCredentials/tests/input/file-5.mjs create mode 100644 recipes/crypto-createCredentials/tsconfig.json create mode 100644 recipes/crypto-createCredentials/workflow.yaml diff --git a/recipes/crypto-createCredentials/README.md b/recipes/crypto-createCredentials/README.md new file mode 100644 index 00000000..b3bace49 --- /dev/null +++ b/recipes/crypto-createCredentials/README.md @@ -0,0 +1,51 @@ +# `fs.rmdir` DEP0147 + +This recipe provides a guide for migrating from the deprecated `crypto.createCredentials` method in Node.js. + +See [DEP0010](https://nodejs.org/api/deprecations.html#DEP0010). + +## Examples + +**Before:** + +```js +// Using the deprecated createCredentials from node:crypto +const { createCredentials } = require('node:crypto'); + +const credentials = createCredentials({ + key: privateKey, + cert: certificate, + ca: [caCertificate] +}); + +// Using destructuring with ES module imports +import { createCredentials } from 'node:crypto'; + +const credentials = createCredentials({ + key: privateKey, + cert: certificate, + ca: [caCertificate] +}); +``` + +**After:** + +```js +// Updated to use createSecureContext from node:tls +const { createSecureContext } = require('node:tls'); + +const credentials = createSecureContext({ + key: privateKey, + cert: certificate, + ca: [caCertificate] +}); + +// Updated ES module import +import { createSecureContext } from 'node:tls'; + +const credentials = createSecureContext({ + key: privateKey, + cert: certificate, + ca: [caCertificate] +}); +``` diff --git a/recipes/crypto-createCredentials/codemod.yaml b/recipes/crypto-createCredentials/codemod.yaml new file mode 100644 index 00000000..eded0cba --- /dev/null +++ b/recipes/crypto-createCredentials/codemod.yaml @@ -0,0 +1,21 @@ +schema_version: "1.0" +name: "@nodejs/crypto-createCredentials" +version: 1.0.0 +description: Handle DEP0010 via transforming `crypto.createCredentials` to `tls.createSecureContext` +author: 0hmx +license: MIT +workflow: workflow.yaml +category: migration + +targets: + languages: + - javascript + - typescript + +keywords: + - transformation + - migration + +registry: + access: public + visibility: public diff --git a/recipes/crypto-createCredentials/package.json b/recipes/crypto-createCredentials/package.json new file mode 100644 index 00000000..8dbd7078 --- /dev/null +++ b/recipes/crypto-createCredentials/package.json @@ -0,0 +1,25 @@ +{ + "name": "@nodejs/crypto-createCredentials", + "version": "1.0.0", + "description": "Handle DEP0010 via transforming `crypto.createCredentials` to `tls.createSecureContext` with the appropriate options.", + "type": "module", + "scripts": { + "test": "npx codemod@next jssg test -l typescript ./src/workflow.ts ./" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/nodejs/userland-migrations.git", + "directory": "recipes/rmdirs", + "bugs": "https://github.com/nodejs/userland-migrations/issues" + }, + "author": "0hmx", + "license": "MIT", + "homepage": "https://github.com/nodejs/userland-migrations/blob/main/recipes/rmdirs/README.md", + "devDependencies": { + "@types/node": "^24.0.3", + "@codemod.com/jssg-types": "^1.0.3" + }, + "dependencies": { + "@nodejs/codemod-utils": "*" + } +} diff --git a/recipes/crypto-createCredentials/src/workflow.ts b/recipes/crypto-createCredentials/src/workflow.ts new file mode 100644 index 00000000..397b3044 --- /dev/null +++ b/recipes/crypto-createCredentials/src/workflow.ts @@ -0,0 +1,328 @@ +import type { SgRoot, Edit, SgNode } from "@codemod.com/jssg-types/main"; + +type ImportType = + | 'DESTRUCTURED_REQUIRE' + | 'NAMESPACE_REQUIRE' + | 'DESTRUCTURED_IMPORT' + | 'NAMESPACE_IMPORT'; + +function ensureTlsImport( + rootNode: SgNode, + edits: Edit[], + importType: ImportType, + tlsImportState: { added: boolean; identifier: string }, +): string { + if (tlsImportState.added) { + return tlsImportState.identifier; + } + + const isEsm = + importType === 'DESTRUCTURED_IMPORT' || importType === 'NAMESPACE_IMPORT'; + const moduleSpecifier = 'node:tls'; + + const findRule = { + rule: { + kind: isEsm ? 'import_statement' : 'variable_declarator', + has: { + field: isEsm ? 'source' : 'value', + has: { regex: `^['"](node:)?tls['"]$` }, + }, + }, + }; + const existingTlsImport = rootNode.find(findRule); + + if (existingTlsImport) { + const nameNode = existingTlsImport.field('name'); + if (nameNode?.is('identifier')) { + tlsImportState.identifier = nameNode.text(); + tlsImportState.added = true; + return tlsImportState.identifier; + } + } + + const firstNode = rootNode.children()[0]; + if (firstNode) { + const newImportText = isEsm + ? `import * as ${tlsImportState.identifier} from '${moduleSpecifier}';\n` + : `const ${tlsImportState.identifier} = require('${moduleSpecifier}');\n`; + + const edit = { + startPos: firstNode.range().start.index, + endPos: firstNode.range().start.index, + insertedText: newImportText, + }; + edits.push(edit); + } + + tlsImportState.added = true; + return tlsImportState.identifier; +} + +function handleDestructuredImport( + statement: SgNode, + rootNode: SgNode, + edits: Edit[], + tlsImportState: { added: boolean }, +) { + const isEsm = statement.kind() === 'import_statement'; + + let specifiersNode; + if (isEsm) { + specifiersNode = + statement.find({ rule: { kind: 'named_imports' } }) ?? + statement.field('imports'); + } else { + const declaratorFindRule = { + rule: { + kind: 'variable_declarator', + has: { + field: 'value', + kind: 'call_expression', + has: { + field: 'arguments', + has: { regex: "^['\"](node:)?crypto['\"]$" }, + }, + }, + }, + }; + const declarator = statement.find(declaratorFindRule); + specifiersNode = declarator?.field('name'); + } + + if (!specifiersNode) { + return false; + } + + const findPropsRule = { + rule: { + any: [ + { kind: 'shorthand_property_identifier_pattern' }, + { kind: 'import_specifier' }, + ], + }, + }; + const destructuredProps = specifiersNode.findAll(findPropsRule); + + const createCredentialsNode = destructuredProps.find( + (id) => id.text() === 'createCredentials', + ); + + if (!createCredentialsNode) { + return false; + } + + const usagesFindRule = { + rule: { + kind: 'call_expression', + has: { + field: 'function', + kind: 'identifier', + regex: '^createCredentials$', + }, + }, + }; + const usages = rootNode.findAll(usagesFindRule); + for (const usage of usages) { + const functionIdentifier = usage.field('function'); + if (functionIdentifier) { + edits.push(functionIdentifier.replace('createSecureContext')); + } + } + + const newImportModule = 'node:tls'; + const newImportFunction = 'createSecureContext'; + const newImportStatement = isEsm + ? `import { ${newImportFunction} } from '${newImportModule}';` + : `const { ${newImportFunction} } = require('${newImportModule}');`; + + if (destructuredProps.length === 1) { + edits.push(statement.replace(newImportStatement)); + tlsImportState.added = true; + } else { + const otherProps = destructuredProps + .filter((id) => id.text() !== 'createCredentials') + .map((id) => id.text()); + + const newDestructuredString = `{ ${otherProps.join(', ')} }`; + edits.push(specifiersNode.replace(newDestructuredString)); + + if (!tlsImportState.added) { + const newEdit = { + startPos: statement.range().end.index, + endPos: statement.range().end.index, + insertedText: `\n${newImportStatement}`, + }; + edits.push(newEdit); + tlsImportState.added = true; + } else { + } + } + + return true; +} + +function handleNamespaceImport( + importOrDeclarator: SgNode, + rootNode: SgNode, + edits: Edit[], + importType: ImportType, + tlsImportState: { added: boolean; identifier: string }, +) { + const isEsm = importType === 'NAMESPACE_IMPORT'; + const nameNode = isEsm + ? importOrDeclarator.find({ rule: { kind: 'namespace_import' } })?.field('name') + : importOrDeclarator.field('name'); + + if (!nameNode) { + return false; + } + const namespaceName = nameNode.text(); + + const memberAccessFindRule = { + rule: { + kind: 'member_expression', + all: [ + { has: { field: 'object', regex: `^${namespaceName}$` } }, + { has: { field: 'property', regex: '^createCredentials$' } }, + ], + }, + }; + const memberAccessUsages = rootNode.findAll(memberAccessFindRule); + + if (memberAccessUsages.length > 0) { + + const allUsagesFindRule = { + rule: { + kind: 'member_expression', + has: { field: 'object', regex: `^${namespaceName}$` }, + }, + }; + const allUsages = rootNode.findAll(allUsagesFindRule); + + if (allUsages.length === memberAccessUsages.length) { + const newTlsIdentifier = tlsImportState.identifier; + const newImportModule = 'node:tls'; + const newImportStatement = isEsm + ? `import * as ${newTlsIdentifier} from '${newImportModule}';` + : `const ${newTlsIdentifier} = require('${newImportModule}');`; + + const nodeToReplace = isEsm + ? importOrDeclarator + : importOrDeclarator.parent(); + edits.push(nodeToReplace.replace(newImportStatement)); + tlsImportState.added = true; + + for (const usage of memberAccessUsages) { + const replacementText = `${newTlsIdentifier}.createSecureContext`; + edits.push(usage.replace(replacementText)); + } + } else { + let tlsIdentifier = ensureTlsImport( + rootNode, + edits, + importType, + tlsImportState, + ); + + for (const usage of memberAccessUsages) { + const replacementText = `${tlsIdentifier}.createSecureContext`; + edits.push(usage.replace(replacementText)); + } + } + return true; + } else { + return false; + } +} + +export default function transform(root: SgRoot): string | null { + const edits: Edit[] = []; + const rootNode = root.root(); + let wasTransformed = false; + const tlsImportState = { added: false, identifier: 'tls' }; + + const cryptoImportsRule = { + rule: { + any: [ + { + kind: 'variable_declarator', + has: { + field: 'value', + kind: 'call_expression', + has: { + field: 'arguments', + has: { regex: "^['\"](node:)?crypto['\"]$" }, + }, + }, + }, + { + kind: 'import_statement', + has: { field: 'source', regex: "^['\"](node:)?crypto['\"]$" }, + }, + ], + }, + }; + const cryptoImports = rootNode.findAll(cryptoImportsRule); + + for (const importMatch of cryptoImports) { + const nameNode = importMatch.field('imports') ?? importMatch.field('name'); + let importType: ImportType | undefined; + + if (importMatch.kind() === 'import_statement') { + if (importMatch.find({ rule: { kind: 'namespace_import' } })) { + importType = 'NAMESPACE_IMPORT'; + } else { + importType = 'DESTRUCTURED_IMPORT'; + } + } else { + // variable_declarator for require + if (nameNode?.is('object_pattern')) { + importType = 'DESTRUCTURED_REQUIRE'; + } else if (nameNode?.is('identifier')) { + importType = 'NAMESPACE_REQUIRE'; + } + } + + if (importType === undefined) { + continue; + } + + let transformedByType = false; + switch (importType) { + case 'DESTRUCTURED_REQUIRE': + case 'DESTRUCTURED_IMPORT': + const statement = + importType === 'DESTRUCTURED_REQUIRE' + ? importMatch.parent() + : importMatch; + transformedByType = handleDestructuredImport( + statement, + rootNode, + edits, + tlsImportState, + ); + break; + + case 'NAMESPACE_REQUIRE': + case 'NAMESPACE_IMPORT': + transformedByType = handleNamespaceImport( + importMatch, + rootNode, + edits, + importType, + tlsImportState, + ); + break; + } + + if (transformedByType) { + wasTransformed = true; + } + } + + if (wasTransformed) { + return rootNode.commitEdits(edits); + } else { + return null; + } +} diff --git a/recipes/crypto-createCredentials/tests/expected/file-1.js b/recipes/crypto-createCredentials/tests/expected/file-1.js new file mode 100644 index 00000000..059c04bf --- /dev/null +++ b/recipes/crypto-createCredentials/tests/expected/file-1.js @@ -0,0 +1,7 @@ +const { createSecureContext } = require('node:tls'); + +const credentials = createSecureContext({ + key: privateKey, + cert: certificate, + ca: [caCertificate] +}); diff --git a/recipes/crypto-createCredentials/tests/expected/file-2.js b/recipes/crypto-createCredentials/tests/expected/file-2.js new file mode 100644 index 00000000..74454515 --- /dev/null +++ b/recipes/crypto-createCredentials/tests/expected/file-2.js @@ -0,0 +1,6 @@ +const tls = require('node:tls'); + +const credentials = tls.createSecureContext({ + key: fs.readFileSync('server-key.pem'), + cert: fs.readFileSync('server-cert.pem') +}); diff --git a/recipes/crypto-createCredentials/tests/expected/file-3.js b/recipes/crypto-createCredentials/tests/expected/file-3.js new file mode 100644 index 00000000..e12b91bb --- /dev/null +++ b/recipes/crypto-createCredentials/tests/expected/file-3.js @@ -0,0 +1,10 @@ +const { createHash } = require('node:crypto'); +const { createSecureContext } = require('node:tls'); + +const credentials = createSecureContext({ + key: privateKey, + cert: certificate +}); + +const hash = createHash('sha256'); +hash.update('some data'); diff --git a/recipes/crypto-createCredentials/tests/expected/file-4.mjs b/recipes/crypto-createCredentials/tests/expected/file-4.mjs new file mode 100644 index 00000000..45258e37 --- /dev/null +++ b/recipes/crypto-createCredentials/tests/expected/file-4.mjs @@ -0,0 +1,7 @@ +import { createSecureContext } from 'node:tls'; + +const credentials = createSecureContext({ + key: privateKey, + cert: certificate, + ca: [caCertificate] +}); diff --git a/recipes/crypto-createCredentials/tests/expected/file-5.mjs b/recipes/crypto-createCredentials/tests/expected/file-5.mjs new file mode 100644 index 00000000..2f064efc --- /dev/null +++ b/recipes/crypto-createCredentials/tests/expected/file-5.mjs @@ -0,0 +1,6 @@ +import * as crypto from 'node:crypto'; + +const credentials = crypto.createCredentials({ + key: privateKey, + cert: certificate +}); diff --git a/recipes/crypto-createCredentials/tests/input/file-1.js b/recipes/crypto-createCredentials/tests/input/file-1.js new file mode 100644 index 00000000..217368dc --- /dev/null +++ b/recipes/crypto-createCredentials/tests/input/file-1.js @@ -0,0 +1,7 @@ +const { createCredentials } = require('node:crypto'); + +const credentials = createCredentials({ + key: privateKey, + cert: certificate, + ca: [caCertificate] +}); diff --git a/recipes/crypto-createCredentials/tests/input/file-2.js b/recipes/crypto-createCredentials/tests/input/file-2.js new file mode 100644 index 00000000..dcaff4bf --- /dev/null +++ b/recipes/crypto-createCredentials/tests/input/file-2.js @@ -0,0 +1,6 @@ +const crypto = require('node:crypto'); + +const credentials = crypto.createCredentials({ + key: fs.readFileSync('server-key.pem'), + cert: fs.readFileSync('server-cert.pem') +}); diff --git a/recipes/crypto-createCredentials/tests/input/file-3.js b/recipes/crypto-createCredentials/tests/input/file-3.js new file mode 100644 index 00000000..4077b761 --- /dev/null +++ b/recipes/crypto-createCredentials/tests/input/file-3.js @@ -0,0 +1,9 @@ +const { createCredentials, createHash } = require('node:crypto'); + +const credentials = createCredentials({ + key: privateKey, + cert: certificate +}); + +const hash = createHash('sha256'); +hash.update('some data'); diff --git a/recipes/crypto-createCredentials/tests/input/file-4.mjs b/recipes/crypto-createCredentials/tests/input/file-4.mjs new file mode 100644 index 00000000..e49ca2fc --- /dev/null +++ b/recipes/crypto-createCredentials/tests/input/file-4.mjs @@ -0,0 +1,7 @@ +import { createCredentials } from 'node:crypto'; + +const credentials = createCredentials({ + key: privateKey, + cert: certificate, + ca: [caCertificate] +}); diff --git a/recipes/crypto-createCredentials/tests/input/file-5.mjs b/recipes/crypto-createCredentials/tests/input/file-5.mjs new file mode 100644 index 00000000..2f064efc --- /dev/null +++ b/recipes/crypto-createCredentials/tests/input/file-5.mjs @@ -0,0 +1,6 @@ +import * as crypto from 'node:crypto'; + +const credentials = crypto.createCredentials({ + key: privateKey, + cert: certificate +}); diff --git a/recipes/crypto-createCredentials/tsconfig.json b/recipes/crypto-createCredentials/tsconfig.json new file mode 100644 index 00000000..92c12497 --- /dev/null +++ b/recipes/crypto-createCredentials/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "allowImportingTsExtensions": true, + "allowJs": true, + "alwaysStrict": true, + "baseUrl": "./", + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "lib": ["ESNext", "DOM"], + "module": "NodeNext", + "moduleResolution": "NodeNext", + "noImplicitThis": true, + "removeComments": true, + "strict": true, + "stripInternal": true, + "target": "esnext" + }, + "include": ["./"], + "exclude": [ + "tests/**" + ] +} diff --git a/recipes/crypto-createCredentials/workflow.yaml b/recipes/crypto-createCredentials/workflow.yaml new file mode 100644 index 00000000..1ea4ebf5 --- /dev/null +++ b/recipes/crypto-createCredentials/workflow.yaml @@ -0,0 +1,25 @@ +version: "1" + +nodes: + - id: apply-transforms + name: Apply AST Transformations + type: automatic + runtime: + type: direct + steps: + - name: Replace `assert` import attribute to the `with` ECMAScript import attribute. + js-ast-grep: + js_file: src/workflow.ts + base_path: . + include: + - "**/*.js" + - "**/*.jsx" + - "**/*.mjs" + - "**/*.cjs" + - "**/*.cts" + - "**/*.mts" + - "**/*.ts" + - "**/*.tsx" + exclude: + - "**/node_modules/**" + language: typescript From 144c0066d9d93cbbeacf969889fde6c2d2f6471d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Mon, 4 Aug 2025 00:20:05 +0530 Subject: [PATCH 02/43] Update recipes/crypto-createCredentials/codemod.yaml Co-authored-by: Bruno Rodrigues --- recipes/crypto-createCredentials/codemod.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/crypto-createCredentials/codemod.yaml b/recipes/crypto-createCredentials/codemod.yaml index eded0cba..46f004b6 100644 --- a/recipes/crypto-createCredentials/codemod.yaml +++ b/recipes/crypto-createCredentials/codemod.yaml @@ -1,5 +1,5 @@ schema_version: "1.0" -name: "@nodejs/crypto-createCredentials" +name: "@nodejs/crypto-create-credentials" version: 1.0.0 description: Handle DEP0010 via transforming `crypto.createCredentials` to `tls.createSecureContext` author: 0hmx From f65c83909c55e110667435f7c7afe14e360f2a07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Mon, 4 Aug 2025 00:20:15 +0530 Subject: [PATCH 03/43] Update recipes/crypto-createCredentials/package.json Co-authored-by: Bruno Rodrigues --- recipes/crypto-createCredentials/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/crypto-createCredentials/package.json b/recipes/crypto-createCredentials/package.json index 8dbd7078..b14f4bf0 100644 --- a/recipes/crypto-createCredentials/package.json +++ b/recipes/crypto-createCredentials/package.json @@ -14,7 +14,7 @@ }, "author": "0hmx", "license": "MIT", - "homepage": "https://github.com/nodejs/userland-migrations/blob/main/recipes/rmdirs/README.md", + "homepage": "https://github.com/nodejs/userland-migrations/blob/main/recipes/crypto-create-credentials/README.md", "devDependencies": { "@types/node": "^24.0.3", "@codemod.com/jssg-types": "^1.0.3" From 8f7bae77736a756177dc052a54ec6046830d1be8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Mon, 4 Aug 2025 00:20:24 +0530 Subject: [PATCH 04/43] Update recipes/crypto-createCredentials/package.json Co-authored-by: Bruno Rodrigues --- recipes/crypto-createCredentials/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/recipes/crypto-createCredentials/package.json b/recipes/crypto-createCredentials/package.json index b14f4bf0..40c86a50 100644 --- a/recipes/crypto-createCredentials/package.json +++ b/recipes/crypto-createCredentials/package.json @@ -16,7 +16,6 @@ "license": "MIT", "homepage": "https://github.com/nodejs/userland-migrations/blob/main/recipes/crypto-create-credentials/README.md", "devDependencies": { - "@types/node": "^24.0.3", "@codemod.com/jssg-types": "^1.0.3" }, "dependencies": { From 0b4c417112e8e338f49253ac37a6372769029e64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Mon, 4 Aug 2025 00:59:04 +0530 Subject: [PATCH 05/43] rename to crypto-create-credentials --- .../README.md | 2 +- .../codemod.yaml | 1 + .../package.json | 4 ++-- .../src/workflow.ts | 2 +- .../tests/expected/file-1.js | 0 .../tests/expected/file-2.js | 0 .../tests/expected/file-3.js | 0 .../tests/expected/file-4.mjs | 0 recipes/crypto-create-credentials/tests/expected/file-5.mjs | 6 ++++++ .../tests/input/file-1.js | 0 .../tests/input/file-2.js | 0 .../tests/input/file-3.js | 0 .../tests/input/file-4.mjs | 0 .../tests/input}/file-5.mjs | 0 .../tsconfig.json | 0 .../workflow.yaml | 2 +- recipes/crypto-createCredentials/tests/input/file-5.mjs | 6 ------ 17 files changed, 12 insertions(+), 11 deletions(-) rename recipes/{crypto-createCredentials => crypto-create-credentials}/README.md (96%) rename recipes/{crypto-createCredentials => crypto-create-credentials}/codemod.yaml (99%) rename recipes/{crypto-createCredentials => crypto-create-credentials}/package.json (87%) rename recipes/{crypto-createCredentials => crypto-create-credentials}/src/workflow.ts (99%) rename recipes/{crypto-createCredentials => crypto-create-credentials}/tests/expected/file-1.js (100%) rename recipes/{crypto-createCredentials => crypto-create-credentials}/tests/expected/file-2.js (100%) rename recipes/{crypto-createCredentials => crypto-create-credentials}/tests/expected/file-3.js (100%) rename recipes/{crypto-createCredentials => crypto-create-credentials}/tests/expected/file-4.mjs (100%) create mode 100644 recipes/crypto-create-credentials/tests/expected/file-5.mjs rename recipes/{crypto-createCredentials => crypto-create-credentials}/tests/input/file-1.js (100%) rename recipes/{crypto-createCredentials => crypto-create-credentials}/tests/input/file-2.js (100%) rename recipes/{crypto-createCredentials => crypto-create-credentials}/tests/input/file-3.js (100%) rename recipes/{crypto-createCredentials => crypto-create-credentials}/tests/input/file-4.mjs (100%) rename recipes/{crypto-createCredentials/tests/expected => crypto-create-credentials/tests/input}/file-5.mjs (100%) rename recipes/{crypto-createCredentials => crypto-create-credentials}/tsconfig.json (100%) rename recipes/{crypto-createCredentials => crypto-create-credentials}/workflow.yaml (83%) delete mode 100644 recipes/crypto-createCredentials/tests/input/file-5.mjs diff --git a/recipes/crypto-createCredentials/README.md b/recipes/crypto-create-credentials/README.md similarity index 96% rename from recipes/crypto-createCredentials/README.md rename to recipes/crypto-create-credentials/README.md index b3bace49..a00f0f2d 100644 --- a/recipes/crypto-createCredentials/README.md +++ b/recipes/crypto-create-credentials/README.md @@ -1,4 +1,4 @@ -# `fs.rmdir` DEP0147 +# `crypto.createCredentials` DEP0010 This recipe provides a guide for migrating from the deprecated `crypto.createCredentials` method in Node.js. diff --git a/recipes/crypto-createCredentials/codemod.yaml b/recipes/crypto-create-credentials/codemod.yaml similarity index 99% rename from recipes/crypto-createCredentials/codemod.yaml rename to recipes/crypto-create-credentials/codemod.yaml index 46f004b6..3f628f3a 100644 --- a/recipes/crypto-createCredentials/codemod.yaml +++ b/recipes/crypto-create-credentials/codemod.yaml @@ -19,3 +19,4 @@ keywords: registry: access: public visibility: public + diff --git a/recipes/crypto-createCredentials/package.json b/recipes/crypto-create-credentials/package.json similarity index 87% rename from recipes/crypto-createCredentials/package.json rename to recipes/crypto-create-credentials/package.json index 40c86a50..4859828b 100644 --- a/recipes/crypto-createCredentials/package.json +++ b/recipes/crypto-create-credentials/package.json @@ -1,5 +1,5 @@ { - "name": "@nodejs/crypto-createCredentials", + "name": "@nodejs/crypto-create-credentials", "version": "1.0.0", "description": "Handle DEP0010 via transforming `crypto.createCredentials` to `tls.createSecureContext` with the appropriate options.", "type": "module", @@ -9,7 +9,7 @@ "repository": { "type": "git", "url": "git+https://github.com/nodejs/userland-migrations.git", - "directory": "recipes/rmdirs", + "directory": "recipes/crypto-create-credentials", "bugs": "https://github.com/nodejs/userland-migrations/issues" }, "author": "0hmx", diff --git a/recipes/crypto-createCredentials/src/workflow.ts b/recipes/crypto-create-credentials/src/workflow.ts similarity index 99% rename from recipes/crypto-createCredentials/src/workflow.ts rename to recipes/crypto-create-credentials/src/workflow.ts index 397b3044..9c9f0e86 100644 --- a/recipes/crypto-createCredentials/src/workflow.ts +++ b/recipes/crypto-create-credentials/src/workflow.ts @@ -170,7 +170,7 @@ function handleNamespaceImport( ) { const isEsm = importType === 'NAMESPACE_IMPORT'; const nameNode = isEsm - ? importOrDeclarator.find({ rule: { kind: 'namespace_import' } })?.field('name') + ? importOrDeclarator.find({ rule: { kind: 'namespace_import' } })?.find({ rule: { kind: 'identifier' }}) : importOrDeclarator.field('name'); if (!nameNode) { diff --git a/recipes/crypto-createCredentials/tests/expected/file-1.js b/recipes/crypto-create-credentials/tests/expected/file-1.js similarity index 100% rename from recipes/crypto-createCredentials/tests/expected/file-1.js rename to recipes/crypto-create-credentials/tests/expected/file-1.js diff --git a/recipes/crypto-createCredentials/tests/expected/file-2.js b/recipes/crypto-create-credentials/tests/expected/file-2.js similarity index 100% rename from recipes/crypto-createCredentials/tests/expected/file-2.js rename to recipes/crypto-create-credentials/tests/expected/file-2.js diff --git a/recipes/crypto-createCredentials/tests/expected/file-3.js b/recipes/crypto-create-credentials/tests/expected/file-3.js similarity index 100% rename from recipes/crypto-createCredentials/tests/expected/file-3.js rename to recipes/crypto-create-credentials/tests/expected/file-3.js diff --git a/recipes/crypto-createCredentials/tests/expected/file-4.mjs b/recipes/crypto-create-credentials/tests/expected/file-4.mjs similarity index 100% rename from recipes/crypto-createCredentials/tests/expected/file-4.mjs rename to recipes/crypto-create-credentials/tests/expected/file-4.mjs diff --git a/recipes/crypto-create-credentials/tests/expected/file-5.mjs b/recipes/crypto-create-credentials/tests/expected/file-5.mjs new file mode 100644 index 00000000..92231955 --- /dev/null +++ b/recipes/crypto-create-credentials/tests/expected/file-5.mjs @@ -0,0 +1,6 @@ +import * as tls from 'node:tls'; + +const credentials = tls.createSecureContext({ + key: privateKey, + cert: certificate +}); diff --git a/recipes/crypto-createCredentials/tests/input/file-1.js b/recipes/crypto-create-credentials/tests/input/file-1.js similarity index 100% rename from recipes/crypto-createCredentials/tests/input/file-1.js rename to recipes/crypto-create-credentials/tests/input/file-1.js diff --git a/recipes/crypto-createCredentials/tests/input/file-2.js b/recipes/crypto-create-credentials/tests/input/file-2.js similarity index 100% rename from recipes/crypto-createCredentials/tests/input/file-2.js rename to recipes/crypto-create-credentials/tests/input/file-2.js diff --git a/recipes/crypto-createCredentials/tests/input/file-3.js b/recipes/crypto-create-credentials/tests/input/file-3.js similarity index 100% rename from recipes/crypto-createCredentials/tests/input/file-3.js rename to recipes/crypto-create-credentials/tests/input/file-3.js diff --git a/recipes/crypto-createCredentials/tests/input/file-4.mjs b/recipes/crypto-create-credentials/tests/input/file-4.mjs similarity index 100% rename from recipes/crypto-createCredentials/tests/input/file-4.mjs rename to recipes/crypto-create-credentials/tests/input/file-4.mjs diff --git a/recipes/crypto-createCredentials/tests/expected/file-5.mjs b/recipes/crypto-create-credentials/tests/input/file-5.mjs similarity index 100% rename from recipes/crypto-createCredentials/tests/expected/file-5.mjs rename to recipes/crypto-create-credentials/tests/input/file-5.mjs diff --git a/recipes/crypto-createCredentials/tsconfig.json b/recipes/crypto-create-credentials/tsconfig.json similarity index 100% rename from recipes/crypto-createCredentials/tsconfig.json rename to recipes/crypto-create-credentials/tsconfig.json diff --git a/recipes/crypto-createCredentials/workflow.yaml b/recipes/crypto-create-credentials/workflow.yaml similarity index 83% rename from recipes/crypto-createCredentials/workflow.yaml rename to recipes/crypto-create-credentials/workflow.yaml index 1ea4ebf5..c9d11ab7 100644 --- a/recipes/crypto-createCredentials/workflow.yaml +++ b/recipes/crypto-create-credentials/workflow.yaml @@ -7,7 +7,7 @@ nodes: runtime: type: direct steps: - - name: Replace `assert` import attribute to the `with` ECMAScript import attribute. + - name: Handle DEP0010 via transforming `crypto.createCredentials` to `tls.createSecureContext`. js-ast-grep: js_file: src/workflow.ts base_path: . diff --git a/recipes/crypto-createCredentials/tests/input/file-5.mjs b/recipes/crypto-createCredentials/tests/input/file-5.mjs deleted file mode 100644 index 2f064efc..00000000 --- a/recipes/crypto-createCredentials/tests/input/file-5.mjs +++ /dev/null @@ -1,6 +0,0 @@ -import * as crypto from 'node:crypto'; - -const credentials = crypto.createCredentials({ - key: privateKey, - cert: certificate -}); From e36f7beb4e4e27c211a70ca42d022671110eaa07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Tue, 5 Aug 2025 08:43:13 +0530 Subject: [PATCH 06/43] Update recipes/crypto-create-credentials/workflow.yaml Co-authored-by: Bruno Rodrigues --- recipes/crypto-create-credentials/workflow.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/crypto-create-credentials/workflow.yaml b/recipes/crypto-create-credentials/workflow.yaml index c9d11ab7..8128d277 100644 --- a/recipes/crypto-create-credentials/workflow.yaml +++ b/recipes/crypto-create-credentials/workflow.yaml @@ -12,10 +12,10 @@ nodes: js_file: src/workflow.ts base_path: . include: + - "**/*.cjs" - "**/*.js" - "**/*.jsx" - "**/*.mjs" - - "**/*.cjs" - "**/*.cts" - "**/*.mts" - "**/*.ts" From 6525cfd80a3a5329e75d9e5b591827495a5f2e3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Tue, 5 Aug 2025 08:43:23 +0530 Subject: [PATCH 07/43] Update recipes/crypto-create-credentials/workflow.yaml Co-authored-by: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> --- recipes/crypto-create-credentials/workflow.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/recipes/crypto-create-credentials/workflow.yaml b/recipes/crypto-create-credentials/workflow.yaml index 8128d277..f7184bb8 100644 --- a/recipes/crypto-create-credentials/workflow.yaml +++ b/recipes/crypto-create-credentials/workflow.yaml @@ -1,3 +1,5 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/codemod-com/codemod/refs/heads/main/schemas/workflow.json + version: "1" nodes: From a56c4bbc5a92dec44189dbe3185d418515c37499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Tue, 5 Aug 2025 08:59:31 +0530 Subject: [PATCH 08/43] Update recipes/crypto-create-credentials/README.md Co-authored-by: Bruno Rodrigues --- recipes/crypto-create-credentials/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/crypto-create-credentials/README.md b/recipes/crypto-create-credentials/README.md index a00f0f2d..6d318f6c 100644 --- a/recipes/crypto-create-credentials/README.md +++ b/recipes/crypto-create-credentials/README.md @@ -1,6 +1,6 @@ # `crypto.createCredentials` DEP0010 -This recipe provides a guide for migrating from the deprecated `crypto.createCredentials` method in Node.js. +This recipe transforms `crypto.createCredentials` usage to use modern `node:tls` methods. See [DEP0010](https://nodejs.org/api/deprecations.html#DEP0010). From e6bf56ee53106f3dd0484c1059c9a4b02ef63787 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Tue, 5 Aug 2025 08:42:03 +0530 Subject: [PATCH 09/43] sync package-lock.json --- package-lock.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/package-lock.json b/package-lock.json index fdd18d3b..071e51d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1420,6 +1420,10 @@ "resolved": "recipes/create-require-from-path", "link": true }, + "node_modules/@nodejs/crypto-create-credentials": { + "resolved": "recipes/crypto-create-credentials", + "link": true + }, "node_modules/@nodejs/import-assertions-to-attributes": { "resolved": "recipes/import-assertions-to-attributes", "link": true @@ -4065,6 +4069,17 @@ "@types/node": "^24.0.3" } }, + "recipes/crypto-create-credentials": { + "name": "@nodejs/crypto-create-credentials", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@nodejs/codemod-utils": "*" + }, + "devDependencies": { + "@codemod.com/jssg-types": "^1.0.3" + } + }, "recipes/import-assertions-to-attributes": { "name": "@nodejs/import-assertions-to-attributes", "version": "1.0.0", From 9ac7b8b972516de89896d2074330b4a4335f864e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Tue, 5 Aug 2025 09:37:06 +0530 Subject: [PATCH 10/43] refactor workflow.ts --- .../crypto-create-credentials/src/workflow.ts | 270 +++++++++++------- 1 file changed, 169 insertions(+), 101 deletions(-) diff --git a/recipes/crypto-create-credentials/src/workflow.ts b/recipes/crypto-create-credentials/src/workflow.ts index 9c9f0e86..c7a8451f 100644 --- a/recipes/crypto-create-credentials/src/workflow.ts +++ b/recipes/crypto-create-credentials/src/workflow.ts @@ -1,5 +1,22 @@ import type { SgRoot, Edit, SgNode } from "@codemod.com/jssg-types/main"; +type TlsImportState = { + added: boolean; + identifier: string; +}; + +type HandlerResult = { + edits: Edit[]; + wasTransformed: boolean; + newState: TlsImportState; +}; + +type EnsureTlsResult = { + edits: Edit[]; + identifier: string; // The identifier that was used or found + newState: TlsImportState; +}; + type ImportType = | 'DESTRUCTURED_REQUIRE' | 'NAMESPACE_REQUIRE' @@ -8,12 +25,15 @@ type ImportType = function ensureTlsImport( rootNode: SgNode, - edits: Edit[], importType: ImportType, - tlsImportState: { added: boolean; identifier: string }, -): string { - if (tlsImportState.added) { - return tlsImportState.identifier; + currentState: TlsImportState, +): EnsureTlsResult { + if (currentState.added) { + return { + edits: [], + identifier: currentState.identifier, + newState: currentState, + }; } const isEsm = @@ -34,39 +54,58 @@ function ensureTlsImport( if (existingTlsImport) { const nameNode = existingTlsImport.field('name'); if (nameNode?.is('identifier')) { - tlsImportState.identifier = nameNode.text(); - tlsImportState.added = true; - return tlsImportState.identifier; + const foundIdentifier = nameNode.text(); + return { + edits: [], + identifier: foundIdentifier, + newState: { + added: true, + identifier: foundIdentifier, + }, + }; } } const firstNode = rootNode.children()[0]; - if (firstNode) { - const newImportText = isEsm - ? `import * as ${tlsImportState.identifier} from '${moduleSpecifier}';\n` - : `const ${tlsImportState.identifier} = require('${moduleSpecifier}');\n`; - - const edit = { - startPos: firstNode.range().start.index, - endPos: firstNode.range().start.index, - insertedText: newImportText, + + if (!firstNode) { + return { + edits: [], + identifier: currentState.identifier, + newState: currentState, }; - edits.push(edit); } - tlsImportState.added = true; - return tlsImportState.identifier; + const tlsIdentifier = currentState.identifier; + const newImportText = isEsm + ? `import * as ${tlsIdentifier} from '${moduleSpecifier}';\n` + : `const ${tlsIdentifier} = require('${moduleSpecifier}');\n`; + + const edit: Edit = { + startPos: firstNode.range().start.index, + endPos: firstNode.range().start.index, + insertedText: newImportText, + }; + + return { + edits: [edit], + identifier: tlsIdentifier, + newState: { + added: true, + identifier: tlsIdentifier, + }, + }; } function handleDestructuredImport( statement: SgNode, rootNode: SgNode, - edits: Edit[], - tlsImportState: { added: boolean }, -) { + currentState: TlsImportState, +): HandlerResult { + const localEdits: Edit[] = []; const isEsm = statement.kind() === 'import_statement'; - let specifiersNode; + let specifiersNode: SgNode | null | undefined; if (isEsm) { specifiersNode = statement.find({ rule: { kind: 'named_imports' } }) ?? @@ -90,7 +129,7 @@ function handleDestructuredImport( } if (!specifiersNode) { - return false; + return { edits: [], wasTransformed: false, newState: currentState }; } const findPropsRule = { @@ -108,7 +147,7 @@ function handleDestructuredImport( ); if (!createCredentialsNode) { - return false; + return { edits: [], wasTransformed: false, newState: currentState }; } const usagesFindRule = { @@ -125,7 +164,7 @@ function handleDestructuredImport( for (const usage of usages) { const functionIdentifier = usage.field('function'); if (functionIdentifier) { - edits.push(functionIdentifier.replace('createSecureContext')); + localEdits.push(functionIdentifier.replace('createSecureContext')); } } @@ -135,46 +174,52 @@ function handleDestructuredImport( ? `import { ${newImportFunction} } from '${newImportModule}';` : `const { ${newImportFunction} } = require('${newImportModule}');`; + let finalState = currentState; + if (destructuredProps.length === 1) { - edits.push(statement.replace(newImportStatement)); - tlsImportState.added = true; + localEdits.push(statement.replace(newImportStatement)); + finalState = { ...currentState, added: true }; } else { const otherProps = destructuredProps .filter((id) => id.text() !== 'createCredentials') .map((id) => id.text()); const newDestructuredString = `{ ${otherProps.join(', ')} }`; - edits.push(specifiersNode.replace(newDestructuredString)); + localEdits.push(specifiersNode.replace(newDestructuredString)); - if (!tlsImportState.added) { + if (!currentState.added) { const newEdit = { startPos: statement.range().end.index, endPos: statement.range().end.index, insertedText: `\n${newImportStatement}`, }; - edits.push(newEdit); - tlsImportState.added = true; - } else { + localEdits.push(newEdit); + finalState = { ...currentState, added: true }; } } - return true; + return { + edits: localEdits, + wasTransformed: true, + newState: finalState, + }; } function handleNamespaceImport( importOrDeclarator: SgNode, rootNode: SgNode, - edits: Edit[], importType: ImportType, - tlsImportState: { added: boolean; identifier: string }, -) { + currentState: TlsImportState, +): HandlerResult { + const localEdits: Edit[] = []; const isEsm = importType === 'NAMESPACE_IMPORT'; + const nameNode = isEsm - ? importOrDeclarator.find({ rule: { kind: 'namespace_import' } })?.find({ rule: { kind: 'identifier' }}) + ? importOrDeclarator.find({ rule: { kind: 'namespace_import' } })?.find({ rule: { kind: 'identifier' } }) : importOrDeclarator.field('name'); if (!nameNode) { - return false; + return { edits: [], wasTransformed: false, newState: currentState }; } const namespaceName = nameNode.text(); @@ -189,57 +234,71 @@ function handleNamespaceImport( }; const memberAccessUsages = rootNode.findAll(memberAccessFindRule); - if (memberAccessUsages.length > 0) { + if (memberAccessUsages.length === 0) { + return { edits: [], wasTransformed: false, newState: currentState }; + } - const allUsagesFindRule = { - rule: { - kind: 'member_expression', - has: { field: 'object', regex: `^${namespaceName}$` }, - }, - }; - const allUsages = rootNode.findAll(allUsagesFindRule); - - if (allUsages.length === memberAccessUsages.length) { - const newTlsIdentifier = tlsImportState.identifier; - const newImportModule = 'node:tls'; - const newImportStatement = isEsm - ? `import * as ${newTlsIdentifier} from '${newImportModule}';` - : `const ${newTlsIdentifier} = require('${newImportModule}');`; - - const nodeToReplace = isEsm - ? importOrDeclarator - : importOrDeclarator.parent(); - edits.push(nodeToReplace.replace(newImportStatement)); - tlsImportState.added = true; - - for (const usage of memberAccessUsages) { - const replacementText = `${newTlsIdentifier}.createSecureContext`; - edits.push(usage.replace(replacementText)); - } - } else { - let tlsIdentifier = ensureTlsImport( - rootNode, - edits, - importType, - tlsImportState, - ); - - for (const usage of memberAccessUsages) { - const replacementText = `${tlsIdentifier}.createSecureContext`; - edits.push(usage.replace(replacementText)); - } + const allUsagesFindRule = { + rule: { + kind: 'member_expression', + has: { field: 'object', regex: `^${namespaceName}$` }, + }, + }; + const allUsages = rootNode.findAll(allUsagesFindRule); + + let finalState = currentState; + + if (allUsages.length === memberAccessUsages.length) { + const newTlsIdentifier = currentState.identifier; + const newImportModule = 'node:tls'; + const newImportStatement = isEsm + ? `import * as ${newTlsIdentifier} from '${newImportModule}';` + : `const ${newTlsIdentifier} = require('${newImportModule}');`; + + const nodeToReplace = isEsm + ? importOrDeclarator + : importOrDeclarator.parent(); + + if (nodeToReplace) { + localEdits.push(nodeToReplace.replace(newImportStatement)); + } + + finalState = { ...currentState, added: true }; + + for (const usage of memberAccessUsages) { + const replacementText = `${newTlsIdentifier}.createSecureContext`; + localEdits.push(usage.replace(replacementText)); } - return true; } else { - return false; + const ensureResult = ensureTlsImport( + rootNode, + importType, + currentState, + ); + localEdits.push(...ensureResult.edits); + finalState = ensureResult.newState; + + for (const usage of memberAccessUsages) { + const replacementText = `${ensureResult.identifier}.createSecureContext`; + localEdits.push(usage.replace(replacementText)); + } } + + return { + edits: localEdits, + wasTransformed: true, + newState: finalState, + }; } export default function transform(root: SgRoot): string | null { - const edits: Edit[] = []; const rootNode = root.root(); + const allEdits: Edit[] = []; let wasTransformed = false; - const tlsImportState = { added: false, identifier: 'tls' }; + let currentTlsImportState: TlsImportState = { + added: false, + identifier: 'tls', + }; const cryptoImportsRule = { rule: { @@ -257,7 +316,10 @@ export default function transform(root: SgRoot): string | null { }, { kind: 'import_statement', - has: { field: 'source', regex: "^['\"](node:)?crypto['\"]$" }, + has: { + field: 'source', + regex: "^['\"](node:)?crypto['\"]$", + }, }, ], }, @@ -265,7 +327,8 @@ export default function transform(root: SgRoot): string | null { const cryptoImports = rootNode.findAll(cryptoImportsRule); for (const importMatch of cryptoImports) { - const nameNode = importMatch.field('imports') ?? importMatch.field('name'); + const nameNode = + importMatch.field('imports') ?? importMatch.field('name'); let importType: ImportType | undefined; if (importMatch.kind() === 'import_statement') { @@ -275,7 +338,6 @@ export default function transform(root: SgRoot): string | null { importType = 'DESTRUCTURED_IMPORT'; } } else { - // variable_declarator for require if (nameNode?.is('object_pattern')) { importType = 'DESTRUCTURED_REQUIRE'; } else if (nameNode?.is('identifier')) { @@ -287,42 +349,48 @@ export default function transform(root: SgRoot): string | null { continue; } - let transformedByType = false; + let result: HandlerResult | undefined; + switch (importType) { case 'DESTRUCTURED_REQUIRE': - case 'DESTRUCTURED_IMPORT': + case 'DESTRUCTURED_IMPORT': { const statement = importType === 'DESTRUCTURED_REQUIRE' ? importMatch.parent() : importMatch; - transformedByType = handleDestructuredImport( - statement, - rootNode, - edits, - tlsImportState, - ); + if (statement) { + result = handleDestructuredImport( + statement, + rootNode, + currentTlsImportState, + ); + } break; + } case 'NAMESPACE_REQUIRE': case 'NAMESPACE_IMPORT': - transformedByType = handleNamespaceImport( + result = handleNamespaceImport( importMatch, rootNode, - edits, importType, - tlsImportState, + currentTlsImportState, ); break; } - if (transformedByType) { - wasTransformed = true; + if (result) { + allEdits.push(...result.edits); + currentTlsImportState = result.newState; + if (result.wasTransformed) { + wasTransformed = true; + } } } if (wasTransformed) { - return rootNode.commitEdits(edits); - } else { - return null; + return rootNode.commitEdits(allEdits); } + + return null; } From 74d80255612c479a4610697b9e9fac716be92690 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Tue, 5 Aug 2025 09:38:02 +0530 Subject: [PATCH 11/43] fix lint codemod.yml --- recipes/crypto-create-credentials/codemod.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/recipes/crypto-create-credentials/codemod.yaml b/recipes/crypto-create-credentials/codemod.yaml index 3f628f3a..46f004b6 100644 --- a/recipes/crypto-create-credentials/codemod.yaml +++ b/recipes/crypto-create-credentials/codemod.yaml @@ -19,4 +19,3 @@ keywords: registry: access: public visibility: public - From 81b848008f8c36f98301f94e8fe8f15693ee56d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Wed, 6 Aug 2025 08:57:58 +0530 Subject: [PATCH 12/43] Update recipes/crypto-create-credentials/README.md Co-authored-by: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> --- recipes/crypto-create-credentials/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/recipes/crypto-create-credentials/README.md b/recipes/crypto-create-credentials/README.md index 6d318f6c..43906512 100644 --- a/recipes/crypto-create-credentials/README.md +++ b/recipes/crypto-create-credentials/README.md @@ -7,7 +7,6 @@ See [DEP0010](https://nodejs.org/api/deprecations.html#DEP0010). ## Examples **Before:** - ```js // Using the deprecated createCredentials from node:crypto const { createCredentials } = require('node:crypto'); From 7b8633fb8b2acc5f3259874e45a0b6e289133233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Wed, 6 Aug 2025 08:58:18 +0530 Subject: [PATCH 13/43] Update recipes/crypto-create-credentials/README.md Co-authored-by: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> --- recipes/crypto-create-credentials/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/recipes/crypto-create-credentials/README.md b/recipes/crypto-create-credentials/README.md index 43906512..badc3c83 100644 --- a/recipes/crypto-create-credentials/README.md +++ b/recipes/crypto-create-credentials/README.md @@ -28,7 +28,6 @@ const credentials = createCredentials({ ``` **After:** - ```js // Updated to use createSecureContext from node:tls const { createSecureContext } = require('node:tls'); From 55bddce955a18beba49e157edfa0158fb00079b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Wed, 6 Aug 2025 08:58:34 +0530 Subject: [PATCH 14/43] Update recipes/crypto-create-credentials/package.json Co-authored-by: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> --- recipes/crypto-create-credentials/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/crypto-create-credentials/package.json b/recipes/crypto-create-credentials/package.json index 4859828b..98a91b0c 100644 --- a/recipes/crypto-create-credentials/package.json +++ b/recipes/crypto-create-credentials/package.json @@ -9,7 +9,7 @@ "repository": { "type": "git", "url": "git+https://github.com/nodejs/userland-migrations.git", - "directory": "recipes/crypto-create-credentials", + "directory": "recipes/crypto-create-credentials", "bugs": "https://github.com/nodejs/userland-migrations/issues" }, "author": "0hmx", From c08282f9d67248b39e1efb3779216ab2ed46a17b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Thu, 7 Aug 2025 08:24:12 +0530 Subject: [PATCH 15/43] added os.EOL --- recipes/crypto-create-credentials/src/workflow.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/recipes/crypto-create-credentials/src/workflow.ts b/recipes/crypto-create-credentials/src/workflow.ts index c7a8451f..a676fd04 100644 --- a/recipes/crypto-create-credentials/src/workflow.ts +++ b/recipes/crypto-create-credentials/src/workflow.ts @@ -1,3 +1,4 @@ +import * as os from 'os'; import type { SgRoot, Edit, SgNode } from "@codemod.com/jssg-types/main"; type TlsImportState = { @@ -78,8 +79,8 @@ function ensureTlsImport( const tlsIdentifier = currentState.identifier; const newImportText = isEsm - ? `import * as ${tlsIdentifier} from '${moduleSpecifier}';\n` - : `const ${tlsIdentifier} = require('${moduleSpecifier}');\n`; + ? `import * as ${tlsIdentifier} from '${moduleSpecifier}';${os.EOL}` + : `const ${tlsIdentifier} = require('${moduleSpecifier}');${os.EOL}`; const edit: Edit = { startPos: firstNode.range().start.index, @@ -191,7 +192,7 @@ function handleDestructuredImport( const newEdit = { startPos: statement.range().end.index, endPos: statement.range().end.index, - insertedText: `\n${newImportStatement}`, + insertedText: `${os.EOL}${newImportStatement}`, }; localEdits.push(newEdit); finalState = { ...currentState, added: true }; From 202b99fe9edccad768c15acaef83588df029c855 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Thu, 7 Aug 2025 08:26:59 +0530 Subject: [PATCH 16/43] lint fix --- recipes/crypto-create-credentials/src/workflow.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/crypto-create-credentials/src/workflow.ts b/recipes/crypto-create-credentials/src/workflow.ts index a676fd04..f912ad90 100644 --- a/recipes/crypto-create-credentials/src/workflow.ts +++ b/recipes/crypto-create-credentials/src/workflow.ts @@ -1,4 +1,4 @@ -import * as os from 'os'; +import * as os from 'node:os'; import type { SgRoot, Edit, SgNode } from "@codemod.com/jssg-types/main"; type TlsImportState = { From 67579ea382fba690ae13e810924b463174cb4c00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Mon, 11 Aug 2025 19:37:41 +0530 Subject: [PATCH 17/43] Update recipes/crypto-create-credentials/README.md Co-authored-by: Jacob Smith <3012099+JakobJingleheimer@users.noreply.github.com> --- recipes/crypto-create-credentials/README.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/recipes/crypto-create-credentials/README.md b/recipes/crypto-create-credentials/README.md index badc3c83..1bc6a903 100644 --- a/recipes/crypto-create-credentials/README.md +++ b/recipes/crypto-create-credentials/README.md @@ -10,14 +10,7 @@ See [DEP0010](https://nodejs.org/api/deprecations.html#DEP0010). ```js // Using the deprecated createCredentials from node:crypto const { createCredentials } = require('node:crypto'); - -const credentials = createCredentials({ - key: privateKey, - cert: certificate, - ca: [caCertificate] -}); - -// Using destructuring with ES module imports +// OR import { createCredentials } from 'node:crypto'; const credentials = createCredentials({ From f36f0ee54e364326b5c21f169c09d1dea2f718cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Mon, 11 Aug 2025 19:38:04 +0530 Subject: [PATCH 18/43] Update recipes/crypto-create-credentials/README.md Co-authored-by: Jacob Smith <3012099+JakobJingleheimer@users.noreply.github.com> --- recipes/crypto-create-credentials/README.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/recipes/crypto-create-credentials/README.md b/recipes/crypto-create-credentials/README.md index 1bc6a903..adacd800 100644 --- a/recipes/crypto-create-credentials/README.md +++ b/recipes/crypto-create-credentials/README.md @@ -24,14 +24,7 @@ const credentials = createCredentials({ ```js // Updated to use createSecureContext from node:tls const { createSecureContext } = require('node:tls'); - -const credentials = createSecureContext({ - key: privateKey, - cert: certificate, - ca: [caCertificate] -}); - -// Updated ES module import +// OR import { createSecureContext } from 'node:tls'; const credentials = createSecureContext({ From 21ce469ae3164b781fcabb4f03fc3939e26284f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Mon, 11 Aug 2025 19:44:14 +0530 Subject: [PATCH 19/43] Update recipes/crypto-create-credentials/src/workflow.ts Co-authored-by: Jacob Smith <3012099+JakobJingleheimer@users.noreply.github.com> --- recipes/crypto-create-credentials/src/workflow.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/recipes/crypto-create-credentials/src/workflow.ts b/recipes/crypto-create-credentials/src/workflow.ts index f912ad90..0e9547de 100644 --- a/recipes/crypto-create-credentials/src/workflow.ts +++ b/recipes/crypto-create-credentials/src/workflow.ts @@ -181,9 +181,11 @@ function handleDestructuredImport( localEdits.push(statement.replace(newImportStatement)); finalState = { ...currentState, added: true }; } else { - const otherProps = destructuredProps - .filter((id) => id.text() !== 'createCredentials') - .map((id) => id.text()); + const otherProps = []; + for (const d of destructuredProps) { + const text = d.text(); + if (text !== 'createCredentials') otherProps.push(text); + } const newDestructuredString = `{ ${otherProps.join(', ')} }`; localEdits.push(specifiersNode.replace(newDestructuredString)); From 1a8b6406bac0d068e1829001f315c792eda9e459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Tue, 12 Aug 2025 09:23:26 +0530 Subject: [PATCH 20/43] Update recipes/crypto-create-credentials/src/workflow.ts Co-authored-by: Jacob Smith <3012099+JakobJingleheimer@users.noreply.github.com> --- recipes/crypto-create-credentials/src/workflow.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/recipes/crypto-create-credentials/src/workflow.ts b/recipes/crypto-create-credentials/src/workflow.ts index 0e9547de..9ada0a65 100644 --- a/recipes/crypto-create-credentials/src/workflow.ts +++ b/recipes/crypto-create-credentials/src/workflow.ts @@ -282,8 +282,7 @@ function handleNamespaceImport( finalState = ensureResult.newState; for (const usage of memberAccessUsages) { - const replacementText = `${ensureResult.identifier}.createSecureContext`; - localEdits.push(usage.replace(replacementText)); + localEdits.push(usage.replace(`${ensureResult.identifier}.createSecureContext`)); } } From dfeb47656a91bb45df579d2d722d7bd3b42ea7c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Tue, 12 Aug 2025 09:23:47 +0530 Subject: [PATCH 21/43] Update recipes/crypto-create-credentials/src/workflow.ts Co-authored-by: Jacob Smith <3012099+JakobJingleheimer@users.noreply.github.com> --- recipes/crypto-create-credentials/src/workflow.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/recipes/crypto-create-credentials/src/workflow.ts b/recipes/crypto-create-credentials/src/workflow.ts index 9ada0a65..f6be8d30 100644 --- a/recipes/crypto-create-credentials/src/workflow.ts +++ b/recipes/crypto-create-credentials/src/workflow.ts @@ -193,6 +193,7 @@ function handleDestructuredImport( if (!currentState.added) { const newEdit = { startPos: statement.range().end.index, + // appending, so use `end` for both endPos: statement.range().end.index, insertedText: `${os.EOL}${newImportStatement}`, }; From b3f8bef37466ff9cfed4d03c2f55db9ee4c58407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Tue, 12 Aug 2025 09:24:14 +0530 Subject: [PATCH 22/43] Update recipes/crypto-create-credentials/src/workflow.ts Co-authored-by: Jacob Smith <3012099+JakobJingleheimer@users.noreply.github.com> --- recipes/crypto-create-credentials/src/workflow.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/recipes/crypto-create-credentials/src/workflow.ts b/recipes/crypto-create-credentials/src/workflow.ts index f6be8d30..8dd059e2 100644 --- a/recipes/crypto-create-credentials/src/workflow.ts +++ b/recipes/crypto-create-credentials/src/workflow.ts @@ -335,11 +335,9 @@ export default function transform(root: SgRoot): string | null { let importType: ImportType | undefined; if (importMatch.kind() === 'import_statement') { - if (importMatch.find({ rule: { kind: 'namespace_import' } })) { - importType = 'NAMESPACE_IMPORT'; - } else { - importType = 'DESTRUCTURED_IMPORT'; - } + importType = importMatch.find({ rule: { kind: 'namespace_import' } }) + ? 'NAMESPACE_IMPORT' + : 'DESTRUCTURED_IMPORT'; } else { if (nameNode?.is('object_pattern')) { importType = 'DESTRUCTURED_REQUIRE'; From f3dde78b22632a810695b77d5e9007cdf14d873c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Wed, 13 Aug 2025 08:15:27 +0530 Subject: [PATCH 23/43] rename to createCredentials-to-createSecureContext --- .../README.md | 0 .../codemod.yaml | 2 +- .../package.json | 2 +- .../src/workflow.ts | 271 ++++++++++++ .../tests/expected/file-1.js | 0 .../tests/expected/file-2.js | 0 .../tests/expected/file-3.js | 0 .../tests/expected/file-4.mjs | 0 .../tests/expected/file-5.mjs | 0 .../tests/input/file-1.js | 0 .../tests/input/file-2.js | 0 .../tests/input/file-3.js | 0 .../tests/input/file-4.mjs | 0 .../tests/input/file-5.mjs | 0 .../tsconfig.json | 0 .../workflow.yaml | 0 .../crypto-create-credentials/src/workflow.ts | 397 ------------------ 17 files changed, 273 insertions(+), 399 deletions(-) rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/README.md (100%) rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/codemod.yaml (86%) rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/package.json (92%) create mode 100644 recipes/createCredentials-to-createSecureContext/src/workflow.ts rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/tests/expected/file-1.js (100%) rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/tests/expected/file-2.js (100%) rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/tests/expected/file-3.js (100%) rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/tests/expected/file-4.mjs (100%) rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/tests/expected/file-5.mjs (100%) rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/tests/input/file-1.js (100%) rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/tests/input/file-2.js (100%) rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/tests/input/file-3.js (100%) rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/tests/input/file-4.mjs (100%) rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/tests/input/file-5.mjs (100%) rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/tsconfig.json (100%) rename recipes/{crypto-create-credentials => createCredentials-to-createSecureContext}/workflow.yaml (100%) delete mode 100644 recipes/crypto-create-credentials/src/workflow.ts diff --git a/recipes/crypto-create-credentials/README.md b/recipes/createCredentials-to-createSecureContext/README.md similarity index 100% rename from recipes/crypto-create-credentials/README.md rename to recipes/createCredentials-to-createSecureContext/README.md diff --git a/recipes/crypto-create-credentials/codemod.yaml b/recipes/createCredentials-to-createSecureContext/codemod.yaml similarity index 86% rename from recipes/crypto-create-credentials/codemod.yaml rename to recipes/createCredentials-to-createSecureContext/codemod.yaml index 46f004b6..be3cfefe 100644 --- a/recipes/crypto-create-credentials/codemod.yaml +++ b/recipes/createCredentials-to-createSecureContext/codemod.yaml @@ -1,5 +1,5 @@ schema_version: "1.0" -name: "@nodejs/crypto-create-credentials" +name: "@nodejs/createCredentials-to-createSecureContext" version: 1.0.0 description: Handle DEP0010 via transforming `crypto.createCredentials` to `tls.createSecureContext` author: 0hmx diff --git a/recipes/crypto-create-credentials/package.json b/recipes/createCredentials-to-createSecureContext/package.json similarity index 92% rename from recipes/crypto-create-credentials/package.json rename to recipes/createCredentials-to-createSecureContext/package.json index 98a91b0c..f416677f 100644 --- a/recipes/crypto-create-credentials/package.json +++ b/recipes/createCredentials-to-createSecureContext/package.json @@ -1,5 +1,5 @@ { - "name": "@nodejs/crypto-create-credentials", + "name": "@nodejs/createCredentials-to-createSecureContext", "version": "1.0.0", "description": "Handle DEP0010 via transforming `crypto.createCredentials` to `tls.createSecureContext` with the appropriate options.", "type": "module", diff --git a/recipes/createCredentials-to-createSecureContext/src/workflow.ts b/recipes/createCredentials-to-createSecureContext/src/workflow.ts new file mode 100644 index 00000000..2c9ec4ff --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/src/workflow.ts @@ -0,0 +1,271 @@ +import * as os from 'node:os'; +import type { SgRoot, Edit, SgNode } from "@codemod.com/jssg-types/main"; + +type TlsImportState = { + added: boolean; + identifier: string; +}; + +type HandlerResult = { + edits: Edit[]; + wasTransformed: boolean; + newState: TlsImportState; +}; + +type EnsureTlsResult = { + edits: Edit[]; + identifier: string; // The identifier that was used or found + newState: TlsImportState; +}; + +type ImportType = + | 'DESTRUCTURED_REQUIRE' + | 'NAMESPACE_REQUIRE' + | 'DESTRUCTURED_IMPORT' + | 'NAMESPACE_IMPORT'; + +const newImportModule = 'node:tls'; +const newImportFunction = 'createSecureContext'; + +function getImportHelpers(importType: ImportType) { + const isEsm = + importType === 'DESTRUCTURED_IMPORT' || importType === 'NAMESPACE_IMPORT'; + + return { + isEsm, + createNamespaceImport: (id: string, mod: string) => + isEsm + ? `import * as ${id} from '${mod}'` + : `const ${id} = require('${mod}')`, + createDestructuredImport: (specifier: string, mod: string) => + isEsm + ? `import { ${specifier} } from '${mod}'` + : `const { ${specifier} } = require('${mod}')`, + getStatementNode: (match: SgNode): SgNode | null => + isEsm ? match : match.parent(), + }; +} + + +function ensureTlsImport( + rootNode: SgNode, + importType: ImportType, + currentState: TlsImportState, +): EnsureTlsResult { + if (currentState.added) { + return { edits: [], identifier: currentState.identifier, newState: currentState }; + } + + const helpers = getImportHelpers(importType); + const findRule = { + rule: { + kind: helpers.isEsm ? 'import_statement' : 'variable_declarator', + has: { + field: helpers.isEsm ? 'source' : 'value', + has: { regex: `^['"](node:)?tls['"]$` }, + }, + }, + }; + const existingTlsImport = rootNode.find(findRule); + + if (existingTlsImport) { + const nameNode = existingTlsImport.field('name'); + if (nameNode?.is('identifier')) { + const foundIdentifier = nameNode.text(); + return { + edits: [], + identifier: foundIdentifier, + newState: { added: true, identifier: foundIdentifier }, + }; + } + } + + const firstNode = rootNode.children()[0]; + if (!firstNode) { + return { edits: [], identifier: currentState.identifier, newState: currentState }; + } + + const tlsIdentifier = currentState.identifier; + const newImportText = `${helpers.createNamespaceImport(tlsIdentifier, 'node:tls')};${os.EOL}`; + const edit: Edit = { + startPos: firstNode.range().start.index, + endPos: firstNode.range().start.index, + insertedText: newImportText, + }; + + return { + edits: [edit], + identifier: tlsIdentifier, + newState: { added: true, identifier: tlsIdentifier }, + }; +} + +function handleDestructuredImport( + statement: SgNode, + rootNode: SgNode, + currentState: TlsImportState, + importType: ImportType, +): HandlerResult { + const localEdits: Edit[] = []; + const helpers = getImportHelpers(importType); + + const specifiersNode = helpers.isEsm + ? statement.find({ rule: { kind: 'named_imports' } }) ?? statement.field('imports') + : statement.find({ rule: { kind: 'variable_declarator' } })?.field('name'); + + if (!specifiersNode) { + return { edits: [], wasTransformed: false, newState: currentState }; + } + + const destructuredProps = specifiersNode.findAll({ rule: { any: [{ kind: 'shorthand_property_identifier_pattern' }, { kind: 'import_specifier' }]}}); + const createCredentialsNode = destructuredProps.find((id) => id.text() === 'createCredentials'); + + if (!createCredentialsNode) { + return { edits: [], wasTransformed: false, newState: currentState }; + } + + const usages = rootNode.findAll({ rule: { kind: 'call_expression', has: { field: 'function', kind: 'identifier', regex: '^createCredentials$' }}}); + for (const usage of usages) { + usage.field('function')?.replace('createSecureContext'); + } + + const newImportStatement = `${helpers.createDestructuredImport(newImportFunction, newImportModule)};`; + let finalState = currentState; + + if (destructuredProps.length === 1) { + localEdits.push(statement.replace(newImportStatement)); + finalState = { ...currentState, added: true }; + } else { + const otherProps = destructuredProps + .map(d => d.text()) + .filter(text => text !== 'createCredentials'); + + localEdits.push(specifiersNode.replace(`{ ${otherProps.join(', ')} }`)); + + if (!currentState.added) { + const newEdit = { + startPos: statement.range().end.index, + endPos: statement.range().end.index, + insertedText: `${os.EOL}${newImportStatement}`, + }; + localEdits.push(newEdit); + finalState = { ...currentState, added: true }; + } + } + + return { edits: localEdits, wasTransformed: true, newState: finalState }; +} + +function handleNamespaceImport( + importOrDeclarator: SgNode, + rootNode: SgNode, + importType: ImportType, + currentState: TlsImportState, +): HandlerResult { + const localEdits: Edit[] = []; + const helpers = getImportHelpers(importType); + + const nameNode = helpers.isEsm + ? importOrDeclarator.find({ rule: { kind: 'namespace_import' } })?.find({ rule: { kind: 'identifier' } }) + : importOrDeclarator.field('name'); + + if (!nameNode) { + return { edits: [], wasTransformed: false, newState: currentState }; + } + const namespaceName = nameNode.text(); + + const memberAccessUsages = rootNode.findAll({ rule: { kind: 'member_expression', all: [ { has: { field: 'object', regex: `^${namespaceName}$` } }, { has: { field: 'property', regex: '^createCredentials$' } }]}}); + if (memberAccessUsages.length === 0) { + return { edits: [], wasTransformed: false, newState: currentState }; + } + + const allUsages = rootNode.findAll({ rule: { kind: 'member_expression', has: { field: 'object', regex: `^${namespaceName}$` }}}); + let finalState = currentState; + + if (allUsages.length === memberAccessUsages.length) { + const newTlsIdentifier = currentState.identifier; + const newImportStatement = `${helpers.createNamespaceImport(newTlsIdentifier, newImportModule)};`; + const nodeToReplace = helpers.getStatementNode(importOrDeclarator); + + if (nodeToReplace) { + localEdits.push(nodeToReplace.replace(newImportStatement)); + } + finalState = { ...currentState, added: true }; + for (const usage of memberAccessUsages) { + localEdits.push(usage.replace(`${newTlsIdentifier}.createSecureContext`)); + } + } else { + const ensureResult = ensureTlsImport(rootNode, importType, currentState); + localEdits.push(...ensureResult.edits); + finalState = ensureResult.newState; + for (const usage of memberAccessUsages) { + localEdits.push(usage.replace(`${ensureResult.identifier}.createSecureContext`)); + } + } + + return { edits: localEdits, wasTransformed: true, newState: finalState }; +} + +export default function transform(root: SgRoot): string | null { + const rootNode = root.root(); + const allEdits: Edit[] = []; + let wasTransformed = false; + let currentTlsImportState: TlsImportState = { + added: false, + identifier: 'tls', + }; + + const cryptoImportsRule = { + rule: { + any: [ + { kind: 'variable_declarator', has: { field: 'value', kind: 'call_expression', has: { field: 'arguments', has: { regex: "^['\"](node:)?crypto['\"]$" }}}}, + { kind: 'import_statement', has: { field: 'source', regex: "^['\"](node:)?crypto['\"]$" }}, + ], + }, + }; + const cryptoImports = rootNode.findAll(cryptoImportsRule); + + for (const importMatch of cryptoImports) { + const nameNode = importMatch.field('imports') ?? importMatch.field('name'); + let importType: ImportType | undefined; + + if (importMatch.kind() === 'import_statement') { + importType = importMatch.find({ rule: { kind: 'namespace_import' } }) + ? 'NAMESPACE_IMPORT' : 'DESTRUCTURED_IMPORT'; + } else if (nameNode?.is('object_pattern')) { + importType = 'DESTRUCTURED_REQUIRE'; + } else if (nameNode?.is('identifier')) { + importType = 'NAMESPACE_REQUIRE'; + } + + if (importType === undefined) continue; + + let result: HandlerResult | undefined; + const helpers = getImportHelpers(importType); + + switch (importType) { + case 'DESTRUCTURED_REQUIRE': + case 'DESTRUCTURED_IMPORT': { + const statement = helpers.getStatementNode(importMatch); + if (statement) { + result = handleDestructuredImport(statement, rootNode, currentTlsImportState, importType); + } + break; + } + case 'NAMESPACE_REQUIRE': + case 'NAMESPACE_IMPORT': + result = handleNamespaceImport(importMatch, rootNode, importType, currentTlsImportState); + break; + } + + if (result) { + allEdits.push(...result.edits); + currentTlsImportState = result.newState; + if (result.wasTransformed) { + wasTransformed = true; + } + } + } + + return wasTransformed ? rootNode.commitEdits(allEdits) : null; +} diff --git a/recipes/crypto-create-credentials/tests/expected/file-1.js b/recipes/createCredentials-to-createSecureContext/tests/expected/file-1.js similarity index 100% rename from recipes/crypto-create-credentials/tests/expected/file-1.js rename to recipes/createCredentials-to-createSecureContext/tests/expected/file-1.js diff --git a/recipes/crypto-create-credentials/tests/expected/file-2.js b/recipes/createCredentials-to-createSecureContext/tests/expected/file-2.js similarity index 100% rename from recipes/crypto-create-credentials/tests/expected/file-2.js rename to recipes/createCredentials-to-createSecureContext/tests/expected/file-2.js diff --git a/recipes/crypto-create-credentials/tests/expected/file-3.js b/recipes/createCredentials-to-createSecureContext/tests/expected/file-3.js similarity index 100% rename from recipes/crypto-create-credentials/tests/expected/file-3.js rename to recipes/createCredentials-to-createSecureContext/tests/expected/file-3.js diff --git a/recipes/crypto-create-credentials/tests/expected/file-4.mjs b/recipes/createCredentials-to-createSecureContext/tests/expected/file-4.mjs similarity index 100% rename from recipes/crypto-create-credentials/tests/expected/file-4.mjs rename to recipes/createCredentials-to-createSecureContext/tests/expected/file-4.mjs diff --git a/recipes/crypto-create-credentials/tests/expected/file-5.mjs b/recipes/createCredentials-to-createSecureContext/tests/expected/file-5.mjs similarity index 100% rename from recipes/crypto-create-credentials/tests/expected/file-5.mjs rename to recipes/createCredentials-to-createSecureContext/tests/expected/file-5.mjs diff --git a/recipes/crypto-create-credentials/tests/input/file-1.js b/recipes/createCredentials-to-createSecureContext/tests/input/file-1.js similarity index 100% rename from recipes/crypto-create-credentials/tests/input/file-1.js rename to recipes/createCredentials-to-createSecureContext/tests/input/file-1.js diff --git a/recipes/crypto-create-credentials/tests/input/file-2.js b/recipes/createCredentials-to-createSecureContext/tests/input/file-2.js similarity index 100% rename from recipes/crypto-create-credentials/tests/input/file-2.js rename to recipes/createCredentials-to-createSecureContext/tests/input/file-2.js diff --git a/recipes/crypto-create-credentials/tests/input/file-3.js b/recipes/createCredentials-to-createSecureContext/tests/input/file-3.js similarity index 100% rename from recipes/crypto-create-credentials/tests/input/file-3.js rename to recipes/createCredentials-to-createSecureContext/tests/input/file-3.js diff --git a/recipes/crypto-create-credentials/tests/input/file-4.mjs b/recipes/createCredentials-to-createSecureContext/tests/input/file-4.mjs similarity index 100% rename from recipes/crypto-create-credentials/tests/input/file-4.mjs rename to recipes/createCredentials-to-createSecureContext/tests/input/file-4.mjs diff --git a/recipes/crypto-create-credentials/tests/input/file-5.mjs b/recipes/createCredentials-to-createSecureContext/tests/input/file-5.mjs similarity index 100% rename from recipes/crypto-create-credentials/tests/input/file-5.mjs rename to recipes/createCredentials-to-createSecureContext/tests/input/file-5.mjs diff --git a/recipes/crypto-create-credentials/tsconfig.json b/recipes/createCredentials-to-createSecureContext/tsconfig.json similarity index 100% rename from recipes/crypto-create-credentials/tsconfig.json rename to recipes/createCredentials-to-createSecureContext/tsconfig.json diff --git a/recipes/crypto-create-credentials/workflow.yaml b/recipes/createCredentials-to-createSecureContext/workflow.yaml similarity index 100% rename from recipes/crypto-create-credentials/workflow.yaml rename to recipes/createCredentials-to-createSecureContext/workflow.yaml diff --git a/recipes/crypto-create-credentials/src/workflow.ts b/recipes/crypto-create-credentials/src/workflow.ts deleted file mode 100644 index 8dd059e2..00000000 --- a/recipes/crypto-create-credentials/src/workflow.ts +++ /dev/null @@ -1,397 +0,0 @@ -import * as os from 'node:os'; -import type { SgRoot, Edit, SgNode } from "@codemod.com/jssg-types/main"; - -type TlsImportState = { - added: boolean; - identifier: string; -}; - -type HandlerResult = { - edits: Edit[]; - wasTransformed: boolean; - newState: TlsImportState; -}; - -type EnsureTlsResult = { - edits: Edit[]; - identifier: string; // The identifier that was used or found - newState: TlsImportState; -}; - -type ImportType = - | 'DESTRUCTURED_REQUIRE' - | 'NAMESPACE_REQUIRE' - | 'DESTRUCTURED_IMPORT' - | 'NAMESPACE_IMPORT'; - -function ensureTlsImport( - rootNode: SgNode, - importType: ImportType, - currentState: TlsImportState, -): EnsureTlsResult { - if (currentState.added) { - return { - edits: [], - identifier: currentState.identifier, - newState: currentState, - }; - } - - const isEsm = - importType === 'DESTRUCTURED_IMPORT' || importType === 'NAMESPACE_IMPORT'; - const moduleSpecifier = 'node:tls'; - - const findRule = { - rule: { - kind: isEsm ? 'import_statement' : 'variable_declarator', - has: { - field: isEsm ? 'source' : 'value', - has: { regex: `^['"](node:)?tls['"]$` }, - }, - }, - }; - const existingTlsImport = rootNode.find(findRule); - - if (existingTlsImport) { - const nameNode = existingTlsImport.field('name'); - if (nameNode?.is('identifier')) { - const foundIdentifier = nameNode.text(); - return { - edits: [], - identifier: foundIdentifier, - newState: { - added: true, - identifier: foundIdentifier, - }, - }; - } - } - - const firstNode = rootNode.children()[0]; - - if (!firstNode) { - return { - edits: [], - identifier: currentState.identifier, - newState: currentState, - }; - } - - const tlsIdentifier = currentState.identifier; - const newImportText = isEsm - ? `import * as ${tlsIdentifier} from '${moduleSpecifier}';${os.EOL}` - : `const ${tlsIdentifier} = require('${moduleSpecifier}');${os.EOL}`; - - const edit: Edit = { - startPos: firstNode.range().start.index, - endPos: firstNode.range().start.index, - insertedText: newImportText, - }; - - return { - edits: [edit], - identifier: tlsIdentifier, - newState: { - added: true, - identifier: tlsIdentifier, - }, - }; -} - -function handleDestructuredImport( - statement: SgNode, - rootNode: SgNode, - currentState: TlsImportState, -): HandlerResult { - const localEdits: Edit[] = []; - const isEsm = statement.kind() === 'import_statement'; - - let specifiersNode: SgNode | null | undefined; - if (isEsm) { - specifiersNode = - statement.find({ rule: { kind: 'named_imports' } }) ?? - statement.field('imports'); - } else { - const declaratorFindRule = { - rule: { - kind: 'variable_declarator', - has: { - field: 'value', - kind: 'call_expression', - has: { - field: 'arguments', - has: { regex: "^['\"](node:)?crypto['\"]$" }, - }, - }, - }, - }; - const declarator = statement.find(declaratorFindRule); - specifiersNode = declarator?.field('name'); - } - - if (!specifiersNode) { - return { edits: [], wasTransformed: false, newState: currentState }; - } - - const findPropsRule = { - rule: { - any: [ - { kind: 'shorthand_property_identifier_pattern' }, - { kind: 'import_specifier' }, - ], - }, - }; - const destructuredProps = specifiersNode.findAll(findPropsRule); - - const createCredentialsNode = destructuredProps.find( - (id) => id.text() === 'createCredentials', - ); - - if (!createCredentialsNode) { - return { edits: [], wasTransformed: false, newState: currentState }; - } - - const usagesFindRule = { - rule: { - kind: 'call_expression', - has: { - field: 'function', - kind: 'identifier', - regex: '^createCredentials$', - }, - }, - }; - const usages = rootNode.findAll(usagesFindRule); - for (const usage of usages) { - const functionIdentifier = usage.field('function'); - if (functionIdentifier) { - localEdits.push(functionIdentifier.replace('createSecureContext')); - } - } - - const newImportModule = 'node:tls'; - const newImportFunction = 'createSecureContext'; - const newImportStatement = isEsm - ? `import { ${newImportFunction} } from '${newImportModule}';` - : `const { ${newImportFunction} } = require('${newImportModule}');`; - - let finalState = currentState; - - if (destructuredProps.length === 1) { - localEdits.push(statement.replace(newImportStatement)); - finalState = { ...currentState, added: true }; - } else { - const otherProps = []; - for (const d of destructuredProps) { - const text = d.text(); - if (text !== 'createCredentials') otherProps.push(text); - } - - const newDestructuredString = `{ ${otherProps.join(', ')} }`; - localEdits.push(specifiersNode.replace(newDestructuredString)); - - if (!currentState.added) { - const newEdit = { - startPos: statement.range().end.index, - // appending, so use `end` for both - endPos: statement.range().end.index, - insertedText: `${os.EOL}${newImportStatement}`, - }; - localEdits.push(newEdit); - finalState = { ...currentState, added: true }; - } - } - - return { - edits: localEdits, - wasTransformed: true, - newState: finalState, - }; -} - -function handleNamespaceImport( - importOrDeclarator: SgNode, - rootNode: SgNode, - importType: ImportType, - currentState: TlsImportState, -): HandlerResult { - const localEdits: Edit[] = []; - const isEsm = importType === 'NAMESPACE_IMPORT'; - - const nameNode = isEsm - ? importOrDeclarator.find({ rule: { kind: 'namespace_import' } })?.find({ rule: { kind: 'identifier' } }) - : importOrDeclarator.field('name'); - - if (!nameNode) { - return { edits: [], wasTransformed: false, newState: currentState }; - } - const namespaceName = nameNode.text(); - - const memberAccessFindRule = { - rule: { - kind: 'member_expression', - all: [ - { has: { field: 'object', regex: `^${namespaceName}$` } }, - { has: { field: 'property', regex: '^createCredentials$' } }, - ], - }, - }; - const memberAccessUsages = rootNode.findAll(memberAccessFindRule); - - if (memberAccessUsages.length === 0) { - return { edits: [], wasTransformed: false, newState: currentState }; - } - - const allUsagesFindRule = { - rule: { - kind: 'member_expression', - has: { field: 'object', regex: `^${namespaceName}$` }, - }, - }; - const allUsages = rootNode.findAll(allUsagesFindRule); - - let finalState = currentState; - - if (allUsages.length === memberAccessUsages.length) { - const newTlsIdentifier = currentState.identifier; - const newImportModule = 'node:tls'; - const newImportStatement = isEsm - ? `import * as ${newTlsIdentifier} from '${newImportModule}';` - : `const ${newTlsIdentifier} = require('${newImportModule}');`; - - const nodeToReplace = isEsm - ? importOrDeclarator - : importOrDeclarator.parent(); - - if (nodeToReplace) { - localEdits.push(nodeToReplace.replace(newImportStatement)); - } - - finalState = { ...currentState, added: true }; - - for (const usage of memberAccessUsages) { - const replacementText = `${newTlsIdentifier}.createSecureContext`; - localEdits.push(usage.replace(replacementText)); - } - } else { - const ensureResult = ensureTlsImport( - rootNode, - importType, - currentState, - ); - localEdits.push(...ensureResult.edits); - finalState = ensureResult.newState; - - for (const usage of memberAccessUsages) { - localEdits.push(usage.replace(`${ensureResult.identifier}.createSecureContext`)); - } - } - - return { - edits: localEdits, - wasTransformed: true, - newState: finalState, - }; -} - -export default function transform(root: SgRoot): string | null { - const rootNode = root.root(); - const allEdits: Edit[] = []; - let wasTransformed = false; - let currentTlsImportState: TlsImportState = { - added: false, - identifier: 'tls', - }; - - const cryptoImportsRule = { - rule: { - any: [ - { - kind: 'variable_declarator', - has: { - field: 'value', - kind: 'call_expression', - has: { - field: 'arguments', - has: { regex: "^['\"](node:)?crypto['\"]$" }, - }, - }, - }, - { - kind: 'import_statement', - has: { - field: 'source', - regex: "^['\"](node:)?crypto['\"]$", - }, - }, - ], - }, - }; - const cryptoImports = rootNode.findAll(cryptoImportsRule); - - for (const importMatch of cryptoImports) { - const nameNode = - importMatch.field('imports') ?? importMatch.field('name'); - let importType: ImportType | undefined; - - if (importMatch.kind() === 'import_statement') { - importType = importMatch.find({ rule: { kind: 'namespace_import' } }) - ? 'NAMESPACE_IMPORT' - : 'DESTRUCTURED_IMPORT'; - } else { - if (nameNode?.is('object_pattern')) { - importType = 'DESTRUCTURED_REQUIRE'; - } else if (nameNode?.is('identifier')) { - importType = 'NAMESPACE_REQUIRE'; - } - } - - if (importType === undefined) { - continue; - } - - let result: HandlerResult | undefined; - - switch (importType) { - case 'DESTRUCTURED_REQUIRE': - case 'DESTRUCTURED_IMPORT': { - const statement = - importType === 'DESTRUCTURED_REQUIRE' - ? importMatch.parent() - : importMatch; - if (statement) { - result = handleDestructuredImport( - statement, - rootNode, - currentTlsImportState, - ); - } - break; - } - - case 'NAMESPACE_REQUIRE': - case 'NAMESPACE_IMPORT': - result = handleNamespaceImport( - importMatch, - rootNode, - importType, - currentTlsImportState, - ); - break; - } - - if (result) { - allEdits.push(...result.edits); - currentTlsImportState = result.newState; - if (result.wasTransformed) { - wasTransformed = true; - } - } - } - - if (wasTransformed) { - return rootNode.commitEdits(allEdits); - } - - return null; -} From 884a44d713a11de56d8216f1f068273e045e08ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Wed, 13 Aug 2025 08:20:32 +0530 Subject: [PATCH 24/43] updated to use destructred import --- .../src/workflow.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/recipes/createCredentials-to-createSecureContext/src/workflow.ts b/recipes/createCredentials-to-createSecureContext/src/workflow.ts index 2c9ec4ff..8a72f98b 100644 --- a/recipes/createCredentials-to-createSecureContext/src/workflow.ts +++ b/recipes/createCredentials-to-createSecureContext/src/workflow.ts @@ -1,4 +1,4 @@ -import * as os from 'node:os'; +import { EOL } from 'node:os'; import type { SgRoot, Edit, SgNode } from "@codemod.com/jssg-types/main"; type TlsImportState = { @@ -86,7 +86,7 @@ function ensureTlsImport( } const tlsIdentifier = currentState.identifier; - const newImportText = `${helpers.createNamespaceImport(tlsIdentifier, 'node:tls')};${os.EOL}`; + const newImportText = `${helpers.createNamespaceImport(tlsIdentifier, 'node:tls')};${EOL}`; const edit: Edit = { startPos: firstNode.range().start.index, endPos: firstNode.range().start.index, @@ -146,7 +146,7 @@ function handleDestructuredImport( const newEdit = { startPos: statement.range().end.index, endPos: statement.range().end.index, - insertedText: `${os.EOL}${newImportStatement}`, + insertedText: `${EOL}${newImportStatement}`, }; localEdits.push(newEdit); finalState = { ...currentState, added: true }; From 015cd212ab4e223d5879254ad13327d04649a148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Thu, 14 Aug 2025 20:22:33 +0530 Subject: [PATCH 25/43] stable --- .../src/workflow.ts | 749 ++++++++++++------ 1 file changed, 490 insertions(+), 259 deletions(-) diff --git a/recipes/createCredentials-to-createSecureContext/src/workflow.ts b/recipes/createCredentials-to-createSecureContext/src/workflow.ts index 8a72f98b..4ed68d25 100644 --- a/recipes/createCredentials-to-createSecureContext/src/workflow.ts +++ b/recipes/createCredentials-to-createSecureContext/src/workflow.ts @@ -1,271 +1,502 @@ import { EOL } from 'node:os'; -import type { SgRoot, Edit, SgNode } from "@codemod.com/jssg-types/main"; - -type TlsImportState = { - added: boolean; - identifier: string; -}; - -type HandlerResult = { - edits: Edit[]; - wasTransformed: boolean; - newState: TlsImportState; -}; - -type EnsureTlsResult = { - edits: Edit[]; - identifier: string; // The identifier that was used or found - newState: TlsImportState; -}; - -type ImportType = - | 'DESTRUCTURED_REQUIRE' - | 'NAMESPACE_REQUIRE' - | 'DESTRUCTURED_IMPORT' - | 'NAMESPACE_IMPORT'; - -const newImportModule = 'node:tls'; -const newImportFunction = 'createSecureContext'; - -function getImportHelpers(importType: ImportType) { - const isEsm = - importType === 'DESTRUCTURED_IMPORT' || importType === 'NAMESPACE_IMPORT'; - - return { - isEsm, - createNamespaceImport: (id: string, mod: string) => - isEsm - ? `import * as ${id} from '${mod}'` - : `const ${id} = require('${mod}')`, - createDestructuredImport: (specifier: string, mod: string) => - isEsm - ? `import { ${specifier} } from '${mod}'` - : `const { ${specifier} } = require('${mod}')`, - getStatementNode: (match: SgNode): SgNode | null => - isEsm ? match : match.parent(), - }; -} +import type { SgRoot, Edit, SgNode, Kinds, TypesMap } from "@codemod.com/jssg-types/main"; +import { getNodeRequireCalls } from "@nodejs/codemod-utils/ast-grep/require-call"; +import { getNodeImportCalls, getNodeImportStatements } from "@nodejs/codemod-utils/ast-grep/import-statement"; +const newImportFunction = 'createSecureContext' +const newImportModule = 'node:tls' +const oldFunctionName = 'createCredentials'; +const oldImportModule = 'node:crypto' -function ensureTlsImport( - rootNode: SgNode, - importType: ImportType, - currentState: TlsImportState, -): EnsureTlsResult { - if (currentState.added) { - return { edits: [], identifier: currentState.identifier, newState: currentState }; - } - - const helpers = getImportHelpers(importType); - const findRule = { - rule: { - kind: helpers.isEsm ? 'import_statement' : 'variable_declarator', - has: { - field: helpers.isEsm ? 'source' : 'value', - has: { regex: `^['"](node:)?tls['"]$` }, - }, - }, - }; - const existingTlsImport = rootNode.find(findRule); - - if (existingTlsImport) { - const nameNode = existingTlsImport.field('name'); - if (nameNode?.is('identifier')) { - const foundIdentifier = nameNode.text(); - return { - edits: [], - identifier: foundIdentifier, - newState: { added: true, identifier: foundIdentifier }, - }; - } - } - - const firstNode = rootNode.children()[0]; - if (!firstNode) { - return { edits: [], identifier: currentState.identifier, newState: currentState }; - } - - const tlsIdentifier = currentState.identifier; - const newImportText = `${helpers.createNamespaceImport(tlsIdentifier, 'node:tls')};${EOL}`; - const edit: Edit = { - startPos: firstNode.range().start.index, - endPos: firstNode.range().start.index, - insertedText: newImportText, - }; - - return { - edits: [edit], - identifier: tlsIdentifier, - newState: { added: true, identifier: tlsIdentifier }, - }; +function handleNamespaceImport( + rootNode: SgRoot, + localNamespace: string, + declaration: SgNode>, + importType: 'require' | 'static' | 'dynamic-await' +): Edit[] { + const allEdits: Edit[] = []; + const newNamespace = 'tls'; + + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: { + field: 'function', + kind: 'member_expression', + all: [ + { has: { field: 'object', regex: `^${localNamespace}$` } }, + { has: { field: 'property', regex: `^${oldFunctionName}$` } } + ] + } + } + }); + + if (usages.length === 0) { + return []; + } + + for (const usage of usages) { + const func = usage.field('function'); + if (func) { + allEdits.push(func.replace(`${newNamespace}.${newImportFunction}`)); + } + } + + let newImportStatement = ''; + switch (importType) { + case 'require': + newImportStatement = `const ${newNamespace} = require('${newImportModule}');`; + break; + case 'static': + newImportStatement = `import * as ${newNamespace} from '${newImportModule}';`; + break; + case 'dynamic-await': + newImportStatement = `const ${newNamespace} = await import('${newImportModule}');`; + break; + } + + allEdits.push(declaration.replace(newImportStatement)); + + return allEdits; } function handleDestructuredImport( - statement: SgNode, - rootNode: SgNode, - currentState: TlsImportState, - importType: ImportType, -): HandlerResult { - const localEdits: Edit[] = []; - const helpers = getImportHelpers(importType); - - const specifiersNode = helpers.isEsm - ? statement.find({ rule: { kind: 'named_imports' } }) ?? statement.field('imports') - : statement.find({ rule: { kind: 'variable_declarator' } })?.field('name'); - - if (!specifiersNode) { - return { edits: [], wasTransformed: false, newState: currentState }; - } - - const destructuredProps = specifiersNode.findAll({ rule: { any: [{ kind: 'shorthand_property_identifier_pattern' }, { kind: 'import_specifier' }]}}); - const createCredentialsNode = destructuredProps.find((id) => id.text() === 'createCredentials'); - - if (!createCredentialsNode) { - return { edits: [], wasTransformed: false, newState: currentState }; - } - - const usages = rootNode.findAll({ rule: { kind: 'call_expression', has: { field: 'function', kind: 'identifier', regex: '^createCredentials$' }}}); - for (const usage of usages) { - usage.field('function')?.replace('createSecureContext'); - } - - const newImportStatement = `${helpers.createDestructuredImport(newImportFunction, newImportModule)};`; - let finalState = currentState; - - if (destructuredProps.length === 1) { - localEdits.push(statement.replace(newImportStatement)); - finalState = { ...currentState, added: true }; - } else { - const otherProps = destructuredProps - .map(d => d.text()) - .filter(text => text !== 'createCredentials'); - - localEdits.push(specifiersNode.replace(`{ ${otherProps.join(', ')} }`)); - - if (!currentState.added) { - const newEdit = { - startPos: statement.range().end.index, - endPos: statement.range().end.index, - insertedText: `${EOL}${newImportStatement}`, - }; - localEdits.push(newEdit); - finalState = { ...currentState, added: true }; - } - } - - return { edits: localEdits, wasTransformed: true, newState: finalState }; + rootNode: SgRoot, + idNode: SgNode>, + declaration: SgNode>, + importType: 'require' | 'static' | 'dynamic-await' +): Edit[] { + let localFunctionName: string | null = null; + let targetSpecifierNode: SgNode | null = null; + let isAliased = false; + + const relevantSpecifiers = idNode.children().filter( + child => ['pair_pattern', 'shorthand_property_identifier_pattern', 'import_specifier'].includes(child.kind() as string) + ); + + for (const spec of relevantSpecifiers) { + let keyNode, aliasNode; + + if (spec.kind() === 'import_specifier') { + keyNode = spec.field('name'); + aliasNode = spec.field('alias'); + } else if (spec.kind() === 'pair_pattern') { + keyNode = spec.field('key'); + aliasNode = spec.field('value'); + } else { + keyNode = spec; + } + + if (keyNode?.text() === oldFunctionName) { + targetSpecifierNode = spec; + isAliased = Boolean(aliasNode); + localFunctionName = isAliased ? aliasNode!.text() : keyNode!.text(); + break; + } + } + + if (localFunctionName && targetSpecifierNode) { + const allEdits: Edit[] = []; + + if (!isAliased) { + const usageEdits = findAndReplaceUsages(rootNode, localFunctionName, newImportFunction); + allEdits.push(...usageEdits); + } + + const aliasSeparator = importType === 'static' ? ' as' : ':'; + const newImportSpecifier = isAliased + ? `{ ${newImportFunction}${aliasSeparator} ${localFunctionName} }` + : `{ ${newImportFunction} }`; + + let newImportStatement = ''; + switch (importType) { + case 'require': + newImportStatement = `const ${newImportSpecifier} = require('${newImportModule}');`; + break; + case 'static': + newImportStatement = `import ${newImportSpecifier} from '${newImportModule}';`; + break; + case 'dynamic-await': + newImportStatement = `const ${newImportSpecifier} = await import('${newImportModule}');`; + break; + } + + const otherSpecifiers = relevantSpecifiers.filter(s => s !== targetSpecifierNode); + if (otherSpecifiers.length > 0) { + const otherSpecifiersText = otherSpecifiers.map(s => s.text()).join(', '); + let modifiedOldImport = ''; + switch (importType) { + case 'require': + modifiedOldImport = `const { ${otherSpecifiersText} } = require('${oldImportModule}');`; + break; + case 'static': + modifiedOldImport = `import { ${otherSpecifiersText} } from '${oldImportModule}';`; + break; + case 'dynamic-await': + modifiedOldImport = `const { ${otherSpecifiersText} } = await import('${oldImportModule}');`; + break; + } + const replacementText = `${modifiedOldImport}${EOL}${newImportStatement}`; + allEdits.push(declaration.replace(replacementText)); + } else { + allEdits.push(declaration.replace(newImportStatement)); + } + + return allEdits; + } + + return []; } -function handleNamespaceImport( - importOrDeclarator: SgNode, - rootNode: SgNode, - importType: ImportType, - currentState: TlsImportState, -): HandlerResult { - const localEdits: Edit[] = []; - const helpers = getImportHelpers(importType); - - const nameNode = helpers.isEsm - ? importOrDeclarator.find({ rule: { kind: 'namespace_import' } })?.find({ rule: { kind: 'identifier' } }) - : importOrDeclarator.field('name'); - - if (!nameNode) { - return { edits: [], wasTransformed: false, newState: currentState }; - } - const namespaceName = nameNode.text(); - - const memberAccessUsages = rootNode.findAll({ rule: { kind: 'member_expression', all: [ { has: { field: 'object', regex: `^${namespaceName}$` } }, { has: { field: 'property', regex: '^createCredentials$' } }]}}); - if (memberAccessUsages.length === 0) { - return { edits: [], wasTransformed: false, newState: currentState }; - } - - const allUsages = rootNode.findAll({ rule: { kind: 'member_expression', has: { field: 'object', regex: `^${namespaceName}$` }}}); - let finalState = currentState; - - if (allUsages.length === memberAccessUsages.length) { - const newTlsIdentifier = currentState.identifier; - const newImportStatement = `${helpers.createNamespaceImport(newTlsIdentifier, newImportModule)};`; - const nodeToReplace = helpers.getStatementNode(importOrDeclarator); - - if (nodeToReplace) { - localEdits.push(nodeToReplace.replace(newImportStatement)); - } - finalState = { ...currentState, added: true }; - for (const usage of memberAccessUsages) { - localEdits.push(usage.replace(`${newTlsIdentifier}.createSecureContext`)); - } - } else { - const ensureResult = ensureTlsImport(rootNode, importType, currentState); - localEdits.push(...ensureResult.edits); - finalState = ensureResult.newState; - for (const usage of memberAccessUsages) { - localEdits.push(usage.replace(`${ensureResult.identifier}.createSecureContext`)); - } - } - - return { edits: localEdits, wasTransformed: true, newState: finalState }; +function findAndReplaceUsages( + rootNode: SgRoot, + localFunctionName: string, + newFunctionName: string, + object: string | null = null +): Edit[] { + const edits: Edit[] = []; + + if (object) { + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: { + field: 'function', + kind: 'member_expression', + all: [ + { has: { field: 'object', regex: `^${object}$` } }, + { has: { field: 'property', regex: `^${localFunctionName}$` } } + ] + } + } + }); + + for (const usage of usages) { + const memberExpressionNode = usage.field('function'); + const propertyNode = memberExpressionNode?.field('property'); + if (propertyNode) { + edits.push(propertyNode.replace(newFunctionName)); + } + } + } else { + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: { field: 'function', kind: 'identifier', regex: `^${localFunctionName}$` }, + }, + }); + + for (const usage of usages) { + const functionNode = usage.field('function'); + if (functionNode) { + edits.push(functionNode.replace(newFunctionName)); + } + } + } + return edits; +} + +function handleRequire( + statement: SgNode>, + rootNode: SgRoot, +): Edit[] { + const idNode = statement.child(0); + const declaration = statement.parent(); + + if (!idNode || !declaration) { + return []; + } + + // Handle Namespace Imports: const crypto = require('...') + if (idNode.kind() === 'identifier') { + const localNamespace = idNode.text(); + return handleNamespaceImport(rootNode, localNamespace, declaration, 'require'); + } + + // Handle Destructured Imports: const { ... } = require('...') + if (idNode.kind() === 'object_pattern') { + return handleDestructuredImport(rootNode, idNode, declaration, 'require'); + } + + return []; +} +function handleStaticImport( + statement: SgNode>, + rootNode: SgRoot, +): Edit[] { + + const modulePathNode = statement.field('source'); + const importClause = statement.child(1); + + if (importClause?.kind() !== 'import_clause' || !modulePathNode) { + return []; + } + + const clauseContent = importClause.child(0); + + if (!clauseContent) { + return []; + } + + // Handle Namespace Imports: import * as crypto from '...' + if (clauseContent.kind() === 'namespace_import') { + const localNamespace = clauseContent.find({ rule: { kind: 'identifier' } })?.text(); + const allEdits: Edit[] = []; + + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: { + field: 'function', + kind: 'member_expression', + all: [ + { has: { field: 'object', regex: `^${localNamespace}$` } }, + { has: { field: 'property', regex: `^${oldFunctionName}$` } } + ] + } + } + }); + + if (usages.length > 0) { + const newNamespace = 'tls'; + + for (const usage of usages) { + const func = usage.field('function'); + if (func) { + allEdits.push(func.replace(`${newNamespace}.${newImportFunction}`)); + } + } + + const newImportStatement = `import * as ${newNamespace} from '${newImportModule}';`; + allEdits.push(statement.replace(newImportStatement)); + + return allEdits; + } + } + + // Handle Named Imports: import { ... } from '...' + if (clauseContent.kind() === 'named_imports') { + const namedImportsNode = clauseContent; + let localFunctionName: string | null = null; + let targetSpecifierNode: SgNode | null = null; + let isAliased = false; + + const relevantSpecifiers = namedImportsNode.children().filter( + child => child.kind() === 'import_specifier' + ); + + for (const spec of relevantSpecifiers) { + const nameNode = spec.field('name'); + const aliasNode = spec.field('alias'); + + + if (nameNode?.text() === oldFunctionName) { + targetSpecifierNode = spec; + isAliased = Boolean(aliasNode); + localFunctionName = isAliased ? aliasNode!.text() : nameNode!.text(); + break; + } + } + + if (localFunctionName && targetSpecifierNode) { + const allEdits: Edit[] = []; + const declaration = statement; + + if (!isAliased) { + const usageEdits = findAndReplaceUsages(rootNode, localFunctionName, newImportFunction); + allEdits.push(...usageEdits); + } else { + } + + const newImportSpecifier = isAliased + ? `{ ${newImportFunction} as ${localFunctionName} }` + : `{ ${newImportFunction} }`; + const newImportStatement = `import ${newImportSpecifier} from '${newImportModule}';`; + + const otherSpecifiers = relevantSpecifiers.filter(s => s !== targetSpecifierNode); + if (otherSpecifiers.length > 0) { + const modifiedOldImport = `import { ${otherSpecifiers.map(s => s.text()).join(', ')} } from '${oldImportModule}';`; + const replacementText = `${modifiedOldImport}${EOL}${newImportStatement}`; + allEdits.push(declaration.replace(replacementText)); + } else { + allEdits.push(declaration.replace(newImportStatement)); + } + + return allEdits; + } + } + + return []; +} + +function handleDynamicImport( + statement: SgNode>, + rootNode: SgRoot, +): Edit[] { + + const valueNode = statement.field('value'); + const idNode = statement.child(0); + const declaration = statement.parent(); + + if (valueNode?.kind() === 'call_expression' && idNode?.kind() === 'identifier') { + const functionNode = valueNode.field('function'); + const isThenCall = functionNode?.kind() === 'member_expression' && functionNode.field('property')?.text() === 'then'; + const awaitNode = functionNode?.field('object')?.find({ rule: { kind: 'await_expression' } }); + + const importModuleStringNode = awaitNode?.find({ + rule: { + kind: 'string', + has: { kind: 'string_fragment', regex: `^${oldImportModule}$` } + } + }); + + if (isThenCall && importModuleStringNode) { + const allEdits: Edit[] = []; + + const usageEdits = findAndReplaceUsages(rootNode, idNode.text(), newImportFunction); + + allEdits.push(...usageEdits); + allEdits.push(idNode.replace(newImportFunction)); + allEdits.push(importModuleStringNode.replace(`'${newImportModule}'`)); + + const thenCallback = valueNode.field('arguments')?.child(0); + const callbackBody = thenCallback?.field('body'); + if (callbackBody?.kind() === 'member_expression') { + const propertyNode = callbackBody.field('property'); + if (propertyNode?.text() === oldFunctionName) { + allEdits.push(propertyNode.replace(newImportFunction)); + } + } + + return allEdits; + } + } + + if (valueNode?.kind() === 'await_expression') { + if (!declaration) { + return []; + } + + if (idNode?.kind() === 'identifier') { + const localNamespace = idNode.text(); + const allEdits: Edit[] = []; + + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: { + field: 'function', + kind: 'member_expression', + all: [ + { has: { field: 'object', regex: `^${localNamespace}$` } }, + { has: { field: 'property', regex: `^${oldFunctionName}$` } } + ] + } + } + }); + + if (usages.length > 0) { + const newNamespace = 'tls'; + + for (const usage of usages) { + const func = usage.field('function'); + if (func) { + allEdits.push(func.replace(`${newNamespace}.${newImportFunction}`)); + } + } + + const newImportStatement = `const ${newNamespace} = await import('${newImportModule}');`; + allEdits.push(declaration.replace(newImportStatement)); + + return allEdits; + } + } + + if (idNode?.kind() === 'object_pattern') { + let localFunctionName: string | null = null; + let targetSpecifierNode: SgNode | null = null; + let isAliased = false; + + const relevantSpecifiers = idNode.children().filter( + child => child.kind() === 'pair_pattern' || child.kind() === 'shorthand_property_identifier_pattern' + ); + + for (const spec of relevantSpecifiers) { + const key = spec.kind() === 'pair_pattern' ? spec.field('key') : spec; + if (key?.text() === oldFunctionName) { + targetSpecifierNode = spec; + isAliased = spec.kind() === 'pair_pattern'; + localFunctionName = isAliased ? spec.field('value')!.text() : key.text(); + break; + } + } + + if (localFunctionName && targetSpecifierNode) { + const allEdits: Edit[] = []; + + if (!isAliased) { + const usageEdits = findAndReplaceUsages(rootNode, localFunctionName, newImportFunction); + allEdits.push(...usageEdits); + } else { + } + + const newImportSpecifier = isAliased + ? `{ ${newImportFunction}: ${localFunctionName} }` + : `{ ${newImportFunction} }`; + const newImportStatement = `const ${newImportSpecifier} = await import('${newImportModule}');`; + + const otherSpecifiers = relevantSpecifiers.filter(s => s !== targetSpecifierNode); + if (otherSpecifiers.length > 0) { + const modifiedOldImport = `const { ${otherSpecifiers.map(s => s.text()).join(', ')} } = await import('${oldImportModule}');`; + const replacementText = `${modifiedOldImport}${EOL}${newImportStatement}`; + allEdits.push(declaration.replace(replacementText)); + } else { + allEdits.push(declaration.replace(newImportStatement)); + } + + return allEdits; + } + } + } + + return []; } export default function transform(root: SgRoot): string | null { - const rootNode = root.root(); - const allEdits: Edit[] = []; - let wasTransformed = false; - let currentTlsImportState: TlsImportState = { - added: false, - identifier: 'tls', - }; - - const cryptoImportsRule = { - rule: { - any: [ - { kind: 'variable_declarator', has: { field: 'value', kind: 'call_expression', has: { field: 'arguments', has: { regex: "^['\"](node:)?crypto['\"]$" }}}}, - { kind: 'import_statement', has: { field: 'source', regex: "^['\"](node:)?crypto['\"]$" }}, - ], - }, - }; - const cryptoImports = rootNode.findAll(cryptoImportsRule); - - for (const importMatch of cryptoImports) { - const nameNode = importMatch.field('imports') ?? importMatch.field('name'); - let importType: ImportType | undefined; - - if (importMatch.kind() === 'import_statement') { - importType = importMatch.find({ rule: { kind: 'namespace_import' } }) - ? 'NAMESPACE_IMPORT' : 'DESTRUCTURED_IMPORT'; - } else if (nameNode?.is('object_pattern')) { - importType = 'DESTRUCTURED_REQUIRE'; - } else if (nameNode?.is('identifier')) { - importType = 'NAMESPACE_REQUIRE'; - } - - if (importType === undefined) continue; - - let result: HandlerResult | undefined; - const helpers = getImportHelpers(importType); - - switch (importType) { - case 'DESTRUCTURED_REQUIRE': - case 'DESTRUCTURED_IMPORT': { - const statement = helpers.getStatementNode(importMatch); - if (statement) { - result = handleDestructuredImport(statement, rootNode, currentTlsImportState, importType); - } - break; - } - case 'NAMESPACE_REQUIRE': - case 'NAMESPACE_IMPORT': - result = handleNamespaceImport(importMatch, rootNode, importType, currentTlsImportState); - break; - } - - if (result) { - allEdits.push(...result.edits); - currentTlsImportState = result.newState; - if (result.wasTransformed) { - wasTransformed = true; - } - } - } - - return wasTransformed ? rootNode.commitEdits(allEdits) : null; + const rootNode = root.root(); + const allEdits: Edit[] = []; + let wasTransformed = false; + + // @ts-ignore + const requireImports = getNodeRequireCalls(root, 'crypto'); + // @ts-ignore + const staticImports = getNodeImportStatements(root, 'crypto'); + // @ts-ignore + const dynamicImports = getNodeImportCalls(root, 'crypto'); + + for (const requireCall of requireImports) { + const edits = handleRequire(requireCall, root); + if (edits.length > 0) { + wasTransformed = true; + allEdits.push(...edits); + } + } + + for (const staticImport of staticImports) { + const edits = handleStaticImport(staticImport, root); + if (edits.length > 0) { + wasTransformed = true; + allEdits.push(...edits); + } + } + + for (const dynamicImport of dynamicImports) { + const edits = handleDynamicImport(dynamicImport, root); + if (edits.length > 0) { + wasTransformed = true; + allEdits.push(...edits); + } + } + + return wasTransformed ? rootNode.commitEdits(allEdits) : null; } From 152e90f5bbc2ebf5079159a06a03755f6258d92a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Thu, 14 Aug 2025 20:59:25 +0530 Subject: [PATCH 26/43] fix --- .../src/workflow.ts | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/recipes/createCredentials-to-createSecureContext/src/workflow.ts b/recipes/createCredentials-to-createSecureContext/src/workflow.ts index 4ed68d25..df1ed582 100644 --- a/recipes/createCredentials-to-createSecureContext/src/workflow.ts +++ b/recipes/createCredentials-to-createSecureContext/src/workflow.ts @@ -7,6 +7,7 @@ const newImportFunction = 'createSecureContext' const newImportModule = 'node:tls' const oldFunctionName = 'createCredentials'; const oldImportModule = 'node:crypto' +const newNamespace = 'tls'; function handleNamespaceImport( rootNode: SgRoot, @@ -15,7 +16,6 @@ function handleNamespaceImport( importType: 'require' | 'static' | 'dynamic-await' ): Edit[] { const allEdits: Edit[] = []; - const newNamespace = 'tls'; const usages = rootNode.root().findAll({ rule: { @@ -75,7 +75,8 @@ function handleDestructuredImport( ); for (const spec of relevantSpecifiers) { - let keyNode, aliasNode; + let keyNode: SgNode> | null = null; + let aliasNode: SgNode> | null = null; if (spec.kind() === 'import_specifier') { keyNode = spec.field('name'); @@ -220,20 +221,18 @@ function handleRequire( return []; } + function handleStaticImport( statement: SgNode>, rootNode: SgRoot, ): Edit[] { - const modulePathNode = statement.field('source'); const importClause = statement.child(1); - - if (importClause?.kind() !== 'import_clause' || !modulePathNode) { + if (importClause?.kind() !== 'import_clause') { return []; } - + // Detects: import * as crypto from '...' const clauseContent = importClause.child(0); - if (!clauseContent) { return []; } @@ -258,7 +257,6 @@ function handleStaticImport( }); if (usages.length > 0) { - const newNamespace = 'tls'; for (const usage of usages) { const func = usage.field('function'); @@ -338,6 +336,7 @@ function handleDynamicImport( const idNode = statement.child(0); const declaration = statement.parent(); + // Detects: const x = (await import(...)).then(...) if (valueNode?.kind() === 'call_expression' && idNode?.kind() === 'identifier') { const functionNode = valueNode.field('function'); const isThenCall = functionNode?.kind() === 'member_expression' && functionNode.field('property')?.text() === 'then'; @@ -377,6 +376,7 @@ function handleDynamicImport( return []; } + // Detects: const crypto = await import(...) if (idNode?.kind() === 'identifier') { const localNamespace = idNode.text(); const allEdits: Edit[] = []; @@ -396,8 +396,6 @@ function handleDynamicImport( }); if (usages.length > 0) { - const newNamespace = 'tls'; - for (const usage of usages) { const func = usage.field('function'); if (func) { @@ -412,6 +410,7 @@ function handleDynamicImport( } } + // Detects: const { ... } = await import(...) if (idNode?.kind() === 'object_pattern') { let localFunctionName: string | null = null; let targetSpecifierNode: SgNode | null = null; From c0fd8e05f5bfb220204d6bedda7d9c2c8f8dbcb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Thu, 14 Aug 2025 21:16:35 +0530 Subject: [PATCH 27/43] update to test --- .../tests/expected/file-1-pair.cjs | 7 +++++++ .../tests/expected/file-1-pair.mjs | 7 +++++++ .../tests/expected/{file-1.js => file-1.cjs} | 2 +- .../tests/expected/{file-4.mjs => file-1.mjs} | 0 .../tests/expected/{file-2.js => file-2.cjs} | 2 +- .../tests/expected/file-2.mjs | 6 ++++++ .../tests/expected/file-3-pair.cjs | 10 ++++++++++ .../tests/expected/file-3-pair.mjs | 10 ++++++++++ .../tests/expected/{file-3.js => file-3.cjs} | 2 +- .../tests/expected/file-3.mjs | 10 ++++++++++ .../tests/expected/file-5.cjs | 6 ++++++ .../tests/expected/file-5.mjs | 2 +- .../tests/expected/file-6-pair.mjs | 6 ++++++ .../tests/expected/file-6.mjs | 6 ++++++ .../tests/input/file-1-pair.cjs | 7 +++++++ .../tests/input/file-1-pair.mjs | 7 +++++++ .../tests/input/{file-1.js => file-1.cjs} | 2 +- .../tests/input/{file-4.mjs => file-1.mjs} | 0 .../tests/input/{file-2.js => file-2.cjs} | 2 +- .../tests/input/file-2.mjs | 6 ++++++ .../tests/input/file-3-pair.cjs | 9 +++++++++ .../tests/input/file-3-pair.mjs | 9 +++++++++ .../tests/input/{file-3.js => file-3.cjs} | 2 +- .../tests/input/file-3.mjs | 9 +++++++++ .../tests/input/file-5.cjs | 6 ++++++ .../tests/input/file-5.mjs | 2 +- .../tests/input/file-6-pair.mjs | 6 ++++++ .../tests/input/file-6.mjs | 6 ++++++ 28 files changed, 141 insertions(+), 8 deletions(-) create mode 100644 recipes/createCredentials-to-createSecureContext/tests/expected/file-1-pair.cjs create mode 100644 recipes/createCredentials-to-createSecureContext/tests/expected/file-1-pair.mjs rename recipes/createCredentials-to-createSecureContext/tests/expected/{file-1.js => file-1.cjs} (97%) rename recipes/createCredentials-to-createSecureContext/tests/expected/{file-4.mjs => file-1.mjs} (100%) rename recipes/createCredentials-to-createSecureContext/tests/expected/{file-2.js => file-2.cjs} (97%) create mode 100644 recipes/createCredentials-to-createSecureContext/tests/expected/file-2.mjs create mode 100644 recipes/createCredentials-to-createSecureContext/tests/expected/file-3-pair.cjs create mode 100644 recipes/createCredentials-to-createSecureContext/tests/expected/file-3-pair.mjs rename recipes/createCredentials-to-createSecureContext/tests/expected/{file-3.js => file-3.cjs} (89%) create mode 100644 recipes/createCredentials-to-createSecureContext/tests/expected/file-3.mjs create mode 100644 recipes/createCredentials-to-createSecureContext/tests/expected/file-5.cjs create mode 100644 recipes/createCredentials-to-createSecureContext/tests/expected/file-6-pair.mjs create mode 100644 recipes/createCredentials-to-createSecureContext/tests/expected/file-6.mjs create mode 100644 recipes/createCredentials-to-createSecureContext/tests/input/file-1-pair.cjs create mode 100644 recipes/createCredentials-to-createSecureContext/tests/input/file-1-pair.mjs rename recipes/createCredentials-to-createSecureContext/tests/input/{file-1.js => file-1.cjs} (97%) rename recipes/createCredentials-to-createSecureContext/tests/input/{file-4.mjs => file-1.mjs} (100%) rename recipes/createCredentials-to-createSecureContext/tests/input/{file-2.js => file-2.cjs} (97%) create mode 100644 recipes/createCredentials-to-createSecureContext/tests/input/file-2.mjs create mode 100644 recipes/createCredentials-to-createSecureContext/tests/input/file-3-pair.cjs create mode 100644 recipes/createCredentials-to-createSecureContext/tests/input/file-3-pair.mjs rename recipes/createCredentials-to-createSecureContext/tests/input/{file-3.js => file-3.cjs} (87%) create mode 100644 recipes/createCredentials-to-createSecureContext/tests/input/file-3.mjs create mode 100644 recipes/createCredentials-to-createSecureContext/tests/input/file-5.cjs create mode 100644 recipes/createCredentials-to-createSecureContext/tests/input/file-6-pair.mjs create mode 100644 recipes/createCredentials-to-createSecureContext/tests/input/file-6.mjs diff --git a/recipes/createCredentials-to-createSecureContext/tests/expected/file-1-pair.cjs b/recipes/createCredentials-to-createSecureContext/tests/expected/file-1-pair.cjs new file mode 100644 index 00000000..4d399871 --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/expected/file-1-pair.cjs @@ -0,0 +1,7 @@ +const { createSecureContext: customCreateCredentials } = require('node:tls'); + +const credentials = customCreateCredentials({ + key: privateKey, + cert: certificate, + ca: [caCertificate] +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/expected/file-1-pair.mjs b/recipes/createCredentials-to-createSecureContext/tests/expected/file-1-pair.mjs new file mode 100644 index 00000000..efa9b601 --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/expected/file-1-pair.mjs @@ -0,0 +1,7 @@ +import { createSecureContext as customCreateCredentials } from 'node:tls'; + +const credentials = customCreateCredentials({ + key: privateKey, + cert: certificate, + ca: [caCertificate] +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/expected/file-1.js b/recipes/createCredentials-to-createSecureContext/tests/expected/file-1.cjs similarity index 97% rename from recipes/createCredentials-to-createSecureContext/tests/expected/file-1.js rename to recipes/createCredentials-to-createSecureContext/tests/expected/file-1.cjs index 059c04bf..5e12a058 100644 --- a/recipes/createCredentials-to-createSecureContext/tests/expected/file-1.js +++ b/recipes/createCredentials-to-createSecureContext/tests/expected/file-1.cjs @@ -4,4 +4,4 @@ const credentials = createSecureContext({ key: privateKey, cert: certificate, ca: [caCertificate] -}); +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/expected/file-4.mjs b/recipes/createCredentials-to-createSecureContext/tests/expected/file-1.mjs similarity index 100% rename from recipes/createCredentials-to-createSecureContext/tests/expected/file-4.mjs rename to recipes/createCredentials-to-createSecureContext/tests/expected/file-1.mjs diff --git a/recipes/createCredentials-to-createSecureContext/tests/expected/file-2.js b/recipes/createCredentials-to-createSecureContext/tests/expected/file-2.cjs similarity index 97% rename from recipes/createCredentials-to-createSecureContext/tests/expected/file-2.js rename to recipes/createCredentials-to-createSecureContext/tests/expected/file-2.cjs index 74454515..3d2fa4dd 100644 --- a/recipes/createCredentials-to-createSecureContext/tests/expected/file-2.js +++ b/recipes/createCredentials-to-createSecureContext/tests/expected/file-2.cjs @@ -3,4 +3,4 @@ const tls = require('node:tls'); const credentials = tls.createSecureContext({ key: fs.readFileSync('server-key.pem'), cert: fs.readFileSync('server-cert.pem') -}); +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/expected/file-2.mjs b/recipes/createCredentials-to-createSecureContext/tests/expected/file-2.mjs new file mode 100644 index 00000000..c7d63dcc --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/expected/file-2.mjs @@ -0,0 +1,6 @@ +import * as tls from 'node:tls'; + +const credentials = tls.createSecureContext({ + key: fs.readFileSync('server-key.pem'), + cert: fs.readFileSync('server-cert.pem') +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/expected/file-3-pair.cjs b/recipes/createCredentials-to-createSecureContext/tests/expected/file-3-pair.cjs new file mode 100644 index 00000000..88385b39 --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/expected/file-3-pair.cjs @@ -0,0 +1,10 @@ +const { createHash } = require('node:crypto'); +const { createSecureContext: customCreateCredentials } = require('node:tls'); + +const credentials = customCreateCredentials({ + key: privateKey, + cert: certificate +}); + +const hash = createHash('sha256'); +hash.update('some data'); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/expected/file-3-pair.mjs b/recipes/createCredentials-to-createSecureContext/tests/expected/file-3-pair.mjs new file mode 100644 index 00000000..4bf1eb7b --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/expected/file-3-pair.mjs @@ -0,0 +1,10 @@ +import { createHash } from 'node:crypto'; +import { createSecureContext as customCreateCredentials } from 'node:tls'; + +const credentials = customCreateCredentials({ + key: privateKey, + cert: certificate +}); + +const hash = createHash('sha256'); +hash.update('some data'); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/expected/file-3.js b/recipes/createCredentials-to-createSecureContext/tests/expected/file-3.cjs similarity index 89% rename from recipes/createCredentials-to-createSecureContext/tests/expected/file-3.js rename to recipes/createCredentials-to-createSecureContext/tests/expected/file-3.cjs index e12b91bb..9b0e83cf 100644 --- a/recipes/createCredentials-to-createSecureContext/tests/expected/file-3.js +++ b/recipes/createCredentials-to-createSecureContext/tests/expected/file-3.cjs @@ -7,4 +7,4 @@ const credentials = createSecureContext({ }); const hash = createHash('sha256'); -hash.update('some data'); +hash.update('some data'); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/expected/file-3.mjs b/recipes/createCredentials-to-createSecureContext/tests/expected/file-3.mjs new file mode 100644 index 00000000..ded95cba --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/expected/file-3.mjs @@ -0,0 +1,10 @@ +import { createHash } from 'node:crypto'; +import { createSecureContext } from 'node:tls'; + +const credentials = createSecureContext({ + key: privateKey, + cert: certificate +}); + +const hash = createHash('sha256'); +hash.update('some data'); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/expected/file-5.cjs b/recipes/createCredentials-to-createSecureContext/tests/expected/file-5.cjs new file mode 100644 index 00000000..0914b681 --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/expected/file-5.cjs @@ -0,0 +1,6 @@ +const tls = require('node:tls'); + +const credentials = tls.createSecureContext({ + key: privateKey, + cert: certificate +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/expected/file-5.mjs b/recipes/createCredentials-to-createSecureContext/tests/expected/file-5.mjs index 92231955..3a89f407 100644 --- a/recipes/createCredentials-to-createSecureContext/tests/expected/file-5.mjs +++ b/recipes/createCredentials-to-createSecureContext/tests/expected/file-5.mjs @@ -3,4 +3,4 @@ import * as tls from 'node:tls'; const credentials = tls.createSecureContext({ key: privateKey, cert: certificate -}); +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/expected/file-6-pair.mjs b/recipes/createCredentials-to-createSecureContext/tests/expected/file-6-pair.mjs new file mode 100644 index 00000000..14b6d68c --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/expected/file-6-pair.mjs @@ -0,0 +1,6 @@ +const { createSecureContext: customCreateCredentials } = await import('node:tls'); + +const credentials = customCreateCredentials({ + key: privateKey, + cert: certificate +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/expected/file-6.mjs b/recipes/createCredentials-to-createSecureContext/tests/expected/file-6.mjs new file mode 100644 index 00000000..76442a1c --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/expected/file-6.mjs @@ -0,0 +1,6 @@ +const { createSecureContext } = await import('node:tls'); + +const credentials = createSecureContext({ + key: privateKey, + cert: certificate +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/input/file-1-pair.cjs b/recipes/createCredentials-to-createSecureContext/tests/input/file-1-pair.cjs new file mode 100644 index 00000000..c28229a4 --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/input/file-1-pair.cjs @@ -0,0 +1,7 @@ +const { createCredentials: customCreateCredentials } = require('node:crypto'); + +const credentials = customCreateCredentials({ + key: privateKey, + cert: certificate, + ca: [caCertificate] +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/input/file-1-pair.mjs b/recipes/createCredentials-to-createSecureContext/tests/input/file-1-pair.mjs new file mode 100644 index 00000000..651ed81f --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/input/file-1-pair.mjs @@ -0,0 +1,7 @@ +import { createCredentials as customCreateCredentials } from 'node:crypto'; + +const credentials = customCreateCredentials({ + key: privateKey, + cert: certificate, + ca: [caCertificate] +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/input/file-1.js b/recipes/createCredentials-to-createSecureContext/tests/input/file-1.cjs similarity index 97% rename from recipes/createCredentials-to-createSecureContext/tests/input/file-1.js rename to recipes/createCredentials-to-createSecureContext/tests/input/file-1.cjs index 217368dc..e4f625f3 100644 --- a/recipes/createCredentials-to-createSecureContext/tests/input/file-1.js +++ b/recipes/createCredentials-to-createSecureContext/tests/input/file-1.cjs @@ -4,4 +4,4 @@ const credentials = createCredentials({ key: privateKey, cert: certificate, ca: [caCertificate] -}); +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/input/file-4.mjs b/recipes/createCredentials-to-createSecureContext/tests/input/file-1.mjs similarity index 100% rename from recipes/createCredentials-to-createSecureContext/tests/input/file-4.mjs rename to recipes/createCredentials-to-createSecureContext/tests/input/file-1.mjs diff --git a/recipes/createCredentials-to-createSecureContext/tests/input/file-2.js b/recipes/createCredentials-to-createSecureContext/tests/input/file-2.cjs similarity index 97% rename from recipes/createCredentials-to-createSecureContext/tests/input/file-2.js rename to recipes/createCredentials-to-createSecureContext/tests/input/file-2.cjs index dcaff4bf..70453796 100644 --- a/recipes/createCredentials-to-createSecureContext/tests/input/file-2.js +++ b/recipes/createCredentials-to-createSecureContext/tests/input/file-2.cjs @@ -3,4 +3,4 @@ const crypto = require('node:crypto'); const credentials = crypto.createCredentials({ key: fs.readFileSync('server-key.pem'), cert: fs.readFileSync('server-cert.pem') -}); +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/input/file-2.mjs b/recipes/createCredentials-to-createSecureContext/tests/input/file-2.mjs new file mode 100644 index 00000000..9e15d052 --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/input/file-2.mjs @@ -0,0 +1,6 @@ +import * as crypto from 'node:crypto'; + +const credentials = crypto.createCredentials({ + key: fs.readFileSync('server-key.pem'), + cert: fs.readFileSync('server-cert.pem') +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/input/file-3-pair.cjs b/recipes/createCredentials-to-createSecureContext/tests/input/file-3-pair.cjs new file mode 100644 index 00000000..059bbbce --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/input/file-3-pair.cjs @@ -0,0 +1,9 @@ +const { createCredentials : customCreateCredentials, createHash } = require('node:crypto'); + +const credentials = customCreateCredentials({ + key: privateKey, + cert: certificate +}); + +const hash = createHash('sha256'); +hash.update('some data'); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/input/file-3-pair.mjs b/recipes/createCredentials-to-createSecureContext/tests/input/file-3-pair.mjs new file mode 100644 index 00000000..5919d2f2 --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/input/file-3-pair.mjs @@ -0,0 +1,9 @@ +import { createCredentials as customCreateCredentials, createHash } from 'node:crypto'; + +const credentials = customCreateCredentials({ + key: privateKey, + cert: certificate +}); + +const hash = createHash('sha256'); +hash.update('some data'); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/input/file-3.js b/recipes/createCredentials-to-createSecureContext/tests/input/file-3.cjs similarity index 87% rename from recipes/createCredentials-to-createSecureContext/tests/input/file-3.js rename to recipes/createCredentials-to-createSecureContext/tests/input/file-3.cjs index 4077b761..2deb8583 100644 --- a/recipes/createCredentials-to-createSecureContext/tests/input/file-3.js +++ b/recipes/createCredentials-to-createSecureContext/tests/input/file-3.cjs @@ -6,4 +6,4 @@ const credentials = createCredentials({ }); const hash = createHash('sha256'); -hash.update('some data'); +hash.update('some data'); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/input/file-3.mjs b/recipes/createCredentials-to-createSecureContext/tests/input/file-3.mjs new file mode 100644 index 00000000..c2b34328 --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/input/file-3.mjs @@ -0,0 +1,9 @@ +import { createCredentials, createHash } from 'node:crypto'; + +const credentials = createCredentials({ + key: privateKey, + cert: certificate +}); + +const hash = createHash('sha256'); +hash.update('some data'); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/input/file-5.cjs b/recipes/createCredentials-to-createSecureContext/tests/input/file-5.cjs new file mode 100644 index 00000000..d8d42793 --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/input/file-5.cjs @@ -0,0 +1,6 @@ +const crypto = require('node:crypto'); + +const credentials = crypto.createCredentials({ + key: privateKey, + cert: certificate +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/input/file-5.mjs b/recipes/createCredentials-to-createSecureContext/tests/input/file-5.mjs index 2f064efc..5e7a5a97 100644 --- a/recipes/createCredentials-to-createSecureContext/tests/input/file-5.mjs +++ b/recipes/createCredentials-to-createSecureContext/tests/input/file-5.mjs @@ -3,4 +3,4 @@ import * as crypto from 'node:crypto'; const credentials = crypto.createCredentials({ key: privateKey, cert: certificate -}); +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/input/file-6-pair.mjs b/recipes/createCredentials-to-createSecureContext/tests/input/file-6-pair.mjs new file mode 100644 index 00000000..68e03ca7 --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/input/file-6-pair.mjs @@ -0,0 +1,6 @@ +const { createCredentials: customCreateCredentials } = await import('node:crypto'); + +const credentials = customCreateCredentials({ + key: privateKey, + cert: certificate +}); \ No newline at end of file diff --git a/recipes/createCredentials-to-createSecureContext/tests/input/file-6.mjs b/recipes/createCredentials-to-createSecureContext/tests/input/file-6.mjs new file mode 100644 index 00000000..209a4c5e --- /dev/null +++ b/recipes/createCredentials-to-createSecureContext/tests/input/file-6.mjs @@ -0,0 +1,6 @@ +const { createCredentials } = await import('node:crypto'); + +const credentials = createCredentials({ + key: privateKey, + cert: certificate +}); \ No newline at end of file From d057380923d304374ccecb1376cbfd3a390df4ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Thu, 14 Aug 2025 22:40:08 +0530 Subject: [PATCH 28/43] remove --- .../src/workflow.ts | 35 ------------------- 1 file changed, 35 deletions(-) diff --git a/recipes/createCredentials-to-createSecureContext/src/workflow.ts b/recipes/createCredentials-to-createSecureContext/src/workflow.ts index df1ed582..e59da95a 100644 --- a/recipes/createCredentials-to-createSecureContext/src/workflow.ts +++ b/recipes/createCredentials-to-createSecureContext/src/workflow.ts @@ -336,41 +336,6 @@ function handleDynamicImport( const idNode = statement.child(0); const declaration = statement.parent(); - // Detects: const x = (await import(...)).then(...) - if (valueNode?.kind() === 'call_expression' && idNode?.kind() === 'identifier') { - const functionNode = valueNode.field('function'); - const isThenCall = functionNode?.kind() === 'member_expression' && functionNode.field('property')?.text() === 'then'; - const awaitNode = functionNode?.field('object')?.find({ rule: { kind: 'await_expression' } }); - - const importModuleStringNode = awaitNode?.find({ - rule: { - kind: 'string', - has: { kind: 'string_fragment', regex: `^${oldImportModule}$` } - } - }); - - if (isThenCall && importModuleStringNode) { - const allEdits: Edit[] = []; - - const usageEdits = findAndReplaceUsages(rootNode, idNode.text(), newImportFunction); - - allEdits.push(...usageEdits); - allEdits.push(idNode.replace(newImportFunction)); - allEdits.push(importModuleStringNode.replace(`'${newImportModule}'`)); - - const thenCallback = valueNode.field('arguments')?.child(0); - const callbackBody = thenCallback?.field('body'); - if (callbackBody?.kind() === 'member_expression') { - const propertyNode = callbackBody.field('property'); - if (propertyNode?.text() === oldFunctionName) { - allEdits.push(propertyNode.replace(newImportFunction)); - } - } - - return allEdits; - } - } - if (valueNode?.kind() === 'await_expression') { if (!declaration) { return []; From f721b0005a63308e853000f04aa70d79a9193385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Fri, 15 Aug 2025 00:02:01 +0530 Subject: [PATCH 29/43] resize --- .../src/workflow.ts | 756 ++++++++---------- 1 file changed, 331 insertions(+), 425 deletions(-) diff --git a/recipes/createCredentials-to-createSecureContext/src/workflow.ts b/recipes/createCredentials-to-createSecureContext/src/workflow.ts index e59da95a..85e41766 100644 --- a/recipes/createCredentials-to-createSecureContext/src/workflow.ts +++ b/recipes/createCredentials-to-createSecureContext/src/workflow.ts @@ -10,457 +10,363 @@ const oldImportModule = 'node:crypto' const newNamespace = 'tls'; function handleNamespaceImport( - rootNode: SgRoot, - localNamespace: string, - declaration: SgNode>, - importType: 'require' | 'static' | 'dynamic-await' + rootNode: SgRoot, + localNamespace: string, + declaration: SgNode>, + importType: 'require' | 'static' | 'dynamic-await' ): Edit[] { - const allEdits: Edit[] = []; - - const usages = rootNode.root().findAll({ - rule: { - kind: 'call_expression', - has: { - field: 'function', - kind: 'member_expression', - all: [ - { has: { field: 'object', regex: `^${localNamespace}$` } }, - { has: { field: 'property', regex: `^${oldFunctionName}$` } } - ] - } - } - }); - - if (usages.length === 0) { - return []; - } - - for (const usage of usages) { - const func = usage.field('function'); - if (func) { - allEdits.push(func.replace(`${newNamespace}.${newImportFunction}`)); - } - } - - let newImportStatement = ''; - switch (importType) { - case 'require': - newImportStatement = `const ${newNamespace} = require('${newImportModule}');`; - break; - case 'static': - newImportStatement = `import * as ${newNamespace} from '${newImportModule}';`; - break; - case 'dynamic-await': - newImportStatement = `const ${newNamespace} = await import('${newImportModule}');`; - break; - } - - allEdits.push(declaration.replace(newImportStatement)); - - return allEdits; + const newNamespace = 'tls'; + + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: { + field: 'function', + kind: 'member_expression', + all: [ + { has: { field: 'object', regex: `^${localNamespace}$` } }, + { has: { field: 'property', regex: `^${oldFunctionName}$` } } + ] + } + } + }); + + if (usages.length === 0) { + return []; + } + + const usageEdits = usages + .map(usage => usage.field('function')) + .filter((func): func is SgNode> => Boolean(func)) + .map(func => func.replace(`${newNamespace}.${newImportFunction}`)); + + switch (importType) { + case 'require': + return [...usageEdits, declaration.replace(`const ${newNamespace} = require('${newImportModule}');`)]; + case 'static': + return [...usageEdits, declaration.replace(`import * as ${newNamespace} from '${newImportModule}';`)]; + case 'dynamic-await': + return [...usageEdits, declaration.replace(`const ${newNamespace} = await import('${newImportModule}');`)]; + } } function handleDestructuredImport( - rootNode: SgRoot, - idNode: SgNode>, - declaration: SgNode>, - importType: 'require' | 'static' | 'dynamic-await' + rootNode: SgRoot, + idNode: SgNode>, + declaration: SgNode>, + importType: 'require' | 'static' | 'dynamic-await' ): Edit[] { - let localFunctionName: string | null = null; - let targetSpecifierNode: SgNode | null = null; - let isAliased = false; - - const relevantSpecifiers = idNode.children().filter( - child => ['pair_pattern', 'shorthand_property_identifier_pattern', 'import_specifier'].includes(child.kind() as string) - ); - - for (const spec of relevantSpecifiers) { - let keyNode: SgNode> | null = null; + let localFunctionName: string | null = null; + let targetSpecifierNode: SgNode | null = null; + let isAliased = false; + + const relevantSpecifiers = idNode.children().filter( + child => child.kind() === 'pair_pattern' + || child.kind() === 'shorthand_property_identifier_pattern' + || child.kind() === 'import_specifier' + ); + + for (const spec of relevantSpecifiers) { + let keyNode: SgNode> | null = null; let aliasNode: SgNode> | null = null; - if (spec.kind() === 'import_specifier') { - keyNode = spec.field('name'); - aliasNode = spec.field('alias'); - } else if (spec.kind() === 'pair_pattern') { - keyNode = spec.field('key'); - aliasNode = spec.field('value'); - } else { - keyNode = spec; - } - - if (keyNode?.text() === oldFunctionName) { - targetSpecifierNode = spec; - isAliased = Boolean(aliasNode); - localFunctionName = isAliased ? aliasNode!.text() : keyNode!.text(); - break; - } - } - - if (localFunctionName && targetSpecifierNode) { - const allEdits: Edit[] = []; - - if (!isAliased) { - const usageEdits = findAndReplaceUsages(rootNode, localFunctionName, newImportFunction); - allEdits.push(...usageEdits); - } - - const aliasSeparator = importType === 'static' ? ' as' : ':'; - const newImportSpecifier = isAliased - ? `{ ${newImportFunction}${aliasSeparator} ${localFunctionName} }` - : `{ ${newImportFunction} }`; - - let newImportStatement = ''; - switch (importType) { - case 'require': - newImportStatement = `const ${newImportSpecifier} = require('${newImportModule}');`; - break; - case 'static': - newImportStatement = `import ${newImportSpecifier} from '${newImportModule}';`; - break; - case 'dynamic-await': - newImportStatement = `const ${newImportSpecifier} = await import('${newImportModule}');`; - break; - } - - const otherSpecifiers = relevantSpecifiers.filter(s => s !== targetSpecifierNode); - if (otherSpecifiers.length > 0) { - const otherSpecifiersText = otherSpecifiers.map(s => s.text()).join(', '); - let modifiedOldImport = ''; - switch (importType) { - case 'require': - modifiedOldImport = `const { ${otherSpecifiersText} } = require('${oldImportModule}');`; - break; - case 'static': - modifiedOldImport = `import { ${otherSpecifiersText} } from '${oldImportModule}';`; - break; - case 'dynamic-await': - modifiedOldImport = `const { ${otherSpecifiersText} } = await import('${oldImportModule}');`; - break; - } - const replacementText = `${modifiedOldImport}${EOL}${newImportStatement}`; - allEdits.push(declaration.replace(replacementText)); - } else { - allEdits.push(declaration.replace(newImportStatement)); - } - - return allEdits; - } - - return []; + if (spec.kind() === 'import_specifier') { + keyNode = spec.field('name'); + aliasNode = spec.field('alias'); + } else if (spec.kind() === 'pair_pattern') { + keyNode = spec.field('key'); + aliasNode = spec.field('value'); + } else { + keyNode = spec; + } + + if (keyNode?.text() === oldFunctionName) { + targetSpecifierNode = spec; + isAliased = Boolean(aliasNode); + localFunctionName = isAliased ? aliasNode!.text() : keyNode!.text(); + break; + } + } + + if (localFunctionName && targetSpecifierNode) { + const allEdits: Edit[] = []; + + if (!isAliased) { + allEdits.push(...findAndReplaceUsages(rootNode, localFunctionName, newImportFunction)); + } + + const aliasSeparator = importType === 'static' ? ' as' : ':'; + const newImportSpecifier = isAliased + ? `{ ${newImportFunction}${aliasSeparator} ${localFunctionName} }` + : `{ ${newImportFunction} }`; + + let newImportStatement = ''; + switch (importType) { + case 'require': + newImportStatement = `const ${newImportSpecifier} = require('${newImportModule}');`; + break; + case 'static': + newImportStatement = `import ${newImportSpecifier} from '${newImportModule}';`; + break; + case 'dynamic-await': + newImportStatement = `const ${newImportSpecifier} = await import('${newImportModule}');`; + break; + } + + const otherSpecifiers = relevantSpecifiers.filter(s => s !== targetSpecifierNode); + if (otherSpecifiers.length > 0) { + let modifiedOldImport = ''; + const otherSpecifiersText = otherSpecifiers.map(s => s.text()).join(', '); + switch (importType) { + case 'require': + modifiedOldImport = `const { ${otherSpecifiersText} } = require('${oldImportModule}');`; + break; + case 'static': + modifiedOldImport = `import { ${otherSpecifiersText} } from '${oldImportModule}';`; + break; + case 'dynamic-await': + modifiedOldImport = `const { ${otherSpecifiersText} } = await import('${oldImportModule}');`; + break; + } + allEdits.push(declaration.replace(`${modifiedOldImport}${EOL}${newImportStatement}`)); + } else { + allEdits.push(declaration.replace(newImportStatement)); + } + + return allEdits; + } + + return []; } - function findAndReplaceUsages( - rootNode: SgRoot, - localFunctionName: string, - newFunctionName: string, - object: string | null = null + rootNode: SgRoot, + localFunctionName: string, + newFunctionName: string, + object: string | null = null ): Edit[] { - const edits: Edit[] = []; - - if (object) { - const usages = rootNode.root().findAll({ - rule: { - kind: 'call_expression', - has: { - field: 'function', - kind: 'member_expression', - all: [ - { has: { field: 'object', regex: `^${object}$` } }, - { has: { field: 'property', regex: `^${localFunctionName}$` } } - ] - } - } - }); - - for (const usage of usages) { - const memberExpressionNode = usage.field('function'); - const propertyNode = memberExpressionNode?.field('property'); - if (propertyNode) { - edits.push(propertyNode.replace(newFunctionName)); - } - } - } else { - const usages = rootNode.root().findAll({ - rule: { - kind: 'call_expression', - has: { field: 'function', kind: 'identifier', regex: `^${localFunctionName}$` }, - }, - }); - - for (const usage of usages) { - const functionNode = usage.field('function'); - if (functionNode) { - edits.push(functionNode.replace(newFunctionName)); - } - } - } - return edits; + const functionRule = object + ? { + field: 'function', + kind: 'member_expression', + all: [ + { has: { field: 'object', regex: `^${object}$` } }, + { has: { field: 'property', regex: `^${localFunctionName}$` } } + ] + } + : { + field: 'function', + kind: 'identifier', + regex: `^${localFunctionName}$` + }; + + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: functionRule + } + }); + + return usages + .map(usage => { + const functionNode = usage.field('function'); + if (!functionNode) return null; + + const nodeToReplace = object ? functionNode.field('property') : functionNode; + return nodeToReplace ? nodeToReplace.replace(newFunctionName) : null; + }) + .filter((edit): edit is Edit => Boolean(edit)); } function handleRequire( - statement: SgNode>, - rootNode: SgRoot, + statement: SgNode>, + rootNode: SgRoot, ): Edit[] { - const idNode = statement.child(0); - const declaration = statement.parent(); - - if (!idNode || !declaration) { - return []; - } + const idNode = statement.child(0); + const declaration = statement.parent(); + if (!idNode || !declaration) return []; - // Handle Namespace Imports: const crypto = require('...') - if (idNode.kind() === 'identifier') { - const localNamespace = idNode.text(); - return handleNamespaceImport(rootNode, localNamespace, declaration, 'require'); - } + if (idNode.kind() === 'identifier') + return handleNamespaceImport(rootNode, idNode.text(), declaration, 'require'); - // Handle Destructured Imports: const { ... } = require('...') - if (idNode.kind() === 'object_pattern') { - return handleDestructuredImport(rootNode, idNode, declaration, 'require'); - } + if (idNode.kind() === 'object_pattern') + return handleDestructuredImport(rootNode, idNode, declaration, 'require'); - return []; + return []; } function handleStaticImport( - statement: SgNode>, - rootNode: SgRoot, + statement: SgNode>, + rootNode: SgRoot ): Edit[] { - - const importClause = statement.child(1); - if (importClause?.kind() !== 'import_clause') { - return []; - } - // Detects: import * as crypto from '...' - const clauseContent = importClause.child(0); - if (!clauseContent) { - return []; - } - - // Handle Namespace Imports: import * as crypto from '...' - if (clauseContent.kind() === 'namespace_import') { - const localNamespace = clauseContent.find({ rule: { kind: 'identifier' } })?.text(); - const allEdits: Edit[] = []; - - const usages = rootNode.root().findAll({ - rule: { - kind: 'call_expression', - has: { - field: 'function', - kind: 'member_expression', - all: [ - { has: { field: 'object', regex: `^${localNamespace}$` } }, - { has: { field: 'property', regex: `^${oldFunctionName}$` } } - ] - } - } - }); - - if (usages.length > 0) { - - for (const usage of usages) { - const func = usage.field('function'); - if (func) { - allEdits.push(func.replace(`${newNamespace}.${newImportFunction}`)); - } - } - - const newImportStatement = `import * as ${newNamespace} from '${newImportModule}';`; - allEdits.push(statement.replace(newImportStatement)); - - return allEdits; - } - } - - // Handle Named Imports: import { ... } from '...' - if (clauseContent.kind() === 'named_imports') { - const namedImportsNode = clauseContent; - let localFunctionName: string | null = null; - let targetSpecifierNode: SgNode | null = null; - let isAliased = false; - - const relevantSpecifiers = namedImportsNode.children().filter( - child => child.kind() === 'import_specifier' - ); - - for (const spec of relevantSpecifiers) { - const nameNode = spec.field('name'); - const aliasNode = spec.field('alias'); - - - if (nameNode?.text() === oldFunctionName) { - targetSpecifierNode = spec; - isAliased = Boolean(aliasNode); - localFunctionName = isAliased ? aliasNode!.text() : nameNode!.text(); - break; - } - } - - if (localFunctionName && targetSpecifierNode) { - const allEdits: Edit[] = []; - const declaration = statement; - - if (!isAliased) { - const usageEdits = findAndReplaceUsages(rootNode, localFunctionName, newImportFunction); - allEdits.push(...usageEdits); - } else { - } - - const newImportSpecifier = isAliased - ? `{ ${newImportFunction} as ${localFunctionName} }` - : `{ ${newImportFunction} }`; - const newImportStatement = `import ${newImportSpecifier} from '${newImportModule}';`; - - const otherSpecifiers = relevantSpecifiers.filter(s => s !== targetSpecifierNode); - if (otherSpecifiers.length > 0) { - const modifiedOldImport = `import { ${otherSpecifiers.map(s => s.text()).join(', ')} } from '${oldImportModule}';`; - const replacementText = `${modifiedOldImport}${EOL}${newImportStatement}`; - allEdits.push(declaration.replace(replacementText)); - } else { - allEdits.push(declaration.replace(newImportStatement)); - } - - return allEdits; - } - } - - return []; + const importClause = statement.child(1); + if (importClause?.kind() !== 'import_clause') return []; + + const content = importClause.child(0); + if (!content) return []; + + // Namespace imports: import * as ns from '...' + if (content.kind() === 'namespace_import') { + const ns = content.find({ rule: { kind: 'identifier' } })?.text(); + if (!ns) return []; + + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: { + field: 'function', + kind: 'member_expression', + all: [ + { has: { field: 'object', regex: `^${ns}$` } }, + { has: { field: 'property', regex: `^${oldFunctionName}$` } } + ] + } + } + }); + if (!usages.length) return []; + + const edits = usages + .map(u => u.field('function')?.replace(`${newNamespace}.${newImportFunction}`)) + .filter(Boolean); + edits.push(statement.replace(`import * as ${newNamespace} from '${newImportModule}';`)); + return edits as Edit[]; + } + + // Named imports: import { x } from '...' + if (content.kind() === 'named_imports') { + const specs = content.children().filter(c => c.kind() === 'import_specifier'); + const target = specs.find(s => s.field('name')?.text() === oldFunctionName); + if (!target) return []; + + const aliasNode = target.field('alias'); + const localName = aliasNode?.text() || target.field('name')?.text() || ""; + const edits = aliasNode ? [] : findAndReplaceUsages(rootNode, localName, newImportFunction); + + const newSpec = aliasNode ? `{ ${newImportFunction} as ${localName} }` : `{ ${newImportFunction} }`; + const newStmt = `import ${newSpec} from '${newImportModule}';`; + const others = specs.filter(s => s !== target); + + return [ + ...edits, + others.length + ? statement.replace( + `import { ${others.map(s => s.text()).join(', ')} } from '${oldImportModule}';${EOL}${newStmt}` + ) + : statement.replace(newStmt) + ]; + } + + return []; } + function handleDynamicImport( - statement: SgNode>, - rootNode: SgRoot, + statement: SgNode>, + rootNode: SgRoot, ): Edit[] { - - const valueNode = statement.field('value'); - const idNode = statement.child(0); - const declaration = statement.parent(); - - if (valueNode?.kind() === 'await_expression') { - if (!declaration) { - return []; - } - - // Detects: const crypto = await import(...) - if (idNode?.kind() === 'identifier') { - const localNamespace = idNode.text(); - const allEdits: Edit[] = []; - - const usages = rootNode.root().findAll({ - rule: { - kind: 'call_expression', - has: { - field: 'function', - kind: 'member_expression', - all: [ - { has: { field: 'object', regex: `^${localNamespace}$` } }, - { has: { field: 'property', regex: `^${oldFunctionName}$` } } - ] - } - } - }); - - if (usages.length > 0) { - for (const usage of usages) { - const func = usage.field('function'); - if (func) { - allEdits.push(func.replace(`${newNamespace}.${newImportFunction}`)); - } - } - - const newImportStatement = `const ${newNamespace} = await import('${newImportModule}');`; - allEdits.push(declaration.replace(newImportStatement)); - - return allEdits; - } - } - - // Detects: const { ... } = await import(...) - if (idNode?.kind() === 'object_pattern') { - let localFunctionName: string | null = null; - let targetSpecifierNode: SgNode | null = null; - let isAliased = false; - - const relevantSpecifiers = idNode.children().filter( - child => child.kind() === 'pair_pattern' || child.kind() === 'shorthand_property_identifier_pattern' - ); - - for (const spec of relevantSpecifiers) { - const key = spec.kind() === 'pair_pattern' ? spec.field('key') : spec; - if (key?.text() === oldFunctionName) { - targetSpecifierNode = spec; - isAliased = spec.kind() === 'pair_pattern'; - localFunctionName = isAliased ? spec.field('value')!.text() : key.text(); - break; - } - } - - if (localFunctionName && targetSpecifierNode) { - const allEdits: Edit[] = []; - - if (!isAliased) { - const usageEdits = findAndReplaceUsages(rootNode, localFunctionName, newImportFunction); - allEdits.push(...usageEdits); - } else { - } - - const newImportSpecifier = isAliased - ? `{ ${newImportFunction}: ${localFunctionName} }` - : `{ ${newImportFunction} }`; - const newImportStatement = `const ${newImportSpecifier} = await import('${newImportModule}');`; - - const otherSpecifiers = relevantSpecifiers.filter(s => s !== targetSpecifierNode); - if (otherSpecifiers.length > 0) { - const modifiedOldImport = `const { ${otherSpecifiers.map(s => s.text()).join(', ')} } = await import('${oldImportModule}');`; - const replacementText = `${modifiedOldImport}${EOL}${newImportStatement}`; - allEdits.push(declaration.replace(replacementText)); - } else { - allEdits.push(declaration.replace(newImportStatement)); - } - - return allEdits; - } - } - } - - return []; + const valueNode = statement.field('value'); + const idNode = statement.child(0); + const declaration = statement.parent(); + + // must be `const ... = await import(...)` and have a parent declaration + if (valueNode?.kind() !== 'await_expression' || !declaration) return []; + + // Case 1: `const ns = await import(...)` + if (idNode?.kind() === 'identifier') { + const localNamespace = idNode.text(); + if (!localNamespace) return []; + + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: { + field: 'function', + kind: 'member_expression', + all: [ + { has: { field: 'object', regex: `^${localNamespace}$` } }, + { has: { field: 'property', regex: `^${oldFunctionName}$` } } + ] + } + } + }); + + if (!usages.length) return []; + + const edits = usages + .map(u => u.field('function')?.replace(`${newNamespace}.${newImportFunction}`)) + .filter(Boolean) as Edit[]; + + edits.push(declaration.replace(`const ${newNamespace} = await import('${newImportModule}');`)); + return edits; + } + + // Case 2: `const { ... } = await import(...)` + if (idNode?.kind() === 'object_pattern') { + const specifiers = idNode.children().filter( + c => c.kind() === 'pair_pattern' || c.kind() === 'shorthand_property_identifier_pattern' + ); + + let targetSpecifier: SgNode | null = null; + let localFunctionName: string | null | undefined = null; + let isAliased = false; + + for (const spec of specifiers) { + const keyNode = spec.kind() === 'pair_pattern' ? spec.field('key') : spec; + if (keyNode?.text() === oldFunctionName) { + targetSpecifier = spec; + isAliased = spec.kind() === 'pair_pattern'; + localFunctionName = isAliased ? spec.field('value')?.text() : keyNode.text(); + break; + } + } + + if (!localFunctionName || !targetSpecifier) return []; + + const edits: Edit[] = []; + if (!isAliased) edits.push(...findAndReplaceUsages(rootNode, localFunctionName, newImportFunction)); + + const newImportSpecifier = isAliased + ? `{ ${newImportFunction}: ${localFunctionName} }` + : `{ ${newImportFunction} }`; + + const newImportStmt = `const ${newImportSpecifier} = await import('${newImportModule}');`; + + const otherSpecifiers = specifiers.filter(s => s !== targetSpecifier); + if (otherSpecifiers.length) { + const remaining = `const { ${otherSpecifiers.map(s => s.text()).join(', ')} } = await import('${oldImportModule}');`; + edits.push(declaration.replace(`${remaining}${EOL}${newImportStmt}`)); + } else { + edits.push(declaration.replace(newImportStmt)); + } + + return edits; + } + + return []; } export default function transform(root: SgRoot): string | null { - const rootNode = root.root(); - const allEdits: Edit[] = []; - let wasTransformed = false; - - // @ts-ignore - const requireImports = getNodeRequireCalls(root, 'crypto'); - // @ts-ignore - const staticImports = getNodeImportStatements(root, 'crypto'); - // @ts-ignore - const dynamicImports = getNodeImportCalls(root, 'crypto'); - - for (const requireCall of requireImports) { - const edits = handleRequire(requireCall, root); - if (edits.length > 0) { - wasTransformed = true; - allEdits.push(...edits); - } - } - - for (const staticImport of staticImports) { - const edits = handleStaticImport(staticImport, root); - if (edits.length > 0) { - wasTransformed = true; - allEdits.push(...edits); - } - } - - for (const dynamicImport of dynamicImports) { - const edits = handleDynamicImport(dynamicImport, root); - if (edits.length > 0) { - wasTransformed = true; - allEdits.push(...edits); - } - } - - return wasTransformed ? rootNode.commitEdits(allEdits) : null; + const rootNode = root.root(); + const allEdits: Edit[] = []; + let wasTransformed = false; + + const sources: [SgNode[] | undefined, (n: SgNode, r: SgRoot) => Edit[]][] = [ + // @ts-ignore + [getNodeRequireCalls(root, 'crypto'), handleRequire], + // @ts-ignore + [getNodeImportStatements(root, 'crypto'), handleStaticImport], + // @ts-ignore + [getNodeImportCalls(root, 'crypto'), handleDynamicImport], + ]; + + for (const [nodes, handler] of sources) { + for (const node of nodes || []) { + const edits = handler(node, root); + if (edits.length) { + wasTransformed = true; + allEdits.push(...edits); + } + } + } + + return wasTransformed ? rootNode.commitEdits(allEdits) : null; } From adc08e3239ebc462bdfda386a56b723db45934be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Fri, 15 Aug 2025 08:05:00 +0530 Subject: [PATCH 30/43] remove line not needed --- .../src/workflow.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/recipes/createCredentials-to-createSecureContext/src/workflow.ts b/recipes/createCredentials-to-createSecureContext/src/workflow.ts index 85e41766..1f9ff16d 100644 --- a/recipes/createCredentials-to-createSecureContext/src/workflow.ts +++ b/recipes/createCredentials-to-createSecureContext/src/workflow.ts @@ -15,8 +15,6 @@ function handleNamespaceImport( declaration: SgNode>, importType: 'require' | 'static' | 'dynamic-await' ): Edit[] { - const newNamespace = 'tls'; - const usages = rootNode.root().findAll({ rule: { kind: 'call_expression', @@ -61,8 +59,8 @@ function handleDestructuredImport( let isAliased = false; const relevantSpecifiers = idNode.children().filter( - child => child.kind() === 'pair_pattern' - || child.kind() === 'shorthand_property_identifier_pattern' + child => child.kind() === 'pair_pattern' + || child.kind() === 'shorthand_property_identifier_pattern' || child.kind() === 'import_specifier' ); From 7dbb6b25f57fb0e754dee9a3b335df2cb40ee1fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= <109351887+0hmX@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:16:57 +0530 Subject: [PATCH 31/43] Update recipes/createCredentials-to-createSecureContext/src/workflow.ts Co-authored-by: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> --- .../createCredentials-to-createSecureContext/src/workflow.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/recipes/createCredentials-to-createSecureContext/src/workflow.ts b/recipes/createCredentials-to-createSecureContext/src/workflow.ts index 1f9ff16d..5e00dd4b 100644 --- a/recipes/createCredentials-to-createSecureContext/src/workflow.ts +++ b/recipes/createCredentials-to-createSecureContext/src/workflow.ts @@ -29,9 +29,7 @@ function handleNamespaceImport( } }); - if (usages.length === 0) { - return []; - } + if (usages.length === 0) return []; const usageEdits = usages .map(usage => usage.field('function')) From c3fc053134044592b898d24895ca882d68cb809a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Fri, 15 Aug 2025 12:20:10 +0530 Subject: [PATCH 32/43] remove wasTranformed var --- .../src/workflow.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/recipes/createCredentials-to-createSecureContext/src/workflow.ts b/recipes/createCredentials-to-createSecureContext/src/workflow.ts index 5e00dd4b..be93b211 100644 --- a/recipes/createCredentials-to-createSecureContext/src/workflow.ts +++ b/recipes/createCredentials-to-createSecureContext/src/workflow.ts @@ -343,8 +343,6 @@ function handleDynamicImport( export default function transform(root: SgRoot): string | null { const rootNode = root.root(); const allEdits: Edit[] = []; - let wasTransformed = false; - const sources: [SgNode[] | undefined, (n: SgNode, r: SgRoot) => Edit[]][] = [ // @ts-ignore [getNodeRequireCalls(root, 'crypto'), handleRequire], @@ -358,11 +356,12 @@ export default function transform(root: SgRoot): string | null { for (const node of nodes || []) { const edits = handler(node, root); if (edits.length) { - wasTransformed = true; allEdits.push(...edits); } } } - return wasTransformed ? rootNode.commitEdits(allEdits) : null; + if (!allEdits.length) return null; + + return rootNode.commitEdits(allEdits); } From 44015c185329ec8fc89e031067428a4ead7921dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0hm=E2=98=98=EF=B8=8F?= Date: Fri, 15 Aug 2025 12:28:39 +0530 Subject: [PATCH 33/43] update package-lock.json --- package-lock.json | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 071e51d7..791afb9a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1420,8 +1420,8 @@ "resolved": "recipes/create-require-from-path", "link": true }, - "node_modules/@nodejs/crypto-create-credentials": { - "resolved": "recipes/crypto-create-credentials", + "node_modules/@nodejs/createCredentials-to-createSecureContext": { + "resolved": "recipes/createCredentials-to-createSecureContext", "link": true }, "node_modules/@nodejs/import-assertions-to-attributes": { @@ -4069,9 +4069,21 @@ "@types/node": "^24.0.3" } }, + "recipes/createCredentials-to-createSecureContext": { + "name": "@nodejs/createCredentials-to-createSecureContext", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@nodejs/codemod-utils": "*" + }, + "devDependencies": { + "@codemod.com/jssg-types": "^1.0.3" + } + }, "recipes/crypto-create-credentials": { "name": "@nodejs/crypto-create-credentials", "version": "1.0.0", + "extraneous": true, "license": "MIT", "dependencies": { "@nodejs/codemod-utils": "*" From 46a7069a45d2aa2b2db2a96715b291af4fbcc27f Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sun, 2 Nov 2025 10:35:02 +0100 Subject: [PATCH 34/43] update --- package-lock.json | 27 +++++-- .../package.json | 6 +- .../src/workflow.ts | 78 ++++++++++--------- .../tsconfig.json | 23 ------ 4 files changed, 66 insertions(+), 68 deletions(-) delete mode 100644 recipes/createCredentials-to-createSecureContext/tsconfig.json diff --git a/package-lock.json b/package-lock.json index 791afb9a..13ac8f33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -370,6 +370,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -1041,9 +1042,9 @@ } }, "node_modules/@codemod.com/jssg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@codemod.com/jssg-types/-/jssg-types-1.0.3.tgz", - "integrity": "sha512-spr0WkE2cRliMiz1pDO5xWaCWH6dZuq1QRqbnVSPj6gqKN/26LY7Sk5k/Xm5hJEZaOgy8GqEpX4BPUeOOqVlEw==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@codemod.com/jssg-types/-/jssg-types-1.0.9.tgz", + "integrity": "sha512-j+O2nvYnBcmBy0mG5bSmBD7Cn7q3fgp4tI6aqIuF7pVu7j8Dgs45Ohgkpzx9mwqcmAE7vC9CEc8zQZOfwfICyw==", "dev": true, "license": "Apache-2.0" }, @@ -1420,8 +1421,8 @@ "resolved": "recipes/create-require-from-path", "link": true }, - "node_modules/@nodejs/createCredentials-to-createSecureContext": { - "resolved": "recipes/createCredentials-to-createSecureContext", + "node_modules/@nodejs/createcredentials-to-createsecurecontext": { + "resolved": "recipes/createcredentials-to-createsecurecontext", "link": true }, "node_modules/@nodejs/import-assertions-to-attributes": { @@ -1446,6 +1447,7 @@ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", @@ -1835,6 +1837,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", @@ -4069,9 +4072,21 @@ "@types/node": "^24.0.3" } }, + "recipes/createcredentials-to-createsecurecontext": { + "name": "@nodejs/createcredentials-to-createsecurecontext", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@nodejs/codemod-utils": "*" + }, + "devDependencies": { + "@codemod.com/jssg-types": "^1.0.9" + } + }, "recipes/createCredentials-to-createSecureContext": { - "name": "@nodejs/createCredentials-to-createSecureContext", + "name": "@nodejs/createcredentials-to-createsecurecontext", "version": "1.0.0", + "extraneous": true, "license": "MIT", "dependencies": { "@nodejs/codemod-utils": "*" diff --git a/recipes/createCredentials-to-createSecureContext/package.json b/recipes/createCredentials-to-createSecureContext/package.json index f416677f..e488cf9c 100644 --- a/recipes/createCredentials-to-createSecureContext/package.json +++ b/recipes/createCredentials-to-createSecureContext/package.json @@ -1,10 +1,10 @@ { - "name": "@nodejs/createCredentials-to-createSecureContext", + "name": "@nodejs/createcredentials-to-createsecurecontext", "version": "1.0.0", "description": "Handle DEP0010 via transforming `crypto.createCredentials` to `tls.createSecureContext` with the appropriate options.", "type": "module", "scripts": { - "test": "npx codemod@next jssg test -l typescript ./src/workflow.ts ./" + "test": "npx codemod jssg test -l typescript ./src/workflow.ts ./" }, "repository": { "type": "git", @@ -16,7 +16,7 @@ "license": "MIT", "homepage": "https://github.com/nodejs/userland-migrations/blob/main/recipes/crypto-create-credentials/README.md", "devDependencies": { - "@codemod.com/jssg-types": "^1.0.3" + "@codemod.com/jssg-types": "^1.0.9" }, "dependencies": { "@nodejs/codemod-utils": "*" diff --git a/recipes/createCredentials-to-createSecureContext/src/workflow.ts b/recipes/createCredentials-to-createSecureContext/src/workflow.ts index be93b211..a3051d38 100644 --- a/recipes/createCredentials-to-createSecureContext/src/workflow.ts +++ b/recipes/createCredentials-to-createSecureContext/src/workflow.ts @@ -1,7 +1,8 @@ import { EOL } from 'node:os'; -import type { SgRoot, Edit, SgNode, Kinds, TypesMap } from "@codemod.com/jssg-types/main"; import { getNodeRequireCalls } from "@nodejs/codemod-utils/ast-grep/require-call"; import { getNodeImportCalls, getNodeImportStatements } from "@nodejs/codemod-utils/ast-grep/import-statement"; +import type { SgRoot, Edit, SgNode} from "@codemod.com/jssg-types/main"; +import type Js from "@codemod.com/jssg-types/langs/javascript"; const newImportFunction = 'createSecureContext' const newImportModule = 'node:tls' @@ -10,9 +11,9 @@ const oldImportModule = 'node:crypto' const newNamespace = 'tls'; function handleNamespaceImport( - rootNode: SgRoot, + rootNode: SgRoot, localNamespace: string, - declaration: SgNode>, + declaration: SgNode, importType: 'require' | 'static' | 'dynamic-await' ): Edit[] { const usages = rootNode.root().findAll({ @@ -33,7 +34,7 @@ function handleNamespaceImport( const usageEdits = usages .map(usage => usage.field('function')) - .filter((func): func is SgNode> => Boolean(func)) + .filter((func): func is SgNode => Boolean(func)) .map(func => func.replace(`${newNamespace}.${newImportFunction}`)); switch (importType) { @@ -47,13 +48,13 @@ function handleNamespaceImport( } function handleDestructuredImport( - rootNode: SgRoot, - idNode: SgNode>, - declaration: SgNode>, + rootNode: SgRoot, + idNode: SgNode, + declaration: SgNode, importType: 'require' | 'static' | 'dynamic-await' ): Edit[] { let localFunctionName: string | null = null; - let targetSpecifierNode: SgNode | null = null; + let targetSpecifierNode: SgNode | null = null; let isAliased = false; const relevantSpecifiers = idNode.children().filter( @@ -63,18 +64,22 @@ function handleDestructuredImport( ); for (const spec of relevantSpecifiers) { - let keyNode: SgNode> | null = null; - let aliasNode: SgNode> | null = null; - - if (spec.kind() === 'import_specifier') { - keyNode = spec.field('name'); - aliasNode = spec.field('alias'); - } else if (spec.kind() === 'pair_pattern') { - keyNode = spec.field('key'); - aliasNode = spec.field('value'); - } else { - keyNode = spec; - } + let keyNode: SgNode | null = null; + let aliasNode: SgNode | null = null; + + switch (spec.kind()) { + case 'import_specifier': + keyNode = spec.field('name'); + aliasNode = spec.field('alias'); + break; + case 'pair_pattern': + keyNode = spec.field('key'); + aliasNode = spec.field('value'); + break; + case 'shorthand_property_identifier_pattern': + keyNode = spec; + break; + } if (keyNode?.text() === oldFunctionName) { targetSpecifierNode = spec; @@ -135,7 +140,7 @@ function handleDestructuredImport( return []; } function findAndReplaceUsages( - rootNode: SgRoot, + rootNode: SgRoot, localFunctionName: string, newFunctionName: string, object: string | null = null @@ -174,25 +179,28 @@ function findAndReplaceUsages( } function handleRequire( - statement: SgNode>, - rootNode: SgRoot, + statement: SgNode, + rootNode: SgRoot, ): Edit[] { const idNode = statement.child(0); const declaration = statement.parent(); + if (!idNode || !declaration) return []; - if (idNode.kind() === 'identifier') + const kind = idNode.kind(); + + if (kind === 'identifier') return handleNamespaceImport(rootNode, idNode.text(), declaration, 'require'); - if (idNode.kind() === 'object_pattern') + if (kind === 'object_pattern') return handleDestructuredImport(rootNode, idNode, declaration, 'require'); return []; } function handleStaticImport( - statement: SgNode>, - rootNode: SgRoot + statement: SgNode, + rootNode: SgRoot ): Edit[] { const importClause = statement.child(1); if (importClause?.kind() !== 'import_clause') return []; @@ -256,8 +264,8 @@ function handleStaticImport( function handleDynamicImport( - statement: SgNode>, - rootNode: SgRoot, + statement: SgNode, + rootNode: SgRoot, ): Edit[] { const valueNode = statement.field('value'); const idNode = statement.child(0); @@ -301,7 +309,7 @@ function handleDynamicImport( c => c.kind() === 'pair_pattern' || c.kind() === 'shorthand_property_identifier_pattern' ); - let targetSpecifier: SgNode | null = null; + let targetSpecifier: SgNode | null = null; let localFunctionName: string | null | undefined = null; let isAliased = false; @@ -340,22 +348,20 @@ function handleDynamicImport( return []; } -export default function transform(root: SgRoot): string | null { +export default function transform(root: SgRoot): string | null { const rootNode = root.root(); const allEdits: Edit[] = []; - const sources: [SgNode[] | undefined, (n: SgNode, r: SgRoot) => Edit[]][] = [ - // @ts-ignore + const sources: [SgNode[] | undefined, (n: SgNode, r: SgRoot) => Edit[]][] = [ [getNodeRequireCalls(root, 'crypto'), handleRequire], - // @ts-ignore [getNodeImportStatements(root, 'crypto'), handleStaticImport], - // @ts-ignore [getNodeImportCalls(root, 'crypto'), handleDynamicImport], ]; for (const [nodes, handler] of sources) { for (const node of nodes || []) { const edits = handler(node, root); - if (edits.length) { + + if (edits.length) { allEdits.push(...edits); } } diff --git a/recipes/createCredentials-to-createSecureContext/tsconfig.json b/recipes/createCredentials-to-createSecureContext/tsconfig.json deleted file mode 100644 index 92c12497..00000000 --- a/recipes/createCredentials-to-createSecureContext/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "allowImportingTsExtensions": true, - "allowJs": true, - "alwaysStrict": true, - "baseUrl": "./", - "declaration": true, - "declarationMap": true, - "emitDeclarationOnly": true, - "lib": ["ESNext", "DOM"], - "module": "NodeNext", - "moduleResolution": "NodeNext", - "noImplicitThis": true, - "removeComments": true, - "strict": true, - "stripInternal": true, - "target": "esnext" - }, - "include": ["./"], - "exclude": [ - "tests/**" - ] -} From 39ba835e14d8c03a17038c2097568c13096f7d7f Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sun, 2 Nov 2025 10:36:14 +0100 Subject: [PATCH 35/43] update indentation --- .../src/workflow.ts | 736 ++++++++++-------- 1 file changed, 400 insertions(+), 336 deletions(-) diff --git a/recipes/createCredentials-to-createSecureContext/src/workflow.ts b/recipes/createCredentials-to-createSecureContext/src/workflow.ts index a3051d38..8712de31 100644 --- a/recipes/createCredentials-to-createSecureContext/src/workflow.ts +++ b/recipes/createCredentials-to-createSecureContext/src/workflow.ts @@ -1,373 +1,437 @@ import { EOL } from 'node:os'; -import { getNodeRequireCalls } from "@nodejs/codemod-utils/ast-grep/require-call"; -import { getNodeImportCalls, getNodeImportStatements } from "@nodejs/codemod-utils/ast-grep/import-statement"; -import type { SgRoot, Edit, SgNode} from "@codemod.com/jssg-types/main"; -import type Js from "@codemod.com/jssg-types/langs/javascript"; - -const newImportFunction = 'createSecureContext' -const newImportModule = 'node:tls' +import { getNodeRequireCalls } from '@nodejs/codemod-utils/ast-grep/require-call'; +import { + getNodeImportCalls, + getNodeImportStatements, +} from '@nodejs/codemod-utils/ast-grep/import-statement'; +import type { SgRoot, Edit, SgNode } from '@codemod.com/jssg-types/main'; +import type Js from '@codemod.com/jssg-types/langs/javascript'; + +const newImportFunction = 'createSecureContext'; +const newImportModule = 'node:tls'; const oldFunctionName = 'createCredentials'; -const oldImportModule = 'node:crypto' +const oldImportModule = 'node:crypto'; const newNamespace = 'tls'; function handleNamespaceImport( - rootNode: SgRoot, - localNamespace: string, - declaration: SgNode, - importType: 'require' | 'static' | 'dynamic-await' + rootNode: SgRoot, + localNamespace: string, + declaration: SgNode, + importType: 'require' | 'static' | 'dynamic-await', ): Edit[] { - const usages = rootNode.root().findAll({ - rule: { - kind: 'call_expression', - has: { - field: 'function', - kind: 'member_expression', - all: [ - { has: { field: 'object', regex: `^${localNamespace}$` } }, - { has: { field: 'property', regex: `^${oldFunctionName}$` } } - ] - } - } - }); - - if (usages.length === 0) return []; - - const usageEdits = usages - .map(usage => usage.field('function')) - .filter((func): func is SgNode => Boolean(func)) - .map(func => func.replace(`${newNamespace}.${newImportFunction}`)); - - switch (importType) { - case 'require': - return [...usageEdits, declaration.replace(`const ${newNamespace} = require('${newImportModule}');`)]; - case 'static': - return [...usageEdits, declaration.replace(`import * as ${newNamespace} from '${newImportModule}';`)]; - case 'dynamic-await': - return [...usageEdits, declaration.replace(`const ${newNamespace} = await import('${newImportModule}');`)]; - } + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: { + field: 'function', + kind: 'member_expression', + all: [ + { has: { field: 'object', regex: `^${localNamespace}$` } }, + { has: { field: 'property', regex: `^${oldFunctionName}$` } }, + ], + }, + }, + }); + + if (usages.length === 0) return []; + + const usageEdits = usages + .map((usage) => usage.field('function')) + .filter((func): func is SgNode => Boolean(func)) + .map((func) => func.replace(`${newNamespace}.${newImportFunction}`)); + + switch (importType) { + case 'require': + return [ + ...usageEdits, + declaration.replace( + `const ${newNamespace} = require('${newImportModule}');`, + ), + ]; + case 'static': + return [ + ...usageEdits, + declaration.replace( + `import * as ${newNamespace} from '${newImportModule}';`, + ), + ]; + case 'dynamic-await': + return [ + ...usageEdits, + declaration.replace( + `const ${newNamespace} = await import('${newImportModule}');`, + ), + ]; + } } function handleDestructuredImport( - rootNode: SgRoot, - idNode: SgNode, - declaration: SgNode, - importType: 'require' | 'static' | 'dynamic-await' + rootNode: SgRoot, + idNode: SgNode, + declaration: SgNode, + importType: 'require' | 'static' | 'dynamic-await', ): Edit[] { - let localFunctionName: string | null = null; - let targetSpecifierNode: SgNode | null = null; - let isAliased = false; - - const relevantSpecifiers = idNode.children().filter( - child => child.kind() === 'pair_pattern' - || child.kind() === 'shorthand_property_identifier_pattern' - || child.kind() === 'import_specifier' - ); - - for (const spec of relevantSpecifiers) { - let keyNode: SgNode | null = null; - let aliasNode: SgNode | null = null; - - switch (spec.kind()) { - case 'import_specifier': - keyNode = spec.field('name'); - aliasNode = spec.field('alias'); - break; - case 'pair_pattern': - keyNode = spec.field('key'); - aliasNode = spec.field('value'); - break; - case 'shorthand_property_identifier_pattern': - keyNode = spec; - break; - } - - if (keyNode?.text() === oldFunctionName) { - targetSpecifierNode = spec; - isAliased = Boolean(aliasNode); - localFunctionName = isAliased ? aliasNode!.text() : keyNode!.text(); - break; - } - } - - if (localFunctionName && targetSpecifierNode) { - const allEdits: Edit[] = []; - - if (!isAliased) { - allEdits.push(...findAndReplaceUsages(rootNode, localFunctionName, newImportFunction)); - } - - const aliasSeparator = importType === 'static' ? ' as' : ':'; - const newImportSpecifier = isAliased - ? `{ ${newImportFunction}${aliasSeparator} ${localFunctionName} }` - : `{ ${newImportFunction} }`; - - let newImportStatement = ''; - switch (importType) { - case 'require': - newImportStatement = `const ${newImportSpecifier} = require('${newImportModule}');`; - break; - case 'static': - newImportStatement = `import ${newImportSpecifier} from '${newImportModule}';`; - break; - case 'dynamic-await': - newImportStatement = `const ${newImportSpecifier} = await import('${newImportModule}');`; - break; - } - - const otherSpecifiers = relevantSpecifiers.filter(s => s !== targetSpecifierNode); - if (otherSpecifiers.length > 0) { - let modifiedOldImport = ''; - const otherSpecifiersText = otherSpecifiers.map(s => s.text()).join(', '); - switch (importType) { - case 'require': - modifiedOldImport = `const { ${otherSpecifiersText} } = require('${oldImportModule}');`; - break; - case 'static': - modifiedOldImport = `import { ${otherSpecifiersText} } from '${oldImportModule}';`; - break; - case 'dynamic-await': - modifiedOldImport = `const { ${otherSpecifiersText} } = await import('${oldImportModule}');`; - break; - } - allEdits.push(declaration.replace(`${modifiedOldImport}${EOL}${newImportStatement}`)); - } else { - allEdits.push(declaration.replace(newImportStatement)); - } - - return allEdits; - } - - return []; + let localFunctionName: string | null = null; + let targetSpecifierNode: SgNode | null = null; + let isAliased = false; + + const relevantSpecifiers = idNode + .children() + .filter( + (child) => + child.kind() === 'pair_pattern' || + child.kind() === 'shorthand_property_identifier_pattern' || + child.kind() === 'import_specifier', + ); + + for (const spec of relevantSpecifiers) { + let keyNode: SgNode | null = null; + let aliasNode: SgNode | null = null; + + switch (spec.kind()) { + case 'import_specifier': + keyNode = spec.field('name'); + aliasNode = spec.field('alias'); + break; + case 'pair_pattern': + keyNode = spec.field('key'); + aliasNode = spec.field('value'); + break; + case 'shorthand_property_identifier_pattern': + keyNode = spec; + break; + } + + if (keyNode?.text() === oldFunctionName) { + targetSpecifierNode = spec; + isAliased = Boolean(aliasNode); + localFunctionName = isAliased ? aliasNode!.text() : keyNode!.text(); + break; + } + } + + if (localFunctionName && targetSpecifierNode) { + const allEdits: Edit[] = []; + + if (!isAliased) { + allEdits.push( + ...findAndReplaceUsages(rootNode, localFunctionName, newImportFunction), + ); + } + + const aliasSeparator = importType === 'static' ? ' as' : ':'; + const newImportSpecifier = isAliased + ? `{ ${newImportFunction}${aliasSeparator} ${localFunctionName} }` + : `{ ${newImportFunction} }`; + + let newImportStatement = ''; + switch (importType) { + case 'require': + newImportStatement = `const ${newImportSpecifier} = require('${newImportModule}');`; + break; + case 'static': + newImportStatement = `import ${newImportSpecifier} from '${newImportModule}';`; + break; + case 'dynamic-await': + newImportStatement = `const ${newImportSpecifier} = await import('${newImportModule}');`; + break; + } + + const otherSpecifiers = relevantSpecifiers.filter( + (s) => s !== targetSpecifierNode, + ); + if (otherSpecifiers.length > 0) { + let modifiedOldImport = ''; + const otherSpecifiersText = otherSpecifiers + .map((s) => s.text()) + .join(', '); + switch (importType) { + case 'require': + modifiedOldImport = `const { ${otherSpecifiersText} } = require('${oldImportModule}');`; + break; + case 'static': + modifiedOldImport = `import { ${otherSpecifiersText} } from '${oldImportModule}';`; + break; + case 'dynamic-await': + modifiedOldImport = `const { ${otherSpecifiersText} } = await import('${oldImportModule}');`; + break; + } + allEdits.push( + declaration.replace(`${modifiedOldImport}${EOL}${newImportStatement}`), + ); + } else { + allEdits.push(declaration.replace(newImportStatement)); + } + + return allEdits; + } + + return []; } function findAndReplaceUsages( - rootNode: SgRoot, - localFunctionName: string, - newFunctionName: string, - object: string | null = null + rootNode: SgRoot, + localFunctionName: string, + newFunctionName: string, + object: string | null = null, ): Edit[] { - const functionRule = object - ? { - field: 'function', - kind: 'member_expression', - all: [ - { has: { field: 'object', regex: `^${object}$` } }, - { has: { field: 'property', regex: `^${localFunctionName}$` } } - ] - } - : { - field: 'function', - kind: 'identifier', - regex: `^${localFunctionName}$` - }; - - const usages = rootNode.root().findAll({ - rule: { - kind: 'call_expression', - has: functionRule - } - }); - - return usages - .map(usage => { - const functionNode = usage.field('function'); - if (!functionNode) return null; - - const nodeToReplace = object ? functionNode.field('property') : functionNode; - return nodeToReplace ? nodeToReplace.replace(newFunctionName) : null; - }) - .filter((edit): edit is Edit => Boolean(edit)); + const functionRule = object + ? { + field: 'function', + kind: 'member_expression', + all: [ + { has: { field: 'object', regex: `^${object}$` } }, + { has: { field: 'property', regex: `^${localFunctionName}$` } }, + ], + } + : { + field: 'function', + kind: 'identifier', + regex: `^${localFunctionName}$`, + }; + + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: functionRule, + }, + }); + + return usages + .map((usage) => { + const functionNode = usage.field('function'); + if (!functionNode) return null; + + const nodeToReplace = object + ? functionNode.field('property') + : functionNode; + return nodeToReplace ? nodeToReplace.replace(newFunctionName) : null; + }) + .filter((edit): edit is Edit => Boolean(edit)); } -function handleRequire( - statement: SgNode, - rootNode: SgRoot, -): Edit[] { - const idNode = statement.child(0); - const declaration = statement.parent(); +function handleRequire(statement: SgNode, rootNode: SgRoot): Edit[] { + const idNode = statement.child(0); + const declaration = statement.parent(); - if (!idNode || !declaration) return []; + if (!idNode || !declaration) return []; - const kind = idNode.kind(); + const kind = idNode.kind(); - if (kind === 'identifier') - return handleNamespaceImport(rootNode, idNode.text(), declaration, 'require'); + if (kind === 'identifier') + return handleNamespaceImport( + rootNode, + idNode.text(), + declaration, + 'require', + ); - if (kind === 'object_pattern') - return handleDestructuredImport(rootNode, idNode, declaration, 'require'); + if (kind === 'object_pattern') + return handleDestructuredImport(rootNode, idNode, declaration, 'require'); - return []; + return []; } function handleStaticImport( - statement: SgNode, - rootNode: SgRoot + statement: SgNode, + rootNode: SgRoot, ): Edit[] { - const importClause = statement.child(1); - if (importClause?.kind() !== 'import_clause') return []; - - const content = importClause.child(0); - if (!content) return []; - - // Namespace imports: import * as ns from '...' - if (content.kind() === 'namespace_import') { - const ns = content.find({ rule: { kind: 'identifier' } })?.text(); - if (!ns) return []; - - const usages = rootNode.root().findAll({ - rule: { - kind: 'call_expression', - has: { - field: 'function', - kind: 'member_expression', - all: [ - { has: { field: 'object', regex: `^${ns}$` } }, - { has: { field: 'property', regex: `^${oldFunctionName}$` } } - ] - } - } - }); - if (!usages.length) return []; - - const edits = usages - .map(u => u.field('function')?.replace(`${newNamespace}.${newImportFunction}`)) - .filter(Boolean); - edits.push(statement.replace(`import * as ${newNamespace} from '${newImportModule}';`)); - return edits as Edit[]; - } - - // Named imports: import { x } from '...' - if (content.kind() === 'named_imports') { - const specs = content.children().filter(c => c.kind() === 'import_specifier'); - const target = specs.find(s => s.field('name')?.text() === oldFunctionName); - if (!target) return []; - - const aliasNode = target.field('alias'); - const localName = aliasNode?.text() || target.field('name')?.text() || ""; - const edits = aliasNode ? [] : findAndReplaceUsages(rootNode, localName, newImportFunction); - - const newSpec = aliasNode ? `{ ${newImportFunction} as ${localName} }` : `{ ${newImportFunction} }`; - const newStmt = `import ${newSpec} from '${newImportModule}';`; - const others = specs.filter(s => s !== target); - - return [ - ...edits, - others.length - ? statement.replace( - `import { ${others.map(s => s.text()).join(', ')} } from '${oldImportModule}';${EOL}${newStmt}` - ) - : statement.replace(newStmt) - ]; - } - - return []; + const importClause = statement.child(1); + if (importClause?.kind() !== 'import_clause') return []; + + const content = importClause.child(0); + if (!content) return []; + + // Namespace imports: import * as ns from '...' + if (content.kind() === 'namespace_import') { + const ns = content.find({ rule: { kind: 'identifier' } })?.text(); + if (!ns) return []; + + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: { + field: 'function', + kind: 'member_expression', + all: [ + { has: { field: 'object', regex: `^${ns}$` } }, + { has: { field: 'property', regex: `^${oldFunctionName}$` } }, + ], + }, + }, + }); + if (!usages.length) return []; + + const edits = usages + .map((u) => + u.field('function')?.replace(`${newNamespace}.${newImportFunction}`), + ) + .filter(Boolean); + edits.push( + statement.replace( + `import * as ${newNamespace} from '${newImportModule}';`, + ), + ); + return edits as Edit[]; + } + + // Named imports: import { x } from '...' + if (content.kind() === 'named_imports') { + const specs = content + .children() + .filter((c) => c.kind() === 'import_specifier'); + const target = specs.find( + (s) => s.field('name')?.text() === oldFunctionName, + ); + if (!target) return []; + + const aliasNode = target.field('alias'); + const localName = aliasNode?.text() || target.field('name')?.text() || ''; + const edits = aliasNode + ? [] + : findAndReplaceUsages(rootNode, localName, newImportFunction); + + const newSpec = aliasNode + ? `{ ${newImportFunction} as ${localName} }` + : `{ ${newImportFunction} }`; + const newStmt = `import ${newSpec} from '${newImportModule}';`; + const others = specs.filter((s) => s !== target); + + return [ + ...edits, + others.length + ? statement.replace( + `import { ${others.map((s) => s.text()).join(', ')} } from '${oldImportModule}';${EOL}${newStmt}`, + ) + : statement.replace(newStmt), + ]; + } + + return []; } - function handleDynamicImport( - statement: SgNode, - rootNode: SgRoot, + statement: SgNode, + rootNode: SgRoot, ): Edit[] { - const valueNode = statement.field('value'); - const idNode = statement.child(0); - const declaration = statement.parent(); - - // must be `const ... = await import(...)` and have a parent declaration - if (valueNode?.kind() !== 'await_expression' || !declaration) return []; - - // Case 1: `const ns = await import(...)` - if (idNode?.kind() === 'identifier') { - const localNamespace = idNode.text(); - if (!localNamespace) return []; - - const usages = rootNode.root().findAll({ - rule: { - kind: 'call_expression', - has: { - field: 'function', - kind: 'member_expression', - all: [ - { has: { field: 'object', regex: `^${localNamespace}$` } }, - { has: { field: 'property', regex: `^${oldFunctionName}$` } } - ] - } - } - }); - - if (!usages.length) return []; - - const edits = usages - .map(u => u.field('function')?.replace(`${newNamespace}.${newImportFunction}`)) - .filter(Boolean) as Edit[]; - - edits.push(declaration.replace(`const ${newNamespace} = await import('${newImportModule}');`)); - return edits; - } - - // Case 2: `const { ... } = await import(...)` - if (idNode?.kind() === 'object_pattern') { - const specifiers = idNode.children().filter( - c => c.kind() === 'pair_pattern' || c.kind() === 'shorthand_property_identifier_pattern' - ); - - let targetSpecifier: SgNode | null = null; - let localFunctionName: string | null | undefined = null; - let isAliased = false; - - for (const spec of specifiers) { - const keyNode = spec.kind() === 'pair_pattern' ? spec.field('key') : spec; - if (keyNode?.text() === oldFunctionName) { - targetSpecifier = spec; - isAliased = spec.kind() === 'pair_pattern'; - localFunctionName = isAliased ? spec.field('value')?.text() : keyNode.text(); - break; - } - } - - if (!localFunctionName || !targetSpecifier) return []; - - const edits: Edit[] = []; - if (!isAliased) edits.push(...findAndReplaceUsages(rootNode, localFunctionName, newImportFunction)); - - const newImportSpecifier = isAliased - ? `{ ${newImportFunction}: ${localFunctionName} }` - : `{ ${newImportFunction} }`; - - const newImportStmt = `const ${newImportSpecifier} = await import('${newImportModule}');`; - - const otherSpecifiers = specifiers.filter(s => s !== targetSpecifier); - if (otherSpecifiers.length) { - const remaining = `const { ${otherSpecifiers.map(s => s.text()).join(', ')} } = await import('${oldImportModule}');`; - edits.push(declaration.replace(`${remaining}${EOL}${newImportStmt}`)); - } else { - edits.push(declaration.replace(newImportStmt)); - } - - return edits; - } - - return []; + const valueNode = statement.field('value'); + const idNode = statement.child(0); + const declaration = statement.parent(); + + // must be `const ... = await import(...)` and have a parent declaration + if (valueNode?.kind() !== 'await_expression' || !declaration) return []; + + // Case 1: `const ns = await import(...)` + if (idNode?.kind() === 'identifier') { + const localNamespace = idNode.text(); + if (!localNamespace) return []; + + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: { + field: 'function', + kind: 'member_expression', + all: [ + { has: { field: 'object', regex: `^${localNamespace}$` } }, + { has: { field: 'property', regex: `^${oldFunctionName}$` } }, + ], + }, + }, + }); + + if (!usages.length) return []; + + const edits = usages + .map((u) => + u.field('function')?.replace(`${newNamespace}.${newImportFunction}`), + ) + .filter(Boolean) as Edit[]; + + edits.push( + declaration.replace( + `const ${newNamespace} = await import('${newImportModule}');`, + ), + ); + return edits; + } + + // Case 2: `const { ... } = await import(...)` + if (idNode?.kind() === 'object_pattern') { + const specifiers = idNode + .children() + .filter( + (c) => + c.kind() === 'pair_pattern' || + c.kind() === 'shorthand_property_identifier_pattern', + ); + + let targetSpecifier: SgNode | null = null; + let localFunctionName: string | null | undefined = null; + let isAliased = false; + + for (const spec of specifiers) { + const keyNode = spec.kind() === 'pair_pattern' ? spec.field('key') : spec; + if (keyNode?.text() === oldFunctionName) { + targetSpecifier = spec; + isAliased = spec.kind() === 'pair_pattern'; + localFunctionName = isAliased + ? spec.field('value')?.text() + : keyNode.text(); + break; + } + } + + if (!localFunctionName || !targetSpecifier) return []; + + const edits: Edit[] = []; + if (!isAliased) + edits.push( + ...findAndReplaceUsages(rootNode, localFunctionName, newImportFunction), + ); + + const newImportSpecifier = isAliased + ? `{ ${newImportFunction}: ${localFunctionName} }` + : `{ ${newImportFunction} }`; + + const newImportStmt = `const ${newImportSpecifier} = await import('${newImportModule}');`; + + const otherSpecifiers = specifiers.filter((s) => s !== targetSpecifier); + if (otherSpecifiers.length) { + const remaining = `const { ${otherSpecifiers.map((s) => s.text()).join(', ')} } = await import('${oldImportModule}');`; + edits.push(declaration.replace(`${remaining}${EOL}${newImportStmt}`)); + } else { + edits.push(declaration.replace(newImportStmt)); + } + + return edits; + } + + return []; } export default function transform(root: SgRoot): string | null { - const rootNode = root.root(); - const allEdits: Edit[] = []; - const sources: [SgNode[] | undefined, (n: SgNode, r: SgRoot) => Edit[]][] = [ - [getNodeRequireCalls(root, 'crypto'), handleRequire], - [getNodeImportStatements(root, 'crypto'), handleStaticImport], - [getNodeImportCalls(root, 'crypto'), handleDynamicImport], - ]; - - for (const [nodes, handler] of sources) { - for (const node of nodes || []) { - const edits = handler(node, root); + const rootNode = root.root(); + const allEdits: Edit[] = []; + const sources: [ + SgNode[] | undefined, + (n: SgNode, r: SgRoot) => Edit[], + ][] = [ + [getNodeRequireCalls(root, 'crypto'), handleRequire], + [getNodeImportStatements(root, 'crypto'), handleStaticImport], + [getNodeImportCalls(root, 'crypto'), handleDynamicImport], + ]; + + for (const [nodes, handler] of sources) { + for (const node of nodes || []) { + const edits = handler(node, root); if (edits.length) { - allEdits.push(...edits); - } - } - } + allEdits.push(...edits); + } + } + } - if (!allEdits.length) return null; + if (!allEdits.length) return null; return rootNode.commitEdits(allEdits); } From 5228905a8f57ef9ab69b5196a674aa167c5ff77f Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sun, 2 Nov 2025 10:51:01 +0100 Subject: [PATCH 36/43] update --- package-lock.json | 888 +++++++++++++++--- .../src/workflow.ts | 420 +++------ 2 files changed, 904 insertions(+), 404 deletions(-) diff --git a/package-lock.json b/package-lock.json index b1d8faa8..e1fee65f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,19 +18,10 @@ "@typescript/native-preview": "^7.0.0-dev.20251027.1" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "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" @@ -54,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" ], @@ -66,6 +59,102 @@ "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.4", "resolved": "https://registry.npmjs.org/@ast-grep/lang-bash/-/lang-bash-0.0.4.tgz", @@ -287,6 +376,8 @@ }, "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", @@ -298,27 +389,31 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", + "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" } }, "node_modules/@babel/core": { - "version": "7.28.0", + "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", "peer": true, "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.28.0", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -334,11 +429,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.0", + "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.0", - "@babel/types": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -349,6 +446,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" @@ -359,6 +458,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", @@ -372,15 +473,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", + "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.1", - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", + "@babel/traverse": "^7.28.5", "semver": "^6.3.1" }, "engines": { @@ -392,17 +495,21 @@ }, "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" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", + "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.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -410,6 +517,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", @@ -420,12 +529,14 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", + "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", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -436,6 +547,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" @@ -446,6 +559,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" @@ -453,6 +568,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", @@ -468,6 +585,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", @@ -479,13 +598,17 @@ }, "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" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", + "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" @@ -493,27 +616,33 @@ }, "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" } }, "node_modules/@babel/helpers": { - "version": "7.28.2", + "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", - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.0", + "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.0" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -524,6 +653,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" @@ -537,6 +668,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" @@ -550,6 +683,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" @@ -563,6 +698,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", @@ -577,6 +714,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", @@ -591,6 +730,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", @@ -605,6 +746,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" @@ -617,7 +760,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", + "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", @@ -632,6 +777,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", @@ -645,11 +792,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.0", + "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", - "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" @@ -663,6 +812,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", @@ -677,14 +828,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.27.1", + "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", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.27.1" + "@babel/plugin-transform-typescript": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -694,7 +847,9 @@ } }, "node_modules/@babel/register": { - "version": "7.27.1", + "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", @@ -712,6 +867,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", @@ -723,15 +880,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.0", + "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", - "@babel/generator": "^7.28.0", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { @@ -739,11 +898,13 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", + "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", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -914,11 +1075,15 @@ }, "node_modules/@codemod.com/jssg-types": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@codemod.com/jssg-types/-/jssg-types-1.0.9.tgz", + "integrity": "sha512-j+O2nvYnBcmBy0mG5bSmBD7Cn7q3fgp4tI6aqIuF7pVu7j8Dgs45Ohgkpzx9mwqcmAE7vC9CEc8zQZOfwfICyw==", "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", @@ -947,6 +1112,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" @@ -965,6 +1132,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" ], @@ -1105,8 +1274,31 @@ "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", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/figures": { - "version": "1.0.13", + "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" @@ -1114,6 +1306,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", @@ -1128,7 +1322,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", + "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" @@ -1138,7 +1334,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", + "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" @@ -1149,10 +1347,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", @@ -1167,7 +1369,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", + "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" @@ -1181,6 +1385,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", @@ -1195,26 +1401,44 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", + "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", "@jridgewell/trace-mapping": "^0.3.24" } }, + "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", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "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" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", + "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.29", + "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", @@ -1223,6 +1447,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" @@ -1230,10 +1456,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" @@ -1332,6 +1562,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" @@ -1339,6 +1571,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", "peer": true, "dependencies": { @@ -1356,6 +1590,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", @@ -1367,6 +1603,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", @@ -1379,10 +1617,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" @@ -1396,6 +1638,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" @@ -1406,6 +1650,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" @@ -1419,6 +1665,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", @@ -1432,6 +1680,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", @@ -1444,6 +1694,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", @@ -1457,6 +1709,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" @@ -1464,6 +1718,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": { @@ -1472,6 +1728,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", @@ -1486,6 +1744,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" @@ -1499,6 +1759,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", @@ -1515,11 +1777,13 @@ } }, "node_modules/@types/node-fetch": { - "version": "2.6.12", + "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": "*", - "form-data": "^4.0.0" + "form-data": "^4.0.4" } }, "node_modules/@typescript/native-preview": { @@ -1641,6 +1905,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" @@ -1651,6 +1917,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" @@ -1661,6 +1929,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" @@ -1674,6 +1944,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" @@ -1681,6 +1953,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" @@ -1694,6 +1968,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" @@ -1704,10 +1980,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" @@ -1715,13 +1995,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", @@ -1738,12 +2024,25 @@ ], "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.23", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.23.tgz", + "integrity": "sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "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", @@ -1753,6 +2052,8 @@ }, "node_modules/brace-expansion": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -1760,6 +2061,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" @@ -1769,7 +2072,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", "funding": [ { "type": "opencollective", @@ -1787,10 +2092,11 @@ "license": "MIT", "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" @@ -1801,6 +2107,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", @@ -1823,10 +2131,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", @@ -1837,7 +2149,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001727", + "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", @@ -1856,6 +2170,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", @@ -1869,11 +2185,15 @@ } }, "node_modules/chardet": { - "version": "0.7.0", + "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": "*" @@ -1881,6 +2201,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" @@ -1891,6 +2213,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" @@ -1901,6 +2225,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" @@ -1908,6 +2234,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" @@ -1915,6 +2243,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", @@ -1927,6 +2257,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" @@ -1937,10 +2269,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" @@ -1951,6 +2287,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" @@ -1961,18 +2299,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", @@ -1985,13 +2331,17 @@ }, "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": "*" } }, "node_modules/debug": { - "version": "4.4.1", + "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" @@ -2022,6 +2372,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" @@ -2032,6 +2384,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" @@ -2039,17 +2393,26 @@ }, "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.1", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "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" @@ -2057,6 +2420,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" @@ -2067,6 +2432,8 @@ }, "node_modules/diff": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -2074,6 +2441,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", @@ -2082,6 +2451,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", @@ -2094,18 +2465,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.191", + "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" @@ -2113,6 +2492,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" @@ -2120,6 +2501,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" @@ -2130,6 +2513,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", @@ -2143,6 +2528,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" @@ -2150,6 +2537,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" @@ -2160,6 +2549,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", @@ -2171,25 +2562,17 @@ }, "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" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, "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" @@ -2200,6 +2583,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" @@ -2213,6 +2598,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" @@ -2223,6 +2610,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", @@ -2235,6 +2624,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" @@ -2244,7 +2635,9 @@ } }, "node_modules/flow-parser": { - "version": "0.277.1", + "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" @@ -2252,6 +2645,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", @@ -2266,6 +2661,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", @@ -2280,10 +2677,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", @@ -2295,6 +2696,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" @@ -2302,10 +2705,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" @@ -2313,6 +2720,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" @@ -2320,6 +2729,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", @@ -2342,6 +2753,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", @@ -2353,6 +2766,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", @@ -2361,6 +2776,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" @@ -2368,6 +2785,8 @@ }, "node_modules/glob": { "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -2386,6 +2805,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" @@ -2396,10 +2817,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" @@ -2407,6 +2832,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" @@ -2417,6 +2844,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" @@ -2430,6 +2859,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" @@ -2440,23 +2871,33 @@ }, "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" } }, "node_modules/iconv-lite": { - "version": "0.4.24", + "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" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "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", @@ -2475,6 +2916,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" @@ -2482,6 +2925,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", @@ -2490,16 +2936,20 @@ }, "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.7", + "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", "@inquirer/figures": "^1.0.3", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", - "external-editor": "^3.1.0", "mute-stream": "1.0.0", "ora": "^5.4.1", "run-async": "^3.0.0", @@ -2515,10 +2965,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" @@ -2526,6 +2980,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" @@ -2533,6 +2989,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" @@ -2540,6 +2998,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" @@ -2550,6 +3010,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" @@ -2557,6 +3019,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" @@ -2567,10 +3031,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" @@ -2578,6 +3046,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" @@ -2591,10 +3061,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", @@ -2632,6 +3106,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" @@ -2642,6 +3118,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", @@ -2656,6 +3134,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" @@ -2666,6 +3146,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" @@ -2676,6 +3158,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" @@ -2683,6 +3167,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", @@ -2694,10 +3180,14 @@ }, "node_modules/lodash-es": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "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", @@ -2712,20 +3202,26 @@ }, "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" } }, "node_modules/magic-string": { - "version": "0.30.17", + "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.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "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", @@ -2737,6 +3233,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" @@ -2744,6 +3242,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" @@ -2751,6 +3251,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", @@ -2760,6 +3262,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", @@ -2771,6 +3275,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" @@ -2778,6 +3284,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" @@ -2788,6 +3296,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" @@ -2795,6 +3305,8 @@ }, "node_modules/minimatch": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -2808,6 +3320,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" @@ -2815,10 +3329,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" @@ -2826,10 +3344,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" @@ -2840,6 +3362,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", @@ -2848,6 +3372,8 @@ }, "node_modules/node-dir/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -2858,6 +3384,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", @@ -2875,6 +3404,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" @@ -2892,11 +3423,15 @@ } }, "node_modules/node-releases": { - "version": "2.0.19", + "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" @@ -2904,6 +3439,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" @@ -2917,6 +3454,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", @@ -2934,7 +3473,9 @@ } }, "node_modules/openai/node_modules/@types/node": { - "version": "18.19.120", + "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" @@ -2942,10 +3483,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", @@ -2965,15 +3510,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "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" @@ -2987,6 +3527,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" @@ -2997,6 +3539,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" @@ -3004,10 +3548,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" @@ -3015,6 +3563,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" @@ -3022,6 +3572,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" @@ -3029,6 +3581,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" @@ -3036,6 +3590,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" @@ -3043,6 +3599,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", @@ -3057,14 +3615,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" @@ -3075,6 +3639,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" @@ -3082,6 +3648,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" @@ -3089,6 +3657,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" @@ -3099,6 +3669,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" @@ -3112,10 +3684,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", @@ -3128,6 +3704,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", @@ -3141,6 +3719,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", @@ -3152,10 +3732,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" @@ -3166,6 +3751,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", @@ -3174,6 +3761,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", @@ -3192,6 +3782,8 @@ }, "node_modules/rimraf/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -3202,6 +3794,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" @@ -3209,6 +3803,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" @@ -3216,6 +3812,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", @@ -3234,10 +3832,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" @@ -3245,6 +3847,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" @@ -3255,6 +3859,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" @@ -3265,6 +3871,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" @@ -3272,6 +3880,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" @@ -3281,7 +3891,9 @@ } }, "node_modules/simple-git": { - "version": "3.28.0", + "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", @@ -3295,6 +3907,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" @@ -3302,6 +3916,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", @@ -3310,6 +3926,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" @@ -3317,6 +3935,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", @@ -3330,6 +3950,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", @@ -3342,6 +3964,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" @@ -3353,6 +3977,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" @@ -3363,6 +3989,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" @@ -3373,6 +4001,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" @@ -3383,20 +4013,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/tmp": { - "version": "0.0.33", - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "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" @@ -3407,10 +4031,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" @@ -3418,6 +4046,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" @@ -3428,10 +4058,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" @@ -3448,10 +4082,14 @@ }, "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.3", + "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", @@ -3480,10 +4118,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" @@ -3491,6 +4133,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" @@ -3498,10 +4142,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", @@ -3510,6 +4158,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" @@ -3523,6 +4173,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", @@ -3536,6 +4188,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", @@ -3551,10 +4205,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", @@ -3564,14 +4222,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.0", + "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" @@ -3581,7 +4245,9 @@ } }, "node_modules/yoctocolors-cjs": { - "version": "2.1.2", + "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" diff --git a/recipes/createCredentials-to-createSecureContext/src/workflow.ts b/recipes/createCredentials-to-createSecureContext/src/workflow.ts index 8712de31..cc4241b6 100644 --- a/recipes/createCredentials-to-createSecureContext/src/workflow.ts +++ b/recipes/createCredentials-to-createSecureContext/src/workflow.ts @@ -4,6 +4,7 @@ import { getNodeImportCalls, getNodeImportStatements, } from '@nodejs/codemod-utils/ast-grep/import-statement'; +import { resolveBindingPath } from '@nodejs/codemod-utils/ast-grep/resolve-binding-path'; import type { SgRoot, Edit, SgNode } from '@codemod.com/jssg-types/main'; import type Js from '@codemod.com/jssg-types/langs/javascript'; @@ -13,223 +14,117 @@ const oldFunctionName = 'createCredentials'; const oldImportModule = 'node:crypto'; const newNamespace = 'tls'; -function handleNamespaceImport( +function replaceUsagesForResolvedPath( rootNode: SgRoot, - localNamespace: string, - declaration: SgNode, - importType: 'require' | 'static' | 'dynamic-await', + resolvedPath: string, ): Edit[] { - const usages = rootNode.root().findAll({ - rule: { - kind: 'call_expression', - has: { - field: 'function', - kind: 'member_expression', - all: [ - { has: { field: 'object', regex: `^${localNamespace}$` } }, - { has: { field: 'property', regex: `^${oldFunctionName}$` } }, - ], + // Namespace/member usage e.g., crypto.createCredentials or ns.createCredentials + if (resolvedPath.includes('.')) { + const [object, property] = resolvedPath.split('.'); + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: { + field: 'function', + kind: 'member_expression', + all: [ + { has: { field: 'object', regex: `^${object}$` } }, + { has: { field: 'property', regex: `^${property}$` } }, + ], + }, }, - }, - }); + }); - if (usages.length === 0) return []; + return usages + .map((u) => u.field('function')) + .filter((f): f is SgNode => Boolean(f)) + .map((f) => f.replace(`${newNamespace}.${newImportFunction}`)); + } - const usageEdits = usages - .map((usage) => usage.field('function')) - .filter((func): func is SgNode => Boolean(func)) - .map((func) => func.replace(`${newNamespace}.${newImportFunction}`)); + // Destructured identifier usage + // If alias was used, resolvedPath will not equal oldFunctionName; in that case we do not touch call sites + if (resolvedPath === oldFunctionName) { + const usages = rootNode.root().findAll({ + rule: { + kind: 'call_expression', + has: { + field: 'function', + kind: 'identifier', + regex: `^${oldFunctionName}$`, + }, + }, + }); - switch (importType) { - case 'require': - return [ - ...usageEdits, - declaration.replace( - `const ${newNamespace} = require('${newImportModule}');`, - ), - ]; - case 'static': - return [ - ...usageEdits, - declaration.replace( - `import * as ${newNamespace} from '${newImportModule}';`, - ), - ]; - case 'dynamic-await': - return [ - ...usageEdits, - declaration.replace( - `const ${newNamespace} = await import('${newImportModule}');`, - ), - ]; + return usages + .map((usage) => usage.field('function')) + .filter((id): id is SgNode => Boolean(id)) + .map((id) => id.replace(newImportFunction)); } + + // Aliased destructured identifier => keep usages intact + return []; } -function handleDestructuredImport( - rootNode: SgRoot, - idNode: SgNode, - declaration: SgNode, - importType: 'require' | 'static' | 'dynamic-await', -): Edit[] { - let localFunctionName: string | null = null; - let targetSpecifierNode: SgNode | null = null; - let isAliased = false; - - const relevantSpecifiers = idNode - .children() - .filter( - (child) => - child.kind() === 'pair_pattern' || - child.kind() === 'shorthand_property_identifier_pattern' || - child.kind() === 'import_specifier', - ); +function handleRequire(statement: SgNode, rootNode: SgRoot): Edit[] { + const idNode = statement.child(0); + const declaration = statement.parent(); - for (const spec of relevantSpecifiers) { - let keyNode: SgNode | null = null; - let aliasNode: SgNode | null = null; - - switch (spec.kind()) { - case 'import_specifier': - keyNode = spec.field('name'); - aliasNode = spec.field('alias'); - break; - case 'pair_pattern': - keyNode = spec.field('key'); - aliasNode = spec.field('value'); - break; - case 'shorthand_property_identifier_pattern': - keyNode = spec; - break; - } + if (!idNode || !declaration) return []; - if (keyNode?.text() === oldFunctionName) { - targetSpecifierNode = spec; - isAliased = Boolean(aliasNode); - localFunctionName = isAliased ? aliasNode!.text() : keyNode!.text(); - break; - } - } + const resolved = resolveBindingPath(statement, `$.${oldFunctionName}`); + if (!resolved) return []; - if (localFunctionName && targetSpecifierNode) { - const allEdits: Edit[] = []; + const usageEdits = replaceUsagesForResolvedPath(rootNode, resolved); - if (!isAliased) { - allEdits.push( - ...findAndReplaceUsages(rootNode, localFunctionName, newImportFunction), + if (idNode.kind() === 'identifier') { + // Namespace require: replace import and usages + return [ + ...usageEdits, + declaration.replace( + `const ${newNamespace} = require('${newImportModule}');`, + ), + ]; + } + + if (idNode.kind() === 'object_pattern') { + const isAliased = resolved !== oldFunctionName; + const relevantSpecifiers = idNode + .children() + .filter( + (child) => + child.kind() === 'pair_pattern' || + child.kind() === 'shorthand_property_identifier_pattern', ); - } - const aliasSeparator = importType === 'static' ? ' as' : ':'; + const otherSpecifiers = relevantSpecifiers.filter((spec) => { + if (spec.kind() === 'pair_pattern') { + const key = spec.field('key'); + return key?.text() !== oldFunctionName; + } + // shorthand + return spec.text() !== oldFunctionName; + }); + + const aliasSeparator = ':'; // require uses object pattern alias const newImportSpecifier = isAliased - ? `{ ${newImportFunction}${aliasSeparator} ${localFunctionName} }` + ? `{ ${newImportFunction}${aliasSeparator} ${resolved} }` : `{ ${newImportFunction} }`; + const newImportStatement = `const ${newImportSpecifier} = require('${newImportModule}');`; - let newImportStatement = ''; - switch (importType) { - case 'require': - newImportStatement = `const ${newImportSpecifier} = require('${newImportModule}');`; - break; - case 'static': - newImportStatement = `import ${newImportSpecifier} from '${newImportModule}';`; - break; - case 'dynamic-await': - newImportStatement = `const ${newImportSpecifier} = await import('${newImportModule}');`; - break; - } - - const otherSpecifiers = relevantSpecifiers.filter( - (s) => s !== targetSpecifierNode, - ); if (otherSpecifiers.length > 0) { - let modifiedOldImport = ''; - const otherSpecifiersText = otherSpecifiers - .map((s) => s.text()) - .join(', '); - switch (importType) { - case 'require': - modifiedOldImport = `const { ${otherSpecifiersText} } = require('${oldImportModule}');`; - break; - case 'static': - modifiedOldImport = `import { ${otherSpecifiersText} } from '${oldImportModule}';`; - break; - case 'dynamic-await': - modifiedOldImport = `const { ${otherSpecifiersText} } = await import('${oldImportModule}');`; - break; - } - allEdits.push( + const othersText = otherSpecifiers.map((s) => s.text()).join(', '); + const modifiedOldImport = `const { ${othersText} } = require('${oldImportModule}');`; + return [ + ...usageEdits, declaration.replace(`${modifiedOldImport}${EOL}${newImportStatement}`), - ); - } else { - allEdits.push(declaration.replace(newImportStatement)); + ]; } - return allEdits; + return [...usageEdits, declaration.replace(newImportStatement)]; } return []; } -function findAndReplaceUsages( - rootNode: SgRoot, - localFunctionName: string, - newFunctionName: string, - object: string | null = null, -): Edit[] { - const functionRule = object - ? { - field: 'function', - kind: 'member_expression', - all: [ - { has: { field: 'object', regex: `^${object}$` } }, - { has: { field: 'property', regex: `^${localFunctionName}$` } }, - ], - } - : { - field: 'function', - kind: 'identifier', - regex: `^${localFunctionName}$`, - }; - - const usages = rootNode.root().findAll({ - rule: { - kind: 'call_expression', - has: functionRule, - }, - }); - - return usages - .map((usage) => { - const functionNode = usage.field('function'); - if (!functionNode) return null; - - const nodeToReplace = object - ? functionNode.field('property') - : functionNode; - return nodeToReplace ? nodeToReplace.replace(newFunctionName) : null; - }) - .filter((edit): edit is Edit => Boolean(edit)); -} - -function handleRequire(statement: SgNode, rootNode: SgRoot): Edit[] { - const idNode = statement.child(0); - const declaration = statement.parent(); - - if (!idNode || !declaration) return []; - - const kind = idNode.kind(); - - if (kind === 'identifier') - return handleNamespaceImport( - rootNode, - idNode.text(), - declaration, - 'require', - ); - - if (kind === 'object_pattern') - return handleDestructuredImport(rootNode, idNode, declaration, 'require'); - - return []; -} function handleStaticImport( statement: SgNode, @@ -241,37 +136,19 @@ function handleStaticImport( const content = importClause.child(0); if (!content) return []; + const resolved = resolveBindingPath(statement, `$.${oldFunctionName}`); + if (!resolved) return []; + + const usageEdits = replaceUsagesForResolvedPath(rootNode, resolved); + // Namespace imports: import * as ns from '...' if (content.kind() === 'namespace_import') { - const ns = content.find({ rule: { kind: 'identifier' } })?.text(); - if (!ns) return []; - - const usages = rootNode.root().findAll({ - rule: { - kind: 'call_expression', - has: { - field: 'function', - kind: 'member_expression', - all: [ - { has: { field: 'object', regex: `^${ns}$` } }, - { has: { field: 'property', regex: `^${oldFunctionName}$` } }, - ], - }, - }, - }); - if (!usages.length) return []; - - const edits = usages - .map((u) => - u.field('function')?.replace(`${newNamespace}.${newImportFunction}`), - ) - .filter(Boolean); - edits.push( + return [ + ...usageEdits, statement.replace( `import * as ${newNamespace} from '${newImportModule}';`, ), - ); - return edits as Edit[]; + ]; } // Named imports: import { x } from '...' @@ -279,28 +156,22 @@ function handleStaticImport( const specs = content .children() .filter((c) => c.kind() === 'import_specifier'); - const target = specs.find( - (s) => s.field('name')?.text() === oldFunctionName, + const otherSpecs = specs.filter( + (s) => s.field('name')?.text() !== oldFunctionName, ); - if (!target) return []; - - const aliasNode = target.field('alias'); - const localName = aliasNode?.text() || target.field('name')?.text() || ''; - const edits = aliasNode - ? [] - : findAndReplaceUsages(rootNode, localName, newImportFunction); - const newSpec = aliasNode - ? `{ ${newImportFunction} as ${localName} }` + const isAliased = resolved !== oldFunctionName; + const aliasSeparator = ' as'; + const newSpec = isAliased + ? `{ ${newImportFunction}${aliasSeparator} ${resolved} }` : `{ ${newImportFunction} }`; const newStmt = `import ${newSpec} from '${newImportModule}';`; - const others = specs.filter((s) => s !== target); return [ - ...edits, - others.length + ...usageEdits, + otherSpecs.length ? statement.replace( - `import { ${others.map((s) => s.text()).join(', ')} } from '${oldImportModule}';${EOL}${newStmt}`, + `import { ${otherSpecs.map((s) => s.text()).join(', ')} } from '${oldImportModule}';${EOL}${newStmt}`, ) : statement.replace(newStmt), ]; @@ -320,43 +191,24 @@ function handleDynamicImport( // must be `const ... = await import(...)` and have a parent declaration if (valueNode?.kind() !== 'await_expression' || !declaration) return []; - // Case 1: `const ns = await import(...)` - if (idNode?.kind() === 'identifier') { - const localNamespace = idNode.text(); - if (!localNamespace) return []; - - const usages = rootNode.root().findAll({ - rule: { - kind: 'call_expression', - has: { - field: 'function', - kind: 'member_expression', - all: [ - { has: { field: 'object', regex: `^${localNamespace}$` } }, - { has: { field: 'property', regex: `^${oldFunctionName}$` } }, - ], - }, - }, - }); + const resolved = resolveBindingPath(statement, `$.${oldFunctionName}`); + if (!resolved) return []; - if (!usages.length) return []; + const usageEdits = replaceUsagesForResolvedPath(rootNode, resolved); - const edits = usages - .map((u) => - u.field('function')?.replace(`${newNamespace}.${newImportFunction}`), - ) - .filter(Boolean) as Edit[]; - - edits.push( + // Case 1: `const ns = await import(...)` + if (idNode?.kind() === 'identifier') { + return [ + ...usageEdits, declaration.replace( `const ${newNamespace} = await import('${newImportModule}');`, ), - ); - return edits; + ]; } // Case 2: `const { ... } = await import(...)` if (idNode?.kind() === 'object_pattern') { + const isAliased = resolved !== oldFunctionName; const specifiers = idNode .children() .filter( @@ -365,45 +217,27 @@ function handleDynamicImport( c.kind() === 'shorthand_property_identifier_pattern', ); - let targetSpecifier: SgNode | null = null; - let localFunctionName: string | null | undefined = null; - let isAliased = false; - - for (const spec of specifiers) { - const keyNode = spec.kind() === 'pair_pattern' ? spec.field('key') : spec; - if (keyNode?.text() === oldFunctionName) { - targetSpecifier = spec; - isAliased = spec.kind() === 'pair_pattern'; - localFunctionName = isAliased - ? spec.field('value')?.text() - : keyNode.text(); - break; + const otherSpecifiers = specifiers.filter((s) => { + if (s.kind() === 'pair_pattern') { + const key = s.field('key'); + return key?.text() !== oldFunctionName; } - } - - if (!localFunctionName || !targetSpecifier) return []; - - const edits: Edit[] = []; - if (!isAliased) - edits.push( - ...findAndReplaceUsages(rootNode, localFunctionName, newImportFunction), - ); + return s.text() !== oldFunctionName; + }); const newImportSpecifier = isAliased - ? `{ ${newImportFunction}: ${localFunctionName} }` + ? `{ ${newImportFunction}: ${resolved} }` : `{ ${newImportFunction} }`; - const newImportStmt = `const ${newImportSpecifier} = await import('${newImportModule}');`; - const otherSpecifiers = specifiers.filter((s) => s !== targetSpecifier); - if (otherSpecifiers.length) { - const remaining = `const { ${otherSpecifiers.map((s) => s.text()).join(', ')} } = await import('${oldImportModule}');`; - edits.push(declaration.replace(`${remaining}${EOL}${newImportStmt}`)); - } else { - edits.push(declaration.replace(newImportStmt)); - } - - return edits; + return [ + ...usageEdits, + otherSpecifiers.length + ? declaration.replace( + `const { ${otherSpecifiers.map((s) => s.text()).join(', ')} } = await import('${oldImportModule}');${EOL}${newImportStmt}`, + ) + : declaration.replace(newImportStmt), + ]; } return []; From 19259e0d0f70a62221133cb6254d9a83aba64c8c Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sun, 2 Nov 2025 11:04:59 +0100 Subject: [PATCH 37/43] Update workflow.ts --- .../src/workflow.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/recipes/createCredentials-to-createSecureContext/src/workflow.ts b/recipes/createCredentials-to-createSecureContext/src/workflow.ts index cc4241b6..1da5f78d 100644 --- a/recipes/createCredentials-to-createSecureContext/src/workflow.ts +++ b/recipes/createCredentials-to-createSecureContext/src/workflow.ts @@ -8,6 +8,10 @@ import { resolveBindingPath } from '@nodejs/codemod-utils/ast-grep/resolve-bindi import type { SgRoot, Edit, SgNode } from '@codemod.com/jssg-types/main'; import type Js from '@codemod.com/jssg-types/langs/javascript'; +type SourceHandler = (statement: SgNode, rootNode: SgRoot) => Edit[]; + +type SourceTuple = [SgNode[], SourceHandler]; + const newImportFunction = 'createSecureContext'; const newImportModule = 'node:tls'; const oldFunctionName = 'createCredentials'; @@ -105,9 +109,8 @@ function handleRequire(statement: SgNode, rootNode: SgRoot): Edit[] { return spec.text() !== oldFunctionName; }); - const aliasSeparator = ':'; // require uses object pattern alias const newImportSpecifier = isAliased - ? `{ ${newImportFunction}${aliasSeparator} ${resolved} }` + ? `{ ${newImportFunction}: ${resolved} }` : `{ ${newImportFunction} }`; const newImportStatement = `const ${newImportSpecifier} = require('${newImportModule}');`; @@ -161,9 +164,8 @@ function handleStaticImport( ); const isAliased = resolved !== oldFunctionName; - const aliasSeparator = ' as'; const newSpec = isAliased - ? `{ ${newImportFunction}${aliasSeparator} ${resolved} }` + ? `{ ${newImportFunction} as ${resolved} }` : `{ ${newImportFunction} }`; const newStmt = `import ${newSpec} from '${newImportModule}';`; @@ -246,17 +248,14 @@ function handleDynamicImport( export default function transform(root: SgRoot): string | null { const rootNode = root.root(); const allEdits: Edit[] = []; - const sources: [ - SgNode[] | undefined, - (n: SgNode, r: SgRoot) => Edit[], - ][] = [ + const sources: SourceTuple[] = [ [getNodeRequireCalls(root, 'crypto'), handleRequire], [getNodeImportStatements(root, 'crypto'), handleStaticImport], [getNodeImportCalls(root, 'crypto'), handleDynamicImport], ]; for (const [nodes, handler] of sources) { - for (const node of nodes || []) { + for (const node of nodes) { const edits = handler(node, root); if (edits.length) { From bfb02a38728bb94fa00be30ca0280778bcd82d19 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sun, 2 Nov 2025 22:10:35 +0100 Subject: [PATCH 38/43] Update package-lock.json Update package-lock.json Update package-lock.json Update package-lock.json --- package-lock.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package-lock.json b/package-lock.json index e1fee65f..cac9c220 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1772,6 +1772,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz", "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } From be1de2bfb95b73b5f7c6dac2e310d25be4dfaa19 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sun, 2 Nov 2025 22:27:21 +0100 Subject: [PATCH 39/43] Update package-lock.json --- package-lock.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index cac9c220..18192aef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -402,7 +402,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1574,7 +1573,6 @@ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", "license": "MIT", - "peer": true, "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", @@ -1772,7 +1770,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz", "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -2091,7 +2088,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", From 42ff93b5aad192aa7e2b5bcdedc1528b4b3f0f6f Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sun, 2 Nov 2025 22:30:13 +0100 Subject: [PATCH 40/43] Update package-lock.json --- package-lock.json | 443 +++++++++++++++++++++++----------------------- 1 file changed, 220 insertions(+), 223 deletions(-) diff --git a/package-lock.json b/package-lock.json index 18192aef..944bf453 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,19 @@ "@typescript/native-preview": "^7.0.0-dev.20251027.1" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@ast-grep/cli": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/@ast-grep/cli/-/cli-0.25.7.tgz", @@ -389,30 +402,30 @@ } }, "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==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "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==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", "license": "MIT", "dependencies": { + "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", + "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/remapping": "^2.3.5", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -428,13 +441,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -472,17 +485,17 @@ } }, "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.5", + "@babel/traverse": "^7.27.1", "semver": "^6.3.1" }, "engines": { @@ -502,13 +515,13 @@ } }, "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -528,14 +541,14 @@ } }, "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==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -605,9 +618,9 @@ } }, "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -623,25 +636,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", + "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, "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==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" + "@babel/types": "^7.28.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -759,9 +772,9 @@ } }, "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -791,13 +804,13 @@ } }, "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==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" @@ -827,16 +840,16 @@ } }, "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.28.5" + "@babel/plugin-transform-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -846,9 +859,9 @@ } }, "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.27.1.tgz", + "integrity": "sha512-K13lQpoV54LATKkzBpBAEu1GGSIRzxR9f4IN4V8DCDgiUMo2UDGagEZr3lPeVNJPLkWUi5JE4hCHKneVTwQlYQ==", "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", @@ -879,17 +892,17 @@ } }, "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==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", + "@babel/generator": "^7.28.0", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", + "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", + "@babel/types": "^7.28.0", "debug": "^4.3.1" }, "engines": { @@ -897,13 +910,13 @@ } }, "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==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1273,31 +1286,10 @@ "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", - "iconv-lite": "^0.7.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, "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==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", + "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", "license": "MIT", "engines": { "node": ">=18" @@ -1321,9 +1313,9 @@ } }, "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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "license": "MIT", "engines": { "node": ">=12" @@ -1333,9 +1325,9 @@ } }, "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==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "license": "MIT", "engines": { "node": ">=12" @@ -1368,9 +1360,9 @@ } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -1409,16 +1401,6 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, - "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", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1435,9 +1417,9 @@ "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==", + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1487,10 +1469,6 @@ "resolved": "recipes/create-require-from-path", "link": true }, - "node_modules/@nodejs/createcredentials-to-createsecurecontext": { - "resolved": "recipes/createcredentials-to-createsecurecontext", - "link": true - }, "node_modules/@nodejs/crypto-fips-to-getFips": { "resolved": "recipes/crypto-fips-to-getFips", "link": true @@ -1766,9 +1744,9 @@ } }, "node_modules/@types/node": { - "version": "24.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz", - "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", + "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", "license": "MIT", "dependencies": { "undici-types": "~7.16.0" @@ -1785,28 +1763,28 @@ } }, "node_modules/@typescript/native-preview": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-PwWO+XO8yFZaDYiOW/lXYLDqeCaSkm+Ku/yvnGB19sdZ62514JeCtC3xSChVH8Cr1FLGgdSpsnn1ACp3Y48FqA==", + "version": "7.0.0-dev.20251027.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20251027.1.tgz", + "integrity": "sha512-djbOSIm8Or967wMuO209ydMp2nq34hEulah1EhjUsLSqLplsbOk8RSOyVJJphU+CMP33rULDcnDAzvylU8Tq9Q==", "dev": true, "license": "Apache-2.0", "bin": { "tsgo": "bin/tsgo.js" }, "optionalDependencies": { - "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20251102.1", - "@typescript/native-preview-darwin-x64": "7.0.0-dev.20251102.1", - "@typescript/native-preview-linux-arm": "7.0.0-dev.20251102.1", - "@typescript/native-preview-linux-arm64": "7.0.0-dev.20251102.1", - "@typescript/native-preview-linux-x64": "7.0.0-dev.20251102.1", - "@typescript/native-preview-win32-arm64": "7.0.0-dev.20251102.1", - "@typescript/native-preview-win32-x64": "7.0.0-dev.20251102.1" + "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20251027.1", + "@typescript/native-preview-darwin-x64": "7.0.0-dev.20251027.1", + "@typescript/native-preview-linux-arm": "7.0.0-dev.20251027.1", + "@typescript/native-preview-linux-arm64": "7.0.0-dev.20251027.1", + "@typescript/native-preview-linux-x64": "7.0.0-dev.20251027.1", + "@typescript/native-preview-win32-arm64": "7.0.0-dev.20251027.1", + "@typescript/native-preview-win32-x64": "7.0.0-dev.20251027.1" } }, "node_modules/@typescript/native-preview-darwin-arm64": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-AO2U9EWVO766Y9HTd3emULxpfe2QDdHjResXGQfNlgyFKUdfcKWZowBQllHOAT6J7Ll4qYcIt1Sw9wtQq+n2mQ==", + "version": "7.0.0-dev.20251027.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20251027.1.tgz", + "integrity": "sha512-4Nysrmep6Z4C722nQF07XkEk22qyI2/vCfvfPSlhOxpJJcIFAroxSkSH7Qy8EDZWhNer9D4CMTYX9q5I8B75lQ==", "cpu": [ "arm64" ], @@ -1818,9 +1796,9 @@ ] }, "node_modules/@typescript/native-preview-darwin-x64": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-8DACSF3+1Kq022ofqEdFXUj5A/OJdQI3845tOfdeJHZFJTxiD0X4Q0wcZlDgLubuNJCN8lPO2RGjmWpbmIqxZg==", + "version": "7.0.0-dev.20251027.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20251027.1.tgz", + "integrity": "sha512-WvHLb6Mry214ZTuhfvv6fP1FLgYZ4oTw55+B2hTAo/O6qq9KX3OW90dvFYSMJKPhgvWR5B9tIEcMkIXGjxfv1w==", "cpu": [ "x64" ], @@ -1832,9 +1810,9 @@ ] }, "node_modules/@typescript/native-preview-linux-arm": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-bzOrxNpvI4mJEyR56A2XAqvImtwhR0v52HCDHxGDar6WXfyjDoISw9SD9mPNWUNbqBuU7i6Z2jKMwXt+33Mozw==", + "version": "7.0.0-dev.20251027.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20251027.1.tgz", + "integrity": "sha512-epAynE0qbU9nuPwaOgr9N6WANoYAdwhyteNB+PG2qRWYoFDYPXSgParjO1FAkY0uMt88QaS6vQ6ZglInHsxvXQ==", "cpu": [ "arm" ], @@ -1846,9 +1824,9 @@ ] }, "node_modules/@typescript/native-preview-linux-arm64": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-99b3L81QnTGEqU4KrV2/siiK8vK1swo8P+MEprn2CoO9Y5PHAf5pbOCAXp5Wq2e0lyKWl0NGW/cqvWk7FBndfQ==", + "version": "7.0.0-dev.20251027.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20251027.1.tgz", + "integrity": "sha512-CNbTvppx8wsoRS3g4RcpDapRp4tNYp1eu+94HmtKT7ch3RJOliKIhAa/8odXIrkqnT+kc0wrQCzFiICMW4YieQ==", "cpu": [ "arm64" ], @@ -1860,9 +1838,9 @@ ] }, "node_modules/@typescript/native-preview-linux-x64": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-1yz7uhuEFeoG9r2w5CZqFSvFmqr0ptzv/ZpOxFMu+95YxDvk1NVKUkZXEneOWa+mK/7GymrwbB41bVdl8HtaEw==", + "version": "7.0.0-dev.20251027.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20251027.1.tgz", + "integrity": "sha512-lzSUTdWYfKvsQJPQF/BtYil1Xmzn0f3jpgk8/4uVg4NQeDtzW0J3ceWl2lw1TuGnhISq2dwyupjKJfLQhe4AVQ==", "cpu": [ "x64" ], @@ -1874,9 +1852,9 @@ ] }, "node_modules/@typescript/native-preview-win32-arm64": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-U0ay+amC8ZmmnNEitccixJfLKra8MaKgbGdNQBSZP1jelGCgNgCLl5DEpla5ElVxTcfcVYkAVWpjjiGaaNuZTQ==", + "version": "7.0.0-dev.20251027.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20251027.1.tgz", + "integrity": "sha512-K9K8t3HW/35ejgVJALPW9Fqo0PHOxh1/ir01C8r5qbhIdPQqwGlBHAGwLzrfH0ZF1R2nR2X4T+z+gB8tLULsow==", "cpu": [ "arm64" ], @@ -1888,9 +1866,9 @@ ] }, "node_modules/@typescript/native-preview-win32-x64": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-4Y4K70O7w34P81o/SD0tcpC2daVJcXCn3t/efjq64BMO9XTyEXLpiVVJ+BGGQTFmvgkGYGR6vHbCZTm2WizcVg==", + "version": "7.0.0-dev.20251027.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20251027.1.tgz", + "integrity": "sha512-n7hb7ZjAEgoNBWYSt87+eMtSK2h6Xl9NWUd2ocw3Znz/tw8lwpUaG35FVd/Aj72kT1/5kiCBlM+7MxA214KGiw==", "cpu": [ "x64" ], @@ -2022,15 +2000,6 @@ ], "license": "MIT" }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.23", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.23.tgz", - "integrity": "sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, "node_modules/before-after-hook": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", @@ -2070,9 +2039,9 @@ } }, "node_modules/browserslist": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", - "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz", + "integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==", "funding": [ { "type": "opencollective", @@ -2089,11 +2058,10 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.19", - "caniuse-lite": "^1.0.30001751", - "electron-to-chromium": "^1.5.238", - "node-releases": "^2.0.26", - "update-browserslist-db": "^1.1.4" + "caniuse-lite": "^1.0.30001733", + "electron-to-chromium": "^1.5.199", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -2146,9 +2114,9 @@ } }, "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==", + "version": "1.0.30001734", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001734.tgz", + "integrity": "sha512-uhE1Ye5vgqju6OI71HTQqcBCZrvHugk0MjLak7Q+HfoBgoq5Bi+5YnwjP4fjDgrtYr/l8MVRBvzz9dPD4KyK0A==", "funding": [ { "type": "opencollective", @@ -2182,9 +2150,9 @@ } }, "node_modules/chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "license": "MIT" }, "node_modules/charenc": { @@ -2336,9 +2304,9 @@ } }, "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2395,15 +2363,12 @@ "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==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", + "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", "license": "MIT", "engines": { "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/detect-libc": { @@ -2467,9 +2432,9 @@ "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==", + "version": "1.5.200", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.200.tgz", + "integrity": "sha512-rFCxROw7aOe4uPTfIAx+rXv9cEcGx+buAF4npnhtTqCJk5KDFRnh3+KYj7rdVh6lsFt5/aPs+Irj9rZ33WMA7w==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -2566,6 +2531,20 @@ "node": ">=6" } }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/filename-reserved-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", @@ -2632,9 +2611,9 @@ } }, "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==", + "version": "0.278.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.278.0.tgz", + "integrity": "sha512-9oUcYDHf9n+E/t0FXndgBqGbaUsGEcmWqIr1ldqCzTzctsJV5E/bHusOj4ThB72Ss2mqWpLFNz0+o2c1O8J6+A==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -2876,19 +2855,15 @@ } }, "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==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/ieee754": { @@ -2938,15 +2913,15 @@ "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==", + "version": "9.3.7", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.7.tgz", + "integrity": "sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==", "license": "MIT", "dependencies": { - "@inquirer/external-editor": "^1.0.2", "@inquirer/figures": "^1.0.3", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", + "external-editor": "^3.1.0", "mute-stream": "1.0.0", "ora": "^5.4.1", "run-async": "^3.0.0", @@ -3207,12 +3182,12 @@ } }, "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==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/make-dir": { @@ -3420,9 +3395,9 @@ } }, "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==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "license": "MIT" }, "node_modules/once": { @@ -3470,9 +3445,9 @@ } }, "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==", + "version": "18.19.122", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.122.tgz", + "integrity": "sha512-yzegtT82dwTNEe/9y+CM8cgb42WrUfMMCg2QqSddzO1J6uPmBD7qKCZ7dOHZP2Yrpm/kb0eqdNMn2MUyEiqBmA==", "license": "MIT", "dependencies": { "undici-types": "~5.26.4" @@ -3507,6 +3482,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -3888,9 +3872,9 @@ } }, "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==", + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz", + "integrity": "sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==", "license": "MIT", "dependencies": { "@kwsites/file-exists": "^1.1.1", @@ -4014,6 +3998,18 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4084,9 +4080,9 @@ "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==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "funding": [ { "type": "opencollective", @@ -4242,9 +4238,9 @@ } }, "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==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", "license": "MIT", "engines": { "node": ">=18" @@ -4291,9 +4287,10 @@ "@codemod.com/jssg-types": "^1.0.9" } }, - "recipes/createcredentials-to-createsecurecontext": { - "name": "@nodejs/createcredentials-to-createsecurecontext", + "recipes/crypto-fips": { + "name": "@nodejs/crypto-fips", "version": "1.0.0", + "extraneous": true, "license": "MIT", "dependencies": { "@nodejs/codemod-utils": "*" From 96f75b5fb2153402a568b241cdfcebd50e3f0034 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sun, 2 Nov 2025 22:33:07 +0100 Subject: [PATCH 41/43] Update package-lock.json --- package-lock.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/package-lock.json b/package-lock.json index 944bf453..79241ccf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1469,6 +1469,10 @@ "resolved": "recipes/create-require-from-path", "link": true }, + "node_modules/@nodejs/createcredentials-to-createsecurecontext": { + "resolved": "recipes/createcredentials-to-createsecurecontext", + "link": true + }, "node_modules/@nodejs/crypto-fips-to-getFips": { "resolved": "recipes/crypto-fips-to-getFips", "link": true @@ -4287,6 +4291,17 @@ "@codemod.com/jssg-types": "^1.0.9" } }, + "recipes/createcredentials-to-createsecurecontext": { + "name": "@nodejs/createcredentials-to-createsecurecontext", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@nodejs/codemod-utils": "*" + }, + "devDependencies": { + "@codemod.com/jssg-types": "^1.0.9" + } + }, "recipes/crypto-fips": { "name": "@nodejs/crypto-fips", "version": "1.0.0", From 17c887f8c0d804b3e25ea65d61ec8255997e3d17 Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Sun, 2 Nov 2025 22:44:48 +0100 Subject: [PATCH 42/43] Update package-lock.json --- package-lock.json | 446 ++++++++++++++++++++++------------------------ 1 file changed, 217 insertions(+), 229 deletions(-) diff --git a/package-lock.json b/package-lock.json index 79241ccf..18192aef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,19 +18,6 @@ "@typescript/native-preview": "^7.0.0-dev.20251027.1" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@ast-grep/cli": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/@ast-grep/cli/-/cli-0.25.7.tgz", @@ -402,30 +389,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "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" } }, "node_modules/@babel/core": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", + "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": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.28.0", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -441,13 +428,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "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.0", - "@babel/types": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -485,17 +472,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "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.1", - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", + "@babel/traverse": "^7.28.5", "semver": "^6.3.1" }, "engines": { @@ -515,13 +502,13 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "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.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -541,14 +528,14 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "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", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -618,9 +605,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "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" @@ -636,25 +623,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", - "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", + "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", - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "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.0" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -772,9 +759,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "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", @@ -804,13 +791,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", - "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "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", - "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" @@ -840,16 +827,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", - "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "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", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.27.1" + "@babel/plugin-transform-typescript": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -859,9 +846,9 @@ } }, "node_modules/@babel/register": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.27.1.tgz", - "integrity": "sha512-K13lQpoV54LATKkzBpBAEu1GGSIRzxR9f4IN4V8DCDgiUMo2UDGagEZr3lPeVNJPLkWUi5JE4hCHKneVTwQlYQ==", + "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", @@ -892,17 +879,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "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", - "@babel/generator": "^7.28.0", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { @@ -910,13 +897,13 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "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", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1286,10 +1273,31 @@ "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", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/figures": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", - "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", + "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" @@ -1313,9 +1321,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "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" @@ -1325,9 +1333,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "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" @@ -1360,9 +1368,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "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" @@ -1401,6 +1409,16 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "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", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1417,9 +1435,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "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", @@ -1748,9 +1766,9 @@ } }, "node_modules/@types/node": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", - "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", + "version": "24.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz", + "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", "license": "MIT", "dependencies": { "undici-types": "~7.16.0" @@ -1767,28 +1785,28 @@ } }, "node_modules/@typescript/native-preview": { - "version": "7.0.0-dev.20251027.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20251027.1.tgz", - "integrity": "sha512-djbOSIm8Or967wMuO209ydMp2nq34hEulah1EhjUsLSqLplsbOk8RSOyVJJphU+CMP33rULDcnDAzvylU8Tq9Q==", + "version": "7.0.0-dev.20251102.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20251102.1.tgz", + "integrity": "sha512-PwWO+XO8yFZaDYiOW/lXYLDqeCaSkm+Ku/yvnGB19sdZ62514JeCtC3xSChVH8Cr1FLGgdSpsnn1ACp3Y48FqA==", "dev": true, "license": "Apache-2.0", "bin": { "tsgo": "bin/tsgo.js" }, "optionalDependencies": { - "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20251027.1", - "@typescript/native-preview-darwin-x64": "7.0.0-dev.20251027.1", - "@typescript/native-preview-linux-arm": "7.0.0-dev.20251027.1", - "@typescript/native-preview-linux-arm64": "7.0.0-dev.20251027.1", - "@typescript/native-preview-linux-x64": "7.0.0-dev.20251027.1", - "@typescript/native-preview-win32-arm64": "7.0.0-dev.20251027.1", - "@typescript/native-preview-win32-x64": "7.0.0-dev.20251027.1" + "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20251102.1", + "@typescript/native-preview-darwin-x64": "7.0.0-dev.20251102.1", + "@typescript/native-preview-linux-arm": "7.0.0-dev.20251102.1", + "@typescript/native-preview-linux-arm64": "7.0.0-dev.20251102.1", + "@typescript/native-preview-linux-x64": "7.0.0-dev.20251102.1", + "@typescript/native-preview-win32-arm64": "7.0.0-dev.20251102.1", + "@typescript/native-preview-win32-x64": "7.0.0-dev.20251102.1" } }, "node_modules/@typescript/native-preview-darwin-arm64": { - "version": "7.0.0-dev.20251027.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20251027.1.tgz", - "integrity": "sha512-4Nysrmep6Z4C722nQF07XkEk22qyI2/vCfvfPSlhOxpJJcIFAroxSkSH7Qy8EDZWhNer9D4CMTYX9q5I8B75lQ==", + "version": "7.0.0-dev.20251102.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20251102.1.tgz", + "integrity": "sha512-AO2U9EWVO766Y9HTd3emULxpfe2QDdHjResXGQfNlgyFKUdfcKWZowBQllHOAT6J7Ll4qYcIt1Sw9wtQq+n2mQ==", "cpu": [ "arm64" ], @@ -1800,9 +1818,9 @@ ] }, "node_modules/@typescript/native-preview-darwin-x64": { - "version": "7.0.0-dev.20251027.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20251027.1.tgz", - "integrity": "sha512-WvHLb6Mry214ZTuhfvv6fP1FLgYZ4oTw55+B2hTAo/O6qq9KX3OW90dvFYSMJKPhgvWR5B9tIEcMkIXGjxfv1w==", + "version": "7.0.0-dev.20251102.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20251102.1.tgz", + "integrity": "sha512-8DACSF3+1Kq022ofqEdFXUj5A/OJdQI3845tOfdeJHZFJTxiD0X4Q0wcZlDgLubuNJCN8lPO2RGjmWpbmIqxZg==", "cpu": [ "x64" ], @@ -1814,9 +1832,9 @@ ] }, "node_modules/@typescript/native-preview-linux-arm": { - "version": "7.0.0-dev.20251027.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20251027.1.tgz", - "integrity": "sha512-epAynE0qbU9nuPwaOgr9N6WANoYAdwhyteNB+PG2qRWYoFDYPXSgParjO1FAkY0uMt88QaS6vQ6ZglInHsxvXQ==", + "version": "7.0.0-dev.20251102.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20251102.1.tgz", + "integrity": "sha512-bzOrxNpvI4mJEyR56A2XAqvImtwhR0v52HCDHxGDar6WXfyjDoISw9SD9mPNWUNbqBuU7i6Z2jKMwXt+33Mozw==", "cpu": [ "arm" ], @@ -1828,9 +1846,9 @@ ] }, "node_modules/@typescript/native-preview-linux-arm64": { - "version": "7.0.0-dev.20251027.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20251027.1.tgz", - "integrity": "sha512-CNbTvppx8wsoRS3g4RcpDapRp4tNYp1eu+94HmtKT7ch3RJOliKIhAa/8odXIrkqnT+kc0wrQCzFiICMW4YieQ==", + "version": "7.0.0-dev.20251102.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20251102.1.tgz", + "integrity": "sha512-99b3L81QnTGEqU4KrV2/siiK8vK1swo8P+MEprn2CoO9Y5PHAf5pbOCAXp5Wq2e0lyKWl0NGW/cqvWk7FBndfQ==", "cpu": [ "arm64" ], @@ -1842,9 +1860,9 @@ ] }, "node_modules/@typescript/native-preview-linux-x64": { - "version": "7.0.0-dev.20251027.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20251027.1.tgz", - "integrity": "sha512-lzSUTdWYfKvsQJPQF/BtYil1Xmzn0f3jpgk8/4uVg4NQeDtzW0J3ceWl2lw1TuGnhISq2dwyupjKJfLQhe4AVQ==", + "version": "7.0.0-dev.20251102.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20251102.1.tgz", + "integrity": "sha512-1yz7uhuEFeoG9r2w5CZqFSvFmqr0ptzv/ZpOxFMu+95YxDvk1NVKUkZXEneOWa+mK/7GymrwbB41bVdl8HtaEw==", "cpu": [ "x64" ], @@ -1856,9 +1874,9 @@ ] }, "node_modules/@typescript/native-preview-win32-arm64": { - "version": "7.0.0-dev.20251027.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20251027.1.tgz", - "integrity": "sha512-K9K8t3HW/35ejgVJALPW9Fqo0PHOxh1/ir01C8r5qbhIdPQqwGlBHAGwLzrfH0ZF1R2nR2X4T+z+gB8tLULsow==", + "version": "7.0.0-dev.20251102.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20251102.1.tgz", + "integrity": "sha512-U0ay+amC8ZmmnNEitccixJfLKra8MaKgbGdNQBSZP1jelGCgNgCLl5DEpla5ElVxTcfcVYkAVWpjjiGaaNuZTQ==", "cpu": [ "arm64" ], @@ -1870,9 +1888,9 @@ ] }, "node_modules/@typescript/native-preview-win32-x64": { - "version": "7.0.0-dev.20251027.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20251027.1.tgz", - "integrity": "sha512-n7hb7ZjAEgoNBWYSt87+eMtSK2h6Xl9NWUd2ocw3Znz/tw8lwpUaG35FVd/Aj72kT1/5kiCBlM+7MxA214KGiw==", + "version": "7.0.0-dev.20251102.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20251102.1.tgz", + "integrity": "sha512-4Y4K70O7w34P81o/SD0tcpC2daVJcXCn3t/efjq64BMO9XTyEXLpiVVJ+BGGQTFmvgkGYGR6vHbCZTm2WizcVg==", "cpu": [ "x64" ], @@ -2004,6 +2022,15 @@ ], "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.23", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.23.tgz", + "integrity": "sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/before-after-hook": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", @@ -2043,9 +2070,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz", - "integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", "funding": [ { "type": "opencollective", @@ -2062,10 +2089,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001733", - "electron-to-chromium": "^1.5.199", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" @@ -2118,9 +2146,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001734", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001734.tgz", - "integrity": "sha512-uhE1Ye5vgqju6OI71HTQqcBCZrvHugk0MjLak7Q+HfoBgoq5Bi+5YnwjP4fjDgrtYr/l8MVRBvzz9dPD4KyK0A==", + "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", @@ -2154,9 +2182,9 @@ } }, "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "license": "MIT" }, "node_modules/charenc": { @@ -2308,9 +2336,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "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" @@ -2367,12 +2395,15 @@ "license": "ISC" }, "node_modules/detect-indent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", - "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/detect-libc": { @@ -2436,9 +2467,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.200", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.200.tgz", - "integrity": "sha512-rFCxROw7aOe4uPTfIAx+rXv9cEcGx+buAF4npnhtTqCJk5KDFRnh3+KYj7rdVh6lsFt5/aPs+Irj9rZ33WMA7w==", + "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": { @@ -2535,20 +2566,6 @@ "node": ">=6" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/filename-reserved-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", @@ -2615,9 +2632,9 @@ } }, "node_modules/flow-parser": { - "version": "0.278.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.278.0.tgz", - "integrity": "sha512-9oUcYDHf9n+E/t0FXndgBqGbaUsGEcmWqIr1ldqCzTzctsJV5E/bHusOj4ThB72Ss2mqWpLFNz0+o2c1O8J6+A==", + "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" @@ -2859,15 +2876,19 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "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" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/ieee754": { @@ -2917,15 +2938,15 @@ "license": "ISC" }, "node_modules/inquirer": { - "version": "9.3.7", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.7.tgz", - "integrity": "sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==", + "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", "@inquirer/figures": "^1.0.3", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", - "external-editor": "^3.1.0", "mute-stream": "1.0.0", "ora": "^5.4.1", "run-async": "^3.0.0", @@ -3186,12 +3207,12 @@ } }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "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.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/make-dir": { @@ -3399,9 +3420,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "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": { @@ -3449,9 +3470,9 @@ } }, "node_modules/openai/node_modules/@types/node": { - "version": "18.19.122", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.122.tgz", - "integrity": "sha512-yzegtT82dwTNEe/9y+CM8cgb42WrUfMMCg2QqSddzO1J6uPmBD7qKCZ7dOHZP2Yrpm/kb0eqdNMn2MUyEiqBmA==", + "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" @@ -3486,15 +3507,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -3876,9 +3888,9 @@ } }, "node_modules/simple-git": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz", - "integrity": "sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==", + "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", @@ -4002,18 +4014,6 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4084,9 +4084,9 @@ "license": "ISC" }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "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", @@ -4242,9 +4242,9 @@ } }, "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "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" @@ -4302,18 +4302,6 @@ "@codemod.com/jssg-types": "^1.0.9" } }, - "recipes/crypto-fips": { - "name": "@nodejs/crypto-fips", - "version": "1.0.0", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@nodejs/codemod-utils": "*" - }, - "devDependencies": { - "@codemod.com/jssg-types": "^1.0.9" - } - }, "recipes/crypto-fips-to-getFips": { "name": "@nodejs/crypto-fips-to-getFips", "version": "1.0.0", From f7e605a19a3488b85664ea672411bd3c60a12a8d Mon Sep 17 00:00:00 2001 From: Augustin Mauroy <97875033+AugustinMauroy@users.noreply.github.com> Date: Tue, 4 Nov 2025 22:54:05 +0100 Subject: [PATCH 43/43] chore: regenerate package-lock.json --- package-lock.json | 81 ++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/package-lock.json b/package-lock.json index 18192aef..97b08fca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -402,6 +402,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1488,7 +1489,7 @@ "link": true }, "node_modules/@nodejs/createcredentials-to-createsecurecontext": { - "resolved": "recipes/createcredentials-to-createsecurecontext", + "resolved": "recipes/createCredentials-to-createSecureContext", "link": true }, "node_modules/@nodejs/crypto-fips-to-getFips": { @@ -1573,6 +1574,7 @@ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", @@ -1766,9 +1768,9 @@ } }, "node_modules/@types/node": { - "version": "24.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz", - "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", + "version": "24.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", + "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", "license": "MIT", "dependencies": { "undici-types": "~7.16.0" @@ -1785,28 +1787,28 @@ } }, "node_modules/@typescript/native-preview": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-PwWO+XO8yFZaDYiOW/lXYLDqeCaSkm+Ku/yvnGB19sdZ62514JeCtC3xSChVH8Cr1FLGgdSpsnn1ACp3Y48FqA==", + "version": "7.0.0-dev.20251104.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20251104.1.tgz", + "integrity": "sha512-jRyx4j67IHO5a512iE7LGT6wD5DgOmedG6nEQkMIRQGiwRnO3ntzk01PBpFXBoNwiBRfQk6PlFTcljkFQT5RbA==", "dev": true, "license": "Apache-2.0", "bin": { "tsgo": "bin/tsgo.js" }, "optionalDependencies": { - "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20251102.1", - "@typescript/native-preview-darwin-x64": "7.0.0-dev.20251102.1", - "@typescript/native-preview-linux-arm": "7.0.0-dev.20251102.1", - "@typescript/native-preview-linux-arm64": "7.0.0-dev.20251102.1", - "@typescript/native-preview-linux-x64": "7.0.0-dev.20251102.1", - "@typescript/native-preview-win32-arm64": "7.0.0-dev.20251102.1", - "@typescript/native-preview-win32-x64": "7.0.0-dev.20251102.1" + "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20251104.1", + "@typescript/native-preview-darwin-x64": "7.0.0-dev.20251104.1", + "@typescript/native-preview-linux-arm": "7.0.0-dev.20251104.1", + "@typescript/native-preview-linux-arm64": "7.0.0-dev.20251104.1", + "@typescript/native-preview-linux-x64": "7.0.0-dev.20251104.1", + "@typescript/native-preview-win32-arm64": "7.0.0-dev.20251104.1", + "@typescript/native-preview-win32-x64": "7.0.0-dev.20251104.1" } }, "node_modules/@typescript/native-preview-darwin-arm64": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-AO2U9EWVO766Y9HTd3emULxpfe2QDdHjResXGQfNlgyFKUdfcKWZowBQllHOAT6J7Ll4qYcIt1Sw9wtQq+n2mQ==", + "version": "7.0.0-dev.20251104.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20251104.1.tgz", + "integrity": "sha512-4I/Xy2saFsrzfRhQ5H6gV2SwICvkS0PV5T+wWD0aKQTsffEFPtTBhUOTaTuzG1FpMMcdO5WC5qSUdIvqcIWD+Q==", "cpu": [ "arm64" ], @@ -1818,9 +1820,9 @@ ] }, "node_modules/@typescript/native-preview-darwin-x64": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-8DACSF3+1Kq022ofqEdFXUj5A/OJdQI3845tOfdeJHZFJTxiD0X4Q0wcZlDgLubuNJCN8lPO2RGjmWpbmIqxZg==", + "version": "7.0.0-dev.20251104.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20251104.1.tgz", + "integrity": "sha512-03ymJ3eg0z9soEmN0Mg8UZPqsG4TwAYPFQLvNT1D8+meGKgihsGgUb05bBYhnvaq0M3HcG7XUJac1molOTxUOA==", "cpu": [ "x64" ], @@ -1832,9 +1834,9 @@ ] }, "node_modules/@typescript/native-preview-linux-arm": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-bzOrxNpvI4mJEyR56A2XAqvImtwhR0v52HCDHxGDar6WXfyjDoISw9SD9mPNWUNbqBuU7i6Z2jKMwXt+33Mozw==", + "version": "7.0.0-dev.20251104.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20251104.1.tgz", + "integrity": "sha512-y+qu91VCz3bjI0m0d6hDCtmk+q2ToFd/Z3tjX1r8OyKgLQeetpdxpUrEZ+Y/uLZTfKXDfcv599IQI2Oma3vEiQ==", "cpu": [ "arm" ], @@ -1846,9 +1848,9 @@ ] }, "node_modules/@typescript/native-preview-linux-arm64": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-99b3L81QnTGEqU4KrV2/siiK8vK1swo8P+MEprn2CoO9Y5PHAf5pbOCAXp5Wq2e0lyKWl0NGW/cqvWk7FBndfQ==", + "version": "7.0.0-dev.20251104.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20251104.1.tgz", + "integrity": "sha512-UM1d8mqyGnkvP3Uvy1GDW+XBQM9Sgl7Up1vGUV0JempuXHPf9fhI8swSBBCyLVVTUAgzxp79q1EvM6ieTkm8VA==", "cpu": [ "arm64" ], @@ -1860,9 +1862,9 @@ ] }, "node_modules/@typescript/native-preview-linux-x64": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-1yz7uhuEFeoG9r2w5CZqFSvFmqr0ptzv/ZpOxFMu+95YxDvk1NVKUkZXEneOWa+mK/7GymrwbB41bVdl8HtaEw==", + "version": "7.0.0-dev.20251104.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20251104.1.tgz", + "integrity": "sha512-TJ2Xh+isYw49Yi/c5vffQROjUHf2UsiSX7VB+Vh3ywVhOC9mEnLGS9L3D5UZguAMiotz1BoqU66GqEge/lbI1A==", "cpu": [ "x64" ], @@ -1874,9 +1876,9 @@ ] }, "node_modules/@typescript/native-preview-win32-arm64": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-U0ay+amC8ZmmnNEitccixJfLKra8MaKgbGdNQBSZP1jelGCgNgCLl5DEpla5ElVxTcfcVYkAVWpjjiGaaNuZTQ==", + "version": "7.0.0-dev.20251104.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20251104.1.tgz", + "integrity": "sha512-DonN+wVOTeIwE72idHOqC2eXJ8pkpNI4DWAwA1DmepFI6TXeWln8yKEyak8yjguPVvvCrJEKvx4q26CVXfWThA==", "cpu": [ "arm64" ], @@ -1888,9 +1890,9 @@ ] }, "node_modules/@typescript/native-preview-win32-x64": { - "version": "7.0.0-dev.20251102.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20251102.1.tgz", - "integrity": "sha512-4Y4K70O7w34P81o/SD0tcpC2daVJcXCn3t/efjq64BMO9XTyEXLpiVVJ+BGGQTFmvgkGYGR6vHbCZTm2WizcVg==", + "version": "7.0.0-dev.20251104.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20251104.1.tgz", + "integrity": "sha512-kMhr8pCKcNBEl5+6q71MkBxMCukJNWQAg4WKsDDfrO5ImhAanHGkNfVD6g0nAPbRP3MjuXo1o4KwPdxyfHXUmg==", "cpu": [ "x64" ], @@ -2023,9 +2025,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.23", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.23.tgz", - "integrity": "sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==", + "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" @@ -2088,6 +2090,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", @@ -4291,7 +4294,7 @@ "@codemod.com/jssg-types": "^1.0.9" } }, - "recipes/createcredentials-to-createsecurecontext": { + "recipes/createCredentials-to-createSecureContext": { "name": "@nodejs/createcredentials-to-createsecurecontext", "version": "1.0.0", "license": "MIT",