import fs from 'fs' import path from 'path' import { dlx } from '@pnpm/plugin-commands-script-runners' import { prepareEmpty } from '@pnpm/prepare' import { DLX_DEFAULT_OPTS as DEFAULT_OPTS } from './utils' test('dlx', async () => { prepareEmpty() await dlx.handler({ ...DEFAULT_OPTS, dir: path.resolve('project'), storeDir: path.resolve('store'), }, ['shx', 'touch', 'foo']) expect(fs.existsSync('foo')).toBeTruthy() }) test('dlx install from git', async () => { prepareEmpty() await dlx.handler({ ...DEFAULT_OPTS, dir: process.cwd(), }, ['shelljs/shx#61aca968cd7afc712ca61a4fc4ec3201e3770dc7', 'touch', 'foo']) expect(fs.existsSync('foo')).toBeTruthy() }) test('dlx should work when the package name differs from the bin name', async () => { prepareEmpty() await dlx.handler({ ...DEFAULT_OPTS, dir: path.resolve('project'), storeDir: path.resolve('store'), }, ['@pnpm.e2e/touch-file-one-bin']) expect(fs.existsSync('touch.txt')).toBeTruthy() }) test('dlx should fail when the installed package has many commands and none equals the package name', async () => { prepareEmpty() await expect( dlx.handler({ ...DEFAULT_OPTS, dir: path.resolve('project'), storeDir: path.resolve('store'), }, ['@pnpm.e2e/touch-file-many-bins']) ).rejects.toThrow('Could not determine executable to run. @pnpm.e2e/touch-file-many-bins has multiple binaries: t, tt') }) test('dlx should not fail when the installed package has many commands and one equals the package name', async () => { prepareEmpty() await dlx.handler({ ...DEFAULT_OPTS, dir: path.resolve('project'), storeDir: path.resolve('store'), }, ['@pnpm.e2e/touch-file-good-bin-name']) expect(fs.existsSync('touch.txt')).toBeTruthy() }) test('dlx --package [--package ]', async () => { prepareEmpty() await dlx.handler({ ...DEFAULT_OPTS, dir: path.resolve('project'), storeDir: path.resolve('store'), package: [ 'zkochan/for-testing-pnpm-dlx', 'is-positive', ], }, ['foo']) expect(fs.existsSync('foo')).toBeTruthy() }) test('dlx should fail when the package has no bins', async () => { prepareEmpty() await expect( dlx.handler({ ...DEFAULT_OPTS, dir: path.resolve('project'), storeDir: path.resolve('store'), }, ['is-positive']) ).rejects.toThrow(/No binaries found in is-positive/) }) test('dlx should work in shell mode', async () => { prepareEmpty() await dlx.handler({ ...DEFAULT_OPTS, dir: path.resolve('project'), storeDir: path.resolve('store'), package: [ 'is-positive', ], shellMode: true, }, ['echo "some text" > foo']) expect(fs.existsSync('foo')).toBeTruthy() })