1import { spawnPromisified } from '../common/index.mjs'; 2import tmpdir from '../common/tmpdir.js'; 3 4import assert from 'node:assert'; 5import { mkdir, writeFile } from 'node:fs/promises'; 6import * as path from 'node:path'; 7import { execPath } from 'node:process'; 8import { describe, it, before } from 'node:test'; 9 10describe('ESM in main field', { concurrency: true }, () => { 11 before(() => tmpdir.refresh()); 12 13 it('should handle fully-specified relative path without any warning', async () => { 14 const cwd = path.join(tmpdir.path, Math.random().toString()); 15 const pkgPath = path.join(cwd, './node_modules/pkg/'); 16 await mkdir(pkgPath, { recursive: true }); 17 await writeFile(path.join(pkgPath, './index.js'), 'console.log("Hello World!")'); 18 await writeFile(path.join(pkgPath, './package.json'), JSON.stringify({ 19 main: './index.js', 20 type: 'module', 21 })); 22 const { code, stdout, stderr } = await spawnPromisified(execPath, [ 23 '--input-type=module', 24 '--eval', 'import "pkg"', 25 ], { cwd }); 26 27 assert.strictEqual(stderr, ''); 28 assert.match(stdout, /^Hello World!\r?\n$/); 29 assert.strictEqual(code, 0); 30 }); 31 it('should handle fully-specified absolute path without any warning', async () => { 32 const cwd = path.join(tmpdir.path, Math.random().toString()); 33 const pkgPath = path.join(cwd, './node_modules/pkg/'); 34 await mkdir(pkgPath, { recursive: true }); 35 await writeFile(path.join(pkgPath, './index.js'), 'console.log("Hello World!")'); 36 await writeFile(path.join(pkgPath, './package.json'), JSON.stringify({ 37 main: path.join(pkgPath, './index.js'), 38 type: 'module', 39 })); 40 const { code, stdout, stderr } = await spawnPromisified(execPath, [ 41 '--input-type=module', 42 '--eval', 'import "pkg"', 43 ], { cwd }); 44 45 assert.strictEqual(stderr, ''); 46 assert.match(stdout, /^Hello World!\r?\n$/); 47 assert.strictEqual(code, 0); 48 }); 49 50 it('should emit warning when "main" and "exports" are missing', async () => { 51 const cwd = path.join(tmpdir.path, Math.random().toString()); 52 const pkgPath = path.join(cwd, './node_modules/pkg/'); 53 await mkdir(pkgPath, { recursive: true }); 54 await writeFile(path.join(pkgPath, './index.js'), 'console.log("Hello World!")'); 55 await writeFile(path.join(pkgPath, './package.json'), JSON.stringify({ 56 type: 'module', 57 })); 58 const { code, stdout, stderr } = await spawnPromisified(execPath, [ 59 '--input-type=module', 60 '--eval', 'import "pkg"', 61 ], { cwd }); 62 63 assert.match(stderr, /\[DEP0151\]/); 64 assert.match(stdout, /^Hello World!\r?\n$/); 65 assert.strictEqual(code, 0); 66 }); 67 it('should emit warning when "main" is falsy', async () => { 68 const cwd = path.join(tmpdir.path, Math.random().toString()); 69 const pkgPath = path.join(cwd, './node_modules/pkg/'); 70 await mkdir(pkgPath, { recursive: true }); 71 await writeFile(path.join(pkgPath, './index.js'), 'console.log("Hello World!")'); 72 await writeFile(path.join(pkgPath, './package.json'), JSON.stringify({ 73 type: 'module', 74 main: '', 75 })); 76 const { code, stdout, stderr } = await spawnPromisified(execPath, [ 77 '--input-type=module', 78 '--eval', 'import "pkg"', 79 ], { cwd }); 80 81 assert.match(stderr, /\[DEP0151\]/); 82 assert.match(stdout, /^Hello World!\r?\n$/); 83 assert.strictEqual(code, 0); 84 }); 85 it('should emit warning when "main" is a relative path without extension', async () => { 86 const cwd = path.join(tmpdir.path, Math.random().toString()); 87 const pkgPath = path.join(cwd, './node_modules/pkg/'); 88 await mkdir(pkgPath, { recursive: true }); 89 await writeFile(path.join(pkgPath, './index.js'), 'console.log("Hello World!")'); 90 await writeFile(path.join(pkgPath, './package.json'), JSON.stringify({ 91 main: 'index', 92 type: 'module', 93 })); 94 const { code, stdout, stderr } = await spawnPromisified(execPath, [ 95 '--input-type=module', 96 '--eval', 'import "pkg"', 97 ], { cwd }); 98 99 assert.match(stderr, /\[DEP0151\]/); 100 assert.match(stdout, /^Hello World!\r?\n$/); 101 assert.strictEqual(code, 0); 102 }); 103 it('should emit warning when "main" is an absolute path without extension', async () => { 104 const cwd = path.join(tmpdir.path, Math.random().toString()); 105 const pkgPath = path.join(cwd, './node_modules/pkg/'); 106 await mkdir(pkgPath, { recursive: true }); 107 await writeFile(path.join(pkgPath, './index.js'), 'console.log("Hello World!")'); 108 await writeFile(path.join(pkgPath, './package.json'), JSON.stringify({ 109 main: pkgPath + 'index', 110 type: 'module', 111 })); 112 const { code, stdout, stderr } = await spawnPromisified(execPath, [ 113 '--input-type=module', 114 '--eval', 'import "pkg"', 115 ], { cwd }); 116 117 assert.match(stderr, /\[DEP0151\]/); 118 assert.match(stdout, /^Hello World!\r?\n$/); 119 assert.strictEqual(code, 0); 120 }); 121}); 122