packages/driver is the library (still published as driver.js, with
repository.directory set); playground and docs move to apps/. One root
pnpm workspace and lockfile replace the three standalone projects, with
turbo orchestrating build/test/lint:package (apps depend on the library
build; local + CI caching via .turbo).
Apps keep importing the library from source for HMR — the aliases now
point at ../../packages/driver/src and each app gains a workspace:*
dependency so the task graph knows the edge. The dev-server fs scope
widens to the repo root accordingly.
Releases run from packages/driver (root `pnpm release` delegates). The
changelog still lives in the docs app, so the release scripts reach it
via ../../../apps/docs and the after:bump hook stages it explicitly —
release-it no longer sits above both directories.
The merged workspace settings keep sharp unbuilt on purpose (prebuilt
binaries; building from source needs node-gyp and fails) — the docs app
had this right and the playground setting was the accident. postcss and
postcss-scss were unreferenced devDependencies and are dropped; prettier
moves to the root as the only shared tool.
One tool replaces four: both vite lib configs, vite-plugin-dts,
api-extractor and the terser postbuild. tsdown covers each of their jobs
natively — per-entry declaration bundling (from the actual lib entry, so
the vite-plugin-dts types-field footgun is structurally gone), oxc
minification, and CSS extraction with @import inlining via @tsdown/css.
The config keeps the two-isolated-builds decision as a config array: a
single multi-entry build would still split the shared popover primitive
into a common chunk and merge the stylesheets. Filenames, the exports
map and the CDN globals (window["driver"]["js"].driver, driverHints)
are unchanged; attw/publint stay green across node10/node16/bundler for
both entries.
Verified against the previous pipeline's output: identical file list,
identical driver.css rule set, hints.css differs only in Lightning CSS
keeping the inset shorthand our source already uses (baseline everywhere
driver.js supports), and every artifact's gzip size is equal or smaller.
Build drops from ~6.8s to ~2.2s — three TypeScript passes down to one
plus tsdown's per-entry declaration emit.
The postbuild shrinks to the two plain .d.ts copies node10 resolution
needs. vitest config moves to vitest.config.ts (vite itself is no longer
a direct dependency), and a local *.css module declaration replaces
vite/client's ambient types.
Two separate vite runs rather than one multi-entry build. Multi-entry
splits the shared popover primitive into a chunk, which would make the
tour bundle depend on a second file and cost every existing user bytes
for a feature they may never use; it also merged both stylesheets into
driver.css. Standing the entries alone keeps driver.css byte-identical
to master and the tour bundle within ~120 bytes of it, and lets hints be
used without the tour. Importing both duplicates the primitive (~2KB
gzip), which is safe because the copies only handle their own popovers.
The hints run writes to dist-hints/ and the postbuild folds it into
dist/. That indirection is not incidental: vite-plugin-dts takes its
entry from package.json's `types` field when bundling, not from the lib
entry, so pointing it at hints emits the tour's API under the hints name
and overwrites dist/driver.js.d.ts. api-extractor rolls up the hints
declarations from an explicit entry instead.
hints/package.json is a resolution shim for legacy node10, which predates
`exports`; attw is green across node10, node16 ESM/CJS and bundler for
both entries. sideEffects marks only CSS, so bundlers can drop unused
code from either entry.
Sizes (gzip): tour 6.7KB unchanged in CSS and ~6.8KB in JS, hints 4.2KB
JS + 0.4KB CSS standalone.
- Tag and commit use the unreleased version with no v prefix
- Move changelog Unreleased entries under the version on bump
- GitHub release notes are pulled from the changelog section