Skip to content

Commit

Permalink
fix(statics): Remove module caching dependency (#1691)
Browse files Browse the repository at this point in the history
Moves `.load()` function to its own file, then loads `load.js` file after the Cheerio class is created.

Fixes #1311
Fixes #1689
  • Loading branch information
5saviahv authored Jan 25, 2021
1 parent fcc0141 commit a9d6a43
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 62 deletions.
9 changes: 5 additions & 4 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
'use strict';
/**
* @module cheerio
* @borrows static.load as load
* @borrows load.load as load
* @borrows static.html as html
* @borrows static.text as text
* @borrows static.xml as xml
*/
var staticMethods = require('./lib/static');

exports = module.exports = require('./lib/cheerio');

var staticMethods = require('./lib/static');
var loadMethod = require('./lib/load');

/**
* An identifier describing the version of Cheerio which has been executed.
*
* @type {string}
*/
exports.version = require('./package.json').version;

exports.load = staticMethods.load;
exports.load = loadMethod.load;
exports.html = staticMethods.html;
exports.text = staticMethods.text;
exports.xml = staticMethods.xml;
Expand Down
65 changes: 65 additions & 0 deletions lib/load.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
'use strict';
/**
* @module cheerio/load
* @ignore
*/
var defaultOptions = require('./options').default;
var flattenOptions = require('./options').flatten;
var staticMethods = require('./static');
var Cheerio = require('./cheerio');
var parse = require('./parse');

/**
* Create a querying function, bound to a document created from the provided
* markup. Note that similar to web browser contexts, this operation may
* introduce `<html>`, `<head>`, and `<body>` elements; set `isDocument` to
* `false` to switch to fragment mode and disable this.
*
* See the README section titled "Loading" for additional usage information.
*
* @param {string} content - Markup to be loaded.
* @param {object} [options] - Options for the created instance.
* @param {boolean} [isDocument] - Allows parser to be switched to fragment mode.
* @returns {Cheerio} - The loaded document.
*/
exports.load = function (content, options, isDocument) {
if (content === null || content === undefined) {
throw new Error('cheerio.load() expects a string');
}

options = Object.assign({}, defaultOptions, flattenOptions(options));

if (typeof isDocument === 'undefined') isDocument = true;

var root = parse(content, options, isDocument);

function initialize(selector, context, r, opts) {
if (!(this instanceof initialize)) {
return new initialize(selector, context, r, opts);
}
opts = Object.assign({}, options, opts);
return Cheerio.call(this, selector, context, r || root, opts);
}

// Ensure that selections created by the "loaded" `initialize` function are
// true Cheerio instances.
initialize.prototype = Object.create(Cheerio.prototype);
initialize.prototype.constructor = initialize;

// Mimic jQuery's prototype alias for plugin authors.
initialize.fn = initialize.prototype;

// Keep a reference to the top-level scope so we can chain methods that implicitly
// resolve selectors; e.g. $("<span>").(".bar"), which otherwise loses ._root
initialize.prototype._originalRoot = root;

// Add in the static methods
Object.assign(initialize, staticMethods, exports);

// Add in the root
initialize._root = root;
// store options
initialize._options = options;

return initialize;
};
58 changes: 0 additions & 58 deletions lib/static.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,64 +8,6 @@ var flattenOptions = require('./options').flatten;
var select = require('cheerio-select').select;
var renderWithParse5 = require('./parsers/parse5').render;
var renderWithHtmlparser2 = require('./parsers/htmlparser2').render;
var parse = require('./parse');

/**
* Create a querying function, bound to a document created from the provided
* markup. Note that similar to web browser contexts, this operation may
* introduce `<html>`, `<head>`, and `<body>` elements; set `isDocument` to
* `false` to switch to fragment mode and disable this.
*
* See the README section titled "Loading" for additional usage information.
*
* @param {string} content - Markup to be loaded.
* @param {object} [options] - Options for the created instance.
* @param {boolean} [isDocument] - Allows parser to be switched to fragment mode.
* @returns {Cheerio} - The loaded document.
*/
exports.load = function (content, options, isDocument) {
if (content === null || content === undefined) {
throw new Error('cheerio.load() expects a string');
}

var Cheerio = require('./cheerio');

options = Object.assign({}, defaultOptions, flattenOptions(options));

if (typeof isDocument === 'undefined') isDocument = true;

var root = parse(content, options, isDocument);

function initialize(selector, context, r, opts) {
if (!(this instanceof initialize)) {
return new initialize(selector, context, r, opts);
}
opts = Object.assign({}, options, opts);
return Cheerio.call(this, selector, context, r || root, opts);
}

// Ensure that selections created by the "loaded" `initialize` function are
// true Cheerio instances.
initialize.prototype = Object.create(Cheerio.prototype);
initialize.prototype.constructor = initialize;

// Mimic jQuery's prototype alias for plugin authors.
initialize.fn = initialize.prototype;

// Keep a reference to the top-level scope so we can chain methods that implicitly
// resolve selectors; e.g. $("<span>").(".bar"), which otherwise loses ._root
initialize.prototype._originalRoot = root;

// Add in the static methods
Object.assign(initialize, exports);

// Add in the root
initialize._root = root;
// store options
initialize._options = options;

return initialize;
};

/**
* Helper function to render a DOM.
Expand Down

0 comments on commit a9d6a43

Please sign in to comment.