Skip to content

Commit

Permalink
Support for React Native
Browse files Browse the repository at this point in the history
This PR fixes salesforce#222 by:
 - introducing a fallback for the `util.*` code paths used as indicated in [this comment](salesforce#222 (comment))
 - adding a dependency on `url-parse` to act as a polyfill for the usage of `require('url').parse`
  • Loading branch information
colincasey committed Nov 23, 2021
1 parent a6bd776 commit 626dfde
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 8 deletions.
13 changes: 7 additions & 6 deletions lib/cookie.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@
*/
"use strict";
const punycode = require("punycode");
const urlParse = require("url").parse;
const util = require("util");
const urlParse = require("url-parse");
const nodeUtil = require("./node-util");
const pubsuffix = require("./pubsuffix-psl");
const Store = require("./store").Store;
const MemoryCookieStore = require("./memstore").MemoryCookieStore;
Expand Down Expand Up @@ -810,6 +810,7 @@ const cookieDefaults = {

class Cookie {
constructor(options = {}) {
const util = nodeUtil();
if (util.inspect.custom) {
this[util.inspect.custom] = this.inspect;
}
Expand Down Expand Up @@ -1110,7 +1111,7 @@ class CookieJar {
}

setCookie(cookie, url, options, cb) {
validators.validate(validators.isNonEmptyString(url), cb, options);
validators.validate(validators.isNonEmptyString(url), cb, options);
let err;

if (validators.isFunction(url)) {
Expand Down Expand Up @@ -1646,7 +1647,7 @@ class CookieJar {
serialized = strOrObj;
}

const jar = new CookieJar(store, {
const jar = new CookieJar(store, {
rejectPublicSuffixes: serialized.rejectPublicSuffixes,
looseMode: serialized.enableLooseMode,
allowSpecialUseDomain: serialized.allowSpecialUseDomain,
Expand All @@ -1663,9 +1664,9 @@ class CookieJar {
static deserializeSync(strOrObj, store) {
const serialized =
typeof strOrObj === "string" ? JSON.parse(strOrObj) : strOrObj;
const jar = new CookieJar(store, {
const jar = new CookieJar(store, {
rejectPublicSuffixes: serialized.rejectPublicSuffixes,
looseMode: serialized.enableLooseMode
looseMode: serialized.enableLooseMode
});

// catch this mistake early:
Expand Down
4 changes: 3 additions & 1 deletion lib/memstore.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,21 @@ const { fromCallback } = require("universalify");
const Store = require("./store").Store;
const permuteDomain = require("./permuteDomain").permuteDomain;
const pathMatch = require("./pathMatch").pathMatch;
const util = require("util");
const nodeUtil = require("./node-util");

class MemoryCookieStore extends Store {
constructor() {
super();
this.synchronous = true;
this.idx = {};
const util = nodeUtil();
if (util.inspect.custom) {
this[util.inspect.custom] = this.inspect;
}
}

inspect() {
const util = nodeUtil();
return `{ idx: ${util.inspect(this.idx, false, 2)} }`;
}

Expand Down
20 changes: 20 additions & 0 deletions lib/node-util.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// a stand-in for util that does nothing but prevent the existing
// node:util code paths from exploding
function nullUtilInspect() {
return "";
}
nullUtilInspect.custom = Symbol.for("nodejs.util.inspect.custom");
const nullUtil = { inspect: nullUtilInspect };

module.exports = function nodeUtil() {
try {
const jscCompatibility =
process && process.env && process.env.JSC_COMPATIBILITY === "enabled";
if (!jscCompatibility) {
return require("util");
}
} catch (e) {
// ignore
}
return nullUtil;
};
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@
"dependencies": {
"psl": "^1.1.33",
"punycode": "^2.1.1",
"universalify": "^0.1.2"
"universalify": "^0.1.2",
"url-parse": "^1.5.3"
}
}
58 changes: 58 additions & 0 deletions test/jsc_compatibility_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*!
* Copyright (c) 2015, Salesforce.com, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of Salesforce.com nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

"use strict";
const vows = require("vows");
const assert = require("assert");
const tough = require("../lib/cookie");
const util = require("util");
const nodeUtil = require("../lib/node-util");
const Cookie = tough.Cookie;

vows
.describe("JavaScriptCore Compatibility")
.addBatch({
util: {
topic: function() {
process.env.JSC_COMPATIBILITY = "enabled";
return new Cookie();
},
"should not error out on util.* code paths": function(c) {
const nullUtil = nodeUtil();
assert.equal(nullUtil.inspect(c), "");
assert.equal(nullUtil.inspect.custom, util.inspect.custom);
},
teardown: function() {
delete process.env.JSC_COMPATIBILITY;
}
}
})
.export(module);

0 comments on commit 626dfde

Please sign in to comment.