Releases: cheeriojs/cheerio
v1.0.0
Cheerio 1.0 is here! 🎉
Announcement Blog Post
Breaking Changes
-
The minimum NodeJS version is now 18.17 or higher #3959
-
Import paths were simplified. For example, use
cheerio/slim
instead of
cheerio/lib/slim
. #3970 -
The deprecated default Cheerio instance and static methods were removed. #3974
Before, it was possible to write code like this:
import cheerio, { html } from 'cheerio'; html(cheerio('<test></test>')); // ~ '<test></test>' -- NO LONGER WORKS
Make sure to always load documents first:
import * as cheerio from 'cheerio'; cheerio.load('<test></test>').html();
-
Node types previously re-exported by Cheerio must now be imported directly
from (domhandler
)(https://github.com/fb55/domhandler). #3969 -
htmlparser2 options now reside exclusively under the
xml
key (#2916):const $ = cheerio.load('<html>', { xml: { withStartIndices: true, }, });
New Features
- Add functions to load buffers, streams & URLs in NodeJS by @fb55 in #2857
- Add extract method by @fb55 in #2750
Fixes
- Allow imports of
cheerio/utils
by @blixt in #2601 - Allow empty string in
data
, and simplify by @fb55 in #2818 - Make
closest
be able to start from text nodes by @Qualtagh in #2811 - Fix potential github action smells by @ceddy4395 in #3826
Other
- Cheerio has a new website, featuring updated API docs and guides! #2950
Full Changelog: v1.0.0-rc.12...v1.0.0
v1.0.0-rc.12
v1.0.0-rc.11
[email protected]
is hopefully the last RC before the 1.0.0 release of Cheerio. There are two APIs that will be added for the next major release: An exract
method (#2523) and NodeJS specific loader methods (#2051). These are still in flux and I'd appreciate feedback on the proposals.
A big thank you to everyone that contributed to this release! This includes code contributors, as well as the amazing financial support on GitHub Sponsors!
Under the hood, a lot of work for this release went into updating parse5, cheerio's default HTML parser. Have a look at parse5's release notes to see what has changed there.
Breaking
- Cheerio is now a dual CommonJS and ESM module. That means that deep imports will now fail in newer versions of Node. #2508
script
andstyle
contents are added again in.text()
#2509- To keep the old behavior, switch
.text()
to.prop('innerText')
- To keep the old behavior, switch
- The TypeScript types inherited from upstream dependencies have changed. #2503
- Node types are now using tagged unions, which will make consumption a bit easier.
Features
- Relevant options are now forwarded to
cheerio-select
#2511- Custom pseudo classes can now be specified using the
pseudos
option.
- Custom pseudo classes can now be specified using the
- For the
.prop()
method: - Added a
slim
export, which will always use htmlparser2 #1960
Fixes
- Have
text
turn passed values to strings #2047 - Include
undefined
in the return type ofget
by @glen-84 in #2392 - Recognise comments as HTML #2504
- Add missing
undefined
return value #2505 - Export missing static methods #2506
- Have style parsing add malformed fields to previous field #2521
Refactor
- Use
domutils
module directly #1928 - Hand-roll
isHTML
#1935 - Move initialization logic to
load
#1951 - Only return elements in
closest
#2057 - Remove unnecessary code, be more explicit #2279
- Use stricter TS, ESLint configs #2507
- Update exported values #2512
Development Experience
- Migrate husky to v6 by @DavideViolante in #1934
- Update CI by @XhmikosR in #2149
- Set permissions for GitHub actions by @neilnaveen in #2453
Docs
- Update README "is not a web browser" section by @mxschmitt in #2127
New Contributors
- @DavideViolante made their first contribution in #1934
- @mxschmitt made their first contribution in #2127
- @glen-84 made their first contribution in #2392
- @neilnaveen made their first contribution in #2453
Full Changelog: v1.0.0-rc.10...v1.0.0-rc.11
v1.0.0-rc.10
Fixes:
.html(node)
now moves passed nodes (#1923, fixes #940) 258b26b- Boolean attributes are no longer special in xmlMode (#1903, fixes #1805) b393e4a
- Rename parser adapter files (#1873, fixes #1847) 8f55dd8
- Make
filter
work on all collections (#1870, fixes #1867) fb8d31e - Bump cheerio-select (#1922, fixes https://www.npmjs.com/advisories/1754) 5cd2b9c
Documentation:
- Document how to define TS types for Plug-Ins (#1915, fixes #1778) 880fd2c
- Remove obsolete Testing section e0c7cbb
- Remove now-invalid
require
5dfbd35
Refactors:
v1.0.0-rc.9
Port to TypeScript
Cheerio has been ported entirely to TypeScript (in #1816)! This eliminates a lot of edge-cases within Cheerio and will allow you to use Cheerio with confidence. This release also features a new documentation website based on TypeDoc, allowing you to quickly navigate all available methods: https://cheerio.js.org
Breaking change: If you were using the function exported by Cheerio directly instead of first load()
ing a document, you will now have to update the require
to use the default
export.
- const cheerio = require("cheerio");
+ const cheerio = require("cheerio").default;
cheerio('div', dom)
Please note that this way of using Cheerio is deprecated and might be removed in a future version. Please consider updating your code to:
const cheerio = require("cheerio");
const $ = cheerio.load(dom)
$('div')
Note: Cheerio uses template literal types to determine return types. These are available starting with TypeScript 4.1, so you might have to bump your TypeScript version.
For TypeScript types, Cheerio now implements the ArrayLike<T>
interface. That means that Cheerio instances can contain objects of arbitrary types, but not all methods can be called on them.
The TypeScript compiler will figure out what structures you are operating on:
- When calling a loaded Cheerio instance with an HTML string like
$('<div>')
, it will product aCheerio<Node>
type.Node
is the base class for DOM elements and includes eg. comment and text nodes.
- When calling Cheerio with a selector like
$('.foo')
, it will produce aCheerio<Element>
, as onlyElement
s can be part of the result set.Element
is the class representing tags.
- You can still use
$('...').map()
to map to arbitrary values, and will get a compiler error when trying to call method that are not supported.- Eg.
$('.foo').map((i, el) => $(el).text()).attr('test')
will no longer be possible, as.attr
is not allowed to be called on aCheerio<string>
.
- Eg.
This release does not contain other changes to functionality. Feedback is greatly appreciated; if you encounter a problem, please file an issue!
v1.0.0-rc.8
Second botched release. Please use v1.0.0-rc.9
instead.
v1.0.0-rc.7
Published without a lib
directory — please ignore.
v1.0.0-rc.6
Breaking:
- Fixed the ordering of the output of several methods, including
prevAll
,prevUntil
andparentsUntil
. The new order matches jQuery.
This release contains three breaking changes inherited from dependencies.
- Selectors (see [email protected]):
- Several pseudo selectors are now stricter, in line with the HTML spec.
- Some attributes are now case-insensitive based on the HTML spec.
- DOM:
- In XML mode, all elements will have
type: 'tag'
.
- In XML mode, all elements will have
New features:
- Add
.unwrap
(#1651 by @5saviahv) 2037d83 - Add
.wrapAll
(#1590 by @5saviahv) cd4a4d9 - Support
prop('innerHTML')
(#1578 by @fb55) c58258f - Expose the
scriptingEnabled
parse5 option (#1707 by @5saviahv) 7eb4cc4- By setting
scriptingEnabled
tofalse
, it is now possible to parse the contents of<noscript>
tags.
- By setting
Types:
- Improve
.load
type (#1584 by @f0x52) 6a90bda - Improve type for
.get
(#1759 by @karlhorky) d706976 - Add
.wrapAll
(#1740 by @5saviahv) b360762 - Allow
for of
loops (#1704 by @mcpiroman) 8fef5aa - Rename exported variable (#1682 by @dominik-korsa) 897b37f
- Fix
AttrFunction
arguments (#1669 by @maxma241) 5f2e9c3
Bug fixes:
- Fix handling of
undefined
as value in.attr()
(#1757 by @5saviahv) 98186e8 - Fix filter for
{prev,next}Until
(#1728 by @fb55) f2615d2 - Fix parentsUntil filtering (#1708 by @5saviahv) bf899d5
- Remove module caching dependency (#1691 by @5saviahv) a9d6a43
- Filter text nodes in
find
function (#1680 by @5saviahv) 9b28b49 - Fix
.add
modifying previous selections (#1656 by @5saviahv) 9f9b493 - Stop parent() from throwing an error in some cases (#1637 by @5saviahv) 43592d6
- Make it possible to
.find
siblings (#1583 by @fb55) 1062a6c - Fix
replaceWith
replacing element with itself (#1581 by @fb55) 88ae636 - Fix
attr
handling ofundefined
as value (#1582 by @fb55) 3b35ae4 - Support passing a single element to
load
(#1580 by @fb55) 0855be6 - Update attribute value when setting prop in
.prop
(#1579 by @fb55) db3fce7 - Add length instance property to all Cheerio instances (#1681 by @5saviahv) b3010d7
- Enforce LF (#1602 by @XhmikosR) 0bbad23
- .html() send context to parse5 (#1627 by @5saviahv) bf04330
Documentation updates:
- Switch website to clean-jsdoc-theme (#1648 by @XhmikosR) a336301
- Switch to shields.io for badges (#1611 by @XhmikosR) 290aa9f
- Minor typo fixes (#1606 by @XhmikosR) f5d6ac3
- Fix a few redirects (#1603 by @XhmikosR) 2ae9b14
- Use https when possible. (#1597 by @XhmikosR) c6679ae
- Add JSDoc docs, standardize (#1593 by @fb55) 8273e4c
- Document
after
,before
,slice
arguments, improve handling (#1721 by @5saviahv) 732d539 - Make link explicit (#1616 by @XhmikosR) d7c3817
- Fix readme link (#1618 by @XhmikosR) bdd6018
- Fix parameter types (#1615 by @fb55) 15e39cf
- Enable Markdown IDs in JSDoc (#1610 by @XhmikosR) f3e1a4c
- Add bugs and homepage properties to
package.json
(#1609 by @XhmikosR) ad3e30b - Explicitly set type for wrap(Inner) (#1668 by @5saviahv) 5b8dd60
Refactors:
- Use [email protected] (#1594 by @fb55) e8f5e98
- Fixes a deprecation warning.
- Simplify
quickExpr
(#1716 by @fb55) 4aa3d39 - Enable strict mode for all files (#1650 by @fb55) 208bce1
- Simplify
wrapAll
, add some tests (#1640 by @5saviahv) b6d3840 - Remove unneeded escapes (#1635 by @XhmikosR) bfa114e
- Move parsers to their own files (#1589 by @fb55) 63e4616
- Declare vars when used, streamline code (#1588 by @fb55) 69ae308
- Enable several eslint rules (#1617 by @XhmikosR) 21de2c5
- Enable
eqeqeq
eslint rule except for null (#1638 by @XhmikosR) 52f37a1 - Enable
block-scoped-var
eslint rule (#1631 by @XhmikosR) b072df8 - Enable
no-unused-expressions
eslunt rule (#1630 by @XhmikosR) fc2c7d5 - Remove eslint
--ignore-path
(#1612 by @XhmikosR) 17f0d08 - Merge .gitattributes (#1646 by @XhmikosR) 2fb25aa
- Remove Makefile, .prettierignore (#1614 by @fb55) 36c4c77
- Add a "bench" alias script (#1629 by @XhmikosR) bb6cb38
- Add jest & node eslint plugins (#1642 by @fb55) 075cc5d
- Remove the now unused xyz devDependency (#1628 by @XhmikosR) b93931a
- Remove the now unused entities package (#1613 by @XhmikosR) 18c0038
- Remove the now unused scripts (#1647 by @XhmikosR) a3f6846
CI:
- Switch to GitHub Actions CI (#1600 by @XhmikosR) b9453ea
- Update CI config (#1673 by @XhmikosR) 8ace785
- Fix benchmark skip check (#1634 by @XhmikosR) 703ec16
- Use
actions-gh-pages
(#1626 by @fb55) 9ee60cc - Update GitHub Actions too (#1605 by @XhmikosR) 05a4757
- Add
versioning-strategy: increase
for dependabot, format 71d2aaf
Test changes:
- Nesting level of some deeply nested tests decreased (#1734 by @5saviahv) 9743030
- Add tests for mixed elements and text (#1747 by @5saviahv) ca7cd9b
- test(cheerio): Fix typos in test names (#1748 by @atimidguy) fafae51
- Add test for #1092 (#1733 by @5saviahv) 1a86118
- test(tsc): Add expectType test (#1726 by @5saviahv) 6f35a39
.map
test was actually calling.each
(#1711 by @Pustur) 456fbe5- Prefer using
.toBeUndefined()
(#1659 by @XhmikosR) 5aa4272 - Prefer Jest's toBe true/false matcher. (#1639 by @XhmikosR) 4859684
- Add some tests (#1653 by @5saviahv) 1ebe05a
- Migrate to Jest (#1596 by @fb55) d60bac9
- Add CodeCQL Action (#1601 by @XhmikosR) 990e963
Commit Range:
v1.0.0-rc.5...v1.0.0-rc.6
v1.0.0-rc.5
Hotfix release
- fix(package): Use
cheerio-select-tmp
until naming issue is resolved 3751929
v1.0.0-rc.4
Welcome to [email protected]
! This is the last pre-release before a full 1.0.0
release — please make sure to test this release and report any issues you might find.
This release was made possible by our supporters on Open Collective. If you want to support this project going forward, have a look at sponsorship options!
Breaking:
- After upgrading
parse5
, cheerio temporarily has a minimum Node version of Node 6. See #1585 for details. - Use the parser's DOM without modifications (#1559 by @fb55)
- Nodes no longer have a
root
reference. The root node is now referenced by theparent
property.
- Nodes no longer have a
- Use parse5 to serialize the DOM (04091a4 by @fb55)
- We will no longer encode non-ASCII characters by default. Please make sure that you pass on the appropriate content encoding.
New Features:
- Support for jQuery's positional selectors (:eq, :last, :odd, etc.) (#1565 by @fb55)
- Add Typescript typings (#1491 by @paulmelnikow)
- Introduces a new documentation website (#1571 by @fb55, based on work by @jugglinmike)
- Implement
for...of
iterator viaSymbol.iterator
(#1197 by @papandreou) - Add
wrapInner
(9ffc557 by @fb55, based on work by @tomjw64 and @warrengm) - Have
removeAttr
accept a list of attributes to remove (#1561 by @fb55) - Add
prop(‘outerHTML’)
implementation (#945 by @bill-bishop)
Bug Fixes:
- Prevent stale data on
.prev()
afterreplaceWith()
(#1254 by @Gei0r) - Fix
.xml
calls on HTML documents (#1572 by @fb55) - Correct rendering of root node (#1307 by @jugglinmike)
- Throw a useful error on invalid input to
cheerio.load()
(#1087 by @zeke) - Fix data attribute shadowing issue (#1139 by @tai2)
- Pass
locationInfo
option to parse5 (#1155 by @trevorhreed)
Other notable changes:
- Dropped Lodash as a dependency
- Formally test deprecated APIs (#1184 by @jugglinmike)