Skip to content

Commit 4ad95ce

Browse files
authored
Merge pull request #299 from danmactough/claude/node-20-11-1-emits-deprecation-warning-dep0170-1E55R
Fix deprecation warning from legacy node url module
2 parents 606f9a7 + fe3e200 commit 4ad95ce

4 files changed

Lines changed: 61 additions & 12 deletions

File tree

lib/utils.js

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var URL = require('url')
1+
var WHATWGURL = require('url').URL
22
, namespaces = require('./namespaces')
33
;
44

@@ -55,13 +55,18 @@ function safeTrim (val) {
5555
exports.safeTrim = safeTrim;
5656

5757
/*
58-
* Expose require('url').resolve, safely returning if either parameter
59-
* isn't provided
58+
* Resolve a URL against a base URL, returning the original pathUrl if
59+
* either parameter isn't provided or if the URL is not resolvable (e.g.
60+
* tag: URIs and other non-http schemes that the URL constructor rejects).
6061
* @private
6162
*/
6263
function resolve (baseUrl, pathUrl) {
6364
if (!baseUrl || !pathUrl) return pathUrl;
64-
return URL.resolve(baseUrl, pathUrl);
65+
try {
66+
return new WHATWGURL(pathUrl, baseUrl).href;
67+
} catch (e) {
68+
return pathUrl;
69+
}
6570
}
6671
exports.resolve = resolve;
6772

@@ -72,8 +77,11 @@ exports.resolve = resolve;
7277
*/
7378
function isAbsoluteUrl (uri) {
7479
if (!uri || typeof uri !== 'string') return false;
75-
var parts = URL.parse(uri);
76-
return Boolean(parts.host);
80+
try {
81+
return Boolean(new WHATWGURL(uri).host);
82+
} catch (e) {
83+
return false;
84+
}
7785
}
7886
exports.isAbsoluteUrl = isAbsoluteUrl;
7987

@@ -130,22 +138,22 @@ function reresolve (node, baseurl) {
130138
if (level[el].constructor.name === 'Object') {
131139
if (el == 'logo' || el == 'icon' || el == 'link') {
132140
if ('#' in level[el]) {
133-
level[el]['#'] = URL.resolve(baseurl, level[el]['#']);
141+
level[el]['#'] = resolve(baseurl, level[el]['#']);
134142
}
135143
} else if (el == 'image') {
136144
if ('url' in level[el] && level[el]['url'].constructor.name === 'Object' && '#' in level[el]['url']) {
137-
level[el]['url']['#'] = URL.resolve(baseurl, level[el]['url']['#']);
145+
level[el]['url']['#'] = resolve(baseurl, level[el]['url']['#']);
138146
}
139147
if ('link' in level[el] && level[el]['link'].constructor.name === 'Object' && '#' in level[el]['link']) {
140-
level[el]['link']['#'] = URL.resolve(baseurl, level[el]['link']['#']);
148+
level[el]['link']['#'] = resolve(baseurl, level[el]['link']['#']);
141149
}
142150
}
143151
if ('@' in level[el]) {
144152
var attrs = Object.keys(level[el]['@']);
145153
attrs.forEach(function (name) {
146154
if (name == 'href' || name == 'src' || name == 'uri') {
147155
if ('string' === typeof level[el]['@'][name]) {
148-
level[el]['@'][name] = URL.resolve(baseurl, level[el]['@'][name]);
156+
level[el]['@'][name] = resolve(baseurl, level[el]['@'][name]);
149157
}
150158
}
151159
});

package-lock.json

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0"?>
2+
<feed xmlns="http://www.w3.org/2005/Atom">
3+
<title>Test Feed</title>
4+
<link rel="self" href="http://example.com" />
5+
<entry>
6+
<title>Test Entry</title>
7+
<link href="tag:mefi.social,2024-01-26:objectId=20368395" />
8+
<id>tag:mefi.social,2024-01-26:objectId=20368395</id>
9+
</entry>
10+
</feed>

test/link.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,36 @@ describe('links', function(){
1515
});
1616
});
1717

18+
it('should not throw or emit a deprecation warning for tag: URI links (issue #295)', function (done) {
19+
var tagUriFeed = __dirname + '/feeds/atom-with-tag-uri-links.xml';
20+
var items = [];
21+
var sawDeprecation = false;
22+
var origEmit = process.emit;
23+
process.emit = function(event, warning) {
24+
if (event === 'warning' && warning && warning.name === 'DeprecationWarning') {
25+
sawDeprecation = true;
26+
}
27+
return origEmit.apply(process, arguments);
28+
};
29+
fs.createReadStream(tagUriFeed).pipe(new FeedParser())
30+
.on('readable', function () {
31+
var stream = this, item;
32+
while ((item = stream.read()) !== null) {
33+
items.push(item);
34+
}
35+
})
36+
.on('end', function () {
37+
process.emit = origEmit;
38+
assert.equal(items.length, 1);
39+
assert.equal(items[0].link, 'tag:mefi.social,2024-01-26:objectId=20368395');
40+
assert.equal(sawDeprecation, false, 'Should not emit a DEP0170 deprecation warning');
41+
done();
42+
})
43+
.on('error', function (err) {
44+
process.emit = origEmit;
45+
assert.ifError(err);
46+
done(err);
47+
});
48+
});
49+
1850
});

0 commit comments

Comments
 (0)