mirror of
https://github.com/pdfme/pdfme.git
synced 2026-04-17 12:38:57 -04:00
44 KiB
44 KiB
PROGRESS
Last updated: 2026-03-21 JST
Latest committed checkpoint:
193e82b8Clean up pdf-lib lint and localize playground fonts
Current Status
PLAN.md のうち、Phase 0 と Phase 1 を完了。次の主作業は Phase 2 (@pdfme/cli)。
今回までで完了:
Phase 0の互換性方針と migration guide の整備- playground の public export 化と Node playground の ESM 化
Phase 1の前提となる TypeScript typecheck 基盤- ルート
tsconfig.json - package references
- internal package path の source 解決
- build tsconfig の
src限定化
- ルート
Phase 1の一部である root の Vitest / Oxlint 基盤- 全 package (
common/manipulator/converter/schemas/generator/pdf-lib/ui) の Jest -> Vitest 移行 - clean
npm run typecheckで露出していた latent type error の解消 packages/converterのpdfjs-dist/canvas最新系への更新pdfjs-distv5 系で再発していた Node 側pdf2img実行不整合の解消generatorimage snapshot の再基準化pdfjs-distv5 系に合わせた browser worker entry の修正pdfjs-dist/canvas更新後の root build 再通過- type-aware lint / oxlint の
pdf-lib/uiへの適用拡大 @pdfme/pdf-libの Node ESM named import 修正fe08c521で誤って更新した blank snapshot の撤回と、renderer 修正後の再基準化common/manipulatorの build を Vite library mode + declaration emit に移行common/manipulatorの package exports をdist/index.js/dist/index.d.ts前提へ整理manipulatore2e image snapshot を pixelmatch v6 の AA 差分に合わせて再基準化pdf-libclean 時に straysrc/**/*.d.tsを確実に掃除するよう修正converter/schemas/generatorの build を Vite library mode + declaration emit に移行converter/schemas/generatorの package exports をdist/*直下の ESM 出力へ整理schemasのair-datepicker/locale/*を Node ESM でも壊れない形で bundle 側へ吸収pdf-lib/uiの build を Vite library mode + declaration emit に移行pdf-lib/uiの package exports をdist/index.js/dist/index.d.ts前提へ整理- 全 package の build Vite 化を完了
lint:typecheckの warning を 0 に整理lint:oxlintの warning を 74 -> 0 に整理pdf-lib/uiの package-local lint を error なしへ整理uiの react-hooks lint 対応で発生したPreview回帰を解消- playground thumbnail script の remote font 依存を撤去
- playground の asset generation script が package root export + local fonts で通ることを確認
pdfjs-distv5 browser worker のhashOriginal.toHex回帰を local worker wrapper で吸収playgroundの E2E test runner を Jest から Vitest へ移行@pdfme/converterの一時的な CJS 後退を撤回し、ESM-only 方針へ復帰playgroundの Vitest / TS 側 source alias を外し、@pdfme/*を package exports 経由で解決するよう整理playgroundに package exports smoke check を追加し、E2E 実行前に必ず走るようにしたplaygroundの direct devDependencies から legacy Jest /ts-jest/ts-nodeを撤去し、lockfile を整理- root /
ui側の legacy Jest devDependencies・jestglobals・types: ["jest"]を撤去 uiの Vitest setup を local canvas mock ベースへ整理し、jest-canvas-mock/jest-environment-jsdom/@ungap/structured-clone依存を撤去- package-local ESLint の project 解決を
tsconfig.jsonベースへ統一し、不要になったtsconfig.cjs.json/tsconfig.esm.json/tsconfig.node.jsonを削除 - CI workflow を
npm ciと root scripts ベースへ整理し、lint:oxlint/lint:typecheck/typecheckを明示実行するよう更新 - root の
npm run build/npm run testと playground のnpm run build/npm run testが通ることを確認 - root / package / playground の task 実行を
vite-plus(vp) ベースへ整理 lint/fmtをvp lint/vp fmtベースへ寄せ、shared config を.oxlintrc.json/.oxfmtrc.jsonに移行- legacy ESLint / Prettier config と不要 devDependencies を撤去し、lint/format の front door を
vp nativeに統一
まだ未着手:
- CLI (
Phase 2) - Claude Code Skills (
Phase 3)
現在の残課題:
- CLI (
Phase 2) 未着手 - Claude Code Skills (
Phase 3) 未着手
次に進める順序:
- CLI (
Phase 2) の前提整理に着手する - Claude Code Skills (
Phase 3) の設計に入る
Completed Work
1. Phase 0: 互換性方針のドキュメント化
追加・更新済み:
website/docs/migration-v6.mdwebsite/i18n/ja/docusaurus-plugin-content-docs/current/migration-v6.mdREADME.mdwebsite/docs/development-guide.mdwebsite/i18n/ja/docusaurus-plugin-content-docs/current/development-guide.mdwebsite/sidebars.js
内容:
- 次期メジャーでの breaking changes を整理
ESM-onlyNode 20+- UI package の
React 18+ - 内部
dist/*import 廃止 require()からimportへの移行例を記載
2. set-version.js の ESM 化ブロッカー解消
実施内容:
packages/common/set-version.jsをpackages/common/set-version.cjsにリネームpackages/common/package.jsonのdev/prebuildをnode set-version.cjsに変更- Node built-in import を
node:prefix に統一
理由:
- 将来 package を
type: "module"化してもset-versionが壊れないようにするため
3. playground の package root 参照化
実施内容:
playground/package.jsonのfile:../packages/*/distをfile:../packages/*に変更playground/package-lock.jsonも同内容に更新playground/node_modules/@pdfme/*が package root を向くことを確認済み
理由:
dist直接参照をやめて public export ベースに寄せるため
4. playground scripts の内部 import 廃止
実施内容:
playground/scripts/generate-templates-thumbnail.mjsの以下を置換@pdfme/generator/cjs/src/index.js->@pdfme/generator@pdfme/converter/cjs/src/index.node.js->@pdfme/converter@pdfme/common/cjs/src/index.js->@pdfme/common@pdfme/schemas/cjs/src/index.js->@pdfme/schemas
補足:
node:prefix の import に整理済み
5. Node playground の ESM 化
実施内容:
playground/node-playground/package.jsonを追加してtype: "module"を設定playground/node-playground/generate.jsを ESM に書き換えplayground/node-playground/merge.jsを ESM に書き換え__dirnameはfileURLToPath(import.meta.url)ベースへ置換
6. @pdfme/manipulator の Node import 条件修正
実施内容:
packages/manipulator/package.jsonのexportsにimport.node条件を追加- Node ESM import 時は
./dist/cjs/src/index.jsを使うように変更
理由:
playground/node-playground/merge.jsを public export 経由で動かすと、 既存の export 条件では browser/esm 側へ寄って@pdfme/pdf-libの named export 解決に失敗していたため
7. Phase 1: TypeScript typecheck 基盤
実施内容:
- ルート
tsconfig.jsonを追加して solution style references を定義 - ルート
package.jsonにtypecheckscript を追加 tsconfig.base.jsonに internal package 用のbaseUrl/pathsを追加tsconfig.base.jsonからjest型を削除- 各 package の
tsconfig.jsonを typecheck 用compositeproject に変更 common/converter/schemas/generator/manipulator/pdf-libはdist/typecheckへ declaration-only 出力する構成に変更uiは build 用tsconfig.jsonと typecheck 用tsconfig.typecheck.jsonを分離- 各 build 用
tsconfig.*.jsonをsrc限定に変更し、__tests__が build 出力へ混ざらないよう修正 packages/ui/vite.config.mtsに internal package alias を追加して clean build 後でも source 解決できるように修正.gitignoreに*.tsbuildinfoを追加
理由:
- clean checkout で package 間型解決が壊れない状態を先に作るため
- 既存 build が
__tests__をdistに吐いていたため、その副作用を止めるため uiは build 設定と typecheck 設定の責務を分けないと declaration build と references が衝突するため
8. Phase 1: root の Vitest / Oxlint 基盤
実施内容:
- ルート
package.jsonに以下を追加 vitestvitest-image-snapshotviteoxlint- ルート
vitest.config.tsを追加 - ルート
eslint.typecheck.config.mjsを追加 - ルート scripts を追加
test:commontest:manipulatortest:manipulator:update-snapshotslint:typechecklint:oxlint.gitignoreに以下を追加**/__image_actual__/****/__image_diffs__/****/__image_diff_report__/**
補足:
lint:typecheckとlint:oxlintは現時点ではcommon/converter/generator/manipulator/schemasにスコープpdf-lib/uiへの拡張は残課題として別管理vitest.config.tsは workspace のcwdを見て package ごとの設定を切り替える構成
9. common / manipulator の Jest -> Vitest 移行
実施内容:
packages/common/package.jsonのtestを Vitest 実行へ変更packages/manipulator/package.jsonのtest/test:update-snapshotsを Vitest 実行へ変更common/manipulatorのpackage.jsonから inline Jest config を削除packages/manipulator/jest.setup.jsを削除packages/manipulator/vitest.setup.tsを追加してvitest-image-snapshotを登録manipulatorの e2e snapshot test をtoMatchImageベースへ置換common/manipulatorの test code で__dirnameをimport.meta.urlベースへ置換- ルート
eslint.config.mjsにviglobal を追加
理由:
commonは Jest 固有 API 依存が少なく、最初の移行対象として安全だったためmanipulatorは image snapshot があるが、vitest-image-snapshotで移行可能だったため__dirnameは Vitest の ESM 実行では使えないため、先に除去が必要だったため
10. converter / schemas の Jest -> Vitest 移行
実施内容:
packages/converter/package.jsonのtestを Vitest 実行へ変更packages/schemas/package.jsonのtestを Vitest 実行へ変更converter/schemasのpackage.jsonから inline Jest config を削除- ルート
vitest.config.tsにconverter/schemasを追加 - ルート
package.jsonにtest:converter/test:schemasを追加 - ルート
lint:typecheck/lint:oxlintの対象をconverter/schemasまで拡張 packages/schemas/__tests__/text.test.tsの__dirnameをimport.meta.urlベースへ置換packages/schemas/__tests__/text.test.tsの Jest spy をやめ、幅 1 の mocked font に置換
理由:
converterは Jest 固有 API 依存がなく、設定差し替え中心で移行可能だったためschemasはtext.test.tsに ESM 非互換なjest.spyOn(require(...))があり、そこだけテストロジックを Vitest 向けに組み替える必要があったためlint:typecheck/lint:oxlintを migration 済み package に合わせて広げることで、段階的に root 基盤を有効化できるため
11. generator の Jest -> Vitest 移行
実施内容:
packages/generator/package.jsonのtest/test:update-snapshotsを Vitest 実行へ変更packages/generator/package.jsonから inline Jest config を削除packages/generator/jest.setup.jsを削除packages/generator/vitest.setup.tsを追加してvitest-image-snapshotを登録- ルート
vitest.config.tsにgeneratorを追加 - ルート
package.jsonにtest:generatorを追加 packages/generator/__tests__/utils.tsとintegration-playground.test.tsの__dirnameをimport.meta.urlベースへ置換packages/generator/__tests__/assets/templates/index.tsにcreateRequire(import.meta.url)を追加- generator の image snapshot test を
toMatchImageベースへ置換 PinyonScript-Regular.ttfをpackages/generator/__tests__/assets/fonts/に追加し、test font を remote fetch ではなく local asset に変更lint:typecheck/lint:oxlintの対象をgeneratorまで拡張packages/generator/src/generate.ts/packages/generator/src/helper.tsの不要な型 assertion を削除
理由:
- generator は image snapshot と test asset の
require()があるため、Vitest 用 setup と ESM 対応が必要だったため - playground snapshot test が remote font fetch に依存しており、この環境では安定実行できないため local asset 化が必要だったため
- lint 対象拡張で出た型 assertion 2 件は既存挙動を変えずに解消できたため
12. pdf-lib の Jest -> Vitest 移行
実施内容:
packages/pdf-lib/package.jsonのtestを Vitest 実行へ変更packages/pdf-lib/package.jsonから inline Jest config を削除- ルート
vitest.config.tsにpdf-libを追加 - ルート
package.jsonにtest:pdf-libを追加 packages/pdf-lib/__tests__のjest.fn/jest.clearAllMocksをvi.fn/vi.clearAllMocksへ置換
理由:
pdf-libは runner 依存が薄く、少数の mock API 置換だけで移行できたためuiより先に進めるほうが安全だったため
13. ui の Jest -> Vitest 移行
実施内容:
packages/ui/package.jsonのtestを Vitest 実行へ変更packages/ui/package.jsonから inline Jest config を削除- ルート
vitest.config.tsにuiworkspace とjsdomenvironment を追加 packages/ui/vitest.setup.tsを追加してjest-dom/jest-canvas-mock/ cleanup を集約packages/ui/__mocks__/converter.ts/form-render.ts/lucide-react.tsを追加Designer.test.tsx/Preview.test.tsxの snapshot を Vitest 向けに安定化PluginIcon.test.tsx/helper.test.ts/assets/helper.tsの Jest API をviベースへ置換packages/ui/__tests__/test-helpers.jsを削除- ルート
package.jsonにtest:ui/test:ui:update-snapshotsを追加
理由:
uiは jsdom と mock 解決が必要で、最後の移行対象として個別調整が多かったため- snapshot の DOM id が非決定的だったため、Vitest でも安定する正規化が必要だったため
14. build 用 tsconfig の分離
実施内容:
tsconfig.build.base.jsonを追加- 各 package の build 用
tsconfig.cjs.json/tsconfig.esm.json/tsconfig.node.jsonをtsconfig.build.base.json継承へ切り替え - 各 build 用 tsconfig に
rootDir: "."を追加し、出力をdist/*/src/*に揃えるよう修正
確認済み:
npm run buildcd playground/node-playground && node generate.jscd playground/node-playground && node merge.js
補足:
- これにより
@pdfme/commonなどの Node import は再び package export 経由で解決できる状態に戻った npm run build、playground/node-playground/generate.js、playground/node-playground/merge.jsは通過済み- 後続対応として clean
npm run typecheckで露出していた latent type error も解消済み
15. clean npm run typecheck の latent type error 解消
実施内容:
packages/schemas/src/text/types.tsのTextSchemaをSchema & { ... }へ変更packages/schemas/src/barcodes/types.tsのBarcodeSchemaをSchema & { ... }へ変更packages/schemas/src/tables/types.tsのTableSchemaをSchema & { ... }へ変更packages/schemas/src/multiVariableText/types.tsのMultiVariableTextSchemaを intersection type に変更
理由:
- clean build 後は declaration 解決がより厳密になり、
interface extendsでは baseSchemaの union 的な shape と衝突していたため - typecheck 基盤導入後に顕在化した既存の型不整合を、挙動変更なしで解消する必要があったため
16. packages/converter の pdfjs-dist / canvas 更新
実施内容:
packages/converter/package.jsonのpdfjs-distを^5.5.207に更新packages/converter/package.jsonのcanvasを^3.2.1に更新packages/converter/src/index.node.tsをpdfjs-dist/legacy/build/pdf.mjsベースへ更新pdfjs-distに渡す PDF data を copy して buffer detach の影響を避けるよう変更packages/converter/src/pdf2img.tsの render parameters にcanvasを明示的に渡すよう変更
理由:
pdfjs-distv5 系では Node 側の canvas 解決とCanvasFactoryの扱いが v3 系から変わっており、既存実装ではImage or Canvas expectedが再現したためcanvasを最新版 3.x 系へ揃え、pdfjs-dist側の想定と一致する構成へ寄せる必要があったため
17. browser worker entry 修正
実施内容:
packages/converter/src/index.browser.tsをpdfjs-dist/webpack.mjsベースへ切り替えpackages/converter/src/pdfjs-dist-webpack.d.tsを追加して module declaration を補完
理由:
pdfjs-distv5 ではpdf.worker.entry.jsが存在せず、uibuild が browser worker import 解決エラーで落ちていたため
18. pdf-lib / ui への type-aware lint / oxlint 拡張
実施内容:
- root
package.jsonのlint:typecheck/lint:oxlintにpackages/pdf-lib/srcとpackages/ui/srcを追加 eslint.typecheck.config.mjsをPLAN.md準拠の型認識ルール専用構成へ整理@typescript-eslint/await-thenableに反していたpdf-libの不要なawaitを削除packages/ui/src/components/Designer/RightSidebar/ListView/Item.tsxの古いreact/prop-typesdisable を削除
理由:
PLAN.mdの方針では type-aware lint はno-floating-promises/no-misused-promises/await-thenableのみを ESLint で担う想定で、recommended-requiring-type-checking全量を当てる想定ではなかったため- その方針に戻すことで、既存 package の大規模な unrelated lint error を出さずに
pdf-lib/uiまで適用対象を広げられるため
19. @pdfme/pdf-lib の Node ESM named import 修正
実施内容:
packages/pdf-lib/package.jsonのexports.import.nodeを./dist/node/index.mjsへ変更packages/pdf-lib/write-node-esm-wrapper.cjsを追加し、build 後に CJS export を再公開する ESM wrapper を自動生成node --input-type=module -e "import { PDFDocument } from '@pdfme/pdf-lib'"が通ることを確認
理由:
- 既存の
dist/node/src/index.jsは CommonJS 出力のため、Node ESM から package root を named import するとNamed export not foundで失敗していたため dist/esmをそのまま Node ESM に向けると extensionless directory import で壊れるため、CJS 上に薄い.mjswrapper を置く方が安全だったため
20. Node renderer blank regression の解消と generator snapshot の再基準化
実施内容:
packages/converter/package.jsonに@napi-rs/canvasを direct dependency として追加packages/converter/src/index.node.tsの render target をcanvasから@napi-rs/canvasへ切り替え- Node 側
getDocument()への customCanvasFactory注入をやめ、pdfjs-distv5 のデフォルト Node 経路に寄せた canvasToArrayBufferをpng/jpegごとに明示 encode し、plainArrayBufferを返すよう修正packages/converter/__tests__/index.test.tsに「rendered image is not blank」を追加し、空入力 fixture も非空データへ修正packages/generator/__tests__/__image_snapshots__/*.pngを、blank ではない corrected renderer 出力で再更新
理由:
canvas@3を render target にした Nodepdf2imgはpdfjs-distv5 下で白紙 PNG を返し、text / basePdf が描画されない regression を起こしていたため- 同じ PDF を
@napi-rs/canvasで描画すると内容が復元し、bbox と非白画素数も旧 snapshot に近いことを確認できたため fe08c521の snapshot 更新はこの regression を隠していたため、いったん撤回し、renderer 修正後にのみ再基準化する必要があったため
21. common / manipulator build の Vite 化と exports 再設計
実施内容:
packages/common/package.jsonをtype: "module"に変更packages/commonにvite.config.mtsとtsconfig.build.jsonを追加packages/commonの build をvite build && tsc -p tsconfig.build.jsonに変更packages/commonの export を./dist/index.js/./dist/index.d.tsに整理packages/manipulator/package.jsonをtype: "module"に変更packages/manipulatorにvite.config.mtsとtsconfig.build.jsonを追加packages/manipulatorの build をvite build && tsc -p tsconfig.build.jsonに変更packages/manipulatorの export を./dist/index.js/./dist/index.d.tsに整理packages/ui/tsconfig.jsonの@pdfme/commonpath を../common/distへ更新packages/manipulator/__tests__/e2e/__image_snapshots__/*.pngを Vite build 移行後の renderer 出力で再更新packages/pdf-lib/package.jsonのcleanをrimraf --glob dist "src/**/*.d.ts"に変更
理由:
PLAN.mdのPhase 1にある build の Vite library mode 化を安全な package から進めるためcommon/manipulatorは multi-entry や browser/node dual entry がなく、最初の移行対象として安全だったためvitest-image-snapshotが内部で使うpixelmatch@6により、既存 manipulator snapshot と微小な AA 差分が出るためpdf-lib/src/*.d.tsの残骸がlint:typecheck/lint:oxlintを不安定にしていたため
22. converter / schemas / generator build の Vite 化と exports 再設計
実施内容:
packages/converterにsrc/index.ts/tsconfig.build.json/vite.config.mtsを追加packages/converterの build を Vite multi-entry (index/index.node) + declaration emit に変更packages/converter/package.jsonをtype: "module"化し、browser/node条件付き export をdist/index.js/dist/index.node.jsベースへ整理tsconfig.base.jsonの@pdfme/converterpath をpackages/converter/src/index.tsに変更packages/ui/vite.config.mtsの@pdfme/converteralias を../converter/src/index.tsに変更packages/schemasにtsconfig.build.json/vite.config.mtsを追加packages/schemasの build を Vite multi-entry (index/utils) + declaration emit に変更packages/schemas/package.jsonをtype: "module"化し、root export と./utilsexport をdist/index.js/dist/utils.jsベースへ整理packages/schemas/vite.config.mtsでair-datepicker/locale/*を external から外し、Node ESM でも壊れないようにしたpackages/generatorにtsconfig.build.json/vite.config.mtsを追加packages/generatorの build を Vite library mode + declaration emit に変更packages/generator/package.jsonをtype: "module"化し、root export をdist/index.js/dist/index.d.tsベースへ整理
理由:
PLAN.mdのPhase 1にある package build の Vite 化を、依存関係の浅い順に継続するためconverterは browser/node dual entry を持つため、common/manipulatorの次に整理する価値が高かったためschemasは public subpath が.と./utilsに限られており、Vite multi-entry へ素直に移行できるためschemasはair-datepicker/locale/*の bare subpath import が Node ESM import を壊していたため、build 側で吸収する必要があったためgeneratorは single entry で、converter/schemasの public export が安定した後に続けて移行しやすかったため
23. pdf-lib / ui build の Vite 化と exports 再設計
実施内容:
packages/pdf-lib/package.jsonをtype: "module"化し、root export を./dist/index.js/./dist/index.d.tsベースへ整理packages/pdf-libにtsconfig.build.json/vite.config.mtsを追加packages/pdf-libの build をvite build && tsc -p tsconfig.build.jsonに変更packages/pdf-libの旧tsconfig.cjs.json/tsconfig.esm.json/tsconfig.node.jsonとwrite-node-esm-wrapper.cjsを削除packages/pdf-lib/eslint.config.mjsの project 参照をtsconfig.jsonに切り替えpackages/ui/package.jsonをtype: "module"化し、root export を./dist/index.js/./dist/index.d.tsベースへ整理packages/uiにtsconfig.build.jsonを追加packages/uiの build / dev watch をvite build --watch+tsc -p tsconfig.build.jsonベースへ変更packages/ui/tsconfig.jsonを editor / lint 用のnoEmit構成へ整理packages/ui/tsconfig.typecheck.jsonの出力先をdist/typecheckへ移し、build 用 declaration 出力と分離packages/ui/vite.config.mtsを ESM single-entry 出力 (dist/index.js) 前提に変更
理由:
PLAN.mdのPhase 1にある package build の Vite 化を全 package で完了させるためpdf-libは intermediate な CJS / wrapper 付き export を維持するより、他 package と同じ dist root の ESM export へ揃える方が単純で保守しやすいためuiはすでに Vite build を使っていたが、出力名と declaration 配置だけが旧構成のまま残っていたため、package metadata と一致させる必要があったためuiの typecheck 出力と build 出力が同じdist/typesを共有しており、clean build 後の状態が分かりにくかったため
24. lint warning 整理の初回ラウンド
実施内容:
packages/common/src/types.ts、packages/pdf-lib/src/core/crypto.ts、packages/ui/src/components/**などの不要なeslint-disableを削除- root
lint:typecheckを warning 0 に整理 packages/ui/eslint.config.mjsでreact/prop-typesを無効化し、TypeScript 前提の package-local lint を error なしに修正packages/schemas/src/tables/tableHelper.tsの重複式を修正packages/converter/src/pdf2size.ts、packages/ui/src/helper.ts、packages/schemas/src/**のnew Array(...)/ regex / spread fallback など、非pdf-libの低リスク warning を整理packages/pdf-lib/src/**のObject型境界、catch (e)、一部 regex / 条件式を warning の出ない形へ整理lint:oxlintを 74 warning から 48 warning まで削減
理由:
- build/export 移行後に次の安全なタスクは lint warning の圧縮で、不要 suppression の撤去は挙動を変えずに進めやすいため
tableHelperの重複式は単なる style warning ではなく、実質的に無意味な条件式だったため先に直す価値があったためuiの package-local lint はreact/prop-typesが TypeScript 構成と噛み合っておらず、設定で止まっていたため先に exit 0 へ戻す必要があったため
25. pdf-lib oxlint warning 完了と playground script の network 依存撤去
実施内容:
packages/pdf-lib/src/**のnew Array(...)をArray(...)へ整理packages/pdf-lib/src/api/PDFPage.tsの!!をBoolean(...)に変更packages/pdf-lib/src/core/syntax/CharCodes.tsとpackages/pdf-lib/src/core/embedders/FileEmbedder.tsの duplicate enum value を alias 参照へ変更packages/pdf-lib/src/core/acroform/PDFAcroField.tsの control regex は挙動維持のためoxlintcomment で意図を明示- root
lint:oxlintを warning 0 に整理 playground/scripts/generate-templates-thumbnail.mjsをpackages/generator/__tests__/assets/fonts/*.ttfのローカル読込へ変更playground/scripts/generate-templates-list-json.mjsの built-in import をnode:prefix に整理playground/scripts/generate-templates-list-json.mjsとgenerate-templates-thumbnail.mjsの実行を確認
理由:
- 残っていた
oxlintwarning の大半はpdf-libの古いnew Array(...)記法に集中しており、挙動を変えずにまとめて削減できたため - duplicate enum value は public 値を変えずに alias 参照へ直すのが安全だったため
- playground thumbnail script は Google Fonts 依存のままだと network 制約下で安定確認できないため、repo 内の既存 font asset を再利用する方が安全だったため
Verification Completed
実行済み:
cd playground && npm install --ignore-scripts --no-audit --no-fundcd playground && node --input-type=module -e "import { getDefaultFont } from '@pdfme/common'; import { pdf2img } from '@pdfme/converter'; import { generate } from '@pdfme/generator'; import { text } from '@pdfme/schemas'; console.log(typeof getDefaultFont, typeof pdf2img, typeof generate, typeof text);"cd playground/node-playground && node generate.jscd playground/node-playground && node merge.jscd playground && node --check scripts/generate-templates-thumbnail.mjscd packages/common && node set-version.cjsnpm install --package-lock-only --workspace packages/converter @napi-rs/canvas@^0.1.97npm run typechecknpm run cleannpm run typechecknpm run -w packages/ui buildnpm run buildnpm run test --workspace packages/commonnpm run test --workspace packages/manipulatornpm run lint:typechecknpm run lint:oxlintnpm run test --workspace packages/converternpm run test --workspace packages/schemasnpm run test --workspace packages/pdf-libnpm run test --workspace packages/uinpm run test --workspace packages/generatornpm run test:update-snapshots --workspace packages/generatornpm run test:update-snapshots --workspace packages/manipulatornpm run -w packages/ui buildnpm run -w packages/pdf-lib buildnpm run lint --workspace packages/pdf-libnpm run lint --workspace packages/uinode playground/scripts/generate-templates-list-json.mjsnode playground/scripts/generate-templates-thumbnail.mjsnpm run -w packages/common buildnpm run -w packages/manipulator buildnpm run -w packages/converter buildnpm run -w packages/schemas buildnpm run -w packages/generator buildnode --input-type=module -e "import { PDFDocument } from '@pdfme/pdf-lib'; console.log(typeof PDFDocument);"node --input-type=module -e "import { BLANK_PDF } from '@pdfme/common'; import { merge } from '@pdfme/manipulator'; console.log(typeof BLANK_PDF, typeof merge);"node --input-type=module -e "import { pdf2img } from '@pdfme/converter'; import { text } from '@pdfme/schemas'; import { getDynamicHeightsForTable } from '@pdfme/schemas/utils'; import { generate } from '@pdfme/generator'; console.log(typeof pdf2img, typeof text, typeof getDynamicHeightsForTable, typeof generate);"
確認できたこと:
- playground の local package link は
distではなく package root を向いている - public export 経由で
common/converter/generator/schemasを import できる - ESM 化した Node playground の
generate.jsは動作する merge.jsもmanipulatorの export 修正後に動作するgenerate-templates-thumbnail.mjsは syntax check を通るset-version.cjsは期待どおりsrc/version.tsを更新できるtsc -bベースの root typecheck が通る- clean 後の
tsc -bも通る - ルート build が通る
uipackage は build と typecheck の分離後も単体 build が通るuipackage の test は Vitest で通るcommonの test は Vitest で通るmanipulatorの unit / e2e test は Vitest とvitest-image-snapshotで通るcommon/manipulatorは Vite build 後も package root の ESM import が通るconverterの test は Vitest で通るschemasの test は Vitest で通るpdf-libの test は Vitest で通る- root の
lint:typecheckはpdf-lib/uiを含む全 package のsrcスコープで error なしで通る - root の
lint:oxlintは warning のみで exit 0 を維持している converter/schemas/generatorは root build 後も package root の Node ESM import が通る- generator の test 実行は local font asset 化により network 非依存になった
packages/converterはpdfjs-dist@5.5.207/canvas@3.2.1更新後でも、Node renderer を@napi-rs/canvasに寄せた状態で unit test が通るgeneratorはpdf2img failed: Image or Canvas expectedでは落ちなくなり、blank snapshot を撤回したうえで corrected renderer 出力へ再基準化して test が再度通るsegmenterEnglish/multiVariableText/address-label-10は bbox と非白画素数が旧 snapshot と近く、text / basePdf 描画が復元しているuibuild はpdfjs-dist/webpack.mjsへの切り替え後に通る- root build も
pdfjs-dist/canvas更新後の状態で再度通る @pdfme/pdf-libは Node ESM から package root の named import が通るpdf-lib/uiの build は dist root (dist/index.js/dist/index.d.ts) 前提へ揃ったpdf-lib/uiの package-local lint は error なしで実行できるroot lint:oxlintは warning 0playgroundの template list / thumbnail script は package root export と local font asset 前提で通る
Files Changed So Far
README.mdpackages/common/package.jsonpackages/common/set-version.cjspackages/manipulator/package.jsonplayground/package.jsonplayground/package-lock.jsonplayground/node-playground/package.jsonplayground/node-playground/generate.jsplayground/node-playground/merge.jsplayground/scripts/generate-templates-thumbnail.mjspackage-lock.jsonwebsite/sidebars.jswebsite/docs/development-guide.mdwebsite/docs/migration-v6.mdwebsite/i18n/ja/docusaurus-plugin-content-docs/current/development-guide.mdwebsite/i18n/ja/docusaurus-plugin-content-docs/current/migration-v6.mdpackage.jsontsconfig.base.jsontsconfig.jsonvitest.config.tseslint.typecheck.config.mjspackages/common/tsconfig.cjs.jsonpackages/common/tsconfig.esm.jsonpackages/common/tsconfig.build.jsonpackages/common/tsconfig.jsonpackages/common/tsconfig.node.jsonpackages/common/vite.config.mtspackages/converter/tsconfig.cjs.jsonpackages/converter/tsconfig.esm.jsonpackages/converter/tsconfig.build.jsonpackages/converter/tsconfig.jsonpackages/converter/vite.config.mtspackages/generator/tsconfig.cjs.jsonpackages/generator/tsconfig.esm.jsonpackages/generator/tsconfig.build.jsonpackages/generator/tsconfig.jsonpackages/generator/tsconfig.node.jsonpackages/generator/vite.config.mtspackages/manipulator/tsconfig.cjs.jsonpackages/manipulator/tsconfig.esm.jsonpackages/manipulator/tsconfig.build.jsonpackages/manipulator/tsconfig.jsonpackages/manipulator/vite.config.mtspackages/pdf-lib/eslint.config.mjspackages/pdf-lib/tsconfig.build.jsonpackages/pdf-lib/tsconfig.jsonpackages/pdf-lib/vite.config.mtspackages/schemas/tsconfig.cjs.jsonpackages/schemas/tsconfig.esm.jsonpackages/schemas/tsconfig.build.jsonpackages/schemas/tsconfig.jsonpackages/schemas/tsconfig.node.jsonpackages/schemas/vite.config.mtspackages/ui/package.jsonpackages/ui/eslint.config.mjspackages/ui/tsconfig.build.jsonpackages/ui/tsconfig.jsonpackages/ui/tsconfig.typecheck.jsonpackages/ui/vite.config.mtspackages/common/__tests__/dynamicTemplate.test.tspackages/common/__tests__/helper.test.tspackages/common/src/types.tspackages/converter/package.jsonpackages/converter/src/index.tspackages/converter/src/index.browser.tspackages/converter/src/index.node.tspackages/converter/__tests__/index.test.tspackages/converter/src/pdf2img.tspackages/converter/src/pdf2size.tspackages/converter/src/pdfjs-dist-webpack.d.tspackages/generator/package.jsonpackages/generator/vitest.setup.tspackages/generator/__tests__/__image_snapshots__/*.pngpackages/generator/__tests__/assets/fonts/PinyonScript-Regular.ttfpackages/generator/__tests__/assets/templates/index.tspackages/generator/__tests__/generate.test.tspackages/generator/__tests__/integration-other.test.tspackages/generator/__tests__/integration-playground.test.tspackages/generator/__tests__/integration-segmenter.test.tspackages/generator/__tests__/integration-textType.test.tspackages/generator/__tests__/__image_snapshots__/*.pngpackages/generator/__tests__/utils.tspackages/generator/src/generate.tspackages/generator/src/helper.tspackages/manipulator/__tests__/test-helpers.tspackages/manipulator/__tests__/e2e/insert.e2e.test.tspackages/manipulator/__tests__/e2e/merge.e2e.test.tspackages/manipulator/__tests__/e2e/move.e2e.test.tspackages/manipulator/__tests__/e2e/organize-complex.e2e.test.tspackages/manipulator/__tests__/e2e/organize-single.e2e.test.tspackages/manipulator/__tests__/e2e/remove.e2e.test.tspackages/manipulator/__tests__/e2e/rotate.e2e.test.tspackages/manipulator/__tests__/e2e/split.e2e.test.tspackages/manipulator/__tests__/e2e/__image_snapshots__/*.pngpackages/manipulator/vitest.setup.tspackages/pdf-lib/package.jsonpackages/pdf-lib/__tests__/api/PDFDocument.spec.tspackages/pdf-lib/__tests__/api/form/PDFForm.spec.tspackages/pdf-lib/__tests__/core/parser/PDFObjectParser.spec.tspackages/pdf-lib/__tests__/core/parser/PDFParser.spec.tspackages/pdf-lib/src/api/form/appearances.tspackages/pdf-lib/src/api/svg.tspackages/pdf-lib/src/core/parser/PDFParser.tspackages/pdf-lib/src/core/streams/decode.tspackages/pdf-lib/src/core/embedders/CustomFontEmbedder.tspackages/pdf-lib/src/core/embedders/CustomFontSubsetEmbedder.tspackages/pdf-lib/src/core/embedders/FileEmbedder.tspackages/pdf-lib/src/core/syntax/CharCodes.tspackages/pdf-lib/src/core/acroform/PDFAcroField.tspackages/pdf-lib/src/core/acroform/PDFAcroChoice.tspackages/pdf-lib/src/core/acroform/PDFAcroForm.tspackages/pdf-lib/src/core/acroform/PDFAcroTerminal.tspackages/pdf-lib/src/core/operators/PDFOperator.tspackages/pdf-lib/src/core/structures/PDFContentStream.tspackages/pdf-lib/src/core/structures/PDFCrossRefStream.tspackages/pdf-lib/src/core/structures/PDFObjectStream.tspackages/pdf-lib/src/utils/arrays.tspackages/pdf-lib/src/utils/numbers.tspackages/pdf-lib/src/utils/pdfDocEncoding.tspackages/pdf-lib/src/utils/validators.tspackages/pdf-lib/src/utils/base64.tspackages/pdf-lib/src/utils/strings.tspackages/schemas/package.jsonpackages/schemas/__tests__/text.test.tspackages/schemas/src/barcodes/helper.tspackages/schemas/src/date/helper.tspackages/schemas/src/multiVariableText/propPanel.tspackages/schemas/src/tables/tableHelper.tspackages/schemas/src/barcodes/types.tspackages/schemas/src/multiVariableText/types.tspackages/schemas/src/tables/types.tspackages/schemas/src/text/helper.tspackages/schemas/src/text/types.tspackages/schemas/src/utils.tspackages/ui/src/helper.tspackages/ui/src/components/Designer/RightSidebar/DetailView/AlignWidget.tsxpackages/ui/src/components/Designer/RightSidebar/DetailView/index.tsxpackages/ui/src/components/Designer/RightSidebar/ListView/Item.tsxpackages/ui/src/components/Designer/index.tsxpackages/ui/src/components/Preview.tsxplayground/scripts/generate-templates-list-json.mjsplayground/scripts/generate-templates-thumbnail.mjs.gitignoreeslint.config.mjs
削除:
packages/common/set-version.jspackages/manipulator/jest.setup.jspackages/generator/jest.setup.jspackages/pdf-lib/tsconfig.cjs.jsonpackages/pdf-lib/tsconfig.esm.jsonpackages/pdf-lib/tsconfig.node.jsonpackages/pdf-lib/write-node-esm-wrapper.cjs
参考:
PLAN.mdは未編集REVIEW.mdは未編集
Remaining Work
Priority 1: ルートレベルの新基盤導入
完了:
- ルート
package.jsonの scripts 再編 vitest.config.ts追加eslint.typecheck.config.mjs追加vite/vitest/oxlint依存追加
補足:
package-lock.json更新済みlint:typecheck/lint:oxlintはpdf-lib/uiを含む全 package のsrcに適用済み- 現在は
lint:typecheck/lint:oxlintともに warning 0
Priority 2: package ごとの Jest -> Vitest 移行
完了:
commonconvertergeneratormanipulatorpdf-libschemasui
Priority 3: package build の Vite 化
完了:
commonconvertergeneratormanipulatorpdf-libschemasui
Priority 4: playground の残件
未実施:
- playground 側 test 戦略の整理
- playground lint 方針の整理
scripts/generate-templates-list-json.mjsを含めた周辺確認
現時点の状態:
- 内部 import 廃止は完了
- package root 参照化は完了
node-playground/generate.jsは最新 exports 構成でも通過済み- ただし
scripts/generate-templates-list-json.mjsなど未確認の周辺 script は残っている
Priority 5: CLI / Skills
未着手:
@pdfme/clipdfme generatepdfme validatepdfme inspectschema-infotemplate createtemplate add-field- Claude Code Skills
Recommended Next Step
次のターンでは PROGRESS.md を起点にして、以下の順で進めるのが安全。
lint:typecheckの unusedeslint-disablewarning を先に整理するlint:oxlintで残っている 48 warning を、pdf-lib由来とそれ以外に分けて段階的に潰す- playground 周辺 script の exports 追従確認を進める
Known Risks
PLAN.mdの Phase 1 は現状のまま一気に切り替えると変更範囲が広すぎるconverterは browser/node entry とpdfjs-dist更新が絡むため、単独で切り出して進めたほうが安全playgroundは package exports の変更に追従確認が必要uiの build は source alias と typecheck config 分離の上で成立しているため、次の移行ではこの構成を壊さないことlint:typecheckはPLAN.md準拠の最小ルールで全 package に適用済みで、現在は warning 0lint:typecheck自体は warning 0 まで整理済みだが、oxlintにはまだ 48 warning 残っており、主にpdf-libの legacy 実装に集中しているmanipulatorの snapshot runner はvitest-image-snapshotへ切り替わったため、今後 snapshot 更新時は生成される補助ディレクトリが変わることpdfjs-distv5 の Node rasterize はcanvasrender target に戻すと白紙回帰するため、packages/converter/src/index.node.tsの@napi-rs/canvas依存を安易に外さないこと- generator の image snapshot は corrected renderer 出力へ再基準化済みであり、
fe08c521の blank baseline を前提に見ないこと - manipulator の e2e snapshot は Vite build 移行後の renderer 出力へ再基準化済みで、差分は文字エッジの AA 変化が主因だった
pdf-libの clean が効かない状態に戻ると straysrc/**/*.d.tsが lint を壊すため、packages/pdf-lib/package.jsonの clean script を維持することschemasの Node ESM import はair-datepicker/locale/*を Vite bundle 側へ取り込む前提で成立しているため、packages/schemas/vite.config.mtsの external 判定を安易に戻さないことconverter/schemas/generatorの単体 build は、workspace dependency の dist が無い clean 状態では root build order に依存すること
Notes For Next Turn
- 次回はこの
PROGRESS.mdを読み、lint warning の整理から進める Phase 1の package build Vite 化は完了済みなので、以降はpdf-lib中心の oxlint warning 整理と playground 周辺確認が主対象