diff --git a/src/parse.js b/src/parse.js index f0fe2c1..5b3f6d0 100644 --- a/src/parse.js +++ b/src/parse.js @@ -128,6 +128,18 @@ export function unflatten(parsed, revivers) { break; } + case 'URL': { + const url = new URL(value[1]); + hydrated[index] = url; + break; + } + + case 'URLSearchParams': { + const url = new URLSearchParams(value[1]); + hydrated[index] = url; + break; + } + default: throw new Error(`Unknown type ${type}`); } diff --git a/src/stringify.js b/src/stringify.js index df291fd..e52b54b 100644 --- a/src/stringify.js +++ b/src/stringify.js @@ -90,6 +90,14 @@ export function stringify(value, reducers) { str = `["Date","${valid ? thing.toISOString() : ''}"]`; break; + case 'URL': + str = `["URL",${stringify_string(thing.toString())}]`; + break; + + case 'URLSearchParams': + str = `["URLSearchParams",${stringify_string(thing.toString())}]`; + break; + case 'RegExp': const { source, flags } = thing; str = flags diff --git a/src/uneval.js b/src/uneval.js index ce3ef34..1d9a772 100644 --- a/src/uneval.js +++ b/src/uneval.js @@ -59,6 +59,8 @@ export function uneval(value, replacer) { case 'Boolean': case 'Date': case 'RegExp': + case 'URL': + case 'URLSearchParams': return; case 'Array': @@ -167,6 +169,12 @@ export function uneval(value, replacer) { case 'Date': return `new Date(${thing.getTime()})`; + case 'URL': + return `new URL(${stringify_string(thing.toString())})`; + + case 'URLSearchParams': + return `new URLSearchParams(${stringify_string(thing.toString())})`; + case 'Array': const members = /** @type {any[]} */ (thing).map((v, i) => i in thing ? stringify(v) : '' diff --git a/test/test.js b/test/test.js index ebd4147..cc97fa4 100644 --- a/test/test.js +++ b/test/test.js @@ -171,6 +171,18 @@ const fixtures = { value: new Uint8Array([1, 2, 3]).buffer, js: 'new Uint8Array([1,2,3]).buffer', json: '[["ArrayBuffer","AQID"]]' + }, + { + name: 'URL', + value: new URL('https://user:password@example.com/