Skip to content

maps-core 0.6.0 / maplibre-gl v6 への追従と v6.0.0-pre.4 - #519

Merged
smellman merged 2 commits into
masterfrom
dev/issue-518
Oct 5, 2026
Merged

smellman merged 2 commits into
masterfrom
dev/issue-518

Conversation

@smellman

@smellman smellman commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Closes #518
Refs #498

maps-core 0.6.0 の peerDependencies が maplibre-gl: ^6.0.0 になったことへの追従です。あわせて、npm ci が落ちて取り込めない dependabot の #498 相当のセキュリティ更新も手で入れ直しています。

1. 依存の更新

  • @geolonia/maps-core ^0.5.1 → ^0.6.0
  • maplibre-gl 5.19.0 → 6.11.2(従来どおり固定)

maplibre-gl は embed の直接依存であると同時に maps-core も参照するため、issue で警告されていた二重インストールが起きていないことを確認しています。

$ npm ls maplibre-gl
@geolonia/embed@6.0.0-pre.4
├─┬ @geolonia/maps-core@0.6.0
│ ├─┬ @geolonia/maplibre-gesture-handling@3.0.0
│ │ └── maplibre-gl@6.11.2 deduped
│ └── maplibre-gl@6.11.2 deduped
└── maplibre-gl@6.11.2

2. UMD 出力での worker 問題

issue が「最も踏みやすい罠」としていた箇所です。まず再現を取りました。バンプ直後のビルドは成功しますが、出力にはこれが埋まっていました。

let e="file:///Users/btm/develop/.../node_modules/maplibre-gl/dist/maplibre-gl.mjs";
if(!/^https?:/.test(e))return"";   // → worker URL が空文字

library.type: 'umd' では import.meta.url がビルド時にビルドマシンのファイルパスへ置換され、maplibre はそれを https?: でないと判断して worker URL を空文字へフォールバックします。例外もコンソールエラーも出ず、地図だけが出ません。

embed は「1 ファイルを置くだけで動く」ことが利点なので、worker を別ファイルとして配るのではなく maps-core と同じ方式を webpack へ移植しました。

  • webpack.config.js の bundleMaplibreWorkerSource() が esbuild で worker を maplibre-gl-shared.mjs ごと自己完結する 1 ファイルへ束ね、DefinePlugin で文字列として埋め込む
  • src/lib/maplibre-worker.ts が実行時に Blob URL 化して setWorkerUrl() へ渡す
  • embed.ts / embed-core.ts の両エントリから呼ぶ(どちらも独立した UMD バンドルなので両方必要)

この E2E が本当に壊れを検知するか確認しました

installMaplibreWorker() を一時的に no-op にして全スイートを回したところ 14 本が落ち、戻すと 20 本 green でした。無言で壊れる種類の不具合なので、検知力を実測しています。さらに worker が Blob URL として登録されていることを直接見る e2e/umd-worker.spec.ts を 1 本追加しました(#512 / maps-core#112 と同じ趣旨です)。

判断したこと

途中、import.meta.url を DefinePlugin で潰してビルドマシンの絶対パスの混入を消そうとしましたが、css-loader が生成する new URL(..., import.meta.url) を巻き込んで地図が完全に起動しなくなりました(Failed to construct 'URL': Invalid base URL)。撤回しています。同じ理由で、Critical dependency 警告を消す parser: { url: false } は maplibre の .mjs だけにスコープしました。

結果として、到達しないフォールバック経路にビルドマシンの絶対パスが残ります。実害はありませんが、消そうとすると上記の副作用があるため今回は触っていません。

3. その他 issue の項目

  • src/testability.test.ts のデフォルトインポートを名前空間インポートへ(v6 にデフォルトエクスポートは無い)
  • maps-core 0.6.0 の ESM-only 化は、webpack が exports.import を解決するため影響なし(確認済み)
  • README に CSP の注意(worker-src blob:)と、embed/core が import 時に worker 登録という副作用を持つことを追記

4. #498 相当のセキュリティ更新

dependabot の #498 は lock から @noble/hashes@2.2.0 が落ちており npm ci が EUSAGE で落ちるため、同等の更新を手で入れ直しました。

from to
jsdom ^20.0.3 ^29.1.1
webpack-dev-server ^4.11.1 ^5.2.6
webpack(推移) 5.102.1 5.111.1
vite / postcss / js-yaml / flatted / follow-redirects / shell-quote / fast-uri / protocol-buffers-schema #498 の目標値以上
@tootallnate/once 2.0.0 削除(jsdom 20 由来)

このブランチで追加した esbuild も ^0.27.7 → ^0.28.2 にしています。0.27.7 は GHSA 対象(esbuild の開発サーバーの任意ファイル読み取り、Windows のみ)で、0.28.2 は範囲外です。vite 配下と dedupe され 1 コピーのままです。

脆弱性は 36 件 → 3 件。残る 3 件は webpack-dev-server → sockjs → uuid で、最新の 5.2.6 でも上流に修正がありません。開発時のみの依存で配布物には含まれません。

webpack-dev-server v5 は破壊的メジャーですが、docs/webpack.config.js が使う static / open / port はそのまま有効で設定変更は不要でした。

lock の生成に npm 11 を使っています

npm 10.9.4 の arborist は vitest ^4.1.1 の peer 解決で必ず落ちます。

npm error Cannot read properties of null (reading 'edgesOut')
  at #loadPeerSet (@npmcli/arborist/lib/arborist/build-ideal-tree.js:1289:38)

{"devDependencies":{"vitest":"^4.1.1"}} だけの package.json でも再現する npm 側のバグで、npm 11 では解消しています。npm ci はこのバグの影響を受けないため CI は通りますが、ローカルで npm install / npm update する人は踏みます(このリポジトリは npm のバージョンを固定していないので、Node 22 同梱の npm 10 が使われます)。別途対応するか検討いただければと思います。

5. 影響

  • Breaking: バンドルする maplibre-gl が v6 系になります。window.geolonia 経由で maplibre の API を直接触っている場合は v6 の変更点の確認が必要です
  • CSP: worker が blob: から起動するため、CSP を設定しているページでは worker-src blob: が必要です
  • サイズ: dist/embed.js が gzip で約 297 KB → 455 KB(maps-core の 408 → 536 KB と同傾向)

6. 検証

すべて green です。

  • npm ci(CI と同じ npm 10.9.4)
  • tsc --noEmit
  • npm run lint
  • npm run test — 15 passed
  • npm run build — Critical dependency 警告なし。残るのはサイズ警告のみ
  • npx playwright test --workers=1 — 20 passed(CI と同じ直列実行)

E2E はローカルで fullyParallel だと cleanup.spec.ts などが散発的に落ちますが、**master でも同様(むしろ master の方が頻度が高い)**で、この変更とは無関係です。CI は workers: 1 + retries: 2 です。

Summary by CodeRabbit

  • 機能
    • UMD版で地図のworkerをBlob URLから読み込むようになりました。CSPを設定している場合は、worker-src blob: の許可が必要です。
    • /core の読み込み時に行われる処理と、ブラウザー外ではworkerの登録がスキップされることをREADMEに追記しました。
  • 更新
    • MapLibre GL JSを6.11.2、@geolonia/maps-coreを0.6.0に更新しました。
    • バージョンを6.0.0-pre.4に更新しました。

maps-core 0.6.0 の peerDependencies が maplibre-gl ^6.0.0 になったため、
embed がバンドルする maplibre-gl を 6.11.2 へ上げます。maplibre-gl は
embed の直接依存であり maps-core も参照するので、重複インストールが
起きていないことを npm ls maplibre-gl で確認済みです(1 コピー)。

maplibre-gl v6 は worker を import.meta.url 基準の実 URL として解決
しますが、embed の webpack 出力は library.type: 'umd' なので
import.meta.url はビルド時にビルドマシンの file:/// パスへ置換されます。
maplibre はこれを https? でないと判断して worker URL を空文字へ
フォールバックするため、例外もコンソールエラーも出ないまま地図だけが
表示されなくなります。

embed は「1 ファイルを置くだけで動く」ことが利点なので、worker を別
ファイルとして配るのではなく、esbuild で自己完結する 1 ファイルへ束ねて
DefinePlugin でバンドルへ文字列として埋め込み、実行時に Blob URL 化して
setWorkerUrl() へ渡します(maps-core の vite.umd.config.ts / src/umd.ts
と同じ方式)。このため worker は blob: から起動し、CSP のあるページでは
worker-src blob: が必要になります。dist/embed.js は gzip で約 297 KB →
456 KB になりました。

あわせて:

- maplibre の .mjs に限り parser.url を無効化。v6 は到達しない
  フォールバック経路で new URL(expr, import.meta.url) を使っており、
  webpack がこれを解決できない asset 参照として Critical dependency を
  警告し dist ディレクトリの context module を作るため。css-loader が
  生成する new URL() を巻き込まないよう .mjs に限定している。
- src/testability.test.ts のデフォルトインポートを名前空間インポートへ。
  maplibre-gl v6 にデフォルトエクスポートは無い。
- worker が実際に登録されていることを確かめる E2E を追加。この失敗は
  無言で起きるため、明示的に見張る必要がある。
- README に CSP の注意と、embed/core が import 時に worker 登録という
  副作用を持つことを追記。

maps-core 0.6.0 は ESM-only(main と exports.require を廃止)ですが、
webpack が exports.import を解決するため影響はありませんでした。

Refs #518
dependabot の #498 は lock から @noble/hashes@2.2.0 を落としており、
npm ci が EUSAGE (package.json と package-lock.json が out of sync) で
落ちるため取り込めない。同等の更新を手で入れ直す。

- jsdom ^20.0.3 -> ^29.1.1
- webpack-dev-server ^4.11.1 -> ^5.2.6
- 推移的依存として webpack 5.102.1 -> 5.111.1、vite / postcss /
  js-yaml / flatted / follow-redirects / shell-quote / fast-uri /
  protocol-buffers-schema が #498 の目標値以上へ。jsdom 20 由来の
  @tootallnate/once は消滅。

あわせて esbuild を ^0.27.7 から ^0.28.2 へ。0.27.7 は GHSA 対象
(esbuild の開発サーバーの任意ファイル読み取り、Windows のみ) で、
0.28.2 は影響範囲外。vite 配下と dedupe され 1 コピーのまま。

脆弱性は 36 件から 3 件へ。残りは webpack-dev-server -> sockjs ->
uuid で、最新の 5.2.6 でも上流に修正が無い。開発時のみの依存で
配布物には含まれない。

webpack-dev-server v5 は破壊的メジャーだが、docs/webpack.config.js が
使う static / open / port はそのまま有効で設定変更は不要だった。

lock の生成には npm 11 を使っている。npm 10.9.4 の arborist は
vitest ^4.1.1 の peer 解決で必ず落ちるため (edgesOut の TypeError。
vitest だけの最小 package.json でも再現する npm 側のバグ)、lock を
再生成できない。npm ci はこのバグの影響を受けないので、CI と同じ
npm 10.9.4 で npm ci が通ることは確認済み。

Refs #498
@coderabbitai

coderabbitai Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: geolonia/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Essentials

Run ID: 5e04bbb2-e043-48b6-82e2-084b16fd9cbf

📥 Commits

Reviewing files that changed from the base of the PR and between 8c9af8c and 968b75f.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (12)
  • CHANGELOG.md
  • README.md
  • docs/embed-core.js.LICENSE.txt
  • docs/embed.js.LICENSE.txt
  • e2e/umd-worker.spec.ts
  • package.json
  • src/embed-core.ts
  • src/embed.ts
  • src/lib/maplibre-worker.ts
  • src/testability.test.ts
  • src/version.ts
  • webpack.config.js

Included review availability: This review used your included allowance. 4 included reviews remain after this review. Your included PR review attempts over the past 7 days set your current allowance at 5 reviews per hour.


📝 Walkthrough

Walkthrough

MapLibre GL JSをv6.11.2に更新し、workerをUMDバンドルに埋め込む処理を追加しました。ブラウザー実行時にworkerをBlob URLとして登録します。CSP要件を説明し、UMD出力での動作をテストします。

Changes

UMD worker対応

Layer / File(s) Summary
workerの埋め込みと依存更新
package.json, webpack.config.js, src/version.ts, CHANGELOG.md, docs/embed*.js.LICENSE.txt
esbuildでMapLibre workerを依存込みの単一バンドルにし、webpackでソースを埋め込みます。MapLibre GL JSと関連依存を更新し、バージョン、変更履歴、ライセンス表記を更新します。
worker登録と動作確認
src/lib/maplibre-worker.ts, src/embed.ts, src/embed-core.ts, src/testability.test.ts, e2e/umd-worker.spec.ts, README.md
エントリーポイントでworkerを登録し、UMD出力でgetWorkerUrl()がBlob URLを返すことを確認します。READMEにimport時の挙動とworker-src blob:の要件を記載します。

Priority: ➖ Normal

Change: Bug fix

Merge Risk: ⚪ Minimal · up to 968b7

The UMD worker setup matches MapLibre v6’s loading behavior. No identified issue prevents merging after normal checks.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning esbuild の追加は worker の単一バンドルに必要です。E2E、README、ライセンス更新、バージョン更新も #518 の MapLibre v6 移行またはその配布結果に関連します。一方、jsdom と webpack-dev-server の更新は、報告上は脆弱性削減を目的とする開発依存関係の更新です。#518 の MapLibre v6 移行、worker 対応、また… jsdom と webpack-dev-server の脆弱性対応を別のリンク issue または別のプルリクエストへ分離してください。#518 に含める場合は、各更新が MapLibre v6 移行に必要な具体的理由を示してください。
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed タイトルは、maps-core 0.6.0 と maplibre-gl v6 への更新、および v6.0.0-pre.4 のリリース準備という主要な変更を明確に示しています。
Linked Issues check ✅ Passed #518 の主要なコーディング要件を満たしています。package.json は @geolonia/maps-core を ^0.6.0、maplibre-gl を 6.11.2 に更新しています。webpack は MapLibre worker と依存コードを esbuild で単一バンドルにし、src/embed.ts と src/embed-core.ts は…
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 7…
Full details: Out of Scope Changes check

Explanation

esbuild の追加は worker の単一バンドルに必要です。E2E、README、ライセンス更新、バージョン更新も #518 の MapLibre v6 移行またはその配布結果に関連します。一方、jsdom と webpack-dev-server の更新は、報告上は脆弱性削減を目的とする開発依存関係の更新です。#518 の MapLibre v6 移行、worker 対応、または ESM 解決との具体的な関係を確認できません。これらは直接リンクされた issue の範囲外です。

  • Fix all pre-merge checks with AI
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


Comment @coderabbitai help to get the list of available commands.

@smellman
smellman requested a review from a team October 2, 2026 06:24
@smellman smellman self-assigned this Oct 2, 2026

@yuiseki yuiseki left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

手元で動作確認しました。LGTM です 🙌

installMaplibreWorker() を no-op にして E2E が 14 本落ちることを実測してから検知用のテストを足している点、無言で壊れる種類の不具合への向き合い方としてとても良いと思いました。

確認したこと

npm ci / tsc --noEmit / npm run lint / npm test(15 passed)/ npx playwright test --workers=1(20 passed)はすべて green でした。

E2E はタイルをモックしているので、本番ビルドを静的配信して実タイルでも確認しています。

ページ 結果
index.html worker URL が blob: で登録され、1,180 地物を描画
pmtiles.html PMTiles レイヤーで 1,029 地物を描画
embed-core.js を単体読込して GeoloniaMap を生成 1,328 地物を描画、window.geolonia は未設定のまま
CSP worker-src 'self' blob: 描画される
CSP worker-src 'self' worker 起動がブロックされ地図が出ない

CSP の挙動は README の記述どおりでした。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

maps-core 0.6.0(maplibre-gl v6 系)への追従

2 participants