From ddec00dc9cd4d0029f629418e2d3983e081b2883 Mon Sep 17 00:00:00 2001 From: zaquest Date: Tue, 29 Dec 2020 22:30:02 +0700 Subject: [PATCH 1/2] Fix #3576 import redirects. Replace native-request with needle. --- package-lock.json | 2 +- packages/less/package-lock.json | 65 +++++++++++++++---- packages/less/package.json | 3 +- .../less/src/less-node/url-file-manager.js | 22 ++++--- packages/less/test/index.js | 22 ++++++- packages/less/test/less-test.js | 52 ++++++++++----- .../less/import-redirect/import-redirect.less | 3 + 7 files changed, 129 insertions(+), 40 deletions(-) create mode 100644 packages/test-data/less/import-redirect/import-redirect.less diff --git a/package-lock.json b/package-lock.json index 60641825d..f3978319f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@less/root", - "version": "3.12.2", + "version": "3.13.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/less/package-lock.json b/packages/less/package-lock.json index cfd7e22a4..c9708e5c2 100644 --- a/packages/less/package-lock.json +++ b/packages/less/package-lock.json @@ -2761,7 +2761,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -3593,6 +3592,12 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", + "dev": true + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -3921,8 +3926,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "mute-stream": { "version": "0.0.8", @@ -3949,18 +3953,34 @@ "to-regex": "^3.0.1" } }, - "native-request": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.5.tgz", - "integrity": "sha512-7wU3DvBGAJQxWuMR3F62zrhB7hxNj2DdlC/eBVrCgavc6+ZpFZOqS/PsR7QyUPLMkFk0GvvzoeeOAZGLLnObnA==", - "optional": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "needle": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", + "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==", + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "optional": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -3973,6 +3993,18 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "nock": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.0.5.tgz", + "integrity": "sha512-1ILZl0zfFm2G4TIeJFW0iHknxr2NyA+aGCMTjDVUsBY4CkMRispF1pfIYkTRdAR/3Bg+UzdEuK0B6HczMQZcCg==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "lodash.set": "^4.3.2", + "propagate": "^2.0.0" + } + }, "node-environment-flags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", @@ -4670,6 +4702,12 @@ "asap": "~2.0.3" } }, + "propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true + }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -5088,8 +5126,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sauce-tunnel": { "version": "2.5.0", @@ -5153,6 +5190,12 @@ "https-proxy-agent": "^2.2.1" } }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", diff --git a/packages/less/package.json b/packages/less/package.json index dffd6d776..7da0e5f52 100644 --- a/packages/less/package.json +++ b/packages/less/package.json @@ -50,7 +50,7 @@ "image-size": "~0.5.0", "make-dir": "^2.1.0", "mime": "^1.4.1", - "native-request": "^1.0.5", + "needle": "^2.5.2", "source-map": "~0.6.0" }, "devDependencies": { @@ -82,6 +82,7 @@ "mocha": "^6.2.1", "mocha-headless-chrome": "^2.0.3", "mocha-teamcity-reporter": "^3.0.0", + "nock": "^13.0.5", "npm-run-all": "^4.1.5", "performance-now": "^0.2.0", "phin": "^2.2.3", diff --git a/packages/less/src/less-node/url-file-manager.js b/packages/less/src/less-node/url-file-manager.js index 728bc7afa..fc3d9f322 100644 --- a/packages/less/src/less-node/url-file-manager.js +++ b/packages/less/src/less-node/url-file-manager.js @@ -13,7 +13,7 @@ UrlFileManager.prototype = Object.assign(new AbstractFileManager(), { loadFile(filename, currentDirectory, options, environment) { return new Promise((fulfill, reject) => { if (request === undefined) { - try { request = require('native-request'); } + try { request = require('needle'); } catch (e) { request = null; } } if (!request) { @@ -22,23 +22,27 @@ UrlFileManager.prototype = Object.assign(new AbstractFileManager(), { } let urlStr = isUrlRe.test( filename ) ? filename : url.resolve(currentDirectory, filename); - + /** native-request currently has a bug */ const hackUrlStr = urlStr.indexOf('?') === -1 ? urlStr + '?' : urlStr - request.get(hackUrlStr, (error, body, status) => { - if (status === 404) { - reject({ type: 'File', message: `resource '${urlStr}' was not found\n` }); + request.get(hackUrlStr, { follow_max: 5 }, (err, resp, body) => { + if (err || resp.statusCode >= 400) { + const message = resp.statusCode === 404 + ? `resource '${urlStr}' was not found\n` + : `resource '${urlStr}' gave this Error:\n ${err || resp.statusMessage || resp.statusCode}\n`; + reject({ type: 'File', message }); return; } - if (error) { - reject({ type: 'File', message: `resource '${urlStr}' gave this Error:\n ${error}\n` }); + if (resp.statusCode >= 300) { + reject({ type: 'File', message: `resource '${urlStr}' caused too many redirects` }); return; } + body = body.toString('utf8'); if (!body) { - logger.warn(`Warning: Empty body (HTTP ${status}) returned by "${urlStr}"`); + logger.warn(`Warning: Empty body (HTTP ${resp.statusCode}) returned by "${urlStr}"`); } - fulfill({ contents: body, filename: urlStr }); + fulfill({ contents: body || '', filename: urlStr }); }); }); } diff --git a/packages/less/test/index.js b/packages/less/test/index.js index 0924725f6..24f7e56cd 100644 --- a/packages/less/test/index.js +++ b/packages/less/test/index.js @@ -1,7 +1,8 @@ var lessTest = require('./less-test'), lessTester = lessTest(), path = require('path'), - stylize = require('../lib/less-node/lessc-helper').stylize; + stylize = require('../lib/less-node/lessc-helper').stylize, + nock = require('nock'); console.log('\n' + stylize('Less', 'underline') + '\n'); @@ -39,7 +40,7 @@ var testMap = [ // TODO: Change this to rewriteUrls: false once the relativeUrls option is removed [{math: 'strict', relativeUrls: false, rootpath: 'folder (1)/'}, 'static-urls/'], [{math: 'strict', compress: true}, 'compression/'], - + [{math: 0, strictUnits: true}, 'units/strict/'], [{math: 0, strictUnits: false}, 'units/no-strict/'], @@ -88,3 +89,20 @@ lessTester.testSyncronous({syncImport: true}, 'math/strict/css'); lessTester.testNoOptions(); lessTester.testJSImport(); lessTester.finished(); + +(() => { + // Create new tester, since tests are not independent and tests + // above modify tester in a way that breaks remote imports. + lessTester = lessTest(); + var scope = nock('https://example.com') + .get('/redirect.less').query(true) + .reply(301, null, { location: '/target.less' }) + .get('/target.less').query(true) + .reply(200); + lessTester.runTestSet( + {}, + 'import-redirect/', + lessTester.testImportRedirect(scope) + ); + lessTester.finished(); +})(); diff --git a/packages/less/test/less-test.js b/packages/less/test/less-test.js index b2c1360e4..c94e1c67b 100644 --- a/packages/less/test/less-test.js +++ b/packages/less/test/less-test.js @@ -1,5 +1,23 @@ /* jshint latedef: nofunc */ +var logger = require('../lib/less/logger').default; + +var isVerbose = process.env.npm_config_loglevel !== 'concise'; +logger.addListener({ + info(msg) { + if (isVerbose) { + process.stdout.write(msg + '\n'); + } + }, + warn(msg) { + process.stdout.write(msg + '\n'); + }, + erro(msg) { + process.stdout.write(msg + '\n'); + } +}); + + module.exports = function() { var path = require('path'), fs = require('fs'), @@ -14,8 +32,6 @@ module.exports = function() { var oneTestOnly = process.argv[2], isFinished = false; - var isVerbose = process.env.npm_config_loglevel !== 'concise'; - var testFolder = path.dirname(require.resolve('@less/test-data')); var lessFolder = path.join(testFolder, 'less'); @@ -27,20 +43,6 @@ module.exports = function() { } } - less.logger.addListener({ - info: function(msg) { - if (isVerbose) { - process.stdout.write(msg + '\n'); - } - }, - warn: function(msg) { - process.stdout.write(msg + '\n'); - }, - error: function(msg) { - process.stdout.write(msg + '\n'); - } - }); - var queueList = [], queueRunning = false; function queue(func) { @@ -519,6 +521,23 @@ module.exports = function() { ok(stylize('OK\n', 'green')); } + function testImportRedirect(nockScope) { + return (name, err, css, doReplacements, sourcemap, baseFolder) => { + process.stdout.write('- ' + path.join(baseFolder, name) + ': '); + if (err) { + fail('FAIL: ' + (err && err.message)); + return; + } + const expected = 'h1 {\n color: red;\n}\n'; + if (css !== expected) { + difference('FAIL', expected, css); + return; + } + nockScope.done(); + ok('OK'); + }; + } + return { runTestSet: runTestSet, runTestSetNormalOnly: runTestSetNormalOnly, @@ -527,6 +546,7 @@ module.exports = function() { testSourcemap: testSourcemap, testSourcemapWithoutUrlAnnotation: testSourcemapWithoutUrlAnnotation, testImports: testImports, + testImportRedirect: testImportRedirect, testEmptySourcemap: testEmptySourcemap, testNoOptions: testNoOptions, testJSImport: testJSImport, diff --git a/packages/test-data/less/import-redirect/import-redirect.less b/packages/test-data/less/import-redirect/import-redirect.less new file mode 100644 index 000000000..2472693cb --- /dev/null +++ b/packages/test-data/less/import-redirect/import-redirect.less @@ -0,0 +1,3 @@ +@import "https://example.com/redirect.less"; + +h1 { color: red; } From fc2c9ca59cf0ed21806349f8dc98d281dce3d2e4 Mon Sep 17 00:00:00 2001 From: zaquest Date: Wed, 30 Dec 2020 00:13:17 +0700 Subject: [PATCH 2/2] Downgrade nock to support node 8 --- packages/less/package-lock.json | 15 +++++---------- packages/less/package.json | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/less/package-lock.json b/packages/less/package-lock.json index c9708e5c2..b55e7b9cd 100644 --- a/packages/less/package-lock.json +++ b/packages/less/package-lock.json @@ -3592,12 +3592,6 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, - "lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", - "dev": true - }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -3994,14 +3988,15 @@ "dev": true }, "nock": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.0.5.tgz", - "integrity": "sha512-1ILZl0zfFm2G4TIeJFW0iHknxr2NyA+aGCMTjDVUsBY4CkMRispF1pfIYkTRdAR/3Bg+UzdEuK0B6HczMQZcCg==", + "version": "11.9.1", + "resolved": "https://registry.npmjs.org/nock/-/nock-11.9.1.tgz", + "integrity": "sha512-U5wPctaY4/ar2JJ5Jg4wJxlbBfayxgKbiAeGh+a1kk6Pwnc2ZEuKviLyDSG6t0uXl56q7AALIxoM6FJrBSsVXA==", "dev": true, "requires": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", - "lodash.set": "^4.3.2", + "lodash": "^4.17.13", + "mkdirp": "^0.5.0", "propagate": "^2.0.0" } }, diff --git a/packages/less/package.json b/packages/less/package.json index 7da0e5f52..3432aec8c 100644 --- a/packages/less/package.json +++ b/packages/less/package.json @@ -82,7 +82,7 @@ "mocha": "^6.2.1", "mocha-headless-chrome": "^2.0.3", "mocha-teamcity-reporter": "^3.0.0", - "nock": "^13.0.5", + "nock": "^11.8.2", "npm-run-all": "^4.1.5", "performance-now": "^0.2.0", "phin": "^2.2.3",