11// External libraries are lazy-loaded only if these file types exist.
2+ import Path from 'path' ;
3+ import { createRequire } from 'node:module' ;
4+ import JSON5 from 'json5' ;
25
3- // webpack can't solve dynamic module
4- // @see https://github.com/node-config/node-config/issues/755
5- // @see https://webpack.js.org/guides/dependency-management/#require-with-expression
6- const JSON5Module = require ( 'json5' ) ;
6+ const moduleRequire = createRequire ( Path . join ( process . cwd ( ) , 'node_modules' ) ) ;
7+ const require = createRequire ( process . cwd ( ) ) ;
78
8- // webpack resolves json5 with module field out of the box which lead to this usage
9- // @see https://github.com/node-config/node-config/issues/755
10- // @see https://github.com/json5/json5/issues/240
11- const JSON5 = JSON5Module . default || JSON5Module ;
12-
13- var Yaml = null ,
9+ let Yaml = null ,
1410 JSYaml = null ,
1511 Coffee = null ,
1612 Iced = null ,
1713 CSON = null ,
1814 PPARSER = null ,
1915 TOML = null ,
2016 HJSON = null ,
21- XML = null ;
17+ XML = null ,
18+ TS = null ;
2219
2320// Define soft dependencies so transpilers don't include everything
24- var COFFEE_2_DEP = 'coffeescript' ,
21+ let COFFEE_2_DEP = 'coffeescript' ,
2522 COFFEE_DEP = 'coffee-script' ,
2623 ICED_DEP = 'iced-coffee-script' ,
2724 JS_YAML_DEP = 'js-yaml' ,
@@ -38,7 +35,7 @@ var COFFEE_2_DEP = 'coffeescript',
3835 * @template [T=any]
3936 * @typedef {(filename: string, content: string) => T | undefined } ParserFn<T>
4037 */
41- var Parser = module . exports ;
38+ let Parser = { } ;
4239
4340/**
4441 * @param {string } filename
@@ -60,7 +57,7 @@ Parser.parse = function(filename, content) {
6057 */
6158Parser . xmlParser = function ( filename , content ) {
6259 if ( ! XML ) {
63- XML = require ( XML_DEP ) ;
60+ XML = moduleRequire ( XML_DEP ) ;
6461 }
6562 var x2js = new XML ( ) ;
6663 var configObject = x2js . xml2js ( content ) ;
@@ -91,15 +88,18 @@ Parser.jsParser = function(filename, content) {
9188 * @returns {object }
9289 */
9390Parser . tsParser = function ( filename , content ) {
94- if ( ! require . extensions [ '.ts' ] ) {
95- require ( TS_DEP ) . register ( {
96- lazy : true ,
97- ignore : [ '(?:^|/)node_modules/' , '.*(?<!\.ts)$' ] ,
98- transpileOnly : true ,
99- compilerOptions : {
100- allowJs : true ,
101- }
102- } ) ;
91+ if ( require ?. extensions [ '.ts' ] === undefined ) {
92+ if ( TS === null ) {
93+ TS = moduleRequire ( TS_DEP ) ;
94+ TS . register ( {
95+ lazy : true ,
96+ ignore : [ '(?:^|/)node_modules/' , '.*(?<!\.ts)$' ] ,
97+ transpileOnly : true ,
98+ compilerOptions : {
99+ allowJs : true ,
100+ }
101+ } ) ;
102+ }
103103 }
104104
105105 // Imports config if it is exported via module.exports = ...
@@ -126,21 +126,13 @@ Parser.coffeeParser = function(filename, content) {
126126 if ( ! Coffee ) {
127127 Coffee = { } ;
128128
129- // The following enables iced-coffee-script on .coffee files, if iced-coffee-script is available.
130- // This is commented as per a decision on a pull request.
131- //try {
132- // Coffee = require('iced-coffee-script');
133- //}
134- //catch (e) {
135- // Coffee = require('coffee-script');
136- //}
137129 try {
138130 // Try to load coffeescript
139- Coffee = require ( COFFEE_2_DEP ) ;
131+ Coffee = moduleRequire ( COFFEE_2_DEP ) ;
140132 }
141133 catch ( e ) {
142134 // If it doesn't exist, try to load it using the deprecated module name
143- Coffee = require ( COFFEE_DEP ) ;
135+ Coffee = moduleRequire ( COFFEE_DEP ) ;
144136 }
145137 // coffee-script >= 1.7.0 requires explicit registration for require() to work
146138 if ( Coffee . register ) {
@@ -157,7 +149,7 @@ Parser.coffeeParser = function(filename, content) {
157149 * @returns {object | undefined }
158150 */
159151Parser . icedParser = function ( filename , content ) {
160- Iced = require ( ICED_DEP ) ;
152+ Iced = moduleRequire ( ICED_DEP ) ;
161153
162154 // coffee-script >= 1.7.0 requires explicit registration for require() to work
163155 if ( Iced . register ) {
@@ -174,10 +166,10 @@ Parser.yamlParser = function(filename, content) {
174166 if ( ! Yaml && ! JSYaml ) {
175167 // Lazy loading
176168 try {
177- Yaml = require ( YAML_DEP ) ;
169+ Yaml = moduleRequire ( YAML_DEP ) ;
178170 } catch ( e ) {
179171 try {
180- JSYaml = require ( JS_YAML_DEP ) ;
172+ JSYaml = moduleRequire ( JS_YAML_DEP ) ;
181173 } catch ( e ) { }
182174 }
183175 }
@@ -221,7 +213,7 @@ Parser.json5Parser = function(filename, content) {
221213 */
222214Parser . hjsonParser = function ( filename , content ) {
223215 if ( ! HJSON ) {
224- HJSON = require ( HJSON_DEP ) ;
216+ HJSON = moduleRequire ( HJSON_DEP ) ;
225217 }
226218 return HJSON . parse ( content ) ;
227219} ;
@@ -233,7 +225,7 @@ Parser.hjsonParser = function(filename, content) {
233225 */
234226Parser . tomlParser = function ( filename , content ) {
235227 if ( ! TOML ) {
236- TOML = require ( TOML_DEP ) ;
228+ TOML = moduleRequire ( TOML_DEP ) ;
237229 }
238230 return TOML . parse ( content ) ;
239231} ;
@@ -245,7 +237,7 @@ Parser.tomlParser = function(filename, content) {
245237 */
246238Parser . csonParser = function ( filename , content ) {
247239 if ( ! CSON ) {
248- CSON = require ( CSON_DEP ) ;
240+ CSON = moduleRequire ( CSON_DEP ) ;
249241 }
250242 // Allow comments in CSON files
251243 if ( typeof CSON . parseSync === 'function' ) {
@@ -261,7 +253,7 @@ Parser.csonParser = function(filename, content) {
261253 */
262254Parser . propertiesParser = function ( filename , content ) {
263255 if ( ! PPARSER ) {
264- PPARSER = require ( PPARSER_DEP ) ;
256+ PPARSER = moduleRequire ( PPARSER_DEP ) ;
265257 }
266258 return PPARSER . parse ( content , { namespaces : true , variables : true , sections : true } ) ;
267259} ;
@@ -382,3 +374,5 @@ Parser.setFilesOrder = function(name, newIndex) {
382374function isObject ( arg ) {
383375 return ( arg !== null ) && ( typeof arg === 'object' ) ;
384376}
377+
378+ export default Parser ;
0 commit comments