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}`,