Skip to content

Commit 3dbdece

Browse files
committed
Back support for Node < 8.
1 parent 8db89fd commit 3dbdece

File tree

14 files changed

+653
-158
lines changed

14 files changed

+653
-158
lines changed

build/common-replacements.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
module.exports.altForEachImplReplacement = [
2+
/$/
3+
, '\nfunction forEach (xs, f) {\n'
4+
+ ' for (var i = 0, l = xs.length; i < l; i++) {\n'
5+
+ ' f(xs[i], i);\n'
6+
+ ' }\n'
7+
+ '}\n'
8+
]
9+
10+
module.exports.altForEachUseReplacement = [
11+
/(\W)([\w\.\(\),\[\] ']+)(\.forEach\()/gm
12+
, '$1forEach($2, '
13+
]
14+
15+
module.exports.specialForEachReplacment = [
16+
/(\W)(\[(?:\d\,\s)+\d\])(\.forEach\()/gm
17+
, '$1forEach($2, '
18+
]
19+
20+
module.exports.altIndexOfImplReplacement = [
21+
/$/
22+
, '\nfunction indexOf (xs, x) {\n'
23+
+ ' for (var i = 0, l = xs.length; i < l; i++) {\n'
24+
+ ' if (xs[i] === x) return i;\n'
25+
+ ' }\n'
26+
+ ' return -1;\n'
27+
+ '}\n'
28+
]
29+
30+
module.exports.altIndexOfUseReplacement = [
31+
/(\W)([\w\.\(\),\[\]]+)(\.indexOf\()/gm
32+
, '$1indexOf($2, '
33+
]
34+
module.exports.objectKeysDefine = [
35+
/^('use strict';)$/m
36+
, '$1\n\n/*<replacement>*/\nvar objectKeys = Object.keys || function (obj) {\n'
37+
+ ' var keys = [];\n'
38+
+ ' for (var key in obj) keys.push(key);\n'
39+
+ ' return keys;\n'
40+
+ '}\n/*</replacement>*/\n'
41+
]
42+
43+
module.exports.objectKeysReplacement = [
44+
/Object\.keys/g
45+
, 'objectKeys'
46+
]
47+
48+
49+
module.exports.bufferShimFix = [
50+
/^('use strict';)$/m,
51+
`/*<replacement>*/
52+
const bufferShim = require('safe-buffer').Buffer;
53+
/*</replacement>*/`
54+
]
55+
56+
module.exports.bufferStaticMethods = [
57+
/Buffer\.((?:alloc)|(?:allocUnsafe)|(?:from))/g,
58+
`bufferShim.$1`
59+
]

build/test-replacements.js

Lines changed: 125 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
const altForEachImplReplacement = require('./common-replacements').altForEachImplReplacement
2+
, altForEachUseReplacement = require('./common-replacements').altForEachUseReplacement
3+
, objectKeysDefine = require('./common-replacements').objectKeysDefine
4+
, objectKeysReplacement = require('./common-replacements').objectKeysReplacement
5+
16
module.exports.all = [
27
[
38
/require\(['"]string_decoder['"]\)/g
@@ -16,27 +21,57 @@ module.exports.all = [
1621

1722
]
1823

19-
module.exports['common.js'] = [
24+
25+
module.exports['test-string-decoder.js'] = [
26+
// test removed because it is V8-version dependant.
2027
[
21-
/^ setImmediate,$/m
22-
, ' typeof setImmediate == \'undefined\' ? null : setImmediate,'
28+
/test\('utf-8', bufferShim\.from\('EDA0B5EDB08D'.*\n.*\n/
29+
, ''
30+
],
31+
, [
32+
/test\('utf-8', bufferShim\.from\('F0B841', 'hex'.*\n/
33+
, ''
2334
]
24-
2535
, [
26-
/^ clearImmediate,$/m
27-
, ' typeof clearImmediate == \'undefined\' ? null : clearImmediate,'
36+
/test\('utf-8', bufferShim\.from\('CCE2B8B8', 'hex'.*\n/
37+
, ''
38+
]
39+
, [
40+
/test\('utf-8', bufferShim\.from\('E2B8CCB8', 'hex'.*\n/
41+
, ''
2842
]
29-
3043
, [
31-
/^ global];$/m
32-
, ' global].filter(Boolean);'
44+
/assert\.strictEqual\(decoder\.end(), '\ufffd'\);\n/
45+
, ''
3346
]
47+
]
48+
49+
module.exports['common.js'] = [
50+
objectKeysDefine
51+
, objectKeysReplacement
52+
, altForEachImplReplacement
53+
, altForEachUseReplacement
3454

3555
, [
36-
/^/
37-
, 'require(\'babel-polyfill\');'
56+
/(exports.mustCall[\s\S]*)/m
57+
, '$1\n'
58+
+ 'if (!util._errnoException) {\n'
59+
+ ' var uv;\n'
60+
+ ' util._errnoException = function(err, syscall) {\n'
61+
+ ' if (util.isUndefined(uv)) try { uv = process.binding(\'uv\'); } catch (e) {}\n'
62+
+ ' var errname = uv ? uv.errname(err) : \'\';\n'
63+
+ ' var e = new Error(syscall + \' \' + errname);\n'
64+
+ ' e.code = errname;\n'
65+
+ ' e.errno = errname;\n'
66+
+ ' e.syscall = syscall;\n'
67+
+ ' return e;\n'
68+
+ ' };\n'
69+
+ '}\n'
3870
]
3971

72+
// for streams2 on node 0.11
73+
// and dtrace in 0.10
74+
// and coverage in all
4075
, [
4176
/^( for \(var x in global\) \{|function leakedGlobals\(\) \{)$/m
4277
, ' /*<replacement>*/\n'
@@ -51,26 +86,89 @@ module.exports['common.js'] = [
5186
+ '\'core,__core-js_shared__,Promise,Map,Set,WeakMap,WeakSet,Reflect,System,asap,Observable,regeneratorRuntime,_babelPolyfill\'.split(\',\').filter(function (item) { return typeof global[item] !== undefined}).forEach(function (item) {knownGlobals.push(global[item])})'
5287
+ ' /*</replacement>*/\n\n$1'
5388
]
54-
]
5589

56-
module.exports['test-string-decoder.js'] = [
57-
// test removed because it is V8-version dependant.
58-
[
59-
/test\('utf-8', bufferShim\.from\('EDA0B5EDB08D'.*\n.*\n/
60-
, ''
61-
],
90+
// for node 0.8
6291
, [
63-
/test\('utf-8', bufferShim\.from\('F0B841', 'hex'.*\n/
64-
, ''
92+
/^/
93+
, '/*<replacement>*/'
94+
+ '\nif (!global.setImmediate) {\n'
95+
+ ' global.setImmediate = function setImmediate(fn) {\n'
96+
97+
+ ' return setTimeout(fn.bind.apply(fn, arguments), 4);\n'
98+
+ ' };\n'
99+
+ '}\n'
100+
+ 'if (!global.clearImmediate) {\n'
101+
+ ' global.clearImmediate = function clearImmediate(i) {\n'
102+
+ ' return clearTimeout(i);\n'
103+
+ ' };\n'
104+
+ '}\n'
105+
+ '/*</replacement>*/\n'
65106
]
66107
, [
67-
/test\('utf-8', bufferShim\.from\('CCE2B8B8', 'hex'.*\n/
68-
, ''
108+
/^if \(global\.ArrayBuffer\) \{([^\}]+)\}$/m
109+
, '/*<replacement>*/if (!process.browser) {'
110+
+ '\nif \(global\.ArrayBuffer\) {$1}\n'
111+
+ '}/*</replacement>*/\n'
69112
]
70-
, [
71-
/test\('utf-8', bufferShim\.from\('E2B8CCB8', 'hex'.*\n/
72-
, ''
113+
, [
114+
/^Object\.defineProperty\(([\w\W]+?)\}\)\;/mg
115+
, '/*<replacement>*/if (!process.browser) {'
116+
+ '\nObject\.defineProperty($1});\n'
117+
+ '}/*</replacement>*/\n'
118+
]
119+
, [
120+
/if \(!process\.send\)/
121+
, 'if (!process.send && !process.browser)'
73122
]
74-
, [
75-
/assert\.strictEqual\(decoder\.end(), '\ufffd'\);\n/
123+
, [
124+
/^/,
125+
`/*<replacement>*/
126+
require('babel-polyfill');
127+
var util = require('util');
128+
for (var i in util) exports[i] = util[i];
129+
/*</replacement>*/`
130+
],
131+
[
132+
/var regexp = `\^\(\\\\w\+\)\\\\s\+\\\\s\$\{port\}\/\$\{protocol\}\\\\s`;/,
133+
`var regexp = '^(\\w+)\\s+\\s' + port + '/' + protocol + '\\s';`
134+
],
135+
[
136+
/^var util = require\('util'\);/m
137+
, '\n/*<replacement>*/\nvar util = require(\'core-util-is\');\n'
138+
+ 'util.inherits = require(\'inherits\');\n/*</replacement>*/\n'
139+
],
140+
[
141+
/^const util = require\('util'\);/m
142+
, '\n/*<replacement>*/\nvar util = require(\'core-util-is\');\n'
143+
+ 'util.inherits = require(\'inherits\');\n/*</replacement>*/\n'
144+
]
145+
, [
146+
/process\.binding\('timer_wrap'\)\.Timer;/,
147+
'{now: function (){}}'
148+
],
149+
[
150+
/(exports\.enoughTestCpu[^;]+;)/,
151+
'/*$1*/'
152+
],
153+
[
154+
/exports\.buildType/,
155+
'//exports.buildType'
156+
],
157+
[
158+
/require\('async_hooks'\)/,
159+
'/*require(\'async_hooks\')'
160+
],
161+
[
162+
/\}\).enable\(\);/,
163+
'}).enable();*/'
164+
],
165+
[
166+
/(?:var|const) async_wrap = process\.binding\('async_wrap'\);\n.*(?:var|const) (?:{ )?kCheck(?: })? = async_wrap\.constants(?:\.kCheck)?;/gm,
167+
'// const async_wrap = process.binding(\'async_wrap\');\n' +
168+
' // const kCheck = async_wrap.constants.kCheck;'
169+
],
170+
[
171+
/async_wrap\.async_hook_fields\[kCheck\] \+= 1;/,
172+
'// async_wrap.async_hook_fields[kCheck] += 1;'
173+
]
76174
]

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
},
99
"devDependencies": {
1010
"babel-polyfill": "^6.23.0",
11+
"core-util-is": "^1.0.2",
12+
"inherits": "^2.0.3",
1113
"tap": "~0.4.8"
1214
},
1315
"scripts": {

test/common/README.md

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,20 @@
1-
require('babel-polyfill');# Node.js Core Test Common Modules
1+
/*<replacement>*/
2+
require('babel-polyfill');
3+
var util = require('util');
4+
for (var i in util) exports[i] = util[i];
5+
/*</replacement>*//*<replacement>*/
6+
if (!global.setImmediate) {
7+
global.setImmediate = function setImmediate(fn) {
8+
return setTimeout(fn.bind.apply(fn, arguments), 4);
9+
};
10+
}
11+
if (!global.clearImmediate) {
12+
global.clearImmediate = function clearImmediate(i) {
13+
return clearTimeout(i);
14+
};
15+
}
16+
/*</replacement>*/
17+
# Node.js Core Test Common Modules
218

319
This directory contains modules used to test the Node.js implementation.
420

@@ -517,3 +533,9 @@ implementation with tests from
517533
[`common.hijackStdErr()`]: #hijackstderrlistener
518534
[`common.hijackStdOut()`]: #hijackstdoutlistener
519535
[internationalization]: https://github.com/nodejs/node/wiki/Intl
536+
537+
function forEach (xs, f) {
538+
for (var i = 0, l = xs.length; i < l; i++) {
539+
f(xs[i], i);
540+
}
541+
}

test/common/benchmark.js

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,33 @@
1-
require('babel-polyfill'); /* eslint-disable required-modules */
1+
/*<replacement>*/
2+
require('babel-polyfill');
3+
var util = require('util');
4+
for (var i in util) {
5+
exports[i] = util[i];
6+
} /*</replacement>*/ /*<replacement>*/
7+
if (!global.setImmediate) {
8+
global.setImmediate = function setImmediate(fn) {
9+
return setTimeout(fn.bind.apply(fn, arguments), 4);
10+
};
11+
}
12+
if (!global.clearImmediate) {
13+
global.clearImmediate = function clearImmediate(i) {
14+
return clearTimeout(i);
15+
};
16+
}
17+
/*</replacement>*/
18+
/* eslint-disable required-modules */
219

320
'use strict';
421

22+
/*<replacement>*/
23+
var objectKeys = objectKeys || function (obj) {
24+
var keys = [];
25+
for (var key in obj) {
26+
keys.push(key);
27+
}return keys;
28+
};
29+
/*</replacement>*/
30+
531
var assert = require('assert');
632
var fork = require('child_process').fork;
733
var path = require('path');
@@ -11,9 +37,9 @@ var runjs = path.join(__dirname, '..', '..', 'benchmark', 'run.js');
1137
function runBenchmark(name, args, env) {
1238
var argv = [];
1339

14-
for (var i = 0; i < args.length; i++) {
40+
for (var _i = 0; _i < args.length; _i++) {
1541
argv.push('--set');
16-
argv.push(args[i]);
42+
argv.push(args[_i]);
1743
}
1844

1945
argv.push(name);
@@ -27,4 +53,10 @@ function runBenchmark(name, args, env) {
2753
});
2854
}
2955

30-
module.exports = runBenchmark;
56+
module.exports = runBenchmark;
57+
58+
function forEach(xs, f) {
59+
for (var i = 0, l = xs.length; i < l; i++) {
60+
f(xs[i], i);
61+
}
62+
}

test/common/countdown.js

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,35 @@ var _createClass = function () { function defineProperties(target, props) { for
22

33
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
44

5-
require('babel-polyfill'); /* eslint-disable required-modules */
5+
/*<replacement>*/
6+
require('babel-polyfill');
7+
var util = require('util');
8+
for (var i in util) {
9+
exports[i] = util[i];
10+
} /*</replacement>*/ /*<replacement>*/
11+
if (!global.setImmediate) {
12+
global.setImmediate = function setImmediate(fn) {
13+
return setTimeout(fn.bind.apply(fn, arguments), 4);
14+
};
15+
}
16+
if (!global.clearImmediate) {
17+
global.clearImmediate = function clearImmediate(i) {
18+
return clearTimeout(i);
19+
};
20+
}
21+
/*</replacement>*/
22+
/* eslint-disable required-modules */
623
'use strict';
724

25+
/*<replacement>*/
26+
var objectKeys = objectKeys || function (obj) {
27+
var keys = [];
28+
for (var key in obj) {
29+
keys.push(key);
30+
}return keys;
31+
};
32+
/*</replacement>*/
33+
834
var assert = require('assert');
935
var kLimit = Symbol('limit');
1036
var kCallback = Symbol('callback');
@@ -35,4 +61,10 @@ var Countdown = function () {
3561
return Countdown;
3662
}();
3763

38-
module.exports = Countdown;
64+
module.exports = Countdown;
65+
66+
function forEach(xs, f) {
67+
for (var i = 0, l = xs.length; i < l; i++) {
68+
f(xs[i], i);
69+
}
70+
}

0 commit comments

Comments
 (0)