@shiplane/changesets 0.0.0-stage โ†’ 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Arnaud Zheng
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,90 @@
1
- # Temporary Holding Version
1
+ # ๐Ÿ”Œ @shiplane/changesets
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Versions from `.changeset` files, through the changesets CLI: fills
4
+ [shiplane](../shiplane/README.md)'s **versioning** port. A changeset is the intent to release;
5
+ shiplane turns the pending ones into versions and changelogs on the release PR.
6
+
7
+ ```mermaid
8
+ flowchart LR
9
+ CS[".changeset/*.md"] --> AD["changesetsVersioning()"]
10
+ AD --> STATUS["changeset status: what moves"]
11
+ AD --> VERSION["changeset version: on the release PR"]
12
+ VERSION --> OUT["versions and CHANGELOG.md"]
13
+ ```
14
+
15
+ ## Install
16
+
17
+ ```sh
18
+ pnpm add -D shiplane @shiplane/changesets @changesets/cli
19
+ ```
20
+
21
+ ## Configure
22
+
23
+ Give the adapter to `releaseFlow`. From
24
+ [`examples/shiplane.config.ts`](./examples/shiplane.config.ts):
25
+
26
+ ```ts
27
+ import { changesetsVersioning } from "@shiplane/changesets";
28
+ import { gitSourceControl } from "@shiplane/git";
29
+ import { gitHubActionsCiPipeline, gitHubCodeHost } from "@shiplane/github";
30
+ import { defineRelease, internalTool, releaseFlow } from "shiplane";
31
+
32
+ export default defineRelease({
33
+ flow: releaseFlow({
34
+ sourceControl: gitSourceControl(),
35
+ codeHost: gitHubCodeHost(),
36
+ ciPipeline: gitHubActionsCiPipeline(),
37
+ // The root script versions, then refreshes the lockfile.
38
+ versioning: changesetsVersioning({ version: ["pnpm", "-s", "changeset:version"] }),
39
+ }),
40
+ modules: [internalTool()],
41
+ });
42
+ ```
43
+
44
+ ## Options
45
+
46
+ It fills a flow port, so unit files take no key from it. Its factory takes:
47
+
48
+ | Option | Default | Means |
49
+ | --------- | ------------------------------------------ | ------------------------------------- |
50
+ | `version` | `["pnpm", "exec", "changeset", "version"]` | The command that versions the release |
51
+
52
+ Source: `ChangesetsOptions` in `src/changesets-versioning.adapter.ts`.
53
+
54
+ ## Example
55
+
56
+ [`examples/`](./examples) holds one pending changeset,
57
+ [`.changeset/quiet-seeds-wait.md`](./examples/.changeset/quiet-seeds-wait.md):
58
+
59
+ ```md
60
+ ---
61
+ "@acme/scripts": patch
62
+ ---
63
+
64
+ The seed script skips rows it already wrote.
65
+ ```
66
+
67
+ `pnpm shiplane status` in that repository counts it:
68
+
69
+ ```text
70
+ Release status ยท preview
71
+
72
+ Unit Version Target Where it stands
73
+ scripts 1.0.0 release-only โ†‘ 1 changeset
74
+
75
+ โ†’ Next: open the release PR: shiplane
76
+ ```
77
+
78
+ What moves is read with `changeset status`, which writes nothing. Changesets held back for a later
79
+ release are set aside only while it versions. A GitHub changelog asks GitHub who wrote each change:
80
+ `GITHUB_TOKEN` when set, your `gh` sign-in otherwise.
81
+
82
+ ## Tools and sign-ins
83
+
84
+ | Tool | Needed for |
85
+ | ---------------------------------- | ------------------------------------------------ |
86
+ | `@changesets/cli` in the workspace | `changeset status` and `changeset version` |
87
+ | `gh`, signed in | A GitHub changelog, when `GITHUB_TOKEN` is unset |
88
+
89
+ The adapter declares no `requirements`, so `doctor` checks neither. Source:
90
+ `src/changesets-versioning.adapter.ts`.
@@ -0,0 +1,13 @@
1
+ import { ServiceAdapter, VersioningPort } from "shiplane/plugin";
2
+
3
+ //#region src/changesets-versioning.adapter.d.ts
4
+ interface ChangesetsOptions {
5
+ /** What versions the repository: `changeset version` by default. */
6
+ version?: string[];
7
+ }
8
+ type ChangesetsVersioningAdapter = ServiceAdapter<VersioningPort>;
9
+ /** Versioning from `.changeset` files, through the changesets CLI. */
10
+ declare const changesetsVersioning: (options?: ChangesetsOptions) => ChangesetsVersioningAdapter;
11
+ //#endregion
12
+ export { type ChangesetsOptions, type ChangesetsVersioningAdapter, changesetsVersioning };
13
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,137 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { expandPatterns, workspacePatterns, z } from "shiplane/plugin";
5
+ //#region src/changesets-versioning.adapter.ts
6
+ const BumpSchema = z.enum([
7
+ "major",
8
+ "minor",
9
+ "patch",
10
+ "none"
11
+ ]);
12
+ const StatusPlanSchema = z.object({
13
+ changesets: z.array(z.object({
14
+ id: z.string(),
15
+ summary: z.string(),
16
+ releases: z.array(z.object({
17
+ name: z.string(),
18
+ type: BumpSchema
19
+ }))
20
+ })),
21
+ releases: z.array(z.object({
22
+ name: z.string(),
23
+ type: BumpSchema,
24
+ oldVersion: z.string(),
25
+ newVersion: z.string(),
26
+ changesets: z.array(z.string())
27
+ }))
28
+ });
29
+ const PackageSchema = z.object({
30
+ name: z.string(),
31
+ dependencies: z.record(z.string(), z.string()).optional(),
32
+ peerDependencies: z.record(z.string(), z.string()).optional()
33
+ });
34
+ const LINE = /^"([^"]+)":\s*(\w+)\s*$/;
35
+ const changesetsFiles = (root, shell, options) => {
36
+ const dir = path.join(root, ".changeset");
37
+ const fileOf = (id) => path.join(dir, `${id}.md`);
38
+ const write = ({ id, releases, summary }) => fs.writeFileSync(fileOf(id), `---\n${releases.map(({ name, type }) => `"${name}": ${type}`).join("\n")}\n---\n\n${summary}\n`);
39
+ const workspacePackages = () => expandPatterns(root, workspacePatterns(root)).flatMap((folder) => {
40
+ const file = path.join(root, folder, "package.json");
41
+ if (!fs.existsSync(file)) return [];
42
+ const parsed = PackageSchema.safeParse(JSON.parse(fs.readFileSync(file, "utf8")));
43
+ return parsed.success ? [{
44
+ folder,
45
+ pkg: parsed.data
46
+ }] : [];
47
+ });
48
+ const pendingIds = () => fs.existsSync(dir) ? fs.readdirSync(dir).filter((file) => file.endsWith(".md") && file !== "README.md").map((file) => file.slice(0, -3)) : [];
49
+ /** Leaves only what ships in `.changeset`; the returned function puts the held files back. */
50
+ const holdBack = (held) => {
51
+ const originals = new Map(held.map(({ id }) => [id, fs.readFileSync(fileOf(id), "utf8")]));
52
+ held.forEach(({ id, releases }) => {
53
+ const [, frontmatter = "", ...rest] = (originals.get(id) ?? "").split("---");
54
+ const waiting = new Set(releases.map(({ name }) => name));
55
+ const shipping = frontmatter.split("\n").filter((line) => {
56
+ const match = LINE.exec(line.trim());
57
+ return match && !waiting.has(match[1] ?? "");
58
+ });
59
+ if (shipping.length === 0) fs.rmSync(fileOf(id));
60
+ else fs.writeFileSync(fileOf(id), `---\n${shipping.join("\n")}\n---${rest.join("---")}`);
61
+ });
62
+ return () => originals.forEach((text, id) => fs.writeFileSync(fileOf(id), text));
63
+ };
64
+ return {
65
+ pending: () => Promise.resolve(pendingIds().map((id) => ({
66
+ id,
67
+ text: fs.readFileSync(fileOf(id), "utf8")
68
+ }))),
69
+ plan: async (added, held) => {
70
+ const output = path.join(os.tmpdir(), `release-status-${process.pid}.json`);
71
+ added.forEach(write);
72
+ const restore = holdBack(held);
73
+ try {
74
+ if (pendingIds().length === 0) return {
75
+ changesets: [],
76
+ releases: []
77
+ };
78
+ await shell.capture("pnpm", [
79
+ "exec",
80
+ "changeset",
81
+ "status",
82
+ `--output=${output}`
83
+ ], { cwd: root });
84
+ return StatusPlanSchema.parse(JSON.parse(fs.readFileSync(output, "utf8")));
85
+ } finally {
86
+ restore();
87
+ added.forEach(({ id }) => fs.rmSync(fileOf(id), { force: true }));
88
+ fs.rmSync(output, { force: true });
89
+ }
90
+ },
91
+ apply: async (added, held) => {
92
+ added.forEach(write);
93
+ const restore = holdBack(held);
94
+ try {
95
+ const [command = "pnpm", ...args] = options.version ?? [
96
+ "pnpm",
97
+ "exec",
98
+ "changeset",
99
+ "version"
100
+ ];
101
+ const token = shell.env("GITHUB_TOKEN") ? void 0 : (await shell.capture("gh", ["auth", "token"])).stdout.trim();
102
+ const status = await shell.attach(command, args, {
103
+ cwd: root,
104
+ ...token ? { env: { GITHUB_TOKEN: token } } : {}
105
+ });
106
+ if (status !== 0) throw new Error(`${command} ${args.join(" ")} exited with ${status}`);
107
+ } finally {
108
+ restore();
109
+ }
110
+ held.forEach(write);
111
+ },
112
+ write: (changeset) => {
113
+ write(changeset);
114
+ return Promise.resolve();
115
+ },
116
+ dependencies: () => {
117
+ const packages = workspacePackages().map(({ pkg }) => pkg);
118
+ const names = new Set(packages.map(({ name }) => name));
119
+ return Promise.resolve(Object.fromEntries(packages.map((pkg) => [pkg.name, Object.keys({
120
+ ...pkg.dependencies,
121
+ ...pkg.peerDependencies
122
+ }).filter((dep) => names.has(dep))])));
123
+ },
124
+ folders: () => Promise.resolve(Object.fromEntries(workspacePackages().map(({ folder, pkg }) => [pkg.name, folder]))),
125
+ changesetFile: (id) => path.posix.join(".changeset", `${id}.md`),
126
+ changelogFile: (folder) => path.posix.join(folder, "CHANGELOG.md")
127
+ };
128
+ };
129
+ /** Versioning from `.changeset` files, through the changesets CLI. */
130
+ const changesetsVersioning = (options = {}) => ({
131
+ name: "changesets",
132
+ create: ({ root, shell }) => changesetsFiles(root, shell, options)
133
+ });
134
+ //#endregion
135
+ export { changesetsVersioning };
136
+
137
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/changesets-versioning.adapter.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { PlannedChangeset, ServiceAdapter, Shell, VersioningPort } from \"shiplane/plugin\";\nimport { expandPatterns, workspacePatterns, z } from \"shiplane/plugin\";\n\nexport interface ChangesetsOptions {\n /** What versions the repository: `changeset version` by default. */\n version?: string[];\n}\n\nconst BumpSchema = z.enum([\"major\", \"minor\", \"patch\", \"none\"]);\nconst StatusPlanSchema = z.object({\n changesets: z.array(\n z.object({\n id: z.string(),\n summary: z.string(),\n releases: z.array(z.object({ name: z.string(), type: BumpSchema })),\n }),\n ),\n releases: z.array(\n z.object({\n name: z.string(),\n type: BumpSchema,\n oldVersion: z.string(),\n newVersion: z.string(),\n changesets: z.array(z.string()),\n }),\n ),\n});\nconst PackageSchema = z.object({\n name: z.string(),\n dependencies: z.record(z.string(), z.string()).optional(),\n peerDependencies: z.record(z.string(), z.string()).optional(),\n});\n\nconst LINE = /^\"([^\"]+)\":\\s*(\\w+)\\s*$/;\n\nconst changesetsFiles = (\n root: string,\n shell: Shell,\n options: ChangesetsOptions,\n): VersioningPort => {\n const dir = path.join(root, \".changeset\");\n const fileOf = (id: string) => path.join(dir, `${id}.md`);\n const write = ({ id, releases, summary }: PlannedChangeset) =>\n fs.writeFileSync(\n fileOf(id),\n `---\\n${releases.map(({ name, type }) => `\"${name}\": ${type}`).join(\"\\n\")}\\n---\\n\\n${summary}\\n`,\n );\n const workspacePackages = () =>\n expandPatterns(root, workspacePatterns(root)).flatMap((folder) => {\n const file = path.join(root, folder, \"package.json\");\n if (!fs.existsSync(file)) return [];\n const parsed = PackageSchema.safeParse(JSON.parse(fs.readFileSync(file, \"utf8\")));\n return parsed.success ? [{ folder, pkg: parsed.data }] : [];\n });\n const pendingIds = () =>\n fs.existsSync(dir)\n ? fs\n .readdirSync(dir)\n .filter((file) => file.endsWith(\".md\") && file !== \"README.md\")\n .map((file) => file.slice(0, -3))\n : [];\n\n /** Leaves only what ships in `.changeset`; the returned function puts the held files back. */\n const holdBack = (held: readonly PlannedChangeset[]) => {\n const originals = new Map(held.map(({ id }) => [id, fs.readFileSync(fileOf(id), \"utf8\")]));\n held.forEach(({ id, releases }) => {\n const original = originals.get(id) ?? \"\";\n const [, frontmatter = \"\", ...rest] = original.split(\"---\");\n const waiting = new Set(releases.map(({ name }) => name));\n const shipping = frontmatter.split(\"\\n\").filter((line) => {\n const match = LINE.exec(line.trim());\n return match && !waiting.has(match[1] ?? \"\");\n });\n if (shipping.length === 0) fs.rmSync(fileOf(id));\n else fs.writeFileSync(fileOf(id), `---\\n${shipping.join(\"\\n\")}\\n---${rest.join(\"---\")}`);\n });\n return () => originals.forEach((text, id) => fs.writeFileSync(fileOf(id), text));\n };\n\n return {\n pending: () =>\n Promise.resolve(\n pendingIds().map((id) => ({ id, text: fs.readFileSync(fileOf(id), \"utf8\") })),\n ),\n // changeset status computes every move, dependents included, without writing anything. What\n // the release adds and holds back lasts only for the time of the call.\n plan: async (added, held) => {\n const output = path.join(os.tmpdir(), `release-status-${process.pid}.json`);\n added.forEach(write);\n const restore = holdBack(held);\n try {\n // changeset status writes nothing and exits 1 when no changeset is left.\n if (pendingIds().length === 0) return { changesets: [], releases: [] };\n await shell.capture(\"pnpm\", [\"exec\", \"changeset\", \"status\", `--output=${output}`], {\n cwd: root,\n });\n return StatusPlanSchema.parse(JSON.parse(fs.readFileSync(output, \"utf8\")));\n } finally {\n restore();\n added.forEach(({ id }) => fs.rmSync(fileOf(id), { force: true }));\n fs.rmSync(output, { force: true });\n }\n },\n apply: async (added, held) => {\n added.forEach(write);\n const restore = holdBack(held);\n try {\n const [command = \"pnpm\", ...args] = options.version ?? [\n \"pnpm\",\n \"exec\",\n \"changeset\",\n \"version\",\n ];\n // A GitHub changelog asks GitHub who wrote each change: gh's sign-in answers it.\n const token = shell.env(\"GITHUB_TOKEN\")\n ? undefined\n : (await shell.capture(\"gh\", [\"auth\", \"token\"])).stdout.trim();\n const status = await shell.attach(command, args, {\n cwd: root,\n ...(token ? { env: { GITHUB_TOKEN: token } } : {}),\n });\n if (status !== 0) throw new Error(`${command} ${args.join(\" \")} exited with ${status}`);\n } finally {\n restore();\n }\n // A held changeset that also named a released unit keeps only its waiting lines.\n held.forEach(write);\n },\n write: (changeset) => {\n write(changeset);\n return Promise.resolve();\n },\n dependencies: () => {\n const packages = workspacePackages().map(({ pkg }) => pkg);\n const names = new Set(packages.map(({ name }) => name));\n // Only runtime dependencies move a dependent's version.\n return Promise.resolve(\n Object.fromEntries(\n packages.map((pkg) => [\n pkg.name,\n Object.keys({ ...pkg.dependencies, ...pkg.peerDependencies }).filter((dep) =>\n names.has(dep),\n ),\n ]),\n ),\n );\n },\n folders: () =>\n Promise.resolve(\n Object.fromEntries(workspacePackages().map(({ folder, pkg }) => [pkg.name, folder])),\n ),\n changesetFile: (id) => path.posix.join(\".changeset\", `${id}.md`),\n changelogFile: (folder) => path.posix.join(folder, \"CHANGELOG.md\"),\n };\n};\n\nexport type ChangesetsVersioningAdapter = ServiceAdapter<VersioningPort>;\n\n/** Versioning from `.changeset` files, through the changesets CLI. */\nexport const changesetsVersioning = (\n options: ChangesetsOptions = {},\n): ChangesetsVersioningAdapter => ({\n name: \"changesets\",\n create: ({ root, shell }) => changesetsFiles(root, shell, options),\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,48 @@
1
1
  {
2
2
  "name": "@shiplane/changesets",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.1",
4
+ "description": "Versioning for shiplane: versions and changelogs from changesets.",
5
+ "homepage": "https://github.com/arnaud-zg/packages/tree/main/packages/shiplane-changesets#readme",
6
+ "bugs": {
7
+ "url": "https://github.com/arnaud-zg/packages/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/arnaud-zg/packages.git",
12
+ "directory": "packages/shiplane-changesets"
13
+ },
14
+ "license": "MIT",
15
+ "author": "Arnaud Zheng <arnaud.zg@gmail.com>",
16
+ "sideEffects": false,
17
+ "type": "module",
18
+ "exports": {
19
+ ".": "./dist/index.js",
20
+ "./package.json": "./package.json"
21
+ },
22
+ "main": "./dist/index.js",
23
+ "module": "./dist/index.js",
24
+ "types": "./dist/index.d.ts",
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "devDependencies": {
29
+ "@arnaud-zg/configs": "0.3.0",
30
+ "@types/node": "^22.0.0",
31
+ "eslint": "^9.39.4",
32
+ "prettier": "^3.8.3",
33
+ "typescript": "6.0.3",
34
+ "vitest": "^4.1.11",
35
+ "shiplane": "0.2.0"
36
+ },
37
+ "peerDependencies": {
38
+ "shiplane": "0.2.0"
39
+ },
40
+ "scripts": {
41
+ "build": "tsdown",
42
+ "clean": "git clean -xdf .cache .turbo dist node_modules",
43
+ "format": "prettier --write . --cache --cache-location .cache/.prettiercache",
44
+ "lint": "eslint --cache --cache-location .cache/.eslintcache",
45
+ "test": "vitest run",
46
+ "typecheck": "tsc -p tsconfig.typecheck.json"
47
+ }
6
48
  }