From 0c6f50771f49be8baa0d84c54bab9819f4bdfa8f Mon Sep 17 00:00:00 2001 From: Nazar Hussain Date: Thu, 18 Sep 2025 17:36:48 +0200 Subject: [PATCH] chore: use latest TS module resolution (#8419) **Motivation** Use latest `module` and `moduleResolution` for TS. **Description** - To use [subpath imports](https://nodejs.org/api/packages.html#subpath-imports) in the PR #8320 we need to update the module solution strategy for TS. - That requires to change the `module` for the TS as well. - Earlier tried to stay with `node18` or `node20`, but the `ts-node` does not work with that. - Maintaining different tsconfig for ts-node is more of hassle on wrong run. - So decided to stick with `nodenext` strategy for `moduleResolution` **Steps to test or reproduce** Run all tests --------- Co-authored-by: Cayman --- package.json | 2 +- packages/api/test/utils/checkAgainstSpec.ts | 7 +- packages/beacon-node/package.json | 2 +- .../beacon-node/src/api/rest/swaggerUI.ts | 6 +- .../src/network/core/networkCore.ts | 2 +- .../network/core/networkCoreWorkerHandler.ts | 2 +- .../beacon-node/src/network/discv5/worker.ts | 8 +- .../e2e/doppelganger/doppelganger.test.ts | 3 +- .../test/e2e/sync/finalizedSync.test.ts | 5 +- .../test/e2e/sync/unknownBlockSync.test.ts | 5 +- .../test/mocks/fork-choice/reorg.ts | 11 ++- .../opPools/aggregatedAttestationPool.test.ts | 2 +- packages/cli/package.json | 2 +- packages/cli/src/cli.ts | 4 +- packages/cli/src/cmds/bootnode/handler.ts | 32 ++++++-- packages/cli/src/util/object.ts | 2 +- packages/flare/src/cli.ts | 4 +- packages/light-client/src/events.ts | 8 +- packages/light-client/src/transport/rest.ts | 3 +- .../light-client/test/utils/getGenesisData.ts | 2 +- packages/logger/package.json | 2 +- packages/prover/src/cli/cli.ts | 4 +- packages/state-transition/README.md | 2 +- .../test/perf/analyzeEpochs.ts | 2 +- .../state-transition/test/utils/infura.ts | 2 +- packages/types/package.json | 3 + packages/types/src/index.ts | 1 + packages/types/src/phase0/index.ts | 1 + packages/utils/src/types.ts | 30 ++++++-- tsconfig.build.json | 11 ++- types/mitt/index.d.ts | 11 +++ yarn.lock | 73 ++----------------- 32 files changed, 125 insertions(+), 129 deletions(-) create mode 100644 types/mitt/index.d.ts diff --git a/package.json b/package.json index 183d64d850..76e30c1fb1 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "supertest": "^6.3.3", "ts-node": "^10.9.2", "typescript": "^5.9.2", - "typescript-docs-verifier": "^2.5.3", + "typescript-docs-verifier": "^3.0.1", "vite": "^6.0.11", "vite-plugin-dts": "^4.5.0", "vite-plugin-node-polyfills": "^0.23.0", diff --git a/packages/api/test/utils/checkAgainstSpec.ts b/packages/api/test/utils/checkAgainstSpec.ts index ab4c0330be..b6dadf688f 100644 --- a/packages/api/test/utils/checkAgainstSpec.ts +++ b/packages/api/test/utils/checkAgainstSpec.ts @@ -1,10 +1,15 @@ -import Ajv, {ErrorObject} from "ajv"; +import ajvPkg, {ErrorObject} from "ajv"; import {beforeAll, describe, expect, it} from "vitest"; import {Endpoint, RequestWithBodyCodec, RouteDefinitions, isRequestWithoutBody} from "../../src/utils/types.js"; import {WireFormat} from "../../src/utils/wireFormat.js"; import {GenericServerTestCases} from "./genericServerTest.js"; import {JsonSchema, OpenApiJson, applyRecursively, parseOpenApiSpec} from "./parseOpenApiSpec.js"; +// Current Ajv package is a commonjs package which cause problem +// when we have moduleResolution set to node16 +// This syntax works and tested with Node and Bun both +const Ajv = ajvPkg.default; + const ajv = new Ajv({ strict: true, }); diff --git a/packages/beacon-node/package.json b/packages/beacon-node/package.json index d3d3adac00..7701a720aa 100644 --- a/packages/beacon-node/package.json +++ b/packages/beacon-node/package.json @@ -102,7 +102,7 @@ "@chainsafe/prometheus-gc-stats": "^1.0.0", "@chainsafe/pubkey-index-map": "^3.0.0", "@chainsafe/ssz": "^1.2.2", - "@chainsafe/threads": "^1.11.2", + "@chainsafe/threads": "^1.11.3", "@crate-crypto/node-eth-kzg": "0.8.0", "@ethersproject/abi": "^5.7.0", "@fastify/bearer-auth": "^10.0.1", diff --git a/packages/beacon-node/src/api/rest/swaggerUI.ts b/packages/beacon-node/src/api/rest/swaggerUI.ts index b4db3e43e6..d7471d0528 100644 --- a/packages/beacon-node/src/api/rest/swaggerUI.ts +++ b/packages/beacon-node/src/api/rest/swaggerUI.ts @@ -6,7 +6,8 @@ export async function registerSwaggerUIRoutes( opts: BeaconRestApiServerOpts, version = "" ): Promise { - await server.register(await import("@fastify/swagger"), { + const {fastifySwagger} = await import("@fastify/swagger"); + await server.register(fastifySwagger, { openapi: { info: { title: "Lodestar API", @@ -24,7 +25,8 @@ export async function registerSwaggerUIRoutes( tags: opts.api.map((namespace) => ({name: namespace})), }, }); - await server.register(await import("@fastify/swagger-ui"), { + const {fastifySwaggerUi} = await import("@fastify/swagger-ui"); + await server.register(fastifySwaggerUi, { theme: { title: "Lodestar API", favicon: await getFavicon(), diff --git a/packages/beacon-node/src/network/core/networkCore.ts b/packages/beacon-node/src/network/core/networkCore.ts index 9ba9e0a7b0..ffe1d48585 100644 --- a/packages/beacon-node/src/network/core/networkCore.ts +++ b/packages/beacon-node/src/network/core/networkCore.ts @@ -1,4 +1,4 @@ -import {PeerScoreStatsDump} from "@chainsafe/libp2p-gossipsub/dist/src/score/peer-score.js"; +import {PeerScoreStatsDump} from "@chainsafe/libp2p-gossipsub/score"; import {PublishOpts} from "@chainsafe/libp2p-gossipsub/types"; import {Connection, PrivateKey} from "@libp2p/interface"; import {peerIdFromPrivateKey} from "@libp2p/peer-id"; diff --git a/packages/beacon-node/src/network/core/networkCoreWorkerHandler.ts b/packages/beacon-node/src/network/core/networkCoreWorkerHandler.ts index 521b126b88..9c742e93b3 100644 --- a/packages/beacon-node/src/network/core/networkCoreWorkerHandler.ts +++ b/packages/beacon-node/src/network/core/networkCoreWorkerHandler.ts @@ -1,6 +1,6 @@ import path from "node:path"; import workerThreads from "node:worker_threads"; -import {PeerScoreStatsDump} from "@chainsafe/libp2p-gossipsub/dist/src/score/peer-score.js"; +import {PeerScoreStatsDump} from "@chainsafe/libp2p-gossipsub/score"; import {PublishOpts} from "@chainsafe/libp2p-gossipsub/types"; import {ModuleThread, Thread, Worker, spawn} from "@chainsafe/threads"; import {privateKeyToProtobuf} from "@libp2p/crypto/keys"; diff --git a/packages/beacon-node/src/network/discv5/worker.ts b/packages/beacon-node/src/network/discv5/worker.ts index bb0de57482..d901c84ffc 100644 --- a/packages/beacon-node/src/network/discv5/worker.ts +++ b/packages/beacon-node/src/network/discv5/worker.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import path from "node:path"; import worker from "node:worker_threads"; -import {Discv5} from "@chainsafe/discv5"; +import {Discv5, Discv5EventEmitter} from "@chainsafe/discv5"; import {ENR, ENRData, SignableENR, SignableENRData} from "@chainsafe/enr"; import {Observable, Subject} from "@chainsafe/threads/observable"; import {expose} from "@chainsafe/threads/worker"; @@ -59,7 +59,7 @@ const discv5 = Discv5.create({ }, config: workerData.config, metricsRegistry, -}); +}) as Discv5 & Discv5EventEmitter; // Load boot enrs for (const bootEnr of workerData.bootEnrs) { @@ -93,13 +93,13 @@ const module: Discv5WorkerApi = { discv5.enr.set(key, value); }, async kadValues(): Promise { - return discv5.kadValues().map((enr) => enr.toObject()); + return discv5.kadValues().map((enr: ENR) => enr.toObject()); }, async discoverKadValues(): Promise { discv5.kadValues().map(onDiscovered); }, async findRandomNode(): Promise { - return (await discv5.findRandomNode()).map((enr) => enr.toObject()); + return (await discv5.findRandomNode()).map((enr: ENR) => enr.toObject()); }, discovered() { return Observable.from(subject); diff --git a/packages/beacon-node/test/e2e/doppelganger/doppelganger.test.ts b/packages/beacon-node/test/e2e/doppelganger/doppelganger.test.ts index c83a289653..5e08200acf 100644 --- a/packages/beacon-node/test/e2e/doppelganger/doppelganger.test.ts +++ b/packages/beacon-node/test/e2e/doppelganger/doppelganger.test.ts @@ -4,7 +4,6 @@ import {ChainConfig} from "@lodestar/config"; import {SLOTS_PER_EPOCH} from "@lodestar/params"; import {BLSPubkey, Epoch, Slot, phase0, ssz} from "@lodestar/types"; import {Validator} from "@lodestar/validator"; -import {PubkeyHex} from "@lodestar/validator/src/types"; import {afterEach, describe, expect, it} from "vitest"; import {BeaconNode} from "../../../src/node/index.js"; import {ClockEvent} from "../../../src/util/clock.js"; @@ -14,6 +13,8 @@ import {connect} from "../../utils/network.js"; import {getDevBeaconNode} from "../../utils/node/beacon.js"; import {getAndInitDevValidators} from "../../utils/node/validator.js"; +type PubkeyHex = string; + // TODO: Reconsider this tests latter. // Doppelganger testing can be split in two items: // 1. Can a running beacon node detect liveness of the validator? diff --git a/packages/beacon-node/test/e2e/sync/finalizedSync.test.ts b/packages/beacon-node/test/e2e/sync/finalizedSync.test.ts index 8320c2cf2a..ed19ae2628 100644 --- a/packages/beacon-node/test/e2e/sync/finalizedSync.test.ts +++ b/packages/beacon-node/test/e2e/sync/finalizedSync.test.ts @@ -1,6 +1,5 @@ import {fromHexString} from "@chainsafe/ssz"; import {routes} from "@lodestar/api"; -import {EventData, EventType} from "@lodestar/api/lib/beacon/routes/events.js"; import {ChainConfig} from "@lodestar/config"; import {TimestampFormatCode} from "@lodestar/logger"; import {SLOTS_PER_EPOCH} from "@lodestar/params"; @@ -99,7 +98,7 @@ describe("sync / finalized sync for fulu", () => { 240000, (finalized) => finalized.epoch >= FULU_FORK_EPOCH ), - waitForEvent( + waitForEvent( bn.chain.emitter, routes.events.EventType.head, 100000, @@ -128,7 +127,7 @@ describe("sync / finalized sync for fulu", () => { const headSummary = bn.chain.forkChoice.getHead(); const head = await bn.db.block.get(fromHexString(headSummary.blockRoot)); if (!head) throw Error("First beacon node has no head block"); - const waitForSynced = waitForEvent( + const waitForSynced = waitForEvent( bn2.chain.emitter, routes.events.EventType.head, 100000, diff --git a/packages/beacon-node/test/e2e/sync/unknownBlockSync.test.ts b/packages/beacon-node/test/e2e/sync/unknownBlockSync.test.ts index bef79f0831..84f34fd640 100644 --- a/packages/beacon-node/test/e2e/sync/unknownBlockSync.test.ts +++ b/packages/beacon-node/test/e2e/sync/unknownBlockSync.test.ts @@ -1,6 +1,5 @@ import {fromHexString} from "@chainsafe/ssz"; import {routes} from "@lodestar/api"; -import {EventData, EventType} from "@lodestar/api/lib/beacon/routes/events.js"; import {ChainConfig} from "@lodestar/config"; import {TimestampFormatCode} from "@lodestar/logger"; import {SLOTS_PER_EPOCH} from "@lodestar/params"; @@ -107,7 +106,7 @@ describe("sync / unknown block sync for fulu", () => { afterEachCallbacks.push(() => bn.close().catch(() => {})); // wait until the 2nd slot of fulu - await waitForEvent( + await waitForEvent( bn.chain.emitter, routes.events.EventType.head, 240000, @@ -133,7 +132,7 @@ describe("sync / unknown block sync for fulu", () => { const headSummary = bn.chain.forkChoice.getHead(); const head = await bn.db.block.get(fromHexString(headSummary.blockRoot)); if (!head) throw Error("First beacon node has no head block"); - const waitForSynced = waitForEvent( + const waitForSynced = waitForEvent( bn2.chain.emitter, routes.events.EventType.head, 100000, diff --git a/packages/beacon-node/test/mocks/fork-choice/reorg.ts b/packages/beacon-node/test/mocks/fork-choice/reorg.ts index aaff79b47b..619e542ad2 100644 --- a/packages/beacon-node/test/mocks/fork-choice/reorg.ts +++ b/packages/beacon-node/test/mocks/fork-choice/reorg.ts @@ -1,6 +1,13 @@ import {ChainForkConfig} from "@lodestar/config"; -import {ForkChoice, ForkChoiceOpts, IForkChoiceStore, ProtoArray, ProtoBlock, ProtoNode} from "@lodestar/fork-choice"; -import {NotReorgedReason} from "@lodestar/fork-choice/lib/forkChoice/interface.js"; +import { + ForkChoice, + ForkChoiceOpts, + IForkChoiceStore, + ProtoArray, + ProtoBlock, + ProtoNode, + NotReorgedReason, +} from "@lodestar/fork-choice"; import {Slot} from "@lodestar/types"; /** diff --git a/packages/beacon-node/test/unit-minimal/chain/opPools/aggregatedAttestationPool.test.ts b/packages/beacon-node/test/unit-minimal/chain/opPools/aggregatedAttestationPool.test.ts index d1e7db8d30..fe59359cde 100644 --- a/packages/beacon-node/test/unit-minimal/chain/opPools/aggregatedAttestationPool.test.ts +++ b/packages/beacon-node/test/unit-minimal/chain/opPools/aggregatedAttestationPool.test.ts @@ -12,7 +12,7 @@ import { SLOTS_PER_EPOCH, } from "@lodestar/params"; import {CachedBeaconStateAllForks, CachedBeaconStateElectra, newFilledArray} from "@lodestar/state-transition"; -import {CachedBeaconStateAltair} from "@lodestar/state-transition/src/types.js"; +import {CachedBeaconStateAltair} from "@lodestar/state-transition"; import {Attestation, electra, phase0, ssz} from "@lodestar/types"; import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import { diff --git a/packages/cli/package.json b/packages/cli/package.json index 9a29f1d274..5ef5e8247f 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -58,7 +58,7 @@ "@chainsafe/enr": "^5.0.1", "@chainsafe/persistent-merkle-tree": "^1.2.1", "@chainsafe/ssz": "^1.2.2", - "@chainsafe/threads": "^1.11.2", + "@chainsafe/threads": "^1.11.3", "@libp2p/crypto": "^5.0.15", "@libp2p/interface": "^2.7.0", "@libp2p/peer-id": "^5.1.0", diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index d64661f6ec..75e62e62b5 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -1,6 +1,6 @@ import {registerCommandToYargs} from "@lodestar/utils"; // Must not use `* as yargs`, see https://github.com/yargs/yargs/issues/1131 -import yargs from "yargs"; +import yargs, {Argv} from "yargs"; import {hideBin} from "yargs/helpers"; import {cmds} from "./cmds/index.js"; import {globalOptions, rcConfigOption} from "./options/index.js"; @@ -22,7 +22,7 @@ export const yarg = yargs((hideBin as (args: string[]) => string[])(process.argv * Common factory for running the CLI and running integration tests * The CLI must actually be executed in a different script */ -export function getLodestarCli(): yargs.Argv { +export function getLodestarCli(): Argv { const lodestar = yarg .env("LODESTAR") .parserConfiguration({ diff --git a/packages/cli/src/cmds/bootnode/handler.ts b/packages/cli/src/cmds/bootnode/handler.ts index 7666d8528a..94ca422dfc 100644 --- a/packages/cli/src/cmds/bootnode/handler.ts +++ b/packages/cli/src/cmds/bootnode/handler.ts @@ -1,8 +1,13 @@ import path from "node:path"; -import {Discv5} from "@chainsafe/discv5"; -import {ENR} from "@chainsafe/enr"; -import {HttpMetricsServer, RegistryMetricCreator, getHttpMetricsServer} from "@lodestar/beacon-node"; -import {ErrorAborted} from "@lodestar/utils"; +import {Discv5, Discv5EventEmitter} from "@chainsafe/discv5"; +import {ENR, ENRData, SignableENR} from "@chainsafe/enr"; +import { + HttpMetricsServer, + IBeaconNodeOptions, + RegistryMetricCreator, + getHttpMetricsServer, +} from "@lodestar/beacon-node"; +import {ErrorAborted, Logger} from "@lodestar/utils"; import {Multiaddr, multiaddr} from "@multiformats/multiaddr"; import {getBeaconConfigFromArgs} from "../../config/index.js"; @@ -17,6 +22,7 @@ import {initPrivateKeyAndEnr} from "../beacon/initPeerIdAndEnr.js"; import {BeaconArgs} from "../beacon/options.js"; import {getBeaconPaths} from "../beacon/paths.js"; import {BootnodeArgs} from "./options.js"; +import {PrivateKey} from "@libp2p/interface"; /** * Runs a bootnode. @@ -60,7 +66,7 @@ export async function bootnodeHandler(args: BootnodeArgs & GlobalArgs): Promise< }, config: {enrUpdate: !enr.ip && !enr.ip6}, metricsRegistry, - }); + }) as Discv5 & Discv5EventEmitter; // If there are any bootnodes, add them to the routing table for (const bootEnrStr of Array.from(new Set(discv5Args.bootEnrs).values())) { @@ -82,7 +88,7 @@ export async function bootnodeHandler(args: BootnodeArgs & GlobalArgs): Promise< void discv5.findRandomNode(); } - discv5.on("multiaddrUpdated", (addr) => { + discv5.on("multiaddrUpdated", (addr: ENRData) => { logger.info("Advertised socket address updated", {addr: addr.toString()}); }); @@ -155,8 +161,20 @@ export async function bootnodeHandler(args: BootnodeArgs & GlobalArgs): Promise< } } +export type BootNodeInitOptions = { + discv5Args: Exclude; + metricsArgs: IBeaconNodeOptions["metrics"]; + bootnodeDir: string; + network: string; + version: string; + commit: string; + privateKey: PrivateKey; + enr: SignableENR; + logger: Logger; +}; + /** Separate function to simplify unit testing of options merging */ -export async function bootnodeHandlerInit(args: BootnodeArgs & GlobalArgs) { +export async function bootnodeHandlerInit(args: BootnodeArgs & GlobalArgs): Promise { const {config, network} = getBeaconConfigFromArgs(args); const {version, commit} = getVersionData(); const beaconPaths = getBeaconPaths(args, network); diff --git a/packages/cli/src/util/object.ts b/packages/cli/src/util/object.ts index db840ce13b..efd9bcfd49 100644 --- a/packages/cli/src/util/object.ts +++ b/packages/cli/src/util/object.ts @@ -11,5 +11,5 @@ export function removeUndefinedRecursive(obj: T) if (value && typeof value === "object") removeUndefinedRecursive(value); else if (value === undefined) delete obj[key]; } - return obj; + return obj as RecursivePartial; } diff --git a/packages/flare/src/cli.ts b/packages/flare/src/cli.ts index 9b29d22629..6d08484a91 100644 --- a/packages/flare/src/cli.ts +++ b/packages/flare/src/cli.ts @@ -1,6 +1,6 @@ import {registerCommandToYargs} from "@lodestar/utils"; // Must not use `* as yargs`, see https://github.com/yargs/yargs/issues/1131 -import yargs from "yargs"; +import yargs, {Argv} from "yargs"; import {hideBin} from "yargs/helpers"; import {cmds} from "./cmds/index.js"; @@ -21,7 +21,7 @@ export const yarg = yargs((hideBin as (args: string[]) => string[])(process.argv * Common factory for running the CLI and running integration tests * The CLI must actually be executed in a different script */ -export function getCli(): yargs.Argv { +export function getCli(): Argv { const lodestar = yarg .env("FLARE") .parserConfiguration({ diff --git a/packages/light-client/src/events.ts b/packages/light-client/src/events.ts index a1e2edb917..5ae16206e5 100644 --- a/packages/light-client/src/events.ts +++ b/packages/light-client/src/events.ts @@ -1,3 +1,4 @@ +import {Emitter as MittEmitter} from "mitt"; import {LightClientHeader} from "@lodestar/types"; import {RunStatusCode} from "./index.js"; @@ -14,10 +15,3 @@ export type LightclientEmitterEvents = { }; export type LightclientEmitter = MittEmitter; - -// biome-ignore lint/suspicious/noExplicitAny: We need to use `any` type here -export type MittEmitter void>> = { - on(type: K, handler: T[K]): void; - off(type: K, handler: T[K]): void; - emit(type: K, ...args: Parameters): void; -}; diff --git a/packages/light-client/src/transport/rest.ts b/packages/light-client/src/transport/rest.ts index aaffa090ad..f2a5bf257d 100644 --- a/packages/light-client/src/transport/rest.ts +++ b/packages/light-client/src/transport/rest.ts @@ -7,8 +7,7 @@ import { LightClientUpdate, type SyncPeriod, } from "@lodestar/types"; -import mitt from "mitt"; -import {MittEmitter} from "../events.js"; +import mitt, {Emitter as MittEmitter} from "mitt"; import {type LightClientTransport} from "./interface.js"; export type LightClientRestEvents = { diff --git a/packages/light-client/test/utils/getGenesisData.ts b/packages/light-client/test/utils/getGenesisData.ts index 289d68fd26..d11945a9f8 100644 --- a/packages/light-client/test/utils/getGenesisData.ts +++ b/packages/light-client/test/utils/getGenesisData.ts @@ -1,6 +1,6 @@ import {getClient} from "@lodestar/api"; import {config} from "@lodestar/config/default"; -import {NetworkName} from "@lodestar/config/networks.js"; +import {NetworkName} from "@lodestar/config/networks"; // To populate packages/light-client/src/networks.ts // diff --git a/packages/logger/package.json b/packages/logger/package.json index 2cb2aed7a3..5bd29840cc 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -69,7 +69,7 @@ "winston-transport": "^4.5.0" }, "devDependencies": { - "@chainsafe/threads": "^1.11.2", + "@chainsafe/threads": "^1.11.3", "@lodestar/test-utils": "^1.34.1", "@types/triple-beam": "^1.3.2", "triple-beam": "^1.3.0" diff --git a/packages/prover/src/cli/cli.ts b/packages/prover/src/cli/cli.ts index fcd26b2c7b..6611558126 100644 --- a/packages/prover/src/cli/cli.ts +++ b/packages/prover/src/cli/cli.ts @@ -1,6 +1,6 @@ import {registerCommandToYargs} from "@lodestar/utils"; // Must not use `* as yargs`, see https://github.com/yargs/yargs/issues/1131 -import yargs from "yargs"; +import yargs, {Argv} from "yargs"; import {hideBin} from "yargs/helpers"; import {getVersionData} from "../utils/version.js"; import {cmds, proverProxyStartCommand} from "./cmds/index.js"; @@ -22,7 +22,7 @@ export const yarg = yargs((hideBin as (args: string[]) => string[])(process.argv * Common factory for running the CLI and running integration tests * The CLI must actually be executed in a different script */ -export function getLodestarProverCli(): yargs.Argv { +export function getLodestarProverCli(): Argv { const prover = yarg .env("LODESTAR") .parserConfiguration({ diff --git a/packages/state-transition/README.md b/packages/state-transition/README.md index 7142dd707f..9a3bd90a12 100644 --- a/packages/state-transition/README.md +++ b/packages/state-transition/README.md @@ -15,7 +15,7 @@ The beacon state transition and state transition utilities ```typescript import {CachedBeaconStateAllForks, stateTransition} from "@lodestar/state-transition"; import {ssz} from "@lodestar/types"; -import {generateState} from "../test/utils/state"; +import {generateState} from "./test/utils/state.js"; // dummy test state const preState: CachedBeaconStateAllForks = generateState() as CachedBeaconStateAllForks; diff --git a/packages/state-transition/test/perf/analyzeEpochs.ts b/packages/state-transition/test/perf/analyzeEpochs.ts index 1141f488db..c25fa0bcb7 100644 --- a/packages/state-transition/test/perf/analyzeEpochs.ts +++ b/packages/state-transition/test/perf/analyzeEpochs.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import {getClient} from "@lodestar/api"; import {config} from "@lodestar/config/default"; -import {NetworkName} from "@lodestar/config/networks.js"; +import {NetworkName} from "@lodestar/config/networks"; import {phase0, ssz} from "@lodestar/types"; import { AttesterFlags, diff --git a/packages/state-transition/test/utils/infura.ts b/packages/state-transition/test/utils/infura.ts index 823488ccfb..ff9c569d10 100644 --- a/packages/state-transition/test/utils/infura.ts +++ b/packages/state-transition/test/utils/infura.ts @@ -1,4 +1,4 @@ -import {NetworkName} from "@lodestar/config/networks.js"; +import {NetworkName} from "@lodestar/config/networks"; export function getInfuraBeaconUrl(network: NetworkName): string { const INFURA_ETH2_CREDENTIALS = process.env.INFURA_ETH2_CREDENTIALS; diff --git a/packages/types/package.json b/packages/types/package.json index 1d989d18eb..8f0d9c0630 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -32,6 +32,9 @@ "./electra": { "import": "./lib/electra/index.js" }, + "./fulu": { + "import": "./lib/fulu/index.js" + }, "./phase0": { "import": "./lib/phase0/index.js" } diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index dc9139dc96..dd462a026a 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -10,3 +10,4 @@ export {StringType, stringType} from "./utils/stringType.js"; // Container utils export * from "./utils/container.js"; export * from "./utils/validatorStatus.js"; +export {ExecutionAddressType} from "./utils/executionAddress.js"; diff --git a/packages/types/src/phase0/index.ts b/packages/types/src/phase0/index.ts index 31c28a0d36..7824aa0b88 100644 --- a/packages/types/src/phase0/index.ts +++ b/packages/types/src/phase0/index.ts @@ -1,4 +1,5 @@ export * from "./types.js"; +export * from "./validator.js"; import * as ssz from "./sszTypes.js"; import * as ts from "./types.js"; export {ts, ssz}; diff --git a/packages/utils/src/types.ts b/packages/utils/src/types.ts index 62b04ca9a7..94c23a5e5e 100644 --- a/packages/utils/src/types.ts +++ b/packages/utils/src/types.ts @@ -1,14 +1,28 @@ /** * Recursively make all properties optional - * From https://stackoverflow.com/questions/45372227/how-to-implement-typescript-deep-partial-mapped-type-not-breaking-array-properti/49936686#49936686 */ -export type RecursivePartial = { - [P in keyof T]?: T[P] extends (infer U)[] - ? RecursivePartial[] - : T[P] extends Readonly[] - ? Readonly>[] - : RecursivePartial; -}; +type Primitive = string | number | boolean | bigint | symbol | null | undefined; +type Builtin = Primitive | Date | Error | RegExp; + +export type RecursivePartial = + // stop on built-ins (incl. Error) and functions + T extends Builtin + ? T + : // arrays and readonly arrays + T extends ReadonlyArray + ? ReadonlyArray> + : T extends Array + ? Array> + : // (optionally: Map/Set support) + T extends Map + ? Map, RecursivePartial> + : T extends Set + ? Set> + : // plain objects + T extends object + ? {[P in keyof T]?: RecursivePartial} + : // fallback (shouldn’t be hit often) + T; /** Type safe wrapper for Number constructor that takes 'any' */ export function bnToNum(bn: bigint): number { diff --git a/tsconfig.build.json b/tsconfig.build.json index 6902b628a2..991f986a5b 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -1,10 +1,10 @@ { "compilerOptions": { - "target": "es2021", - "lib": ["es2021", "dom"], + "target": "es2022", + "lib": ["es2022", "dom"], - "module": "esnext", - "moduleResolution": "node", + "module": "nodenext", + "moduleResolution": "nodenext", "pretty": true, "strict": true, @@ -19,6 +19,7 @@ "noImplicitThis": true, "noImplicitReturns": true, + "allowSyntheticDefaultImports": true, "esModuleInterop": true, "declaration": true, "declarationMap": true, @@ -28,8 +29,6 @@ // TODO: Investigate following errors: // - Cannot find module 'rollup/parseAst' or its corresponding type declarations "skipLibCheck": true, - - "types": ["node", "bun", "vitest"], // Required to run benchmark command from root directory "typeRoots": [ diff --git a/types/mitt/index.d.ts b/types/mitt/index.d.ts new file mode 100644 index 0000000000..be426641a0 --- /dev/null +++ b/types/mitt/index.d.ts @@ -0,0 +1,11 @@ +declare module "mitt" { + export type Emitter void>> = { + on(type: K, handler: T[K]): void; + off(type: K, handler: T[K]): void; + emit(type: K, ...args: Parameters): void; + }; + + export function mitt(): Emitter; + + export default mitt; +} diff --git a/yarn.lock b/yarn.lock index 2b769cfa51..891c343466 100644 --- a/yarn.lock +++ b/yarn.lock @@ -840,10 +840,10 @@ "@chainsafe/swap-or-not-shuffle-win32-arm64-msvc" "1.2.1" "@chainsafe/swap-or-not-shuffle-win32-x64-msvc" "1.2.1" -"@chainsafe/threads@^1.11.2": - version "1.11.2" - resolved "https://registry.yarnpkg.com/@chainsafe/threads/-/threads-1.11.2.tgz#fc400efdfec2d246e5054e3521a9066dc2dc45af" - integrity sha512-qd5mSYWyIgK+G4LQTLhJhO4IUda4eydYhZsT6AadALFUKs5WrHaFtAf7sLol6JjgWG7wwgznUs7FFyBl0xPmoQ== +"@chainsafe/threads@^1.11.3": + version "1.11.3" + resolved "https://registry.yarnpkg.com/@chainsafe/threads/-/threads-1.11.3.tgz#7dba606277bfb0e9c8a54325da0372494ec02042" + integrity sha512-wTIHTOOJ3MMRFtnJJT6KJCuauyv8pgs79m5ipspyPjHdKM9HJnkeZcoo06G3qArx2xMvd6MqNj1TLfnh5iFvaQ== dependencies: callsites "^3.1.0" debug "^4.2.0" @@ -3607,16 +3607,6 @@ resolved "https://registry.yarnpkg.com/@types/statuses/-/statuses-2.0.6.tgz#66748315cc9a96d63403baa8671b2c124f8633aa" integrity sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA== -"@types/strip-bom@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz" - integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= - -"@types/strip-json-comments@0.0.30": - version "0.0.30" - resolved "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz" - integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== - "@types/through@*": version "0.0.30" resolved "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz" @@ -6711,15 +6701,6 @@ fs-constants@^1.0.0: resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@^11.1.0, fs-extra@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" @@ -11895,11 +11876,6 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - strip-json-comments@~3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" @@ -12284,25 +12260,6 @@ triple-beam@^1.3.0: resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz" integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== -ts-node@^10.8.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - ts-node@^10.9.2: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" @@ -12339,16 +12296,6 @@ tsconfig-paths@^4.1.2: minimist "^1.2.6" strip-bom "^3.0.0" -tsconfig@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz" - integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== - dependencies: - "@types/strip-bom" "^3.0.0" - "@types/strip-json-comments" "0.0.30" - strip-bom "^3.0.0" - strip-json-comments "^2.0.0" - tslib@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" @@ -12499,17 +12446,13 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript-docs-verifier@^2.5.3: - version "2.5.3" - resolved "https://registry.yarnpkg.com/typescript-docs-verifier/-/typescript-docs-verifier-2.5.3.tgz#2fcb393cdae955a2c86bf272008cf6f7fb3d1fbf" - integrity sha512-fATV69QQZzIQWDGfUzo2USUcUTK0hPqTm7XZuyHf4QOkZUshnkwDk8TEk2IxaIlHxKjbM+5RtyDgxCtKYycjXA== +typescript-docs-verifier@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/typescript-docs-verifier/-/typescript-docs-verifier-3.0.1.tgz#63951110040a01661ff1732c0d52add445329f63" + integrity sha512-ohQsDJ49+tfOsRoJGREUgh6Vk79KVMsk+M3263b2CHqb1eQW8vkeDhBr9euz7nITBwgRk+RujUcxjIhD3kYPpA== dependencies: chalk "^4.1.2" - fs-extra "^10.0.0" ora "^5.4.1" - strip-ansi "^7.0.1" - ts-node "^10.8.1" - tsconfig "^7.0.0" yargs "^17.5.1" typescript@5.7.2: