mirror of
https://github.com/pezkuwichain/pezkuwi-dev.git
synced 2026-10-21 19:26:18 +00:00
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.
69 lines
3.2 KiB
TypeScript
69 lines
3.2 KiB
TypeScript
// Copyright 2017-2026 @pezkuwi/dev-test authors & contributors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
import type { AnyFn, WithMock } from '../types.js';
|
|
|
|
import { mock } from 'node:test';
|
|
|
|
import { enhanceObj, stubObj, warnObj } from '../util.js';
|
|
|
|
// logged via Object.keys(jest).sort()
|
|
const JEST_KEYS_STUB = ['advanceTimersByTime', 'advanceTimersToNextTimer', 'autoMockOff', 'autoMockOn', 'clearAllMocks', 'clearAllTimers', 'createMockFromModule', 'deepUnmock', 'disableAutomock', 'doMock', 'dontMock', 'enableAutomock', 'fn', 'genMockFromModule', 'getRealSystemTime', 'getSeed', 'getTimerCount', 'isEnvironmentTornDown', 'isMockFunction', 'isolateModules', 'isolateModulesAsync', 'mock', 'mocked', 'now', 'replaceProperty', 'requireActual', 'requireMock', 'resetAllMocks', 'resetModules', 'restoreAllMocks', 'retryTimes', 'runAllImmediates', 'runAllTicks', 'runAllTimers', 'runOnlyPendingTimers', 'setMock', 'setSystemTime', 'setTimeout', 'spyOn', 'unmock', 'unstable_mockModule', 'useFakeTimers', 'useRealTimers'] as const;
|
|
|
|
const JEST_KEYS_WARN = ['setTimeout'] as const;
|
|
|
|
// logged via Object.keys(jest.fn()).sort()
|
|
const MOCK_KEYS_STUB = ['_isMockFunction', 'getMockImplementation', 'getMockName', 'mock', 'mockClear', 'mockImplementation', 'mockImplementationOnce', 'mockName', 'mockRejectedValue', 'mockRejectedValueOnce', 'mockReset', 'mockResolvedValue', 'mockResolvedValueOnce', 'mockRestore', 'mockReturnThis', 'mockReturnValue', 'mockReturnValueOnce', 'withImplementation'] as const;
|
|
|
|
const jestStub = stubObj('jest', JEST_KEYS_STUB);
|
|
const jestWarn = warnObj('jest', JEST_KEYS_WARN);
|
|
const mockStub = stubObj('jest.fn()', MOCK_KEYS_STUB);
|
|
|
|
/**
|
|
* @internal
|
|
*
|
|
* This adds the mockReset and mockRestore functionality to any
|
|
* spy or mock function
|
|
**/
|
|
function extendMock <F extends AnyFn> (mocked: WithMock<F>) {
|
|
// We use the node:test mock here for casting below - however we
|
|
// don't want this in any method signature since this is a private
|
|
// types export, which could get us in "some" trouble
|
|
//
|
|
// Effectively the casts below ensure that our WithMock<*> aligns
|
|
// on a high-level to what we use via private type...
|
|
const spy = mocked as unknown as ReturnType<typeof mock['fn']>;
|
|
|
|
return enhanceObj(enhanceObj(mocked, {
|
|
mockImplementation: <F extends AnyFn> (fn: F): void => {
|
|
spy.mock.mockImplementation(fn);
|
|
},
|
|
mockImplementationOnce: <F extends AnyFn> (fn: F): void => {
|
|
spy.mock.mockImplementationOnce(fn);
|
|
},
|
|
mockReset: (): void => {
|
|
spy.mock.resetCalls();
|
|
},
|
|
mockRestore: (): void => {
|
|
spy.mock.restore();
|
|
}
|
|
}), mockStub);
|
|
}
|
|
|
|
/**
|
|
* Sets up the jest object. This is certainly not extensive, and probably
|
|
* not quite meant to be (never say never). Rather this adds the functionality
|
|
* that we use in the pezkuwi-js projects.
|
|
**/
|
|
export function jest () {
|
|
return {
|
|
jest: enhanceObj(enhanceObj({
|
|
fn: <F extends AnyFn> (fn?: F) => extendMock<F>(mock.fn(fn) as unknown as WithMock<F>),
|
|
restoreAllMocks: () => {
|
|
mock.reset();
|
|
},
|
|
spyOn: <F extends AnyFn> (obj: object, key: string) => extendMock<F>(mock.method(obj, key as keyof typeof obj) as unknown as WithMock<F>)
|
|
}, jestWarn), jestStub)
|
|
};
|
|
}
|