From 9c5e11c1352682069217358efc387ed0ad2cac80 Mon Sep 17 00:00:00 2001 From: zhanghua1831 Date: Thu, 20 Aug 2020 10:15:48 +0800 Subject: [PATCH] package init --- nodejs-source-map-support.spec | 51 +++ nodejs-source-map-support.yaml | 4 + source-map-support-0.4.18.tgz | Bin 0 -> 24475 bytes test.js | 603 +++++++++++++++++++++++++++++++++ 4 files changed, 658 insertions(+) create mode 100644 nodejs-source-map-support.spec create mode 100644 nodejs-source-map-support.yaml create mode 100644 source-map-support-0.4.18.tgz create mode 100644 test.js diff --git a/nodejs-source-map-support.spec b/nodejs-source-map-support.spec new file mode 100644 index 0000000..bba8b93 --- /dev/null +++ b/nodejs-source-map-support.spec @@ -0,0 +1,51 @@ +%{?nodejs_find_provides_and_requires} +%global packagename source-map-support +%global enable_tests 1 +Name: nodejs-source-map-support +Version: 0.4.18 +Release: 1 +Summary: Fixes stack traces for files with source maps +License: MIT +URL: https://github.com/evanw/node-source-map-support +Source0: https://registry.npmjs.org/source-map-support/-/source-map-support-%{version}.tgz +Source1: https://raw.githubusercontent.com/evanw/node-source-map-support/v%{version}/test.js +BuildArch: noarch +ExclusiveArch: %{nodejs_arches} noarch +BuildRequires: nodejs-packaging npm(source-map) +%if 0%{?enable_tests} +BuildRequires: mocha +%endif +%description +Fixes stack traces for files with source maps + +%prep +%autosetup -n package +cp -p %{SOURCE1} . +%nodejs_fixdep source-map + +%build + +%install +mkdir -p %{buildroot}%{nodejs_sitelib}/%{packagename} +cp -pr package.json *.js \ + %{buildroot}%{nodejs_sitelib}/%{packagename} +%nodejs_symlink_deps + +%check +%nodejs_symlink_deps --check +%{__nodejs} -e 'require("./")' +%if 0%{?enable_tests} +NODE_ENV=test %{_bindir}/mocha -R spec +%else +%{_bindir}/echo -e "\e[101m -=#=- Tests disabled -=#=- \e[0m" +%endif + +%files +%{!?_licensedir:%global license %doc} +%doc *.md +%license LICENSE.md +%{nodejs_sitelib}/%{packagename} + +%changelog +* Wed Aug 12 2020 zhanghua - 0.4.18-1 +- package init diff --git a/nodejs-source-map-support.yaml b/nodejs-source-map-support.yaml new file mode 100644 index 0000000..4d970cf --- /dev/null +++ b/nodejs-source-map-support.yaml @@ -0,0 +1,4 @@ +version_control: github +src_repo: evanw/node-source-map-support +tag_pattern: "^v" +seperator: "." diff --git a/source-map-support-0.4.18.tgz b/source-map-support-0.4.18.tgz new file mode 100644 index 0000000000000000000000000000000000000000..0a49eafb23cf5e4891fc32dd364cde86bf494fcf GIT binary patch literal 24475 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 literal 0 HcmV?d00001 diff --git a/test.js b/test.js new file mode 100644 index 0000000..80f0332 --- /dev/null +++ b/test.js @@ -0,0 +1,603 @@ +require('./source-map-support').install({ + emptyCacheBetweenOperations: true // Needed to be able to test for failure +}); + +var SourceMapGenerator = require('source-map').SourceMapGenerator; +var child_process = require('child_process'); +var assert = require('assert'); +var fs = require('fs'); + +function compareLines(actual, expected) { + assert(actual.length >= expected.length, 'got ' + actual.length + ' lines but expected at least ' + expected.length + ' lines'); + for (var i = 0; i < expected.length; i++) { + // Some tests are regular expressions because the output format changed slightly between node v0.9.2 and v0.9.3 + if (expected[i] instanceof RegExp) { + assert(expected[i].test(actual[i]), JSON.stringify(actual[i]) + ' does not match ' + expected[i]); + } else { + assert.equal(actual[i], expected[i]); + } + } +} + +function createEmptySourceMap() { + return new SourceMapGenerator({ + file: '.generated.js', + sourceRoot: '.' + }); +} + +function createSourceMapWithGap() { + var sourceMap = createEmptySourceMap(); + sourceMap.addMapping({ + generated: { line: 100, column: 0 }, + original: { line: 100, column: 0 }, + source: '.original.js' + }); + return sourceMap; +} + +function createSingleLineSourceMap() { + var sourceMap = createEmptySourceMap(); + sourceMap.addMapping({ + generated: { line: 1, column: 0 }, + original: { line: 1, column: 0 }, + source: '.original.js' + }); + return sourceMap; +} + +function createSecondLineSourceMap() { + var sourceMap = createEmptySourceMap(); + sourceMap.addMapping({ + generated: { line: 2, column: 0 }, + original: { line: 1, column: 0 }, + source: '.original.js' + }); + return sourceMap; +} + +function createMultiLineSourceMap() { + var sourceMap = createEmptySourceMap(); + for (var i = 1; i <= 100; i++) { + sourceMap.addMapping({ + generated: { line: i, column: 0 }, + original: { line: 1000 + i, column: 99 + i }, + source: 'line' + i + '.js' + }); + } + return sourceMap; +} + +function createMultiLineSourceMapWithSourcesContent() { + var sourceMap = createEmptySourceMap(); + var original = new Array(1001).join('\n'); + for (var i = 1; i <= 100; i++) { + sourceMap.addMapping({ + generated: { line: i, column: 0 }, + original: { line: 1000 + i, column: 4 }, + source: 'original.js' + }); + original += ' line ' + i + '\n'; + } + sourceMap.setSourceContent('original.js', original); + return sourceMap; +} + +function compareStackTrace(sourceMap, source, expected) { + // Check once with a separate source map + fs.writeFileSync('.generated.js.map', sourceMap); + fs.writeFileSync('.generated.js', 'exports.test = function() {' + + source.join('\n') + '};//@ sourceMappingURL=.generated.js.map'); + try { + delete require.cache[require.resolve('./.generated')]; + require('./.generated').test(); + } catch (e) { + compareLines(e.stack.split(/\r\n|\n/), expected); + } + fs.unlinkSync('.generated.js'); + fs.unlinkSync('.generated.js.map'); + + // Check again with an inline source map (in a data URL) + fs.writeFileSync('.generated.js', 'exports.test = function() {' + + source.join('\n') + '};//@ sourceMappingURL=data:application/json;base64,' + + new Buffer(sourceMap.toString()).toString('base64')); + try { + delete require.cache[require.resolve('./.generated')]; + require('./.generated').test(); + } catch (e) { + compareLines(e.stack.split(/\r\n|\n/), expected); + } + fs.unlinkSync('.generated.js'); +} + +function compareStdout(done, sourceMap, source, expected) { + fs.writeFileSync('.original.js', 'this is the original code'); + fs.writeFileSync('.generated.js.map', sourceMap); + fs.writeFileSync('.generated.js', source.join('\n') + + '//@ sourceMappingURL=.generated.js.map'); + child_process.exec('node ./.generated', function(error, stdout, stderr) { + try { + compareLines( + (stdout + stderr) + .trim() + .split(/\r\n|\n/) + .filter(function (line) { return line !== '' }), // Empty lines are not relevant. + expected + ); + } catch (e) { + return done(e); + } + fs.unlinkSync('.generated.js'); + fs.unlinkSync('.generated.js.map'); + fs.unlinkSync('.original.js'); + done(); + }); +} + +it('normal throw', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'throw new Error("test");' + ], [ + 'Error: test', + /^ at Object\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/ + ]); +}); + +/* The following test duplicates some of the code in + * `normal throw` but triggers file read failure. + */ +it('fs.readFileSync failure', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'var fs = require("fs");', + 'var rfs = fs.readFileSync;', + 'fs.readFileSync = function() {', + ' throw new Error("no rfs for you");', + '};', + 'try {', + ' throw new Error("test");', + '} finally {', + ' fs.readFileSync = rfs;', + '}' + ], [ + 'Error: test', + /^ at Object\.exports\.test \((?:.*[/\\])?line7\.js:1007:107\)$/ + ]); +}); + + +it('throw inside function', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'function foo() {', + ' throw new Error("test");', + '}', + 'foo();' + ], [ + 'Error: test', + /^ at foo \((?:.*[/\\])?line2\.js:1002:102\)$/, + /^ at Object\.exports\.test \((?:.*[/\\])?line4\.js:1004:104\)$/ + ]); +}); + +it('throw inside function inside function', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'function foo() {', + ' function bar() {', + ' throw new Error("test");', + ' }', + ' bar();', + '}', + 'foo();' + ], [ + 'Error: test', + /^ at bar \((?:.*[/\\])?line3\.js:1003:103\)$/, + /^ at foo \((?:.*[/\\])?line5\.js:1005:105\)$/, + /^ at Object\.exports\.test \((?:.*[/\\])?line7\.js:1007:107\)$/ + ]); +}); + +it('eval', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'eval("throw new Error(\'test\')");' + ], [ + 'Error: test', + + // Before Node 4, `Object.eval`, after just `eval`. + /^ at (?:Object\.)?eval \(eval at (|exports.test) \((?:.*[/\\])?line1\.js:1001:101\)/, + + /^ at Object\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/ + ]); +}); + +it('eval inside eval', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'eval("eval(\'throw new Error(\\"test\\")\')");' + ], [ + 'Error: test', + /^ at (?:Object\.)?eval \(eval at (|exports.test) \(eval at (|exports.test) \((?:.*[/\\])?line1\.js:1001:101\)/, + /^ at (?:Object\.)?eval \(eval at (|exports.test) \((?:.*[/\\])?line1\.js:1001:101\)/, + /^ at Object\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/ + ]); +}); + +it('eval inside function', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'function foo() {', + ' eval("throw new Error(\'test\')");', + '}', + 'foo();' + ], [ + 'Error: test', + /^ at eval \(eval at foo \((?:.*[/\\])?line2\.js:1002:102\)/, + /^ at foo \((?:.*[/\\])?line2\.js:1002:102\)/, + /^ at Object\.exports\.test \((?:.*[/\\])?line4\.js:1004:104\)$/ + ]); +}); + +it('eval with sourceURL', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'eval("throw new Error(\'test\')//@ sourceURL=sourceURL.js");' + ], [ + 'Error: test', + /^ at (?:Object\.)?eval \(sourceURL\.js:1:7\)$/, + /^ at Object\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/ + ]); +}); + +it('eval with sourceURL inside eval', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'eval("eval(\'throw new Error(\\"test\\")//@ sourceURL=sourceURL.js\')");' + ], [ + 'Error: test', + /^ at (?:Object\.)?eval \(sourceURL\.js:1:7\)$/, + /^ at (?:Object\.)?eval \(eval at (|exports.test) \((?:.*[/\\])?line1\.js:1001:101\)/, + /^ at Object\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/ + ]); +}); + +it('native function', function() { + compareStackTrace(createSingleLineSourceMap(), [ + '[1].map(function(x) { throw new Error(x); });' + ], [ + 'Error: 1', + /[/\\].original\.js/, + /at Array\.map \((native|)\)/ + ]); +}); + +it('function constructor', function() { + compareStackTrace(createMultiLineSourceMap(), [ + 'throw new Function(")");' + ], [ + 'SyntaxError: Unexpected token )', + ]); +}); + +it('throw with empty source map', function() { + compareStackTrace(createEmptySourceMap(), [ + 'throw new Error("test");' + ], [ + 'Error: test', + /^ at Object\.exports\.test \((?:.*[/\\])?.generated.js:1:34\)$/ + ]); +}); + +it('throw in Timeout with empty source map', function(done) { + compareStdout(done, createEmptySourceMap(), [ + 'require("./source-map-support").install();', + 'setTimeout(function () {', + ' throw new Error("this is the error")', + '})' + ], [ + /[/\\].generated.js:3$/, + ' throw new Error("this is the error")', + /^ \^$/, + 'Error: this is the error', + /^ at ((null)|(Timeout))\._onTimeout \((?:.*[/\\])?.generated.js:3:11\)$/ + ]); +}); + +it('throw with source map with gap', function() { + compareStackTrace(createSourceMapWithGap(), [ + 'throw new Error("test");' + ], [ + 'Error: test', + /^ at Object\.exports\.test \((?:.*[/\\])?.generated.js:1:34\)$/ + ]); +}); + +it('sourcesContent with data URL', function() { + compareStackTrace(createMultiLineSourceMapWithSourcesContent(), [ + 'throw new Error("test");' + ], [ + 'Error: test', + /^ at Object\.exports\.test \((?:.*[/\\])?original.js:1001:5\)$/ + ]); +}); + +it('finds the last sourceMappingURL', function() { + compareStackTrace(createMultiLineSourceMapWithSourcesContent(), [ + '//# sourceMappingURL=missing.map.js', // NB: compareStackTrace adds another source mapping. + 'throw new Error("test");' + ], [ + 'Error: test', + /^ at Object\.exports\.test \((?:.*[/\\])?original.js:1002:5\)$/ + ]); +}); + +it('default options', function(done) { + compareStdout(done, createSecondLineSourceMap(), [ + '', + 'function foo() { throw new Error("this is the error"); }', + 'require("./source-map-support").install();', + 'process.nextTick(foo);', + 'process.nextTick(function() { process.exit(1); });' + ], [ + /[/\\].original\.js:1$/, + 'this is the original code', + '^', + 'Error: this is the error', + /^ at foo \((?:.*[/\\])?.original\.js:1:1\)$/ + ]); +}); + +it('handleUncaughtExceptions is true', function(done) { + compareStdout(done, createSecondLineSourceMap(), [ + '', + 'function foo() { throw new Error("this is the error"); }', + 'require("./source-map-support").install({ handleUncaughtExceptions: true });', + 'process.nextTick(foo);' + ], [ + /[/\\].original\.js:1$/, + 'this is the original code', + '^', + 'Error: this is the error', + /^ at foo \((?:.*[/\\])?.original\.js:1:1\)$/ + ]); +}); + +it('handleUncaughtExceptions is false', function(done) { + compareStdout(done, createSecondLineSourceMap(), [ + '', + 'function foo() { throw new Error("this is the error"); }', + 'require("./source-map-support").install({ handleUncaughtExceptions: false });', + 'process.nextTick(foo);' + ], [ + /[/\\].generated.js:2$/, + 'function foo() { throw new Error("this is the error"); }', + + // Before Node 4, the arrow points on the `new`, after on the + // `throw`. + /^ (?: )?\^$/, + + 'Error: this is the error', + /^ at foo \((?:.*[/\\])?.original\.js:1:1\)$/ + ]); +}); + +it('default options with empty source map', function(done) { + compareStdout(done, createEmptySourceMap(), [ + '', + 'function foo() { throw new Error("this is the error"); }', + 'require("./source-map-support").install();', + 'process.nextTick(foo);' + ], [ + /[/\\].generated.js:2$/, + 'function foo() { throw new Error("this is the error"); }', + /^ (?: )?\^$/, + 'Error: this is the error', + /^ at foo \((?:.*[/\\])?.generated.js:2:24\)$/ + ]); +}); + +it('default options with source map with gap', function(done) { + compareStdout(done, createSourceMapWithGap(), [ + '', + 'function foo() { throw new Error("this is the error"); }', + 'require("./source-map-support").install();', + 'process.nextTick(foo);' + ], [ + /[/\\].generated.js:2$/, + 'function foo() { throw new Error("this is the error"); }', + /^ (?: )?\^$/, + 'Error: this is the error', + /^ at foo \((?:.*[/\\])?.generated.js:2:24\)$/ + ]); +}); + +it('specifically requested error source', function(done) { + compareStdout(done, createSecondLineSourceMap(), [ + '', + 'function foo() { throw new Error("this is the error"); }', + 'var sms = require("./source-map-support");', + 'sms.install({ handleUncaughtExceptions: false });', + 'process.on("uncaughtException", function (e) { console.log("SRC:" + sms.getErrorSource(e)); });', + 'process.nextTick(foo);' + ], [ + /^SRC:.*[/\\].original.js:1$/, + 'this is the original code', + '^' + ]); +}); + +it('sourcesContent', function(done) { + compareStdout(done, createMultiLineSourceMapWithSourcesContent(), [ + '', + 'function foo() { throw new Error("this is the error"); }', + 'require("./source-map-support").install();', + 'process.nextTick(foo);', + 'process.nextTick(function() { process.exit(1); });' + ], [ + /[/\\]original\.js:1002$/, + ' line 2', + ' ^', + 'Error: this is the error', + /^ at foo \((?:.*[/\\])?original\.js:1002:5\)$/ + ]); +}); + +it('missing source maps should also be cached', function(done) { + compareStdout(done, createSingleLineSourceMap(), [ + '', + 'var count = 0;', + 'function foo() {', + ' console.log(new Error("this is the error").stack.split("\\n").slice(0, 2).join("\\n"));', + '}', + 'require("./source-map-support").install({', + ' overrideRetrieveSourceMap: true,', + ' retrieveSourceMap: function(name) {', + ' if (/\\.generated.js$/.test(name)) count++;', + ' return null;', + ' }', + '});', + 'process.nextTick(foo);', + 'process.nextTick(foo);', + 'process.nextTick(function() { console.log(count); });', + ], [ + 'Error: this is the error', + /^ at foo \((?:.*[/\\])?.generated.js:4:15\)$/, + 'Error: this is the error', + /^ at foo \((?:.*[/\\])?.generated.js:4:15\)$/, + '1', // The retrieval should only be attempted once + ]); +}); + +it('should consult all retrieve source map providers', function(done) { + compareStdout(done, createSingleLineSourceMap(), [ + '', + 'var count = 0;', + 'function foo() {', + ' console.log(new Error("this is the error").stack.split("\\n").slice(0, 2).join("\\n"));', + '}', + 'require("./source-map-support").install({', + ' retrieveSourceMap: function(name) {', + ' if (/\\.generated.js$/.test(name)) count++;', + ' return undefined;', + ' }', + '});', + 'require("./source-map-support").install({', + ' retrieveSourceMap: function(name) {', + ' if (/\\.generated.js$/.test(name)) {', + ' count++;', + ' return ' + JSON.stringify({url: '.original.js', map: createMultiLineSourceMapWithSourcesContent().toJSON()}) + ';', + ' }', + ' }', + '});', + 'process.nextTick(foo);', + 'process.nextTick(foo);', + 'process.nextTick(function() { console.log(count); });', + ], [ + 'Error: this is the error', + /^ at foo \((?:.*[/\\])?original.js:1004:5\)$/, + 'Error: this is the error', + /^ at foo \((?:.*[/\\])?original.js:1004:5\)$/, + '1', // The retrieval should only be attempted once + ]); +}); + +it('should allow for runtime inline source maps', function(done) { + var sourceMap = createMultiLineSourceMapWithSourcesContent(); + + fs.writeFileSync('.generated.jss', 'foo'); + + compareStdout(function(err) { + fs.unlinkSync('.generated.jss'); + done(err); + }, createSingleLineSourceMap(), [ + 'require("./source-map-support").install({', + ' hookRequire: true', + '});', + 'require.extensions[".jss"] = function(module, filename) {', + ' module._compile(', + JSON.stringify([ + '', + 'var count = 0;', + 'function foo() {', + ' console.log(new Error("this is the error").stack.split("\\n").slice(0, 2).join("\\n"));', + '}', + 'process.nextTick(foo);', + 'process.nextTick(foo);', + 'process.nextTick(function() { console.log(count); });', + '//@ sourceMappingURL=data:application/json;charset=utf8;base64,' + new Buffer(sourceMap.toString()).toString('base64') + ].join('\n')), + ', filename);', + '};', + 'require("./.generated.jss");', + ], [ + 'Error: this is the error', + /^ at foo \(.*[/\\]original.js:1004:5\)$/, + 'Error: this is the error', + /^ at foo \(.*[/\\]original.js:1004:5\)$/, + '0', // The retrieval should only be attempted once + ]); +}); + +/* The following test duplicates some of the code in + * `compareStackTrace` but appends a charset to the + * source mapping url. + */ +it('finds source maps with charset specified', function() { + var sourceMap = createMultiLineSourceMap() + var source = [ 'throw new Error("test");' ]; + var expected = [ + 'Error: test', + /^ at Object\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/ + ]; + + fs.writeFileSync('.generated.js', 'exports.test = function() {' + + source.join('\n') + '};//@ sourceMappingURL=data:application/json;charset=utf8;base64,' + + new Buffer(sourceMap.toString()).toString('base64')); + try { + delete require.cache[require.resolve('./.generated')]; + require('./.generated').test(); + } catch (e) { + compareLines(e.stack.split(/\r\n|\n/), expected); + } + fs.unlinkSync('.generated.js'); +}); + +/* The following test duplicates some of the code in + * `compareStackTrace` but appends some code and a + * comment to the source mapping url. + */ +it('allows code/comments after sourceMappingURL', function() { + var sourceMap = createMultiLineSourceMap() + var source = [ 'throw new Error("test");' ]; + var expected = [ + 'Error: test', + /^ at Object\.exports\.test \((?:.*[/\\])?line1\.js:1001:101\)$/ + ]; + + fs.writeFileSync('.generated.js', 'exports.test = function() {' + + source.join('\n') + '};//# sourceMappingURL=data:application/json;base64,' + + new Buffer(sourceMap.toString()).toString('base64') + + '\n// Some comment below the sourceMappingURL\nvar foo = 0;'); + try { + delete require.cache[require.resolve('./.generated')]; + require('./.generated').test(); + } catch (e) { + compareLines(e.stack.split(/\r\n|\n/), expected); + } + fs.unlinkSync('.generated.js'); +}); + +it('handleUncaughtExceptions is true with existing listener', function(done) { + var source = [ + 'process.on("uncaughtException", function() { /* Silent */ });', + 'function foo() { throw new Error("this is the error"); }', + 'require("./source-map-support").install();', + 'process.nextTick(foo);', + '//@ sourceMappingURL=.generated.js.map' + ]; + + fs.writeFileSync('.original.js', 'this is the original code'); + fs.writeFileSync('.generated.js.map', createSingleLineSourceMap()); + fs.writeFileSync('.generated.js', source.join('\n')); + + child_process.exec('node ./.generated', function(error, stdout, stderr) { + fs.unlinkSync('.generated.js'); + fs.unlinkSync('.generated.js.map'); + fs.unlinkSync('.original.js'); + assert.equal((stdout + stderr).trim(), ''); + done(); + }); +});