@aklinker1/zero-changelog 0.1.0

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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +158 -0
  3. package/dist/changelog-section.d.mts +7 -0
  4. package/dist/changelog-section.mjs +1 -0
  5. package/dist/conventional-commit.d.mts +28 -0
  6. package/dist/conventional-commit.mjs +1 -0
  7. package/dist/create-github-release.d.mts +15 -0
  8. package/dist/create-github-release.mjs +61 -0
  9. package/dist/detect-version-bump.d.mts +13 -0
  10. package/dist/detect-version-bump.mjs +43 -0
  11. package/dist/find-previous-tag-Cj2oZAty.mjs +27 -0
  12. package/dist/find-previous-tag.d.mts +10 -0
  13. package/dist/find-previous-tag.mjs +2 -0
  14. package/dist/get-current-version.d.mts +4 -0
  15. package/dist/get-current-version.mjs +24 -0
  16. package/dist/get-github-release.d.mts +15 -0
  17. package/dist/get-github-release.mjs +11 -0
  18. package/dist/get-github-repo.d.mts +4 -0
  19. package/dist/get-github-repo.mjs +20 -0
  20. package/dist/get-release-notes.d.mts +6 -0
  21. package/dist/get-release-notes.mjs +37 -0
  22. package/dist/git-commit.d.mts +13 -0
  23. package/dist/git-commit.mjs +1 -0
  24. package/dist/list-commits-since-DycWgHTi.mjs +44 -0
  25. package/dist/list-commits-since.d.mts +11 -0
  26. package/dist/list-commits-since.mjs +2 -0
  27. package/dist/parse-changelog.d.mts +6 -0
  28. package/dist/parse-changelog.mjs +23 -0
  29. package/dist/parse-commit.d.mts +8 -0
  30. package/dist/parse-commit.mjs +34 -0
  31. package/dist/parse-commits.d.mts +8 -0
  32. package/dist/parse-commits.mjs +8 -0
  33. package/dist/release.d.mts +384 -0
  34. package/dist/release.mjs +125 -0
  35. package/dist/semver-type--Q1lYCiZ.d.mts +11 -0
  36. package/dist/semver-type-map.d.mts +8 -0
  37. package/dist/semver-type-map.mjs +1 -0
  38. package/dist/semver-type.d.mts +2 -0
  39. package/dist/semver-type.mjs +1 -0
  40. package/dist/semver-types/aklinker1.d.mts +6 -0
  41. package/dist/semver-types/aklinker1.mjs +38 -0
  42. package/dist/semver.d.mts +37 -0
  43. package/dist/semver.mjs +142 -0
  44. package/dist/serialize-changelog.d.mts +6 -0
  45. package/dist/serialize-changelog.mjs +28 -0
  46. package/dist/summarize-unreleased-commits.d.mts +50 -0
  47. package/dist/summarize-unreleased-commits.mjs +30 -0
  48. package/dist/sync-release.d.mts +4 -0
  49. package/dist/sync-release.mjs +6 -0
  50. package/dist/sync-releases.d.mts +4 -0
  51. package/dist/sync-releases.mjs +6 -0
  52. package/dist/update-version-files.d.mts +4 -0
  53. package/dist/update-version-files.mjs +26 -0
  54. package/dist/utils-BO6byvK5.mjs +22 -0
  55. package/dist/version-regex-C82OGsTC.mjs +23 -0
  56. package/dist/wait-for-child-process-lyAoE4WE.mjs +25 -0
  57. package/package.json +134 -0
@@ -0,0 +1,142 @@
1
+ //#region src/semver.ts
2
+ const STABLE_REGEX = /^(?<major>[1-9]\d*)\.(?<minor>\d+)\.(?<patch>\d+)$/;
3
+ const UNSTABLE_REGEX = /^0\.(?<minor>\d+)\.(?<patch>\d+)$/;
4
+ const PRERELEASE_REGEX = /^(?<major>[1-9]\d*)\.0\.0-(?<prereleaseType>(alpha|beta|rc))\.(?<prerelease>\d+)$/;
5
+ const STABLE_TYPE = Symbol("stable");
6
+ function parseSemver(version) {
7
+ const stable = version.match(STABLE_REGEX)?.groups;
8
+ if (stable) return createStableVersion(parseIntOrThrow(stable.major), parseIntOrThrow(stable.minor), parseIntOrThrow(stable.patch));
9
+ const unstable = version.match(UNSTABLE_REGEX)?.groups;
10
+ if (unstable) return createUnstableVersion(parseIntOrThrow(unstable.minor), parseIntOrThrow(unstable.patch));
11
+ const prerelease = version.match(PRERELEASE_REGEX)?.groups;
12
+ if (prerelease) return createPrereleaseVersion(parseIntOrThrow(prerelease.major), parsePrereleaseTypeOrThrow(prerelease.prereleaseType), parseIntOrThrow(prerelease.prerelease));
13
+ throw Error(`Unsupported version format: "${version}". See docs: https://github.com/aklinker1/zero-changelog#semver`);
14
+ }
15
+ function createStableVersion(major, minor, patch) {
16
+ const bump = (by) => {
17
+ switch (by) {
18
+ case "major": return `${major + 1}.0.0`;
19
+ case "minor": return `${major}.${minor + 1}.0`;
20
+ case "patch": return `${major}.${minor}.${patch + 1}`;
21
+ default: return validateGreaterVersion(version, by);
22
+ }
23
+ };
24
+ const compare = (other) => {
25
+ if (isUnstable(other)) return 1;
26
+ if (isPrerelease(other)) return major >= other.major ? 1 : -1;
27
+ if (!isStable(other)) throw Error("Unknown version type: " + other.type);
28
+ if (major > other.major) return 1;
29
+ if (major < other.major) return -1;
30
+ if (minor > other.minor) return 1;
31
+ if (minor < other.minor) return -1;
32
+ if (patch > other.patch) return 1;
33
+ if (patch < other.patch) return -1;
34
+ return 0;
35
+ };
36
+ const version = {
37
+ type: STABLE_TYPE,
38
+ version: `${major}.${minor}.${patch}`,
39
+ major,
40
+ minor,
41
+ patch,
42
+ bump,
43
+ compare
44
+ };
45
+ return version;
46
+ }
47
+ function isStable(semver) {
48
+ return semver.type === STABLE_TYPE;
49
+ }
50
+ const UNSTABLE_TYPE = Symbol("unstable");
51
+ function createUnstableVersion(minor, patch) {
52
+ const bump = (by) => {
53
+ switch (by) {
54
+ case "major": return `0.${minor + 1}.0`;
55
+ case "minor":
56
+ case "patch": return `0.${minor}.${patch + 1}`;
57
+ default: return validateGreaterVersion(version, by);
58
+ }
59
+ };
60
+ const compare = (other) => {
61
+ if (isStable(other)) return -1;
62
+ if (isPrerelease(other)) return -1;
63
+ if (!isUnstable(other)) throw Error("Unknown version type: " + other.type);
64
+ if (minor > other.minor) return 1;
65
+ if (minor < other.minor) return -1;
66
+ if (patch > other.patch) return 1;
67
+ if (patch < other.patch) return -1;
68
+ return 0;
69
+ };
70
+ const version = {
71
+ type: UNSTABLE_TYPE,
72
+ version: `0.${minor}.${patch}`,
73
+ major: 0,
74
+ minor,
75
+ patch,
76
+ bump,
77
+ compare
78
+ };
79
+ return version;
80
+ }
81
+ function isUnstable(semver) {
82
+ return semver.type === UNSTABLE_TYPE;
83
+ }
84
+ const PRERELEASE_TYPE = Symbol("prerelease");
85
+ const PRERELEASE_TYPE_ORDER = {
86
+ alpha: 0,
87
+ beta: 1,
88
+ rc: 2
89
+ };
90
+ function createPrereleaseVersion(major, prereleaseType, prerelease) {
91
+ const bump = (by) => {
92
+ switch (by) {
93
+ case "major":
94
+ case "minor":
95
+ case "patch": return `${major}.0.0-${prereleaseType}.${prerelease + 1}`;
96
+ default: return validateGreaterVersion(version, by);
97
+ }
98
+ };
99
+ const compare = (other) => {
100
+ if (isUnstable(other)) return 1;
101
+ if (isStable(other)) return other.major >= major ? -1 : 1;
102
+ if (!isPrerelease(other)) throw Error("Unknown version type: " + other.type);
103
+ if (major > other.major) return 1;
104
+ if (major < other.major) return -1;
105
+ const prereleaseTypeOrder = PRERELEASE_TYPE_ORDER[prereleaseType];
106
+ const otherPrereleaseTypeOrder = PRERELEASE_TYPE_ORDER[other.prereleaseType];
107
+ if (prereleaseTypeOrder > otherPrereleaseTypeOrder) return 1;
108
+ if (prereleaseTypeOrder < otherPrereleaseTypeOrder) return -1;
109
+ if (prerelease > other.prerelease) return 1;
110
+ if (prerelease < other.prerelease) return -1;
111
+ return 0;
112
+ };
113
+ const version = {
114
+ type: PRERELEASE_TYPE,
115
+ version: `${major}.0.0-${prereleaseType}.${prerelease}`,
116
+ major,
117
+ prereleaseType,
118
+ prerelease,
119
+ bump,
120
+ compare
121
+ };
122
+ return version;
123
+ }
124
+ function isPrerelease(semver) {
125
+ return semver.type === PRERELEASE_TYPE;
126
+ }
127
+ function parseIntOrThrow(value) {
128
+ const i = parseInt(value);
129
+ if (isNaN(i)) throw Error(`Cannot convert to number: ${value}`);
130
+ return i;
131
+ }
132
+ function parsePrereleaseTypeOrThrow(value) {
133
+ if (value !== "alpha" && value !== "beta" && value !== "rc") throw Error(`Invalid prerelease type: ${value}`);
134
+ return value;
135
+ }
136
+ function validateGreaterVersion(currentSemver, nextVersion) {
137
+ const nextSemver = parseSemver(nextVersion);
138
+ if (nextSemver.compare(currentSemver) <= 0) throw Error("New version must be greater than the current version");
139
+ return nextSemver.version;
140
+ }
141
+ //#endregion
142
+ export { isPrerelease, isStable, isUnstable, parseSemver };
@@ -0,0 +1,6 @@
1
+ import { ChangelogSection } from "./changelog-section.mjs";
2
+
3
+ //#region src/serialize-changelog.d.ts
4
+ declare function serializeChangelog(sections: ChangelogSection[]): string;
5
+ //#endregion
6
+ export { serializeChangelog };
@@ -0,0 +1,28 @@
1
+ import { parseSemver } from "./semver.mjs";
2
+ //#region src/serialize-changelog.ts
3
+ function serializeChangelog(sections) {
4
+ const parts = ["# Changelog"];
5
+ const ordered = sections.sort((a, b) => {
6
+ const aV = a.header.slice(1);
7
+ const bV = b.header.slice(1);
8
+ try {
9
+ const aSemver = parseSemver(aV);
10
+ try {
11
+ return parseSemver(bV).compare(aSemver);
12
+ } catch {
13
+ return -1;
14
+ }
15
+ } catch {
16
+ try {
17
+ parseSemver(bV);
18
+ return 1;
19
+ } catch {
20
+ return 0;
21
+ }
22
+ }
23
+ });
24
+ for (const section of ordered) parts.push(`## ${section.header}`, section.body);
25
+ return parts.join("\n\n") + "\n";
26
+ }
27
+ //#endregion
28
+ export { serializeChangelog };
@@ -0,0 +1,50 @@
1
+ import { ConventionalCommit } from "./conventional-commit.mjs";
2
+ import { GitCommit } from "./git-commit.mjs";
3
+
4
+ //#region src/summarize-unreleased-commits.d.ts
5
+ type SummarizeUnreleasedCommitsOptions = {
6
+ /**
7
+ * List of paths to summarize commits for.
8
+ *
9
+ * > **IMPORTANT**: You may use glob patterns for ONLY the github action. They are not automatically
10
+ * > expanded when using the JS API. If you use the JS API and want to use glob patterns, [install a
11
+ * > glob pattern library](https://www.npmjs.com/search?q=glob) and call it yourself.
12
+ *
13
+ * JS Usage:
14
+ *
15
+ * ```ts
16
+ * const summary = await summarizeUnreleasedCommits({
17
+ * paths: ["packages/a", "packages/b", "packages/c"],
18
+ * });
19
+ * ```
20
+ *
21
+ * GitHub Action:
22
+ *
23
+ * ```yml
24
+ * - uses: aklinker1/zero-changelog/actions/summarize-unreleased-commits
25
+ * with:
26
+ * paths: |-
27
+ * packages/*
28
+ * ```
29
+ *
30
+ * @default [process.cwd()]
31
+ */
32
+ paths?: string[];
33
+ /**
34
+ * Template for the tag prefix. Available variables:
35
+ *
36
+ * - `{{dirname}}`: The directory name of the path.
37
+ * - `{{path}}`: The path relative to the CWD.
38
+ *
39
+ * @default "v"
40
+ */
41
+ tagPrefixTemplate?: string;
42
+ };
43
+ type PathSummary = {
44
+ path: string;
45
+ commits: GitCommit[];
46
+ conventionalCommits: ConventionalCommit[];
47
+ };
48
+ declare function summarizeUnreleasedCommits(options?: SummarizeUnreleasedCommitsOptions): Promise<PathSummary[]>;
49
+ //#endregion
50
+ export { PathSummary, SummarizeUnreleasedCommitsOptions, summarizeUnreleasedCommits };
@@ -0,0 +1,30 @@
1
+ import { t as findPreviousTag } from "./find-previous-tag-Cj2oZAty.mjs";
2
+ import { t as listCommitsSince } from "./list-commits-since-DycWgHTi.mjs";
3
+ import { parseCommits } from "./parse-commits.mjs";
4
+ import { n as template } from "./utils-BO6byvK5.mjs";
5
+ import { basename, relative, resolve } from "node:path";
6
+ //#region src/summarize-unreleased-commits.ts
7
+ async function summarizeUnreleasedCommits(options) {
8
+ const { tagPrefixTemplate = "v{{dirname}}" } = options ?? {};
9
+ const absolutePaths = (options?.paths?.length ? options.paths : [process.cwd()]).map((path) => resolve(path));
10
+ const summaries = [];
11
+ for (const path of absolutePaths) {
12
+ const since = await findPreviousTag(template(tagPrefixTemplate, {
13
+ dirname: basename(path),
14
+ path: relative(process.cwd(), path)
15
+ }));
16
+ const commits = await listCommitsSince({
17
+ dirs: [path],
18
+ since
19
+ });
20
+ const conventionalCommits = parseCommits(commits);
21
+ summaries.push({
22
+ commits,
23
+ path,
24
+ conventionalCommits
25
+ });
26
+ }
27
+ return summaries;
28
+ }
29
+ //#endregion
30
+ export { summarizeUnreleasedCommits };
@@ -0,0 +1,4 @@
1
+ //#region src/sync-release.d.ts
2
+ declare function syncRelease(_options: unknown): Promise<void>;
3
+ //#endregion
4
+ export { syncRelease };
@@ -0,0 +1,6 @@
1
+ //#region src/sync-release.ts
2
+ async function syncRelease(_options) {
3
+ throw Error("TODO");
4
+ }
5
+ //#endregion
6
+ export { syncRelease };
@@ -0,0 +1,4 @@
1
+ //#region src/sync-releases.d.ts
2
+ declare function syncReleases(_options: unknown): Promise<void>;
3
+ //#endregion
4
+ export { syncReleases };
@@ -0,0 +1,6 @@
1
+ //#region src/sync-releases.ts
2
+ async function syncReleases(_options) {
3
+ throw Error("TODO");
4
+ }
5
+ //#endregion
6
+ export { syncReleases };
@@ -0,0 +1,4 @@
1
+ //#region src/update-version-files.d.ts
2
+ declare function updateVersionFiles(path: string, versionFiles: string[], newVersion: string): Promise<void>;
3
+ //#endregion
4
+ export { updateVersionFiles };
@@ -0,0 +1,26 @@
1
+ import { t as getVersionRegexFor } from "./version-regex-C82OGsTC.mjs";
2
+ import { t as replaceRegexGroup } from "./utils-BO6byvK5.mjs";
3
+ import { styleText } from "node:util";
4
+ import { readFile, writeFile } from "node:fs/promises";
5
+ import { join, relative } from "node:path";
6
+ //#region src/update-version-files.ts
7
+ async function updateVersionFiles(path, versionFiles, newVersion) {
8
+ console.log("Updating version...");
9
+ for (const versionFile of versionFiles) await updateVersionFile(path, versionFile, newVersion);
10
+ }
11
+ async function updateVersionFile(path, versionFile, newVersion) {
12
+ const file = join(path, versionFile);
13
+ const relativePath = relative(process.cwd(), file);
14
+ try {
15
+ await writeFile(file, replaceRegexGroup(await readFile(file, "utf8"), getVersionRegexFor(file), "version", newVersion), "utf8");
16
+ console.log(` -> ${styleText("cyan", relativePath)} updated`);
17
+ } catch (err) {
18
+ if (err.code === "ENOENT") {
19
+ console.log(` -> ${styleText("cyan", relativePath)} does not exist, skipping`);
20
+ return;
21
+ }
22
+ throw err;
23
+ }
24
+ }
25
+ //#endregion
26
+ export { updateVersionFiles };
@@ -0,0 +1,22 @@
1
+ //#region src/internal/utils.ts
2
+ /**
3
+ * Replaces a regex group in a string with a replacement value. Only replaces the first match.
4
+ *
5
+ * @param text The string to search in.
6
+ * @param regexp The regex pattern to match. Must include a named group `replace`.
7
+ * @param replacement The value to replace the matched group with.
8
+ * @returns The modified string with the replacement applied.
9
+ */
10
+ function replaceRegexGroup(text, regexp, group, replacement) {
11
+ const match = text.match(regexp);
12
+ if (!match?.groups?.[group]) return text;
13
+ const fullMatch = match[0];
14
+ const toReplace = match.groups[group];
15
+ const newMatch = fullMatch.replace(toReplace, replacement);
16
+ return text.replace(regexp, newMatch);
17
+ }
18
+ function template(template, vars) {
19
+ return Object.entries(vars).reduce((acc, [key, value]) => acc.replace(new RegExp(`\\{\\{\\s*?${key}\\s*?\\}\\}`, "g"), String(value)), template);
20
+ }
21
+ //#endregion
22
+ export { template as n, replaceRegexGroup as t };
@@ -0,0 +1,23 @@
1
+ import { basename } from "node:path";
2
+ //#region src/internal/version-regex.ts
3
+ const PACKAGE_JSON_VERSION_REGEX = /"version":\s*?"(?<version>)"/;
4
+ const PACKAGE_YAML_VERSION_REGEX = /["']?version["']?:\s+?["']?(?<version>)["']?/;
5
+ const CARGO_TOML_VERSION_REGEX = /^version\s*=\s*"(?<version>\w*?)"/;
6
+ function getVersionRegexFor(versionFile) {
7
+ const filename = basename(versionFile);
8
+ switch (filename) {
9
+ case "package.json":
10
+ case "package.jsonc":
11
+ case "package.json5":
12
+ case "deno.json":
13
+ case "deno.jsonc":
14
+ case "jsr.json":
15
+ case "jsr.jsonc": return PACKAGE_JSON_VERSION_REGEX;
16
+ case "package.yaml":
17
+ case "package.yml": return PACKAGE_YAML_VERSION_REGEX;
18
+ case "Cargo.toml": return CARGO_TOML_VERSION_REGEX;
19
+ default: throw new Error(`Unknown version file: ${filename}`);
20
+ }
21
+ }
22
+ //#endregion
23
+ export { getVersionRegexFor as t };
@@ -0,0 +1,25 @@
1
+ //#region src/internal/wait-for-child-process.ts
2
+ function waitForChildProcess(child) {
3
+ return new Promise((resolve, reject) => {
4
+ let stdout = "";
5
+ let stderr = "";
6
+ child.stdout.on("data", (data) => {
7
+ stdout += data.toString();
8
+ });
9
+ child.stderr.on("data", (data) => {
10
+ stderr += data.toString();
11
+ });
12
+ child.on("close", (code) => {
13
+ if (code === 0) resolve({
14
+ stdout,
15
+ stderr
16
+ });
17
+ else reject(/* @__PURE__ */ new Error(`Child process exited with code ${code}\n${stderr}`));
18
+ });
19
+ child.on("error", (err) => {
20
+ reject(err);
21
+ });
22
+ });
23
+ }
24
+ //#endregion
25
+ export { waitForChildProcess as t };
package/package.json ADDED
@@ -0,0 +1,134 @@
1
+ {
2
+ "name": "@aklinker1/zero-changelog",
3
+ "version": "0.1.0",
4
+ "description": "Zero-dependency, conventional commit release and changelog generator with monorepo support",
5
+ "keywords": [
6
+ "changelog",
7
+ "conventional commit",
8
+ "monorepo",
9
+ "release notes"
10
+ ],
11
+ "license": "MIT",
12
+ "files": [
13
+ "dist/"
14
+ ],
15
+ "type": "module",
16
+ "exports": {
17
+ "./conventional-commit": {
18
+ "types": "./dist/conventional-commit.d.mts",
19
+ "default": "./dist/conventional-commit.mjs"
20
+ },
21
+ "./get-github-release": {
22
+ "types": "./dist/get-github-release.d.mts",
23
+ "default": "./dist/get-github-release.mjs"
24
+ },
25
+ "./get-release-notes": {
26
+ "types": "./dist/get-release-notes.d.mts",
27
+ "default": "./dist/get-release-notes.mjs"
28
+ },
29
+ "./summarize-unreleased-commits": {
30
+ "types": "./dist/summarize-unreleased-commits.d.mts",
31
+ "default": "./dist/summarize-unreleased-commits.mjs"
32
+ },
33
+ "./list-commits-since": {
34
+ "types": "./dist/list-commits-since.d.mts",
35
+ "default": "./dist/list-commits-since.mjs"
36
+ },
37
+ "./find-previous-tag": {
38
+ "types": "./dist/find-previous-tag.d.mts",
39
+ "default": "./dist/find-previous-tag.mjs"
40
+ },
41
+ "./get-github-repo": {
42
+ "types": "./dist/get-github-repo.d.mts",
43
+ "default": "./dist/get-github-repo.mjs"
44
+ },
45
+ "./detect-version-bump": {
46
+ "types": "./dist/detect-version-bump.d.mts",
47
+ "default": "./dist/detect-version-bump.mjs"
48
+ },
49
+ "./parse-changelog": {
50
+ "types": "./dist/parse-changelog.d.mts",
51
+ "default": "./dist/parse-changelog.mjs"
52
+ },
53
+ "./sync-releases": {
54
+ "types": "./dist/sync-releases.d.mts",
55
+ "default": "./dist/sync-releases.mjs"
56
+ },
57
+ "./parse-commit": {
58
+ "types": "./dist/parse-commit.d.mts",
59
+ "default": "./dist/parse-commit.mjs"
60
+ },
61
+ "./semver-type-map": {
62
+ "types": "./dist/semver-type-map.d.mts",
63
+ "default": "./dist/semver-type-map.mjs"
64
+ },
65
+ "./changelog-section": {
66
+ "types": "./dist/changelog-section.d.mts",
67
+ "default": "./dist/changelog-section.mjs"
68
+ },
69
+ "./release": {
70
+ "types": "./dist/release.d.mts",
71
+ "default": "./dist/release.mjs"
72
+ },
73
+ "./git-commit": {
74
+ "types": "./dist/git-commit.d.mts",
75
+ "default": "./dist/git-commit.mjs"
76
+ },
77
+ "./parse-commits": {
78
+ "types": "./dist/parse-commits.d.mts",
79
+ "default": "./dist/parse-commits.mjs"
80
+ },
81
+ "./update-version-files": {
82
+ "types": "./dist/update-version-files.d.mts",
83
+ "default": "./dist/update-version-files.mjs"
84
+ },
85
+ "./get-current-version": {
86
+ "types": "./dist/get-current-version.d.mts",
87
+ "default": "./dist/get-current-version.mjs"
88
+ },
89
+ "./semver-type": {
90
+ "types": "./dist/semver-type.d.mts",
91
+ "default": "./dist/semver-type.mjs"
92
+ },
93
+ "./semver": {
94
+ "types": "./dist/semver.d.mts",
95
+ "default": "./dist/semver.mjs"
96
+ },
97
+ "./create-github-release": {
98
+ "types": "./dist/create-github-release.d.mts",
99
+ "default": "./dist/create-github-release.mjs"
100
+ },
101
+ "./serialize-changelog": {
102
+ "types": "./dist/serialize-changelog.d.mts",
103
+ "default": "./dist/serialize-changelog.mjs"
104
+ },
105
+ "./sync-release": {
106
+ "types": "./dist/sync-release.d.mts",
107
+ "default": "./dist/sync-release.mjs"
108
+ }
109
+ },
110
+ "scripts": {
111
+ "check": "check",
112
+ "test": "bun test",
113
+ "test:watch": "bun test --watch",
114
+ "build": "bun run --sequential 'build:*'",
115
+ "build:npm": "tsdown src/*.ts src/semver-types/*.ts --dts.tsgo",
116
+ "build:actions": "tsdown src/actions/*.ts --minify --d actions/dist",
117
+ "build:exports": "bun run scripts/gen-export-maps.ts",
118
+ "prepack": "bun run build:npm"
119
+ },
120
+ "devDependencies": {
121
+ "@actions/core": "^3.0.0",
122
+ "@actions/glob": "^0.7.0",
123
+ "@aklinker1/check": "^2.4.0",
124
+ "@aklinker1/zero-factory": "^1.2.1",
125
+ "@types/bun": "latest",
126
+ "@typescript/native-preview": "^7.0.0-dev.20260420.1",
127
+ "cspell": "^10.0.0",
128
+ "dedent": "^1.7.2",
129
+ "oxfmt": "^0.46.0",
130
+ "oxlint": "^1.60.0",
131
+ "publint": "^0.3.18",
132
+ "tsdown": "^0.21.10"
133
+ }
134
+ }