From 32c6ed5a1a29b4c7917a83885044091c3b2a1348 Mon Sep 17 00:00:00 2001 From: Stefano Verna Date: Mon, 31 Aug 2026 10:40:50 +0200 Subject: [PATCH] ci: publish a preview of every package on every push A renderer or util change can now be installed into a real site straight from a branch, without a release: npm i https://pkg.pr.new/datocms-structured-text-utils@ Nothing reaches npm, no version is spent, and there is nothing to clean up afterwards. Installing one preview pulls in the previews of its siblings from the same commit, which matters here: the renderers all sit on top of `utils` and `generic-html-renderer`. Runs only on pushes to branches of this repo, so a fork cannot mint a URL under our namespace without a maintainer pushing the code first. Claude-Session: https://claude.ai/code/session_01TbxhxyU1XBsSKtoCJXwAoD --- .github/workflows/continuous-releases.yml | 44 +++++++++++++++++++++++ README.md | 17 +++++++++ package-lock.json | 11 ++++++ package.json | 1 + 4 files changed, 73 insertions(+) create mode 100644 .github/workflows/continuous-releases.yml diff --git a/.github/workflows/continuous-releases.yml b/.github/workflows/continuous-releases.yml new file mode 100644 index 0000000..c857e01 --- /dev/null +++ b/.github/workflows/continuous-releases.yml @@ -0,0 +1,44 @@ +# Every commit pushed to a branch of this repo gets an installable preview of +# every package, without publishing anything to npm: +# +# npm i https://pkg.pr.new/datocms-structured-text-utils@ +# +# The point is to cross a repo boundary while developing. A change here can be +# tried inside a consumer that lives in another repository — `cms`, a demo, a +# customer project — from a real tarball, instead of `npm link` or pinning a +# git branch by hand and remembering to unpin it later. Installing one preview +# pulls in the previews of its siblings from the same commit, so a change that +# spans several packages is tried as one coherent set. +# +# Pull requests opened from forks are deliberately not published: this runs on +# pushes to branches of *this* repo, which only people with write access can +# make, so an unreviewed fork cannot mint a URL under our namespace. If we ever +# want fork previews too, pkg.pr.new documents an "approved pull requests only" +# recipe that gates them behind a maintainer's review. +name: Continuous releases + +on: + push: + # Every branch. Defining `branches` on its own also means tag pushes don't + # trigger this, which is what we want: a tag points at a commit that was + # already published when it landed on its branch. + branches: ['**'] + +permissions: {} + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: 'npm' + - run: npm ci + - run: npm run build + # Once for all the packages, not once per package: pkg.pr.new expects a + # single invocation per workflow run, and rejects the rest as spam. + - run: npm exec -- pkg-pr-new publish --commentWithSha './packages/*' diff --git a/README.md b/README.md index b8d23b3..f206501 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,23 @@ requirement; it is the release tooling that does. The packages resolve each other through their built `dist/`, so **run `npm run build` before `npm test`** on a fresh checkout. +### Trying a change before it's released + +Every push to a branch here publishes a preview of all ten packages, which you +can install anywhere — no npm release, no `npm link`: + +``` +npm i https://pkg.pr.new/datocms-structured-text-utils@ +``` + +The exact URLs show up in the commit's check run on GitHub, and in a comment on +the pull request once there is one. Installing one preview pulls in the previews +of its siblings built from the same commit, so a change spanning several +packages can be tried as one coherent set. + +Previews are throwaway: they are never published to npm, and the URL stops +resolving after a while. Never commit one to a `package.json` that ships. + ### Releasing (maintainers) Every user-visible change needs a changeset: run `npx changeset` from the repo diff --git a/package-lock.json b/package-lock.json index 661b174..01f6464 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "eslint-config-prettier": "^9.1.0", "husky": "^5.2.0", "jest": "^29.7.0", + "pkg-pr-new": "^0.0.88", "prettier": "^2.2.1", "pretty-quick": "^3.1.0", "rimraf": "^5.0.0", @@ -5683,6 +5684,16 @@ "node": ">=8" } }, + "node_modules/pkg-pr-new": { + "version": "0.0.88", + "resolved": "https://registry.npmjs.org/pkg-pr-new/-/pkg-pr-new-0.0.88.tgz", + "integrity": "sha512-Xc6PMJ2gher0WZP+rtjefFk26hIb7V1PTLL30bmy1Z2vsRmSvqiss7Ag1XUdyplTGYzIlFNJp4L3vMNmK44N6g==", + "dev": true, + "license": "MIT", + "bin": { + "pkg-pr-new": "bin/cli.js" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", diff --git a/package.json b/package.json index d74507e..fe56054 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "eslint-config-prettier": "^9.1.0", "husky": "^5.2.0", "jest": "^29.7.0", + "pkg-pr-new": "^0.0.88", "prettier": "^2.2.1", "pretty-quick": "^3.1.0", "rimraf": "^5.0.0",