Skip to content

Commit 0dc6f03

Browse files
GeoffreyBoothBethGriggs
authored andcommitted
module: support multi-dot file extension
Support multi-dot file extensions like '.coffee.md' in Module.load. PR-URL: #23416 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: John-David Dalton <[email protected]>
1 parent 43f41be commit 0dc6f03

File tree

3 files changed

+111
-20
lines changed

3 files changed

+111
-20
lines changed

‎lib/internal/modules/cjs/loader.js‎

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,22 @@ function tryExtensions(p, exts, isMain){
217217
returnfalse;
218218
}
219219

220+
// find the longest (possibly multi-dot) extension registered in
221+
// Module._extensions
222+
functionfindLongestRegisteredExtension(filename){
223+
constname=path.basename(filename);
224+
letcurrentExtension;
225+
letindex;
226+
letstartIndex=0;
227+
while((index=name.indexOf('.',startIndex))!==-1){
228+
startIndex=index+1;
229+
if(index===0)continue;// Skip dotfiles like .gitignore
230+
currentExtension=name.slice(index);
231+
if(Module._extensions[currentExtension])returncurrentExtension;
232+
}
233+
return'.js';
234+
}
235+
220236
varwarned=false;
221237
Module._findPath=function(request,paths,isMain){
222238
if(path.isAbsolute(request)){
@@ -595,8 +611,7 @@ Module.prototype.load = function(filename){
595611
this.filename=filename;
596612
this.paths=Module._nodeModulePaths(path.dirname(filename));
597613

598-
varextension=path.extname(filename)||'.js';
599-
if(!Module._extensions[extension])extension='.js';
614+
varextension=findLongestRegisteredExtension(filename);
600615
Module._extensions[extension](this,filename);
601616
this.loaded=true;
602617

‎test/known_issues/test-module-deleted-extensions.js‎

Lines changed: 0 additions & 18 deletions
This file was deleted.
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
'use strict';
2+
3+
// Refs: https://github.com/nodejs/node/issues/4778
4+
5+
constcommon=require('../common');
6+
constassert=require('assert');
7+
constfs=require('fs');
8+
constpath=require('path');
9+
constModule=require('module');
10+
consttmpdir=require('../common/tmpdir');
11+
constfile=path.join(tmpdir.path,'test-extensions.foo.bar');
12+
constdotfile=path.join(tmpdir.path,'.bar');
13+
constdotfileWithExtension=path.join(tmpdir.path,'.foo.bar');
14+
15+
tmpdir.refresh();
16+
fs.writeFileSync(file,'console.log(__filename);','utf8');
17+
fs.writeFileSync(dotfile,'console.log(__filename);','utf8');
18+
fs.writeFileSync(dotfileWithExtension,'console.log(__filename);','utf8');
19+
20+
{
21+
require.extensions['.bar']=common.mustNotCall();
22+
require.extensions['.foo.bar']=common.mustCall();
23+
constmodulePath=path.join(tmpdir.path,'test-extensions');
24+
require(modulePath);
25+
require(file);
26+
deleterequire.cache[file];
27+
deleterequire.extensions['.bar'];
28+
deleterequire.extensions['.foo.bar'];
29+
Module._pathCache=Object.create(null);
30+
}
31+
32+
{
33+
require.extensions['.foo.bar']=common.mustCall();
34+
constmodulePath=path.join(tmpdir.path,'test-extensions');
35+
require(modulePath);
36+
assert.throws(
37+
()=>require(`${modulePath}.foo`),
38+
newError(`Cannot find module '${modulePath}.foo'`)
39+
);
40+
require(`${modulePath}.foo.bar`);
41+
deleterequire.cache[file];
42+
deleterequire.extensions['.foo.bar'];
43+
Module._pathCache=Object.create(null);
44+
}
45+
46+
{
47+
constmodulePath=path.join(tmpdir.path,'test-extensions');
48+
assert.throws(
49+
()=>require(modulePath),
50+
newError(`Cannot find module '${modulePath}'`)
51+
);
52+
deleterequire.cache[file];
53+
Module._pathCache=Object.create(null);
54+
}
55+
56+
{
57+
require.extensions['.bar']=common.mustNotCall();
58+
require.extensions['.foo.bar']=common.mustCall();
59+
constmodulePath=path.join(tmpdir.path,'test-extensions.foo');
60+
require(modulePath);
61+
deleterequire.cache[file];
62+
deleterequire.extensions['.bar'];
63+
deleterequire.extensions['.foo.bar'];
64+
Module._pathCache=Object.create(null);
65+
}
66+
67+
{
68+
require.extensions['.foo.bar']=common.mustNotCall();
69+
constmodulePath=path.join(tmpdir.path,'test-extensions.foo');
70+
assert.throws(
71+
()=>require(modulePath),
72+
newError(`Cannot find module '${modulePath}'`)
73+
);
74+
deleterequire.extensions['.foo.bar'];
75+
Module._pathCache=Object.create(null);
76+
}
77+
78+
{
79+
require.extensions['.bar']=common.mustNotCall();
80+
require(dotfile);
81+
deleterequire.cache[dotfile];
82+
deleterequire.extensions['.bar'];
83+
Module._pathCache=Object.create(null);
84+
}
85+
86+
{
87+
require.extensions['.bar']=common.mustCall();
88+
require.extensions['.foo.bar']=common.mustNotCall();
89+
require(dotfileWithExtension);
90+
deleterequire.cache[dotfileWithExtension];
91+
deleterequire.extensions['.bar'];
92+
deleterequire.extensions['.foo.bar'];
93+
Module._pathCache=Object.create(null);
94+
}

0 commit comments

Comments
(0)