@mlaursen/release-script 0.1.0 → 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/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +40 -14
- package/dist/index.mjs.map +1 -1
- package/package.json +17 -22
- package/src/createRelease.ts +2 -2
- package/src/release.ts +21 -13
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sources":["../types/createRelease.d.ts","../types/getPendingReleases.d.ts","../types/release.d.ts"],"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sources":["../types/createRelease.d.ts","../types/getPendingReleases.d.ts","../types/release.d.ts"],"mappings":"AAAA,UAAU,gCAAgC;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,oBAAoB,SAAS,gCAAgC;AACvE;AACA;AACA;AACA;AACA;AACA,iBAAiB,aAAa,UAAU,oBAAoB,GAAG,OAAO;;ACvBtE,UAAU,yBAAyB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA;AACA,mCAAmC,WAAW;AAC9C;;ACrBA,UAAU,cAAc,SAAS,gCAAgC,EAAE,yBAAyB;AAC5F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO,UAAU,cAAc,GAAG,OAAO;;;;","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import confirm from '@inquirer/confirm';
|
|
2
2
|
import { Octokit } from '@octokit/core';
|
|
3
3
|
import dotenv from 'dotenv';
|
|
4
|
-
import { execSync } from 'node:child_process';
|
|
4
|
+
import { execSync, spawnSync } from 'node:child_process';
|
|
5
5
|
import { readFile } from 'node:fs/promises';
|
|
6
6
|
import { resolve } from 'node:path';
|
|
7
7
|
import input from '@inquirer/input';
|
|
8
8
|
|
|
9
9
|
async function createRelease(options) {
|
|
10
|
-
const { body, override, owner = "mlaursen", repo, prerelease, envPath = ".env.local", tagName, tokenName = "GITHUB_RELEASE_TOKEN" } = options;
|
|
10
|
+
const { body, override = false, owner = "mlaursen", repo, prerelease, envPath = ".env.local", tagName, tokenName = "GITHUB_RELEASE_TOKEN" } = options;
|
|
11
11
|
dotenv.config({
|
|
12
12
|
path: envPath,
|
|
13
13
|
override,
|
|
@@ -33,7 +33,9 @@ async function createRelease(options) {
|
|
|
33
33
|
if (!await confirm({
|
|
34
34
|
message: "Try creating the Github release again?"
|
|
35
35
|
})) {
|
|
36
|
-
throw new Error("Unable to create a Github release"
|
|
36
|
+
throw new Error("Unable to create a Github release", {
|
|
37
|
+
cause: error
|
|
38
|
+
});
|
|
37
39
|
}
|
|
38
40
|
return createRelease({
|
|
39
41
|
...options,
|
|
@@ -140,29 +142,53 @@ async function getPendingReleases(options) {
|
|
|
140
142
|
return pending;
|
|
141
143
|
}
|
|
142
144
|
|
|
143
|
-
const exec = (command, opts)=>{
|
|
144
|
-
|
|
145
|
-
|
|
145
|
+
const exec = (command, args, opts)=>{
|
|
146
|
+
const cmd = command + " " + args.join(" ");
|
|
147
|
+
console.log(cmd);
|
|
148
|
+
const result = spawnSync(command, args, opts);
|
|
149
|
+
if (result.status !== 0) {
|
|
150
|
+
throw new Error(`${cmd} failed with exit code: ${result.status ?? 1}`);
|
|
151
|
+
}
|
|
146
152
|
};
|
|
147
153
|
async function release(options) {
|
|
148
|
-
const { owner, repo, envPath, cleanCommand = "clean", buildCommand = "build", skipBuild = !buildCommand, versionMessage = "build(version): version package" } = options;
|
|
154
|
+
const { owner = "mlaursen", repo, envPath = ".env.local", cleanCommand = "clean", buildCommand = "build", skipBuild = !buildCommand, versionMessage = "build(version): version package" } = options;
|
|
149
155
|
const pkgManager = await getPackageManager();
|
|
150
156
|
if (!skipBuild) {
|
|
151
|
-
exec(
|
|
152
|
-
|
|
157
|
+
exec(pkgManager, [
|
|
158
|
+
cleanCommand
|
|
159
|
+
]);
|
|
160
|
+
exec(pkgManager, [
|
|
161
|
+
buildCommand
|
|
162
|
+
]);
|
|
153
163
|
}
|
|
154
164
|
await continueRelease();
|
|
155
|
-
exec(
|
|
165
|
+
exec(pkgManager, [
|
|
166
|
+
"changeset",
|
|
167
|
+
"version"
|
|
168
|
+
], {
|
|
156
169
|
stdio: "inherit"
|
|
157
170
|
});
|
|
158
|
-
exec("git
|
|
171
|
+
exec("git", [
|
|
172
|
+
"add",
|
|
173
|
+
"-u"
|
|
174
|
+
]);
|
|
159
175
|
await continueRelease();
|
|
160
|
-
exec(
|
|
161
|
-
|
|
176
|
+
exec("git", [
|
|
177
|
+
"commit",
|
|
178
|
+
"-m",
|
|
179
|
+
versionMessage
|
|
180
|
+
]);
|
|
181
|
+
exec(pkgManager, [
|
|
182
|
+
"changeset",
|
|
183
|
+
"publish"
|
|
184
|
+
], {
|
|
162
185
|
stdio: "inherit"
|
|
163
186
|
});
|
|
164
187
|
const pendingReleases = await getPendingReleases(options);
|
|
165
|
-
exec("git
|
|
188
|
+
exec("git", [
|
|
189
|
+
"push",
|
|
190
|
+
"--follow-tags"
|
|
191
|
+
]);
|
|
166
192
|
for (const release of pendingReleases){
|
|
167
193
|
await createRelease({
|
|
168
194
|
owner,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/createRelease.ts","../src/continueRelease.ts","../src/getPackageManager.ts","../src/getUnpushedTags.ts","../src/getPendingReleases.ts","../src/release.ts"],"sourcesContent":["import confirm from \"@inquirer/confirm\";\nimport { Octokit } from \"@octokit/core\";\nimport dotenv from \"dotenv\";\n\nexport interface ConfigurableCreateReleaseOptions {\n repo: string;\n\n /**\n * @defaultValue `\"mlaursen\"`\n */\n owner?: string;\n\n /**\n * The `.env` file to load to get the {@link tokenName} environment variable.\n *\n * @defaultValue `\".env.local\"`\n */\n envPath?: string;\n\n /**\n * @defaultValue `\"GITHUB_RELEASE_TOKEN\"`\n */\n tokenName?: string;\n}\n\nexport interface CreateReleaseOptions extends ConfigurableCreateReleaseOptions {\n body: string;\n override?: boolean;\n tagName: string;\n prerelease: boolean;\n}\n\nexport async function createRelease(\n options: CreateReleaseOptions\n): Promise<void> {\n const {\n body,\n override,\n owner = \"mlaursen\",\n repo,\n prerelease,\n envPath = \".env.local\",\n tagName,\n tokenName = \"GITHUB_RELEASE_TOKEN\",\n } = options;\n\n dotenv.config({ path: envPath, override, quiet: true });\n const octokit = new Octokit({ auth: process.env[tokenName] });\n try {\n const response = await octokit.request(\n \"POST /repos/{owner}/{repo}/releases\",\n {\n owner,\n repo,\n tag_name: tagName,\n body,\n prerelease,\n }\n );\n\n console.log(`Created release: ${response.data.html_url}`);\n } catch (error) {\n console.error(error);\n\n console.log();\n console.log(\n \"The npm token is most likely expired or never created. Update the `.env.local` to include the latest GITHUB_TOKEN\"\n );\n console.log(\n \"Regenerate the token: https://github.com/settings/personal-access-tokens\"\n );\n if (\n !(await confirm({ message: \"Try creating the Github release again?\" }))\n ) {\n throw new Error(\"Unable to create a Github release\");\n }\n\n return createRelease({ ...options, override: true });\n }\n}\n","import confirm from \"@inquirer/confirm\";\n\nexport async function continueRelease(): Promise<void> {\n const confirmed = await confirm({ message: \"Continue the release?\" });\n if (!confirmed) {\n throw new Error(\"Release cancelled\");\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nexport type PackageManager = \"npm\" | \"yarn\" | \"pnpm\";\ninterface PartialPackageJson {\n volta?: Record<string, string>;\n packageManager?: string;\n}\n\nexport async function getPackageManager(): Promise<PackageManager> {\n const rawPackageJson = await readFile(\n resolve(process.cwd(), \"package.json\"),\n \"utf8\"\n );\n const packageJson = JSON.parse(rawPackageJson) as PartialPackageJson;\n\n if (typeof packageJson.volta === \"object\" && packageJson.volta) {\n const { volta } = packageJson;\n if (\"pnpm\" in volta) {\n return \"pnpm\";\n }\n\n if (\"yarn\" in volta) {\n return \"yarn\";\n }\n\n return \"npm\";\n }\n\n if (typeof packageJson.packageManager === \"string\") {\n const mgr = packageJson.packageManager.replace(/@.+/, \"\");\n\n if (mgr === \"pnpm\" || mgr === \"yarn\" || mgr === \"npm\") {\n return mgr;\n }\n\n throw new Error(`Unsupported package manager \"${mgr}\" in package.json`);\n }\n\n throw new Error(\"Unable to find a package manager\");\n}\n","import { execSync } from \"node:child_process\";\n\nexport const LOCAL_TAGS_COMMAND = \"git tag --sort=-creatordate\";\nexport const REMOTE_TAGS_COMMAND = \"git ls-remote --tags origin\";\n\nfunction getTags(local: boolean): Set<string> {\n const command = local ? LOCAL_TAGS_COMMAND : REMOTE_TAGS_COMMAND;\n const tags = execSync(command).toString().trim();\n const lines = tags.split(/\\r?\\n/);\n if (local) {\n return new Set(lines);\n }\n\n return new Set(\n lines.map((line) => line.replace(/^.+refs\\/tags\\//, \"\").replace(\"^{}\", \"\"))\n );\n}\n\nexport function getUnpushedTags(): readonly string[] {\n const localTags = getTags(true);\n const pushedTags = getTags(false);\n\n return [...localTags.difference(pushedTags)];\n}\n","import confirm from \"@inquirer/confirm\";\nimport input from \"@inquirer/input\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { getUnpushedTags } from \"./getUnpushedTags.js\";\n\nexport interface GetPendingReleasesOptions {\n /**\n * This should be a record of package names to paths for monorepos.\n *\n * @example Monorepo Setup\n * ```tsx\n * packagePaths: {\n * \"@react-md/core\": \"./packages/core\",\n * \"docs\": \"./apps/docs\"\n * },\n * ```\n *\n * If this is omitted or not matched, it will default to `\".\"`\n *\n * @defaultValue `{}`\n */\n packagePaths?: Record<string, string>;\n\n /**\n * A set of packages that should never attempt to create a github release.\n *\n * @defaultValue `new Set()`\n */\n disableGithubReleasePackages?: ReadonlySet<string>;\n}\n\nexport interface PendingRelease {\n tagName: string;\n body: string;\n}\n\nexport async function getPendingReleases(\n options: GetPendingReleasesOptions\n): Promise<readonly PendingRelease[]> {\n const {\n packagePaths = {},\n disableGithubReleasePackages = new Set<string>(),\n } = options;\n const unpushedTags = getUnpushedTags();\n if (unpushedTags.length === 0) {\n throw new Error(\"Unable to find any pending releases\");\n }\n\n const pending: PendingRelease[] = [];\n for (const unpushedTag of unpushedTags) {\n const name = unpushedTag.replace(/@\\d+.+$/, \"\");\n if (\n disableGithubReleasePackages.has(name) ||\n !(await confirm({ message: `Include ${unpushedTag} in the release?` }))\n ) {\n continue;\n }\n\n let path = packagePaths[name];\n if (!path) {\n path = await input({\n message: `${name} CHANGELOG exists at:`,\n default: \".\",\n });\n }\n\n const changelog = await readFile(\n resolve(process.cwd(), path, \"CHANGELOG.md\"),\n \"utf8\"\n );\n\n let body = \"\";\n let isTracking = false;\n const lines = changelog.split(/\\r?\\n/);\n for (const line of lines) {\n if (line.startsWith(\"## \")) {\n if (isTracking) {\n break;\n }\n\n isTracking = true;\n body = line;\n } else if (isTracking) {\n body += `\\n${line}`;\n }\n }\n\n pending.push({\n body,\n tagName: unpushedTag,\n });\n }\n\n if (pending.length === 0) {\n throw new Error(\"No pending releases were confirmed\");\n }\n\n return pending;\n}\n","import { type ExecSyncOptions, execSync } from \"node:child_process\";\n\nimport { continueRelease } from \"./continueRelease.js\";\nimport {\n type ConfigurableCreateReleaseOptions,\n createRelease,\n} from \"./createRelease.js\";\nimport { getPackageManager } from \"./getPackageManager.js\";\nimport {\n type GetPendingReleasesOptions,\n getPendingReleases,\n} from \"./getPendingReleases.js\";\n\nconst exec = (command: string, opts?: ExecSyncOptions): void => {\n console.log(command);\n execSync(command, opts);\n};\n\nexport interface ReleaseOptions\n extends ConfigurableCreateReleaseOptions, GetPendingReleasesOptions {\n /**\n * @defaultValue `!buildCommand`\n */\n skipBuild?: boolean;\n\n /**\n * @defaultValue `\"clean\"`\n */\n cleanCommand?: string;\n\n /**\n * @defaultValue `\"build\"`\n */\n buildCommand?: string;\n\n /**\n * @defaultValue `\"build(version): version package\"`\n */\n versionMessage?: string;\n}\n\nexport async function release(options: ReleaseOptions): Promise<void> {\n const {\n owner,\n repo,\n envPath,\n cleanCommand = \"clean\",\n buildCommand = \"build\",\n skipBuild = !buildCommand,\n versionMessage = \"build(version): version package\",\n } = options;\n\n const pkgManager = await getPackageManager();\n\n if (!skipBuild) {\n exec(`${pkgManager} ${cleanCommand}`);\n exec(`${pkgManager} ${buildCommand}`);\n }\n await continueRelease();\n\n exec(\"pnpm changeset version\", { stdio: \"inherit\" });\n exec(\"git add -u\");\n await continueRelease();\n\n exec(`git commit -m \"${versionMessage}\"`);\n exec(`${pkgManager} changeset publish`, { stdio: \"inherit\" });\n const pendingReleases = await getPendingReleases(options);\n\n exec(\"git push --follow-tags\");\n\n for (const release of pendingReleases) {\n await createRelease({\n owner,\n repo,\n body: release.body,\n tagName: release.tagName,\n envPath,\n prerelease: /-(alpha|next|beta)\\.\\d+$/.test(release.tagName),\n });\n }\n}\n"],"names":["createRelease","options","body","override","owner","repo","prerelease","envPath","tagName","tokenName","dotenv","config","path","quiet","octokit","Octokit","auth","process","env","response","request","tag_name","console","log","data","html_url","error","confirm","message","Error","continueRelease","confirmed","getPackageManager","rawPackageJson","readFile","resolve","cwd","packageJson","JSON","parse","volta","packageManager","mgr","replace","LOCAL_TAGS_COMMAND","REMOTE_TAGS_COMMAND","getTags","local","command","tags","execSync","toString","trim","lines","split","Set","map","line","getUnpushedTags","localTags","pushedTags","difference","getPendingReleases","packagePaths","disableGithubReleasePackages","unpushedTags","length","pending","unpushedTag","name","has","input","default","changelog","isTracking","startsWith","push","exec","opts","release","cleanCommand","buildCommand","skipBuild","versionMessage","pkgManager","stdio","pendingReleases","test"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/createRelease.ts","../src/continueRelease.ts","../src/getPackageManager.ts","../src/getUnpushedTags.ts","../src/getPendingReleases.ts","../src/release.ts"],"sourcesContent":["import confirm from \"@inquirer/confirm\";\nimport { Octokit } from \"@octokit/core\";\nimport dotenv from \"dotenv\";\n\nexport interface ConfigurableCreateReleaseOptions {\n repo: string;\n\n /**\n * @defaultValue `\"mlaursen\"`\n */\n owner?: string;\n\n /**\n * The `.env` file to load to get the {@link tokenName} environment variable.\n *\n * @defaultValue `\".env.local\"`\n */\n envPath?: string;\n\n /**\n * @defaultValue `\"GITHUB_RELEASE_TOKEN\"`\n */\n tokenName?: string;\n}\n\nexport interface CreateReleaseOptions extends ConfigurableCreateReleaseOptions {\n body: string;\n override?: boolean;\n tagName: string;\n prerelease: boolean;\n}\n\nexport async function createRelease(\n options: CreateReleaseOptions\n): Promise<void> {\n const {\n body,\n override = false,\n owner = \"mlaursen\",\n repo,\n prerelease,\n envPath = \".env.local\",\n tagName,\n tokenName = \"GITHUB_RELEASE_TOKEN\",\n } = options;\n\n dotenv.config({ path: envPath, override, quiet: true });\n const octokit = new Octokit({ auth: process.env[tokenName] });\n try {\n const response = await octokit.request(\n \"POST /repos/{owner}/{repo}/releases\",\n {\n owner,\n repo,\n tag_name: tagName,\n body,\n prerelease,\n }\n );\n\n console.log(`Created release: ${response.data.html_url}`);\n } catch (error) {\n console.error(error);\n\n console.log();\n console.log(\n \"The npm token is most likely expired or never created. Update the `.env.local` to include the latest GITHUB_TOKEN\"\n );\n console.log(\n \"Regenerate the token: https://github.com/settings/personal-access-tokens\"\n );\n if (\n !(await confirm({ message: \"Try creating the Github release again?\" }))\n ) {\n throw new Error(\"Unable to create a Github release\", { cause: error });\n }\n\n return createRelease({ ...options, override: true });\n }\n}\n","import confirm from \"@inquirer/confirm\";\n\nexport async function continueRelease(): Promise<void> {\n const confirmed = await confirm({ message: \"Continue the release?\" });\n if (!confirmed) {\n throw new Error(\"Release cancelled\");\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nexport type PackageManager = \"npm\" | \"yarn\" | \"pnpm\";\ninterface PartialPackageJson {\n volta?: Record<string, string>;\n packageManager?: string;\n}\n\nexport async function getPackageManager(): Promise<PackageManager> {\n const rawPackageJson = await readFile(\n resolve(process.cwd(), \"package.json\"),\n \"utf8\"\n );\n const packageJson = JSON.parse(rawPackageJson) as PartialPackageJson;\n\n if (typeof packageJson.volta === \"object\" && packageJson.volta) {\n const { volta } = packageJson;\n if (\"pnpm\" in volta) {\n return \"pnpm\";\n }\n\n if (\"yarn\" in volta) {\n return \"yarn\";\n }\n\n return \"npm\";\n }\n\n if (typeof packageJson.packageManager === \"string\") {\n const mgr = packageJson.packageManager.replace(/@.+/, \"\");\n\n if (mgr === \"pnpm\" || mgr === \"yarn\" || mgr === \"npm\") {\n return mgr;\n }\n\n throw new Error(`Unsupported package manager \"${mgr}\" in package.json`);\n }\n\n throw new Error(\"Unable to find a package manager\");\n}\n","import { execSync } from \"node:child_process\";\n\nexport const LOCAL_TAGS_COMMAND = \"git tag --sort=-creatordate\";\nexport const REMOTE_TAGS_COMMAND = \"git ls-remote --tags origin\";\n\nfunction getTags(local: boolean): Set<string> {\n const command = local ? LOCAL_TAGS_COMMAND : REMOTE_TAGS_COMMAND;\n const tags = execSync(command).toString().trim();\n const lines = tags.split(/\\r?\\n/);\n if (local) {\n return new Set(lines);\n }\n\n return new Set(\n lines.map((line) => line.replace(/^.+refs\\/tags\\//, \"\").replace(\"^{}\", \"\"))\n );\n}\n\nexport function getUnpushedTags(): readonly string[] {\n const localTags = getTags(true);\n const pushedTags = getTags(false);\n\n return [...localTags.difference(pushedTags)];\n}\n","import confirm from \"@inquirer/confirm\";\nimport input from \"@inquirer/input\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { getUnpushedTags } from \"./getUnpushedTags.js\";\n\nexport interface GetPendingReleasesOptions {\n /**\n * This should be a record of package names to paths for monorepos.\n *\n * @example Monorepo Setup\n * ```tsx\n * packagePaths: {\n * \"@react-md/core\": \"./packages/core\",\n * \"docs\": \"./apps/docs\"\n * },\n * ```\n *\n * If this is omitted or not matched, it will default to `\".\"`\n *\n * @defaultValue `{}`\n */\n packagePaths?: Record<string, string>;\n\n /**\n * A set of packages that should never attempt to create a github release.\n *\n * @defaultValue `new Set()`\n */\n disableGithubReleasePackages?: ReadonlySet<string>;\n}\n\nexport interface PendingRelease {\n tagName: string;\n body: string;\n}\n\nexport async function getPendingReleases(\n options: GetPendingReleasesOptions\n): Promise<readonly PendingRelease[]> {\n const {\n packagePaths = {},\n disableGithubReleasePackages = new Set<string>(),\n } = options;\n const unpushedTags = getUnpushedTags();\n if (unpushedTags.length === 0) {\n throw new Error(\"Unable to find any pending releases\");\n }\n\n const pending: PendingRelease[] = [];\n for (const unpushedTag of unpushedTags) {\n const name = unpushedTag.replace(/@\\d+.+$/, \"\");\n if (\n disableGithubReleasePackages.has(name) ||\n !(await confirm({ message: `Include ${unpushedTag} in the release?` }))\n ) {\n continue;\n }\n\n let path = packagePaths[name];\n if (!path) {\n path = await input({\n message: `${name} CHANGELOG exists at:`,\n default: \".\",\n });\n }\n\n const changelog = await readFile(\n resolve(process.cwd(), path, \"CHANGELOG.md\"),\n \"utf8\"\n );\n\n let body = \"\";\n let isTracking = false;\n const lines = changelog.split(/\\r?\\n/);\n for (const line of lines) {\n if (line.startsWith(\"## \")) {\n if (isTracking) {\n break;\n }\n\n isTracking = true;\n body = line;\n } else if (isTracking) {\n body += `\\n${line}`;\n }\n }\n\n pending.push({\n body,\n tagName: unpushedTag,\n });\n }\n\n if (pending.length === 0) {\n throw new Error(\"No pending releases were confirmed\");\n }\n\n return pending;\n}\n","import { type SpawnSyncOptions, spawnSync } from \"node:child_process\";\n\nimport { continueRelease } from \"./continueRelease.js\";\nimport {\n type ConfigurableCreateReleaseOptions,\n createRelease,\n} from \"./createRelease.js\";\nimport { getPackageManager } from \"./getPackageManager.js\";\nimport {\n type GetPendingReleasesOptions,\n getPendingReleases,\n} from \"./getPendingReleases.js\";\n\nconst exec = (\n command: string,\n args: readonly string[],\n opts?: SpawnSyncOptions\n): void => {\n const cmd = command + \" \" + args.join(\" \");\n console.log(cmd);\n const result = spawnSync(command, args, opts);\n if (result.status !== 0) {\n throw new Error(`${cmd} failed with exit code: ${result.status ?? 1}`);\n }\n};\n\nexport interface ReleaseOptions\n extends ConfigurableCreateReleaseOptions, GetPendingReleasesOptions {\n /**\n * @defaultValue `!buildCommand`\n */\n skipBuild?: boolean;\n\n /**\n * @defaultValue `\"clean\"`\n */\n cleanCommand?: string;\n\n /**\n * @defaultValue `\"build\"`\n */\n buildCommand?: string;\n\n /**\n * @defaultValue `\"build(version): version package\"`\n */\n versionMessage?: string;\n}\n\nexport async function release(options: ReleaseOptions): Promise<void> {\n const {\n owner = \"mlaursen\",\n repo,\n envPath = \".env.local\",\n cleanCommand = \"clean\",\n buildCommand = \"build\",\n skipBuild = !buildCommand,\n versionMessage = \"build(version): version package\",\n } = options;\n\n const pkgManager = await getPackageManager();\n\n if (!skipBuild) {\n exec(pkgManager, [cleanCommand]);\n exec(pkgManager, [buildCommand]);\n }\n await continueRelease();\n\n exec(pkgManager, [\"changeset\", \"version\"], { stdio: \"inherit\" });\n exec(\"git\", [\"add\", \"-u\"]);\n await continueRelease();\n\n exec(\"git\", [\"commit\", \"-m\", versionMessage]);\n exec(pkgManager, [\"changeset\", \"publish\"], { stdio: \"inherit\" });\n const pendingReleases = await getPendingReleases(options);\n\n exec(\"git\", [\"push\", \"--follow-tags\"]);\n\n for (const release of pendingReleases) {\n await createRelease({\n owner,\n repo,\n body: release.body,\n tagName: release.tagName,\n envPath,\n prerelease: /-(alpha|next|beta)\\.\\d+$/.test(release.tagName),\n });\n }\n}\n"],"names":["createRelease","options","body","override","owner","repo","prerelease","envPath","tagName","tokenName","dotenv","config","path","quiet","octokit","Octokit","auth","process","env","response","request","tag_name","console","log","data","html_url","error","confirm","message","Error","cause","continueRelease","confirmed","getPackageManager","rawPackageJson","readFile","resolve","cwd","packageJson","JSON","parse","volta","packageManager","mgr","replace","LOCAL_TAGS_COMMAND","REMOTE_TAGS_COMMAND","getTags","local","command","tags","execSync","toString","trim","lines","split","Set","map","line","getUnpushedTags","localTags","pushedTags","difference","getPendingReleases","packagePaths","disableGithubReleasePackages","unpushedTags","length","pending","unpushedTag","name","has","input","default","changelog","isTracking","startsWith","push","exec","args","opts","cmd","join","result","spawnSync","status","release","cleanCommand","buildCommand","skipBuild","versionMessage","pkgManager","stdio","pendingReleases","test"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mlaursen/release-script",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "The release script I normally use for packages I publish to npm",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -26,39 +26,34 @@
|
|
|
26
26
|
],
|
|
27
27
|
"license": "MIT",
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@changesets/cli": "^2.
|
|
30
|
-
"@inquirer/confirm": "^6.0.
|
|
31
|
-
"@inquirer/input": "^5.0.
|
|
32
|
-
"@inquirer/rawlist": "^5.
|
|
29
|
+
"@changesets/cli": "^2.30.0",
|
|
30
|
+
"@inquirer/confirm": "^6.0.11",
|
|
31
|
+
"@inquirer/input": "^5.0.11",
|
|
32
|
+
"@inquirer/rawlist": "^5.2.7",
|
|
33
33
|
"@octokit/core": "^7.0.6",
|
|
34
|
-
"dotenv": "^17.
|
|
34
|
+
"dotenv": "^17.4.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
38
38
|
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
|
39
|
-
"@types/node": "^
|
|
40
|
-
"@vitest/coverage-v8": "^4.
|
|
39
|
+
"@types/node": "^24.12.2",
|
|
40
|
+
"@vitest/coverage-v8": "^4.1.3",
|
|
41
41
|
"concurrently": "^9.2.1",
|
|
42
|
-
"eslint": "^9.39.
|
|
43
|
-
"prettier": "^3.
|
|
44
|
-
"rollup": "^4.
|
|
45
|
-
"rollup-plugin-dts": "^6.
|
|
42
|
+
"eslint": "^9.39.4",
|
|
43
|
+
"prettier": "^3.8.1",
|
|
44
|
+
"rollup": "^4.60.1",
|
|
45
|
+
"rollup-plugin-dts": "^6.4.1",
|
|
46
46
|
"rollup-plugin-swc3": "^0.12.1",
|
|
47
|
-
"typescript": "^
|
|
48
|
-
"vitest": "^4.
|
|
49
|
-
"@mlaursen/eslint-config": "12.0.
|
|
47
|
+
"typescript": "^6.0.2",
|
|
48
|
+
"vitest": "^4.1.3",
|
|
49
|
+
"@mlaursen/eslint-config": "12.0.7"
|
|
50
50
|
},
|
|
51
51
|
"publishConfig": {
|
|
52
52
|
"access": "public"
|
|
53
53
|
},
|
|
54
|
-
"lint-staged": {
|
|
55
|
-
"**/*.{js,jsx,ts,tsx,md,yml,yaml,json}": [
|
|
56
|
-
"prettier --write"
|
|
57
|
-
]
|
|
58
|
-
},
|
|
59
54
|
"volta": {
|
|
60
|
-
"node": "24.
|
|
61
|
-
"pnpm": "10.
|
|
55
|
+
"node": "24.14.1",
|
|
56
|
+
"pnpm": "10.33.0"
|
|
62
57
|
},
|
|
63
58
|
"scripts": {
|
|
64
59
|
"clean-dist": "rm -rf dist",
|
package/src/createRelease.ts
CHANGED
|
@@ -35,7 +35,7 @@ export async function createRelease(
|
|
|
35
35
|
): Promise<void> {
|
|
36
36
|
const {
|
|
37
37
|
body,
|
|
38
|
-
override,
|
|
38
|
+
override = false,
|
|
39
39
|
owner = "mlaursen",
|
|
40
40
|
repo,
|
|
41
41
|
prerelease,
|
|
@@ -72,7 +72,7 @@ export async function createRelease(
|
|
|
72
72
|
if (
|
|
73
73
|
!(await confirm({ message: "Try creating the Github release again?" }))
|
|
74
74
|
) {
|
|
75
|
-
throw new Error("Unable to create a Github release");
|
|
75
|
+
throw new Error("Unable to create a Github release", { cause: error });
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
return createRelease({ ...options, override: true });
|
package/src/release.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type SpawnSyncOptions, spawnSync } from "node:child_process";
|
|
2
2
|
|
|
3
3
|
import { continueRelease } from "./continueRelease.js";
|
|
4
4
|
import {
|
|
@@ -11,9 +11,17 @@ import {
|
|
|
11
11
|
getPendingReleases,
|
|
12
12
|
} from "./getPendingReleases.js";
|
|
13
13
|
|
|
14
|
-
const exec = (
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
const exec = (
|
|
15
|
+
command: string,
|
|
16
|
+
args: readonly string[],
|
|
17
|
+
opts?: SpawnSyncOptions
|
|
18
|
+
): void => {
|
|
19
|
+
const cmd = command + " " + args.join(" ");
|
|
20
|
+
console.log(cmd);
|
|
21
|
+
const result = spawnSync(command, args, opts);
|
|
22
|
+
if (result.status !== 0) {
|
|
23
|
+
throw new Error(`${cmd} failed with exit code: ${result.status ?? 1}`);
|
|
24
|
+
}
|
|
17
25
|
};
|
|
18
26
|
|
|
19
27
|
export interface ReleaseOptions
|
|
@@ -41,9 +49,9 @@ export interface ReleaseOptions
|
|
|
41
49
|
|
|
42
50
|
export async function release(options: ReleaseOptions): Promise<void> {
|
|
43
51
|
const {
|
|
44
|
-
owner,
|
|
52
|
+
owner = "mlaursen",
|
|
45
53
|
repo,
|
|
46
|
-
envPath,
|
|
54
|
+
envPath = ".env.local",
|
|
47
55
|
cleanCommand = "clean",
|
|
48
56
|
buildCommand = "build",
|
|
49
57
|
skipBuild = !buildCommand,
|
|
@@ -53,20 +61,20 @@ export async function release(options: ReleaseOptions): Promise<void> {
|
|
|
53
61
|
const pkgManager = await getPackageManager();
|
|
54
62
|
|
|
55
63
|
if (!skipBuild) {
|
|
56
|
-
exec(
|
|
57
|
-
exec(
|
|
64
|
+
exec(pkgManager, [cleanCommand]);
|
|
65
|
+
exec(pkgManager, [buildCommand]);
|
|
58
66
|
}
|
|
59
67
|
await continueRelease();
|
|
60
68
|
|
|
61
|
-
exec("
|
|
62
|
-
exec("git add -u");
|
|
69
|
+
exec(pkgManager, ["changeset", "version"], { stdio: "inherit" });
|
|
70
|
+
exec("git", ["add", "-u"]);
|
|
63
71
|
await continueRelease();
|
|
64
72
|
|
|
65
|
-
exec(
|
|
66
|
-
exec(
|
|
73
|
+
exec("git", ["commit", "-m", versionMessage]);
|
|
74
|
+
exec(pkgManager, ["changeset", "publish"], { stdio: "inherit" });
|
|
67
75
|
const pendingReleases = await getPendingReleases(options);
|
|
68
76
|
|
|
69
|
-
exec("git push --follow-tags");
|
|
77
|
+
exec("git", ["push", "--follow-tags"]);
|
|
70
78
|
|
|
71
79
|
for (const release of pendingReleases) {
|
|
72
80
|
await createRelease({
|