发布

  • chore: release v0.3.0 (#249)

    frostbyte_neo 发布于 2026-04-13 23:16:06 +00:00

    Summary

    Coordinated minor bump across all published packages. No source changes in this PR itself; it is the version stamp for everything that landed on main since v0.2.5.

    Version bumps

    Package from to
    @hyperframes/cli 0.2.5 0.3.0
    @hyperframes/core 0.2.5 0.3.0
    @hyperframes/engine 0.2.5 0.3.0
    @hyperframes/player 0.2.7 0.3.0
    @hyperframes/producer 0.2.5 0.3.0
    @hyperframes/studio 0.2.9 0.3.0

    Between 0.2.5 and this release, player and studio received several patch versions on npm as we iterated on the bundler, entry point, and SSR issues. 0.3.0 collapses that into a single coordinated minor so the ecosystem is aligned again.

    What is in v0.3.0

    @hyperframes/player

    Restored package entry points to the compiled dist/ output. 0.2.5 shipped with "main": "./src/hyperframes-player.ts" but the published tarball only included dist/ via the "files" field. Every consumer trying to import the package failed with Module not found: Can't resolve '@hyperframes/player'. Entry points now point at the built JS/.d.ts files inside dist/.

    DOM-based root timeline resolution in the ready probe. In a bundled preview, window.__timelines contains the master composition alongside its sub-compositions, for example:

    {
      main: GSAPTimeline(14s),
      intro: GSAPTimeline(1.5s),
      'scene2-4-canvas': GSAPTimeline(12.6s),
      'scene5-logo-outro': GSAPTimeline(3.2s),
    }
    

    The probe used to select the adapter with keys[keys.length - 1]. Object key ordering meant the last-registered sub-composition would win, so the ready event reported a sub-composition's duration (e.g. 3.2s) instead of the master's 14s. The probe now looks up the root composition id from the outermost [data-composition-id] element in the iframe DOM and uses its key. Falls back to the last key when no element is present, so standalone sub-composition previews keep working.

    @hyperframes/studio

    useTimelinePlayer.getAdapter() uses the same DOM-based root id lookup as the player. Previously play, pause, seek, and duration readout were all driven by whichever sub-composition happened to register its timeline last.

    Player.tsx loads @hyperframes/player lazily. The component used to call import "@hyperframes/player" at module scope, which runs the package's customElements.define(...) side effect during module evaluation. HTMLElement does not exist in the Node runtime, so any consumer page that transitively imported the studio during server rendering threw:

    ReferenceError: HTMLElement is not defined
      at module evaluation (@hyperframes/studio/src/player/components/Player.tsx)
    

    The import now runs inside the mount effect via import(...) so it only evaluates in the browser. Added a cancellation flag and deferred cleanup so a fast unmount before the dynamic import resolves does not leak listeners or DOM nodes.

    Captions module imports stripped of .js extensions. Files under src/captions/ imported siblings as ./types.js and ./parser.js. That is legal ESM TypeScript but Turbopack and several other bundlers refuse to resolve those specifiers against .ts files inside node_modules, breaking any consumer build that transitively pulled in the captions module. Captions now uses extensionless imports, matching the rest of the studio codebase.

    @hyperframes/core, @hyperframes/cli, @hyperframes/engine, @hyperframes/producer

    Version bump only, no source changes since 0.2.5. Kept on the same version so the ecosystem is easier to reason about.

    Impact for consumers

    If you use @hyperframes/studio in a Next.js app:

    • The play button in a bundled preview reports the correct composition duration and drives the master timeline.
    • The session page no longer 500s in dev mode when the studio barrel is imported (the SSR fix).
    • Turbopack builds that transitively load the captions module no longer fail on Cannot resolve './types.js'.

    If you use @hyperframes/player directly:

    • Consumer bundlers can resolve the package again (dist entry points restored).
    • The ready event duration reports the master, not a sub-composition.

    After merge

    Publish each package to npm with pnpm publish (workspace deps auto-resolve).

    下载附件