| // Flags: --preserve-symlinks |
| 'use strict'; |
| // Refs: https://github.com/nodejs/node/pull/5950 |
| |
| // This test verifies that symlinked modules are able to find their peer |
| // dependencies when using the --preserve-symlinks command line flag. |
| |
| // This test passes in v6.2+ with --preserve-symlinks on and in v6.0/v6.1. |
| // This test will fail in Node.js v4 and v5 and should not be backported. |
| |
| const common = require('../common'); |
| const fs = require('fs'); |
| const path = require('path'); |
| |
| const tmpdir = require('../common/tmpdir'); |
| tmpdir.refresh(); |
| |
| const tmpDir = tmpdir.path; |
| |
| // Creates the following structure |
| // {tmpDir} |
| // ├── app |
| // │ ├── index.js |
| // │ └── node_modules |
| // │ ├── moduleA -> {tmpDir}/moduleA |
| // │ └── moduleB |
| // │ ├── index.js |
| // │ └── package.json |
| // └── moduleA |
| // ├── index.js |
| // └── package.json |
| |
| const moduleA = path.join(tmpDir, 'moduleA'); |
| const app = path.join(tmpDir, 'app'); |
| const moduleB = path.join(app, 'node_modules', 'moduleB'); |
| const moduleA_link = path.join(app, 'node_modules', 'moduleA'); |
| fs.mkdirSync(moduleA); |
| fs.mkdirSync(app); |
| fs.mkdirSync(path.join(app, 'node_modules')); |
| fs.mkdirSync(moduleB); |
| |
| // Attempt to make the symlink. If this fails due to lack of sufficient |
| // permissions, the test will bail out and be skipped. |
| try { |
| fs.symlinkSync(moduleA, moduleA_link, 'dir'); |
| } catch (err) { |
| if (err.code !== 'EPERM') throw err; |
| common.skip('insufficient privileges for symlinks'); |
| } |
| |
| fs.writeFileSync(path.join(moduleA, 'package.json'), |
| JSON.stringify({ name: 'moduleA', main: 'index.js' }), 'utf8'); |
| fs.writeFileSync(path.join(moduleA, 'index.js'), |
| 'module.exports = require(\'moduleB\');', 'utf8'); |
| fs.writeFileSync(path.join(app, 'index.js'), |
| '\'use strict\'; require(\'moduleA\');', 'utf8'); |
| fs.writeFileSync(path.join(moduleB, 'package.json'), |
| JSON.stringify({ name: 'moduleB', main: 'index.js' }), 'utf8'); |
| fs.writeFileSync(path.join(moduleB, 'index.js'), |
| 'module.exports = 1;', 'utf8'); |
| |
| require(path.join(app, 'index')); // Should not throw. |