-
Notifications
You must be signed in to change notification settings - Fork 285
Commit
Apologies for the huge diff, this can't be broken down to smaller changes that would still compile because of cross-package dependencies. I realize that this change is not exactly the optimal solution, but it is probably a step in the right direction. If I somehow found the time to submit pull requests to the libraries that I needed to fork and re-publish (see details below) and then get the changes onto the upstream and get them released as the official packages, then we could (in theory) arrive at a solution that is the recommended way of fixing these problems (apart from going full ESM-only) This work stands on the shoulders of the previous commits from @outSH and takes a slightly different direction compared to what we've been talking about earlier on account of the problem that the eval-import workaround causes crashes in Jest. Based on the above I went through the following adventures: 1. I migrated the build system of kubo-rpc-client myself so that it correctly exports CJS and ESM and typings for both of those as well, I put that code on my fork [1] and then published it onto npm as well [2] After this, I was hoping that now we could just import the package in our CJS code without issues, but what really happened is that instead of crashing at the require call that pull in kubo itself, it started crashing deeper in the require stack where kubo itself was requiring it's own ESM only dependencies (of which there seem to be at least 10 or 15). At this point I realized that me migrating and self-publishing all of these additional packages might not be worth the effort and started looking for something easier. 2. I gave dynamic imports + moduleResultion=Node16 as my next attempt to get our build back to working order. With this, the kubo-rpc-client can now be imported dynamically without issues in packages that declare themselves as resolving modules as "Node16" in their tsconfig.json Other issues here were encountered because not all of our ESM only packages are used in a way that they can be imported dynamically (for example if their types are part of our own types or are being re-exported). The two libraries with this problem were `run-time-error` and `socket.io-client` for both of which I ended up going through the same treatment as for kubo-rpc-client above (but this time my effort wasn't) in vain. They work and so I did some search and replace in the entire codebase to use these re-published packages with the correct types: [3] [4] [5] [6] 3. After this the project build was working, but Jest was still failing with compiler errors which I determined to happen because it uses the root tsconfig.json file for it's internal TS compilation and that root tsconfig.json file was not setting module resolution to Node16. 4. After fixing that the final hurdle (hopefully) was to ensure that jest gets execued with the custom node option as below: NODE_OPTIONS=--experimental-vm-modules yarn jest [1] https://github.com/petermetz/js-kubo-rpc-client-esm-cjs [2] https://www.npmjs.com/package/kubo-rpc-client-esm-cjs [3] https://github.com/petermetz/socket.io-client [4] https://www.npmjs.com/package/socket.io-client-fixed-types [5] https://github.com/petermetz/RuntimeError [6] https://www.npmjs.com/package/run-time-error-cjs Huge thanks for https://arethetypeswrong.github.io/ a tool I used extensively to create the fixes for the libraries above. One more thing that I tried just to collect more data points was to set the moduleResultion project-wide to Node16 via setting it in the root tsconfig.base.json but this broke the compiler itself, as in, there is a bug in the Typescript compiler in v4.x as seen here: microsoft/TypeScript#51221 So this is one more reason for us to upgrade to 5.x as soon as possible. Signed-off-by: Peter Somogyvari <[email protected]>
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,11 +3,15 @@ | |
* To fix this we define required types here, based on their counterparts in kubo-rpc-client. | ||
*/ | ||
|
||
// @ts-ignore | ||
Check failure on line 6 in extensions/cactus-plugin-object-store-ipfs/src/main/typescript/kubo-rpc-client-types.ts GitHub Actions / yarn_lint
|
||
import type { Multiaddr } from "@multiformats/multiaddr"; | ||
// @ts-ignore | ||
Check failure on line 8 in extensions/cactus-plugin-object-store-ipfs/src/main/typescript/kubo-rpc-client-types.ts GitHub Actions / yarn_lint
|
||
import type { MultihashHasher } from "multiformats/hashes/interface"; | ||
import type { Agent as HttpAgent } from "http"; | ||
import type { Agent as HttpsAgent } from "https"; | ||
// @ts-ignore | ||
Check failure on line 12 in extensions/cactus-plugin-object-store-ipfs/src/main/typescript/kubo-rpc-client-types.ts GitHub Actions / yarn_lint
|
||
import type { CID } from "multiformats/cid"; | ||
// @ts-ignore | ||
Check failure on line 14 in extensions/cactus-plugin-object-store-ipfs/src/main/typescript/kubo-rpc-client-types.ts GitHub Actions / yarn_lint
|
||
import type { Mtime } from "ipfs-unixfs"; | ||
|
||
///////////////////////////////////// | ||
|
@@ -16,10 +20,12 @@ import type { Mtime } from "ipfs-unixfs"; | |
// Some are simplified when details are not needed | ||
|
||
export type MultibaseCodec<Prefix extends string = any> = | ||
import("multiformats/bases/interface").MultibaseCodec<Prefix>; | ||
// @ts-ignore | ||
Check failure on line 23 in extensions/cactus-plugin-object-store-ipfs/src/main/typescript/kubo-rpc-client-types.ts GitHub Actions / yarn_lint
|
||
import("multiformats/bases/interface").MultibaseCodec<Prefix>; | ||
export type BlockCodec< | ||
T1 = any, | ||
T2 = any, | ||
T1 = any, | ||
T2 = any, | ||
// @ts-ignore | ||
Check failure on line 28 in extensions/cactus-plugin-object-store-ipfs/src/main/typescript/kubo-rpc-client-types.ts GitHub Actions / yarn_lint
|
||
> = import("multiformats/codecs/interface").BlockCodec<T1, T2>; | ||
|
||
export interface LoadBaseFn { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,7 @@ | ||
import path from "path"; | ||
import type { Express } from "express"; | ||
import { RuntimeError } from "run-time-error"; | ||
// @ts-ignore | ||
Check failure on line 3 in extensions/cactus-plugin-object-store-ipfs/src/main/typescript/plugin-object-store-ipfs.ts GitHub Actions / yarn_lint
|
||
import { RuntimeError } from "run-time-error-cjs"; | ||
import { | ||
Logger, | ||
Checks, | ||
|
@@ -18,7 +19,6 @@ import type { | |
SetObjectRequestV1, | ||
SetObjectResponseV1, | ||
} from "@hyperledger/cactus-core-api"; | ||
import { dynamicImportKuboRpcClientESMWorkaround } from "@hyperledger/cacti-esm-compat-hacks"; | ||
|
||
import OAS from "../json/openapi.json"; | ||
|
||
|
@@ -60,8 +60,8 @@ export class PluginObjectStoreIpfs implements IPluginObjectStore { | |
if (isLikeIpfsHttpClient(this.opts.ipfsClientOrOptions)) { | ||
this.ipfs = this.opts.ipfsClientOrOptions; | ||
} else if (this.opts.ipfsClientOrOptions) { | ||
const kuboRpcModule = await dynamicImportKuboRpcClientESMWorkaround(); | ||
this.ipfs = kuboRpcModule.create(this.opts.ipfsClientOrOptions); | ||
const { create } = await import("kubo-rpc-client"); | ||
this.ipfs = create(this.opts.ipfsClientOrOptions); | ||
} else { | ||
const errorMessage = `initIpfs Need either "ipfsClient" or "ipfsClientOptions" to construct ${this.className} Neither was provided.`; | ||
throw new RuntimeError(errorMessage); | ||
|
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
This file was deleted.
This file was deleted.