JavaScriptStencilTypeScript

Stencilを2.14.2から3.3.0にアップグレードした時の覚書

Stencil.jsのメジャーアップデートで、ライブラリの更新を忘れていたため、エラーが発生。具体的には、非推奨になった出力ターゲット`dist-custom-elements-bundle`を使用していたため、`dist-custom-elements`に変更する必要があった。また、TypeScriptのバージョンが合わなかったため、アップグレードも必要だった。依存関係のエラーを解決し、ビルドしていけば、問題なく動作した。

広告ここから
広告ここまで

v3へのメジャーアップデートがリリースされてから、更新するのを忘れていたライブラリがありました。

今回はアップグレードを実施した際に表示されたエラーやその対応を覚書として記録します。

実行したコマンド

アップグレード自体は、npm installで終わりです。

% npm i @stencil/core@latest

ただし今回はメジャーアップデートなので、すんなり行かない想定でいきましょう。

遭遇したエラーとその対応

遭遇したエラーと対応の記録をここに共有します。

dist-custom-elements-bundleは非推奨になったのでdist-custom-elementsに変更する

アップデートしたので、stencilコマンドを早速実行しました。

すると遭遇したのがこのエラーです。

$ stencil build --dev --watch --serve
[11:38.2]  @stencil/core
[11:38.6]  v3.3.0 🍭

[ ERROR ]  Invalid outputTarget type "dist-custom-elements-bundle". Valid outputTarget types include: "www", "dist",
           "dist-collection", "dist-custom-elements", "dist-lazy", "dist-hydrate-script", "docs-json", "docs-readme",
           "docs-vscode", "docs-custom", "copy", "custom", "stats"

ドキュメントをみると、stencil.config.tsに非推奨の設定がある様子でした。

dist-custom-elements-bundle 出力ターゲットは dist-custom-elements とほぼ同じですが、Stencil v2.12.0 で非推奨となり、ツリーシェイク機能が向上した dist-custom-elements が使用されるようになりました。

https://stenciljs.jp/docs/custom-elements/

stencil.config.tsを変更します。

import { Config } from '@stencil/core';
import { sass } from '@stencil/sass';
export const config: Config = {
  namespace: 'stripe-elements',
  outputTargets: [
    {
      type: 'dist',
      esmLoaderPath: '../loader',
    },
    {
      type: 'dist-custom-elements',
    },
    {
      type: 'docs-readme',
    },
    {
      type: 'www',
      serviceWorker: null, // disable service workers
    },
  ],
  plugins: [
    sass()
  ]
};

TypeScriptのAbortSignalでエラーがでる

続いてnpm startでアプリを開くと、このエラーが表示されました。

TypeScript
Subsequent variable declarations must have the same type. Variable 'AbortSignal' must be of type '{ new (): AbortSignal; prototype: AbortSignal; abort(reason?: any): AbortSignal; timeout(milliseconds: number): AbortSignal; }', but here has type '{ new (): AbortSignal; prototype: AbortSignal; }'.

エラーでググると、他のライブラリも古いことが起因している様子のIssueやブログがでてきました。

ということで、npm-upgradeでアップグレードします。

% npx npm-upgrade       
Checking for outdated production, optional, development, peer and bundled dependencies for "/Users/okamotohidetaka/development/package.json"...
[====================] 21/21 100%

New versions of active modules available:

  @stripe/stripe-js                   ^1.25.0   →   ^1.54.0 
  i18next                             ^20.3.3   →   ^22.5.0 
  i18next-browser-languagedetector     ^6.1.2   →    ^7.0.2 
  ionicons                             ^6.0.1   →    ^7.1.2 

ライブラリごとにアップデートするかの確認が入ります。

? Update "@stripe/stripe-js" in package.json from ^1.25.0 to ^1.54.0? (Use arrow keys)
❯ Yes 
  No 
  Show changelog 
  Ignore 
  Finish update process 

今回はアップグレード用のブランチを切ってあるので、思い切って全部更新してみました。

These packages will be updated:

  @stripe/stripe-js                   ^1.25.0   →   ^1.54.0 
  i18next                             ^20.3.3   →   ^22.5.0 
  i18next-browser-languagedetector     ^6.1.2   →    ^7.0.2 
  ionicons                             ^6.0.1   →    ^7.1.2 
  @stencil/sass                        ^1.5.2   →    ^3.0.3 
  @typescript-eslint/eslint-plugin    ^4.28.3   →   ^5.59.8 
  @typescript-eslint/parser           ^4.28.3   →   ^5.59.8 
  eslint                              ^7.31.0   →   ^8.41.0 
  eslint-plugin-react                 ^7.24.0   →   ^7.32.2 
  jest                                ^26.6.3   →   ^29.5.0 
  @types/jest                        ^26.0.24   →   ^29.5.1 
  jest-cli                            ^26.6.3   →   ^29.5.0 
  np                                   ^7.5.0   →    ^8.0.2 
  prettier                             ^2.3.2   →    ^2.8.8 
  prettier-eslint                     ^12.0.0   →   ^15.0.1 
  prettier-eslint-cli                  ^5.0.1   →    ^7.1.0 
  puppeteer                           ^13.5.1   →   ^20.4.0 
  @types/puppeteer                     ^5.4.3   →    ^5.4.7 
  typescript                           ^4.5.4   →    ^5.0.4 

? Update package.json? Yes

node_modules/の中身はまだ変わっていないので、インストールしなおします。

% npm i

npm installで依存関係エラーが発生する

npm installを実行した際、ESLintまわりでエラーが発生しました。

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! While resolving: stripe-pwa-elements@2.0.2
npm ERR! Found: @typescript-eslint/eslint-plugin@5.59.8
npm ERR! node_modules/@typescript-eslint/eslint-plugin
npm ERR!   dev @typescript-eslint/eslint-plugin@"^5.59.8" from the root project
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! peer @typescript-eslint/eslint-plugin@"<5 && ^4.0.0" from @stencil/eslint-plugin@0.4.0
npm ERR! node_modules/@stencil/eslint-plugin
npm ERR!   dev @stencil/eslint-plugin@"^0.4.0" from the root project
npm ERR! 
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR! 
npm ERR! See /Users/okamotohidetaka/.npm/eresolve-report.txt for a full report.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/okamotohidetaka/.npm/_logs/2023-06-01T08_46_09_147Z-debug.log

"@stencil/eslint-plugin"周りっぽい気配です。

最新版を調べようとしたところ、まさかのDeprecationメッセージに遭遇しました。

@stencil/eslint-plugin has been deprecated. Please see the community-driven package, ‘@stencil-community/eslint-plugin’

https://www.npmjs.com/package/@stencil/eslint-plugin

仕方ないので入れ替えましょう。

$ npm uninstall @stencil/eslint-plugin
$ npm install --save-dev @stencil-community/eslint-plugin

.eslintrc.jsonextendsも更新しましょう。

{
  "parserOptions": {
    "project": "./tsconfig.json"
  },
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:@stencil-community/recommended"
  ],

すると今度は「TypeScriptを4系に入れ替えろ」と言われました。

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! While resolving: stripe-pwa-elements@2.0.2
npm ERR! Found: typescript@5.0.4
npm ERR! node_modules/typescript
npm ERR!   dev typescript@"^5.0.4" from the root project
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! peer typescript@"^4.9.4" from @stencil-community/eslint-plugin@0.5.0
npm ERR! node_modules/@stencil-community/eslint-plugin
npm ERR!   dev @stencil-community/eslint-plugin@"^0.5.0" from the root project
npm ERR! 
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.

今回は言われた通りに4系を入れ直します。

$ npm i -D typescript@4.x.x

これでインストールが成功しました。

added 1020 packages, and audited 1021 packages in 15s

234 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

テストがエラーになる

テストコマンドにも、エラーが出ていました。

$ stencil test --spec
[28:35.6]  @stencil/core
[28:36.1]  v3.3.0 🍭

[ ERROR ]  Please install supported versions of dev dependencies with either npm or yarn.
           npm install --save-dev @types/jest@27.0.3 jest@27.0.3 jest-cli@27.4.5

error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

npm-upgradeでアップグレードしたJestのバージョンと、Stencil側が使っている(?)バージョンが一致しない様子です。

指示通りにライブラリを追加します。

npm install --save-dev @types/jest@27.0.3 jest@27.0.3 jest-cli@27.4.5

これでテストも復活しました。

$ stencil test --spec
[30:39.3]  @stencil/core
[30:39.9]  v3.3.0 🍭
[30:40.2]  testing spec files
[30:40.3]  jest args: --spec --max-workers=8
 PASS  src/components/stripe-payment-sheet-modal/test/stripe-payment-sheet-modal.spec.tsx
 PASS  src/components/stripe-payment-request-button/test/stripe-payment-request-button.spec.tsx
 PASS  src/components/stripe-element-modal/test/stripe-element-modal.spec.tsx
 PASS  src/components/stripe-payment-sheet/test/stripe-payment-sheet.spec.tsx

Test Suites: 4 passed, 4 of 8 total
Tests:       15 passed, 15 total
Snapshots:   3 passed, 3 total
Time:        2.814 s
Ran all test suites.

ビルドエラーに対処する

今度はビルドを試しましょう。

[ ERROR ]  Package Json: package.json:9:3
           package.json "types" property is set to "dist/custom-elements/index.d.ts" but cannot be found. It's
           recommended to set the "types" property to: ./dist/types/components.d.ts

      L8:  "es2017": "dist/esm/index.mjs",
      L9:  "types": "dist/custom-elements/index.d.ts",
     L10:  "collection": "dist/collection/collection-manifest.json",

[ WARN  ]  Package Json: package.json:6:3
           package.json "module" property is set to "dist/custom-elements/index.js". It's recommended to set the
           "module" property to: ./dist/index.js

      L5:  "main": "dist/index.cjs.js",
      L6:  "module": "dist/custom-elements/index.js",
      L7:  "es2015": "dist/esm/index.mjs",

[31:53.6]  build failed in 9.36 s

こちらもコケました。

package.jsonmoduletypesのパスを変えろ」と言われていますね。

指示通りに変更しましょう。

  "module": "dist/index.js",
  "es2015": "dist/esm/index.mjs",
  "es2017": "dist/esm/index.mjs",
  "types": "dist/types/components.d.ts",

ビルドしてみる

一通りエラーを解決した(はず)なので、ビルドします。

$ stencil build --docs
[35:25.4]  @stencil/core
[35:26.2]  v3.3.0 🍭
[35:29.6]  build, stripe-elements, prod mode, started ...
[35:29.8]  transpile started ...
[35:34.4]  transpile finished in 4.58 s
[35:34.4]  copy started ...
[35:34.6]  generate custom elements + source maps started ...
[35:34.6]  generate lazy + source maps started ...
[35:36.0]  copy finished (2676 files) in 1.60 s
[35:36.9]  generate custom elements + source maps finished in 2.25 s
[35:38.3]  generate lazy + source maps finished in 3.68 s
[35:38.4]  build finished in 8.87 s

✨  Done in 14.48s.

いけました。

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts