diff --git a/docs/assets/js/common.js b/docs/assets/js/common.js index 77203dd95..10e9a5f96 100644 --- a/docs/assets/js/common.js +++ b/docs/assets/js/common.js @@ -71,6 +71,7 @@ './assets/ts/artplayer-proxy-mediabunny.d.ts', './assets/ts/artplayer-tool-iframe.d.ts', './assets/ts/artplayer.d.ts', + './assets/ts/artplayer-i18n.d.ts', ] for (let index = 0; index < libUris.length; index++) { diff --git a/docs/assets/ts/artplayer-i18n.d.ts b/docs/assets/ts/artplayer-i18n.d.ts new file mode 100644 index 000000000..350b5d04c --- /dev/null +++ b/docs/assets/ts/artplayer-i18n.d.ts @@ -0,0 +1,4 @@ +declare module 'artplayer/i18n/*' { + const language: NonNullable + export default language +} diff --git a/docs/assets/ts/artplayer-plugin-chapter.d.ts b/docs/assets/ts/artplayer-plugin-chapter.d.ts index 950d9cbc3..24d82d985 100644 --- a/docs/assets/ts/artplayer-plugin-chapter.d.ts +++ b/docs/assets/ts/artplayer-plugin-chapter.d.ts @@ -1,14 +1,14 @@ -type Chapters = { +export type Chapters = { start: number end: number title: string }[] -interface Option { +export interface Option { chapters?: Chapters } -interface Result { +export interface Result { name: 'artplayerPluginChapter' update: (option: Option) => void } diff --git a/docs/assets/ts/artplayer.d.ts b/docs/assets/ts/artplayer.d.ts index 42e5a94be..6f298d4f7 100644 --- a/docs/assets/ts/artplayer.d.ts +++ b/docs/assets/ts/artplayer.d.ts @@ -750,12 +750,6 @@ interface I18nValue { export type I18n = Partial>> -declare module 'artplayer/i18n/*' { - const lang: Partial - // @ts-expect-error TS2666 - export default lang -} - export type Bar = 'loaded' | 'played' | 'hover' export interface Events { diff --git a/packages/artplayer-plugin-chapter/ARCHITECTURE.md b/packages/artplayer-plugin-chapter/ARCHITECTURE.md index 5a293e20e..cb31566f0 100644 --- a/packages/artplayer-plugin-chapter/ARCHITECTURE.md +++ b/packages/artplayer-plugin-chapter/ARCHITECTURE.md @@ -15,6 +15,7 @@ method; the update object is required. All implementation modules are TypeScript | `src/types.ts` | Internal aliases derived from the existing public declaration; no runtime imports | | `src/style.less` | Existing CSS classes and theme variables | | `types/artplayer-plugin-chapter.d.ts` | Consumer declaration and compatibility boundary | +| `types/*.d.cts`, `types/*.d.mts` | CJS/ESM bridges sharing the same public types | Dependencies flow from the entry to normalization and rendering. Neither of those modules receives an ArtPlayer instance. Rendering accepts a progress container and @@ -82,7 +83,9 @@ For UI, start at progress.ts/style.less and verify real mouse interaction. For e or cleanup changes, start at index.ts and rerun early destroy/multiple-instance tests. Any public declaration change also needs new/old compiler and tarball consumers. -The public declaration is intentionally retained during the structural migration; -PKG-CHAPTER-04 owns NodeNext ESM and legacy subpath declaration fixes. The frozen +The public declaration remains available to old compilers and exports Chapters, +Option and Result as types. Modern import/require conditions select format-specific +bridges; typesVersions provides the legacy subpath to old resolvers. All bridges +refer to one contract and runtime import paths stay unchanged. The frozen published baseline is under refactor/baselines; never overwrite it with candidate behavior. Physical device, full editor and final release checks remain separate tasks. diff --git a/packages/artplayer-plugin-chapter/README.md b/packages/artplayer-plugin-chapter/README.md index 0d3a95af7..ecd55fcdb 100644 --- a/packages/artplayer-plugin-chapter/README.md +++ b/packages/artplayer-plugin-chapter/README.md @@ -22,6 +22,10 @@ The registered name is `artplayerPluginChapter`. After metadata loads, use `update({})` to clear them. Update is synchronous and requires an options object. Chapter times are seconds; ranges must not overlap. `Infinity` as an end value uses the current duration. +TypeScript users can import `Chapters`, `Option` and `Result` with `import type`. +Modern ESM/CommonJS and `/legacy` share the same API; old TypeScript resolution +keeps the original `.d.ts` entry and a legacy subpath fallback. + The existing implementation sorts and fills the supplied array in place and replaces its Infinity end values. Pass a fresh array when you need to retain the original configuration. After switching media, call update with chapters appropriate to the new duration; initialization listens to metadata once. diff --git a/packages/artplayer-plugin-chapter/package.json b/packages/artplayer-plugin-chapter/package.json index 36a137f82..bc34abe57 100644 --- a/packages/artplayer-plugin-chapter/package.json +++ b/packages/artplayer-plugin-chapter/package.json @@ -19,19 +19,36 @@ ], "exports": { ".": { - "types": "./types/artplayer-plugin-chapter.d.ts", - "import": "./dist/artplayer-plugin-chapter.mjs", - "require": "./dist/artplayer-plugin-chapter.js" + "import": { + "types": "./types/artplayer-plugin-chapter.d.mts", + "default": "./dist/artplayer-plugin-chapter.mjs" + }, + "require": { + "types": "./types/artplayer-plugin-chapter.d.cts", + "default": "./dist/artplayer-plugin-chapter.js" + } }, "./legacy": { - "types": "./types/artplayer-plugin-chapter.d.ts", - "import": "./dist/artplayer-plugin-chapter.legacy.js", - "require": "./dist/artplayer-plugin-chapter.legacy.js" + "import": { + "types": "./types/artplayer-plugin-chapter.d.cts", + "default": "./dist/artplayer-plugin-chapter.legacy.js" + }, + "require": { + "types": "./types/artplayer-plugin-chapter.d.cts", + "default": "./dist/artplayer-plugin-chapter.legacy.js" + } } }, "main": "./dist/artplayer-plugin-chapter.js", "module": "./dist/artplayer-plugin-chapter.mjs", "types": "./types/artplayer-plugin-chapter.d.ts", "legacy": "./dist/artplayer-plugin-chapter.legacy.js", - "browserslist": "last 1 Chrome version" + "browserslist": "last 1 Chrome version", + "typesVersions": { + "*": { + "legacy": [ + "types/artplayer-plugin-chapter.d.ts" + ] + } + } } diff --git a/packages/artplayer-plugin-chapter/tsconfig.json b/packages/artplayer-plugin-chapter/tsconfig.json index 26fdd3d6a..898590bb9 100644 --- a/packages/artplayer-plugin-chapter/tsconfig.json +++ b/packages/artplayer-plugin-chapter/tsconfig.json @@ -1,4 +1,4 @@ { "extends": "../../tsconfig.base.json", - "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.mts", "src/**/*.cts", "types/**/*.d.ts", "../../types/assets.d.ts"] + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.mts", "src/**/*.cts", "types/**/*.d.ts", "types/**/*.d.mts", "types/**/*.d.cts", "../../types/assets.d.ts"] } diff --git a/packages/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts b/packages/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts new file mode 100644 index 000000000..c9a88aafe --- /dev/null +++ b/packages/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts @@ -0,0 +1,11 @@ +import type * as Definition from './artplayer-plugin-chapter.js' + +declare const artplayerPluginChapter: typeof Definition.default + +declare namespace artplayerPluginChapter { + type Chapters = Definition.Chapters + type Option = Definition.Option + type Result = Definition.Result +} + +export = artplayerPluginChapter diff --git a/packages/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts b/packages/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts new file mode 100644 index 000000000..9bdd422b4 --- /dev/null +++ b/packages/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts @@ -0,0 +1,2 @@ +export { default } from './artplayer-plugin-chapter.cjs' +export type { Chapters, Option, Result } from './artplayer-plugin-chapter.js' diff --git a/packages/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts b/packages/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts index 73f8a2611..a52ec0872 100644 --- a/packages/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts +++ b/packages/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts @@ -1,16 +1,16 @@ import type Artplayer from 'artplayer' -type Chapters = { +export type Chapters = { start: number end: number title: string }[] -interface Option { +export interface Option { chapters?: Chapters } -interface Result { +export interface Result { name: 'artplayerPluginChapter' update: (option: Option) => void } diff --git a/packages/artplayer/package.json b/packages/artplayer/package.json index 4287edf89..d28eed1f5 100644 --- a/packages/artplayer/package.json +++ b/packages/artplayer/package.json @@ -19,19 +19,34 @@ ], "exports": { ".": { - "types": "./types/artplayer.d.ts", - "import": "./dist/artplayer.mjs", - "require": "./dist/artplayer.js" + "import": { + "types": "./types/artplayer.d.mts", + "default": "./dist/artplayer.mjs" + }, + "require": { + "types": "./types/artplayer.d.cts", + "default": "./dist/artplayer.js" + } }, "./legacy": { - "types": "./types/artplayer.d.ts", - "import": "./dist/artplayer.legacy.js", - "require": "./dist/artplayer.legacy.js" + "import": { + "types": "./types/artplayer.d.cts", + "default": "./dist/artplayer.legacy.js" + }, + "require": { + "types": "./types/artplayer.d.cts", + "default": "./dist/artplayer.legacy.js" + } }, "./i18n/*": { - "types": "./types/i18n.d.ts", - "import": "./dist/i18n/*.mjs", - "require": "./dist/i18n/*.js" + "import": { + "types": "./types/language.d.mts", + "default": "./dist/i18n/*.mjs" + }, + "require": { + "types": "./types/language.d.cts", + "default": "./dist/i18n/*.js" + } } }, "main": "./dist/artplayer.js", @@ -40,7 +55,7 @@ "typesVersions": { "*": { "i18n/*": [ - "types/i18n.d.ts" + "types/legacy/language.d.ts" ], "legacy": [ "types/artplayer.d.ts" diff --git a/packages/artplayer/tsconfig.json b/packages/artplayer/tsconfig.json index 26fdd3d6a..898590bb9 100644 --- a/packages/artplayer/tsconfig.json +++ b/packages/artplayer/tsconfig.json @@ -1,4 +1,4 @@ { "extends": "../../tsconfig.base.json", - "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.mts", "src/**/*.cts", "types/**/*.d.ts", "../../types/assets.d.ts"] + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.mts", "src/**/*.cts", "types/**/*.d.ts", "types/**/*.d.mts", "types/**/*.d.cts", "../../types/assets.d.ts"] } diff --git a/packages/artplayer/types/README.md b/packages/artplayer/types/README.md new file mode 100644 index 000000000..b57bd6840 --- /dev/null +++ b/packages/artplayer/types/README.md @@ -0,0 +1,28 @@ +# Declaration entrypoints + +`artplayer.d.ts` remains the shared API definition and old TypeScript entry. Its +relative declarations describe the existing player; they are not a claim that the +runtime has already migrated to TypeScript. + +Conditional exports select `artplayer.d.mts` for ESM and `artplayer.d.cts` for CJS +and legacy. The CJS bridge uses `export =` for the real module.exports constructor +and carries existing named types in its namespace. The ESM bridge re-exports that +constructor and the same type identities. Do not copy the class into a second +declaration: instance, ready callback and plugin types must remain consistent. + +Languages use language.d.mts / language.d.cts for modern resolution and +legacy/language.d.ts for old typesVersions resolution. The value shape comes from +I18n's existing dictionary value type (`I18n['en']`, also compatible with TS 4.3.5). +i18n.d.ts contains dictionary definitions without suppressed module augmentation. +The editor's global language module is generated separately as +docs/assets/ts/artplayer-i18n.d.ts so it cannot contaminate npm consumers. + +Top-level types and historical .d.ts filenames remain available; runtime paths and +exports do not change. See TypeScript's declaration module format and conditional +resolution rules: https://www.typescriptlang.org/docs/handbook/modules/reference.html + +When changing types, run `yarn typecheck`, `yarn test:baseline` and +`yarn test:package:release`. They cover default/named types, core/legacy constructors, +chapter/legacy factories, language data, invalid inputs, NodeNext/Bundler and old +TS 4.3.5 consumers. Run `yarn build:ts` to refresh editor declarations. Full editor +behavior and other core declaration/runtime mismatches have CORE-07/SITE tasks. diff --git a/packages/artplayer/types/artplayer.d.cts b/packages/artplayer/types/artplayer.d.cts new file mode 100644 index 000000000..3617a3775 --- /dev/null +++ b/packages/artplayer/types/artplayer.d.cts @@ -0,0 +1,20 @@ +import type * as Definition from './artplayer.js' + +declare const Artplayer: typeof Definition.default +type Artplayer = Definition.default + +declare namespace Artplayer { + type Config = Definition.Config + type Events = Definition.Events + type I18n = Definition.I18n + type Icons = Definition.Icons + type Option = Definition.Option + type Player = Definition.Player + type Setting = Definition.Setting + type SettingOption = Definition.SettingOption + type Subtitle = Definition.Subtitle + type Template = Definition.Template + type Utils = Definition.Utils +} + +export = Artplayer diff --git a/packages/artplayer/types/artplayer.d.mts b/packages/artplayer/types/artplayer.d.mts new file mode 100644 index 000000000..420fe4b99 --- /dev/null +++ b/packages/artplayer/types/artplayer.d.mts @@ -0,0 +1,2 @@ +export { default } from './artplayer.cjs' +export type { Config, Events, I18n, Icons, Option, Player, Setting, SettingOption, Subtitle, Template, Utils } from './artplayer.js' diff --git a/packages/artplayer/types/i18n.d.ts b/packages/artplayer/types/i18n.d.ts index 89e0a4f11..4986660c1 100644 --- a/packages/artplayer/types/i18n.d.ts +++ b/packages/artplayer/types/i18n.d.ts @@ -54,9 +54,3 @@ interface I18nValue { } export type I18n = Partial>> - -declare module 'artplayer/i18n/*' { - const lang: Partial - // @ts-expect-error TS2666 - export default lang -} diff --git a/packages/artplayer/types/language.d.cts b/packages/artplayer/types/language.d.cts new file mode 100644 index 000000000..fb3306c43 --- /dev/null +++ b/packages/artplayer/types/language.d.cts @@ -0,0 +1,4 @@ +import type { I18n } from './i18n.js' + +declare const language: NonNullable +export = language diff --git a/packages/artplayer/types/language.d.mts b/packages/artplayer/types/language.d.mts new file mode 100644 index 000000000..3b243cb0a --- /dev/null +++ b/packages/artplayer/types/language.d.mts @@ -0,0 +1 @@ +export { default } from './language.cjs' diff --git a/packages/artplayer/types/legacy/language.d.ts b/packages/artplayer/types/legacy/language.d.ts new file mode 100644 index 000000000..34de69188 --- /dev/null +++ b/packages/artplayer/types/legacy/language.d.ts @@ -0,0 +1,4 @@ +import type { I18n } from '../i18n' + +declare const language: NonNullable +export default language diff --git a/refactor/baselines/chapter-types-validation.json b/refactor/baselines/chapter-types-validation.json new file mode 100644 index 000000000..6104c13fc --- /dev/null +++ b/refactor/baselines/chapter-types-validation.json @@ -0,0 +1,767 @@ +{ + "task": "PKG-CHAPTER-04", + "capturedAt": "2026-09-10T15:28:48.036Z", + "packages": [ + { + "name": "artplayer", + "version": "5.4.1", + "archive": "artplayer.tgz", + "sha256": "a6003dd79beef54ea8ce028455573382a63e89b0323ac564cda1432bbd14848c", + "files": { + "package/README.md": "9b432fbd3145a33757a93e3fd01b7bd1c3369f51243c5147bca04c6f662b55e1", + "package/dist/artplayer.js": "9ad044a601dafc24f449b690403fb1c343b40e99ffb31043272189fc3c1e7bfa", + "package/dist/artplayer.legacy.js": "71eebcca3192000c58e20f2e3cb76e86c05e33b5a1fab0add20436a5933a3e87", + "package/dist/artplayer.mjs": "ac72f41624383ba853474161affb72b5887644449bf7cb18f6d18edeb2f6f997", + "package/dist/i18n/ar.js": "61c43469ee95a00dc624583f418653e3dcbf48b24ae6a4c203ad986234852365", + "package/dist/i18n/ar.mjs": "68922fdc9f80d3321ea0654c8ff8f5875b6715103d2b14ffcf17f93738b39cf9", + "package/dist/i18n/cs.js": "ad7bbf8853204a6955ef84bfbd932cab3f141a7e73a8145f28ba7a5b2b83b7c0", + "package/dist/i18n/cs.mjs": "29a489be767fda9d46b59c9adbaad323f17a5e67daf7f7aa78b7ce8fb5b4d63c", + "package/dist/i18n/es.js": "aaa95cc9645b734c58fba06fdbcdda962c4cb3a0e7eb6206f06d6168208cd86b", + "package/dist/i18n/es.mjs": "331d2ef74da2eec8f3304fec0b5340c795d9c1eec24e08167c9a7b66bf30973b", + "package/dist/i18n/fa.js": "c998467261cbdfd2c3fb16c0ae4b2c48c409f42f41aea35ed94766f1e12819d5", + "package/dist/i18n/fa.mjs": "b4c98894b46975cebf5ea9088bcf0b5bdfd408bc3c82f4e2e9128133c7de2d4d", + "package/dist/i18n/fr.js": "6b06e16b1fb01c8695fb5c10b32a00421399180de5dc5d845ce17010f2fd3e66", + "package/dist/i18n/fr.mjs": "abe8e3548fa7304f302e2c74818a6176edee8c3b65e33cb6f62e96d130749ee5", + "package/dist/i18n/id.js": "a5832c4bfc03c7f16418bf4b324d9773895541dc823ece9114741794737aad74", + "package/dist/i18n/id.mjs": "a40a433be6ca1ac1ee1810fe805ee60784d349e59b9ad82ea80201d660db4e68", + "package/dist/i18n/pl.js": "2491487062bdfc91d60f17c6e9a83ee196c991216d15f525fe3536b98873da2c", + "package/dist/i18n/pl.mjs": "ad8ea2c03785edbfe1f35761bec21b8a04213f9fa88a794d850bb3973564930f", + "package/dist/i18n/ru.js": "2d3a9ee6533cb6fa961f0a24a25ce63cc76992fca17e1769b6fa75104f8a1529", + "package/dist/i18n/ru.mjs": "a89b8c36cfd7c181c2b31aa823deda3d7c37b56b2b81746338c52ea1c1d93352", + "package/dist/i18n/tr.js": "438b06a4c3f479a2901b0085eaa7bdba8eaef87bdb07ff3faa559c85403fe433", + "package/dist/i18n/tr.mjs": "cc96f9cbb9c1587d5cd8f25b0b9800678ad76e93de089ae42c38dee16e6fe8fa", + "package/dist/i18n/vi.js": "1ffbd62843a902ea2967eab46432d3fc548f5633e53eed104314b523cacc46a8", + "package/dist/i18n/vi.mjs": "7872ded84622bcda20e8c1d70c597c2ba071b50701900efa47cc4683ee17f1a2", + "package/dist/i18n/zh-tw.js": "2d43577f98456488196921e1ec721695a95e1b8c827077286b02ce3fb987e8ff", + "package/dist/i18n/zh-tw.mjs": "7ec638b4babe59d3ab1d3e64abdd74a96fefb260a50e2cd7240f8d50a1340925", + "package/package.json": "b343df9955df9ac0ea71ea775bd0743c6b26c06d3bb7699128f7eac484fa769f", + "package/types/README.md": "d38bb63f9e96f995273f9da6833a8b936a74718ef7b710dbd316530d41ccae07", + "package/types/artplayer.d.cts": "be67cbb6c352944741bca88f969ad1bafa9898049595930e2dc6693d5e7262f5", + "package/types/artplayer.d.mts": "87d1f0e2a7bf7b7bdf700875cb2c77dea8be34ba3ac943e5fd35e8daa99bf241", + "package/types/artplayer.d.ts": "98d3e7b65f9f81fba155da08fd47e4fb25f4c69279e3afd993c4a55070f8a850", + "package/types/component.d.ts": "facfa29d9092fe2c63a7d8357ce7d0faa5e32811d2fedeef6dc8b28ad5d04891", + "package/types/config.d.ts": "c4fd8681bf32b10c743e3e561c532520c8f32e43fd765524850b15e55cb91c72", + "package/types/cssVar.d.ts": "e027d82fb4f01c9ce7559cf679b2d5ee1962d3f7e5b4dd64ca21f472b933efb6", + "package/types/events.d.ts": "98c74aebb82455accc0b3523af5a1145bc9119da58c884200adc36e70a164b02", + "package/types/i18n.d.ts": "3e14759caf71f97f01650839248c8737c42d2c2979dabc43ad92b724da648708", + "package/types/icons.d.ts": "0d8e8e52e52130dd4a29bab551dd7a2a954797e42e92a6e068c85d583e23e6a4", + "package/types/language.d.cts": "1c9e0c47fae3c2d68c3e144d95a55071318a03bb31554dd049109efd3d0f95a4", + "package/types/language.d.mts": "c391e863012c77769e661afbf8fa949e9373aa88d17f58cbba7f5696edb8077f", + "package/types/legacy/language.d.ts": "c452ffd764ff9b29b819b3475c42395d2ea7a33560d8c186ef5df3844b9524c3", + "package/types/option.d.ts": "d4de53930c2fa9d59c77c4324d63f24b057bce6c4d0273c34a0ab06094dcea2c", + "package/types/player.d.ts": "986382bb6b4e82746fd2405092e69d0ef413988887a557a0fd4db85d64b78d54", + "package/types/quality.d.ts": "7ed6ed78cea52991b2f6ddd2bd3b7bd8c5146fdfff7486fe8b814c3e632f1567", + "package/types/setting.d.ts": "d12a75b656fff70cbb30be4bffec46d9c4273636e8722bce971a4d2b188712a1", + "package/types/subtitle.d.ts": "d25b470e47d6a9bd696d9c1ad8adb58e56a208f05695186d513bc8c43c2e8acf", + "package/types/template.d.ts": "68aed9e97d006d6be4fabb8504ca84dafab770b0925f4d6e7319e67c82f21b0d", + "package/types/utils.d.ts": "d3fb67b9187e1c81c6b3850694cf2627e927225ace160ae58c11631e9f673a98" + } + }, + { + "name": "artplayer-plugin-chapter", + "version": "1.1.0", + "archive": "artplayer-plugin-chapter.tgz", + "sha256": "c44d129195028dcb527499d4bf47835ecde215e4d19565eba7f6eed6d6a74af7", + "files": { + "package/ARCHITECTURE.md": "20743bad87a174b0450e0d876b6aa6b2a9f47df296d479511ce7cc9298fdb57c", + "package/README.md": "b95400ff3d525621a15268bb56a2d353aacaaadefde7e735d7abd91a34edd96f", + "package/dist/artplayer-plugin-chapter.js": "6ac3dfe28f46084ac7caedd571b1a97dcee3cf9d708112f1b8bbd6566e1dc5c5", + "package/dist/artplayer-plugin-chapter.legacy.js": "6d9bff885412169e701670961aa00c2e46c4b42c9b9647ff4e6d198777d2a359", + "package/dist/artplayer-plugin-chapter.mjs": "26415cecab2c0198c566cef0232e20123413782d5bad7534a32939b3298617af", + "package/package.json": "24eec6907b3218439189adab6af3f932c1497c47c2d41209311c01042b07fd4f", + "package/types/artplayer-plugin-chapter.d.cts": "4f07514b37453cd6cea8e5aa28fa018ff31738e0d423c11a3b5eccd50ed30bcc", + "package/types/artplayer-plugin-chapter.d.mts": "610179754db36276e161a07bccf4eaba8b4480f053e716a2bcc5a1574871a171", + "package/types/artplayer-plugin-chapter.d.ts": "581aa2862e709601c87a23585f54a969ebd350be56a7469a31ff53f1311b578d" + } + } + ], + "types": [ + { + "compiler": "5.9.3", + "mode": "node10-commonjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/legacy/language.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "nodenext-cjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/language.d.cts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "bundler-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/language.d.cts", + "node_modules/artplayer/types/language.d.mts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "4.3.5", + "mode": "node10-commonjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/legacy/language.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "nodenext-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/language.d.cts", + "node_modules/artplayer/types/language.d.mts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + } + ], + "runtimeChecks": 23, + "knownTypeBlockers": 0, + "strictReleaseExit": 0, + "ciChecks": 62, + "browser": { + "startTime": "2026-09-10T15:21:32.399Z", + "duration": 28003.863999999998, + "expected": 54, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "tests": [ + { + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "candidate rejects NaN and can recover after an invalid update", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "candidate ignores pending metadata initialization after immediate destroy", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "candidate deduplicates stylesheet injection while the document is loading", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "candidate rejects NaN and can recover after an invalid update", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "candidate ignores pending metadata initialization after immediate destroy", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "candidate deduplicates stylesheet injection while the document is loading", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "candidate rejects NaN and can recover after an invalid update", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "candidate ignores pending metadata initialization after immediate destroy", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "candidate deduplicates stylesheet injection while the document is loading", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "factory, registration, input normalization and safe title text", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "explicit source update and core-owned destruction", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "factory, registration, input normalization and safe title text", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "explicit source update and core-owned destruction", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "factory, registration, input normalization and safe title text", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "explicit source update and core-owned destruction", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "factory, registration, input normalization and safe title text", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "explicit source update and core-owned destruction", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "factory, registration, input normalization and safe title text", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "explicit source update and core-owned destruction", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "factory, registration, input normalization and safe title text", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "progress bars, real hover, title edges and boundary seek", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "explicit source update and core-owned destruction", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "published: real playback, pause, seek, switch and destroy", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "candidate: real playback, pause, seek, switch and destroy", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "controlled HTTP media failure emits a real video error", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "Range, media identity and docs candidate routes", + "project": "chromium", + "browser": "153.0.8010.12", + "status": "passed" + }, + { + "title": "published: real playback, pause, seek, switch and destroy", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "candidate: real playback, pause, seek, switch and destroy", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "controlled HTTP media failure emits a real video error", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "Range, media identity and docs candidate routes", + "project": "firefox", + "browser": "155.0", + "status": "passed" + }, + { + "title": "published: real playback, pause, seek, switch and destroy", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "candidate: real playback, pause, seek, switch and destroy", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "controlled HTTP media failure emits a real video error", + "project": "webkit", + "browser": "26.6", + "status": "passed" + }, + { + "title": "Range, media identity and docs candidate routes", + "project": "webkit", + "browser": "26.6", + "status": "passed" + } + ] +} diff --git a/refactor/changes/2026-09-10-PKG-CHAPTER-04-public-types.md b/refactor/changes/2026-09-10-PKG-CHAPTER-04-public-types.md new file mode 100644 index 000000000..0d5745bf5 --- /dev/null +++ b/refactor/changes/2026-09-10-PKG-CHAPTER-04-public-types.md @@ -0,0 +1,41 @@ +# PKG-CHAPTER-04:公开类型与新旧模块消费闭环 + +## 改动 + +chapter 公开 Chapters/Option/Result 类型,保留可选工厂、必填同步 update 和旧声明文件。 +核心与 chapter 增加 .d.cts/.d.mts 桥接,按 import/require 条件选择声明,所有 runtime +目标仍是原文件;legacy 对应真实 CommonJS 导出,旧 TS 解析使用 typesVersions 回退。 +桥接引用同一份 API 声明,不复制 Artplayer 类或要求旧用户升级编译器。 + +核心类型的最小配套修正是试点消费所需的构造器/语言入口,不是核心运行时重构。 +language 值改用格式对应的默认导出,旧编译器回退文件从 I18n['en'] 推导现有字典值类型, +去掉原错误抑制和模块 augmentation。编辑器语言声明由 build:ts 生成独立全局文件并加入 +libUris,核心/chapter 编辑器声明也重新生成;没有手写产物。 + +详见 [chapter 架构](../../packages/artplayer-plugin-chapter/ARCHITECTURE.md) 和 +[核心声明说明](../../packages/artplayer/types/README.md)。采用的格式规则参考 +[TypeScript 官方模块说明](https://www.typescriptlang.org/docs/handbook/modules/reference.html)。 + +## 验证 + +- TS 5.9.3 的 Node10 CommonJS、NodeNext CJS/ESM、Bundler ESM,以及 TS 4.3.5 Node10 + 全部通过:31 个消费场景,包含普通 API、章节参数/命名类型、语言值、legacy 和直接 CJS require。 +- 新增反例验证 Result 字面量 name、必填 update、数字时间、语言值类型和非法字段仍拒绝; + 不是使用 any、skipLibCheck 或宽泛索引消除错误。 +- 实际 tarball 安装后的 23 项运行时与五组严格类型通过,已知诊断为 0; + `yarn test:package:release` 正常退出。历史 11 条候选已知错误全部移除,原发布基线保留。 +- 安装产物三浏览器 54 项通过、无跳过/重试;最终重新打包后的 runtime 文件 SHA 与浏览器 + 实际加载的文件相同。报告、声明/入口指纹见 [执行记录](../baselines/chapter-types-validation.json)。 +- `yarn ci:check` 62 项 Node/基线测试通过;新旧消费者正反例、严格源类型和 lint 通过。 + `yarn build:ts` 成功,只有 core/chapter、语言声明和其加载清单发生实际生成内容变化。 + +补上类型回退后,旧 BASE-05 消费器检测到向上解析到 workspace 的错误:其临时目录原来在仓库 +内。现在使用仓库外 OS 临时目录并验证清理边界,隔离断言保持不变;冻结发布结果逐项对照通过。 +这证明旧版历史失败没有被新声明覆盖,未重新生成或放宽基线。 + +## 边界与接续 + +关闭 BASE-TYPE-01 和 BASE-TYPE-03;BASE-TYPE-04 等其余核心声明/运行时差异仍开放。 +未改核心运行时代码、依赖或版本;没有推送/发布。严格打包通过不代表完成全部插件、完整编辑器、 +真机/SDK 和远端 CI 验收。下一项按依赖推进试点汇总及 ENG-10,再进入核心源码拆分。 +回退本任务独立提交即可恢复声明、manifest、测试与生成编辑器内容;chapter TS 运行时提交独立保留。 diff --git a/refactor/ci-setup.md b/refactor/ci-setup.md index 8eefcb887..7512436d5 100644 --- a/refactor/ci-setup.md +++ b/refactor/ci-setup.md @@ -33,7 +33,8 @@ Actions 固定完整 SHA,Node 来自 .node-version,Yarn 固定 1.22.22;安 ENG-07 将浏览器候选改为 `yarn test:package` 实际打包并安装后的文件,使用输出映射禁止 回退到源码。安装/构建日志、tarball、成员指纹和浏览器结果一并上传,构建快照的 node_modules -链接不上传。初始包范围为 core/chapter;精确历史类型诊断仍阻止严格发布检查通过。 +链接不上传。初始包范围为 core/chapter;PKG-CHAPTER-04 已将这两个包的已知类型诊断清零, +严格打包检查现已通过,仍不等于整批发布准入或远端 CI 已通过。 见 [消费者说明](../test/package/README.md)。本地已验证,远端执行仍待 CI-04。 .github/workflows/pages.yml 仅支持手动运行,限定 master,且仓库变量 PAGES_DEPLOY_ENABLED 必须为 true。初始启用状态未经远端核实;没有修改该变量或其他 GitHub 设置。保留此门槛用于 CI-02 完成域名、路径和远端配置验收后再启用,不能直接自动部署 PR 产物。 diff --git a/refactor/plan.md b/refactor/plan.md index 58bfbb096..5e3e88cd1 100644 --- a/refactor/plan.md +++ b/refactor/plan.md @@ -4,7 +4,7 @@ 基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 214 项,范围 22 个包及工作区/示例。 -状态:todo 181 / doing 0 / blocked 0 / done 33 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 +状态:todo 180 / doing 0 / blocked 0 / done 34 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。 @@ -135,7 +135,7 @@ | PKG-CHAPTER-01 | artplayer-plugin-chapter
核对包契约与历史用法 | BASE-05 | chapters 时间区间、update、name 和进度 DOM 清单 | 源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结 | M | done | | PKG-CHAPTER-02 | artplayer-plugin-chapter
建立特有行为与错误测试 | PKG-CHAPTER-01, ENG-03, ENG-05 | 区间重叠/空列表/边界 seek、hover 标题和 update 用例 | 旧版本行为可重跑,成功/失败/切源/销毁有必要断言;修正 BASE-TYPE-02 的可选参数声明并补正反例 | M | done | | PKG-CHAPTER-03 | artplayer-plugin-chapter
以 TypeScript 拆分内部职责与资源 | PKG-CHAPTER-02, ENG-07 | 以严格 TS 拆分区间计算、进度 DOM、事件生命周期与样式注入;公开声明消费在 04 闭环 | 不依赖新核心方法或大范围设置重构;旧 API/事件和资源通过,必要适配限包内 | M | done | -| PKG-CHAPTER-04 | artplayer-plugin-chapter
迁移自有源码和公开类型 | PKG-CHAPTER-03, ENG-04, ENG-06 | 承接 03 的自有源码 TS 化,完善公开 Chapters/Option/Result 与 update 推导,关闭声明模块解析和旧消费差异 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容;处理 BASE-TYPE-01/03,保持运行时和新旧 TS 模块解析消费 | M | todo | +| PKG-CHAPTER-04 | artplayer-plugin-chapter
迁移自有源码和公开类型 | PKG-CHAPTER-03, ENG-04, ENG-06 | 承接 03 的自有源码 TS 化,完善公开 Chapters/Option/Result 与 update 推导,关闭声明模块解析和旧消费差异 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容;处理 BASE-TYPE-01/03,保持运行时和新旧 TS 模块解析消费 | M | done | | PKG-CHAPTER-05 | artplayer-plugin-chapter
验证新旧核心和组合 | PKG-CHAPTER-04, CORE-22 | chapter + quality/thumbnail、移动和全屏进度场景 | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | M | todo | | PKG-CHAPTER-06 | artplayer-plugin-chapter
验证分发并同步文档 | PKG-CHAPTER-05, ENG-07 | chapter.js 示例、产物和变更记录 | tarball 入口/资源、类型、8082 demo 和 README 一致,有回退记录 | M | todo | @@ -436,3 +436,4 @@ - PKG-CHAPTER-01: [记录](changes/2026-09-10-PKG-CHAPTER-01-contract.md) [记录](baselines/chapter-contract.md) - PKG-CHAPTER-02: [记录](changes/2026-09-10-PKG-CHAPTER-02-tests.md) [记录](baselines/chapter-validation.json) - PKG-CHAPTER-03: [记录](changes/2026-09-10-PKG-CHAPTER-03-typescript-modules.md) [记录](baselines/chapter-migration-validation.json) +- PKG-CHAPTER-04: [记录](changes/2026-09-10-PKG-CHAPTER-04-public-types.md) [记录](baselines/chapter-types-validation.json) diff --git a/refactor/progress.md b/refactor/progress.md index 890661a77..b7b80a206 100644 --- a/refactor/progress.md +++ b/refactor/progress.md @@ -1,5 +1,9 @@ # 进度与证据 +## 当前实施:PKG-CHAPTER-04 类型消费闭环完成 + +chapter 公开命名类型、核心/插件 CJS/ESM 桥接及旧 legacy/language 回退通过五组编译模式(31 场景),实际 tarball 严格发布检查诊断为零;62 项 Node/基线测试和 54 项安装产物三浏览器检查通过。关闭 BASE-TYPE-01/03,旧发布基线不改。见 [交付](changes/2026-09-10-PKG-CHAPTER-04-public-types.md)。当前 214 项,34 完成、180 待办。生产运行时:chapter 已 TS 化,核心仍未迁移;本任务核心只修正类型入口。03 提交 48660c4e;下一项 ENG-10 接续现有风险/可靠性规则,然后 PILOT-01 汇总现有试点证据,进入 CORE-01。 + ## 当前实施:PKG-CHAPTER-03 首包 TS 源码拆分完成 chapter 已从单体 JS 入口改为五个 TS 文件,区间、DOM、生命周期和样式职责清楚;修复标题、NaN、销毁和重复样式问题。61 项 Node/基线检查、源码及安装产物各 54 项三浏览器测试通过;三格式产物已生成。见 [交付](changes/2026-09-10-PKG-CHAPTER-03-typescript-modules.md)。当前 214 项,33 完成、181 待办。生产迁移:chapter 自有运行时已 TS 化,核心尚未开始。ENG-07 提交 a0286c4e;下一项 PKG-CHAPTER-04 公开类型与消费者闭环。 diff --git a/refactor/risk-guide.md b/refactor/risk-guide.md index cfbbd8c58..0c050b365 100644 --- a/refactor/risk-guide.md +++ b/refactor/risk-guide.md @@ -4,6 +4,9 @@ BASE-07 将先前基线发现和第三方来源缺口纳入同一份责任台账 ## 如何读取状态 +PKG-CHAPTER-04 另关闭 BASE-TYPE-01/03:新旧编译器及实际 tarball 消费的默认导出、语言与 +legacy 路径通过,严格打包诊断清零。完整证据与其余未关闭问题仍以 risks.json 为准。 + BASE-07 初始登记 39 项;后续新增和关闭状态以 risks.json 为准。ENG-06 修复 BUILD-AMD-01,PKG-CHAPTER-02 修复 BASE-TYPE-02,均有独立回归证据。reproduced 表示已保存复现结果;source-observed 表示在源码、声明或产物中看到事实;unverified 表示来源、环境或行为仍需取证。证据等级与处理状态互相独立,不能把全部事项称为缺陷,也不能因建立了测试基线而自动接受旧缺陷。 其中 15 项来自生命周期、DOM/示例、消费者类型/分发和性能基线;其余包含发布来源、站点分发、素材来源、8 组内嵌资源和 12 个集成边界。每项都列出负责的任务 ID、证据路径、兼容处理路线与关闭条件。具体复现仍以原基线报告为准。 diff --git a/refactor/risk-table.md b/refactor/risk-table.md index 383d87f5d..114592eaa 100644 --- a/refactor/risk-table.md +++ b/refactor/risk-table.md @@ -13,9 +13,9 @@ | BASE-DOM-01 | open / 已复现 | 控件 Tab 不可达 | CORE-23, CORE-17 | | BASE-DOM-02 | open / 已复现 | 窄容器中控件裁切 | CORE-13, CORE-14 | | BASE-DEMO-01 | open / 源码/产物事实 | 旧 thumbnail 插件示例不对应当前 workspace 包 | SITE-01, EX-03 | -| BASE-TYPE-01 | open / 已复现 | NodeNext ESM 默认导出与声明互操作失配 | ENG-04, CORE-07, PKG-CHAPTER-04 | +| BASE-TYPE-01 | resolved / 已复现 | NodeNext ESM 默认导出与声明互操作失配 | ENG-04, CORE-07, PKG-CHAPTER-04 | | BASE-TYPE-02 | resolved / 已复现 | chapter 可选运行时参数被声明为必填 | PKG-CHAPTER-02 | -| BASE-TYPE-03 | open / 已复现 | chapter legacy 缺旧模块解析的声明回退 | ENG-04, PKG-CHAPTER-04 | +| BASE-TYPE-03 | resolved / 已复现 | chapter legacy 缺旧模块解析的声明回退 | ENG-04, PKG-CHAPTER-04 | | BASE-TYPE-04 | open / 源码/产物事实 | plugins.add / toggle 的旧声明返回值与运行时不同 | CORE-07 | | BASE-DIST-01 | open / 源码/产物事实 | thumbnail tool 分发入口与类型文件缺失 | PKG-TOOL-THUMB-01, PKG-TOOL-THUMB-04 | | BASE-PERF-01 | open / 已复现 | 销毁后的 resize 防抖重新创建 notice timer | CORE-17, CORE-04, CORE-18 | diff --git a/refactor/risks.json b/refactor/risks.json index 75d9c0f7f..34fe314ef 100644 --- a/refactor/risks.json +++ b/refactor/risks.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "task": "BASE-07", "sourceCommit": "e01f39ff", - "updatedAt": "2026-09-10T14:41:52.219Z", + "updatedAt": "2026-09-10T15:27:41.538Z", "note": "Open means closure evidence is outstanding; source-observed and unverified are not reproduced runtime bugs. A source issue already mitigated in the workspace still requires candidate regression evidence. No accepted-with-scope item is implied by baseline task completion.", "items": [ { @@ -147,7 +147,7 @@ "id": "BASE-TYPE-01", "title": "NodeNext ESM 默认导出与声明互操作失配", "confirmation": "reproduced", - "status": "open", + "status": "resolved", "owners": [ "ENG-04", "CORE-07", @@ -157,7 +157,16 @@ "refactor/baselines/consumers.json" ], "compatibleResolution": "分配 ESM/CJS 声明入口,保留旧解析模式,避免 any/skipLibCheck 掩盖。", - "closureCriteria": "四模式原合法消费通过,NodeNext ESM 对实际默认导出可构造/调用。" + "closureCriteria": "四模式原合法消费通过,NodeNext ESM 对实际默认导出可构造/调用。", + "resolutionEvidence": [ + "refactor/changes/2026-09-10-PKG-CHAPTER-04-public-types.md", + "refactor/baselines/chapter-types-validation.json", + "test/types/chapter-exports.ts", + "test/types/language-value.ts", + "test/types/commonjs.cts", + "refactor/scripts/types.test.mjs" + ], + "resolutionRationale": "格式匹配的 CJS/ESM 声明及旧 TS legacy/language 回退通过五组编译模式;实际安装 tarball 的已知诊断清零,运行时路径/导出不变,旧发布基线隔离重跑保持原失败。" }, { "id": "BASE-TYPE-02", @@ -186,7 +195,7 @@ "id": "BASE-TYPE-03", "title": "chapter legacy 缺旧模块解析的声明回退", "confirmation": "reproduced", - "status": "open", + "status": "resolved", "owners": [ "ENG-04", "PKG-CHAPTER-04" @@ -195,7 +204,16 @@ "refactor/baselines/consumers.json" ], "compatibleResolution": "保留 legacy 文件和导入路径,补旧解析类型回退。", - "closureCriteria": "Node10 解析和 NodeNext/Bundler 消费均有正向证据。" + "closureCriteria": "Node10 解析和 NodeNext/Bundler 消费均有正向证据。", + "resolutionEvidence": [ + "refactor/changes/2026-09-10-PKG-CHAPTER-04-public-types.md", + "refactor/baselines/chapter-types-validation.json", + "test/types/chapter-exports.ts", + "test/types/language-value.ts", + "test/types/commonjs.cts", + "refactor/scripts/types.test.mjs" + ], + "resolutionRationale": "格式匹配的 CJS/ESM 声明及旧 TS legacy/language 回退通过五组编译模式;实际安装 tarball 的已知诊断清零,运行时路径/导出不变,旧发布基线隔离重跑保持原失败。" }, { "id": "BASE-TYPE-04", diff --git a/refactor/scripts/consumers.mjs b/refactor/scripts/consumers.mjs index c0222b5b2..2175cf78c 100644 --- a/refactor/scripts/consumers.mjs +++ b/refactor/scripts/consumers.mjs @@ -1,6 +1,7 @@ import assert from 'node:assert/strict' import { execFileSync } from 'node:child_process' import fs from 'node:fs' +import os from 'node:os' import path from 'node:path' import { fileURLToPath } from 'node:url' import ts from 'typescript' @@ -8,7 +9,7 @@ import { ensureArchive, hash, readMember, refactorDir } from './releases.mjs' const root = path.resolve(refactorDir, '..') const fixtures = path.join(refactorDir, 'fixtures/consumers') -const parent = path.join(refactorDir, '.cache/consumers') +const parent = os.tmpdir() const reportPath = path.join(refactorDir, 'baselines/consumers.json') const fixtureNames = ['runtime.cjs', 'public.ts', 'language.ts', 'optional-chapter.ts', 'legacy-plugin.ts'] export const runtimeChecks = [ @@ -22,7 +23,7 @@ export const runtimeChecks = [ export async function runConsumers() { const releases = JSON.parse(fs.readFileSync(path.join(refactorDir, 'baselines/releases.json'), 'utf8')).releases fs.mkdirSync(parent, { recursive: true }) - const dir = fs.mkdtempSync(path.join(parent, 'published-')) + const dir = fs.mkdtempSync(path.join(parent, 'artplayer-published-')) try { const provenance = [] for (const release of releases) { @@ -68,8 +69,8 @@ export async function runConsumers() { fixtureHashAlgorithm: 'sha256-lf', fixtures: Object.fromEntries(fixtureNames.map(name => [name, hash(fs.readFileSync(path.join(fixtures, name), 'utf8').replaceAll('\r\n', '\n'))])), runtime, types } } finally { - const resolved = path.resolve(dir) - assert(resolved.startsWith(path.resolve(parent) + path.sep) && path.basename(resolved).startsWith('published-'), 'Unsafe consumer cleanup') + const resolved = fs.realpathSync(dir) + assert(path.dirname(resolved) === fs.realpathSync(parent) && path.basename(resolved).startsWith('artplayer-published-'), 'Unsafe consumer cleanup') fs.rmSync(resolved, { recursive: true, force: true }) } } diff --git a/refactor/scripts/types.test.mjs b/refactor/scripts/types.test.mjs index 1374f63cf..078a22a8d 100644 --- a/refactor/scripts/types.test.mjs +++ b/refactor/scripts/types.test.mjs @@ -46,3 +46,18 @@ test('Chapter optional factory parameters preserve strict update and data types const diagnostics = checkConsumer(ts, 'bundler-esm', unguarded) assert.equal(diagnostics.length, 3, 'Invalid update, title and null option must each fail') }) + +test('Chapter named types and legacy aliases remain strict in modern and old consumers', () => { + const source = fs.readFileSync(path.join(refactorDir, '../test/types/chapter-exports.ts'), 'utf8') + const language = fs.readFileSync(path.join(refactorDir, '../test/types/language-value.ts'), 'utf8') + for (const [compiler, mode] of [[ts, 'nodenext-esm'], [ts, 'nodenext-cjs'], [compat, 'node10-commonjs']]) { + assert.deepEqual(checkConsumer(compiler, mode, source), []) + const invalid = source.replaceAll(/\/\/ @ts-expect-error[^\n]*\n/g, '') + assert.equal(checkConsumer(compiler, mode, invalid).length, 3) + assert.deepEqual(checkConsumer(compiler, mode, language), []) + assert.equal(checkConsumer(compiler, mode, language.replaceAll(/\/\/ @ts-expect-error[^\n]*\n/g, '')).length, 2) + } + const commonjs = fs.readFileSync(path.join(refactorDir, '../test/types/commonjs.cts'), 'utf8') + assert.deepEqual(checkConsumer(ts, 'nodenext-cjs', commonjs), []) + assert.equal(checkConsumer(ts, 'nodenext-cjs', commonjs.replaceAll(/\/\/ @ts-expect-error[^\n]*\n/g, '')).length, 1) +}) diff --git a/refactor/tasks.json b/refactor/tasks.json index 4d8467083..15b85832e 100644 --- a/refactor/tasks.json +++ b/refactor/tasks.json @@ -1205,11 +1205,14 @@ "ENG-04", "ENG-06" ], - "status": "todo", + "status": "done", "risk": "M", "deliverable": "承接 03 的自有源码 TS 化,完善公开 Chapters/Option/Result 与 update 推导,关闭声明模块解析和旧消费差异", "acceptance": "严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容;处理 BASE-TYPE-01/03,保持运行时和新旧 TS 模块解析消费", - "evidence": [] + "evidence": [ + "changes/2026-09-10-PKG-CHAPTER-04-public-types.md", + "baselines/chapter-types-validation.json" + ] }, { "id": "PKG-CHAPTER-05", diff --git a/refactor/typechecking.md b/refactor/typechecking.md index 8ebf29584..3a5ccdb30 100644 --- a/refactor/typechecking.md +++ b/refactor/typechecking.md @@ -1,5 +1,11 @@ # 已实现的类型检查与迁移入口 +PKG-CHAPTER-04 已修复核心/chapter 的条件类型入口、language 与 chapter legacy 回退。 +当前五组编译模式均要求零诊断,覆盖默认/命名类型、legacy、语言与 CJS require 形式; +七条历史 NodeNext 诊断和打包额外四条诊断的候选豁免已移除,冻结发布基线不变。 +旧编译器仍使用 TS 4.3.5 和原 .d.ts 文件。以下 ENG-04 说明保留初始建立时的历史背景, +当前实际入口以 scripts/typecheck.mjs、包内类型文档和任务变更记录为准。 + ENG-04 使用开发编译器 TypeScript 5.9.3,并将 TypeScript 4.3.5 作为 npm alias typescript-compat 固定在根开发依赖。后者仅用于旧编译器消费回归,不进入播放器运行依赖或产物。Yarn 锁文件校验现在接受精确版本的 npm alias,仍拒绝范围和浮动版本。 ## 命令及真实覆盖 diff --git a/scripts/build-ts.js b/scripts/build-ts.js index e1e231fb4..cf8deff1b 100644 --- a/scripts/build-ts.js +++ b/scripts/build-ts.js @@ -57,7 +57,9 @@ console.log(`✨ Built ${artplayerTSoutput}`); } pluginFiles.sort() - const allFiles = [...pluginFiles, 'artplayer.d.ts'] + const languageFile = 'artplayer-i18n.d.ts' + fs.writeFileSync(path.join('docs/assets/ts', languageFile), `declare module 'artplayer/i18n/*' {\n const language: NonNullable\n export default language\n}\n`) + const allFiles = [...pluginFiles, 'artplayer.d.ts', languageFile] const eslint = new ESLint({ fix: true, fixTypes: ['layout'] }) const results = await eslint.lintFiles(allFiles.map(file => path.join('docs/assets/ts', file))) await ESLint.outputFixes(results) diff --git a/scripts/package-consumer.mjs b/scripts/package-consumer.mjs index 4c15ff7c0..b58e1d91a 100644 --- a/scripts/package-consumer.mjs +++ b/scripts/package-consumer.mjs @@ -38,11 +38,13 @@ export function typeConsumers(dir) { for (const [compiler, mode] of [[ts, 'node10-commonjs'], [ts, 'nodenext-cjs'], [ts, 'bundler-esm'], [compat, 'node10-commonjs'], [ts, 'nodenext-esm']]) { const next = mode.startsWith('nodenext') const extension = next ? (mode.endsWith('-cjs') ? 'cts' : 'mts') : 'ts' - const inputs = [...(mode === 'nodenext-esm' ? ['public'] : ['public', 'chapter-options']), 'language', 'legacy-plugin'] + const inputs = ['public', 'chapter-options', 'chapter-exports', 'language-value', 'language', 'legacy-plugin'] + if (mode === 'nodenext-cjs') + inputs.push('commonjs') const files = inputs.map((name) => { const file = path.join(dir, `${name}.${extension}`) const folder = ['language', 'legacy-plugin'].includes(name) ? 'refactor/fixtures/consumers' : 'test/types' - fs.copyFileSync(path.join(workspace, folder, `${name}.ts`), file) + fs.copyFileSync(path.join(workspace, folder, `${name}.${name === 'commonjs' ? 'cts' : 'ts'}`), file) return file }) const options = { diff --git a/scripts/typecheck.mjs b/scripts/typecheck.mjs index 58b34367d..bc5cac2fb 100644 --- a/scripts/typecheck.mjs +++ b/scripts/typecheck.mjs @@ -70,16 +70,14 @@ export function runTypechecks() { sourceCount += result.files.filter(file => relative(file).includes('/src/') && !/\.d\.[cm]?ts$/.test(file)).length console.log(`Strict project passed: ${relative(config)} (${result.files.length} root files)`) } - for (const mode of ['node10-commonjs', 'nodenext-cjs', 'bundler-esm']) { - assert.deepEqual(checkConsumer(ts, mode), [], `Current consumer failed: ${mode}`) - console.log(`Consumer passed: TS ${ts.version} ${mode}`) + for (const [compiler, mode] of [[ts, 'node10-commonjs'], [ts, 'nodenext-cjs'], [ts, 'bundler-esm'], [ts, 'nodenext-esm'], [compat, 'node10-commonjs']]) { + for (const fixture of ['test/types/public.ts', 'test/types/chapter-options.ts', 'test/types/chapter-exports.ts', 'test/types/language-value.ts', 'refactor/fixtures/consumers/language.ts', 'refactor/fixtures/consumers/legacy-plugin.ts']) { + assert.deepEqual(checkConsumer(compiler, mode, fs.readFileSync(path.join(root, fixture), 'utf8')), [], `Consumer failed: TS ${compiler.version} ${mode} ${fixture}`) + } + if (mode === 'nodenext-cjs') + assert.deepEqual(checkConsumer(compiler, mode, fs.readFileSync(path.join(root, 'test/types/commonjs.cts'), 'utf8')), [], 'CommonJS export assignment consumer failed') + console.log(`Consumers passed: TS ${compiler.version} ${mode}`) } - assert.deepEqual(checkConsumer(compat, 'node10-commonjs'), [], 'Old compiler consumer failed') - console.log(`Consumer passed: TS ${compat.version} node10-commonjs`) - const expected = read('test/types/known-diagnostics.json') - const diagnostics = checkConsumer(ts, 'nodenext-esm') - assert.deepEqual(diagnostics, expected.diagnostics, 'NodeNext ESM changed: review BASE-TYPE-01; a fix needs updated success assertions') - console.log(`Historical failure retained: ${expected.risk}, ${diagnostics.length} NodeNext ESM diagnostics; this is not candidate approval`) console.log(`TypeScript production source files checked: ${sourceCount}; unmigrated JS is not counted`) } diff --git a/test/package/README.md b/test/package/README.md index fd8520538..7d2dcb121 100644 --- a/test/package/README.md +++ b/test/package/README.md @@ -22,8 +22,10 @@ export restrictions and shared Emitter behavior. Public property descriptors and default configuration are compared against the fixed published core/chapter. This is a targeted compatibility check, not a complete behavioral API comparison. -Public, chapter-options, language and legacy-plugin TypeScript consumers run with -TS 5.9.3 (Node10, NodeNext CJS/ESM and Bundler) and TS 4.3.5 (Node10). Exact known +Public, chapter-options, chapter-exports, language and legacy-plugin consumers run with +TS 5.9.3 (Node10, NodeNext CJS/ESM and Bundler) and TS 4.3.5 (Node10). NodeNext CJS also +checks import-equals/require and namespaced types. PKG-CHAPTER-04 resolved the initial +type failures; all five groups now require zero diagnostics. Exact known diagnostics are referenced by `known-types.json` and `test/types/known-diagnostics.json`. Unexpected errors and unexpectedly removed errors both require investigation. Remove a known case when its owning task fixes it; keep frozen release evidence intact. diff --git a/test/package/known-types.json b/test/package/known-types.json index dcf3d0d8a..2f9f1f1fd 100644 --- a/test/package/known-types.json +++ b/test/package/known-types.json @@ -1,8 +1,4 @@ { "note": "Exact published diagnostic references, not release waivers. Remove a case only with a verified fix; never edit the frozen baseline to accept a candidate regression.", - "cases": [ - { "mode": "node10-commonjs", "fixture": "legacy-plugin.ts", "risk": "BASE-TYPE-03" }, - { "mode": "nodenext-esm", "fixture": "legacy-plugin.ts", "risk": "BASE-TYPE-01" }, - { "mode": "nodenext-esm", "fixture": "language.ts", "risk": "BASE-TYPE-01" } - ] + "cases": [] } diff --git a/test/types/chapter-exports.ts b/test/types/chapter-exports.ts new file mode 100644 index 000000000..680d5e4fb --- /dev/null +++ b/test/types/chapter-exports.ts @@ -0,0 +1,24 @@ +import type { Option as PlayerOption } from 'artplayer' +import type { Chapters, Option, Result } from 'artplayer-plugin-chapter' +import Artplayer from 'artplayer' +import ArtplayerLegacy from 'artplayer/legacy' +import chapter from 'artplayer-plugin-chapter' +import chapterLegacy from 'artplayer-plugin-chapter/legacy' + +const chapters: Chapters = [{ start: 0, end: Infinity, title: 'First' }] +const option: Option = { chapters } +const playerOption: PlayerOption = { container: '#player', url: 'video.mp4', plugins: [chapter(option)] } +const art: Artplayer = new ArtplayerLegacy(playerOption) +const legacy: ArtplayerLegacy = new Artplayer(playerOption) +const result: Result = chapter(option)(art) +const oldEntry: Result = chapterLegacy()(legacy) +result.update(option) +oldEntry.update({}) + +// @ts-expect-error Result name is a stable literal, not an arbitrary string. +const invalidName: Result['name'] = 'chapter' +// @ts-expect-error Required update option remains required through the legacy entry. +oldEntry.update() +// @ts-expect-error Chapters do not accept string endpoints. +const invalid: Chapters = [{ start: 0, end: '8', title: 'Bad' }] +void [invalidName, invalid] diff --git a/test/types/commonjs.cts b/test/types/commonjs.cts new file mode 100644 index 000000000..d7a3119f6 --- /dev/null +++ b/test/types/commonjs.cts @@ -0,0 +1,13 @@ +import Artplayer = require('artplayer') +import chapter = require('artplayer-plugin-chapter') +import legacy = require('artplayer-plugin-chapter/legacy') +import french = require('artplayer/i18n/fr') + +const option: Artplayer.Option = { container: '#player', url: 'video.mp4', i18n: { fr: french } } +const art: Artplayer = new Artplayer(option) +const result: chapter.Result = chapter()(art) +const old: legacy.Result = legacy()(art) +result.update({}) +old.update({}) +// @ts-expect-error CommonJS callers retain strict endpoint types. +chapter({ chapters: [{ start: '0', end: 8, title: 'Invalid' }] }) diff --git a/test/types/known-diagnostics.json b/test/types/known-diagnostics.json index 4f9949f1d..10c9fb895 100644 --- a/test/types/known-diagnostics.json +++ b/test/types/known-diagnostics.json @@ -5,49 +5,6 @@ "CORE-07", "PKG-CHAPTER-04" ], - "scope": "Existing workspace NodeNext ESM failure, not a candidate waiver. Remove expected failures when a documented fix adds passing consumer assertions.", - "diagnostics": [ - { - "file": "test/types/consumer.ts", - "code": 2349, - "line": 8, - "message": "This expression is not callable.\n Type 'typeof import(\"/packages/artplayer-plugin-chapter/types/artplayer-plugin-chapter\")' has no call signatures." - }, - { - "file": "test/types/consumer.ts", - "code": 2351, - "line": 10, - "message": "This expression is not constructable.\n Type 'typeof import(\"/packages/artplayer/types/artplayer\")' has no construct signatures." - }, - { - "file": "test/types/consumer.ts", - "code": 7006, - "line": 10, - "message": "Parameter 'player' implicitly has an 'any' type." - }, - { - "file": "test/types/consumer.ts", - "code": 2709, - "line": 12, - "message": "Cannot use namespace 'Artplayer' as a type." - }, - { - "file": "test/types/consumer.ts", - "code": 2683, - "line": 12, - "message": "'this' implicitly has type 'any' because it does not have a type annotation." - }, - { - "file": "test/types/consumer.ts", - "code": 2339, - "line": 17, - "message": "Property 'html' does not exist on type 'typeof import(\"/packages/artplayer/types/artplayer\")'." - }, - { - "file": "test/types/consumer.ts", - "code": 2349, - "line": 18, - "message": "This expression is not callable.\n Type 'typeof import(\"/packages/artplayer-plugin-chapter/types/artplayer-plugin-chapter\")' has no call signatures." - } - ] + "scope": "Resolved by PKG-CHAPTER-04. Historical failures remain frozen under refactor/baselines/consumers.json; current consumers must have zero diagnostics.", + "diagnostics": [] } diff --git a/test/types/language-value.ts b/test/types/language-value.ts new file mode 100644 index 000000000..809351caf --- /dev/null +++ b/test/types/language-value.ts @@ -0,0 +1,10 @@ +import type { I18n } from 'artplayer' +import french from 'artplayer/i18n/fr' + +const dictionary: NonNullable = french +const close: string | undefined = french.Close +// @ts-expect-error Translation values cannot be numbers. +const numeric: number = french.Close +// @ts-expect-error Language values do not have a permissive arbitrary-key index. +const missing = french.notATranslation +void [dictionary, close, numeric, missing]