From f4f2b5e20df769821794c3c3878f9f930eba6c7b Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Sun, 31 May 2026 17:32:54 +0330 Subject: [PATCH 1/3] feat(cli): support --bin for monorepos --- packages/app/server/routes/publish.post.ts | 30 ++++++++++++++++++-- packages/app/server/utils/markdown.ts | 10 ++++--- packages/cli/index.ts | 32 ++++++++++++++++++++-- 3 files changed, 63 insertions(+), 9 deletions(-) diff --git a/packages/app/server/routes/publish.post.ts b/packages/app/server/routes/publish.post.ts index f4b0bfda..88c8f4db 100644 --- a/packages/app/server/routes/publish.post.ts +++ b/packages/app/server/routes/publish.post.ts @@ -23,6 +23,7 @@ export default eventHandler(async (event) => { "sb-comment": commentHeader, "sb-compact": compactHeader, "sb-bin": binHeader, + "sb-bin-packages": binPackagesHeader, "sb-package-manager": packageManagerHeader, "sb-only-templates": onlyTemplatesHeader, "sb-comment-with-sha": commentWithShaHeader, @@ -32,7 +33,10 @@ export default eventHandler(async (event) => { const compact = compactHeader === "true"; const onlyTemplates = onlyTemplatesHeader === "true"; const comment: Comment = (commentHeader ?? "update") as Comment; - const bin = binHeader === "true"; + const isBinPackage = parseBinPackagesHeader( + binPackagesHeader, + binHeader === "true", + ); const packageManager: PackageManager = (packageManagerHeader as PackageManager) || "npm"; const commentWithSha = commentWithShaHeader === "true"; @@ -271,7 +275,7 @@ export default eventHandler(async (event) => { workflowData, compact, packageManager, - bin, + isBinPackage, commentWithDev, ), }, @@ -328,7 +332,7 @@ export default eventHandler(async (event) => { checkRunUrl, packageManager, commentWithSha || comment !== "update" ? "sha" : "ref", - bin, + isBinPackage, commentWithDev, ); @@ -408,6 +412,26 @@ export default eventHandler(async (event) => { } }); +function parseBinPackagesHeader( + header: string | undefined, + legacyBinAll: boolean, +): (packageName: string) => boolean { + if (header === undefined) { + return legacyBinAll ? () => true : () => false; + } + let parsed: unknown; + try { + parsed = JSON.parse(header); + } catch { + return () => false; + } + if (!Array.isArray(parsed)) { + return () => false; + } + const set = new Set(parsed.filter((v): v is string => typeof v === "string")); + return (name) => set.has(name); +} + async function getPullRequestState( installation: Awaited>, workflowData: WorkflowData, diff --git a/packages/app/server/utils/markdown.ts b/packages/app/server/utils/markdown.ts index 4c3a318e..bc803e95 100644 --- a/packages/app/server/utils/markdown.ts +++ b/packages/app/server/utils/markdown.ts @@ -27,7 +27,7 @@ export function generateCommitPublishMessage( workflowData: WorkflowData, compact: boolean, packageManager: PackageManager, - bin: boolean, + isBin: (packageName: string) => boolean, commentWithDev: boolean, ) { const isMoreThanFour = isMoreThanFourPackages(packages, packageManager); @@ -40,6 +40,7 @@ export function generateCommitPublishMessage( workflowData, compact, ); + const packageIsBin = isBin(packageName); return packageManager .split(",") .map((pm) => { @@ -51,7 +52,7 @@ export function generateCommitPublishMessage( return ` \`\`\` - ${bin ? binCommands[pm as PackageManager] : installCommands[pm as PackageManager]} ${descriptor} + ${packageIsBin ? binCommands[pm as PackageManager] : installCommands[pm as PackageManager]} ${descriptor} \`\`\` `; }) @@ -83,7 +84,7 @@ export function generatePullRequestPublishMessage( checkRunUrl: string, packageManager: PackageManager, base: "sha" | "ref", - bin: boolean, + isBin: (packageName: string) => boolean, commentWithDev: boolean, ) { const isMoreThanFour = isMoreThanFourPackages(packages, packageManager); @@ -96,6 +97,7 @@ export function generatePullRequestPublishMessage( workflowData, compact, ); + const packageIsBin = isBin(packageName); return packageManager .split(",") .map((pm) => { @@ -105,7 +107,7 @@ export function generatePullRequestPublishMessage( return ` \`\`\` - ${bin ? binCommands[pm as PackageManager] : installCommands[pm as PackageManager]} ${refUrl + (commentWithDev ? " -D" : "")} + ${packageIsBin ? binCommands[pm as PackageManager] : installCommands[pm as PackageManager]} ${refUrl + (commentWithDev ? " -D" : "")} \`\`\` `; }) diff --git a/packages/cli/index.ts b/packages/cli/index.ts index e48a1c7c..13803fda 100644 --- a/packages/cli/index.ts +++ b/packages/cli/index.ts @@ -187,7 +187,17 @@ const main = defineCommand({ const isPeerDepsEnabled = !!args.peerDeps; const isOnlyTemplates = !!args["only-templates"]; - const isBinaryApplication = !!args.bin; + const binArg = args.bin as boolean | string | undefined; + const binAllPackages = + binArg === true || + (typeof binArg === "string" && binArg.toLowerCase() === "true"); + const binExplicitNames = + typeof binArg === "string" && !binAllPackages + ? binArg + .split(",") + .map((s) => s.trim()) + .filter(Boolean) + : []; const isCommentWithSha = !!args.commentWithSha; const isCommentWithDev = !!args.commentWithDev; const comment: Comment = args.comment as Comment; @@ -397,6 +407,23 @@ const main = defineCommand({ } } + const knownPackageNames = new Set( + packageInfos.map((info) => info.packageName), + ); + const binPackages = new Set( + binAllPackages + ? knownPackageNames + : binExplicitNames.filter((name) => { + if (knownPackageNames.has(name)) { + return true; + } + console.warn( + `--bin: '${name}' does not match any package being published (known: ${[...knownPackageNames].join(", ") || "(none)"}). Ignoring.`, + ); + return false; + }), + ); + if (isCompact) { for (const { packageName } of packageInfos) { try { @@ -737,7 +764,8 @@ const main = defineCommand({ "sb-key": key, "sb-shasums": JSON.stringify(shasums), "sb-run-id": GITHUB_RUN_ID, - "sb-bin": `${isBinaryApplication}`, + "sb-bin": `${binPackages.size > 0 && binPackages.size === knownPackageNames.size}`, + "sb-bin-packages": JSON.stringify([...binPackages]), "sb-package-manager": selectedPackageManager.join(","), "sb-only-templates": `${isOnlyTemplates}`, "sb-comment-with-sha": `${isCommentWithSha}`, From 03e5c00bf8241862fba8c1ac683a216c3069257b Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Sun, 31 May 2026 17:45:48 +0330 Subject: [PATCH 2/3] update --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e4a6f73c..8887d8c2 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "scripts": { "dev": "pnpm -r run dev", "build": "pnpm -r run build", - "publish:playgrounds": "pnpm pkg-pr-new publish './playgrounds/*' ./packages/cli --template './templates/*' --peerDeps", + "publish:playgrounds": "pnpm pkg-pr-new publish './playgrounds/*' ./packages/cli --template './templates/*' --peerDeps --bin playground-a,pkg-pr-new", "format": "prettier --write --cache .", "lint": "pnpm run lint:fix && pnpm run lint:format && pnpm run lint:js", "lint:js": "eslint --cache .", From 2a795e31981e8cab1ca7937bd088b3abe9edac14 Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Sun, 31 May 2026 18:00:13 +0330 Subject: [PATCH 3/3] update --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8887d8c2..e4a6f73c 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "scripts": { "dev": "pnpm -r run dev", "build": "pnpm -r run build", - "publish:playgrounds": "pnpm pkg-pr-new publish './playgrounds/*' ./packages/cli --template './templates/*' --peerDeps --bin playground-a,pkg-pr-new", + "publish:playgrounds": "pnpm pkg-pr-new publish './playgrounds/*' ./packages/cli --template './templates/*' --peerDeps", "format": "prettier --write --cache .", "lint": "pnpm run lint:fix && pnpm run lint:format && pnpm run lint:js", "lint:js": "eslint --cache .",