|
23 | 23 |
|
24 | 24 | const { |
25 | 25 | ArrayIsArray, |
| 26 | + ArrayPrototypeConcat, |
| 27 | + ArrayPrototypeFilter, |
| 28 | + ArrayPrototypeIncludes, |
| 29 | + ArrayPrototypeIndexOf, |
26 | 30 | ArrayPrototypeJoin, |
| 31 | + ArrayPrototypePush, |
| 32 | + ArrayPrototypeSlice, |
| 33 | + ArrayPrototypeSplice, |
| 34 | + Boolean, |
27 | 35 | Error, |
28 | 36 | JSONParse, |
29 | | - Map, |
30 | 37 | ObjectCreate, |
31 | 38 | ObjectDefineProperty, |
32 | 39 | ObjectFreeze, |
@@ -36,16 +43,20 @@ const { |
36 | 43 | ObjectPrototype, |
37 | 44 | ObjectPrototypeHasOwnProperty, |
38 | 45 | ObjectSetPrototypeOf, |
| 46 | + ReflectApply, |
39 | 47 | ReflectSet, |
40 | 48 | RegExpPrototypeTest, |
41 | 49 | SafeMap, |
42 | 50 | SafeWeakMap, |
43 | 51 | String, |
| 52 | + StringPrototypeCharAt, |
| 53 | + StringPrototypeCharCodeAt, |
44 | 54 | StringPrototypeEndsWith, |
45 | 55 | StringPrototypeLastIndexOf, |
46 | 56 | StringPrototypeIndexOf, |
47 | 57 | StringPrototypeMatch, |
48 | 58 | StringPrototypeSlice, |
| 59 | + StringPrototypeSplit, |
49 | 60 | StringPrototypeStartsWith, |
50 | 61 | } = primordials; |
51 | 62 |
|
@@ -142,8 +153,8 @@ function stat(filename) { |
142 | 153 |
|
143 | 154 | function updateChildren(parent, child, scan) { |
144 | 155 | const children = parent && parent.children; |
145 | | - if (children && !(scan && children.includes(child))) |
146 | | - children.push(child); |
| 156 | + if (children && !(scan && ArrayPrototypeIncludes(children, child))) |
| 157 | + ArrayPrototypePush(children, child); |
147 | 158 | } |
148 | 159 |
|
149 | 160 | const moduleParentCache = new SafeWeakMap(); |
@@ -161,7 +172,7 @@ function Module(id = '', parent) { |
161 | 172 | const builtinModules = []; |
162 | 173 | for (const [id, mod] of NativeModule.map) { |
163 | 174 | if (mod.canBeRequiredByUsers) { |
164 | | - builtinModules.push(id); |
| 175 | + ArrayPrototypePush(builtinModules, id); |
165 | 176 | } |
166 | 177 | } |
167 | 178 |
|
@@ -349,7 +360,7 @@ function tryPackage(requestPath, exts, isMain, originalPath) { |
349 | 360 | // In order to minimize unnecessary lstat() calls, |
350 | 361 | // this cache is a list of known-real paths. |
351 | 362 | // Set to an empty Map to reset. |
352 | | -const realpathCache = new Map(); |
| 363 | +const realpathCache = new SafeMap(); |
353 | 364 |
|
354 | 365 | // Check if the file exists and is not a directory |
355 | 366 | // if using --preserve-symlinks and isMain is false, |
@@ -389,10 +400,10 @@ function findLongestRegisteredExtension(filename) { |
389 | 400 | let currentExtension; |
390 | 401 | let index; |
391 | 402 | let startIndex = 0; |
392 | | - while ((index = name.indexOf('.', startIndex)) !== -1) { |
| 403 | + while ((index = StringPrototypeIndexOf(name, '.', startIndex)) !== -1) { |
393 | 404 | startIndex = index + 1; |
394 | 405 | if (index === 0) continue; // Skip dotfiles like .gitignore |
395 | | - currentExtension = name.slice(index); |
| 406 | + currentExtension = StringPrototypeSlice(name, index); |
396 | 407 | if (Module._extensions[currentExtension]) return currentExtension; |
397 | 408 | } |
398 | 409 | return '.js'; |
@@ -473,15 +484,15 @@ Module._findPath = function(request, paths, isMain) { |
473 | 484 | return false; |
474 | 485 | } |
475 | 486 |
|
476 | | - const cacheKey = request + '\x00' + |
477 | | - (paths.length === 1 ? paths[0] : paths.join('\x00')); |
| 487 | + const cacheKey = request + '\x00' + ArrayPrototypeJoin(paths, '\x00'); |
478 | 488 | const entry = Module._pathCache[cacheKey]; |
479 | 489 | if (entry) |
480 | 490 | return entry; |
481 | 491 |
|
482 | 492 | let exts; |
483 | 493 | let trailingSlash = request.length > 0 && |
484 | | - request.charCodeAt(request.length - 1) === CHAR_FORWARD_SLASH; |
| 494 | + StringPrototypeCharCodeAt(request, request.length - 1) === |
| 495 | + CHAR_FORWARD_SLASH; |
485 | 496 | if (!trailingSlash) { |
486 | 497 | trailingSlash = RegExpPrototypeTest(trailingSlashRegex, request); |
487 | 498 | } |
@@ -564,13 +575,14 @@ if (isWindows) { |
564 | 575 |
|
565 | 576 | // return root node_modules when path is 'D:\\'. |
566 | 577 | // path.resolve will make sure from.length >=3 in Windows. |
567 | | - if (from.charCodeAt(from.length - 1) === CHAR_BACKWARD_SLASH && |
568 | | - from.charCodeAt(from.length - 2) === CHAR_COLON) |
| 578 | + if (StringPrototypeCharCodeAt(from, from.length - 1) === |
| 579 | + CHAR_BACKWARD_SLASH && |
| 580 | + StringPrototypeCharCodeAt(from, from.length - 2) === CHAR_COLON) |
569 | 581 | return [from + 'node_modules']; |
570 | 582 |
|
571 | 583 | const paths = []; |
572 | 584 | for (let i = from.length - 1, p = 0, last = from.length; i >= 0; --i) { |
573 | | - const code = from.charCodeAt(i); |
| 585 | + const code = StringPrototypeCharCodeAt(from, i); |
574 | 586 | // The path segment separator check ('\' and '/') was used to get |
575 | 587 | // node_modules path for every path segment. |
576 | 588 | // Use colon as an extra condition since we can get node_modules |
@@ -580,7 +592,10 @@ if (isWindows) { |
580 | 592 | code === CHAR_FORWARD_SLASH || |
581 | 593 | code === CHAR_COLON) { |
582 | 594 | if (p !== nmLen) |
583 | | - paths.push(from.slice(0, last) + '\\node_modules'); |
| 595 | + ArrayPrototypePush( |
| 596 | + paths, |
| 597 | + StringPrototypeSlice(from, 0, last) + '\\node_modules' |
| 598 | + ); |
584 | 599 | last = i; |
585 | 600 | p = 0; |
586 | 601 | } else if (p !== -1) { |
@@ -609,10 +624,13 @@ if (isWindows) { |
609 | 624 | // that works on both Windows and Posix is non-trivial. |
610 | 625 | const paths = []; |
611 | 626 | for (let i = from.length - 1, p = 0, last = from.length; i >= 0; --i) { |
612 | | - const code = from.charCodeAt(i); |
| 627 | + const code = StringPrototypeCharCodeAt(from, i); |
613 | 628 | if (code === CHAR_FORWARD_SLASH) { |
614 | 629 | if (p !== nmLen) |
615 | | - paths.push(from.slice(0, last) + '/node_modules'); |
| 630 | + ArrayPrototypePush( |
| 631 | + paths, |
| 632 | + StringPrototypeSlice(from, 0, last) + '/node_modules' |
| 633 | + ); |
616 | 634 | last = i; |
617 | 635 | p = 0; |
618 | 636 | } else if (p !== -1) { |
@@ -625,7 +643,7 @@ if (isWindows) { |
625 | 643 | } |
626 | 644 |
|
627 | 645 | // Append /node_modules to handle root paths. |
628 | | - paths.push('/node_modules'); |
| 646 | + ArrayPrototypePush(paths, '/node_modules'); |
629 | 647 |
|
630 | 648 | return paths; |
631 | 649 | }; |
@@ -638,15 +656,15 @@ Module._resolveLookupPaths = function(request, parent) { |
638 | 656 | } |
639 | 657 |
|
640 | 658 | // Check for node modules paths. |
641 | | - if (request.charAt(0) !== '.' || |
| 659 | + if (StringPrototypeCharAt(request, 0) !== '.' || |
642 | 660 | (request.length > 1 && |
643 | | - request.charAt(1) !== '.' && |
644 | | - request.charAt(1) !== '/' && |
645 | | - (!isWindows || request.charAt(1) !== '\\'))) { |
| 661 | + StringPrototypeCharAt(request, 1) !== '.' && |
| 662 | + StringPrototypeCharAt(request, 1) !== '/' && |
| 663 | + (!isWindows || StringPrototypeCharAt(request, 1) !== '\\'))) { |
646 | 664 |
|
647 | 665 | let paths = modulePaths; |
648 | 666 | if (parent != null && parent.paths && parent.paths.length) { |
649 | | - paths = parent.paths.concat(paths); |
| 667 | + paths = ArrayPrototypeConcat(parent.paths, paths); |
650 | 668 | } |
651 | 669 |
|
652 | 670 | debug('looking for %j in %j', request, paths); |
@@ -796,9 +814,9 @@ Module._load = function(request, parent, isMain) { |
796 | 814 | delete relativeResolveCache[relResolveCacheIdentifier]; |
797 | 815 | const children = parent && parent.children; |
798 | 816 | if (ArrayIsArray(children)) { |
799 | | - const index = children.indexOf(module); |
| 817 | + const index = ArrayPrototypeIndexOf(children, module); |
800 | 818 | if (index !== -1) { |
801 | | - children.splice(index, 1); |
| 819 | + ArrayPrototypeSplice(children, index, 1); |
802 | 820 | } |
803 | 821 | } |
804 | 822 | } |
@@ -822,10 +840,10 @@ Module._resolveFilename = function(request, parent, isMain, options) { |
822 | 840 |
|
823 | 841 | if (typeof options === 'object' && options !== null) { |
824 | 842 | if (ArrayIsArray(options.paths)) { |
825 | | - const isRelative = request.startsWith('./') || |
826 | | - request.startsWith('../') || |
827 | | - ((isWindows && request.startsWith('.\\')) || |
828 | | - request.startsWith('..\\')); |
| 843 | + const isRelative = StringPrototypeStartsWith(request, './') || |
| 844 | + StringPrototypeStartsWith(request, '../') || |
| 845 | + ((isWindows && StringPrototypeStartsWith(request, '.\\')) || |
| 846 | + StringPrototypeStartsWith(request, '..\\')); |
829 | 847 |
|
830 | 848 | if (isRelative) { |
831 | 849 | paths = options.paths; |
@@ -840,8 +858,8 @@ Module._resolveFilename = function(request, parent, isMain, options) { |
840 | 858 | const lookupPaths = Module._resolveLookupPaths(request, fakeParent); |
841 | 859 |
|
842 | 860 | for (let j = 0; j < lookupPaths.length; j++) { |
843 | | - if (!paths.includes(lookupPaths[j])) |
844 | | - paths.push(lookupPaths[j]); |
| 861 | + if (!ArrayPrototypeIncludes(paths, lookupPaths[j])) |
| 862 | + ArrayPrototypePush(paths, lookupPaths[j]); |
845 | 863 | } |
846 | 864 | } |
847 | 865 | } |
@@ -890,11 +908,12 @@ Module._resolveFilename = function(request, parent, isMain, options) { |
890 | 908 | for (let cursor = parent; |
891 | 909 | cursor; |
892 | 910 | cursor = moduleParentCache.get(cursor)) { |
893 | | - requireStack.push(cursor.filename || cursor.id); |
| 911 | + ArrayPrototypePush(requireStack, cursor.filename || cursor.id); |
894 | 912 | } |
895 | 913 | let message = `Cannot find module '${request}'`; |
896 | 914 | if (requireStack.length > 0) { |
897 | | - message = message + '\nRequire stack:\n- ' + requireStack.join('\n- '); |
| 915 | + message = message + '\nRequire stack:\n- ' + |
| 916 | + ArrayPrototypeJoin(requireStack, '\n- '); |
898 | 917 | } |
899 | 918 | // eslint-disable-next-line no-restricted-syntax |
900 | 919 | const err = new Error(message); |
@@ -905,7 +924,7 @@ Module._resolveFilename = function(request, parent, isMain, options) { |
905 | 924 |
|
906 | 925 | function finalizeEsmResolution(match, request, parentPath, pkgPath) { |
907 | 926 | const { resolved, exact } = match; |
908 | | - if (StringPrototypeMatch(resolved, encodedSepRegEx)) |
| 927 | + if (RegExpPrototypeTest(encodedSepRegEx, resolved)) |
909 | 928 | throw new ERR_INVALID_MODULE_SPECIFIER( |
910 | 929 | resolved, 'must not include encoded "/" or "\\" characters', parentPath); |
911 | 930 | const filename = fileURLToPath(resolved); |
@@ -942,9 +961,9 @@ Module.prototype.load = function(filename) { |
942 | 961 |
|
943 | 962 | const extension = findLongestRegisteredExtension(filename); |
944 | 963 | // allow .mjs to be overridden |
945 | | - if (filename.endsWith('.mjs') && !Module._extensions['.mjs']) { |
| 964 | + if (StringPrototypeEndsWith(filename, '.mjs') && !Module._extensions['.mjs']) |
946 | 965 | throw new ERR_REQUIRE_ESM(filename); |
947 | | - } |
| 966 | + |
948 | 967 | Module._extensions[extension](this, filename); |
949 | 968 | this.loaded = true; |
950 | 969 |
|
@@ -1075,13 +1094,13 @@ Module.prototype._compile = function(content, filename) { |
1075 | 1094 | const exports = this.exports; |
1076 | 1095 | const thisValue = exports; |
1077 | 1096 | const module = this; |
1078 | | - if (requireDepth === 0) statCache = new Map(); |
| 1097 | + if (requireDepth === 0) statCache = new SafeMap(); |
1079 | 1098 | if (inspectorWrapper) { |
1080 | 1099 | result = inspectorWrapper(compiledWrapper, thisValue, exports, |
1081 | 1100 | require, module, filename, dirname); |
1082 | 1101 | } else { |
1083 | | - result = compiledWrapper.call(thisValue, exports, require, module, |
1084 | | - filename, dirname); |
| 1102 | + result = ReflectApply(compiledWrapper, thisValue, |
| 1103 | + [exports, require, module, filename, dirname]); |
1085 | 1104 | } |
1086 | 1105 | hasLoadedAnyUserCJSModule = true; |
1087 | 1106 | if (requireDepth === 0) statCache = null; |
@@ -1090,7 +1109,7 @@ Module.prototype._compile = function(content, filename) { |
1090 | 1109 |
|
1091 | 1110 | // Native extension for .js |
1092 | 1111 | Module._extensions['.js'] = function(module, filename) { |
1093 | | - if (filename.endsWith('.js')) { |
| 1112 | + if (StringPrototypeEndsWith(filename, '.js')) { |
1094 | 1113 | const pkg = readPackageScope(filename); |
1095 | 1114 | // Function require shouldn't be used in ES modules. |
1096 | 1115 | if (pkg && pkg.data && pkg.data.type === 'module') { |
@@ -1145,7 +1164,8 @@ Module._extensions['.node'] = function(module, filename) { |
1145 | 1164 | function createRequireFromPath(filename) { |
1146 | 1165 | // Allow a directory to be passed as the filename |
1147 | 1166 | const trailingSlash = |
1148 | | - filename.endsWith('/') || (isWindows && filename.endsWith('\\')); |
| 1167 | + StringPrototypeEndsWith(filename, '/') || |
| 1168 | + (isWindows && StringPrototypeEndsWith(filename, '\\')); |
1149 | 1169 |
|
1150 | 1170 | const proxyPath = trailingSlash ? |
1151 | 1171 | path.join(filename, 'noop.js') : |
@@ -1207,15 +1227,16 @@ Module._initPaths = function() { |
1207 | 1227 | } |
1208 | 1228 |
|
1209 | 1229 | if (nodePath) { |
1210 | | - paths = nodePath.split(path.delimiter).filter(function pathsFilterCB(path) { |
1211 | | - return !!path; |
1212 | | - }).concat(paths); |
| 1230 | + paths = ArrayPrototypeConcat(ArrayPrototypeFilter( |
| 1231 | + StringPrototypeSplit(nodePath, path.delimiter), |
| 1232 | + Boolean |
| 1233 | + ), paths); |
1213 | 1234 | } |
1214 | 1235 |
|
1215 | 1236 | modulePaths = paths; |
1216 | 1237 |
|
1217 | 1238 | // Clone as a shallow copy, for introspection. |
1218 | | - Module.globalPaths = modulePaths.slice(0); |
| 1239 | + Module.globalPaths = ArrayPrototypeSlice(modulePaths); |
1219 | 1240 | }; |
1220 | 1241 |
|
1221 | 1242 | Module._preloadModules = function(requests) { |
|