| 'use strict'; |
| const common = require('../common'); |
| |
| // This tests the creation of a vfs by monkey-patching fs and Module._stat. |
| |
| const Module = require('module'); |
| const fs = require('fs'); |
| const tmpdir = require('../common/tmpdir'); |
| const { deepStrictEqual, ok, strictEqual, throws } = require('assert'); |
| const { join } = require('path'); |
| |
| const directory = join(tmpdir.path, 'directory'); |
| const doesNotExist = join(tmpdir.path, 'does-not-exist'); |
| const file = join(tmpdir.path, 'file.js'); |
| |
| tmpdir.refresh(); |
| fs.writeFileSync(file, "module.exports = { a: 'b' }"); |
| fs.mkdirSync(directory); |
| |
| strictEqual(Module._stat(directory), 1); |
| ok(Module._stat(doesNotExist) < 0); |
| strictEqual(Module._stat(file), 0); |
| |
| const vfsDirectory = join(process.execPath, 'directory'); |
| const vfsDoesNotExist = join(process.execPath, 'does-not-exist'); |
| const vfsFile = join(process.execPath, 'file.js'); |
| |
| ok(Module._stat(vfsDirectory) < 0); |
| ok(Module._stat(vfsDoesNotExist) < 0); |
| ok(Module._stat(vfsFile) < 0); |
| |
| deepStrictEqual(require(file), { a: 'b' }); |
| throws(() => require(vfsFile), { code: 'MODULE_NOT_FOUND' }); |
| |
| common.expectWarning( |
| 'ExperimentalWarning', |
| 'Module._stat is an experimental feature and might change at any time' |
| ); |
| |
| process.on('warning', common.mustCall()); |
| |
| const originalStat = Module._stat; |
| Module._stat = function(filename) { |
| if (!filename.startsWith(process.execPath)) { |
| return originalStat(filename); |
| } |
| |
| if (filename === process.execPath) { |
| return 1; |
| } |
| |
| switch (filename) { |
| case vfsDirectory: |
| return 1; |
| case vfsDoesNotExist: |
| return -2; |
| case vfsFile: |
| return 0; |
| } |
| }; |
| |
| const originalReadFileSync = fs.readFileSync; |
| // TODO(aduh95): We'd like to have a better way to achieve this without monkey-patching fs. |
| fs.readFileSync = function readFileSync(pathArgument, options) { |
| if (!pathArgument.startsWith(process.execPath)) { |
| return originalReadFileSync.apply(this, arguments); |
| } |
| if (pathArgument === vfsFile) { |
| return "module.exports = { x: 'y' };"; |
| } |
| throw new Error(); |
| }; |
| |
| fs.realpathSync = function realpathSync(pathArgument, options) { |
| return pathArgument; |
| }; |
| |
| strictEqual(Module._stat(directory), 1); |
| ok(Module._stat(doesNotExist) < 0); |
| strictEqual(Module._stat(file), 0); |
| |
| strictEqual(Module._stat(vfsDirectory), 1); |
| ok(Module._stat(vfsDoesNotExist) < 0); |
| strictEqual(Module._stat(vfsFile), 0); |
| |
| strictEqual(Module._stat(process.execPath), 1); |
| |
| deepStrictEqual(require(file), { a: 'b' }); |
| deepStrictEqual(require(vfsFile), { x: 'y' }); |