Skip to content

Commit 9683761

Browse files
authored
Merge pull request #261 from Bijikyu/q/update-saferesolve-to-handle-nonexistent-paths
Improve safeResolve error handling
2 parents dca7d9a + 62e606d commit 9683761

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

index.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ let errLog; // holds qerrors function or console fallback
3030
try { // attempts qerrors for structured logging like logger utility
3131
errLog = require('qerrors'); // assigns qerrors when available for consistency
3232
} catch { errLog = null; } // absence handled later to preserve console output
33+
let fs; // holds node:fs module for existence checks
34+
if(typeof require==='function'){ // ensures require exists before attempting fs load
35+
try { fs = require('node:fs'); } catch { fs = null; } // safe attempt to load fs or fallback
36+
} else { fs = null; } // browser environment fallback when require undefined
3337

3438
/*
3539
* MAIN EXPORT OBJECT CONSTRUCTION
@@ -53,6 +57,11 @@ function safeResolve(file){ // resolves path when require is present or falls ba
5357
} // logs unexpected errors
5458
const baseDir = typeof __dirname === 'string' ? __dirname : ''; // guards __dirname so browsers without Node globals do not throw
5559
const abs = path.resolve(baseDir, file); // absolute fallback ensures bundlers find correct file even without require
60+
if(fs && fs.existsSync && !fs.existsSync(abs)){ // verifies file exists when using fallback
61+
const err = new Error(`file not found: ${abs}`); // error describes missing file path
62+
if(errLog){ errLog(err,'safeResolve missing',{file}); } else { console.error('safeResolve missing:', err.message); } // logs via qerrors or console
63+
throw err; // throws to signal unresolved path to caller
64+
}
5665
console.log(`safeResolve is returning ${abs}`); // logs absolute fallback path
5766
return abs; // returns absolute path when require unavailable for browser bundling
5867
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
require('./helper');
2+
const assert = require('node:assert');
3+
const fs = require('node:fs');
4+
const path = require('node:path');
5+
const os = require('node:os');
6+
const vm = require('node:vm');
7+
const {describe, it} = require('node:test');
8+
9+
describe('safeResolve missing file', {concurrency:false}, () => {
10+
it('throws when fallback path does not exist', () => {
11+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'sr-')); // temp dir for sandbox
12+
const code = fs.readFileSync(path.resolve(__dirname, '../index.js'), 'utf8'); // module source
13+
const nodeRequire = require; // capture native require
14+
function req(id){ return nodeRequire(id); } // passthrough require
15+
req.resolve = undefined; // remove resolve to trigger fallback branch
16+
const sandbox = {require:req,module:{exports:{}},exports:{},console,__dirname:tmp,__filename:path.join(tmp,'index.js')};
17+
assert.throws(() => vm.runInNewContext(code, sandbox, {filename:'index.js'})); // expect error on missing file
18+
fs.rmSync(tmp,{recursive:true,force:true}); // cleanup temp directory
19+
});
20+
});

0 commit comments

Comments
 (0)