├── .gitattributes ├── .prettierrc ├── dist ├── types │ ├── command.d.ts │ ├── npmToPnpm.d.ts │ ├── npmToYarn.d.ts │ ├── yarnToNpm.d.ts │ ├── index.d.ts │ ├── npmToBun.d.ts │ └── utils.d.ts ├── npm-to-yarn.mjs ├── npm-to-yarn.umd.js ├── npm-to-yarn.mjs.map └── npm-to-yarn.umd.js.map ├── .eslintignore ├── .prettierignore ├── .gitignore ├── .editorconfig ├── .eslintrc.js ├── .all-contributorsrc ├── tsconfig.json ├── tsconfig.eslint.json ├── jest.config.js ├── .github ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md ├── FUNDING.yml ├── workflows │ ├── ci.yml │ └── codeql-analysis.yml ├── CONTRIBUTING.md └── CODE_OF_CONDUCT.md ├── src ├── command.ts ├── index.ts ├── utils.ts ├── yarnToNpm.ts ├── npmToBun.ts ├── npmToPnpm.ts └── npmToYarn.ts ├── rollup.config.mjs ├── LICENSE ├── test ├── commands.spec.ts └── index.spec.ts ├── package.json ├── README.md └── test.html /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /dist/types/command.d.ts: -------------------------------------------------------------------------------- 1 | export declare function parse(command: string): string[]; 2 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | coverage 4 | browser-tests 5 | rollup.config.ts 6 | build 7 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist 2 | build 3 | coverage 4 | .rpt2_cache 5 | node_modules 6 | docs 7 | tools 8 | -------------------------------------------------------------------------------- /dist/types/npmToPnpm.d.ts: -------------------------------------------------------------------------------- 1 | export declare function npmToPnpm(_m: string, command: string): string; 2 | -------------------------------------------------------------------------------- /dist/types/npmToYarn.d.ts: -------------------------------------------------------------------------------- 1 | export declare function npmToYarn(_m: string, command: string): string; 2 | -------------------------------------------------------------------------------- /dist/types/yarnToNpm.d.ts: -------------------------------------------------------------------------------- 1 | export declare function yarnToNPM(_m: string, command: string): string; 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | coverage 3 | .nyc_output 4 | .DS_Store 5 | *.log 6 | .vscode 7 | .idea 8 | compiled 9 | .awcache 10 | .rpt2_cache 11 | docs 12 | build 13 | -------------------------------------------------------------------------------- /dist/types/index.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Converts between npm and yarn command 3 | */ 4 | export default function convert(str: string, to: 'npm' | 'yarn' | 'pnpm' | 'bun'): string; 5 | -------------------------------------------------------------------------------- /dist/types/npmToBun.d.ts: -------------------------------------------------------------------------------- 1 | export declare const bunCLICommands: readonly ["init", "run", "add", "pm", "help", "install", "remove", "upgrade", "version"]; 2 | export declare function npmToBun(_m: string, command: string): string; 3 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | #root = true 2 | 3 | [*] 4 | indent_style = space 5 | end_of_line = lf 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | max_line_length = 100 10 | indent_size = 2 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /dist/types/utils.d.ts: -------------------------------------------------------------------------------- 1 | export declare const unchangedCLICommands: string[]; 2 | export declare const yarnCLICommands: string[]; 3 | export declare const npmCLICommands: string[]; 4 | export declare const executorCommands: { 5 | npm: string; 6 | yarn: string; 7 | pnpm: string; 8 | bun: string; 9 | }; 10 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | node: true 5 | }, 6 | extends: [ 7 | 'eslint:recommended', 8 | 'plugin:@typescript-eslint/eslint-recommended', 9 | 'plugin:@typescript-eslint/recommended', 10 | 'prettier' 11 | ], 12 | parser: '@typescript-eslint/parser', 13 | parserOptions: { 14 | project: 'tsconfig.eslint.json', 15 | sourceType: 'module' 16 | }, 17 | plugins: ['@typescript-eslint'] 18 | } 19 | -------------------------------------------------------------------------------- /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "files": [ 3 | "README.md" 4 | ], 5 | "imageSize": 100, 6 | "commit": false, 7 | "contributors": [], 8 | "contributorsPerLine": 7, 9 | "projectName": "npm-to-yarn", 10 | "projectOwner": "nebrelbug", 11 | "repoType": "github", 12 | "repoHost": "https://github.com", 13 | "skipCi": true, 14 | "badgeTemplate": "[logo]: https://img.shields.io/badge/all_contributors-<%= contributors.length %>-orange.svg 'Number of contributors on All-Contributors'" 15 | } 16 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "moduleResolution": "node", 4 | "target": "es5", 5 | "module": "es2015", 6 | "lib": ["es2015", "es2016", "es2017", "dom"], 7 | "strict": true, 8 | "sourceMap": true, 9 | "declaration": true, 10 | "allowSyntheticDefaultImports": true, 11 | "experimentalDecorators": true, 12 | "emitDecoratorMetadata": true, 13 | "declarationDir": "dist/types", 14 | "outDir": "build" 15 | }, 16 | "include": ["src"], 17 | "exclude": ["node_modules", "typings"] 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.eslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "moduleResolution": "node", 4 | "target": "es5", 5 | "module": "es2015", 6 | "lib": ["es2015", "es2016", "es2017", "dom"], 7 | "strict": true, 8 | "sourceMap": true, 9 | "declaration": true, 10 | "allowSyntheticDefaultImports": true, 11 | "experimentalDecorators": true, 12 | "emitDecoratorMetadata": true, 13 | "declarationDir": "dist/types", 14 | "outDir": "build" 15 | }, 16 | "include": ["src", "test", "examples"], 17 | "exclude": ["node_modules", "typings"] 18 | } 19 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | // @ts-check 4 | /** @type {import('@jest/types').Config.InitialOptions} */ 5 | module.exports = { 6 | transform: { 7 | '.(ts)': 'ts-jest' 8 | }, 9 | testEnvironment: 'node', 10 | testRegex: '(/test/.*|\\.(test|spec))\\.(ts|js)$', 11 | moduleFileExtensions: ['ts', 'js'], 12 | coveragePathIgnorePatterns: ['/node_modules/', '/test/'], 13 | coverageThreshold: { 14 | global: { 15 | branches: 80, 16 | functions: 95, 17 | lines: 95, 18 | statements: 95 19 | } 20 | }, 21 | collectCoverageFrom: ['src/*.ts'] 22 | } 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 🚀 Feature request 3 | about: Suggest an idea for this project 4 | --- 5 | 6 | **Is your feature request related to a problem? Please describe.** 7 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 8 | 9 | **Describe the solution you'd like** 10 | A clear and concise description of what you want to happen. 11 | 12 | **Describe alternatives you've considered** 13 | A clear and concise description of any alternative solutions or features you've considered. 14 | 15 | **Additional context** 16 | Add any other context or screenshots about the feature request here. 17 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 🐛 Bug report 3 | about: Create a report to help us improve 4 | --- 5 | 6 | **Describe the bug** 7 | A clear and concise description of what the bug is. 8 | 9 | **To Reproduce** 10 | Steps to reproduce the behavior: 11 | 12 | 1. Type in '...' 13 | 2. Call function '...' 14 | 3. Look at result in '...' 15 | 16 | **Expected behavior** 17 | A clear and concise description of what you expected to happen. 18 | 19 | **Screenshots** 20 | If applicable, add screenshots to help explain your problem. 21 | 22 | **Package & Environment Details** 23 | 24 | - Environment: ex. Node, Chrome, Firefox, etc. and what version 25 | - Version: ex. 8.1.0 26 | 27 | **Additional context** 28 | Add any other context about the problem here. 29 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: bengubler # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: nebrelbug # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: ['https://paypal.me/bengubler'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /src/command.ts: -------------------------------------------------------------------------------- 1 | export function parse (command: string) { 2 | const args: string[] = [] 3 | let lastQuote: string | false = false 4 | let escaped = false 5 | let part = '' 6 | for (let i = 0; i < command.length; ++i) { 7 | const char = command.charAt(i) 8 | if (char === '\\') { 9 | part += char 10 | escaped = true 11 | } else { 12 | if (char === ' ' && !lastQuote) { 13 | args.push(part) 14 | part = '' 15 | } else if (!escaped && (char === '"' || char === "'")) { 16 | part += char 17 | if (char === lastQuote) { 18 | lastQuote = false 19 | } else if (!lastQuote) { 20 | lastQuote = char 21 | } 22 | } else { 23 | part += char 24 | } 25 | escaped = false 26 | } 27 | } 28 | args.push(part) 29 | return args 30 | } 31 | -------------------------------------------------------------------------------- /rollup.config.mjs: -------------------------------------------------------------------------------- 1 | import typescript from '@rollup/plugin-typescript' 2 | 3 | export default [ 4 | { 5 | input: 'src/index.ts', // todo: use rollup-plugin-replace 6 | output: [ 7 | { 8 | file: 'dist/npm-to-yarn.mjs', 9 | format: 'es', 10 | name: 'n2y', 11 | sourcemap: true 12 | }, 13 | { 14 | file: 'dist/npm-to-yarn.umd.js', 15 | format: 'umd', 16 | name: 'n2y', 17 | sourcemap: true 18 | } 19 | ], 20 | plugins: [ 21 | typescript({ 22 | tsconfig: './tsconfig.json', 23 | compilerOptions: { 24 | declarationDir: './types', 25 | sourceMap: true, 26 | inlineSources: true 27 | } 28 | }) 29 | ], 30 | // Indicate here external modules you don't wanna include in your bundle (i.e.: 'lodash') 31 | external: [], 32 | watch: { 33 | include: 'src/**' 34 | } 35 | } 36 | ] 37 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | branches: 9 | - '**' 10 | 11 | jobs: 12 | build: 13 | name: Build 14 | runs-on: ubuntu-latest 15 | strategy: 16 | matrix: 17 | node-version: [14.x, 16.x, 18.x] 18 | steps: 19 | - uses: actions/checkout@v3 20 | - name: Use Node.js ${{ matrix.node-version }} 21 | uses: actions/setup-node@v3 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | cache: 'npm' 25 | 26 | - name: Install dependencies 27 | run: npm ci 28 | 29 | - name: Build 30 | run: npm run build 31 | 32 | - name: Lint code 33 | run: npm run lint 34 | 35 | - name: Test code 36 | run: npm run test 37 | 38 | - name: Report coverage 39 | uses: coverallsapp/github-action@v1 40 | with: 41 | path-to-lcov: ./coverage/lcov.info 42 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | We're really glad you're reading this, because we need volunteer developers to help this project come to fruition. 👏 2 | 3 | ## Instructions 4 | 5 | These steps will guide you through contributing to this project: 6 | 7 | - Fork the repo 8 | - Clone it and install dependencies 9 | 10 | ``` 11 | git clone https://github.com/nebrelbug/npm-to-yarn 12 | npm install 13 | ``` 14 | 15 | Keep in mind that after running `npm install` the git repo is reset. So a good way to cope with this is to have a copy of the folder to push the changes, and the other to try them. 16 | 17 | Make and commit your changes. Make sure the commands npm run build and npm run test:prod are working. 18 | 19 | Finally send a [GitHub Pull Request](https://github.com/nebrelbug/npm-to-yarn/compare?expand=1) with a clear list of what you've done (read more [about pull requests](https://help.github.com/articles/about-pull-requests/)). Make sure all of your commits are atomic (one feature per commit). 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2019 Ben Gubler 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { yarnToNPM } from './yarnToNpm' 2 | import { npmToYarn } from './npmToYarn' 3 | import { npmToPnpm } from './npmToPnpm' 4 | import { npmToBun } from './npmToBun' 5 | 6 | import { executorCommands } from './utils' 7 | 8 | /** 9 | * Converts between npm and yarn command 10 | */ 11 | export default function convert (str: string, to: 'npm' | 'yarn' | 'pnpm' | 'bun'): string { 12 | if ( 13 | str.includes('npx') || 14 | str.includes('yarn dlx') || 15 | str.includes('pnpm dlx') || 16 | str.includes('bun x') 17 | ) { 18 | const executor = str.includes('npx') 19 | ? 'npx' 20 | : str.includes('yarn dlx') 21 | ? 'yarn dlx' 22 | : str.includes('pnpm dlx') 23 | ? 'pnpm dlx' 24 | : 'bun x' 25 | return str.replace(executor, executorCommands[to]) 26 | } else if (to === 'npm') { 27 | return str.replace(/yarn(?: +([^&\n\r]*))?/gm, yarnToNPM) 28 | } else if (to === 'pnpm') { 29 | return str.replace(/npm(?: +([^&\n\r]*))?/gm, npmToPnpm) 30 | } else if (to === 'bun') { 31 | return str.replace(/npm(?: +([^&\n\r]*))?/gm, npmToBun) 32 | } else { 33 | return str.replace(/npm(?: +([^&\n\r]*))?/gm, npmToYarn) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /test/commands.spec.ts: -------------------------------------------------------------------------------- 1 | import { parse } from '../src/command' 2 | 3 | describe('should parse command correctly', () => { 4 | it('simple', () => { 5 | expect(parse('npm')).toEqual(['npm']) 6 | expect(parse('npm test')).toEqual(['npm', 'test']) 7 | expect(parse('npm test bar')).toEqual(['npm', 'test', 'bar']) 8 | }) 9 | it('with params', () => { 10 | expect(parse('npm --bar')).toEqual(['npm', '--bar']) 11 | expect(parse('npm -- --bar')).toEqual(['npm', '--', '--bar']) 12 | }) 13 | it('with strings', () => { 14 | expect(parse('npm ""')).toEqual(['npm', '""']) 15 | expect(parse('npm "test"')).toEqual(['npm', '"test"']) 16 | expect(parse("npm ''")).toEqual(['npm', "''"]) 17 | expect(parse("npm 'test'")).toEqual(['npm', "'test'"]) 18 | }) 19 | it('with string params', () => { 20 | expect(parse('npm --bar ""')).toEqual(['npm', '--bar', '""']) 21 | expect(parse('npm --bar "test"')).toEqual(['npm', '--bar', '"test"']) 22 | expect(parse("npm --bar ''")).toEqual(['npm', '--bar', "''"]) 23 | expect(parse("npm --bar 'test'")).toEqual(['npm', '--bar', "'test'"]) 24 | expect(parse('yarn add test --no-lockfile')).toEqual(['yarn', 'add', 'test', '--no-lockfile']) 25 | }) 26 | it('with space in strings', () => { 27 | expect(parse('npm --bar "test 123"')).toEqual(['npm', '--bar', '"test 123"']) 28 | expect(parse("npm --bar 'test 123'")).toEqual(['npm', '--bar', "'test 123'"]) 29 | expect(parse('npm --bar "test \' 123"')).toEqual(['npm', '--bar', '"test \' 123"']) 30 | expect(parse('npm --bar "test \\" 123"')).toEqual(['npm', '--bar', '"test \\" 123"']) 31 | expect(parse("npm --bar 'test \" 123'")).toEqual(['npm', '--bar', "'test \" 123'"]) 32 | expect(parse("npm --bar 'test \\' 123'")).toEqual(['npm', '--bar', "'test \\' 123'"]) 33 | expect(parse("npm 'test \\' 123 --bar'")).toEqual(['npm', "'test \\' 123 --bar'"]) 34 | expect(parse('npm "test \\" 123 --bar"')).toEqual(['npm', '"test \\" 123 --bar"']) 35 | expect(parse('npm "a \\" 11" "b \\" 22"')).toEqual(['npm', '"a \\" 11"', '"b \\" 22"']) 36 | }) 37 | }) 38 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | export const unchangedCLICommands = [ 2 | 'test', 3 | 'login', 4 | 'logout', 5 | 'link', 6 | 'unlink', 7 | 'publish', 8 | 'cache', 9 | 'start', 10 | 'stop', 11 | 'test' 12 | ] 13 | 14 | export const yarnCLICommands = [ 15 | 'init', 16 | 'run', 17 | 'add', 18 | 'audit', 19 | 'autoclean', 20 | 'bin', 21 | 'check', 22 | 'config', 23 | 'create', 24 | 'dedupe', 25 | 'generate-lock-entry', 26 | 'global', 27 | 'help', 28 | 'import', 29 | 'info', 30 | 'install', 31 | 'licenses', 32 | 'list', 33 | 'lockfile', 34 | 'outdated', 35 | 'owner', 36 | 'pack', 37 | 'policies', 38 | 'prune', 39 | 'remove', 40 | 'self-update', 41 | 'tag', 42 | 'team', 43 | 'upgrade', 44 | 'upgrade-interactive', 45 | 'version', 46 | 'versions', 47 | 'why', 48 | 'workspace', 49 | 'workspaces' 50 | ] 51 | 52 | export const npmCLICommands = [ 53 | 'init', 54 | 'run', 55 | 'access', 56 | 'adduser', 57 | 'audit', 58 | 'bin', 59 | 'bugs', 60 | 'build', 61 | 'bundle', 62 | 'ci', 63 | 'completion', 64 | 'config', 65 | 'dedupe', 66 | 'deprecate', 67 | 'dist-tag', 68 | 'docs', 69 | 'doctor', 70 | 'edit', 71 | 'explore', 72 | 'exec', 73 | 'fund', 74 | 'help-search', 75 | 'help', 76 | 'hook', 77 | 'install-ci-test', 78 | 'install-test', 79 | 'install', 80 | 'ls', 81 | 'list', 82 | 'npm', 83 | 'org', 84 | 'outdated', 85 | 'owner', 86 | 'pack', 87 | 'ping', 88 | 'prefix', 89 | 'profile', 90 | 'prune', 91 | 'rebuild', 92 | 'repo', 93 | 'restart', 94 | 'root', 95 | 'run-script', 96 | 'search', 97 | 'shrinkwrap', 98 | 'star', 99 | 'stars', 100 | 'start', 101 | 'stop', 102 | 'team', 103 | 'token', 104 | 'uninstall', 105 | 'unpublish', 106 | 'update', 107 | 'version', 108 | 'view', 109 | 'whoami' 110 | ] 111 | 112 | export const executorCommands = { 113 | npm: 'npx', 114 | yarn: 'yarn dlx', 115 | pnpm: 'pnpm dlx', 116 | bun: 'bun x' 117 | } 118 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | name: 'CodeQL' 2 | 3 | on: 4 | push: 5 | branches: [master] 6 | pull_request: 7 | # The branches below must be a subset of the branches above 8 | branches: [master] 9 | schedule: 10 | - cron: '0 2 * * 4' 11 | 12 | jobs: 13 | analyze: 14 | name: Analyze 15 | runs-on: ubuntu-latest 16 | 17 | permissions: 18 | # required for all workflows 19 | security-events: write 20 | 21 | strategy: 22 | fail-fast: false 23 | matrix: 24 | # Override automatic language detection by changing the below list 25 | # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] 26 | language: ['javascript'] 27 | # Learn more... 28 | # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection 29 | 30 | steps: 31 | - name: Checkout repository 32 | uses: actions/checkout@v3 33 | with: 34 | # We must fetch at least the immediate parents so that if this is 35 | # a pull request then we can checkout the head. 36 | fetch-depth: 2 37 | 38 | # Initializes the CodeQL tools for scanning. 39 | - name: Initialize CodeQL 40 | uses: github/codeql-action/init@v2 41 | with: 42 | languages: ${{ matrix.language }} 43 | 44 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 45 | # If this step fails, then you should remove it and run the build manually (see below) 46 | - name: Autobuild 47 | uses: github/codeql-action/autobuild@v2 48 | 49 | # ℹ️ Command-line programs to run using the OS shell. 50 | # 📚 https://git.io/JvXDl 51 | 52 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 53 | # and modify them (or add more) to build your code if your project 54 | # uses a compiled language 55 | 56 | #- run: | 57 | # make bootstrap 58 | # make release 59 | 60 | - name: Perform CodeQL Analysis 61 | uses: github/codeql-action/analyze@v2 62 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "npm-to-yarn", 3 | "version": "3.0.1", 4 | "description": "Convert npm CLI commands to Yarn commands, and vice versa", 5 | "keywords": [ 6 | "string convert", 7 | "documentation", 8 | "yarn to npm" 9 | ], 10 | "main": "dist/npm-to-yarn.umd.js", 11 | "module": "dist/npm-to-yarn.mjs", 12 | "typings": "dist/types/index.d.ts", 13 | "exports": { 14 | ".": { 15 | "types": "./dist/types/index.d.ts", 16 | "import": "./dist/npm-to-yarn.mjs", 17 | "require": "./dist/npm-to-yarn.umd.js", 18 | "default": "./dist/npm-to-yarn.umd.js" 19 | } 20 | }, 21 | "sideEffects": false, 22 | "files": [ 23 | "dist" 24 | ], 25 | "author": "Ben Gubler ", 26 | "homepage": "https://github.com/nebrelbug/npm-to-yarn#readme", 27 | "funding": "https://github.com/nebrelbug/npm-to-yarn?sponsor=1", 28 | "repository": { 29 | "type": "git", 30 | "url": "git+https://github.com/nebrelbug/npm-to-yarn.git" 31 | }, 32 | "bugs": { 33 | "url": "https://github.com/nebrelbug/npm-to-yarn/issues" 34 | }, 35 | "license": "MIT", 36 | "engines": { 37 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 38 | }, 39 | "type": "commonjs", 40 | "scripts": { 41 | "lint": "eslint src/*.ts test/*.spec.ts --ext .js,.ts", 42 | "prebuild": "rimraf dist", 43 | "build": "rollup -c rollup.config.mjs", 44 | "start": "rollup -c rollup.config.mjs -w", 45 | "test": "jest --coverage", 46 | "test:watch": "jest --coverage --watch", 47 | "test:prod": "npm run lint && npm run test -- --no-cache", 48 | "format": "prettier-standard --format" 49 | }, 50 | "lint-staged": { 51 | "{src,test}/**/*.ts": [ 52 | "prettier-standard --lint" 53 | ] 54 | }, 55 | "devDependencies": { 56 | "@types/jest": "^29.2.4", 57 | "@types/node": "^18.11.15", 58 | "@typescript-eslint/eslint-plugin": "^5.54.0", 59 | "@typescript-eslint/parser": "^5.54.0", 60 | "@rollup/plugin-typescript": "^11.0.0", 61 | "eslint": "^8.29.0", 62 | "eslint-config-prettier": "^8.5.0", 63 | "jest": "^29.3.1", 64 | "lint-staged": "^13.1.0", 65 | "prettier-standard": "^16.4.1", 66 | "rimraf": "^3.0.2", 67 | "rollup": "^3.18.0", 68 | "ts-jest": "^29.0.5", 69 | "typescript": "^4.9.4" 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | - Using welcoming and inclusive language 18 | - Being respectful of differing viewpoints and experiences 19 | - Gracefully accepting constructive criticism 20 | - Focusing on what is best for the community 21 | - Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | - The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | - Trolling, insulting/derogatory comments, and personal or political attacks 28 | - Public or private harassment 29 | - Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | - Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at alexjovermorales@gmail.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at [http://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: http://contributor-covenant.org 74 | [version]: http://contributor-covenant.org/version/1/4/ 75 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # npm-to-yarn 2 | 3 | 4 | 5 | [logo]: https://img.shields.io/badge/all_contributors-0-orange.svg 'Number of contributors on All-Contributors' 6 | 7 | 8 | 9 | [![npm](https://img.shields.io/npm/v/npm-to-yarn)](https://www.npmjs.com/package/npm-to-yarn) 10 | [![License](https://img.shields.io/npm/l/npm-to-yarn)](./LICENSE) 11 | [![CI](https://github.com/nebrelbug/npm-to-yarn/actions/workflows/ci.yml/badge.svg)](https://github.com/nebrelbug/npm-to-yarn/actions/workflows/ci.yml) 12 | [![Coveralls](https://img.shields.io/coveralls/nebrelbug/npm-to-yarn.svg)](https://coveralls.io/github/nebrelbug/npm-to-yarn) 13 | 14 | [![styled with prettier](https://img.shields.io/badge/styled_with-prettier-ff69b4.svg)](https://github.com/prettier/prettier) 15 | [![Donate](https://img.shields.io/badge/donate-paypal-blue.svg)](https://paypal.me/bengubler) 16 | 17 | **Summary** 18 | 19 | `npm-to-yarn` is designed to convert NPM CLI commands to their Yarn equivalents (and vice versa). 20 | 21 | ## Why `npm-to-yarn`? 22 | 23 | `npm-to-yarn` is super helpful in documentation, for example in generating code tabs. 24 | 25 | ## 📜 Docs 26 | 27 | ```js 28 | import convert from 'npm-to-yarn' 29 | 30 | // or 31 | // var convert = require('npm-to-yarn') 32 | 33 | convert('npm install squirrelly', 'yarn') 34 | // yarn add squirrelly 35 | 36 | // npx conversions 37 | 38 | convert('npx create-next-app', 'yarn') 39 | // yarn dlx create-next-app 40 | ``` 41 | 42 | `npm-to-yarn` exposes a UMD build, so you can also install it with a CDN (it exposes global variable `n2y`) 43 | 44 | ### API 45 | 46 | ```ts 47 | /** 48 | * Converts between npm and yarn command 49 | */ 50 | export default function convert (str: string, to: 'npm' | 'yarn' | 'pnpm' | 'bun'): string 51 | ``` 52 | 53 | ## ✔️ Tests 54 | 55 | Tests can be run with `npm test`. Multiple tests check that parsing, rendering, and compiling return expected results, formatting follows guidelines, and code coverage is at the expected level. 56 | 57 | ## 📦 Contributing to `npm-to-yarn` - Setup Guide 58 | 59 | Install Dependencies 60 | 61 | ```sh copy 62 | npm install 63 | ``` 64 | 65 | Run the development server 66 | 67 | ```sh 68 | npm run start 69 | ``` 70 | 71 | A new file: `npm-to-yarn.mjs` is created in `dist` folder.
72 | Open `node` inside the terminal and write the following code to test new changes 73 | 74 | ```js 75 | const npmToYarn = await import('./dist/npm-to-yarn.mjs') 76 | const convert = npmToYarn.default 77 | 78 | convert('npm install react', 'bun') 79 | ``` 80 | 81 | ## Resources 82 | 83 | To be added 84 | 85 | ## Projects using `npm-to-yarn` 86 | 87 | - [Dynamoose](https://dynamoosejs.com) 88 | - [Docusaurus](https://docusaurus.io) 89 | 90 | ## Contributors 91 | 92 | Made with ❤ by [@nebrelbug](https://github.com/nebrelbug) and all these wonderful contributors ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)): 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind are welcome! 105 | -------------------------------------------------------------------------------- /src/yarnToNpm.ts: -------------------------------------------------------------------------------- 1 | import { unchangedCLICommands, yarnCLICommands } from './utils' 2 | import { parse } from './command' 3 | 4 | function convertAddRemoveArgs (args: string[]) { 5 | return args.map(item => { 6 | switch (item) { 7 | case '--no-lockfile': 8 | return '--no-package-lock' 9 | case '--production': 10 | return '--save-prod' 11 | case '--dev': 12 | return '--save-dev' 13 | case '--optional': 14 | return '--save-optional' 15 | case '--exact': 16 | return '--save-exact' 17 | default: 18 | return item 19 | } 20 | }) 21 | } 22 | 23 | const yarnToNpmTable = { 24 | add (args: string[]) { 25 | if (args.length === 2 && args[1] === '--force') { 26 | return ['rebuild'] 27 | } 28 | args[0] = 'install' 29 | return convertAddRemoveArgs(args) 30 | }, 31 | remove (args: string[]) { 32 | args[0] = 'uninstall' 33 | return convertAddRemoveArgs(args) 34 | }, 35 | version (args: string[]) { 36 | return args.map(item => { 37 | switch (item) { 38 | case '--major': 39 | return 'major' 40 | case '--minor': 41 | return 'minor' 42 | case '--patch': 43 | return 'patch' 44 | default: 45 | return item 46 | } 47 | }) 48 | }, 49 | install: 'install', 50 | list (args: string[]) { 51 | args[0] = 'ls' 52 | const patternIndex = args.findIndex(item => item === '--pattern') 53 | if (patternIndex >= 0 && args[patternIndex + 1]) { 54 | const packages = args[patternIndex + 1].replace(/["']([^"']+)["']/, '$1').split('|') 55 | args.splice(patternIndex, 2, packages.join(' ')) 56 | } 57 | return args 58 | }, 59 | init: 'init', 60 | create: 'init', 61 | outdated: 'outdated', 62 | run: 'run', 63 | global (args: string[]) { 64 | switch (args[1]) { 65 | case 'add': 66 | args.shift() 67 | args = yarnToNpmTable.add(args) 68 | args.push('--global') 69 | return args 70 | case 'remove': 71 | args.shift() 72 | args = yarnToNpmTable.remove(args) 73 | args.push('--global') 74 | return args 75 | case 'list': 76 | args.shift() 77 | args = yarnToNpmTable.list(args) 78 | args.push('--global') 79 | return args 80 | // case 'bin': 81 | // case 'upgrade': 82 | default: 83 | args.push("\n# couldn't auto-convert command") 84 | return args 85 | } 86 | }, 87 | pack (args: string[]) { 88 | return args.map(item => { 89 | if (item === '--filename') { 90 | return '--pack-destination' 91 | } 92 | return item 93 | }) 94 | } 95 | } 96 | 97 | export function yarnToNPM (_m: string, command: string): string { 98 | command = (command || '').trim() 99 | if (command === '') { 100 | return 'npm install' 101 | } 102 | let args = parse(command) 103 | const firstCommand = (/\w+/.exec(command) || [''])[0] 104 | 105 | if (unchangedCLICommands.includes(args[0])) { 106 | return 'npm ' + command 107 | } else if (args[0] in yarnToNpmTable) { 108 | const converter = yarnToNpmTable[args[0] as keyof typeof yarnToNpmTable] 109 | 110 | if (typeof converter === 'function') { 111 | args = converter(args) 112 | } else { 113 | args[0] = converter 114 | } 115 | 116 | return 'npm ' + args.filter(Boolean).join(' ') 117 | } else if (!yarnCLICommands.includes(firstCommand)) { 118 | // i.e., yarn grunt -> npm run grunt 119 | return 'npm run ' + command 120 | } else { 121 | return 'npm ' + command + "\n# couldn't auto-convert command" 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /src/npmToBun.ts: -------------------------------------------------------------------------------- 1 | import { parse } from './command' 2 | 3 | function convertInstallArgs (args: string[]) { 4 | // bun uses -g and --global flags 5 | // bun mostly conforms to Yarn's CLI 6 | return args.map(item => { 7 | switch (item) { 8 | case '--save-dev': 9 | case '--development': 10 | case '-D': 11 | return '--dev' 12 | case '--save-prod': 13 | case '-P': 14 | return '--production' 15 | case '--no-package-lock': 16 | return '--no-save' 17 | case '--save-optional': 18 | case '-O': 19 | return '--optional' 20 | case '--save-exact': 21 | case '-E': 22 | return '--exact' 23 | case '--save': 24 | case '-S': 25 | // this is default in bun 26 | return '' 27 | case '--global': 28 | case '-g': 29 | return '--global' 30 | default: 31 | return item 32 | } 33 | }) 34 | } 35 | 36 | export const bunCLICommands = [ 37 | 'init', 38 | 'run', 39 | 'add', 40 | 'pm', 41 | 'help', 42 | 'install', 43 | 'remove', 44 | 'upgrade', 45 | 'version' 46 | ] as const 47 | type bunCLICommands = typeof bunCLICommands[number] 48 | 49 | export function npmToBun (_m: string, command: string): string { 50 | let args = parse((command || '').trim()) 51 | 52 | const index = args.findIndex(a => a === '--') 53 | if (index >= 0) { 54 | args.splice(index, 1) 55 | } 56 | 57 | let cmd = 'bun' 58 | switch (args[0]) { 59 | case 'install': 60 | case 'i': 61 | if (args.length === 1) { 62 | args = ['install'] 63 | } else { 64 | args[0] = 'add' 65 | } 66 | args = convertInstallArgs(args) 67 | break 68 | case 'uninstall': 69 | case 'un': 70 | case 'remove': 71 | case 'r': 72 | case 'rm': 73 | args[0] = 'remove' 74 | args = convertInstallArgs(args) 75 | break 76 | case 'cache': 77 | if (args[1] === 'clean') { 78 | args = ['pm', 'cache', 'rm'].concat(args.slice(2)) 79 | } else { 80 | cmd = 'npm' 81 | } 82 | break 83 | case 'rebuild': 84 | case 'rb': 85 | args[0] = 'add' 86 | args.push('--force') 87 | break 88 | case 'run': 89 | break 90 | case 'list': 91 | case 'ls': 92 | // 'npm ls' => 'bun pm ls' 93 | args = convertInstallArgs(args) 94 | args[0] = 'ls' 95 | args.unshift('pm') 96 | break 97 | case 'init': 98 | case 'create': 99 | if (args[1]) { 100 | if (args[1].startsWith('@')) { 101 | cmd = 'bunx' 102 | 103 | args[1] = args[1].replace('/', '/create-') 104 | args = args.slice(1) 105 | } else if (!args[1].startsWith('-')) { 106 | cmd = 'bunx' 107 | args[1] = `create-${args[1].replace('@latest', '')}` 108 | args = args.slice(1) 109 | } else { 110 | args[0] = 'init' 111 | } 112 | } 113 | break 114 | 115 | case 'link': 116 | case 'ln': 117 | args = convertInstallArgs(args) 118 | args[0] = 'link' 119 | break 120 | case 'stop': 121 | case 'start': 122 | case 'unlink': 123 | break 124 | case 'test': 125 | case 't': 126 | case 'tst': 127 | args[0] = 'test' 128 | args.unshift('run') 129 | break 130 | case 'exec': 131 | cmd = 'bunx' 132 | args.splice(0, 1) 133 | break 134 | default: 135 | // null == keep `npm` command 136 | cmd = 'npm' 137 | break 138 | } 139 | 140 | const filtered = args.filter(Boolean).filter(arg => arg !== '--') 141 | return `${cmd} ${filtered.join(' ')}${ 142 | cmd === 'npm' ? "\n# couldn't auto-convert command" : '' 143 | }`.replace('=', ' ') 144 | } 145 | -------------------------------------------------------------------------------- /src/npmToPnpm.ts: -------------------------------------------------------------------------------- 1 | import { parse } from './command' 2 | 3 | function convertPnpmInstallArgs (args: string[]) { 4 | return args.map(item => { 5 | switch (item) { 6 | case '--save': 7 | case '-S': 8 | return '' 9 | case '--no-package-lock': 10 | return '--frozen-lockfile' 11 | // case '--save-dev': 12 | // case '-D': 13 | // case '--save-prod': 14 | // case '-P': 15 | // case '--save-optional': 16 | // case '-O': 17 | // case '--save-exact': 18 | // case '-E': 19 | // case '--global': 20 | // case '-g': 21 | default: 22 | return item 23 | } 24 | }) 25 | } 26 | 27 | function convertFilterArg (args: string[]) { 28 | if (args.length > 1) { 29 | const filter = args.filter((item, index) => index !== 0 && !item.startsWith('-')) 30 | if (filter.length > 0) { 31 | args = args.filter((item, index) => index === 0 || item.startsWith('-')) 32 | args.push('--filter') 33 | args.push(filter.join(' ')) 34 | } 35 | } 36 | 37 | return args 38 | } 39 | 40 | const npmToPnpmTable = { 41 | // ------------------------------ 42 | install (args: string[]) { 43 | if (args.length > 1 && args.filter(item => !item.startsWith('-')).length > 1) { 44 | args[0] = 'add' 45 | } 46 | return convertPnpmInstallArgs(args) 47 | }, 48 | i (args: string[]) { 49 | return npmToPnpmTable.install(args) 50 | }, 51 | // ------------------------------ 52 | uninstall (args: string[]) { 53 | args[0] = 'remove' 54 | 55 | return convertPnpmInstallArgs(args) 56 | }, 57 | un (args: string[]) { 58 | return npmToPnpmTable.uninstall(args) 59 | }, 60 | remove (args: string[]) { 61 | return npmToPnpmTable.uninstall(args) 62 | }, 63 | r (args: string[]) { 64 | return npmToPnpmTable.uninstall(args) 65 | }, 66 | rm (args: string[]) { 67 | return npmToPnpmTable.uninstall(args) 68 | }, 69 | // ------------------------------ 70 | rb (args: string[]) { 71 | return npmToPnpmTable.rebuild(args) 72 | }, 73 | rebuild (args: string[]) { 74 | args[0] = 'rebuild' 75 | return convertFilterArg(args) 76 | }, 77 | run: 'run', 78 | exec: 'exec', 79 | ls (args: string[]) { 80 | return npmToPnpmTable.list(args) 81 | }, 82 | list (args: string[]) { 83 | return args.map(item => { 84 | if (item.startsWith('--depth=')) { 85 | return `--depth ${item.split('=')[1]}` 86 | } 87 | switch (item) { 88 | case '--production': 89 | return '--prod' 90 | case '--development': 91 | return '--dev' 92 | default: 93 | return item 94 | } 95 | }) 96 | }, 97 | init (args: string[]) { 98 | if (args[1] && !args[1].startsWith('-')) { 99 | args[0] = 'create' 100 | const m = args[1].match(/(.+)@latest/) 101 | if (m) { 102 | args[1] = m[1] 103 | } 104 | } 105 | return args.filter(item => item !== '--scope') 106 | }, 107 | create (args: string[]) { 108 | return npmToPnpmTable.init(args) 109 | }, 110 | ln: 'link', 111 | t: 'test', 112 | test: 'test', 113 | tst: 'test', 114 | start: 'start', 115 | link: 'link', 116 | unlink (args: string[]) { 117 | return convertFilterArg(args) 118 | }, 119 | outdated: 'outdated', 120 | pack: (args: string[]) => { 121 | return args.map(item => { 122 | if (item.startsWith('--pack-destination')) { 123 | return item.replace(/^--pack-destination[\s=]/, '--pack-destination ') 124 | } 125 | return item 126 | }) 127 | } 128 | } 129 | 130 | export function npmToPnpm (_m: string, command: string): string { 131 | let args = parse((command || '').trim()) 132 | 133 | const index = args.findIndex(a => a === '--') 134 | if (index >= 0) { 135 | args.splice(index, 1) 136 | } 137 | 138 | if (args[0] in npmToPnpmTable) { 139 | const converter = npmToPnpmTable[args[0] as keyof typeof npmToPnpmTable] 140 | 141 | if (typeof converter === 'function') { 142 | args = converter(args) 143 | } else { 144 | args[0] = converter 145 | } 146 | 147 | return 'pnpm ' + args.filter(Boolean).join(' ') 148 | } else { 149 | return 'npm ' + command + "\n# couldn't auto-convert command" 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /src/npmToYarn.ts: -------------------------------------------------------------------------------- 1 | import { unchangedCLICommands, yarnCLICommands } from './utils' 2 | import { parse } from './command' 3 | 4 | function convertInstallArgs (args: string[]) { 5 | if (args.includes('--global') || args.includes('-g')) { 6 | args.unshift('global') 7 | } 8 | 9 | return args.map(item => { 10 | switch (item) { 11 | case '--save-dev': 12 | case '-D': 13 | return '--dev' 14 | case '--save-prod': 15 | case '-P': 16 | return '--production' 17 | case '--no-package-lock': 18 | return '--no-lockfile' 19 | case '--save-optional': 20 | case '-O': 21 | return '--optional' 22 | case '--save-exact': 23 | case '-E': 24 | return '--exact' 25 | case '--save': 26 | case '-S': 27 | case '--global': 28 | case '-g': 29 | return '' 30 | default: 31 | return item 32 | } 33 | }) 34 | } 35 | 36 | const npmToYarnTable = { 37 | install (args: string[]) { 38 | if (args.length === 1) { 39 | return ['install'] 40 | } 41 | args[0] = 'add' 42 | 43 | return convertInstallArgs(args) 44 | }, 45 | i (args: string[]) { 46 | return npmToYarnTable.install(args) 47 | }, 48 | uninstall (args: string[]) { 49 | args[0] = 'remove' 50 | 51 | return convertInstallArgs(args) 52 | }, 53 | un (args: string[]) { 54 | return npmToYarnTable.uninstall(args) 55 | }, 56 | remove (args: string[]) { 57 | return npmToYarnTable.uninstall(args) 58 | }, 59 | r (args: string[]) { 60 | return npmToYarnTable.uninstall(args) 61 | }, 62 | rm (args: string[]) { 63 | return npmToYarnTable.uninstall(args) 64 | }, 65 | version (args: string[]) { 66 | return args.map(item => { 67 | switch (item) { 68 | case 'major': 69 | return '--major' 70 | case 'minor': 71 | return '--minor' 72 | case 'patch': 73 | return '--patch' 74 | default: 75 | return item 76 | } 77 | }) 78 | }, 79 | rb (args: string[]) { 80 | return npmToYarnTable.rebuild(args) 81 | }, 82 | rebuild (args: string[]) { 83 | args[0] = 'add' 84 | args.push('--force') 85 | return args 86 | }, 87 | run (args: string[]) { 88 | if (args[1] && !unchangedCLICommands.includes(args[1]) && !yarnCLICommands.includes(args[1])) { 89 | args.splice(0, 1) 90 | } 91 | return args 92 | }, 93 | exec (args: string[]) { 94 | args[0] = 'run' 95 | return npmToYarnTable.run(args) 96 | }, 97 | ls (args: string[]) { 98 | args[0] = 'list' 99 | 100 | let ended = false 101 | const packages = args.filter((item, id) => { 102 | if (id > 0 && !ended) { 103 | ended = item.startsWith('-') 104 | return !ended 105 | } 106 | return false 107 | }) 108 | if (packages.length > 0) { 109 | args.splice(1, packages.length, '--pattern', '"' + packages.join('|') + '"') 110 | } 111 | return args 112 | }, 113 | list (args: string[]) { 114 | return npmToYarnTable.ls(args) 115 | }, 116 | init (args: string[]) { 117 | if (args[1] && !args[1].startsWith('-')) { 118 | args[0] = 'create' 119 | const m = args[1].match(/(.+)@latest/) 120 | if (m) { 121 | args[1] = m[1] 122 | } 123 | } 124 | return args.filter(item => item !== '--scope') 125 | }, 126 | create (args: string[]) { 127 | return npmToYarnTable.init(args) 128 | }, 129 | ln: 'link', 130 | t: 'test', 131 | tst: 'test', 132 | outdated: 'outdated', 133 | pack (args: string[]) { 134 | return args.map(item => { 135 | if (item.startsWith('--pack-destination')) { 136 | return item.replace(/^--pack-destination[\s=]/, '--filename ') 137 | } 138 | return item 139 | }) 140 | } 141 | } 142 | 143 | export function npmToYarn (_m: string, command: string): string { 144 | let args = parse((command || '').trim()) 145 | 146 | const index = args.findIndex(a => a === '--') 147 | if (index >= 0) { 148 | args.splice(index, 1) 149 | } 150 | 151 | if (unchangedCLICommands.includes(args[0])) { 152 | return 'yarn ' + args.filter(Boolean).join(' ') 153 | } else if (args[0] in npmToYarnTable) { 154 | const converter = npmToYarnTable[args[0] as keyof typeof npmToYarnTable] 155 | 156 | if (typeof converter === 'function') { 157 | args = converter(args) 158 | } else { 159 | args[0] = converter 160 | } 161 | 162 | return 'yarn ' + args.filter(Boolean).join(' ') 163 | } else { 164 | return 'npm ' + command + "\n# couldn't auto-convert command" 165 | } 166 | } 167 | -------------------------------------------------------------------------------- /test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | 139 | NPM-to-Yarn Playground 140 | 141 | 142 | 143 |

144 | Playground 145 | Based on the excellent 147 | DoT.js website 149 |

150 |
151 |
152 |
153 |

NPM

154 | 160 |
161 |
162 |

Yarn

163 | 164 |
165 |
166 |

PNPM

167 | 168 |
169 |
170 |

Bun

171 | 172 |
173 |
174 | 199 | 200 | 201 | -------------------------------------------------------------------------------- /dist/npm-to-yarn.mjs: -------------------------------------------------------------------------------- 1 | var unchangedCLICommands = [ 2 | 'test', 3 | 'login', 4 | 'logout', 5 | 'link', 6 | 'unlink', 7 | 'publish', 8 | 'cache', 9 | 'start', 10 | 'stop', 11 | 'test' 12 | ]; 13 | var yarnCLICommands = [ 14 | 'init', 15 | 'run', 16 | 'add', 17 | 'audit', 18 | 'autoclean', 19 | 'bin', 20 | 'check', 21 | 'config', 22 | 'create', 23 | 'dedupe', 24 | 'generate-lock-entry', 25 | 'global', 26 | 'help', 27 | 'import', 28 | 'info', 29 | 'install', 30 | 'licenses', 31 | 'list', 32 | 'lockfile', 33 | 'outdated', 34 | 'owner', 35 | 'pack', 36 | 'policies', 37 | 'prune', 38 | 'remove', 39 | 'self-update', 40 | 'tag', 41 | 'team', 42 | 'upgrade', 43 | 'upgrade-interactive', 44 | 'version', 45 | 'versions', 46 | 'why', 47 | 'workspace', 48 | 'workspaces' 49 | ]; 50 | var executorCommands = { 51 | npm: 'npx', 52 | yarn: 'yarn dlx', 53 | pnpm: 'pnpm dlx', 54 | bun: 'bun x' 55 | }; 56 | 57 | function parse(command) { 58 | var args = []; 59 | var lastQuote = false; 60 | var escaped = false; 61 | var part = ''; 62 | for (var i = 0; i < command.length; ++i) { 63 | var char = command.charAt(i); 64 | if (char === '\\') { 65 | part += char; 66 | escaped = true; 67 | } 68 | else { 69 | if (char === ' ' && !lastQuote) { 70 | args.push(part); 71 | part = ''; 72 | } 73 | else if (!escaped && (char === '"' || char === "'")) { 74 | part += char; 75 | if (char === lastQuote) { 76 | lastQuote = false; 77 | } 78 | else if (!lastQuote) { 79 | lastQuote = char; 80 | } 81 | } 82 | else { 83 | part += char; 84 | } 85 | escaped = false; 86 | } 87 | } 88 | args.push(part); 89 | return args; 90 | } 91 | 92 | function convertAddRemoveArgs(args) { 93 | return args.map(function (item) { 94 | switch (item) { 95 | case '--no-lockfile': 96 | return '--no-package-lock'; 97 | case '--production': 98 | return '--save-prod'; 99 | case '--dev': 100 | return '--save-dev'; 101 | case '--optional': 102 | return '--save-optional'; 103 | case '--exact': 104 | return '--save-exact'; 105 | default: 106 | return item; 107 | } 108 | }); 109 | } 110 | var yarnToNpmTable = { 111 | add: function (args) { 112 | if (args.length === 2 && args[1] === '--force') { 113 | return ['rebuild']; 114 | } 115 | args[0] = 'install'; 116 | return convertAddRemoveArgs(args); 117 | }, 118 | remove: function (args) { 119 | args[0] = 'uninstall'; 120 | return convertAddRemoveArgs(args); 121 | }, 122 | version: function (args) { 123 | return args.map(function (item) { 124 | switch (item) { 125 | case '--major': 126 | return 'major'; 127 | case '--minor': 128 | return 'minor'; 129 | case '--patch': 130 | return 'patch'; 131 | default: 132 | return item; 133 | } 134 | }); 135 | }, 136 | install: 'install', 137 | list: function (args) { 138 | args[0] = 'ls'; 139 | var patternIndex = args.findIndex(function (item) { return item === '--pattern'; }); 140 | if (patternIndex >= 0 && args[patternIndex + 1]) { 141 | var packages = args[patternIndex + 1].replace(/["']([^"']+)["']/, '$1').split('|'); 142 | args.splice(patternIndex, 2, packages.join(' ')); 143 | } 144 | return args; 145 | }, 146 | init: 'init', 147 | create: 'init', 148 | outdated: 'outdated', 149 | run: 'run', 150 | global: function (args) { 151 | switch (args[1]) { 152 | case 'add': 153 | args.shift(); 154 | args = yarnToNpmTable.add(args); 155 | args.push('--global'); 156 | return args; 157 | case 'remove': 158 | args.shift(); 159 | args = yarnToNpmTable.remove(args); 160 | args.push('--global'); 161 | return args; 162 | case 'list': 163 | args.shift(); 164 | args = yarnToNpmTable.list(args); 165 | args.push('--global'); 166 | return args; 167 | // case 'bin': 168 | // case 'upgrade': 169 | default: 170 | args.push("\n# couldn't auto-convert command"); 171 | return args; 172 | } 173 | }, 174 | pack: function (args) { 175 | return args.map(function (item) { 176 | if (item === '--filename') { 177 | return '--pack-destination'; 178 | } 179 | return item; 180 | }); 181 | } 182 | }; 183 | function yarnToNPM(_m, command) { 184 | command = (command || '').trim(); 185 | if (command === '') { 186 | return 'npm install'; 187 | } 188 | var args = parse(command); 189 | var firstCommand = (/\w+/.exec(command) || [''])[0]; 190 | if (unchangedCLICommands.includes(args[0])) { 191 | return 'npm ' + command; 192 | } 193 | else if (args[0] in yarnToNpmTable) { 194 | var converter = yarnToNpmTable[args[0]]; 195 | if (typeof converter === 'function') { 196 | args = converter(args); 197 | } 198 | else { 199 | args[0] = converter; 200 | } 201 | return 'npm ' + args.filter(Boolean).join(' '); 202 | } 203 | else if (!yarnCLICommands.includes(firstCommand)) { 204 | // i.e., yarn grunt -> npm run grunt 205 | return 'npm run ' + command; 206 | } 207 | else { 208 | return 'npm ' + command + "\n# couldn't auto-convert command"; 209 | } 210 | } 211 | 212 | function convertInstallArgs$1(args) { 213 | if (args.includes('--global') || args.includes('-g')) { 214 | args.unshift('global'); 215 | } 216 | return args.map(function (item) { 217 | switch (item) { 218 | case '--save-dev': 219 | case '-D': 220 | return '--dev'; 221 | case '--save-prod': 222 | case '-P': 223 | return '--production'; 224 | case '--no-package-lock': 225 | return '--no-lockfile'; 226 | case '--save-optional': 227 | case '-O': 228 | return '--optional'; 229 | case '--save-exact': 230 | case '-E': 231 | return '--exact'; 232 | case '--save': 233 | case '-S': 234 | case '--global': 235 | case '-g': 236 | return ''; 237 | default: 238 | return item; 239 | } 240 | }); 241 | } 242 | var npmToYarnTable = { 243 | install: function (args) { 244 | if (args.length === 1) { 245 | return ['install']; 246 | } 247 | args[0] = 'add'; 248 | return convertInstallArgs$1(args); 249 | }, 250 | i: function (args) { 251 | return npmToYarnTable.install(args); 252 | }, 253 | uninstall: function (args) { 254 | args[0] = 'remove'; 255 | return convertInstallArgs$1(args); 256 | }, 257 | un: function (args) { 258 | return npmToYarnTable.uninstall(args); 259 | }, 260 | remove: function (args) { 261 | return npmToYarnTable.uninstall(args); 262 | }, 263 | r: function (args) { 264 | return npmToYarnTable.uninstall(args); 265 | }, 266 | rm: function (args) { 267 | return npmToYarnTable.uninstall(args); 268 | }, 269 | version: function (args) { 270 | return args.map(function (item) { 271 | switch (item) { 272 | case 'major': 273 | return '--major'; 274 | case 'minor': 275 | return '--minor'; 276 | case 'patch': 277 | return '--patch'; 278 | default: 279 | return item; 280 | } 281 | }); 282 | }, 283 | rb: function (args) { 284 | return npmToYarnTable.rebuild(args); 285 | }, 286 | rebuild: function (args) { 287 | args[0] = 'add'; 288 | args.push('--force'); 289 | return args; 290 | }, 291 | run: function (args) { 292 | if (args[1] && !unchangedCLICommands.includes(args[1]) && !yarnCLICommands.includes(args[1])) { 293 | args.splice(0, 1); 294 | } 295 | return args; 296 | }, 297 | exec: function (args) { 298 | args[0] = 'run'; 299 | return npmToYarnTable.run(args); 300 | }, 301 | ls: function (args) { 302 | args[0] = 'list'; 303 | var ended = false; 304 | var packages = args.filter(function (item, id) { 305 | if (id > 0 && !ended) { 306 | ended = item.startsWith('-'); 307 | return !ended; 308 | } 309 | return false; 310 | }); 311 | if (packages.length > 0) { 312 | args.splice(1, packages.length, '--pattern', '"' + packages.join('|') + '"'); 313 | } 314 | return args; 315 | }, 316 | list: function (args) { 317 | return npmToYarnTable.ls(args); 318 | }, 319 | init: function (args) { 320 | if (args[1] && !args[1].startsWith('-')) { 321 | args[0] = 'create'; 322 | var m = args[1].match(/(.+)@latest/); 323 | if (m) { 324 | args[1] = m[1]; 325 | } 326 | } 327 | return args.filter(function (item) { return item !== '--scope'; }); 328 | }, 329 | create: function (args) { 330 | return npmToYarnTable.init(args); 331 | }, 332 | ln: 'link', 333 | t: 'test', 334 | tst: 'test', 335 | outdated: 'outdated', 336 | pack: function (args) { 337 | return args.map(function (item) { 338 | if (item.startsWith('--pack-destination')) { 339 | return item.replace(/^--pack-destination[\s=]/, '--filename '); 340 | } 341 | return item; 342 | }); 343 | } 344 | }; 345 | function npmToYarn(_m, command) { 346 | var args = parse((command || '').trim()); 347 | var index = args.findIndex(function (a) { return a === '--'; }); 348 | if (index >= 0) { 349 | args.splice(index, 1); 350 | } 351 | if (unchangedCLICommands.includes(args[0])) { 352 | return 'yarn ' + args.filter(Boolean).join(' '); 353 | } 354 | else if (args[0] in npmToYarnTable) { 355 | var converter = npmToYarnTable[args[0]]; 356 | if (typeof converter === 'function') { 357 | args = converter(args); 358 | } 359 | else { 360 | args[0] = converter; 361 | } 362 | return 'yarn ' + args.filter(Boolean).join(' '); 363 | } 364 | else { 365 | return 'npm ' + command + "\n# couldn't auto-convert command"; 366 | } 367 | } 368 | 369 | function convertPnpmInstallArgs(args) { 370 | return args.map(function (item) { 371 | switch (item) { 372 | case '--save': 373 | case '-S': 374 | return ''; 375 | case '--no-package-lock': 376 | return '--frozen-lockfile'; 377 | // case '--save-dev': 378 | // case '-D': 379 | // case '--save-prod': 380 | // case '-P': 381 | // case '--save-optional': 382 | // case '-O': 383 | // case '--save-exact': 384 | // case '-E': 385 | // case '--global': 386 | // case '-g': 387 | default: 388 | return item; 389 | } 390 | }); 391 | } 392 | function convertFilterArg(args) { 393 | if (args.length > 1) { 394 | var filter = args.filter(function (item, index) { return index !== 0 && !item.startsWith('-'); }); 395 | if (filter.length > 0) { 396 | args = args.filter(function (item, index) { return index === 0 || item.startsWith('-'); }); 397 | args.push('--filter'); 398 | args.push(filter.join(' ')); 399 | } 400 | } 401 | return args; 402 | } 403 | var npmToPnpmTable = { 404 | // ------------------------------ 405 | install: function (args) { 406 | if (args.length > 1 && args.filter(function (item) { return !item.startsWith('-'); }).length > 1) { 407 | args[0] = 'add'; 408 | } 409 | return convertPnpmInstallArgs(args); 410 | }, 411 | i: function (args) { 412 | return npmToPnpmTable.install(args); 413 | }, 414 | // ------------------------------ 415 | uninstall: function (args) { 416 | args[0] = 'remove'; 417 | return convertPnpmInstallArgs(args); 418 | }, 419 | un: function (args) { 420 | return npmToPnpmTable.uninstall(args); 421 | }, 422 | remove: function (args) { 423 | return npmToPnpmTable.uninstall(args); 424 | }, 425 | r: function (args) { 426 | return npmToPnpmTable.uninstall(args); 427 | }, 428 | rm: function (args) { 429 | return npmToPnpmTable.uninstall(args); 430 | }, 431 | // ------------------------------ 432 | rb: function (args) { 433 | return npmToPnpmTable.rebuild(args); 434 | }, 435 | rebuild: function (args) { 436 | args[0] = 'rebuild'; 437 | return convertFilterArg(args); 438 | }, 439 | run: 'run', 440 | exec: 'exec', 441 | ls: function (args) { 442 | return npmToPnpmTable.list(args); 443 | }, 444 | list: function (args) { 445 | return args.map(function (item) { 446 | if (item.startsWith('--depth=')) { 447 | return "--depth ".concat(item.split('=')[1]); 448 | } 449 | switch (item) { 450 | case '--production': 451 | return '--prod'; 452 | case '--development': 453 | return '--dev'; 454 | default: 455 | return item; 456 | } 457 | }); 458 | }, 459 | init: function (args) { 460 | if (args[1] && !args[1].startsWith('-')) { 461 | args[0] = 'create'; 462 | var m = args[1].match(/(.+)@latest/); 463 | if (m) { 464 | args[1] = m[1]; 465 | } 466 | } 467 | return args.filter(function (item) { return item !== '--scope'; }); 468 | }, 469 | create: function (args) { 470 | return npmToPnpmTable.init(args); 471 | }, 472 | ln: 'link', 473 | t: 'test', 474 | test: 'test', 475 | tst: 'test', 476 | start: 'start', 477 | link: 'link', 478 | unlink: function (args) { 479 | return convertFilterArg(args); 480 | }, 481 | outdated: 'outdated', 482 | pack: function (args) { 483 | return args.map(function (item) { 484 | if (item.startsWith('--pack-destination')) { 485 | return item.replace(/^--pack-destination[\s=]/, '--pack-destination '); 486 | } 487 | return item; 488 | }); 489 | } 490 | }; 491 | function npmToPnpm(_m, command) { 492 | var args = parse((command || '').trim()); 493 | var index = args.findIndex(function (a) { return a === '--'; }); 494 | if (index >= 0) { 495 | args.splice(index, 1); 496 | } 497 | if (args[0] in npmToPnpmTable) { 498 | var converter = npmToPnpmTable[args[0]]; 499 | if (typeof converter === 'function') { 500 | args = converter(args); 501 | } 502 | else { 503 | args[0] = converter; 504 | } 505 | return 'pnpm ' + args.filter(Boolean).join(' '); 506 | } 507 | else { 508 | return 'npm ' + command + "\n# couldn't auto-convert command"; 509 | } 510 | } 511 | 512 | function convertInstallArgs(args) { 513 | // bun uses -g and --global flags 514 | // bun mostly conforms to Yarn's CLI 515 | return args.map(function (item) { 516 | switch (item) { 517 | case '--save-dev': 518 | case '--development': 519 | case '-D': 520 | return '--dev'; 521 | case '--save-prod': 522 | case '-P': 523 | return '--production'; 524 | case '--no-package-lock': 525 | return '--no-save'; 526 | case '--save-optional': 527 | case '-O': 528 | return '--optional'; 529 | case '--save-exact': 530 | case '-E': 531 | return '--exact'; 532 | case '--save': 533 | case '-S': 534 | // this is default in bun 535 | return ''; 536 | case '--global': 537 | case '-g': 538 | return '--global'; 539 | default: 540 | return item; 541 | } 542 | }); 543 | } 544 | function npmToBun(_m, command) { 545 | var args = parse((command || '').trim()); 546 | var index = args.findIndex(function (a) { return a === '--'; }); 547 | if (index >= 0) { 548 | args.splice(index, 1); 549 | } 550 | var cmd = 'bun'; 551 | switch (args[0]) { 552 | case 'install': 553 | case 'i': 554 | if (args.length === 1) { 555 | args = ['install']; 556 | } 557 | else { 558 | args[0] = 'add'; 559 | } 560 | args = convertInstallArgs(args); 561 | break; 562 | case 'uninstall': 563 | case 'un': 564 | case 'remove': 565 | case 'r': 566 | case 'rm': 567 | args[0] = 'remove'; 568 | args = convertInstallArgs(args); 569 | break; 570 | case 'cache': 571 | if (args[1] === 'clean') { 572 | args = ['pm', 'cache', 'rm'].concat(args.slice(2)); 573 | } 574 | else { 575 | cmd = 'npm'; 576 | } 577 | break; 578 | case 'rebuild': 579 | case 'rb': 580 | args[0] = 'add'; 581 | args.push('--force'); 582 | break; 583 | case 'run': 584 | break; 585 | case 'list': 586 | case 'ls': 587 | // 'npm ls' => 'bun pm ls' 588 | args = convertInstallArgs(args); 589 | args[0] = 'ls'; 590 | args.unshift('pm'); 591 | break; 592 | case 'init': 593 | case 'create': 594 | if (args[1]) { 595 | if (args[1].startsWith('@')) { 596 | cmd = 'bunx'; 597 | args[1] = args[1].replace('/', '/create-'); 598 | args = args.slice(1); 599 | } 600 | else if (!args[1].startsWith('-')) { 601 | cmd = 'bunx'; 602 | args[1] = "create-".concat(args[1].replace('@latest', '')); 603 | args = args.slice(1); 604 | } 605 | else { 606 | args[0] = 'init'; 607 | } 608 | } 609 | break; 610 | case 'link': 611 | case 'ln': 612 | args = convertInstallArgs(args); 613 | args[0] = 'link'; 614 | break; 615 | case 'stop': 616 | case 'start': 617 | case 'unlink': 618 | break; 619 | case 'test': 620 | case 't': 621 | case 'tst': 622 | args[0] = 'test'; 623 | args.unshift('run'); 624 | break; 625 | case 'exec': 626 | cmd = 'bunx'; 627 | args.splice(0, 1); 628 | break; 629 | default: 630 | // null == keep `npm` command 631 | cmd = 'npm'; 632 | break; 633 | } 634 | var filtered = args.filter(Boolean).filter(function (arg) { return arg !== '--'; }); 635 | return "".concat(cmd, " ").concat(filtered.join(' ')).concat(cmd === 'npm' ? "\n# couldn't auto-convert command" : '').replace('=', ' '); 636 | } 637 | 638 | /** 639 | * Converts between npm and yarn command 640 | */ 641 | function convert(str, to) { 642 | if (str.includes('npx') || 643 | str.includes('yarn dlx') || 644 | str.includes('pnpm dlx') || 645 | str.includes('bun x')) { 646 | var executor = str.includes('npx') 647 | ? 'npx' 648 | : str.includes('yarn dlx') 649 | ? 'yarn dlx' 650 | : str.includes('pnpm dlx') 651 | ? 'pnpm dlx' 652 | : 'bun x'; 653 | return str.replace(executor, executorCommands[to]); 654 | } 655 | else if (to === 'npm') { 656 | return str.replace(/yarn(?: +([^&\n\r]*))?/gm, yarnToNPM); 657 | } 658 | else if (to === 'pnpm') { 659 | return str.replace(/npm(?: +([^&\n\r]*))?/gm, npmToPnpm); 660 | } 661 | else if (to === 'bun') { 662 | return str.replace(/npm(?: +([^&\n\r]*))?/gm, npmToBun); 663 | } 664 | else { 665 | return str.replace(/npm(?: +([^&\n\r]*))?/gm, npmToYarn); 666 | } 667 | } 668 | 669 | export { convert as default }; 670 | //# sourceMappingURL=npm-to-yarn.mjs.map 671 | -------------------------------------------------------------------------------- /test/index.spec.ts: -------------------------------------------------------------------------------- 1 | /* global it, expect, describe */ 2 | 3 | import convert from '../src' 4 | 5 | describe('NPM tests', () => { 6 | const tests: [npm: string, yarn: string, pnpm: string, bun: string][] = [ 7 | // install 8 | ['npm install', 'yarn install', 'pnpm install', 'bun install'], 9 | ['npm i', 'yarn install', 'pnpm i', 'bun install'], 10 | ['npm i squirrelly', 'yarn add squirrelly', 'pnpm add squirrelly', 'bun add squirrelly'], 11 | ['npm install squirrelly', 'yarn add squirrelly', 'pnpm add squirrelly', 'bun add squirrelly'], 12 | [ 13 | 'npm install my--save-dev', 14 | 'yarn add my--save-dev', 15 | 'pnpm add my--save-dev', 16 | 'bun add my--save-dev', 17 | ], 18 | [ 19 | 'npm install squirrelly --no-package-lock', 20 | 'yarn add squirrelly --no-lockfile', 21 | 'pnpm add squirrelly --frozen-lockfile', 22 | 'bun add squirrelly --no-save', 23 | ], 24 | [ 25 | 'npm install squirrelly --save-optional', 26 | 'yarn add squirrelly --optional', 27 | 'pnpm add squirrelly --save-optional', 28 | 'bun add squirrelly --optional', 29 | ], 30 | [ 31 | 'npm install squirrelly -O', 32 | 'yarn add squirrelly --optional', 33 | 'pnpm add squirrelly -O', 34 | 'bun add squirrelly --optional', 35 | ], 36 | [ 37 | 'npm install squirrelly --save-exact', 38 | 'yarn add squirrelly --exact', 39 | 'pnpm add squirrelly --save-exact', 40 | 'bun add squirrelly --exact', 41 | ], 42 | [ 43 | 'npm install squirrelly -E', 44 | 'yarn add squirrelly --exact', 45 | 'pnpm add squirrelly -E', 46 | 'bun add squirrelly --exact', 47 | ], 48 | [ 49 | 'npm install squirrelly --save-dev', 50 | 'yarn add squirrelly --dev', 51 | 'pnpm add squirrelly --save-dev', 52 | 'bun add squirrelly --dev', 53 | ], 54 | [ 55 | 'npm install squirrelly -D', 56 | 'yarn add squirrelly --dev', 57 | 'pnpm add squirrelly -D', 58 | 'bun add squirrelly --dev', 59 | ], 60 | [ 61 | 'npm install squirrelly --save-prod', 62 | 'yarn add squirrelly --production', 63 | 'pnpm add squirrelly --save-prod', 64 | 'bun add squirrelly --production', 65 | ], 66 | [ 67 | 'npm install squirrelly -P', 68 | 'yarn add squirrelly --production', 69 | 'pnpm add squirrelly -P', 70 | 'bun add squirrelly --production', 71 | ], 72 | [ 73 | 'npm install squirrelly --save', 74 | 'yarn add squirrelly', 75 | 'pnpm add squirrelly', 76 | 'bun add squirrelly', 77 | ], 78 | [ 79 | 'npm install squirrelly -S', 80 | 'yarn add squirrelly', 81 | 'pnpm add squirrelly', 82 | 'bun add squirrelly', 83 | ], 84 | [ 85 | 'npm install squirrelly --global', 86 | 'yarn global add squirrelly', 87 | 'pnpm add squirrelly --global', 88 | 'bun add squirrelly --global', 89 | ], 90 | [ 91 | 'npm install squirrelly -g', 92 | 'yarn global add squirrelly', 93 | 'pnpm add squirrelly -g', 94 | 'bun add squirrelly --global', 95 | ], 96 | [ 97 | 'npm install squirrelly --no-save', 98 | 'yarn add squirrelly --no-save', 99 | 'pnpm add squirrelly --no-save', 100 | 'bun add squirrelly --no-save', 101 | ], 102 | // uninstall 103 | ['npm r squirrelly', 'yarn remove squirrelly', 'pnpm remove squirrelly', 'bun remove squirrelly'], 104 | ['npm remove squirrelly', 'yarn remove squirrelly', 'pnpm remove squirrelly', 'bun remove squirrelly'], 105 | ['npm uninstall squirrelly', 'yarn remove squirrelly', 'pnpm remove squirrelly', 'bun remove squirrelly'], 106 | [ 107 | 'npm un squirrelly', 108 | 'yarn remove squirrelly', 109 | 'pnpm remove squirrelly', 110 | 'bun remove squirrelly', 111 | ], 112 | [ 113 | 'npm uninstall squirrelly --global', 114 | 'yarn global remove squirrelly', 115 | 'pnpm remove squirrelly --global', 116 | 'bun remove squirrelly --global', 117 | ], 118 | // cache 119 | [ 120 | 'npm cache clean', 121 | 'yarn cache clean', 122 | "npm cache clean\n# couldn't auto-convert command", 123 | 'bun pm cache rm', 124 | ], 125 | // version 126 | [ 127 | 'npm version', 128 | 'yarn version', 129 | "npm version\n# couldn't auto-convert command", 130 | "npm version\n# couldn't auto-convert command", 131 | ], 132 | [ 133 | 'npm version major', 134 | 'yarn version --major', 135 | "npm version major\n# couldn't auto-convert command", 136 | "npm version major\n# couldn't auto-convert command", 137 | ], 138 | [ 139 | 'npm version minor', 140 | 'yarn version --minor', 141 | "npm version minor\n# couldn't auto-convert command", 142 | "npm version minor\n# couldn't auto-convert command", 143 | ], 144 | [ 145 | 'npm version patch', 146 | 'yarn version --patch', 147 | "npm version patch\n# couldn't auto-convert command", 148 | "npm version patch\n# couldn't auto-convert command", 149 | ], 150 | // rebuild 151 | ['npm rebuild', 'yarn add --force', 'pnpm rebuild', 'bun add --force'], 152 | ['npm rb', 'yarn add --force', 'pnpm rebuild', 'bun add --force'], 153 | [ 154 | 'npm rebuild package', 155 | 'yarn add package --force', 156 | 'pnpm rebuild --filter package', 157 | 'bun add package --force', 158 | ], 159 | [ 160 | 'npm rb package', 161 | 'yarn add package --force', 162 | 'pnpm rebuild --filter package', 163 | 'bun add package --force', 164 | ], 165 | // run 166 | ['npm run', 'yarn run', 'pnpm run', 'bun run'], 167 | ['npm run package', 'yarn package', 'pnpm run package', 'bun run package'], 168 | [ 169 | 'npm run test -- --version', 170 | 'yarn run test --version', 171 | 'pnpm run test --version', 172 | 'bun run test --version', 173 | ], 174 | ['npm run test -- -v', 'yarn run test -v', 'pnpm run test -v', 'bun run test -v'], 175 | ['npm run custom', 'yarn custom', 'pnpm run custom', 'bun run custom'], 176 | ['npm run add', 'yarn run add', 'pnpm run add', 'bun run add'], 177 | ['npm run install', 'yarn run install', 'pnpm run install', 'bun run install'], 178 | ['npm run run', 'yarn run run', 'pnpm run run', 'bun run run'], 179 | ['npm exec custom', 'yarn custom', 'pnpm exec custom', 'bunx custom'], 180 | ['npm exec add', 'yarn run add', 'pnpm exec add', 'bunx add'], 181 | ['npm exec install', 'yarn run install', 'pnpm exec install', 'bunx install'], 182 | ['npm exec run', 'yarn run run', 'pnpm exec run', 'bunx run'], 183 | ['npm exec custom -- --version', 'yarn custom --version', 'pnpm exec custom --version', 'bunx custom --version'], 184 | // test 185 | ['npm test', 'yarn test', 'pnpm test', 'bun run test'], 186 | ['npm t', 'yarn test', 'pnpm test', 'bun run test'], 187 | ['npm tst', 'yarn test', 'pnpm test', 'bun run test'], 188 | [ 189 | 'npm test -- --version', 190 | 'yarn test --version', 191 | 'pnpm test --version', 192 | 'bun run test --version', 193 | ], 194 | ['npm test -- -v', 'yarn test -v', 'pnpm test -v', 'bun run test -v'], 195 | // unchanged 196 | ['npm start', 'yarn start', 'pnpm start', 'bun start'], 197 | ['npm stop', 'yarn stop', "npm stop\n# couldn't auto-convert command", 'bun stop'], 198 | // unsupported 199 | [ 200 | 'npm whoami', 201 | "npm whoami\n# couldn't auto-convert command", 202 | "npm whoami\n# couldn't auto-convert command", 203 | "npm whoami\n# couldn't auto-convert command", 204 | ], 205 | // init 206 | ['npm init', 'yarn init', 'pnpm init', 'bun init'], 207 | ['npm init -y', 'yarn init -y', 'pnpm init -y', 'bun init -y'], 208 | ['npm init --yes', 'yarn init --yes', 'pnpm init --yes', 'bun init --yes'], 209 | ['npm init --scope', 'yarn init', 'pnpm init', 'bun init --scope'], 210 | ['npm init --private', 'yarn init --private', 'pnpm init --private', 'bun init --private'], 211 | [ 212 | 'npm init --unknown-arg', 213 | 'yarn init --unknown-arg', 214 | 'pnpm init --unknown-arg', 215 | 'bun init --unknown-arg', 216 | ], 217 | ['npm init esm --yes', 'yarn create esm --yes', 'pnpm create esm --yes', 'bunx create-esm --yes'], 218 | [ 219 | 'npm init @scope/my-package', 220 | 'yarn create @scope/my-package', 221 | 'pnpm create @scope/my-package', 222 | 'bunx @scope/create-my-package', 223 | ], 224 | [ 225 | 'npm init react-app ./my-react-app', 226 | 'yarn create react-app ./my-react-app', 227 | 'pnpm create react-app ./my-react-app', 228 | 'bunx create-react-app ./my-react-app', 229 | ], 230 | // create 231 | [ 232 | 'npm create react-app ./my-react-app', 233 | 'yarn create react-app ./my-react-app', 234 | 'pnpm create react-app ./my-react-app', 235 | 'bunx create-react-app ./my-react-app', 236 | ], 237 | [ 238 | 'npm create vite@latest', 239 | 'yarn create vite', 240 | 'pnpm create vite', 241 | 'bunx create-vite', 242 | ], 243 | // list 244 | ['npm list', 'yarn list', 'pnpm list', 'bun pm ls'], 245 | ['npm ls', 'yarn list', 'pnpm ls', 'bun pm ls'], 246 | [ 247 | 'npm list --production', 248 | 'yarn list --production', 249 | 'pnpm list --prod', 250 | 'bun pm ls --production', 251 | ], 252 | ['npm list --development', 'yarn list --development', 'pnpm list --dev', 'bun pm ls --dev'], 253 | ['npm list --global', 'yarn list --global', 'pnpm list --global', 'bun pm ls --global'], 254 | ['npm list --depth=0', 'yarn list --depth=0', 'pnpm list --depth 0', 'bun pm ls --depth 0'], 255 | ['npm list package', 'yarn list --pattern "package"', 'pnpm list package', 'bun pm ls package'], 256 | [ 257 | 'npm list package package2', 258 | 'yarn list --pattern "package|package2"', 259 | 'pnpm list package package2', 260 | 'bun pm ls package package2', 261 | ], 262 | [ 263 | 'npm list @scope/package @scope/package2', 264 | 'yarn list --pattern "@scope/package|@scope/package2"', 265 | 'pnpm list @scope/package @scope/package2', 266 | 'bun pm ls @scope/package @scope/package2', 267 | ], 268 | [ 269 | 'npm list @scope/package @scope/package2 --depth=2', 270 | 'yarn list --pattern "@scope/package|@scope/package2" --depth=2', 271 | 'pnpm list @scope/package @scope/package2 --depth 2', 272 | 'bun pm ls @scope/package @scope/package2 --depth 2', 273 | ], 274 | [ 275 | 'npm list @scope/package @scope/package2 --depth 2', 276 | 'yarn list --pattern "@scope/package|@scope/package2" --depth 2', 277 | 'pnpm list @scope/package @scope/package2 --depth 2', 278 | 'bun pm ls @scope/package @scope/package2 --depth 2', 279 | ], 280 | [ 281 | 'npm list @scope/package --json', 282 | 'yarn list --pattern "@scope/package" --json', 283 | 'pnpm list @scope/package --json', 284 | 'bun pm ls @scope/package --json', 285 | ], 286 | // link 287 | ['npm ln', 'yarn link', 'pnpm link', 'bun link'], 288 | ['npm ln package', 'yarn link package', 'pnpm link package', 'bun link package'], 289 | ['npm link', 'yarn link', 'pnpm link', 'bun link'], 290 | ['npm link package', 'yarn link package', 'pnpm link package', 'bun link package'], 291 | // unlink 292 | ['npm unlink', 'yarn unlink', 'pnpm unlink', 'bun unlink'], 293 | [ 294 | 'npm unlink package', 295 | 'yarn unlink package', 296 | 'pnpm unlink --filter package', 297 | 'bun unlink package', 298 | ], 299 | // outdated 300 | [ 301 | 'npm outdated', 302 | 'yarn outdated', 303 | 'pnpm outdated', 304 | "npm outdated\n# couldn't auto-convert command", 305 | ], 306 | [ 307 | 'npm outdated --json', 308 | 'yarn outdated --json', 309 | 'pnpm outdated --json', 310 | "npm outdated --json\n# couldn't auto-convert command", 311 | ], 312 | [ 313 | 'npm outdated --long', 314 | 'yarn outdated --long', 315 | 'pnpm outdated --long', 316 | "npm outdated --long\n# couldn't auto-convert command", 317 | ], 318 | [ 319 | 'npm outdated lodash', 320 | 'yarn outdated lodash', 321 | 'pnpm outdated lodash', 322 | "npm outdated lodash\n# couldn't auto-convert command", 323 | ], 324 | // pack 325 | ['npm pack', 'yarn pack', 'pnpm pack', "npm pack\n# couldn't auto-convert command"], 326 | [ 327 | 'npm pack --pack-destination=foobar', 328 | 'yarn pack --filename foobar', 329 | 'pnpm pack --pack-destination foobar', 330 | "npm pack --pack-destination foobar\n# couldn't auto-convert command", 331 | ], 332 | ]; 333 | 334 | describe('to Yarn', () => { 335 | it.each(tests)('%s', (npmValue, yarnValue) => { 336 | expect(convert(npmValue, 'yarn')).toEqual(yarnValue) 337 | }) 338 | }) 339 | 340 | describe('to PNPM', () => { 341 | it.each(tests)('%s', (npmValue, _yarnValue, pnpmValue) => { 342 | expect(convert(npmValue, 'pnpm')).toEqual(pnpmValue) 343 | }) 344 | }) 345 | 346 | describe('to Bun', () => { 347 | it.each(tests)('%s', (npmValue, _yarnValue, _pnpmValue, bunValue) => { 348 | expect(convert(npmValue, 'bun')).toEqual(bunValue) 349 | }) 350 | }) 351 | }) 352 | 353 | describe('Yarn to NPM tests', () => { 354 | const tests = [ 355 | // install 356 | ['yarn', 'npm install'], 357 | ['yarn install', 'npm install'], 358 | // add 359 | ['yarn add squirrelly', 'npm install squirrelly'], 360 | ['yarn add squirrelly --no-lockfile', 'npm install squirrelly --no-package-lock'], 361 | ['yarn add squirrelly --optional', 'npm install squirrelly --save-optional'], 362 | ['yarn add squirrelly --exact', 'npm install squirrelly --save-exact'], 363 | ['yarn add squirrelly --production', 'npm install squirrelly --save-prod'], 364 | ['yarn add squirrelly --dev', 'npm install squirrelly --save-dev'], 365 | ['yarn add --force', 'npm rebuild'], 366 | ['yarn add package --force', 'npm install package --force'], 367 | // remove 368 | ['yarn remove squirrelly', 'npm uninstall squirrelly'], 369 | ['yarn remove squirrelly --dev', 'npm uninstall squirrelly --save-dev'], 370 | // cache 371 | ['yarn cache clean', 'npm cache clean'], 372 | // implied run 373 | ['yarn grunt', 'npm run grunt'], 374 | // global 375 | ['yarn global add squirrelly', 'npm install squirrelly --global'], 376 | ['yarn global remove squirrelly', 'npm uninstall squirrelly --global'], 377 | ['yarn global squirrelly', "npm global squirrelly \n# couldn't auto-convert command"], 378 | ['yarn global list', 'npm ls --global'], 379 | // version 380 | ['yarn version', 'npm version'], 381 | ['yarn version --major', 'npm version major'], 382 | ['yarn version --minor', 'npm version minor'], 383 | ['yarn version --patch', 'npm version patch'], 384 | // init 385 | ['yarn init', 'npm init'], 386 | ['yarn init -y', 'npm init -y'], 387 | ['yarn init --yes', 'npm init --yes'], 388 | ['yarn init --private', 'npm init --private'], 389 | ['yarn init --unknown-arg', 'npm init --unknown-arg'], 390 | // create 391 | ['yarn create esm --yes', 'npm init esm --yes'], 392 | ['yarn create @scope/my-package', 'npm init @scope/my-package'], 393 | ['yarn create react-app ./my-react-app', 'npm init react-app ./my-react-app'], 394 | // unchanged 395 | ['yarn start', 'npm start'], 396 | ['yarn stop', 'npm stop'], 397 | ['yarn test', 'npm test'], 398 | // run 399 | ['yarn run', 'npm run'], 400 | ['yarn custom', 'npm run custom'], 401 | ['yarn run custom', 'npm run custom'], 402 | ['yarn run add', 'npm run add'], 403 | ['yarn run install', 'npm run install'], 404 | ['yarn run run', 'npm run run'], 405 | ['yarn run --silent', 'npm run --silent'], 406 | ['yarn custom -- --version', 'npm run custom -- --version'], 407 | ['yarn run custom -- --version', 'npm run custom -- --version'], 408 | ['yarn run custom --version', 'npm run custom --version'], 409 | // list 410 | ['yarn list', 'npm ls'], 411 | ['yarn list --pattern "package"', 'npm ls package'], 412 | ['yarn list --pattern "package|package2"', 'npm ls package package2'], 413 | [ 414 | 'yarn list --pattern "@scope/package|@scope/package2"', 415 | 'npm ls @scope/package @scope/package2' 416 | ], 417 | ['yarn list --depth 2', 'npm ls --depth 2'], 418 | ['yarn list --json', 'npm ls --json'], 419 | ['yarn list --production', 'npm ls --production'], 420 | ['yarn list --development', 'npm ls --development'], 421 | // link/unlink 422 | ['yarn link', 'npm link'], 423 | ['yarn link custom', 'npm link custom'], 424 | ['yarn unlink', 'npm unlink'], 425 | ['yarn unlink custom', 'npm unlink custom'], 426 | // outdated 427 | ['yarn outdated', 'npm outdated'], 428 | ['yarn outdated --json', 'npm outdated --json'], 429 | ['yarn outdated --long', 'npm outdated --long'], 430 | ['yarn outdated lodash', 'npm outdated lodash'], 431 | // pack 432 | ['yarn pack', 'npm pack'], 433 | ['yarn pack --filename foobar', 'npm pack --pack-destination foobar'], 434 | // unsupported 435 | ['yarn why', "npm why\n# couldn't auto-convert command"], 436 | ['yarn upgrade-interactive', "npm upgrade-interactive\n# couldn't auto-convert command"] 437 | ] 438 | 439 | it.each(tests)('%s', (yarnValue, npmValue) => { 440 | expect(convert(yarnValue, 'npm')).toEqual(npmValue) 441 | }) 442 | }) 443 | 444 | describe('to yarn dlx tests', () => { 445 | const tests: [npm: string, yarn: string][] = [ 446 | // npx -> ... 447 | [ 448 | 'npx create-next-app', 449 | 'yarn dlx create-next-app', 450 | ], 451 | [ 452 | 'npx prettier --help', 453 | 'yarn dlx prettier --help', 454 | ], 455 | [ 456 | 'npx prettier -w .', 457 | 'yarn dlx prettier -w .', 458 | ], 459 | [ 460 | 'npx @neutrinojs/create-project my-app', 461 | 'yarn dlx @neutrinojs/create-project my-app', 462 | ], 463 | [ 464 | 'npx create-react-app my-app --template typescript', 465 | 'yarn dlx create-react-app my-app --template typescript', 466 | ], 467 | // pnpm dlx -> ... 468 | [ 469 | 'pnpm dlx create-next-app', 470 | 'yarn dlx create-next-app', 471 | ], 472 | [ 473 | 'pnpm dlx prettier --help', 474 | 'yarn dlx prettier --help', 475 | ], 476 | [ 477 | 'pnpm dlx prettier -w .', 478 | 'yarn dlx prettier -w .', 479 | ], 480 | [ 481 | 'pnpm dlx @neutrinojs/create-project my-app', 482 | 'yarn dlx @neutrinojs/create-project my-app', 483 | ], 484 | [ 485 | 'pnpm dlx create-react-app my-app --template typescript', 486 | 'yarn dlx create-react-app my-app --template typescript', 487 | ], 488 | // bun x -> ... 489 | [ 490 | 'bun x create-next-app', 491 | 'yarn dlx create-next-app', 492 | ], 493 | [ 494 | 'bun x prettier --help', 495 | 'yarn dlx prettier --help', 496 | ], 497 | [ 498 | 'bun x prettier -w .', 499 | 'yarn dlx prettier -w .', 500 | ], 501 | [ 502 | 'bun x @neutrinojs/create-project my-app', 503 | 'yarn dlx @neutrinojs/create-project my-app', 504 | ], 505 | [ 506 | 'bun x create-react-app my-app --template typescript', 507 | 'yarn dlx create-react-app my-app --template typescript', 508 | ], 509 | ] 510 | 511 | describe('to Yarn', () => { 512 | it.each(tests)('%s', (npmValue, yarnValue) => { 513 | expect(convert(npmValue, 'yarn')).toEqual(yarnValue) 514 | }) 515 | }) 516 | }) 517 | 518 | describe('to pnpm dlx tests', () => { 519 | const tests: [npm: string, pnpm: string][] = [ 520 | // npx -> ... 521 | [ 522 | 'npx create-next-app', 523 | 'pnpm dlx create-next-app', 524 | ], 525 | [ 526 | 'npx prettier --help', 527 | 'pnpm dlx prettier --help', 528 | ], 529 | [ 530 | 'npx prettier -w .', 531 | 'pnpm dlx prettier -w .', 532 | ], 533 | [ 534 | 'npx @neutrinojs/create-project my-app', 535 | 'pnpm dlx @neutrinojs/create-project my-app', 536 | ], 537 | [ 538 | 'npx create-react-app my-app --template typescript', 539 | 'pnpm dlx create-react-app my-app --template typescript', 540 | ], 541 | // yarn dlx -> ... 542 | [ 543 | 'yarn dlx create-next-app', 544 | 'pnpm dlx create-next-app', 545 | ], 546 | [ 547 | 'yarn dlx prettier --help', 548 | 'pnpm dlx prettier --help', 549 | ], 550 | [ 551 | 'yarn dlx prettier -w .', 552 | 'pnpm dlx prettier -w .', 553 | ], 554 | [ 555 | 'yarn dlx @neutrinojs/create-project my-app', 556 | 'pnpm dlx @neutrinojs/create-project my-app', 557 | ], 558 | [ 559 | 'yarn dlx create-react-app my-app --template typescript', 560 | 'pnpm dlx create-react-app my-app --template typescript', 561 | ], 562 | // bun x -> ... 563 | [ 564 | 'bun x create-next-app', 565 | 'pnpm dlx create-next-app', 566 | ], 567 | [ 568 | 'bun x prettier --help', 569 | 'pnpm dlx prettier --help', 570 | ], 571 | [ 572 | 'bun x prettier -w .', 573 | 'pnpm dlx prettier -w .', 574 | ], 575 | [ 576 | 'bun x @neutrinojs/create-project my-app', 577 | 'pnpm dlx @neutrinojs/create-project my-app', 578 | ], 579 | [ 580 | 'bun x create-react-app my-app --template typescript', 581 | 'pnpm dlx create-react-app my-app --template typescript', 582 | ], 583 | ] 584 | 585 | describe('to PNPM', () => { 586 | it.each(tests)('%s', (npmValue, pnpmValue) => { 587 | expect(convert(npmValue, 'pnpm')).toEqual(pnpmValue) 588 | }) 589 | }) 590 | }) 591 | 592 | describe('to bun x tests', () => { 593 | const tests: [npm: string, bun: string][] = [ 594 | // npx -> ... 595 | [ 596 | 'npx create-next-app', 597 | 'bun x create-next-app', 598 | ], 599 | [ 600 | 'npx prettier --help', 601 | 'bun x prettier --help', 602 | ], 603 | [ 604 | 'npx prettier -w .', 605 | 'bun x prettier -w .', 606 | ], 607 | [ 608 | 'npx @neutrinojs/create-project my-app', 609 | 'bun x @neutrinojs/create-project my-app', 610 | ], 611 | [ 612 | 'npx create-react-app my-app --template typescript', 613 | 'bun x create-react-app my-app --template typescript', 614 | ], 615 | // yarn dlx -> ... 616 | [ 617 | 'yarn dlx create-next-app', 618 | 'bun x create-next-app', 619 | ], 620 | [ 621 | 'yarn dlx prettier --help', 622 | 'bun x prettier --help', 623 | ], 624 | [ 625 | 'yarn dlx prettier -w .', 626 | 'bun x prettier -w .', 627 | ], 628 | [ 629 | 'yarn dlx @neutrinojs/create-project my-app', 630 | 'bun x @neutrinojs/create-project my-app', 631 | ], 632 | [ 633 | 'yarn dlx create-react-app my-app --template typescript', 634 | 'bun x create-react-app my-app --template typescript', 635 | ], 636 | // pnpm dlx -> ... 637 | [ 638 | 'pnpm dlx create-next-app', 639 | 'bun x create-next-app', 640 | ], 641 | [ 642 | 'pnpm dlx prettier --help', 643 | 'bun x prettier --help', 644 | ], 645 | [ 646 | 'pnpm dlx prettier -w .', 647 | 'bun x prettier -w .', 648 | ], 649 | [ 650 | 'pnpm dlx @neutrinojs/create-project my-app', 651 | 'bun x @neutrinojs/create-project my-app', 652 | ], 653 | [ 654 | 'pnpm dlx create-react-app my-app --template typescript', 655 | 'bun x create-react-app my-app --template typescript', 656 | ], 657 | ] 658 | 659 | describe('to Bun', () => { 660 | it.each(tests)('%s', (npmValue, bunValue) => { 661 | expect(convert(npmValue, 'bun')).toEqual(bunValue) 662 | }) 663 | }) 664 | }) 665 | -------------------------------------------------------------------------------- /dist/npm-to-yarn.umd.js: -------------------------------------------------------------------------------- 1 | (function (global, factory) { 2 | typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : 3 | typeof define === 'function' && define.amd ? define(factory) : 4 | (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.n2y = factory()); 5 | })(this, (function () { 'use strict'; 6 | 7 | var unchangedCLICommands = [ 8 | 'test', 9 | 'login', 10 | 'logout', 11 | 'link', 12 | 'unlink', 13 | 'publish', 14 | 'cache', 15 | 'start', 16 | 'stop', 17 | 'test' 18 | ]; 19 | var yarnCLICommands = [ 20 | 'init', 21 | 'run', 22 | 'add', 23 | 'audit', 24 | 'autoclean', 25 | 'bin', 26 | 'check', 27 | 'config', 28 | 'create', 29 | 'dedupe', 30 | 'generate-lock-entry', 31 | 'global', 32 | 'help', 33 | 'import', 34 | 'info', 35 | 'install', 36 | 'licenses', 37 | 'list', 38 | 'lockfile', 39 | 'outdated', 40 | 'owner', 41 | 'pack', 42 | 'policies', 43 | 'prune', 44 | 'remove', 45 | 'self-update', 46 | 'tag', 47 | 'team', 48 | 'upgrade', 49 | 'upgrade-interactive', 50 | 'version', 51 | 'versions', 52 | 'why', 53 | 'workspace', 54 | 'workspaces' 55 | ]; 56 | var executorCommands = { 57 | npm: 'npx', 58 | yarn: 'yarn dlx', 59 | pnpm: 'pnpm dlx', 60 | bun: 'bun x' 61 | }; 62 | 63 | function parse(command) { 64 | var args = []; 65 | var lastQuote = false; 66 | var escaped = false; 67 | var part = ''; 68 | for (var i = 0; i < command.length; ++i) { 69 | var char = command.charAt(i); 70 | if (char === '\\') { 71 | part += char; 72 | escaped = true; 73 | } 74 | else { 75 | if (char === ' ' && !lastQuote) { 76 | args.push(part); 77 | part = ''; 78 | } 79 | else if (!escaped && (char === '"' || char === "'")) { 80 | part += char; 81 | if (char === lastQuote) { 82 | lastQuote = false; 83 | } 84 | else if (!lastQuote) { 85 | lastQuote = char; 86 | } 87 | } 88 | else { 89 | part += char; 90 | } 91 | escaped = false; 92 | } 93 | } 94 | args.push(part); 95 | return args; 96 | } 97 | 98 | function convertAddRemoveArgs(args) { 99 | return args.map(function (item) { 100 | switch (item) { 101 | case '--no-lockfile': 102 | return '--no-package-lock'; 103 | case '--production': 104 | return '--save-prod'; 105 | case '--dev': 106 | return '--save-dev'; 107 | case '--optional': 108 | return '--save-optional'; 109 | case '--exact': 110 | return '--save-exact'; 111 | default: 112 | return item; 113 | } 114 | }); 115 | } 116 | var yarnToNpmTable = { 117 | add: function (args) { 118 | if (args.length === 2 && args[1] === '--force') { 119 | return ['rebuild']; 120 | } 121 | args[0] = 'install'; 122 | return convertAddRemoveArgs(args); 123 | }, 124 | remove: function (args) { 125 | args[0] = 'uninstall'; 126 | return convertAddRemoveArgs(args); 127 | }, 128 | version: function (args) { 129 | return args.map(function (item) { 130 | switch (item) { 131 | case '--major': 132 | return 'major'; 133 | case '--minor': 134 | return 'minor'; 135 | case '--patch': 136 | return 'patch'; 137 | default: 138 | return item; 139 | } 140 | }); 141 | }, 142 | install: 'install', 143 | list: function (args) { 144 | args[0] = 'ls'; 145 | var patternIndex = args.findIndex(function (item) { return item === '--pattern'; }); 146 | if (patternIndex >= 0 && args[patternIndex + 1]) { 147 | var packages = args[patternIndex + 1].replace(/["']([^"']+)["']/, '$1').split('|'); 148 | args.splice(patternIndex, 2, packages.join(' ')); 149 | } 150 | return args; 151 | }, 152 | init: 'init', 153 | create: 'init', 154 | outdated: 'outdated', 155 | run: 'run', 156 | global: function (args) { 157 | switch (args[1]) { 158 | case 'add': 159 | args.shift(); 160 | args = yarnToNpmTable.add(args); 161 | args.push('--global'); 162 | return args; 163 | case 'remove': 164 | args.shift(); 165 | args = yarnToNpmTable.remove(args); 166 | args.push('--global'); 167 | return args; 168 | case 'list': 169 | args.shift(); 170 | args = yarnToNpmTable.list(args); 171 | args.push('--global'); 172 | return args; 173 | // case 'bin': 174 | // case 'upgrade': 175 | default: 176 | args.push("\n# couldn't auto-convert command"); 177 | return args; 178 | } 179 | }, 180 | pack: function (args) { 181 | return args.map(function (item) { 182 | if (item === '--filename') { 183 | return '--pack-destination'; 184 | } 185 | return item; 186 | }); 187 | } 188 | }; 189 | function yarnToNPM(_m, command) { 190 | command = (command || '').trim(); 191 | if (command === '') { 192 | return 'npm install'; 193 | } 194 | var args = parse(command); 195 | var firstCommand = (/\w+/.exec(command) || [''])[0]; 196 | if (unchangedCLICommands.includes(args[0])) { 197 | return 'npm ' + command; 198 | } 199 | else if (args[0] in yarnToNpmTable) { 200 | var converter = yarnToNpmTable[args[0]]; 201 | if (typeof converter === 'function') { 202 | args = converter(args); 203 | } 204 | else { 205 | args[0] = converter; 206 | } 207 | return 'npm ' + args.filter(Boolean).join(' '); 208 | } 209 | else if (!yarnCLICommands.includes(firstCommand)) { 210 | // i.e., yarn grunt -> npm run grunt 211 | return 'npm run ' + command; 212 | } 213 | else { 214 | return 'npm ' + command + "\n# couldn't auto-convert command"; 215 | } 216 | } 217 | 218 | function convertInstallArgs$1(args) { 219 | if (args.includes('--global') || args.includes('-g')) { 220 | args.unshift('global'); 221 | } 222 | return args.map(function (item) { 223 | switch (item) { 224 | case '--save-dev': 225 | case '-D': 226 | return '--dev'; 227 | case '--save-prod': 228 | case '-P': 229 | return '--production'; 230 | case '--no-package-lock': 231 | return '--no-lockfile'; 232 | case '--save-optional': 233 | case '-O': 234 | return '--optional'; 235 | case '--save-exact': 236 | case '-E': 237 | return '--exact'; 238 | case '--save': 239 | case '-S': 240 | case '--global': 241 | case '-g': 242 | return ''; 243 | default: 244 | return item; 245 | } 246 | }); 247 | } 248 | var npmToYarnTable = { 249 | install: function (args) { 250 | if (args.length === 1) { 251 | return ['install']; 252 | } 253 | args[0] = 'add'; 254 | return convertInstallArgs$1(args); 255 | }, 256 | i: function (args) { 257 | return npmToYarnTable.install(args); 258 | }, 259 | uninstall: function (args) { 260 | args[0] = 'remove'; 261 | return convertInstallArgs$1(args); 262 | }, 263 | un: function (args) { 264 | return npmToYarnTable.uninstall(args); 265 | }, 266 | remove: function (args) { 267 | return npmToYarnTable.uninstall(args); 268 | }, 269 | r: function (args) { 270 | return npmToYarnTable.uninstall(args); 271 | }, 272 | rm: function (args) { 273 | return npmToYarnTable.uninstall(args); 274 | }, 275 | version: function (args) { 276 | return args.map(function (item) { 277 | switch (item) { 278 | case 'major': 279 | return '--major'; 280 | case 'minor': 281 | return '--minor'; 282 | case 'patch': 283 | return '--patch'; 284 | default: 285 | return item; 286 | } 287 | }); 288 | }, 289 | rb: function (args) { 290 | return npmToYarnTable.rebuild(args); 291 | }, 292 | rebuild: function (args) { 293 | args[0] = 'add'; 294 | args.push('--force'); 295 | return args; 296 | }, 297 | run: function (args) { 298 | if (args[1] && !unchangedCLICommands.includes(args[1]) && !yarnCLICommands.includes(args[1])) { 299 | args.splice(0, 1); 300 | } 301 | return args; 302 | }, 303 | exec: function (args) { 304 | args[0] = 'run'; 305 | return npmToYarnTable.run(args); 306 | }, 307 | ls: function (args) { 308 | args[0] = 'list'; 309 | var ended = false; 310 | var packages = args.filter(function (item, id) { 311 | if (id > 0 && !ended) { 312 | ended = item.startsWith('-'); 313 | return !ended; 314 | } 315 | return false; 316 | }); 317 | if (packages.length > 0) { 318 | args.splice(1, packages.length, '--pattern', '"' + packages.join('|') + '"'); 319 | } 320 | return args; 321 | }, 322 | list: function (args) { 323 | return npmToYarnTable.ls(args); 324 | }, 325 | init: function (args) { 326 | if (args[1] && !args[1].startsWith('-')) { 327 | args[0] = 'create'; 328 | var m = args[1].match(/(.+)@latest/); 329 | if (m) { 330 | args[1] = m[1]; 331 | } 332 | } 333 | return args.filter(function (item) { return item !== '--scope'; }); 334 | }, 335 | create: function (args) { 336 | return npmToYarnTable.init(args); 337 | }, 338 | ln: 'link', 339 | t: 'test', 340 | tst: 'test', 341 | outdated: 'outdated', 342 | pack: function (args) { 343 | return args.map(function (item) { 344 | if (item.startsWith('--pack-destination')) { 345 | return item.replace(/^--pack-destination[\s=]/, '--filename '); 346 | } 347 | return item; 348 | }); 349 | } 350 | }; 351 | function npmToYarn(_m, command) { 352 | var args = parse((command || '').trim()); 353 | var index = args.findIndex(function (a) { return a === '--'; }); 354 | if (index >= 0) { 355 | args.splice(index, 1); 356 | } 357 | if (unchangedCLICommands.includes(args[0])) { 358 | return 'yarn ' + args.filter(Boolean).join(' '); 359 | } 360 | else if (args[0] in npmToYarnTable) { 361 | var converter = npmToYarnTable[args[0]]; 362 | if (typeof converter === 'function') { 363 | args = converter(args); 364 | } 365 | else { 366 | args[0] = converter; 367 | } 368 | return 'yarn ' + args.filter(Boolean).join(' '); 369 | } 370 | else { 371 | return 'npm ' + command + "\n# couldn't auto-convert command"; 372 | } 373 | } 374 | 375 | function convertPnpmInstallArgs(args) { 376 | return args.map(function (item) { 377 | switch (item) { 378 | case '--save': 379 | case '-S': 380 | return ''; 381 | case '--no-package-lock': 382 | return '--frozen-lockfile'; 383 | // case '--save-dev': 384 | // case '-D': 385 | // case '--save-prod': 386 | // case '-P': 387 | // case '--save-optional': 388 | // case '-O': 389 | // case '--save-exact': 390 | // case '-E': 391 | // case '--global': 392 | // case '-g': 393 | default: 394 | return item; 395 | } 396 | }); 397 | } 398 | function convertFilterArg(args) { 399 | if (args.length > 1) { 400 | var filter = args.filter(function (item, index) { return index !== 0 && !item.startsWith('-'); }); 401 | if (filter.length > 0) { 402 | args = args.filter(function (item, index) { return index === 0 || item.startsWith('-'); }); 403 | args.push('--filter'); 404 | args.push(filter.join(' ')); 405 | } 406 | } 407 | return args; 408 | } 409 | var npmToPnpmTable = { 410 | // ------------------------------ 411 | install: function (args) { 412 | if (args.length > 1 && args.filter(function (item) { return !item.startsWith('-'); }).length > 1) { 413 | args[0] = 'add'; 414 | } 415 | return convertPnpmInstallArgs(args); 416 | }, 417 | i: function (args) { 418 | return npmToPnpmTable.install(args); 419 | }, 420 | // ------------------------------ 421 | uninstall: function (args) { 422 | args[0] = 'remove'; 423 | return convertPnpmInstallArgs(args); 424 | }, 425 | un: function (args) { 426 | return npmToPnpmTable.uninstall(args); 427 | }, 428 | remove: function (args) { 429 | return npmToPnpmTable.uninstall(args); 430 | }, 431 | r: function (args) { 432 | return npmToPnpmTable.uninstall(args); 433 | }, 434 | rm: function (args) { 435 | return npmToPnpmTable.uninstall(args); 436 | }, 437 | // ------------------------------ 438 | rb: function (args) { 439 | return npmToPnpmTable.rebuild(args); 440 | }, 441 | rebuild: function (args) { 442 | args[0] = 'rebuild'; 443 | return convertFilterArg(args); 444 | }, 445 | run: 'run', 446 | exec: 'exec', 447 | ls: function (args) { 448 | return npmToPnpmTable.list(args); 449 | }, 450 | list: function (args) { 451 | return args.map(function (item) { 452 | if (item.startsWith('--depth=')) { 453 | return "--depth ".concat(item.split('=')[1]); 454 | } 455 | switch (item) { 456 | case '--production': 457 | return '--prod'; 458 | case '--development': 459 | return '--dev'; 460 | default: 461 | return item; 462 | } 463 | }); 464 | }, 465 | init: function (args) { 466 | if (args[1] && !args[1].startsWith('-')) { 467 | args[0] = 'create'; 468 | var m = args[1].match(/(.+)@latest/); 469 | if (m) { 470 | args[1] = m[1]; 471 | } 472 | } 473 | return args.filter(function (item) { return item !== '--scope'; }); 474 | }, 475 | create: function (args) { 476 | return npmToPnpmTable.init(args); 477 | }, 478 | ln: 'link', 479 | t: 'test', 480 | test: 'test', 481 | tst: 'test', 482 | start: 'start', 483 | link: 'link', 484 | unlink: function (args) { 485 | return convertFilterArg(args); 486 | }, 487 | outdated: 'outdated', 488 | pack: function (args) { 489 | return args.map(function (item) { 490 | if (item.startsWith('--pack-destination')) { 491 | return item.replace(/^--pack-destination[\s=]/, '--pack-destination '); 492 | } 493 | return item; 494 | }); 495 | } 496 | }; 497 | function npmToPnpm(_m, command) { 498 | var args = parse((command || '').trim()); 499 | var index = args.findIndex(function (a) { return a === '--'; }); 500 | if (index >= 0) { 501 | args.splice(index, 1); 502 | } 503 | if (args[0] in npmToPnpmTable) { 504 | var converter = npmToPnpmTable[args[0]]; 505 | if (typeof converter === 'function') { 506 | args = converter(args); 507 | } 508 | else { 509 | args[0] = converter; 510 | } 511 | return 'pnpm ' + args.filter(Boolean).join(' '); 512 | } 513 | else { 514 | return 'npm ' + command + "\n# couldn't auto-convert command"; 515 | } 516 | } 517 | 518 | function convertInstallArgs(args) { 519 | // bun uses -g and --global flags 520 | // bun mostly conforms to Yarn's CLI 521 | return args.map(function (item) { 522 | switch (item) { 523 | case '--save-dev': 524 | case '--development': 525 | case '-D': 526 | return '--dev'; 527 | case '--save-prod': 528 | case '-P': 529 | return '--production'; 530 | case '--no-package-lock': 531 | return '--no-save'; 532 | case '--save-optional': 533 | case '-O': 534 | return '--optional'; 535 | case '--save-exact': 536 | case '-E': 537 | return '--exact'; 538 | case '--save': 539 | case '-S': 540 | // this is default in bun 541 | return ''; 542 | case '--global': 543 | case '-g': 544 | return '--global'; 545 | default: 546 | return item; 547 | } 548 | }); 549 | } 550 | function npmToBun(_m, command) { 551 | var args = parse((command || '').trim()); 552 | var index = args.findIndex(function (a) { return a === '--'; }); 553 | if (index >= 0) { 554 | args.splice(index, 1); 555 | } 556 | var cmd = 'bun'; 557 | switch (args[0]) { 558 | case 'install': 559 | case 'i': 560 | if (args.length === 1) { 561 | args = ['install']; 562 | } 563 | else { 564 | args[0] = 'add'; 565 | } 566 | args = convertInstallArgs(args); 567 | break; 568 | case 'uninstall': 569 | case 'un': 570 | case 'remove': 571 | case 'r': 572 | case 'rm': 573 | args[0] = 'remove'; 574 | args = convertInstallArgs(args); 575 | break; 576 | case 'cache': 577 | if (args[1] === 'clean') { 578 | args = ['pm', 'cache', 'rm'].concat(args.slice(2)); 579 | } 580 | else { 581 | cmd = 'npm'; 582 | } 583 | break; 584 | case 'rebuild': 585 | case 'rb': 586 | args[0] = 'add'; 587 | args.push('--force'); 588 | break; 589 | case 'run': 590 | break; 591 | case 'list': 592 | case 'ls': 593 | // 'npm ls' => 'bun pm ls' 594 | args = convertInstallArgs(args); 595 | args[0] = 'ls'; 596 | args.unshift('pm'); 597 | break; 598 | case 'init': 599 | case 'create': 600 | if (args[1]) { 601 | if (args[1].startsWith('@')) { 602 | cmd = 'bunx'; 603 | args[1] = args[1].replace('/', '/create-'); 604 | args = args.slice(1); 605 | } 606 | else if (!args[1].startsWith('-')) { 607 | cmd = 'bunx'; 608 | args[1] = "create-".concat(args[1].replace('@latest', '')); 609 | args = args.slice(1); 610 | } 611 | else { 612 | args[0] = 'init'; 613 | } 614 | } 615 | break; 616 | case 'link': 617 | case 'ln': 618 | args = convertInstallArgs(args); 619 | args[0] = 'link'; 620 | break; 621 | case 'stop': 622 | case 'start': 623 | case 'unlink': 624 | break; 625 | case 'test': 626 | case 't': 627 | case 'tst': 628 | args[0] = 'test'; 629 | args.unshift('run'); 630 | break; 631 | case 'exec': 632 | cmd = 'bunx'; 633 | args.splice(0, 1); 634 | break; 635 | default: 636 | // null == keep `npm` command 637 | cmd = 'npm'; 638 | break; 639 | } 640 | var filtered = args.filter(Boolean).filter(function (arg) { return arg !== '--'; }); 641 | return "".concat(cmd, " ").concat(filtered.join(' ')).concat(cmd === 'npm' ? "\n# couldn't auto-convert command" : '').replace('=', ' '); 642 | } 643 | 644 | /** 645 | * Converts between npm and yarn command 646 | */ 647 | function convert(str, to) { 648 | if (str.includes('npx') || 649 | str.includes('yarn dlx') || 650 | str.includes('pnpm dlx') || 651 | str.includes('bun x')) { 652 | var executor = str.includes('npx') 653 | ? 'npx' 654 | : str.includes('yarn dlx') 655 | ? 'yarn dlx' 656 | : str.includes('pnpm dlx') 657 | ? 'pnpm dlx' 658 | : 'bun x'; 659 | return str.replace(executor, executorCommands[to]); 660 | } 661 | else if (to === 'npm') { 662 | return str.replace(/yarn(?: +([^&\n\r]*))?/gm, yarnToNPM); 663 | } 664 | else if (to === 'pnpm') { 665 | return str.replace(/npm(?: +([^&\n\r]*))?/gm, npmToPnpm); 666 | } 667 | else if (to === 'bun') { 668 | return str.replace(/npm(?: +([^&\n\r]*))?/gm, npmToBun); 669 | } 670 | else { 671 | return str.replace(/npm(?: +([^&\n\r]*))?/gm, npmToYarn); 672 | } 673 | } 674 | 675 | return convert; 676 | 677 | })); 678 | //# sourceMappingURL=npm-to-yarn.umd.js.map 679 | -------------------------------------------------------------------------------- /dist/npm-to-yarn.mjs.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"npm-to-yarn.mjs","sources":["../src/utils.ts","../src/command.ts","../src/yarnToNpm.ts","../src/npmToYarn.ts","../src/npmToPnpm.ts","../src/npmToBun.ts","../src/index.ts"],"sourcesContent":["export const unchangedCLICommands = [\n 'test',\n 'login',\n 'logout',\n 'link',\n 'unlink',\n 'publish',\n 'cache',\n 'start',\n 'stop',\n 'test'\n]\n\nexport const yarnCLICommands = [\n 'init',\n 'run',\n 'add',\n 'audit',\n 'autoclean',\n 'bin',\n 'check',\n 'config',\n 'create',\n 'dedupe',\n 'generate-lock-entry',\n 'global',\n 'help',\n 'import',\n 'info',\n 'install',\n 'licenses',\n 'list',\n 'lockfile',\n 'outdated',\n 'owner',\n 'pack',\n 'policies',\n 'prune',\n 'remove',\n 'self-update',\n 'tag',\n 'team',\n 'upgrade',\n 'upgrade-interactive',\n 'version',\n 'versions',\n 'why',\n 'workspace',\n 'workspaces'\n]\n\nexport const npmCLICommands = [\n 'init',\n 'run',\n 'access',\n 'adduser',\n 'audit',\n 'bin',\n 'bugs',\n 'build',\n 'bundle',\n 'ci',\n 'completion',\n 'config',\n 'dedupe',\n 'deprecate',\n 'dist-tag',\n 'docs',\n 'doctor',\n 'edit',\n 'explore',\n 'exec',\n 'fund',\n 'help-search',\n 'help',\n 'hook',\n 'install-ci-test',\n 'install-test',\n 'install',\n 'ls',\n 'list',\n 'npm',\n 'org',\n 'outdated',\n 'owner',\n 'pack',\n 'ping',\n 'prefix',\n 'profile',\n 'prune',\n 'rebuild',\n 'repo',\n 'restart',\n 'root',\n 'run-script',\n 'search',\n 'shrinkwrap',\n 'star',\n 'stars',\n 'start',\n 'stop',\n 'team',\n 'token',\n 'uninstall',\n 'unpublish',\n 'update',\n 'version',\n 'view',\n 'whoami'\n]\n\nexport const executorCommands = {\n npm: 'npx',\n yarn: 'yarn dlx',\n pnpm: 'pnpm dlx',\n bun: 'bun x'\n}\n","export function parse (command: string) {\n const args: string[] = []\n let lastQuote: string | false = false\n let escaped = false\n let part = ''\n for (let i = 0; i < command.length; ++i) {\n const char = command.charAt(i)\n if (char === '\\\\') {\n part += char\n escaped = true\n } else {\n if (char === ' ' && !lastQuote) {\n args.push(part)\n part = ''\n } else if (!escaped && (char === '\"' || char === \"'\")) {\n part += char\n if (char === lastQuote) {\n lastQuote = false\n } else if (!lastQuote) {\n lastQuote = char\n }\n } else {\n part += char\n }\n escaped = false\n }\n }\n args.push(part)\n return args\n}\n","import { unchangedCLICommands, yarnCLICommands } from './utils'\nimport { parse } from './command'\n\nfunction convertAddRemoveArgs (args: string[]) {\n return args.map(item => {\n switch (item) {\n case '--no-lockfile':\n return '--no-package-lock'\n case '--production':\n return '--save-prod'\n case '--dev':\n return '--save-dev'\n case '--optional':\n return '--save-optional'\n case '--exact':\n return '--save-exact'\n default:\n return item\n }\n })\n}\n\nconst yarnToNpmTable = {\n add (args: string[]) {\n if (args.length === 2 && args[1] === '--force') {\n return ['rebuild']\n }\n args[0] = 'install'\n return convertAddRemoveArgs(args)\n },\n remove (args: string[]) {\n args[0] = 'uninstall'\n return convertAddRemoveArgs(args)\n },\n version (args: string[]) {\n return args.map(item => {\n switch (item) {\n case '--major':\n return 'major'\n case '--minor':\n return 'minor'\n case '--patch':\n return 'patch'\n default:\n return item\n }\n })\n },\n install: 'install',\n list (args: string[]) {\n args[0] = 'ls'\n const patternIndex = args.findIndex(item => item === '--pattern')\n if (patternIndex >= 0 && args[patternIndex + 1]) {\n const packages = args[patternIndex + 1].replace(/[\"']([^\"']+)[\"']/, '$1').split('|')\n args.splice(patternIndex, 2, packages.join(' '))\n }\n return args\n },\n init: 'init',\n create: 'init',\n outdated: 'outdated',\n run: 'run',\n global (args: string[]) {\n switch (args[1]) {\n case 'add':\n args.shift()\n args = yarnToNpmTable.add(args)\n args.push('--global')\n return args\n case 'remove':\n args.shift()\n args = yarnToNpmTable.remove(args)\n args.push('--global')\n return args\n case 'list':\n args.shift()\n args = yarnToNpmTable.list(args)\n args.push('--global')\n return args\n // case 'bin':\n // case 'upgrade':\n default:\n args.push(\"\\n# couldn't auto-convert command\")\n return args\n }\n },\n pack (args: string[]) {\n return args.map(item => {\n if (item === '--filename') {\n return '--pack-destination'\n }\n return item\n })\n }\n}\n\nexport function yarnToNPM (_m: string, command: string): string {\n command = (command || '').trim()\n if (command === '') {\n return 'npm install'\n }\n let args = parse(command)\n const firstCommand = (/\\w+/.exec(command) || [''])[0]\n\n if (unchangedCLICommands.includes(args[0])) {\n return 'npm ' + command\n } else if (args[0] in yarnToNpmTable) {\n const converter = yarnToNpmTable[args[0] as keyof typeof yarnToNpmTable]\n\n if (typeof converter === 'function') {\n args = converter(args)\n } else {\n args[0] = converter\n }\n\n return 'npm ' + args.filter(Boolean).join(' ')\n } else if (!yarnCLICommands.includes(firstCommand)) {\n // i.e., yarn grunt -> npm run grunt\n return 'npm run ' + command\n } else {\n return 'npm ' + command + \"\\n# couldn't auto-convert command\"\n }\n}\n","import { unchangedCLICommands, yarnCLICommands } from './utils'\nimport { parse } from './command'\n\nfunction convertInstallArgs (args: string[]) {\n if (args.includes('--global') || args.includes('-g')) {\n args.unshift('global')\n }\n\n return args.map(item => {\n switch (item) {\n case '--save-dev':\n case '-D':\n return '--dev'\n case '--save-prod':\n case '-P':\n return '--production'\n case '--no-package-lock':\n return '--no-lockfile'\n case '--save-optional':\n case '-O':\n return '--optional'\n case '--save-exact':\n case '-E':\n return '--exact'\n case '--save':\n case '-S':\n case '--global':\n case '-g':\n return ''\n default:\n return item\n }\n })\n}\n\nconst npmToYarnTable = {\n install (args: string[]) {\n if (args.length === 1) {\n return ['install']\n }\n args[0] = 'add'\n\n return convertInstallArgs(args)\n },\n i (args: string[]) {\n return npmToYarnTable.install(args)\n },\n uninstall (args: string[]) {\n args[0] = 'remove'\n\n return convertInstallArgs(args)\n },\n un (args: string[]) {\n return npmToYarnTable.uninstall(args)\n },\n remove (args: string[]) {\n return npmToYarnTable.uninstall(args)\n },\n r (args: string[]) {\n return npmToYarnTable.uninstall(args)\n },\n rm (args: string[]) {\n return npmToYarnTable.uninstall(args)\n },\n version (args: string[]) {\n return args.map(item => {\n switch (item) {\n case 'major':\n return '--major'\n case 'minor':\n return '--minor'\n case 'patch':\n return '--patch'\n default:\n return item\n }\n })\n },\n rb (args: string[]) {\n return npmToYarnTable.rebuild(args)\n },\n rebuild (args: string[]) {\n args[0] = 'add'\n args.push('--force')\n return args\n },\n run (args: string[]) {\n if (args[1] && !unchangedCLICommands.includes(args[1]) && !yarnCLICommands.includes(args[1])) {\n args.splice(0, 1)\n }\n return args\n },\n exec (args: string[]) {\n args[0] = 'run'\n return npmToYarnTable.run(args)\n },\n ls (args: string[]) {\n args[0] = 'list'\n\n let ended = false\n const packages = args.filter((item, id) => {\n if (id > 0 && !ended) {\n ended = item.startsWith('-')\n return !ended\n }\n return false\n })\n if (packages.length > 0) {\n args.splice(1, packages.length, '--pattern', '\"' + packages.join('|') + '\"')\n }\n return args\n },\n list (args: string[]) {\n return npmToYarnTable.ls(args)\n },\n init (args: string[]) {\n if (args[1] && !args[1].startsWith('-')) {\n args[0] = 'create'\n const m = args[1].match(/(.+)@latest/)\n if (m) {\n args[1] = m[1]\n }\n }\n return args.filter(item => item !== '--scope')\n },\n create (args: string[]) {\n return npmToYarnTable.init(args)\n },\n ln: 'link',\n t: 'test',\n tst: 'test',\n outdated: 'outdated',\n pack (args: string[]) {\n return args.map(item => {\n if (item.startsWith('--pack-destination')) {\n return item.replace(/^--pack-destination[\\s=]/, '--filename ')\n }\n return item\n })\n }\n}\n\nexport function npmToYarn (_m: string, command: string): string {\n let args = parse((command || '').trim())\n\n const index = args.findIndex(a => a === '--')\n if (index >= 0) {\n args.splice(index, 1)\n }\n\n if (unchangedCLICommands.includes(args[0])) {\n return 'yarn ' + args.filter(Boolean).join(' ')\n } else if (args[0] in npmToYarnTable) {\n const converter = npmToYarnTable[args[0] as keyof typeof npmToYarnTable]\n\n if (typeof converter === 'function') {\n args = converter(args)\n } else {\n args[0] = converter\n }\n\n return 'yarn ' + args.filter(Boolean).join(' ')\n } else {\n return 'npm ' + command + \"\\n# couldn't auto-convert command\"\n }\n}\n","import { parse } from './command'\n\nfunction convertPnpmInstallArgs (args: string[]) {\n return args.map(item => {\n switch (item) {\n case '--save':\n case '-S':\n return ''\n case '--no-package-lock':\n return '--frozen-lockfile'\n // case '--save-dev':\n // case '-D':\n // case '--save-prod':\n // case '-P':\n // case '--save-optional':\n // case '-O':\n // case '--save-exact':\n // case '-E':\n // case '--global':\n // case '-g':\n default:\n return item\n }\n })\n}\n\nfunction convertFilterArg (args: string[]) {\n if (args.length > 1) {\n const filter = args.filter((item, index) => index !== 0 && !item.startsWith('-'))\n if (filter.length > 0) {\n args = args.filter((item, index) => index === 0 || item.startsWith('-'))\n args.push('--filter')\n args.push(filter.join(' '))\n }\n }\n\n return args\n}\n\nconst npmToPnpmTable = {\n // ------------------------------\n install (args: string[]) {\n if (args.length > 1 && args.filter(item => !item.startsWith('-')).length > 1) {\n args[0] = 'add'\n }\n return convertPnpmInstallArgs(args)\n },\n i (args: string[]) {\n return npmToPnpmTable.install(args)\n },\n // ------------------------------\n uninstall (args: string[]) {\n args[0] = 'remove'\n\n return convertPnpmInstallArgs(args)\n },\n un (args: string[]) {\n return npmToPnpmTable.uninstall(args)\n },\n remove (args: string[]) {\n return npmToPnpmTable.uninstall(args)\n },\n r (args: string[]) {\n return npmToPnpmTable.uninstall(args)\n },\n rm (args: string[]) {\n return npmToPnpmTable.uninstall(args)\n },\n // ------------------------------\n rb (args: string[]) {\n return npmToPnpmTable.rebuild(args)\n },\n rebuild (args: string[]) {\n args[0] = 'rebuild'\n return convertFilterArg(args)\n },\n run: 'run',\n exec: 'exec',\n ls (args: string[]) {\n return npmToPnpmTable.list(args)\n },\n list (args: string[]) {\n return args.map(item => {\n if (item.startsWith('--depth=')) {\n return `--depth ${item.split('=')[1]}`\n }\n switch (item) {\n case '--production':\n return '--prod'\n case '--development':\n return '--dev'\n default:\n return item\n }\n })\n },\n init (args: string[]) {\n if (args[1] && !args[1].startsWith('-')) {\n args[0] = 'create'\n const m = args[1].match(/(.+)@latest/)\n if (m) {\n args[1] = m[1]\n }\n }\n return args.filter(item => item !== '--scope')\n },\n create (args: string[]) {\n return npmToPnpmTable.init(args)\n },\n ln: 'link',\n t: 'test',\n test: 'test',\n tst: 'test',\n start: 'start',\n link: 'link',\n unlink (args: string[]) {\n return convertFilterArg(args)\n },\n outdated: 'outdated',\n pack: (args: string[]) => {\n return args.map(item => {\n if (item.startsWith('--pack-destination')) {\n return item.replace(/^--pack-destination[\\s=]/, '--pack-destination ')\n }\n return item\n })\n }\n}\n\nexport function npmToPnpm (_m: string, command: string): string {\n let args = parse((command || '').trim())\n\n const index = args.findIndex(a => a === '--')\n if (index >= 0) {\n args.splice(index, 1)\n }\n\n if (args[0] in npmToPnpmTable) {\n const converter = npmToPnpmTable[args[0] as keyof typeof npmToPnpmTable]\n\n if (typeof converter === 'function') {\n args = converter(args)\n } else {\n args[0] = converter\n }\n\n return 'pnpm ' + args.filter(Boolean).join(' ')\n } else {\n return 'npm ' + command + \"\\n# couldn't auto-convert command\"\n }\n}\n","import { parse } from './command'\n\nfunction convertInstallArgs (args: string[]) {\n // bun uses -g and --global flags\n // bun mostly conforms to Yarn's CLI\n return args.map(item => {\n switch (item) {\n case '--save-dev':\n case '--development':\n case '-D':\n return '--dev'\n case '--save-prod':\n case '-P':\n return '--production'\n case '--no-package-lock':\n return '--no-save'\n case '--save-optional':\n case '-O':\n return '--optional'\n case '--save-exact':\n case '-E':\n return '--exact'\n case '--save':\n case '-S':\n // this is default in bun\n return ''\n case '--global':\n case '-g':\n return '--global'\n default:\n return item\n }\n })\n}\n\nexport const bunCLICommands = [\n 'init',\n 'run',\n 'add',\n 'pm',\n 'help',\n 'install',\n 'remove',\n 'upgrade',\n 'version'\n] as const\ntype bunCLICommands = typeof bunCLICommands[number]\n\nexport function npmToBun (_m: string, command: string): string {\n let args = parse((command || '').trim())\n\n const index = args.findIndex(a => a === '--')\n if (index >= 0) {\n args.splice(index, 1)\n }\n\n let cmd = 'bun'\n switch (args[0]) {\n case 'install':\n case 'i':\n if (args.length === 1) {\n args = ['install']\n } else {\n args[0] = 'add'\n }\n args = convertInstallArgs(args)\n break\n case 'uninstall':\n case 'un':\n case 'remove':\n case 'r':\n case 'rm':\n args[0] = 'remove'\n args = convertInstallArgs(args)\n break\n case 'cache':\n if (args[1] === 'clean') {\n args = ['pm', 'cache', 'rm'].concat(args.slice(2))\n } else {\n cmd = 'npm'\n }\n break\n case 'rebuild':\n case 'rb':\n args[0] = 'add'\n args.push('--force')\n break\n case 'run':\n break\n case 'list':\n case 'ls':\n // 'npm ls' => 'bun pm ls'\n args = convertInstallArgs(args)\n args[0] = 'ls'\n args.unshift('pm')\n break\n case 'init':\n case 'create':\n if (args[1]) {\n if (args[1].startsWith('@')) {\n cmd = 'bunx'\n\n args[1] = args[1].replace('/', '/create-')\n args = args.slice(1)\n } else if (!args[1].startsWith('-')) {\n cmd = 'bunx'\n args[1] = `create-${args[1].replace('@latest', '')}`\n args = args.slice(1)\n } else {\n args[0] = 'init'\n }\n }\n break\n\n case 'link':\n case 'ln':\n args = convertInstallArgs(args)\n args[0] = 'link'\n break\n case 'stop':\n case 'start':\n case 'unlink':\n break\n case 'test':\n case 't':\n case 'tst':\n args[0] = 'test'\n args.unshift('run')\n break\n case 'exec':\n cmd = 'bunx'\n args.splice(0, 1)\n break\n default:\n // null == keep `npm` command\n cmd = 'npm'\n break\n }\n\n const filtered = args.filter(Boolean).filter(arg => arg !== '--')\n return `${cmd} ${filtered.join(' ')}${\n cmd === 'npm' ? \"\\n# couldn't auto-convert command\" : ''\n }`.replace('=', ' ')\n}\n","import { yarnToNPM } from './yarnToNpm'\nimport { npmToYarn } from './npmToYarn'\nimport { npmToPnpm } from './npmToPnpm'\nimport { npmToBun } from './npmToBun'\n\nimport { executorCommands } from './utils'\n\n/**\n * Converts between npm and yarn command\n */\nexport default function convert (str: string, to: 'npm' | 'yarn' | 'pnpm' | 'bun'): string {\n if (\n str.includes('npx') ||\n str.includes('yarn dlx') ||\n str.includes('pnpm dlx') ||\n str.includes('bun x')\n ) {\n const executor = str.includes('npx')\n ? 'npx'\n : str.includes('yarn dlx')\n ? 'yarn dlx'\n : str.includes('pnpm dlx')\n ? 'pnpm dlx'\n : 'bun x'\n return str.replace(executor, executorCommands[to])\n } else if (to === 'npm') {\n return str.replace(/yarn(?: +([^&\\n\\r]*))?/gm, yarnToNPM)\n } else if (to === 'pnpm') {\n return str.replace(/npm(?: +([^&\\n\\r]*))?/gm, npmToPnpm)\n } else if (to === 'bun') {\n return str.replace(/npm(?: +([^&\\n\\r]*))?/gm, npmToBun)\n } else {\n return str.replace(/npm(?: +([^&\\n\\r]*))?/gm, npmToYarn)\n }\n}\n"],"names":["convertInstallArgs"],"mappings":"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"} -------------------------------------------------------------------------------- /dist/npm-to-yarn.umd.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"npm-to-yarn.umd.js","sources":["../src/utils.ts","../src/command.ts","../src/yarnToNpm.ts","../src/npmToYarn.ts","../src/npmToPnpm.ts","../src/npmToBun.ts","../src/index.ts"],"sourcesContent":["export const unchangedCLICommands = [\n 'test',\n 'login',\n 'logout',\n 'link',\n 'unlink',\n 'publish',\n 'cache',\n 'start',\n 'stop',\n 'test'\n]\n\nexport const yarnCLICommands = [\n 'init',\n 'run',\n 'add',\n 'audit',\n 'autoclean',\n 'bin',\n 'check',\n 'config',\n 'create',\n 'dedupe',\n 'generate-lock-entry',\n 'global',\n 'help',\n 'import',\n 'info',\n 'install',\n 'licenses',\n 'list',\n 'lockfile',\n 'outdated',\n 'owner',\n 'pack',\n 'policies',\n 'prune',\n 'remove',\n 'self-update',\n 'tag',\n 'team',\n 'upgrade',\n 'upgrade-interactive',\n 'version',\n 'versions',\n 'why',\n 'workspace',\n 'workspaces'\n]\n\nexport const npmCLICommands = [\n 'init',\n 'run',\n 'access',\n 'adduser',\n 'audit',\n 'bin',\n 'bugs',\n 'build',\n 'bundle',\n 'ci',\n 'completion',\n 'config',\n 'dedupe',\n 'deprecate',\n 'dist-tag',\n 'docs',\n 'doctor',\n 'edit',\n 'explore',\n 'exec',\n 'fund',\n 'help-search',\n 'help',\n 'hook',\n 'install-ci-test',\n 'install-test',\n 'install',\n 'ls',\n 'list',\n 'npm',\n 'org',\n 'outdated',\n 'owner',\n 'pack',\n 'ping',\n 'prefix',\n 'profile',\n 'prune',\n 'rebuild',\n 'repo',\n 'restart',\n 'root',\n 'run-script',\n 'search',\n 'shrinkwrap',\n 'star',\n 'stars',\n 'start',\n 'stop',\n 'team',\n 'token',\n 'uninstall',\n 'unpublish',\n 'update',\n 'version',\n 'view',\n 'whoami'\n]\n\nexport const executorCommands = {\n npm: 'npx',\n yarn: 'yarn dlx',\n pnpm: 'pnpm dlx',\n bun: 'bun x'\n}\n","export function parse (command: string) {\n const args: string[] = []\n let lastQuote: string | false = false\n let escaped = false\n let part = ''\n for (let i = 0; i < command.length; ++i) {\n const char = command.charAt(i)\n if (char === '\\\\') {\n part += char\n escaped = true\n } else {\n if (char === ' ' && !lastQuote) {\n args.push(part)\n part = ''\n } else if (!escaped && (char === '\"' || char === \"'\")) {\n part += char\n if (char === lastQuote) {\n lastQuote = false\n } else if (!lastQuote) {\n lastQuote = char\n }\n } else {\n part += char\n }\n escaped = false\n }\n }\n args.push(part)\n return args\n}\n","import { unchangedCLICommands, yarnCLICommands } from './utils'\nimport { parse } from './command'\n\nfunction convertAddRemoveArgs (args: string[]) {\n return args.map(item => {\n switch (item) {\n case '--no-lockfile':\n return '--no-package-lock'\n case '--production':\n return '--save-prod'\n case '--dev':\n return '--save-dev'\n case '--optional':\n return '--save-optional'\n case '--exact':\n return '--save-exact'\n default:\n return item\n }\n })\n}\n\nconst yarnToNpmTable = {\n add (args: string[]) {\n if (args.length === 2 && args[1] === '--force') {\n return ['rebuild']\n }\n args[0] = 'install'\n return convertAddRemoveArgs(args)\n },\n remove (args: string[]) {\n args[0] = 'uninstall'\n return convertAddRemoveArgs(args)\n },\n version (args: string[]) {\n return args.map(item => {\n switch (item) {\n case '--major':\n return 'major'\n case '--minor':\n return 'minor'\n case '--patch':\n return 'patch'\n default:\n return item\n }\n })\n },\n install: 'install',\n list (args: string[]) {\n args[0] = 'ls'\n const patternIndex = args.findIndex(item => item === '--pattern')\n if (patternIndex >= 0 && args[patternIndex + 1]) {\n const packages = args[patternIndex + 1].replace(/[\"']([^\"']+)[\"']/, '$1').split('|')\n args.splice(patternIndex, 2, packages.join(' '))\n }\n return args\n },\n init: 'init',\n create: 'init',\n outdated: 'outdated',\n run: 'run',\n global (args: string[]) {\n switch (args[1]) {\n case 'add':\n args.shift()\n args = yarnToNpmTable.add(args)\n args.push('--global')\n return args\n case 'remove':\n args.shift()\n args = yarnToNpmTable.remove(args)\n args.push('--global')\n return args\n case 'list':\n args.shift()\n args = yarnToNpmTable.list(args)\n args.push('--global')\n return args\n // case 'bin':\n // case 'upgrade':\n default:\n args.push(\"\\n# couldn't auto-convert command\")\n return args\n }\n },\n pack (args: string[]) {\n return args.map(item => {\n if (item === '--filename') {\n return '--pack-destination'\n }\n return item\n })\n }\n}\n\nexport function yarnToNPM (_m: string, command: string): string {\n command = (command || '').trim()\n if (command === '') {\n return 'npm install'\n }\n let args = parse(command)\n const firstCommand = (/\\w+/.exec(command) || [''])[0]\n\n if (unchangedCLICommands.includes(args[0])) {\n return 'npm ' + command\n } else if (args[0] in yarnToNpmTable) {\n const converter = yarnToNpmTable[args[0] as keyof typeof yarnToNpmTable]\n\n if (typeof converter === 'function') {\n args = converter(args)\n } else {\n args[0] = converter\n }\n\n return 'npm ' + args.filter(Boolean).join(' ')\n } else if (!yarnCLICommands.includes(firstCommand)) {\n // i.e., yarn grunt -> npm run grunt\n return 'npm run ' + command\n } else {\n return 'npm ' + command + \"\\n# couldn't auto-convert command\"\n }\n}\n","import { unchangedCLICommands, yarnCLICommands } from './utils'\nimport { parse } from './command'\n\nfunction convertInstallArgs (args: string[]) {\n if (args.includes('--global') || args.includes('-g')) {\n args.unshift('global')\n }\n\n return args.map(item => {\n switch (item) {\n case '--save-dev':\n case '-D':\n return '--dev'\n case '--save-prod':\n case '-P':\n return '--production'\n case '--no-package-lock':\n return '--no-lockfile'\n case '--save-optional':\n case '-O':\n return '--optional'\n case '--save-exact':\n case '-E':\n return '--exact'\n case '--save':\n case '-S':\n case '--global':\n case '-g':\n return ''\n default:\n return item\n }\n })\n}\n\nconst npmToYarnTable = {\n install (args: string[]) {\n if (args.length === 1) {\n return ['install']\n }\n args[0] = 'add'\n\n return convertInstallArgs(args)\n },\n i (args: string[]) {\n return npmToYarnTable.install(args)\n },\n uninstall (args: string[]) {\n args[0] = 'remove'\n\n return convertInstallArgs(args)\n },\n un (args: string[]) {\n return npmToYarnTable.uninstall(args)\n },\n remove (args: string[]) {\n return npmToYarnTable.uninstall(args)\n },\n r (args: string[]) {\n return npmToYarnTable.uninstall(args)\n },\n rm (args: string[]) {\n return npmToYarnTable.uninstall(args)\n },\n version (args: string[]) {\n return args.map(item => {\n switch (item) {\n case 'major':\n return '--major'\n case 'minor':\n return '--minor'\n case 'patch':\n return '--patch'\n default:\n return item\n }\n })\n },\n rb (args: string[]) {\n return npmToYarnTable.rebuild(args)\n },\n rebuild (args: string[]) {\n args[0] = 'add'\n args.push('--force')\n return args\n },\n run (args: string[]) {\n if (args[1] && !unchangedCLICommands.includes(args[1]) && !yarnCLICommands.includes(args[1])) {\n args.splice(0, 1)\n }\n return args\n },\n exec (args: string[]) {\n args[0] = 'run'\n return npmToYarnTable.run(args)\n },\n ls (args: string[]) {\n args[0] = 'list'\n\n let ended = false\n const packages = args.filter((item, id) => {\n if (id > 0 && !ended) {\n ended = item.startsWith('-')\n return !ended\n }\n return false\n })\n if (packages.length > 0) {\n args.splice(1, packages.length, '--pattern', '\"' + packages.join('|') + '\"')\n }\n return args\n },\n list (args: string[]) {\n return npmToYarnTable.ls(args)\n },\n init (args: string[]) {\n if (args[1] && !args[1].startsWith('-')) {\n args[0] = 'create'\n const m = args[1].match(/(.+)@latest/)\n if (m) {\n args[1] = m[1]\n }\n }\n return args.filter(item => item !== '--scope')\n },\n create (args: string[]) {\n return npmToYarnTable.init(args)\n },\n ln: 'link',\n t: 'test',\n tst: 'test',\n outdated: 'outdated',\n pack (args: string[]) {\n return args.map(item => {\n if (item.startsWith('--pack-destination')) {\n return item.replace(/^--pack-destination[\\s=]/, '--filename ')\n }\n return item\n })\n }\n}\n\nexport function npmToYarn (_m: string, command: string): string {\n let args = parse((command || '').trim())\n\n const index = args.findIndex(a => a === '--')\n if (index >= 0) {\n args.splice(index, 1)\n }\n\n if (unchangedCLICommands.includes(args[0])) {\n return 'yarn ' + args.filter(Boolean).join(' ')\n } else if (args[0] in npmToYarnTable) {\n const converter = npmToYarnTable[args[0] as keyof typeof npmToYarnTable]\n\n if (typeof converter === 'function') {\n args = converter(args)\n } else {\n args[0] = converter\n }\n\n return 'yarn ' + args.filter(Boolean).join(' ')\n } else {\n return 'npm ' + command + \"\\n# couldn't auto-convert command\"\n }\n}\n","import { parse } from './command'\n\nfunction convertPnpmInstallArgs (args: string[]) {\n return args.map(item => {\n switch (item) {\n case '--save':\n case '-S':\n return ''\n case '--no-package-lock':\n return '--frozen-lockfile'\n // case '--save-dev':\n // case '-D':\n // case '--save-prod':\n // case '-P':\n // case '--save-optional':\n // case '-O':\n // case '--save-exact':\n // case '-E':\n // case '--global':\n // case '-g':\n default:\n return item\n }\n })\n}\n\nfunction convertFilterArg (args: string[]) {\n if (args.length > 1) {\n const filter = args.filter((item, index) => index !== 0 && !item.startsWith('-'))\n if (filter.length > 0) {\n args = args.filter((item, index) => index === 0 || item.startsWith('-'))\n args.push('--filter')\n args.push(filter.join(' '))\n }\n }\n\n return args\n}\n\nconst npmToPnpmTable = {\n // ------------------------------\n install (args: string[]) {\n if (args.length > 1 && args.filter(item => !item.startsWith('-')).length > 1) {\n args[0] = 'add'\n }\n return convertPnpmInstallArgs(args)\n },\n i (args: string[]) {\n return npmToPnpmTable.install(args)\n },\n // ------------------------------\n uninstall (args: string[]) {\n args[0] = 'remove'\n\n return convertPnpmInstallArgs(args)\n },\n un (args: string[]) {\n return npmToPnpmTable.uninstall(args)\n },\n remove (args: string[]) {\n return npmToPnpmTable.uninstall(args)\n },\n r (args: string[]) {\n return npmToPnpmTable.uninstall(args)\n },\n rm (args: string[]) {\n return npmToPnpmTable.uninstall(args)\n },\n // ------------------------------\n rb (args: string[]) {\n return npmToPnpmTable.rebuild(args)\n },\n rebuild (args: string[]) {\n args[0] = 'rebuild'\n return convertFilterArg(args)\n },\n run: 'run',\n exec: 'exec',\n ls (args: string[]) {\n return npmToPnpmTable.list(args)\n },\n list (args: string[]) {\n return args.map(item => {\n if (item.startsWith('--depth=')) {\n return `--depth ${item.split('=')[1]}`\n }\n switch (item) {\n case '--production':\n return '--prod'\n case '--development':\n return '--dev'\n default:\n return item\n }\n })\n },\n init (args: string[]) {\n if (args[1] && !args[1].startsWith('-')) {\n args[0] = 'create'\n const m = args[1].match(/(.+)@latest/)\n if (m) {\n args[1] = m[1]\n }\n }\n return args.filter(item => item !== '--scope')\n },\n create (args: string[]) {\n return npmToPnpmTable.init(args)\n },\n ln: 'link',\n t: 'test',\n test: 'test',\n tst: 'test',\n start: 'start',\n link: 'link',\n unlink (args: string[]) {\n return convertFilterArg(args)\n },\n outdated: 'outdated',\n pack: (args: string[]) => {\n return args.map(item => {\n if (item.startsWith('--pack-destination')) {\n return item.replace(/^--pack-destination[\\s=]/, '--pack-destination ')\n }\n return item\n })\n }\n}\n\nexport function npmToPnpm (_m: string, command: string): string {\n let args = parse((command || '').trim())\n\n const index = args.findIndex(a => a === '--')\n if (index >= 0) {\n args.splice(index, 1)\n }\n\n if (args[0] in npmToPnpmTable) {\n const converter = npmToPnpmTable[args[0] as keyof typeof npmToPnpmTable]\n\n if (typeof converter === 'function') {\n args = converter(args)\n } else {\n args[0] = converter\n }\n\n return 'pnpm ' + args.filter(Boolean).join(' ')\n } else {\n return 'npm ' + command + \"\\n# couldn't auto-convert command\"\n }\n}\n","import { parse } from './command'\n\nfunction convertInstallArgs (args: string[]) {\n // bun uses -g and --global flags\n // bun mostly conforms to Yarn's CLI\n return args.map(item => {\n switch (item) {\n case '--save-dev':\n case '--development':\n case '-D':\n return '--dev'\n case '--save-prod':\n case '-P':\n return '--production'\n case '--no-package-lock':\n return '--no-save'\n case '--save-optional':\n case '-O':\n return '--optional'\n case '--save-exact':\n case '-E':\n return '--exact'\n case '--save':\n case '-S':\n // this is default in bun\n return ''\n case '--global':\n case '-g':\n return '--global'\n default:\n return item\n }\n })\n}\n\nexport const bunCLICommands = [\n 'init',\n 'run',\n 'add',\n 'pm',\n 'help',\n 'install',\n 'remove',\n 'upgrade',\n 'version'\n] as const\ntype bunCLICommands = typeof bunCLICommands[number]\n\nexport function npmToBun (_m: string, command: string): string {\n let args = parse((command || '').trim())\n\n const index = args.findIndex(a => a === '--')\n if (index >= 0) {\n args.splice(index, 1)\n }\n\n let cmd = 'bun'\n switch (args[0]) {\n case 'install':\n case 'i':\n if (args.length === 1) {\n args = ['install']\n } else {\n args[0] = 'add'\n }\n args = convertInstallArgs(args)\n break\n case 'uninstall':\n case 'un':\n case 'remove':\n case 'r':\n case 'rm':\n args[0] = 'remove'\n args = convertInstallArgs(args)\n break\n case 'cache':\n if (args[1] === 'clean') {\n args = ['pm', 'cache', 'rm'].concat(args.slice(2))\n } else {\n cmd = 'npm'\n }\n break\n case 'rebuild':\n case 'rb':\n args[0] = 'add'\n args.push('--force')\n break\n case 'run':\n break\n case 'list':\n case 'ls':\n // 'npm ls' => 'bun pm ls'\n args = convertInstallArgs(args)\n args[0] = 'ls'\n args.unshift('pm')\n break\n case 'init':\n case 'create':\n if (args[1]) {\n if (args[1].startsWith('@')) {\n cmd = 'bunx'\n\n args[1] = args[1].replace('/', '/create-')\n args = args.slice(1)\n } else if (!args[1].startsWith('-')) {\n cmd = 'bunx'\n args[1] = `create-${args[1].replace('@latest', '')}`\n args = args.slice(1)\n } else {\n args[0] = 'init'\n }\n }\n break\n\n case 'link':\n case 'ln':\n args = convertInstallArgs(args)\n args[0] = 'link'\n break\n case 'stop':\n case 'start':\n case 'unlink':\n break\n case 'test':\n case 't':\n case 'tst':\n args[0] = 'test'\n args.unshift('run')\n break\n case 'exec':\n cmd = 'bunx'\n args.splice(0, 1)\n break\n default:\n // null == keep `npm` command\n cmd = 'npm'\n break\n }\n\n const filtered = args.filter(Boolean).filter(arg => arg !== '--')\n return `${cmd} ${filtered.join(' ')}${\n cmd === 'npm' ? \"\\n# couldn't auto-convert command\" : ''\n }`.replace('=', ' ')\n}\n","import { yarnToNPM } from './yarnToNpm'\nimport { npmToYarn } from './npmToYarn'\nimport { npmToPnpm } from './npmToPnpm'\nimport { npmToBun } from './npmToBun'\n\nimport { executorCommands } from './utils'\n\n/**\n * Converts between npm and yarn command\n */\nexport default function convert (str: string, to: 'npm' | 'yarn' | 'pnpm' | 'bun'): string {\n if (\n str.includes('npx') ||\n str.includes('yarn dlx') ||\n str.includes('pnpm dlx') ||\n str.includes('bun x')\n ) {\n const executor = str.includes('npx')\n ? 'npx'\n : str.includes('yarn dlx')\n ? 'yarn dlx'\n : str.includes('pnpm dlx')\n ? 'pnpm dlx'\n : 'bun x'\n return str.replace(executor, executorCommands[to])\n } else if (to === 'npm') {\n return str.replace(/yarn(?: +([^&\\n\\r]*))?/gm, yarnToNPM)\n } else if (to === 'pnpm') {\n return str.replace(/npm(?: +([^&\\n\\r]*))?/gm, npmToPnpm)\n } else if (to === 'bun') {\n return str.replace(/npm(?: +([^&\\n\\r]*))?/gm, npmToBun)\n } else {\n return str.replace(/npm(?: +([^&\\n\\r]*))?/gm, npmToYarn)\n }\n}\n"],"names":["convertInstallArgs"],"mappings":"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"} --------------------------------------------------------------------------------