Closed18

Node.js Dual Package の対応をしたつもりができてなかった

odanodan

原因は aws-kms-providerpackage.json"type": "module" を書いていなかったから

odanodan

https://github.com/odan-sandbox/unbuild-sandbox

試してみてるけど、unbuild より tsup のほうが良さそう

unbuild はドキュメンテーションが追いついていないみたいなので、config のオプションの意味を確認するにはソースコードを読みに行くしかなくてつらい
tsup はよしなにドキュメントがあるので嬉しい
https://tsup.egoist.sh/

多分同じようなツールだと思うので、tsup を使う、で良さそう

odanodan

方針

  • 既存パッケージは tsup で bundle して、esm/cjs の両方に対応する
  • 新規パッケージは import 時に .js を明記して Pure ESM として実装する
odanodan

早速、tsup で bundle して動作確認したところ、次のエラーが出た

file:///Users/odan/source/github.com/odan-sandbox/aws-kms-provider-syntax-error-sandbox/node_modules/aws-kms-signer/dist/index.mjs:6
  throw new Error('Dynamic require of "' + x + '" is not supported');
        ^

Error: Dynamic require of "keccak" is not supported
    at file:///Users/odan/source/github.com/odan-sandbox/aws-kms-provider-syntax-error-sandbox/node_modules/aws-kms-signer/dist/index.mjs:6:9
    at file:///Users/odan/source/github.com/odan-sandbox/aws-kms-provider-syntax-error-sandbox/node_modules/aws-kms-signer/dist/index.mjs:44:25
    at ModuleJob.run (node:internal/modules/esm/module_job:195:25)
    at async Promise.all (index 0)
    at async ESMLoader.import (node:internal/modules/esm/loader:337:24)
    at async loadESM (node:internal/process/esm_loader:88:5)
    at async handleMainPromise (node:internal/modules/run_main:61:12)
odanodan

次は aws-kms-provider の対応を行ったら次のエラーが出た

node:internal/process/esm_loader:94
    internalBinding('errors').triggerUncaughtException(
                              ^

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/Users/odan/source/github.com/odan-sandbox/aws-kms-provider-syntax-error-sandbox/node_modules/web3-provider-engine/subproviders/hooked-wallet' imported from /Users/odan/source/github.com/odan-sandbox/aws-kms-provider-syntax-error-sandbox/node_modules/aws-kms-provider/dist/index.mjs
Did you mean to import web3-provider-engine/subproviders/hooked-wallet.js?
    at new NodeError (node:internal/errors:371:5)
    at finalizeResolution (node:internal/modules/esm/resolve:394:11)
    at moduleResolve (node:internal/modules/esm/resolve:944:10)
    at defaultResolve (node:internal/modules/esm/resolve:1041:11)
    at ESMLoader.resolve (node:internal/modules/esm/loader:530:30)
    at ESMLoader.getModuleJob (node:internal/modules/esm/loader:251:18)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:79:40)
    at link (node:internal/modules/esm/module_job:78:36) {
  code: 'ERR_MODULE_NOT_FOUND'
}
odanodan

これはどうしようもなさそうなので、元々の ts のコードで .js をつけて import するように修正した

odanodan
file:///Users/odan/source/github.com/odan-sandbox/aws-kms-provider-syntax-error-sandbox/node_modules/aws-kms-provider/dist/index.js:8
import { KmsSigner } from "aws-kms-signer";
         ^^^^^^^^^
SyntaxError: Named export 'KmsSigner' not found. The requested module 'aws-kms-signer' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from 'aws-kms-signer';
const { KmsSigner } = pkg;

    at ModuleJob._instantiate (node:internal/modules/esm/module_job:127:21)
    at async ModuleJob.run (node:internal/modules/esm/module_job:191:5)
    at async Promise.all (index 0)
    at async ESMLoader.import (node:internal/modules/esm/loader:337:24)
    at async loadESM (node:internal/process/esm_loader:88:5)
    at async handleMainPromise (node:internal/modules/run_main:61:12)

Node.js v17.4.0
odanodan

これは aws-kms-ethers-signer が依存に持っている aws-kms-signer が npm にアップロードされているものだったためにエラーになっている

yarn resolutions でローカルの aws-kms-signer を向くようにしたら解決した

このスクラップは2022/02/14にクローズされました