The browser env exposed the HTML*Element constructors but not the
classes above them, so a library checking `instanceof Element` (as
react-tooltip does on every hover) threw "Element is not defined".
Node, Element, Document, DocumentFragment, Text, ShadowRoot and
SVGElement now come from JSDOM.
expect().toContain and .not.toContain were stubs. A string contains a
substring; any other iterable contains the item itself, not a
deep-equal copy, as in jest.
Globals were only set where Node had none, and Node defines Event and
CustomEvent itself. Code running in the browser env therefore built
Node events, which a JSDOM node refuses: react-tooltip's
window.dispatchEvent(new CustomEvent(...)) threw "parameter 1 is not of
type 'Event'". In the browser env these two now come from JSDOM, as they
do under jest-environment-jsdom.
Specs that replace a module need mock.module from node:test, which
Node only exposes behind this flag. The runner rejected unknown flags,
so there was no way to turn it on. It is now accepted and forwarded to
node like --import and --require.
The repo's own test run enables it, and a spec checks that a module
registered as a mock is what a later dynamic import receives.
.toEqual compared with assert.deepEqual and never looked at matchers, so
expect(x).toEqual(expect.arrayContaining(...)) or
.toEqual(expect.stringContaining(...)) always failed; matchers only
worked inside toHaveBeenCalledWith. arrayContaining was also typed to
take a string and checked value.includes(theWholeArray).
.toEqual (and .not.toEqual) now apply matchers wherever they appear in
the expected value, with the previous deepEqual unchanged when there
are none; arrayContaining asserts that every expected entry equals (or
matches) one of the array's entries. Seven new cases; with the old
.toEqual six of them fail.
Carries the run-lint type check over the referenced projects, the
`export *` fix moved into a suggestion, and whole-line removal of unused
disable directives. dev depends on ^0.86.4 of the other two.
A minor version for the eslint 10 / typescript-eslint 8 toolchain (#9):
repositories that move to it get new rules from the eslint, typescript-eslint
and react-hooks presets, so it should not arrive through a ^0.85 range. dev
depends on ^0.86.0 of the other two.
eslint 8 and typescript-eslint 6 are past their support, and the webpack
dev server chain carried the dependency alerts every repository using this
package inherited. Upstream @polkadot/dev still pins the same versions, so
this leaves it on purpose.
The rules are carried over with their options, so the lint means what it
meant:
- eslint-config-standard 17 (written for eslint 8) is replaced by its 161
rules in config/eslint.standard.js, with their options. Its 48 formatting
rules, deprecated in eslint core, are the same rules in @stylistic;
no-new-object and no-new-symbol are no-object-constructor and
no-new-native-nonconstructor; import/* is import-x/*.
- eslint-plugin-import (eslint <= 9) is eslint-plugin-import-x;
eslint-plugin-deprecation is @typescript-eslint/no-deprecated; the
formatting rules of core, typescript-eslint and eslint-plugin-react used
in eslint.rules.js are their @stylistic versions with the same options.
- typescript-eslint 8's preset swaps core no-unused-expressions for its own
with default options; standard's (short circuit, ternary and tagged
templates allowed) are carried over to it.
- eslint-plugin-react and eslint-plugin-header still call context methods
eslint 10 removed; @eslint/compat's fixupPluginRules supplies them. The
header rule also gets `schema: false`, as eslint 9+ rejects options for a
rule with no schema. The original header plugin stays rather than its
fork: it reports at the first token after leading comments, so a
generated file's /* eslint-disable */ still covers it, as it always has.
The effective config was compared rule by rule (--print-config) for .ts,
.tsx, .spec.ts and .mjs files before and after. Every rule that left has
its successor active; option differences are eslint 10 spelling out
defaults. New rules come from the eslint 10, typescript-eslint 8 and
react-hooks 7 presets. no-inner-declarations left eslint's preset upstream.
Also current: webpack-dev-server 6, webpack-cli 7, webpack-merge 6, rollup
plugins, madge 8, gh-release 8, globals 17, espree 11; Node >= 20.19 for
the dev package, which eslint 10 requires.
In this repository the new rules found: Function types now named by
no-unsafe-function-type; optional chains, includes() and RegExp#exec where
they say the same thing; createWrapper returns Describe, so its three casts
were redundant; rootCjs.spec casts through unknown, so the lint result does
not depend on whether build/ exists. lint, build and test (149 passed) pass,
and lint leaves the tree unchanged with and without a build.
npm holds dev-test and dev-ts at 0.85.7 while this tree said 0.85.4 (the
published files match main's sources; the versions were bumped only where
they were published). All three move to 0.85.12, as upstream releases them
in step, and dev depends on ^0.85.12 of the other two, so the CJS import()
fix reaches all of them.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
With the manifests broken, b65f265 and 4539abb worked around the symptoms:
rootJs imported itself by relative path instead of as @pezkuwi/dev, a
hand-written dynamic.d.mts stood in for the .mjs, and suite.spec.ts declared
its own describe/it/expect and imported a .d.ts at run time, which failed
the file. All three are reverted to upstream's form.
The import-attribute check now expects `with`: Node 22 removed `assert`.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Commit cb6801a replaced packages/{dev,dev-test,dev-ts}/package.json with the
build's rewritten copies: exports pointing at ./index.d.ts, ./cjs/* and
other files that exist only under build/, and main/module/types to match.
In the workspace that made @pezkuwi/dev-test/globals.d.ts unresolvable, so
tsc failed on every describe/it/expect (build and test red since January),
and packages/dev lost its devDependencies.
The four fields are back to the source form (identical to upstream's),
packages/dev's devDependencies are restored with React aligned to dev-test's
19, dev-test's @types/jsdom returns, and the generated globals.d.cts that was
committed beside the sources is removed. packageInfo follows the version.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Build script was adding ./cjs/ prefix even when main already had it
- Fixed @testing-library/react dependency for tests
- Changed package-style imports to relative imports in rootJs/index.ts
- Bump version to 0.85.5
- Add explicit Describe and It interfaces with todo support
- Fix mock type compatibility in jest.ts
- Update import assertions to import attributes (assert -> with)
- Add dynamic.d.mts declaration file
- Fix spec files to use explicit type declarations
- Updated all copyright headers from 2025 to 2026 (system date shows 2026)
- Added build output files to eslint ignore list in packages/dev/config/eslint.js
- Added build output patterns to .gitignore
- Ignored: packages/*/*.{d.ts,js,mjs,cjs}, packages/*/cjs/**, packages/*/env/**,
packages/*/rootJs/**, packages/*/rootStatic/**
- Successfully resolved 521 lint errors by properly ignoring generated files
- Build outputs should not be linted (source files are linted instead)
- Lint and build now pass successfully