@deltabox/toolchain 2.1.1 → 2.3.4

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 (140) hide show
  1. package/CHANGELOG.md +416 -628
  2. package/README.md +6 -0
  3. package/dist/changelog.d.ts +6 -5
  4. package/dist/changelog.js +1 -1
  5. package/dist/cli/commands/providers.js +1 -1
  6. package/dist/cli/commands/reset.js +1 -1
  7. package/dist/cli/config-selection.js +1 -1
  8. package/dist/cli/index.d.ts +2 -2
  9. package/dist/cli/index.js +1 -1
  10. package/dist/cli/update-check.js +1 -1
  11. package/dist/config.d.ts +2 -2
  12. package/dist/config.js +1 -1
  13. package/dist/index.d.ts +38 -30
  14. package/dist/index.js +1 -1
  15. package/dist/migrate.d.ts +2 -2
  16. package/dist/migrate.js +1 -1
  17. package/dist/package.js +1 -1
  18. package/dist/packages/changelog/src/cli/index.js +1 -1
  19. package/dist/packages/changelog/src/index.d.ts +7 -6
  20. package/dist/packages/changelog/src/index.js +1 -1
  21. package/dist/packages/changelog/src/run-workflows.d.ts +39 -2
  22. package/dist/packages/changelog/src/run-workflows.js +1 -1
  23. package/dist/packages/changelog/src/run.d.ts +1 -1
  24. package/dist/packages/changelog/src/run.js +1 -1
  25. package/dist/packages/changelog/src/sync.js +1 -1
  26. package/dist/packages/changelog/src/templates.js +1 -1
  27. package/dist/packages/changelog/src/utils/format.d.ts +5 -3
  28. package/dist/packages/changelog/src/utils/format.js +5 -5
  29. package/dist/packages/changelog/src/utils/git.d.ts +1 -1
  30. package/dist/packages/changelog/src/utils/git.js +1 -1
  31. package/dist/packages/changelog/src/utils/reformat.d.ts +7 -2
  32. package/dist/packages/changelog/src/utils/reformat.js +5 -4
  33. package/dist/packages/changelog/src/utils/release-notes.js +1 -1
  34. package/dist/packages/changelog/src/utils/repo.js +1 -1
  35. package/dist/packages/changelog/src/utils/summary.d.ts +1 -1
  36. package/dist/packages/changelog/src/utils/types.d.ts +9 -46
  37. package/dist/packages/changelog/src/utils/versioning.d.ts +11 -14
  38. package/dist/packages/changelog/src/utils/write.js +1 -1
  39. package/dist/packages/changelog/src/workflows.d.ts +11 -3
  40. package/dist/packages/changelog/src/workflows.js +5 -5
  41. package/dist/packages/config/src/cli/index.d.ts +1 -1
  42. package/dist/packages/config/src/collect.js +1 -1
  43. package/dist/packages/config/src/config-json.js +1 -1
  44. package/dist/packages/config/src/generators/env.js +2 -2
  45. package/dist/packages/config/src/generators/markdown.js +8 -8
  46. package/dist/packages/config/src/generators/output.js +1 -0
  47. package/dist/packages/config/src/generators/types.js +3 -3
  48. package/dist/packages/config/src/index.d.ts +3 -3
  49. package/dist/packages/config/src/index.js +1 -1
  50. package/dist/packages/config/src/schema.d.ts +16 -0
  51. package/dist/packages/config/src/schema.js +1 -1
  52. package/dist/packages/config/src/types.d.ts +5 -0
  53. package/dist/packages/core/src/editor-config.js +1 -1
  54. package/dist/packages/core/src/loader.js +1 -1
  55. package/dist/packages/core/src/manifest.js +1 -1
  56. package/dist/packages/core/src/paths.js +1 -0
  57. package/dist/packages/core/src/provider-registry.js +1 -1
  58. package/dist/packages/core/src/reset.d.ts +3 -0
  59. package/dist/packages/core/src/reset.js +1 -1
  60. package/dist/packages/core/src/sync.js +1 -1
  61. package/dist/packages/core/src/vscode.js +1 -1
  62. package/dist/packages/core/src/watch.d.ts +1 -1
  63. package/dist/packages/core/src/watch.js +1 -1
  64. package/dist/packages/migrate/src/cli/index.js +1 -1
  65. package/dist/packages/migrate/src/eslint.js +1 -1
  66. package/dist/packages/migrate/src/index.d.ts +2 -2
  67. package/dist/packages/migrate/src/index.js +1 -1
  68. package/dist/packages/migrate/src/prettier.d.ts +2 -0
  69. package/dist/packages/migrate/src/prettier.js +2 -2
  70. package/dist/packages/migrate/src/vite-target.js +1 -1
  71. package/dist/packages/project/src/cli/index.js +1 -1
  72. package/dist/packages/project/src/index.d.ts +4 -4
  73. package/dist/packages/project/src/index.js +1 -1
  74. package/dist/packages/project/src/typescript.d.ts +4 -2
  75. package/dist/packages/project/src/typescript.js +2 -2
  76. package/dist/packages/shared/src/changelog-callbacks.d.ts +72 -0
  77. package/dist/packages/shared/src/config-schema/biome.d.ts +8 -1
  78. package/dist/packages/shared/src/config-schema/biome.js +1 -1
  79. package/dist/packages/shared/src/config-schema/changelog.d.ts +3049 -30
  80. package/dist/packages/shared/src/config-schema/changelog.js +1 -1
  81. package/dist/packages/shared/src/config-schema/ci.d.ts +1163 -23
  82. package/dist/packages/shared/src/config-schema/external.js +1 -0
  83. package/dist/packages/shared/src/config-schema/format.d.ts +16 -10
  84. package/dist/packages/shared/src/config-schema/format.js +1 -1
  85. package/dist/packages/shared/src/config-schema/generated/azure-pipelines.d.ts +10501 -0
  86. package/dist/packages/shared/src/config-schema/generated/biome-config.d.ts +5962 -0
  87. package/dist/packages/shared/src/config-schema/generated/github-workflow.d.ts +179 -0
  88. package/dist/packages/shared/src/config-schema/generated/gitlab-ci.d.ts +296 -0
  89. package/dist/packages/shared/src/config-schema/generated/oxfmt-config.d.ts +411 -0
  90. package/dist/packages/shared/src/config-schema/generated/oxlint-config.d.ts +2218 -0
  91. package/dist/packages/shared/src/config-schema/index.d.ts +5355 -142
  92. package/dist/packages/shared/src/config-schema/index.js +1 -1
  93. package/dist/packages/shared/src/config-schema/json.d.ts +18 -0
  94. package/dist/packages/shared/src/config-schema/json.js +1 -0
  95. package/dist/packages/shared/src/config-schema/logger.d.ts +10 -1
  96. package/dist/packages/shared/src/config-schema/logger.js +1 -1
  97. package/dist/packages/shared/src/config-schema/tsconfig.d.ts +5 -4
  98. package/dist/packages/shared/src/config-schema/tsconfig.js +1 -1
  99. package/dist/packages/shared/src/config-schema/vite.d.ts +5 -3
  100. package/dist/packages/shared/src/config-schema/vite.js +1 -1
  101. package/dist/packages/shared/src/config-schema/workflow.d.ts +946 -31
  102. package/dist/packages/shared/src/config-schema/workflow.js +1 -1
  103. package/dist/packages/shared/src/config-types.d.ts +257 -33
  104. package/dist/packages/shared/src/fs-utils.d.ts +12 -0
  105. package/dist/packages/shared/src/fs-utils.js +8 -1
  106. package/dist/packages/shared/src/index.d.ts +19 -11
  107. package/dist/packages/shared/src/index.js +1 -1
  108. package/dist/packages/shared/src/object-utils.d.ts +2 -0
  109. package/dist/packages/shared/src/object-utils.js +1 -1
  110. package/dist/packages/shared/src/registry-policy.d.ts +3 -2
  111. package/dist/packages/shared/src/registry-policy.js +1 -1
  112. package/dist/packages/shared/src/run.d.ts +2 -0
  113. package/dist/packages/shared/src/run.js +1 -1
  114. package/dist/packages/shared/src/string-utils.d.ts +7 -5
  115. package/dist/packages/shared/src/string-utils.js +2 -2
  116. package/dist/packages/shared/src/template.d.ts +2 -1
  117. package/dist/packages/shared/src/template.js +1 -1
  118. package/dist/packages/shared/src/toolchain.d.ts +14 -7
  119. package/dist/packages/shared/src/toolchain.js +1 -1
  120. package/dist/packages/shared/src/types.d.ts +5 -0
  121. package/dist/packages/shared/src/vite-defaults.d.ts +4 -3
  122. package/dist/packages/shared/src/vite-defaults.js +1 -1
  123. package/dist/packages/shared/src/yaml.js +5 -5
  124. package/dist/packages/template/src/scaffold.js +1 -1
  125. package/dist/packages/tsconfig/src/cli/generate/index.js +1 -1
  126. package/dist/packages/tsconfig/src/overrides.d.ts +5 -5
  127. package/dist/packages/tsdown/src/config/node.d.ts +5 -0
  128. package/dist/packages/tsdown/src/config/node.js +2 -2
  129. package/dist/packages/tsdown/src/index.d.ts +3 -3
  130. package/dist/packages/tsdown/src/index.js +1 -1
  131. package/dist/packages/vite/src/plugin.js +1 -1
  132. package/dist/packages/vite/src/vp.js +1 -1
  133. package/dist/project.d.ts +3 -3
  134. package/dist/project.js +1 -1
  135. package/dist/shared.d.ts +18 -10
  136. package/dist/shared.js +1 -1
  137. package/dist/tooling.js +1 -1
  138. package/dist/tsdown.d.ts +2 -2
  139. package/dist/tsdown.js +1 -1
  140. package/package.json +25 -13
@@ -1 +1 @@
1
- import"node:path";import"node:url";import.meta.url;import{__exportAll as e}from"../../../_virtual/_rolldown/runtime.js";import{parseArgsCli as t}from"./utils/args.js";import{isBreakingCommit as n}from"./utils/breaking.js";import{deriveBump as r,readCommits as i}from"./utils/git.js";import{formatBody as a,groupItems as o,parseCcSubject as s,renderGroups as c,ruleTitle as l,splitInlineDescription as u}from"./utils/format.js";import{renderChangelogEntry as d}from"./utils/version.js";import{parseExistingChangelog as f,reformatChangelogContent as p}from"./utils/reformat.js";import{buildReleaseNotes as m,normalizeReleaseVersion as h,releaseNotesFromGit as g}from"./utils/release-notes.js";import{buildSummary as _,renderCommitRef as v}from"./utils/summary.js";import{readProjectGraph as y,relatedWorkspacePaths as b}from"./utils/graph.js";import{deriveCustomBump as x,discoverVersionPackages as S,planVersions as C,readPackageVersion as w,resolveVersioning as T,writePackageVersion as E}from"./utils/versioning.js";import{main as D,runChangelog as O}from"./run.js";import{DEFAULT_WORKFLOW_DIR as k,DEFAULT_WORKFLOW_TOKENS as A,WORKFLOW_FILENAMES as j,applyWorkflowConfig as M,defaultWorkflows as N,isEnabled as P,renderCustomWorkflow as F,renderWorkflow as I,renderWorkflows as L,workflowFilePath as R}from"./workflows.js";import{resolveWorkflowId as z,resolveWorkflowTarget as B,runWorkflows as V,workflowTargets as H}from"./run-workflows.js";import{conventionalCommitsVscodeExtensions as U,conventionalCommitsVscodeSettings as W,renderCommitlintConfig as G}from"./templates.js";import{COMMITLINT_HEADER as K,COMMIT_MSG_HOOK as q,HOOK_HEADER as J,WORKFLOW_HEADER as Y,changelogSyncTask as X,commitMsgHook as Z,workflowFilePaths as Q,workflowFilenames as $}from"./sync.js";var ee=/* @__PURE__ */ e({COMMITLINT_HEADER:()=>K,COMMIT_MSG_HOOK:()=>q,DEFAULT_WORKFLOW_DIR:()=>k,DEFAULT_WORKFLOW_TOKENS:()=>A,HOOK_HEADER:()=>J,WORKFLOW_FILENAMES:()=>j,WORKFLOW_HEADER:()=>Y,applyWorkflowConfig:()=>M,buildReleaseNotes:()=>m,buildSummary:()=>_,changelogSyncTask:()=>X,commitMsgHook:()=>Z,conventionalCommitsVscodeExtensions:()=>U,conventionalCommitsVscodeSettings:()=>W,defaultWorkflows:()=>N,deriveBump:()=>r,deriveCustomBump:()=>x,discoverVersionPackages:()=>S,formatBody:()=>a,groupItems:()=>o,isBreakingCommit:()=>n,isEnabled:()=>P,main:()=>D,normalizeReleaseVersion:()=>h,parseArgsCli:()=>t,parseCcSubject:()=>s,parseExistingChangelog:()=>f,planVersions:()=>C,readCommits:()=>i,readPackageVersion:()=>w,readProjectGraph:()=>y,reformatChangelogContent:()=>p,relatedWorkspacePaths:()=>b,releaseNotesFromGit:()=>g,renderChangelogEntry:()=>d,renderCommitRef:()=>v,renderCommitlintConfig:()=>G,renderCustomWorkflow:()=>F,renderGroups:()=>c,renderWorkflow:()=>I,renderWorkflows:()=>L,resolveVersioning:()=>T,resolveWorkflowId:()=>z,resolveWorkflowTarget:()=>B,ruleTitle:()=>l,runChangelog:()=>O,runWorkflows:()=>V,splitInlineDescription:()=>u,workflowFilePath:()=>R,workflowFilePaths:()=>Q,workflowFilenames:()=>$,workflowTargets:()=>H,writePackageVersion:()=>E});export{K as COMMITLINT_HEADER,q as COMMIT_MSG_HOOK,k as DEFAULT_WORKFLOW_DIR,A as DEFAULT_WORKFLOW_TOKENS,J as HOOK_HEADER,j as WORKFLOW_FILENAMES,Y as WORKFLOW_HEADER,M as applyWorkflowConfig,m as buildReleaseNotes,_ as buildSummary,X as changelogSyncTask,Z as commitMsgHook,U as conventionalCommitsVscodeExtensions,W as conventionalCommitsVscodeSettings,N as defaultWorkflows,r as deriveBump,x as deriveCustomBump,S as discoverVersionPackages,a as formatBody,o as groupItems,n as isBreakingCommit,P as isEnabled,D as main,h as normalizeReleaseVersion,t as parseArgsCli,s as parseCcSubject,f as parseExistingChangelog,C as planVersions,i as readCommits,w as readPackageVersion,y as readProjectGraph,p as reformatChangelogContent,b as relatedWorkspacePaths,g as releaseNotesFromGit,d as renderChangelogEntry,v as renderCommitRef,G as renderCommitlintConfig,F as renderCustomWorkflow,c as renderGroups,I as renderWorkflow,L as renderWorkflows,T as resolveVersioning,z as resolveWorkflowId,B as resolveWorkflowTarget,l as ruleTitle,O as runChangelog,V as runWorkflows,u as splitInlineDescription,ee as src_exports,R as workflowFilePath,Q as workflowFilePaths,$ as workflowFilenames,H as workflowTargets,E as writePackageVersion};
1
+ import"node:path";import"node:url";import.meta.url;import{__exportAll as ee}from"../../../_virtual/_rolldown/runtime.js";import{parseArgsCli as e}from"./utils/args.js";import{isBreakingCommit as t}from"./utils/breaking.js";import{deriveBump as n,readCommits as r}from"./utils/git.js";import{formatBody as i,formatLine as a,groupItems as o,parseCcSubject as s,renderGroups as c,ruleTitle as l,splitInlineDescription as u}from"./utils/format.js";import{renderChangelogEntry as d}from"./utils/version.js";import{parseExistingChangelog as f,reformatChangelogContent as p}from"./utils/reformat.js";import{buildReleaseNotes as m,normalizeReleaseVersion as h,releaseNotesFromGit as g}from"./utils/release-notes.js";import{buildSummary as _,renderCommitRef as v}from"./utils/summary.js";import{readProjectGraph as y,relatedWorkspacePaths as b}from"./utils/graph.js";import{deriveCustomBump as x,discoverVersionPackages as S,planVersions as C,readPackageVersion as w,resolveVersioning as T,writePackageVersion as E}from"./utils/versioning.js";import{main as D,runChangelog as te}from"./run.js";import{DEFAULT_WORKFLOW_DIR as O,DEFAULT_WORKFLOW_TOKENS as k,WORKFLOW_FILENAMES as A,applyWorkflowConfig as j,defaultWorkflows as M,isEnabled as N,isVendorWorkflowSetting as P,renderCustomWorkflow as F,renderVendorWorkflow as I,renderWorkflow as L,renderWorkflows as R,workflowFilePath as z}from"./workflows.js";import{providerCli as B,resolveWorkflowId as V,resolveWorkflowTarget as H,runWorkflows as U,splitCommand as W,workflowRunCommand as G,workflowTargets as K}from"./run-workflows.js";import{conventionalCommitsVscodeExtensions as q,conventionalCommitsVscodeSettings as J,renderCommitlintConfig as Y}from"./templates.js";import{COMMITLINT_HEADER as X,COMMIT_MSG_HOOK as Z,HOOK_HEADER as Q,WORKFLOW_HEADER as $,changelogSyncTask as ne,commitMsgHook as re,workflowFilePaths as ie,workflowFilenames as ae}from"./sync.js";var oe=/* @__PURE__ */ ee({COMMITLINT_HEADER:()=>X,COMMIT_MSG_HOOK:()=>Z,DEFAULT_WORKFLOW_DIR:()=>O,DEFAULT_WORKFLOW_TOKENS:()=>k,HOOK_HEADER:()=>Q,WORKFLOW_FILENAMES:()=>A,WORKFLOW_HEADER:()=>$,applyWorkflowConfig:()=>j,buildReleaseNotes:()=>m,buildSummary:()=>_,changelogSyncTask:()=>ne,commitMsgHook:()=>re,conventionalCommitsVscodeExtensions:()=>q,conventionalCommitsVscodeSettings:()=>J,defaultWorkflows:()=>M,deriveBump:()=>n,deriveCustomBump:()=>x,discoverVersionPackages:()=>S,formatBody:()=>i,formatLine:()=>a,groupItems:()=>o,isBreakingCommit:()=>t,isEnabled:()=>N,isVendorWorkflowSetting:()=>P,main:()=>D,normalizeReleaseVersion:()=>h,parseArgsCli:()=>e,parseCcSubject:()=>s,parseExistingChangelog:()=>f,planVersions:()=>C,providerCli:()=>B,readCommits:()=>r,readPackageVersion:()=>w,readProjectGraph:()=>y,reformatChangelogContent:()=>p,relatedWorkspacePaths:()=>b,releaseNotesFromGit:()=>g,renderChangelogEntry:()=>d,renderCommitRef:()=>v,renderCommitlintConfig:()=>Y,renderCustomWorkflow:()=>F,renderGroups:()=>c,renderVendorWorkflow:()=>I,renderWorkflow:()=>L,renderWorkflows:()=>R,resolveVersioning:()=>T,resolveWorkflowId:()=>V,resolveWorkflowTarget:()=>H,ruleTitle:()=>l,runChangelog:()=>te,runWorkflows:()=>U,splitCommand:()=>W,splitInlineDescription:()=>u,workflowFilePath:()=>z,workflowFilePaths:()=>ie,workflowFilenames:()=>ae,workflowRunCommand:()=>G,workflowTargets:()=>K,writePackageVersion:()=>E});export{X as COMMITLINT_HEADER,Z as COMMIT_MSG_HOOK,O as DEFAULT_WORKFLOW_DIR,k as DEFAULT_WORKFLOW_TOKENS,Q as HOOK_HEADER,A as WORKFLOW_FILENAMES,$ as WORKFLOW_HEADER,j as applyWorkflowConfig,m as buildReleaseNotes,_ as buildSummary,ne as changelogSyncTask,re as commitMsgHook,q as conventionalCommitsVscodeExtensions,J as conventionalCommitsVscodeSettings,M as defaultWorkflows,n as deriveBump,x as deriveCustomBump,S as discoverVersionPackages,i as formatBody,a as formatLine,o as groupItems,t as isBreakingCommit,N as isEnabled,P as isVendorWorkflowSetting,D as main,h as normalizeReleaseVersion,e as parseArgsCli,s as parseCcSubject,f as parseExistingChangelog,C as planVersions,B as providerCli,r as readCommits,w as readPackageVersion,y as readProjectGraph,p as reformatChangelogContent,b as relatedWorkspacePaths,g as releaseNotesFromGit,d as renderChangelogEntry,v as renderCommitRef,Y as renderCommitlintConfig,F as renderCustomWorkflow,c as renderGroups,I as renderVendorWorkflow,L as renderWorkflow,R as renderWorkflows,T as resolveVersioning,V as resolveWorkflowId,H as resolveWorkflowTarget,l as ruleTitle,te as runChangelog,U as runWorkflows,W as splitCommand,u as splitInlineDescription,oe as src_exports,z as workflowFilePath,ie as workflowFilePaths,ae as workflowFilenames,G as workflowRunCommand,K as workflowTargets,E as writePackageVersion};
@@ -1,9 +1,11 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
+ import { WorkflowId } from "./workflows.js";
3
4
  import { ToolchainConfig } from "../../shared/src/toolchain.js";
4
5
  import "../../shared/src/index.js";
5
- import { WorkflowId } from "./workflows.js";
6
6
  //#region packages/changelog/src/run-workflows.d.ts
7
+ /** The CI vendor a workflow is written for. */
8
+ export type WorkflowProvider = 'github' | 'gitlab' | 'azure';
7
9
  export interface RunWorkflowsOptions {
8
10
  /** The project root the workflows live under. */
9
11
  cwd: string;
@@ -15,6 +17,10 @@ export interface RunWorkflowsOptions {
15
17
  config?: ToolchainConfig;
16
18
  /** The `gh` executable (default `gh`). */
17
19
  gh?: string;
20
+ /** The `glab` executable (default `glab`). */
21
+ glab?: string;
22
+ /** The `az` executable (default `az`). */
23
+ az?: string;
18
24
  }
19
25
  /** One enabled workflow as it is generated on disk. */
20
26
  export interface WorkflowTarget {
@@ -22,16 +28,24 @@ export interface WorkflowTarget {
22
28
  id: string;
23
29
  /** Whether the target comes from `ci.custom`. */
24
30
  custom: boolean;
31
+ /** The CI vendor the workflow targets (default `github`). */
32
+ provider: WorkflowProvider;
25
33
  /** The workflow file's basename. */
26
34
  file: string;
27
35
  /** The repo-relative workflow file path (custom dir/filename included). */
28
36
  path: string;
37
+ /** The Azure pipeline name to run (defaults to the file stem). */
38
+ pipeline?: string;
29
39
  }
30
40
  export interface RanWorkflow {
31
41
  id: string;
32
42
  file: string;
33
- /** The `gh` exit code (0 = triggered). */
43
+ /** The CI vendor the workflow targets. */
44
+ provider: WorkflowProvider;
45
+ /** The CLI exit code (0 = triggered). */
34
46
  code: number;
47
+ /** A user-facing failure (eg. the vendor CLI is not installed). */
48
+ error?: string;
35
49
  }
36
50
  export interface RunWorkflowsResult {
37
51
  ran: RanWorkflow[];
@@ -42,9 +56,32 @@ export declare function resolveWorkflowId(name: string): WorkflowId | undefined;
42
56
  export declare function workflowTargets(config?: ToolchainConfig): WorkflowTarget[];
43
57
  /** Find an enabled workflow by id, custom id, file basename, or relative path. */
44
58
  export declare function resolveWorkflowTarget(name: string, targets: WorkflowTarget[]): WorkflowTarget | undefined;
59
+ /** A vendor CLI invocation. */
60
+ export interface WorkflowCommand {
61
+ command: string;
62
+ args: string[];
63
+ }
64
+ /**
65
+ * The CLI command that triggers a workflow for its vendor. GitHub uses
66
+ * `gh workflow run`, GitLab `glab ci run` and Azure `az pipelines run`.
67
+ */
68
+ export declare function workflowRunCommand(target: WorkflowTarget, options?: {
69
+ ref?: string;
70
+ gh?: string;
71
+ glab?: string;
72
+ az?: string;
73
+ }): WorkflowCommand;
74
+ /** A human-readable name for a provider's CLI. */
75
+ export declare function providerCli(provider: WorkflowProvider): string;
76
+ /** Split a command string (`yarn glab`, `az.cmd`) into an executable + prefix args. */
77
+ export declare function splitCommand(command: string): {
78
+ exe: string;
79
+ prefix: string[];
80
+ };
45
81
  /**
46
82
  * Trigger the requested workflows (all enabled ones when none are named).
47
83
  * Throws when a workflow is unknown, disabled in the config or not generated.
84
+ * A missing vendor CLI is reported per workflow instead of aborting the rest.
48
85
  */
49
86
  export declare function runWorkflows(options: RunWorkflowsOptions): Promise<RunWorkflowsResult>;
50
87
  //#endregion
@@ -1 +1 @@
1
- import{default as e}from"node:path";import"node:url";import.meta.url;import{sectionConfig as t,sectionEnabled as n}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import{WORKFLOW_FILENAMES as r,isEnabled as i,workflowFilePath as a}from"./workflows.js";import o from"node:fs";import{spawn as s}from"node:child_process";function c(e){let t=e.trim().replace(/\.ya?ml$/i,``).toLowerCase();return Object.keys(r).find(e=>e===t)}function l(e){let o=n(e?.ci)?t(e?.ci):void 0;if(!o)return[];let s=[];for(let e of Object.keys(r)){let t=o[e];if(!i(t))continue;let n=a(e,t,r[e]);s.push({id:e,custom:!1,file:n.split(`/`).pop()??n,path:n})}for(let[e,t]of Object.entries(o.custom??{})){if(!i(t))continue;let n=a(e,t);s.push({id:e,custom:!0,file:n.split(`/`).pop()??n,path:n})}return s}function u(e,t){let n=e.trim(),r=n.replace(/\.ya?ml$/i,``).toLowerCase();return t.find(e=>e.id===n||e.id.toLowerCase()===n.toLowerCase()||e.file===n||e.path===n||e.file.replace(/\.ya?ml$/i,``).toLowerCase()===r)}function d(e,t,n){return new Promise(r=>{let i=s(n,e,{cwd:t,stdio:`inherit`});i.on(`error`,()=>r(1)),i.on(`exit`,e=>r(e??0))})}async function f(t){let{cwd:n}=t,r=l(t.config),i=(t.workflows??[]).map(e=>e.trim()).filter(Boolean),a;if(i.length===0){if(r.length===0)throw Error(`No workflows are enabled in dbx.config.* (ci.<workflow>).`);a=r}else{a=[];for(let e of i){let t=u(e,r);if(!t){let t=r.map(e=>e.id).join(`, `);throw Error(`Unknown or disabled workflow "${e}". Enabled workflows: ${t||`none`}.`)}a.some(e=>e.path===t.path)||a.push(t)}}let s=t.gh??`gh`,c=[];for(let r of a){let i=e.resolve(n,r.path);if(!o.existsSync(i))throw Error(`Workflow file not found: ${r.path}. Run \`dbx sync\` first.`);let a=[`workflow`,`run`,r.file];t.ref&&a.push(`--ref`,t.ref),c.push({id:r.id,file:r.file,code:await d(a,n,s)})}return{ran:c}}export{c as resolveWorkflowId,u as resolveWorkflowTarget,f as runWorkflows,l as workflowTargets};
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{spawnCross as t}from"../../shared/src/run.js";import{sectionConfig as n,sectionEnabled as r}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import{WORKFLOW_FILENAMES as i,isEnabled as a,isVendorWorkflowSetting as o,workflowFilePath as s}from"./workflows.js";import c from"node:fs";function l(e){return o(e)?e.provider:`github`}function u(e){return e.replace(/\.ya?ml$/i,``)}function d(e){let t=e.trim().replace(/\.ya?ml$/i,``).toLowerCase();return Object.keys(i).find(e=>e===t)}function f(e){let t=r(e?.ci)?n(e?.ci):void 0;if(!t)return[];let o=[];for(let e of Object.keys(i)){let n=t[e];if(!a(n))continue;let r=s(e,n,i[e]),c=r.split(`/`).pop()??r,d=l(n);o.push({id:e,custom:!1,provider:d,file:c,path:r,...d===`azure`?{pipeline:u(c)}:{}})}for(let[e,n]of Object.entries(t.custom??{})){if(!a(n))continue;let t=s(e,n),r=t.split(`/`).pop()??t,i=l(n);o.push({id:e,custom:!0,provider:i,file:r,path:t,...i===`azure`?{pipeline:u(r)}:{}})}return o}function p(e,t){let n=e.trim(),r=n.replace(/\.ya?ml$/i,``).toLowerCase();return t.find(e=>e.id===n||e.id.toLowerCase()===n.toLowerCase()||e.file===n||e.path===n||e.file.replace(/\.ya?ml$/i,``).toLowerCase()===r)}function m(e,t={}){switch(e.provider){case`gitlab`:{let e=[`ci`,`run`];return t.ref&&e.push(`--branch`,t.ref),{command:t.glab??`glab`,args:e}}case`azure`:{let n=[`pipelines`,`run`,`--name`,e.pipeline??u(e.file)];return t.ref&&n.push(`--branch`,t.ref),{command:t.az??`az`,args:n}}default:{let n=[`workflow`,`run`,e.file];return t.ref&&n.push(`--ref`,t.ref),{command:t.gh??`gh`,args:n}}}}function h(e){switch(e){case`gitlab`:return`glab`;case`azure`:return`az`;default:return`gh`}}function g(e){let[t=e,...n]=e.trim().split(/\s+/);return{exe:t,prefix:n}}function _(t,n){if(t.includes(`/`)||t.includes(`\\`))return c.existsSync(e.resolve(n,t));let r=(process.env.PATH??``).split(e.delimiter).filter(Boolean);if(/\.[A-Za-z0-9]+$/.test(t))return r.some(n=>c.existsSync(e.join(n,t)));let i=process.platform===`win32`?(process.env.PATHEXT??`.COM;.EXE;.BAT;.CMD`).split(`;`).filter(Boolean):[``];return r.some(n=>i.some(r=>c.existsSync(e.join(n,`${t}${r}`))))}function v(e,n,r){return new Promise(i=>{let a=!1,o=e=>{a||(a=!0,i(e))},s;try{s=t(e,n,{cwd:r,stdio:`inherit`})}catch{o({code:1});return}s.on(`error`,e=>{let t=e.code;o({code:1,...t===`ENOENT`?{missing:!0}:{}})}),s.on(`exit`,e=>o({code:e??0}))})}async function y(t){let{cwd:n}=t,r=f(t.config),i=(t.workflows??[]).map(e=>e.trim()).filter(Boolean),a;if(i.length===0){if(r.length===0)throw Error(`No workflows are enabled in dbx.config.* (ci.<workflow>).`);a=[];for(let e of r)a.some(t=>t.path===e.path)||a.push(e)}else{a=[];for(let e of i){let t=p(e,r);if(!t){let t=r.map(e=>e.id).join(`, `);throw Error(`Unknown or disabled workflow "${e}". Enabled workflows: ${t||`none`}.`)}a.some(e=>e.path===t.path)||a.push(t)}}let o=[];for(let r of a){let i=e.resolve(n,r.path);if(!c.existsSync(i))throw Error(`Workflow file not found: ${r.path}. Run \`dbx sync\` first.`);let a=m(r,{...t.ref?{ref:t.ref}:{},...t.gh?{gh:t.gh}:{},...t.glab?{glab:t.glab}:{},...t.az?{az:t.az}:{}}),s=h(r.provider);if(r.provider===`github`&&!r.path.replace(/\\/g,`/`).startsWith(`.github/workflows/`)){o.push({id:r.id,file:r.file,provider:r.provider,code:1,error:`\`gh workflow run\` only runs workflows under .github/workflows (got ${r.path}).`});continue}let{exe:l,prefix:u}=g(a.command);if(!_(l,n)){o.push({id:r.id,file:r.file,provider:r.provider,code:1,error:`the \`${s}\` CLI is required to run ${r.provider} workflows (install it or pass \`--${s} <cmd>\`).`});continue}let d=await v(l,[...u,...a.args],n);o.push({id:r.id,file:r.file,provider:r.provider,code:d.code,...d.missing?{error:`the \`${s}\` CLI is required to run ${r.provider} workflows (install it or pass \`--${s} <cmd>\`).`}:{}})}return{ran:o}}export{h as providerCli,d as resolveWorkflowId,p as resolveWorkflowTarget,y as runWorkflows,g as splitCommand,m as workflowRunCommand,f as workflowTargets};
@@ -1,7 +1,6 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { ChangelogConfig } from "../../shared/src/config-types.js";
4
- import "../../shared/src/index.js";
5
4
  import { parseArgsCli } from "./utils/args.js";
6
5
  import { isBreakingCommit } from "./utils/breaking.js";
7
6
  import { formatBody, groupItems, parseCcSubject, renderGroups, ruleTitle, splitInlineDescription } from "./utils/format.js";
@@ -9,6 +8,7 @@ import { deriveBump, readCommits } from "./utils/git.js";
9
8
  import { parseExistingChangelog, reformatChangelogContent } from "./utils/reformat.js";
10
9
  import { buildSummary } from "./utils/summary.js";
11
10
  import { renderChangelogEntry } from "./utils/version.js";
11
+ import "../../shared/src/index.js";
12
12
  //#region packages/changelog/src/run.d.ts
13
13
  /**
14
14
  * Run the changelog pipeline (bump versions + write changelogs). `changelog` is
@@ -1 +1 @@
1
- import{resolve as e}from"node:path";import{fileURLToPath as t}from"node:url";import.meta.url;import{logger as n}from"../../shared/src/logger.js";import{resolveCommitlintEnabled as r}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import{parseArgsCli as i}from"./utils/args.js";import"./utils/breaking.js";import{readCommits as a}from"./utils/git.js";import{changelogFiles as o,readRootVersion as s,repoRoot as c,writeVersion as l}from"./utils/repo.js";import{packageChangesForCurrent as u}from"./utils/packages.js";import"./utils/format.js";import{insertNewEntry as d,renderChangelogEntry as f,retagChangelogs as p}from"./utils/version.js";import{formatExistingChangelogs as m,parseExistingChangelog as h,reformatRootChangelog as g}from"./utils/reformat.js";import{releaseNotesFromGit as _}from"./utils/release-notes.js";import{buildSummary as v}from"./utils/summary.js";import{deriveCustomBump as y,planVersions as b,resolveVersioning as x,writePackageVersion as S}from"./utils/versioning.js";import{writeChangelogs as C}from"./utils/write.js";import{existsSync as w,readFileSync as T,realpathSync as E,writeFileSync as D}from"node:fs";import{spawnSync as O}from"node:child_process";function k(t=process.argv.slice(2),E){let k=i(t),A=E?.groups,j=E?.breaking;if(k.releaseNotes){n.raw(_(k.releaseNotes));return}if(k.formatOnly){n.info(`[format-only] Reformatting ${o().length} changelog file(s)${k.dryRun?` (dry run)`:``}.`),m(k.dryRun,k.packageChanges,A,j);return}let M=s();if(k.version){let e=k.version.trim();if(!/^\d+\.\d+\.\d+$/.test(e))throw Error(`Invalid version: ${e}`);if(e===M){n.info(`Version is already ${e}; nothing to do.`);return}l(e),p(M,e),n.info(`Retagged versions ${M} -> ${e}.`);return}let N=M;if(k.baseVersion){if(!/^\d+\.\d+\.\d+$/.test(k.baseVersion.trim()))throw Error(`Invalid base version: ${k.baseVersion}`);N=k.baseVersion.trim()}let P=k.processingMethod,F=P===`all`,I=P!==`latest`&&P!==`all`?P:k.range,L=a(I),R=x(E),z=R.provider;if(!k.dryRun&&z===`changesets`){if(O(`npx`,[`--yes`,`changeset`,`version`],{cwd:c(),stdio:`inherit`,shell:process.platform===`win32`}).status!==0)throw Error(`changesets provider failed.`);n.info(`Ran the changesets provider; changesets owns the changelog/version output.`);return}let B=y(L,R.bump,R.allowOverBump,{env:process.env,logger:n,...j===void 0?{}:{breaking:j}}),V=r(E),H=v(L,{commitlint:V,range:I,...A?{groups:A}:{},...j===void 0?{}:{breaking:j},...R.commit?{commit:R.commit}:{}});if(z&&typeof z==`object`&&typeof z.run==`function`){let e=z.run({cwd:c(),changelog:E,records:L});typeof e==`string`&&(H=e)}else if(typeof z==`function`){let e=z({cwd:c(),changelog:E,records:L});typeof e==`string`&&(H=e)}let U=b({versioning:R,rootVersion:N,bump:B,range:I,...R.bump?{bumpRules:R.bump}:{},...R.allowOverBump?{allowOverBump:!0}:{},...j===void 0?{}:{breaking:j}}),W=U.rootVersion;if(k.dryRun){let t=c(),r=e(t,`CHANGELOG.md`),i=w(r)?T(r,`utf8`):``,a=h(i)[0]?.version,o=k.packageChanges&&a?u(a):``,s=f(W,H,/* @__PURE__ */ new Date,!0,o);n.info(`[DRY-RUN] Range: ${I}`),n.info(`[DRY-RUN] Processing method: ${P}${F?` (backward reformat)`:``}`),n.info(`[DRY-RUN] Bump: ${B} (\`${N}\` -> \`${W}\`)`),n.info(`[DRY-RUN] Versioning: ${R.enabled?R.target:`disabled`}`),n.info(`[DRY-RUN] ${L.length} commit(s) scanned. Project files untouched.`),n.info(``),n.info(`Proposed new CHANGELOG.md entry (new version only):`),n.info(``),n.raw(s),n.info(`--- end of proposed entry ---`);let l=F?g(k.packageChanges,A,j):i,p=d(l,s),m=e(t,`CHANGELOG.proposed.md`);D(m,p,`utf8`),n.info(`Wrote ${m}`)}else{for(let[e,t]of U.writes)S(e,t);C(W,I,L,H,F,k.packageChanges,U.entries,V,A,j),R.enabled?n.info(`Bumped ${N} -> ${W} (${B}) from ${L.length} commit(s).`):n.info(`Wrote changelogs for ${W} (${B}) from ${L.length} commit(s); versioning disabled.`)}}const A=k,j=t(import.meta.url);process.argv[1]&&/[\\/]run\.[cm]?[jt]s$/.test(j)&&M(process.argv[1])===j&&k();function M(e){try{return E(e)}catch{return e}}export{A as main,k as runChangelog};
1
+ import{resolve as e}from"node:path";import"node:url";import.meta.url;import{logger as t}from"../../shared/src/logger.js";import{resolveCommitlintEnabled as n}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import{parseArgsCli as r}from"./utils/args.js";import"./utils/breaking.js";import{readCommits as i}from"./utils/git.js";import{changelogFiles as a,readRootVersion as o,repoRoot as s,writeVersion as c}from"./utils/repo.js";import{packageChangesForCurrent as l}from"./utils/packages.js";import"./utils/format.js";import{insertNewEntry as u,renderChangelogEntry as d,retagChangelogs as f}from"./utils/version.js";import{formatExistingChangelogs as p,parseExistingChangelog as m,reformatRootChangelog as h}from"./utils/reformat.js";import{releaseNotesFromGit as g}from"./utils/release-notes.js";import{buildSummary as _}from"./utils/summary.js";import{deriveCustomBump as v,planVersions as y,resolveVersioning as b,writePackageVersion as x}from"./utils/versioning.js";import{writeChangelogs as S}from"./utils/write.js";import{existsSync as C,readFileSync as w,writeFileSync as T}from"node:fs";import{spawnSync as E}from"node:child_process";function D(D=process.argv.slice(2),O){let k=r(D),A=O?.groups,j=O?.breaking;if(k.releaseNotes){t.raw(g(k.releaseNotes));return}if(k.formatOnly){t.info(`[format-only] Reformatting ${a().length} changelog file(s)${k.dryRun?` (dry run)`:``}.`),p(k.dryRun,k.packageChanges,A,j);return}let M=o();if(k.version){let e=k.version.trim();if(!/^\d+\.\d+\.\d+$/.test(e))throw Error(`Invalid version: ${e}`);if(e===M){t.info(`Version is already ${e}; nothing to do.`);return}if(k.dryRun){t.info(`[DRY-RUN] Would retag versions ${M} -> ${e}.`);return}c(e),f(M,e),t.info(`Retagged versions ${M} -> ${e}.`);return}let N=M;if(k.baseVersion){if(!/^\d+\.\d+\.\d+$/.test(k.baseVersion.trim()))throw Error(`Invalid base version: ${k.baseVersion}`);N=k.baseVersion.trim()}let P=k.processingMethod,F=P===`all`,I=P!==`latest`&&P!==`all`?P:k.range,L=i(I),R=b(O),z=R.provider;if(!k.dryRun&&z===`changesets`){if(E(`npx`,[`--yes`,`changeset`,`version`],{cwd:s(),stdio:`inherit`,shell:process.platform===`win32`}).status!==0)throw Error(`changesets provider failed.`);t.info(`Ran the changesets provider; changesets owns the changelog/version output.`);return}let B=v(L,R.bump,R.allowOverBump,{env:process.env,logger:t,...j===void 0?{}:{breaking:j}}),V=n(O),H=_(L,{commitlint:V,range:I,...A?{groups:A}:{},...j===void 0?{}:{breaking:j},...R.commit?{commit:R.commit}:{}});if(z&&typeof z==`object`&&typeof z.run==`function`){let e=z.run({cwd:s(),changelog:O,records:L});typeof e==`string`&&(H=e)}else if(typeof z==`function`){let e=z({cwd:s(),changelog:O,records:L});typeof e==`string`&&(H=e)}let U=y({versioning:R,rootVersion:N,bump:B,range:I,...R.bump?{bumpRules:R.bump}:{},...R.allowOverBump?{allowOverBump:!0}:{},...j===void 0?{}:{breaking:j}}),W=U.rootVersion;if(k.dryRun){let n=s(),r=e(n,`CHANGELOG.md`),i=C(r)?w(r,`utf8`):``,a=m(i)[0]?.version,o=k.packageChanges&&a?l(a):``,c=d(W,H,/* @__PURE__ */ new Date,!0,o);t.info(`[DRY-RUN] Range: ${I}`),t.info(`[DRY-RUN] Processing method: ${P}${F?` (backward reformat)`:``}`),t.info(`[DRY-RUN] Bump: ${B} (\`${N}\` -> \`${W}\`)`),t.info(`[DRY-RUN] Versioning: ${R.enabled?R.target:`disabled`}`),t.info(`[DRY-RUN] ${L.length} commit(s) scanned. Project files untouched.`),t.info(``),t.info(`Proposed new CHANGELOG.md entry (new version only):`),t.info(``),t.raw(c),t.info(`--- end of proposed entry ---`);let f=F?h(k.packageChanges,A,j):i,p=u(f,c),g=e(n,`CHANGELOG.proposed.md`);T(g,p,`utf8`),t.info(`Wrote ${g}`)}else{for(let[e,t]of U.writes)x(e,t);S(W,I,L,H,F,k.packageChanges,U.entries,V,A,j),R.enabled?t.info(`Bumped ${N} -> ${W} (${B}) from ${L.length} commit(s).`):t.info(`Wrote changelogs for ${W} (${B}) from ${L.length} commit(s); versioning disabled.`)}}const O=D;export{O as main,D as runChangelog};
@@ -1 +1 @@
1
- import{default as e}from"node:path";import"node:url";import.meta.url;import{changelogSectionEnabled as t,resolveChangelogBranches as n,resolveChangelogConfig as r,resolveCommitlintEnabled as i,sectionConfig as a,sectionEnabled as o}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import{WORKFLOW_FILENAMES as s,isEnabled as c,renderCustomWorkflow as l,renderWorkflow as u,workflowFilePath as d}from"./workflows.js";import{renderCommitlintConfig as f}from"./templates.js";import p from"node:fs";function m(e,t){return e===!1?{enabled:!1}:typeof e==`string`?e:e===!0||e===void 0?{pushBranches:t}:{pushBranches:t,...e}}function h(e){let t=o(e.ci)?a(e.ci)??{}:{};return{ci:t.ci,changelog:t.changelog,release:t.release,issues:t.issues,sync:t.sync}}function g(e,t){let n={...e},r=(e,t)=>{n[e]!==void 0&&(n[e]=m(n[e],t))};return r(`ci`,t.main),r(`release`,t.main),r(`changelog`,t.dev),r(`sync`,[.../* @__PURE__ */ new Set([...t.main,...t.dev])]),n}const _="# Generated by @deltabox/toolchain — edit dbx.config.* and run `dbx sync`.",v="// Generated by @deltabox/toolchain — edit dbx.config.* and run `dbx sync`.",y="# Generated by @deltabox/toolchain — edit dbx.config.* and run `dbx sync`.";function b(e){let t=`npx --no -- commitlint --edit "$1"`;return e?`${t} --config ${e}`:t}const x=b();function S(e){return e?e.replace(/\\/g,`/`).replace(/^\.?\//,``).replace(/\/+$/,``):``}function C(e){let t=h(e),n=[];for(let[e,r]of Object.entries(s)){let i=t[e];c(i)&&n.push(d(e,i,r))}let r=o(e.ci)?a(e.ci)?.custom??{}:{};for(let[e,t]of Object.entries(r)){let r=t;c(r)&&n.push(d(e,r))}return[...new Set(n)]}function w(e){return[...new Set(C(e).map(e=>e.split(`/`).pop()??e))]}function T(){return{name:`changelog`,projectTypes:[`monorepo-root`,`project`],enabled:e=>o(e.ci),run:m=>{let x=r(m.config)??{},C=a(x.commitlint),w=t(m.config)&&i(x),T=[],E=/* @__PURE__ */ new Set,D={},O=new Set(m.managedFiles??[]),k=t=>{if(O.has(t))return!0;let n=e.resolve(m.cwd,t);if(!p.existsSync(n))return!0;try{return p.readFileSync(n,`utf-8`).replace(/^\uFEFF/,``).startsWith(_)}catch{return!1}},A=(e,t,n,r=!1)=>{if(E.has(t))m.warn(`changelog: workflow path "${t}" is declared more than once; skipping the duplicate.`);else if(k(t))E.add(t),T.push({path:t,content:n});else{let n=r?`ci.custom.${e}`:`ci.${e}`;D[t]=n,m.warn(`changelog: ${t} already exists and is not managed by dbx; leaving it untouched. Set \`${n}: { enabled: false }\` in dbx.config to keep it explicit.`,`changelog.existing-workflow`)}},j=S(C?.dir),M=j?`${j}/commitlint.config.mjs`:`commitlint.config.mjs`,N=g(h(m.config),n(x)),P={...m.tokens,commitlintConfig:M};for(let[e,t]of Object.entries(s)){let n=N[e];if(!c(n))continue;let r=typeof n==`string`,i=r?n:u(e,{tokens:P,config:typeof n==`object`?n:{},commitlint:w});i&&A(e,d(e,n,t),r?i:`${_}\n${i}`)}let F=o(m.config.ci)?a(m.config.ci)?.custom??{}:{};for(let[e,t]of Object.entries(F)){let n=t;if(!c(n))continue;let r=typeof n==`string`,i=r?n:l(e,{tokens:P,config:typeof n==`object`?n:{},commitlint:w});i&&A(e,d(e,n),r?i:`${_}\n${i}`,!0)}return w&&(T.push({path:M,content:`${v}\n${f({...C?.types?{types:C.types}:{},...C?.scopes?{scopes:C.scopes}:{}})}`}),T.push({path:`.husky/commit-msg`,content:`${y}\n${b(j?M:void 0)}\n`})),m.manifest&&(Object.keys(D).length>0?m.manifest.workflowConflicts=D:delete m.manifest.workflowConflicts),T}}}export{v as COMMITLINT_HEADER,x as COMMIT_MSG_HOOK,y as HOOK_HEADER,_ as WORKFLOW_HEADER,T as changelogSyncTask,b as commitMsgHook,C as workflowFilePaths,w as workflowFilenames};
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{changelogSectionEnabled as t,resolveChangelogBranches as n,resolveChangelogConfig as r,resolveCommitlintEnabled as i,sectionConfig as a,sectionEnabled as o}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import{WORKFLOW_FILENAMES as s,isEnabled as c,isVendorWorkflowSetting as l,renderCustomWorkflow as u,renderVendorWorkflow as d,renderWorkflow as f,workflowFilePath as p}from"./workflows.js";import{renderCommitlintConfig as m}from"./templates.js";import h from"node:fs";function g(e,t){return e===!1?{enabled:!1}:typeof e==`string`||l(e)?e:e===!0||e===void 0?{pushBranches:t}:{pushBranches:t,...e}}function _(e){let t=o(e.ci)?a(e.ci)??{}:{};return{ci:t.ci,changelog:t.changelog,release:t.release,issues:t.issues,sync:t.sync}}function v(e,t){let n={...e},r=(e,t)=>{n[e]!==void 0&&(n[e]=g(n[e],t))};return r(`ci`,t.main),r(`release`,t.main),r(`changelog`,t.dev),r(`sync`,[.../* @__PURE__ */ new Set([...t.main,...t.dev])]),n}const y="# Generated by @deltabox/toolchain — edit dbx.config.* and run `dbx sync`.",b="// Generated by @deltabox/toolchain — edit dbx.config.* and run `dbx sync`.",x="# Generated by @deltabox/toolchain — edit dbx.config.* and run `dbx sync`.";function S(e){let t=`npx --no -- commitlint --edit "$1"`;return e?`${t} --config "${e}"`:t}const C=S();function w(e){if(!e)return``;let t=e.replace(/\\/g,`/`).replace(/^\.?\//,``).replace(/\/+$/,``);if(/^[a-zA-Z]:/.test(t)||t.split(`/`).includes(`..`))throw Error(`invalid commitlint directory "${e}" (must stay inside the project).`);return t}function T(e){let t=_(e),n=[];for(let[e,r]of Object.entries(s)){let i=t[e];c(i)&&n.push(p(e,i,r))}let r=o(e.ci)?a(e.ci)?.custom??{}:{};for(let[e,t]of Object.entries(r)){let r=t;c(r)&&n.push(p(e,r))}return[...new Set(n)]}function E(e){return[...new Set(T(e).map(e=>e.split(`/`).pop()??e))]}function D(){return{name:`changelog`,projectTypes:[`monorepo-root`,`project`],enabled:e=>o(e.ci),run:g=>{let C=r(g.config)??{},T=a(C.commitlint),E=t(g.config)&&i(C),D=[],O=/* @__PURE__ */ new Set,k={},A=new Set(g.managedFiles??[]),j=t=>{if(A.has(t))return!0;let n=e.resolve(g.cwd,t);if(!h.existsSync(n))return!0;try{return h.readFileSync(n,`utf-8`).replace(/^\uFEFF/,``).startsWith(y)}catch{return!1}},M=(e,t,n,r=!1)=>{if(O.has(t))g.warn(`changelog: workflow path "${t}" is declared more than once; skipping the duplicate.`);else if(j(t))O.add(t),D.push({path:t,content:n});else{let n=r?`ci.custom.${e}`:`ci.${e}`;k[t]=n,g.warn(`changelog: ${t} already exists and is not managed by dbx; leaving it untouched. Set \`${n}: { enabled: false }\` in dbx.config to keep it explicit.`,`changelog.existing-workflow`)}},N=w(T?.dir),P=N?`${N}/commitlint.config.mjs`:`commitlint.config.mjs`,F=v(_(g.config),n(C)),I={...g.tokens,commitlintConfig:P};for(let[e,t]of Object.entries(s)){let n=F[e];if(!c(n))continue;let r=typeof n==`string`,i=r?n:l(n)?d(n,I):f(e,{tokens:I,config:typeof n==`object`?n:{},commitlint:E});i&&M(e,p(e,n,t),r?i:`${y}\n${i}`)}let L=o(g.config.ci)?a(g.config.ci)?.custom??{}:{};for(let[e,t]of Object.entries(L)){let n=t;if(!c(n))continue;let r=typeof n==`string`,i=r?n:l(n)?d(n,I):u(e,{tokens:I,config:typeof n==`object`?n:{},commitlint:E});i&&M(e,p(e,n),r?i:`${y}\n${i}`,!0)}return E&&(D.push({path:P,content:`${b}\n${m({...T?.types?{types:T.types}:{},...T?.scopes?{scopes:T.scopes}:{}})}`}),D.push({path:`.husky/commit-msg`,content:`${x}\n${S(N?P:void 0)}\n`})),g.manifest&&(Object.keys(k).length>0?g.manifest.workflowConflicts=k:delete g.manifest.workflowConflicts),D}}}export{b as COMMITLINT_HEADER,C as COMMIT_MSG_HOOK,x as HOOK_HEADER,y as WORKFLOW_HEADER,D as changelogSyncTask,S as commitMsgHook,T as workflowFilePaths,E as workflowFilenames};
@@ -1,4 +1,4 @@
1
- import"node:path";import"node:url";import.meta.url;const e=[`feat`,`fix`,`docs`,`codegen`,`style`,`refactor`,`perf`,`test`,`build`,`ci`,`chore`,`revert`,`release`],t=[`server`,`frontend`,`cli`,`sdk`,`scripts`,`shared`,`types`,`ci`,`docker`,`security`,`release`,`deps`];function n(n={}){let r=n.types??e,i=n.scopes??t,a=(e,t)=>[` // ${t}`,...e.map(e=>` '${e}',`)].join(`
1
+ import"node:path";import"node:url";import.meta.url;const e=[`feat`,`fix`,`docs`,`codegen`,`style`,`refactor`,`perf`,`test`,`build`,`ci`,`chore`,`revert`,`release`],t=[`server`,`frontend`,`cli`,`sdk`,`scripts`,`shared`,`types`,`ci`,`docker`,`security`,`release`,`deps`];function n(n={}){let r=n.types??e,i=n.scopes??t,a=(e,t)=>[` // ${t}`,...e.map(e=>` '${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`)}',`)].join(`
2
2
  `);return`/**
3
3
  * Conventional Commits enforcement (https://www.conventionalcommits.org/en/v1.0.0/).
4
4
  * Generated by @deltabox/toolchain-changelog.
@@ -20,9 +20,11 @@ export declare function splitInlineDescription(rest: string): {
20
20
  };
21
21
  /**
22
22
  * Split a commit body into description paragraphs and conventional footers
23
- * (`KEY: value` lines), skipping bullet/numbered lists and issue-only lines so
24
- * each commit's details are rendered as nested bullets rather than one long
25
- * line. Blank lines separate paragraphs.
23
+ * (`KEY: value` lines), skipping issue-only lines. Each list item becomes its
24
+ * own paragraph and hard-wrapped lines are unwrapped, so the rendered
25
+ * description reads as sentences instead of being cut off mid-line. Blank lines
26
+ * separate paragraphs; fenced code blocks are preserved verbatim.
26
27
  */
27
28
  export declare function formatBody(body: string): string[][];
29
+ export declare function formatLine(line: string, repo: string | undefined): string;
28
30
  //#endregion
@@ -1,5 +1,5 @@
1
- import"node:path";import"node:url";import.meta.url;import{logger as e}from"../../../shared/src/logger.js";import{sanitizeText as t}from"../../../shared/src/string-utils.js";import"../../../shared/src/index.js";import{readFileSync as n,writeFileSync as r}from"node:fs";const i={feat:`New features`,fix:`Bug fixes`,refactor:`Refactors`,docs:`Documentation`,style:`Styles`,chore:`Chores`,test:`Tests`,perf:`Performance`,build:`Build system`,ci:`CI`,revert:`Reverts`,breaking:`Breaking Changes`},a=[`breaking`,`feat`,`fix`,`perf`,`refactor`,`docs`,`style`,`test`,`build`,`ci`,`chore`,`revert`];function o(e){return i[e]??i[e.toLowerCase()]??`Other changes`}function s(e){let t=/^([a-zA-Z][a-zA-Z0-9]*)(\(([^)]*)\))?(!)?:\s*(.*)$/.exec(e);return t?{type:t[1].toLowerCase(),scope:t[3]?.trim()||void 0,breaking:!!t[4],rest:t[5]??``}:{type:`chore`,breaking:!1,rest:e}}function c(e,t){if(typeof e==`function`){let n=e(t);return typeof n==`function`?void 0:n}return e}function l(e){if(!e)return[];if(Array.isArray(e)){let t=[];for(let[n,r]of e.entries())typeof r==`string`?t.push({type:r.toLowerCase(),index:n}):r&&typeof r==`object`&&r.type&&t.push({type:r.type.toLowerCase(),...r.title===void 0?{}:{title:r.title},...r.order===void 0?{}:{order:r.order},...r.hidden===void 0?{}:{hidden:r.hidden},index:n});return t}if(typeof e!=`object`)return[];let t=[];for(let[n,[r,i]]of Object.entries(e).entries()){let e=i===!1?{hidden:!0}:i===!0||i==null?{}:typeof i==`string`?{title:i}:i;t.push({type:r.toLowerCase(),...e.title===void 0?{}:{title:e.title},...e.order===void 0?{}:{order:e.order},...e.hidden===void 0?{}:{hidden:e.hidden},index:n})}return t}function u(e,t){if(typeof e==`function`){let n=e(t);return typeof n==`string`&&n.length>0?n:t.defaultTitle}return e??t.defaultTitle}function d(e,t,n){let r=typeof e==`function`?e(n):e;return typeof r==`number`&&Number.isFinite(r)?r:t}function f(e,t){return typeof e==`function`?!!e(t):e===!0}function p(e){let t=a.indexOf(e);return t===-1?a.length:t}function m(e,t){let n=/* @__PURE__ */ new Map;for(let t of e){let{parsed:e}=t,r=t.breaking||e.breaking?`breaking`:e.type,i=n.get(r)??{title:o(r),ungrouped:[],scopes:/* @__PURE__ */ new Map};if(e.scope){let n=i.scopes.get(e.scope)??[];n.push(t),i.scopes.set(e.scope,n)}else i.ungrouped.push(t);n.set(r,i)}let r=[...n.keys()],i={types:r,items:e},a=l(c(t,i)),s=[],m=/* @__PURE__ */ new Set,h=-1;for(let e of a){if(m.has(e.type))continue;let t=n.get(e.type);if(!t)continue;m.add(e.type);let r=[...t.ungrouped,...[...t.scopes.values()].flat()],a={...i,type:e.type,defaultTitle:o(e.type),index:e.index,groupItems:r},c=d(e.order,e.index,a);h=Math.max(h,c),!f(e.hidden,a)&&s.push({rule:{...t,title:u(e.title,a)},order:c,seq:e.index})}let g=r.filter(e=>!m.has(e)).sort((e,t)=>p(e)-p(t));for(let[e,t]of g.entries()){let r=n.get(t);s.push({rule:r,order:h+1+p(t),seq:a.length+e})}return s.sort((e,t)=>e.order-t.order||e.seq-t.seq).map(e=>e.rule)}function h(e){if(e.length===0)return`- No description provided.`;let t=[];for(let n of e){t.push(`### ${n.title}`);for(let e of n.ungrouped)t.push(e.text),t.push(...g(e.bodyParagraphs));for(let[e,r]of n.scopes){t.push(`#### ${_(e)}`);for(let e of r)t.push(e.text),t.push(...g(e.bodyParagraphs))}}return t.join(`
2
- `)}function g(e){let t=[];for(let n of e){let[e,...r]=n;e&&(t.push(` - ${e}`),t.push(...r.map(e=>` ${e}`)))}return t}function _(e){return e.charAt(0).toUpperCase()+e.slice(1)}function v(e){return e.length>0?e.charAt(0).toUpperCase()+e.slice(1):e}function y(e){let t=e.lastIndexOf(`([#`);if(t===-1)return{main:e,inline:``};let n=e.slice(t),r=/^(\(\[#[^\]]+\]\([^)]*\) by [^)]*\)\)?)(?:\(fixes [^)]*\)\)?)?/.exec(n);if(!r)return{main:e,inline:``};let i=r[0]??``;return{main:e.slice(0,t)+i,inline:e.slice(t+i.length).trim()}}function b(e){let n=[],r=[];for(let i of e.split(`
3
- `)){let e=t(i.trim());if(!e){r.length>0&&(n.push(r),r=[]);continue}if(e.startsWith(`-`)||e.startsWith(`*`)||/^[0-9]+[.)]/.test(e)||!e.replace(/(?:close[sd]?|fixe?s|fixed|resolves?|resolved)\b\s*:?\s*#\d+\s*[,;]?\s*/gi,``).trim())continue;let a=/^(BREAKING CHANGE|Reviewed-by|Signed-off-by|Co-authored-by|Acked-by|Co-developed-by|Helped-by|Reported-by|Suggested-by|Tested-by|Cc):\s+(.+)$/i.exec(e);a&&!/^(http|https)\b/.test(e)?(r.length>0&&(n.push(r),r=[]),n.push([`**${(a[1]??``).trim()}:** ${(a[2]??``).trim()}`])):r.push(e)}return r.length>0&&n.push(r),n}function x(e,t){return`https://github.com/${e}/commit/${t}`}function S(e,t){return`https://github.com/${e}/issues/${t}`}function C(e,t){return e.replace(/\[(#[0-9a-fA-F]{6,40})\]\(([^)]*)\)/g,(e,n)=>{let r=n.replace(`#`,``).slice(0,7);return`[#${r}](${x(t,r)})`}).replace(/(^|[^\w[])#([0-9a-fA-F]{7,40})(?![0-9a-fA-F])(?=[)\].,;:\s]|$)/g,(e,n,r)=>{let i=r.slice(0,7);return`${n}[#${i}](${x(t,i)})`})}function w(e,t){return e.replace(/\[#(\d+)(?=[ \]])(?:[^\]]*)\]\([^)]*\)/g,(e,n)=>`[#${n}](${S(t,n)})`).replace(/(^|[^\w[])#(\d+)(?=[)\].,;:\s]|$)/g,(e,n,r)=>`${n}[#${r}](${S(t,r)})`)}function T(e,t){if(!t)return e;let n=C(e,t);return n=w(n,t),n}function E(t,i){if(!i)return;let a=n(t,`utf8`),o=a.split(`
4
- `).map(e=>T(e,i)).join(`
5
- `);o!==a&&(r(t,o,`utf8`),e.info(` formatted ${t}`))}export{v as capitalize,b as formatBody,E as formatChangelogFile,T as formatLine,m as groupItems,s as parseCcSubject,h as renderGroups,o as ruleTitle,y as splitInlineDescription};
1
+ import"node:path";import"node:url";import.meta.url;import{logger as e}from"../../../shared/src/logger.js";import{sanitizeText as t}from"../../../shared/src/string-utils.js";import"../../../shared/src/index.js";import{hasCompleteGitHistory as n,readCommit as r}from"./git.js";import{readFileSync as i,writeFileSync as a}from"node:fs";const o={feat:`New features`,fix:`Bug fixes`,refactor:`Refactors`,docs:`Documentation`,style:`Styles`,chore:`Chores`,test:`Tests`,perf:`Performance`,build:`Build system`,ci:`CI`,revert:`Reverts`,breaking:`Breaking Changes`},s=[`breaking`,`feat`,`fix`,`perf`,`refactor`,`docs`,`style`,`test`,`build`,`ci`,`chore`,`revert`];function c(e){return o[e]??o[e.toLowerCase()]??`Other changes`}function l(e){let t=/^([a-zA-Z][a-zA-Z0-9]*)(\(([^)]*)\))?(!)?:\s*(.*)$/.exec(e);return t?{type:t[1].toLowerCase(),scope:t[3]?.trim()||void 0,breaking:!!t[4],rest:t[5]??``}:{type:`chore`,breaking:!1,rest:e}}function u(e,t){if(typeof e==`function`){let n=e(t);return typeof n==`function`?void 0:n}return e}function d(e){if(!e)return[];if(Array.isArray(e)){let t=[];for(let[n,r]of e.entries())typeof r==`string`?t.push({type:r.toLowerCase(),index:n}):r&&typeof r==`object`&&r.type&&t.push({type:r.type.toLowerCase(),...r.title===void 0?{}:{title:r.title},...r.order===void 0?{}:{order:r.order},...r.hidden===void 0?{}:{hidden:r.hidden},index:n});return t}if(typeof e!=`object`)return[];let t=[];for(let[n,[r,i]]of Object.entries(e).entries()){let e=i===!1?{hidden:!0}:i===!0||i==null?{}:typeof i==`string`?{title:i}:i;t.push({type:r.toLowerCase(),...e.title===void 0?{}:{title:e.title},...e.order===void 0?{}:{order:e.order},...e.hidden===void 0?{}:{hidden:e.hidden},index:n})}return t}function f(e,t){if(typeof e==`function`){let n=e(t);return typeof n==`string`&&n.length>0?n:t.defaultTitle}return e??t.defaultTitle}function p(e,t,n){let r=typeof e==`function`?e(n):e;return typeof r==`number`&&Number.isFinite(r)?r:t}function m(e,t){return typeof e==`function`?!!e(t):e===!0}function h(e){let t=s.indexOf(e);return t===-1?s.length:t}function g(e,t){let n=/* @__PURE__ */ new Map;for(let t of e){let{parsed:e}=t,r=t.breaking||e.breaking?`breaking`:e.type,i=n.get(r)??{title:c(r),ungrouped:[],scopes:/* @__PURE__ */ new Map};if(e.scope){let n=i.scopes.get(e.scope)??[];n.push(t),i.scopes.set(e.scope,n)}else i.ungrouped.push(t);n.set(r,i)}let r=[...n.keys()],i={types:r,items:e},a=d(u(t,i)),o=[],s=/* @__PURE__ */ new Set,l=-1;for(let e of a){if(s.has(e.type))continue;let t=n.get(e.type);if(!t)continue;s.add(e.type);let r=[...t.ungrouped,...[...t.scopes.values()].flat()],a={...i,type:e.type,defaultTitle:c(e.type),index:e.index,groupItems:r},u=p(e.order,e.index,a);l=Math.max(l,u),!m(e.hidden,a)&&o.push({rule:{...t,title:f(e.title,a)},order:u,seq:e.index})}let g=r.filter(e=>!s.has(e)).sort((e,t)=>h(e)-h(t));for(let[e,t]of g.entries()){let r=n.get(t);o.push({rule:r,order:l+1+h(t),seq:a.length+e})}return o.sort((e,t)=>e.order-t.order||e.seq-t.seq).map(e=>e.rule)}function _(e){if(e.length===0)return`- No description provided.`;let t=[];for(let n of e){t.push(`### ${n.title}`);for(let e of n.ungrouped)t.push(e.text),t.push(...v(e.bodyParagraphs));for(let[e,r]of n.scopes){t.push(`#### ${y(e)}`);for(let e of r)t.push(e.text),t.push(...v(e.bodyParagraphs))}}return t.join(`
2
+ `)}function v(e){let t=[];for(let n of e){let[e,...r]=n;e&&(t.push(` - ${e}`),t.push(...r.map(e=>` ${e}`)))}return t}function y(e){return e.charAt(0).toUpperCase()+e.slice(1)}function b(e){return e.length>0?e.charAt(0).toUpperCase()+e.slice(1):e}function x(e){let t=e.lastIndexOf(`([#`);if(t===-1)return{main:e,inline:``};let n=e.slice(t),r=/^(\(\[#[^\]]+\]\([^)]*\) by [^)]*\)\)?)(?:\(fixes [^)]*\)\)?)?/.exec(n);if(!r)return{main:e,inline:``};let i=r[0]??``;return{main:e.slice(0,t)+i,inline:e.slice(t+i.length).trim()}}const S=/^(?:[-*+]|\d+[.)])\s+(.*)$/,C=/^(```|~~~)/;function w(e){let n=[],r=[],i,a=()=>{r.length!==0&&(n.push([r.join(` `)]),r=[])};for(let o of e.split(`
3
+ `)){let e=t(o.trim());if(i){i.push(o.replace(/\s+$/,``)),C.test(e)&&(n.push(i),i=void 0);continue}if(!e){a();continue}if(C.test(e)){a(),i=[o.replace(/\s+$/,``)];continue}if(!e.replace(/(?:close[sd]?|fixe?s|fixed|resolves?|resolved)\b\s*:?\s*#\d+\s*[,;]?\s*/gi,``).trim())continue;let s=/^(BREAKING CHANGE|Reviewed-by|Signed-off-by|Co-authored-by|Acked-by|Co-developed-by|Helped-by|Reported-by|Suggested-by|Tested-by|Cc):\s+(.+)$/i.exec(e);if(s&&!/^(http|https)\b/.test(e)){a(),r=[`**${(s[1]??``).trim()}:** ${(s[2]??``).trim()}`];continue}let c=S.exec(e);if(c){a();let e=(c[1]??``).trim();e&&(r=[e])}else r.push(e)}return i&&n.push(i),a(),n}function T(e,t){return`https://github.com/${e}/commit/${t}`}function E(e,t){return`https://github.com/${e}/issues/${t}`}function D(e){return r(e)??r(e.slice(0,7))?!0:!n()&&/[a-f]/i.test(e)}function O(e,t){try{let n=new URL(e,`https://github.com`);if(n.hostname.toLowerCase()!==`github.com`)return!1;let r=n.pathname.toLowerCase(),i=`/${t.toLowerCase()}`;return r===i||r.startsWith(`${i}/`)}catch{return!1}}function k(e,t){return e.replace(/\[(#[0-9a-fA-F]{6,40})\]\(([^)]*)\)/g,(e,n,r)=>{if(!O(r,t))return e;let i=n.replace(`#`,``);if(!r.includes(`/commit/`)&&!D(i))return e;let a=i.slice(0,7);return`[#${a}](${T(t,a)})`}).replace(/(^|[^\w[/=&#])#([0-9a-fA-F]{7,40})(?![0-9a-fA-F])(?=[)\].,;:\s]|$)/g,(e,n,r)=>{if(!D(r))return e;let i=r.slice(0,7);return`${n}[#${i}](${T(t,i)})`})}function A(e,t){return e.replace(/\[#(\d+)(?=[ \]])(?:[^\]]*)\]\(([^)]*)\)/g,(e,n,r)=>r.includes(`/commit/`)||!O(r,t)?e:`[#${n}](${E(t,n)})`).replace(/(^|[^\w[/=&#])#(\d+)(?=[)\].,;:\s]|$)/g,(e,n,r)=>`${n}[#${r}](${E(t,r)})`)}function j(e){return e.replace(/(\*\*)?\b(BREAKING[ -]CHANGE):(\*\*)?/g,(e,t,n,r)=>t&&r?e:`**${n}:**`)}function M(e,t){let n=j(e);if(!t)return n;let r=k(n,t);return r=A(r,t),r}function N(t,n){let r=i(t,`utf8`),o,s=r.split(`
4
+ `).map(e=>{let t=e.trim();if(o)return t.startsWith(o)&&(o=void 0),e;let r=/^(```|~~~)/.exec(t);return r?(o=r[1],e):M(e,n)}).join(`
5
+ `);s!==r&&(a(t,s,`utf8`),e.info(` formatted ${t}`))}export{b as capitalize,w as formatBody,N as formatChangelogFile,M as formatLine,g as groupItems,l as parseCcSubject,_ as renderGroups,c as ruleTitle,x as splitInlineDescription};
@@ -1,8 +1,8 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { ChangelogBreakingSetting } from "../../../shared/src/changelog-breaking.js";
4
- import "../../../shared/src/index.js";
5
4
  import { BumpType, CommitRecord } from "./types.js";
5
+ import "../../../shared/src/index.js";
6
6
  //#region packages/changelog/src/utils/git.d.ts
7
7
  /** Read the commits in a git range (optionally limited to path(s)), newest first. */
8
8
  export declare function readCommits(range: string, path?: string | string[]): CommitRecord[];
@@ -1 +1 @@
1
- import{default as e}from"node:path";import"node:url";import.meta.url;import{sanitizeText as t}from"../../../shared/src/string-utils.js";import"../../../shared/src/index.js";import{isBreakingCommit as n}from"./breaking.js";import r from"node:fs";import{execFileSync as i}from"node:child_process";function a(e,n){let r=n===void 0?[]:Array.isArray(n)?n:[n],a=[`log`,`--no-merges`,`--pretty=format:%H%x1f%s%x1f%b%x1f%an%x1f%ae%x1e`,e];return r.length>0&&a.push(`--`,...r),i(`git`,a,{encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`]}).split(``).filter(e=>e.length>0).map(e=>{let[n,r,i,a,o]=e.split(``);return{hash:n.trim(),subject:t((r??``).trim()),body:t((i??``).trim()),author:(a??``).trim(),authorEmail:(o??``).trim()}}).filter(e=>e.subject.length>0)}function o(e){let t=e.match(/(?:github\.com[/:])([^/]+)\/([^/.]+?)(?:\.git)?$/);if(t?.[1]&&t[2])return`${t[1]}/${t[2]}`}function s(){try{let e=o(i(`git`,[`remote`,`get-url`,`origin`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim());if(e)return e}catch{}try{let t=r.readFileSync(e.join(process.cwd(),`package.json`),`utf8`),n=JSON.parse(t),i=typeof n.repository==`string`?n.repository:n.repository?.url;if(i)return o(i)}catch{}}let c;function l(){if(process.env.DBX_NO_GH)return c=!1,!1;if(c!==void 0)return c;try{i(`gh`,[`auth`,`status`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`],timeout:2e3}),c=!0}catch{c=!1}return c}const u=/* @__PURE__ */ new Map;function d(e,t,n){if(!l())return;let r=`repos/${e}${t}::${n}`;if(u.has(r))return u.get(r);let a;try{let r=i(`gh`,[`api`,`repos/${e}${t}`,`--jq`,n],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`],timeout:5e3}).trim();a=r&&r!==`null`?r:void 0}catch{a=void 0}return u.set(r,a),a}function f(e){return/^(\d+)\+([^@]+)@users\.noreply\.github\.com$/.exec(e.trim())?.[2]}function p(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}function m(e,t){let n;t&&(n=d(t,`/commits/${e.hash}/pulls`,`.[0].user.login`),n||=d(t,`/commits/${e.hash}`,`.author.login`)),n||=f(e.authorEmail);let r=n??e.author;return p(r)&&(r=f(r)??r.split(`@`)[0]??r),{name:r,url:n?`https://github.com/${n}`:void 0}}function h(e){return e.url?`[${e.name}](${e.url})`:e.name}function g(e){let t=/* @__PURE__ */ new Set;for(let n of e.matchAll(/\b(?:close[sd]?|fixe?s|fixed|resolves?|resolved)\b\s*:?\s*#(\d+)/gi)){let e=Number(n[1]);Number.isInteger(e)&&t.add(e)}return[...t]}function _(e,t){let n={number:t},r=d(e,`/issues/${t}`,`[.title,.html_url]`);if(r)try{let e=JSON.parse(r);n.title=e[0]||void 0,n.url=e[1]||void 0}catch{}return n}function v(e,t){let n=g(`${e.subject}\n${e.body}`);return n.length===0?[]:t?n.map(e=>_(t,e)):n.map(e=>({number:e}))}function y(e){return e.length===0?``:` (fixes ${e.map(e=>e.url&&e.title?`[#${e.number} ${e.title}](${e.url})`:e.url?`[#${e.number}](${e.url})`:`#${e.number}`).join(`, `)})`}const b=/* @__PURE__ */ new Map;function x(e,t){let n=`${e}::${t??``}`;if(b.has(n))return b.get(n);let r=e.trim(),a=(r.includes(`..`)?(r.split(`..`)[0]??``).trim():``)||(t?`${t}^`:void 0);if(!a){b.set(n,void 0);return}let o;try{o=i(`git`,[`log`,`--no-merges`,`--format=%ae%x1f%an%x1e`,a],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`],maxBuffer:134217728})}catch{b.set(n,void 0);return}let s=/* @__PURE__ */ new Set;for(let e of o.split(``)){if(!e.trim())continue;let[t=``,n=``]=e.split(``);for(let e of[t,n]){let t=e.trim().toLowerCase();t&&s.add(t)}}return b.set(n,s),s}function S(e){return/\[(#[0-9a-fA-F]{6,40})\]\([^)]*\)/.exec(e)?.[1]?.replace(`#`,``)}function C(e){try{return i(`git`,[`log`,`-1`,`--format=%aI`,e],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim()}catch{return}}function w(e){for(let t of[`v${e}`,e])try{let e=i(`git`,[`log`,`-1`,`--format=%aI`,t],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim();if(e)return e}catch{}}function T(e,t){let n=w(e);if(n)return new Date(n);for(let e of t){let t=S(e);if(t){let e=C(t);if(e)return new Date(e)}}}let E;function D(){if(E)return E;let e=/* @__PURE__ */ new Map;try{let t=i(`git`,[`log`,`--no-merges`,`--all`,`--format=%H%x1f%s%x1f%b%x1e`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`],maxBuffer:134217728});for(let n of t.split(``)){if(!n.trim())continue;let[t=``,r=``,i=``]=n.split(``);if(!t)continue;let a={subject:r.trim(),body:i.trim()};e.set(t.trim(),a),e.set(t.trim().slice(0,7),a)}}catch{}return E=e,e}function O(e){return D().get(e)}function k(e,t){let r=`patch`;for(let i of e)n(i,t)?r=`major`:r!==`major`&&/^feat(\([^)]*\))?:/i.test(i.subject)&&(r=`minor`);return r}export{S as bulletHash,k as deriveBump,T as deriveVersionDate,O as readCommit,a as readCommits,x as readPriorAuthors,v as recordIssues,h as renderAuthor,y as renderIssues,s as repoSlug,m as resolveAuthorInfo};
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{sanitizeText as t}from"../../../shared/src/string-utils.js";import"../../../shared/src/index.js";import{isBreakingCommit as n}from"./breaking.js";import r from"node:fs";import{execFileSync as i}from"node:child_process";function a(e,n){let r=n===void 0?[]:Array.isArray(n)?n:[n],a=[`log`,`--no-merges`,`--pretty=format:%H%x1f%s%x1f%b%x1f%an%x1f%ae%x1e`,e];return r.length>0&&a.push(`--`,...r),i(`git`,a,{encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`],maxBuffer:134217728}).split(``).filter(e=>e.length>0).map(e=>{let[n,r,i,a,o]=e.split(``);return{hash:n.trim(),subject:t((r??``).trim()),body:t((i??``).trim()),author:(a??``).trim(),authorEmail:(o??``).trim()}}).filter(e=>e.subject.length>0)}function o(e){let t=e.match(/(?:github\.com[/:])([^/]+)\/([^/.]+?)(?:\.git)?$/);if(t?.[1]&&t[2])return`${t[1]}/${t[2]}`}function s(){try{let e=o(i(`git`,[`remote`,`get-url`,`origin`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim());if(e)return e}catch{}try{let t=r.readFileSync(e.join(process.cwd(),`package.json`),`utf8`),n=JSON.parse(t),i=typeof n.repository==`string`?n.repository:n.repository?.url;if(i)return o(i)}catch{}}let c;function l(){if(process.env.DBX_NO_GH)return c=!1,!1;if(c!==void 0)return c;try{i(`gh`,[`auth`,`status`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`],timeout:2e3}),c=!0}catch{c=!1}return c}const u=/* @__PURE__ */ new Map;function d(e,t,n){if(!l())return;let r=`repos/${e}${t}::${n}`;if(u.has(r))return u.get(r);let a;try{let r=i(`gh`,[`api`,`repos/${e}${t}`,`--jq`,n],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`],timeout:5e3}).trim();a=r&&r!==`null`?r:void 0}catch{a=void 0}return u.set(r,a),a}function f(e){return/^(\d+)\+([^@]+)@users\.noreply\.github\.com$/.exec(e.trim())?.[2]}function p(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}function m(e,t){let n;t&&(n=d(t,`/commits/${e.hash}/pulls`,`.[0].user.login`),n||=d(t,`/commits/${e.hash}`,`.author.login`)),n||=f(e.authorEmail);let r=n??e.author;return p(r)&&(r=f(r)??r.split(`@`)[0]??r),{name:r,url:n?`https://github.com/${n}`:void 0}}function h(e){return e.url?`[${e.name}](${e.url})`:e.name}function g(e){let t=/* @__PURE__ */ new Set;for(let n of e.matchAll(/\b(?:close[sd]?|fixe?s|fixed|resolves?|resolved)\b\s*:?\s*#(\d+)/gi)){let e=Number(n[1]);Number.isInteger(e)&&t.add(e)}return[...t]}function _(e,t){let n={number:t},r=d(e,`/issues/${t}`,`[.title,.html_url]`);if(r)try{let e=JSON.parse(r);n.title=e[0]||void 0,n.url=e[1]||void 0}catch{}return n}function v(e,t){let n=g(`${e.subject}\n${e.body}`);return n.length===0?[]:t?n.map(e=>_(t,e)):n.map(e=>({number:e}))}function y(e){return e.length===0?``:` (fixes ${e.map(e=>e.url&&e.title?`[#${e.number} ${e.title}](${e.url})`:e.url?`[#${e.number}](${e.url})`:`#${e.number}`).join(`, `)})`}const b=/* @__PURE__ */ new Map;function x(e,t){let n=`${e}::${t??``}`;if(b.has(n))return b.get(n);let r=e.trim(),a=(r.includes(`..`)?(r.split(`..`)[0]??``).trim():``)||(t?`${t}^`:void 0);if(!a){b.set(n,void 0);return}let o;try{o=i(`git`,[`log`,`--no-merges`,`--format=%ae%x1f%an%x1e`,a],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`],maxBuffer:134217728})}catch{b.set(n,void 0);return}let s=/* @__PURE__ */ new Set;for(let e of o.split(``)){if(!e.trim())continue;let[t=``,n=``]=e.split(``);for(let e of[t,n]){let t=e.trim().toLowerCase();t&&s.add(t)}}return b.set(n,s),s}function S(e){return/\[(#[0-9a-fA-F]{6,40})\]\([^)]*\)/.exec(e)?.[1]?.replace(`#`,``)}function C(e){try{return i(`git`,[`log`,`-1`,`--format=%aI`,e],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim()}catch{return}}function w(e){for(let t of[`v${e}`,e])try{let e=i(`git`,[`log`,`-1`,`--format=%aI`,t],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim();if(e)return e}catch{}}function T(e,t){let n=w(e);if(n)return new Date(n);for(let e of t){let t=S(e);if(t){let e=C(t);if(e)return new Date(e)}}}let E;function D(){if(E)return E;let e=/* @__PURE__ */ new Map;try{let t=i(`git`,[`log`,`--no-merges`,`--all`,`--format=%H%x1f%s%x1f%b%x1e`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`],maxBuffer:134217728});for(let n of t.split(``)){if(!n.trim())continue;let[t=``,r=``,i=``]=n.split(``);if(!t)continue;let a={subject:r.trim(),body:i.trim()};e.set(t.trim(),a),e.set(t.trim().slice(0,7),a)}}catch{}return E=e,e}function O(e){return D().get(e)}let k;function A(){if(k===void 0)try{k=i(`git`,[`rev-parse`,`--is-shallow-repository`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim()!==`true`}catch{k=!1}return k}function j(e,t){let r=`patch`;for(let i of e)n(i,t)?r=`major`:r!==`major`&&/^feat(\([^)]*\))?:/i.test(i.subject)&&(r=`minor`);return r}export{S as bulletHash,j as deriveBump,T as deriveVersionDate,A as hasCompleteGitHistory,O as readCommit,a as readCommits,x as readPriorAuthors,v as recordIssues,h as renderAuthor,y as renderIssues,s as repoSlug,m as resolveAuthorInfo};
@@ -2,10 +2,15 @@ import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { ChangelogBreakingSetting } from "../../../shared/src/changelog-breaking.js";
4
4
  import { ChangelogGroupsSetting } from "../../../shared/src/changelog-groups.js";
5
- import "../../../shared/src/index.js";
6
5
  import { ExistingEntry } from "./types.js";
6
+ import "../../../shared/src/index.js";
7
7
  //#region packages/changelog/src/utils/reformat.d.ts
8
- /** Split a changelog into `## <version>` sections with their bullet lines. */
8
+ /**
9
+ * Split a changelog into `## <version>` sections with their commit bullets and
10
+ * nested description lines. The bodies are kept so a re-format can preserve a
11
+ * hand-corrected description when the original commit body is unusable (eg. it
12
+ * contains shell-escape artifacts).
13
+ */
9
14
  export declare function parseExistingChangelog(content: string): ExistingEntry[];
10
15
  /** Backward-reformat an entire changelog file's content (all versions). */
11
16
  export declare function reformatChangelogContent(content: string, repo: string | undefined, markersOnNewest?: boolean, includePackageChanges?: boolean, groups?: ChangelogGroupsSetting, breaking?: ChangelogBreakingSetting): string;
@@ -1,6 +1,7 @@
1
- import{resolve as e}from"node:path";import"node:url";import.meta.url;import{logger as t}from"../../../shared/src/logger.js";import"../../../shared/src/index.js";import{isBreakingCommit as n}from"./breaking.js";import{bulletHash as r,deriveVersionDate as i,readCommit as a,repoSlug as o}from"./git.js";import{changelogFiles as s,repoRoot as c}from"./repo.js";import{packageChangesForVersion as l}from"./packages.js";import{capitalize as u,formatBody as d,formatLine as f,groupItems as p,parseCcSubject as m,renderGroups as h}from"./format.js";import{renderChangelogEntry as g}from"./version.js";import{existsSync as _,readFileSync as v,writeFileSync as y}from"node:fs";function b(e){let t=[],n;for(let r of e.split(`
2
- `)){let e=/^##\s+([0-9]+\.[0-9]+\.[0-9]+)(?:\s*\(.*\))?\s*$/.exec(r);e?(n={version:e[1],bullets:[]},t.push(n)):n&&(r.includes(`<!-- release:`)||r.startsWith(`- `)&&n.bullets.push(r))}return t}function x(e){let t=e.lastIndexOf(`([#`);if(t===-1)return``;let n=e.slice(t);return/^(\(\[#[^\]]+\]\([^)]*\) by [^)]*\)\)?)(?:\(fixes [^)]*\)\)?)?/.exec(n)?.[0]??``}function S(e,t,o=!1,s=``,c,l){let _=[];for(let i of e.bullets){let e=i.replace(/^-\s+/,``),o=r(i),s=o?a(o):void 0,c=s?.subject??e.replace(/\*\*/g,``),p=m(c),h=x(e),g=`- ${[f(u(p.rest),t),h].filter(Boolean).join(` `)}`,v=s?d(s.body):[],y=n({subject:c,body:s?.body??``},l);_.push({parsed:p,breaking:y,text:g,bodyParagraphs:v})}let v=i(e.version,e.bullets);return g(e.version,h(p(_,c)),v,o,s)}function C(e,t,n=!1,r=!1,i,a){let o=b(e);if(o.length===0)return e;let s=e.split(`
3
- `)[0]??`# Changelog`;return`${s.startsWith(`# `)?s:`# Changelog`}\n\n${o.map((e,s)=>{let c=o[s+1],u=r&&c?l(e.version,c.version):``;return S(e,t,n&&s===0,u,i,a)}).filter(Boolean).join(`
1
+ import{resolve as e}from"node:path";import"node:url";import.meta.url;import{logger as t}from"../../../shared/src/logger.js";import"../../../shared/src/index.js";import{isBreakingCommit as n}from"./breaking.js";import{bulletHash as r,deriveVersionDate as i,readCommit as a,repoSlug as o}from"./git.js";import{changelogFiles as s,repoRoot as c}from"./repo.js";import{packageChangesForVersion as l}from"./packages.js";import{capitalize as u,formatBody as d,formatLine as f,groupItems as p,parseCcSubject as m,renderGroups as h}from"./format.js";import{renderChangelogEntry as g}from"./version.js";import{existsSync as _,readFileSync as v,writeFileSync as y}from"node:fs";const b=/^##\s+\[?v?(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)\]?\s*(?:\([^)]*\))?\s*(?:-\s+.*)?\s*$/;function x(e){for(let t of e.split(`
2
+ `))if(/^##\s+/.test(t)&&!b.test(t))return!0;return!1}function S(e){let t=[],n,r=!1,i=!1;for(let a of e.split(`
3
+ `)){let e=b.exec(a);e?(n={version:e[1],bullets:[],bodies:[]},t.push(n),r=!1,i=!1):/^##\s+/.test(a)?(n=void 0,r=!1,i=!1):n&&(a.includes(`<!-- release:`)||(/^###\s+Package changes\s*$/.test(a)?(r=!0,i=!1):/^###\s+/.test(a)?(r=!1,i=!1):r||(a.startsWith(`- `)?(n.bullets.push(a),n.bodies.push([]),i=!0):a.trim()&&i&&a.startsWith(` `)&&n.bodies[n.bodies.length-1].push(a))))}return t}function C(e){let t=e.lastIndexOf(`([#`);if(t===-1)return``;let n=e.slice(t);return/^(\(\[#[^\]]+\]\([^)]*\) by [^)]*\)\)?)(?:\(fixes [^)]*\)\)?)?/.exec(n)?.[0]??``}function w(e){let t=[],n=[];for(let r of e)r.startsWith(` - `)?(n.length>0&&t.push([n.join(` `)]),n=[r.slice(4).trim()]):r.startsWith(` `)?n.push(r.slice(4).trim()):r.startsWith(` `)&&n.push(r.slice(2).trim());return n.length>0&&t.push([n.join(` `)]),t}function T(e,t,o=!1,s=``,c,l){let _=[];for(let[i,o]of e.bullets.entries()){let s=o.replace(/^-\s+/,``),c=r(o),p=c?a(c):void 0,h=C(s),g=h?s.slice(0,s.length-h.length):s,v=m(g.replace(/\*\*/g,``)),y=p?m(p.subject):v,b=`- ${[f(u(v.rest.trim()||y.rest),t),h].filter(Boolean).join(` `)}`,x=e.bodies?.[i]??[],S=x.length>0?w(x):p?d(p.body):[],T=n({subject:p?.subject??g,body:p?.body??``},l);_.push({parsed:y,breaking:T,text:b,bodyParagraphs:S})}let v=i(e.version,e.bullets);return g(e.version,h(p(_,c)),v,o,s)}function E(e,n,r=!1,i=!1,a,o){if(x(e))return t.warn("changelog: skipping reformat because the file has a non-version `##` heading."),e;let s=S(e);if(s.length===0)return e;let c=e.split(`
4
+ `)[0]??`# Changelog`;return`${c.startsWith(`# `)?c:`# Changelog`}\n\n${s.map((e,t)=>{let c=s[t+1],u=i&&c?l(e.version,c.version):``;return T(e,n,r&&t===0,u,a,o)}).filter(Boolean).join(`
4
5
 
5
6
 
6
- `)}\n`}function w(t=!1,n,r){let i=c(),a=e(i,`CHANGELOG.md`);return _(a)?C(v(a,`utf8`),o(),!1,t,n,r):``}function T(n,r=!1,i,a){let l=e(c(),`CHANGELOG.md`);for(let e of s()){let s=C(v(e,`utf8`),o(),!0,r&&e===l,i,a);if(n){let n=e.replace(/CHANGELOG\.md$/,`CHANGELOG.proposed.md`);y(n,s,`utf8`),t.info(`[DRY-RUN] Wrote ${n}`)}else y(e,s,`utf8`),t.info(` formatted ${e}`)}}export{T as formatExistingChangelogs,b as parseExistingChangelog,C as reformatChangelogContent,w as reformatRootChangelog};
7
+ `)}\n`}function D(t=!1,n,r){let i=c(),a=e(i,`CHANGELOG.md`);return _(a)?E(v(a,`utf8`),o(),!1,t,n,r):``}function O(n,r=!1,i,a){let l=e(c(),`CHANGELOG.md`);for(let e of s()){let s=E(v(e,`utf8`),o(),!0,r&&e===l,i,a);if(n){let n=e.replace(/CHANGELOG\.md$/,`CHANGELOG.proposed.md`);y(n,s,`utf8`),t.info(`[DRY-RUN] Wrote ${n}`)}else y(e,s,`utf8`),t.info(` formatted ${e}`)}}export{O as formatExistingChangelogs,S as parseExistingChangelog,E as reformatChangelogContent,D as reformatRootChangelog};
@@ -1 +1 @@
1
- import{resolve as e}from"node:path";import"node:url";import.meta.url;import{repoRoot as t}from"./repo.js";import{existsSync as n,readFileSync as r}from"node:fs";import{spawnSync as i}from"node:child_process";function a(e){return/(?:^|@)v?(\d+\.\d+\.\d+)$/.exec(e.trim())?.[1]}function o(e){let t=[];for(let n of e.matchAll(/^##\s+(\d+\.\d+\.\d+)(?:\s|$)/gm))n.index!==void 0&&t.push({version:n[1],index:n.index});return t}function s(e,t,n){let r=o(e);if(r.length===0)return``;let i=r[0].index,s=new Set(t.map(a).filter(e=>e!==void 0)),c=n?a(n)??n:void 0,l=r.find(e=>e.version!==c&&s.has(e.version)),u=l?l.index:r[1]?.index??e.length;return u<=i?``:e.slice(i,u).trimEnd()}function c(a,o=t()){let c=e(o,`CHANGELOG.md`),l=``;if(n(c))try{l=r(c,`utf8`).replace(/^\uFEFF/,``)}catch{l=``}let u=(i(`git`,[`tag`,`--merged`,`HEAD`,`--sort=-v:refname`],{cwd:o,encoding:`utf8`}).stdout??``).split(/\r?\n/).filter(Boolean);return s(l,u,a)||`Release ${a}`}export{s as buildReleaseNotes,a as normalizeReleaseVersion,c as releaseNotesFromGit};
1
+ import{resolve as e}from"node:path";import"node:url";import.meta.url;import{repoRoot as t}from"./repo.js";import{existsSync as n,readFileSync as r}from"node:fs";import{spawnSync as i}from"node:child_process";function a(e){return/(?:^|@)v?(\d+\.\d+\.\d+)$/.exec(e.trim())?.[1]}function o(e){let t=[];for(let n of e.matchAll(/^##\s+(\d+\.\d+\.\d+)(?:\s|$)/gm))n.index!==void 0&&t.push({version:n[1],index:n.index});return t}function s(e,t,n){let r=o(e);if(r.length===0)return``;let i=r[0].index,s=new Set(t.map(a).filter(e=>e!==void 0)),c=n?a(n)??n:void 0,l=r.find(e=>e.version!==c&&s.has(e.version)),u=r.some(e=>e.version===c),d=l&&(u||l!==r[0])?l.index:r[1]?.index??e.length;return d<=i?``:e.slice(i,d).trimEnd()}function c(a,o=t()){let c=e(o,`CHANGELOG.md`),l=``;if(n(c))try{l=r(c,`utf8`).replace(/^\uFEFF/,``)}catch{l=``}let u=(i(`git`,[`tag`,`--merged`,`HEAD`,`--sort=-v:refname`],{cwd:o,encoding:`utf8`}).stdout??``).split(/\r?\n/).filter(Boolean);return s(l,u,a)||`Release ${a}`}export{s as buildReleaseNotes,a as normalizeReleaseVersion,c as releaseNotesFromGit};
@@ -1 +1 @@
1
- import{resolve as e}from"node:path";import"node:url";import.meta.url;import{logger as t}from"../../../shared/src/logger.js";import"../../../shared/src/index.js";import{existsSync as n,globSync as r,readFileSync as i,writeFileSync as a}from"node:fs";function o(){let t=process.cwd();for(let r=0;r<8;r++){if(n(e(t,`package.json`)))return t;let r=e(t,`..`);if(r===t)break;t=r}return process.cwd()}function s(){let t=o(),a=JSON.parse(i(e(t,`package.json`),`utf8`)),s=/* @__PURE__ */ new Set([t]);for(let i of a.workspaces??[])if(i!==`.`)for(let a of r(i,{cwd:t})){let r=e(t,a);n(e(r,`package.json`))&&s.add(r)}return[...s]}function c(){let t=e(o(),`package.json`);return JSON.parse(i(t,`utf8`)).version??`0.0.0`}function l(r){for(let o of s()){let s=e(o,`package.json`);if(!n(s))continue;let c=i(s,`utf8`),l=c.replace(/("version"\s*:\s*)"[^"]*"/,`$1"${r}"`);l!==c&&(a(s,l,`utf8`),t.info(` bumped ${s}`))}}function u(){let t=o();return[e(t,`CHANGELOG.md`),...s().filter(n=>e(n)!==e(t)).map(t=>e(t,`CHANGELOG.md`))].filter(e=>n(e))}export{u as changelogFiles,s as discoverWorkspaceDirs,c as readRootVersion,o as repoRoot,l as writeVersion};
1
+ import{resolve as e}from"node:path";import"node:url";import.meta.url;import{logger as t}from"../../../shared/src/logger.js";import"../../../shared/src/index.js";import{existsSync as n,globSync as r,readFileSync as i,writeFileSync as a}from"node:fs";function o(){let t=process.cwd();for(let r=0;r<8;r++){if(n(e(t,`package.json`)))return t;let r=e(t,`..`);if(r===t)break;t=r}return process.cwd()}function s(t=o()){let a=JSON.parse(i(e(t,`package.json`),`utf8`)),s=Array.isArray(a.workspaces)?a.workspaces:a.workspaces?.packages??[],c=/* @__PURE__ */ new Set([t]);for(let i of s)if(i!==`.`)for(let a of r(i,{cwd:t})){let r=e(t,a);n(e(r,`package.json`))&&c.add(r)}return[...c]}function c(){let t=e(o(),`package.json`);return JSON.parse(i(t,`utf8`)).version??`0.0.0`}function l(r){for(let o of s()){let s=e(o,`package.json`);if(!n(s))continue;let c=i(s,`utf8`),l=c.replace(/("version"\s*:\s*)"[^"]*"/,`$1"${r}"`);l!==c&&(a(s,l,`utf8`),t.info(` bumped ${s}`))}}function u(){let t=o();return[e(t,`CHANGELOG.md`),...s().filter(n=>e(n)!==e(t)).map(t=>e(t,`CHANGELOG.md`))].filter(e=>n(e))}export{u as changelogFiles,s as discoverWorkspaceDirs,c as readRootVersion,o as repoRoot,l as writeVersion};
@@ -2,8 +2,8 @@ import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { ChangelogBreakingSetting } from "../../../shared/src/changelog-breaking.js";
4
4
  import { ChangelogGroupsSetting } from "../../../shared/src/changelog-groups.js";
5
- import "../../../shared/src/index.js";
6
5
  import { CommitFormatOptions, CommitRecord } from "./types.js";
6
+ import "../../../shared/src/index.js";
7
7
  //#region packages/changelog/src/utils/summary.d.ts
8
8
  /**
9
9
  * Render a commit reference for a changelog bullet. With a resolvable repo slug
@@ -1,27 +1,15 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { ChangelogBreakingCommit, ChangelogBreakingSetting } from "../../../shared/src/changelog-breaking.js";
4
+ import { ChangelogAuthorInfo, ChangelogBumpRuleCallbackContext, ChangelogBumpRuleContext, ChangelogCommitFormatContext, ChangelogCommitFormatOptions, ChangelogCommitRecord, ChangelogIssueInfo, ChangelogProvider, ChangelogProviderContext, ChangelogProviderSetting } from "../../../shared/src/changelog-callbacks.js";
4
5
  import { ChangelogGroupConfig, ChangelogGroupContext, ChangelogGroupEntry, ChangelogGroupHidden, ChangelogGroupItem, ChangelogGroupOrder, ChangelogGroupTitle, ChangelogGroupsContext, ChangelogGroupsSetting } from "../../../shared/src/changelog-groups.js";
5
6
  import "../../../shared/src/index.js";
6
7
  //#region packages/changelog/src/utils/types.d.ts
7
8
  export type BumpType = 'major' | 'minor' | 'patch';
8
9
  export type ProcessingMethod = 'latest' | 'all' | string;
9
- export interface CommitRecord {
10
- hash: string;
11
- subject: string;
12
- body: string;
13
- author: string;
14
- authorEmail: string;
15
- }
16
- export interface AuthorInfo {
17
- name: string;
18
- url?: string;
19
- }
20
- export interface IssueInfo {
21
- number: number;
22
- title?: string;
23
- url?: string;
24
- }
10
+ export type CommitRecord = ChangelogCommitRecord;
11
+ export type AuthorInfo = ChangelogAuthorInfo;
12
+ export type IssueInfo = ChangelogIssueInfo;
25
13
  export interface CliOptions {
26
14
  range: string;
27
15
  dryRun: boolean;
@@ -57,39 +45,14 @@ export interface GroupedItem {
57
45
  bodyParagraphs: string[][];
58
46
  }
59
47
  /** Options for rendering a commit bullet/credit line. */
60
- export interface CommitFormatOptions {
61
- /** Include the `by <author>` credit (default true). */
62
- author?: boolean;
63
- /** Include the commit hash link (default true). */
64
- commitSha?: boolean;
65
- /** Include issue/fixes links (default true). */
66
- issues?: boolean;
67
- /** Prefix the author with their GitHub avatar (default false). */
68
- authorAvatar?: boolean;
69
- /** Fully custom commit line formatter. */
70
- format?: (ctx: CommitFormatContext) => string;
71
- }
72
- export interface CommitFormatContext {
73
- commit: CommitRecord;
74
- repo?: string;
75
- author: AuthorInfo;
76
- issues: IssueInfo[];
77
- options: CommitFormatOptions;
78
- }
79
- /** A custom changelog provider. */
80
- export interface ChangelogProviderContext {
81
- cwd: string;
82
- changelog?: unknown;
83
- records: CommitRecord[];
84
- }
85
- export interface ChangelogProvider {
86
- id: string;
87
- run: (ctx: ChangelogProviderContext) => string | void;
88
- }
48
+ export type CommitFormatOptions = ChangelogCommitFormatOptions;
49
+ export type CommitFormatContext = ChangelogCommitFormatContext;
89
50
  /** A `## <version>` section parsed out of an existing changelog. */
90
51
  export interface ExistingEntry {
91
52
  version: string;
92
53
  bullets: string[];
54
+ /** Nested description lines for each bullet (parallel to `bullets`). */
55
+ bodies?: string[][];
93
56
  }
94
57
  //#endregion
95
- export type { ChangelogBreakingCommit, ChangelogBreakingSetting, ChangelogGroupConfig, ChangelogGroupContext, ChangelogGroupEntry, ChangelogGroupHidden, ChangelogGroupItem, ChangelogGroupOrder, ChangelogGroupTitle, ChangelogGroupsContext, ChangelogGroupsSetting };
58
+ export type { ChangelogAuthorInfo, ChangelogBreakingCommit, ChangelogBreakingSetting, ChangelogBumpRuleCallbackContext, ChangelogBumpRuleContext, ChangelogCommitFormatContext, ChangelogCommitFormatOptions, ChangelogCommitRecord, ChangelogGroupConfig, ChangelogGroupContext, ChangelogGroupEntry, ChangelogGroupHidden, ChangelogGroupItem, ChangelogGroupOrder, ChangelogGroupTitle, ChangelogGroupsContext, ChangelogGroupsSetting, ChangelogIssueInfo, ChangelogProvider, ChangelogProviderContext, ChangelogProviderSetting };
@@ -1,11 +1,13 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { ChangelogBreakingSetting } from "../../../shared/src/changelog-breaking.js";
4
- import { logger } from "../../../shared/src/logger.js";
5
- import { ChangelogConfig } from "../../../shared/src/config-types.js";
6
- import "../../../shared/src/index.js";
4
+ import { ChangelogBumpRuleContext } from "../../../shared/src/changelog-callbacks.js";
5
+ import { ChangelogConfig, ChangelogVersioningConfig } from "../../../shared/src/config-types.js";
7
6
  import { BumpType, CommitRecord } from "./types.js";
7
+ import "../../../shared/src/index.js";
8
8
  //#region packages/changelog/src/utils/versioning.d.ts
9
+ /** The configured custom bump rules (major/minor/patch only). */
10
+ type BumpRules = NonNullable<ChangelogVersioningConfig['bump']>;
9
11
  /** How/where a changelog run applies its version bump. */
10
12
  export type VersioningTarget = 'uniform' | 'root-only' | 'individual';
11
13
  /** The normalized `ci.changelog.versioning` config. */
@@ -17,7 +19,7 @@ export interface ResolvedVersioning {
17
19
  /** Explicit workspace globs (when configured). */
18
20
  workspaces?: string[];
19
21
  /** Custom bump rules keyed by version index. */
20
- bump?: Record<string, unknown>;
22
+ bump?: BumpRules;
21
23
  /** Apply a bump per matching change instead of once. */
22
24
  allowOverBump?: boolean;
23
25
  /** Changelog provider id, callback, or custom provider object. */
@@ -52,15 +54,9 @@ export declare function writePackageVersion(dir: string, version: string): void;
52
54
  */
53
55
  export declare function discoverVersionPackages(workspaces?: string[], root?: string): VersionPackages;
54
56
  /** Context handed to custom bump callbacks. */
55
- export interface BumpRuleContext {
56
- env: NodeJS.ProcessEnv;
57
- logger: typeof logger;
58
- packageJson?: Record<string, unknown>;
59
- /** How breaking changes are detected (default: Conventional Commits). */
60
- breaking?: ChangelogBreakingSetting;
61
- }
57
+ export type BumpRuleContext = ChangelogBumpRuleContext;
62
58
  /** Resolve a bump from custom rules, falling back to Conventional Commits. */
63
- export declare function deriveCustomBump(records: CommitRecord[], rules?: Record<string, unknown>, allowOverBump?: boolean, context?: BumpRuleContext): BumpType;
59
+ export declare function deriveCustomBump(records: CommitRecord[], rules?: BumpRules, allowOverBump?: boolean, context?: BumpRuleContext): BumpType;
64
60
  /** The version bump plan for a changelog run. */
65
61
  export interface VersionPlan {
66
62
  /** The version heading for the root changelog. */
@@ -77,7 +73,7 @@ export interface PlanVersionsOptions {
77
73
  /** The bump derived from all scanned commits. */
78
74
  bump: BumpType;
79
75
  /** Custom bump rules (used for per-workspace derivation). */
80
- bumpRules?: Record<string, unknown>;
76
+ bumpRules?: BumpRules;
81
77
  /** Allow over-bumping (default false). */
82
78
  allowOverBump?: boolean;
83
79
  /** How breaking changes are detected (default: Conventional Commits). */
@@ -101,4 +97,5 @@ export interface PlanVersionsOptions {
101
97
  * changelogs as `uniform` would, so the entries stay complete.
102
98
  */
103
99
  export declare function planVersions(options: PlanVersionsOptions): VersionPlan;
104
- //#endregion
100
+ //#endregion
101
+ export {};
@@ -1 +1 @@
1
- import{resolve as e}from"node:path";import"node:url";import.meta.url;import{logger as t}from"../../../shared/src/logger.js";import"../../../shared/src/index.js";import{readCommits as n,repoSlug as r}from"./git.js";import{discoverWorkspaceDirs as i,repoRoot as a}from"./repo.js";import{packageChangesForCurrent as o}from"./packages.js";import{formatChangelogFile as s}from"./format.js";import{prependChangelogEntry as c,renderChangelogEntry as l}from"./version.js";import{parseExistingChangelog as u,reformatRootChangelog as d}from"./reformat.js";import{buildSummary as f}from"./summary.js";import{relatedWorkspacePaths as p}from"./graph.js";import{existsSync as m,readFileSync as h,writeFileSync as g}from"node:fs";function _(_,v,y,b,x,S=!1,C,w=!0,T,E){let D=a(),O=r(),k=e(D,`CHANGELOG.md`),A=``;if(S&&m(k)){let e=u(h(k,`utf8`))[0];e&&(A=o(e.version))}if(x){let e=d(S,T,E);e&&(g(k,e,`utf8`),t.info(` reformatted ${k}`))}let j=l(_,b,/* @__PURE__ */ new Date,!0,A);c(k,j),t.info(` updated ${k}`);let M=C??new Map(i().filter(t=>e(t)!==e(D)).map(e=>[e,_]));for(let[r,i]of M){let a=e(r,`CHANGELOG.md`),o=n(v,p(r,D));if(o.length===0){t.info(` skipped ${a} (no related commits)`);continue}let s=!m(a),u=f(o,{commitlint:w,range:v,...T?{groups:T}:{},...E===void 0?{}:{breaking:E}});c(a,l(i,u,/* @__PURE__ */ new Date)),t.info(` ${s?`created`:`updated`} ${a}`)}let N=/* @__PURE__ */ new Set([...i(),...M.keys()]);for(let t of N){let n=e(t,`CHANGELOG.md`);m(n)&&s(n,O)}}export{_ as writeChangelogs};
1
+ import{resolve as e}from"node:path";import"node:url";import.meta.url;import{logger as t}from"../../../shared/src/logger.js";import"../../../shared/src/index.js";import{readCommits as n,repoSlug as r}from"./git.js";import{discoverWorkspaceDirs as i,repoRoot as a}from"./repo.js";import{packageChangesForCurrent as o}from"./packages.js";import{formatChangelogFile as s}from"./format.js";import{prependChangelogEntry as c,renderChangelogEntry as l}from"./version.js";import{formatExistingChangelogs as u,parseExistingChangelog as d}from"./reformat.js";import{buildSummary as f}from"./summary.js";import{relatedWorkspacePaths as p}from"./graph.js";import{existsSync as m,readFileSync as h}from"node:fs";function g(g,_,v,y,b,x=!1,S,C=!0,w,T){let E=a(),D=r(),O=e(E,`CHANGELOG.md`),k=``;if(x&&m(O)){let e=d(h(O,`utf8`))[0];e&&(k=o(e.version))}b&&u(!1,x,w,T);let A=l(g,y,/* @__PURE__ */ new Date,!0,k);c(O,A),t.info(` updated ${O}`);let j=S??new Map(i().filter(t=>e(t)!==e(E)).map(e=>[e,g]));for(let[r,i]of j){let a=e(r,`CHANGELOG.md`),o=n(_,p(r,E));if(o.length===0){t.info(` skipped ${a} (no related commits)`);continue}let s=!m(a),u=f(o,{commitlint:C,range:_,...w?{groups:w}:{},...T===void 0?{}:{breaking:T}});c(a,l(i,u,/* @__PURE__ */ new Date)),t.info(` ${s?`created`:`updated`} ${a}`)}let M=/* @__PURE__ */ new Set([...i(),...j.keys()]);for(let t of M){let n=e(t,`CHANGELOG.md`);m(n)&&s(n,D)}}export{g as writeChangelogs};
@@ -1,7 +1,8 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
- import { WorkflowOptions, WorkflowSetting, WorkflowStep } from "../../shared/src/config-types.js";
3
+ import { CustomWorkflowSettings, WorkflowOptions, WorkflowSetting, WorkflowStep } from "../../shared/src/config-types.js";
4
4
  import { Replacements } from "../../shared/src/template.js";
5
+ import { VendorWorkflowConfig, isVendorWorkflowConfig } from "../../shared/src/config-schema/workflow.js";
5
6
  import "../../shared/src/index.js";
6
7
  //#region packages/changelog/src/workflows.d.ts
7
8
  export interface WorkflowJob {
@@ -33,9 +34,14 @@ export type WorkflowId = 'ci' | 'changelog' | 'release' | 'sync' | 'issues';
33
34
  export declare const WORKFLOW_FILENAMES: Record<WorkflowId, string>;
34
35
  /** The default directory for generated workflows. */
35
36
  export declare const DEFAULT_WORKFLOW_DIR = ".github/workflows";
37
+ /** A complete vendor workflow (GitHub, GitLab or Azure), written as-is. */
38
+ export type VendorWorkflowSetting = VendorWorkflowConfig;
39
+ /** Whether a setting carries a complete vendor workflow. */
40
+ export declare const isVendorWorkflowSetting: typeof isVendorWorkflowConfig;
36
41
  /**
37
42
  * The path a workflow is written to. A setting may override the directory
38
- * (`dir`) and file name (`filename`); custom ids default to `<id>.yml`.
43
+ * (`dir`) and file name (`filename`); custom ids default to `<id>.yml`, while
44
+ * GitLab/Azure default to their conventional root files.
39
45
  */
40
46
  export declare function workflowFilePath(id: string, setting: WorkflowSetting | undefined, defaultFilename?: string): string;
41
47
  /** Whether a workflow setting enables the workflow (opt-in: absent is disabled). */
@@ -44,7 +50,7 @@ export interface DefaultWorkflowOptions {
44
50
  /** Include commitlint in the CI workflow (default true). */
45
51
  commitlint?: boolean;
46
52
  /** Config-defined workflows (enabled by presence; no boolean form). */
47
- custom?: Record<string, string | WorkflowOptions>;
53
+ custom?: Record<string, CustomWorkflowSettings>;
48
54
  }
49
55
  /** Build all default workflows for a set of tokens. */
50
56
  export declare function defaultWorkflows(tokens: Replacements, options?: DefaultWorkflowOptions): Record<WorkflowId, Workflow>;
@@ -68,6 +74,8 @@ export declare function renderWorkflow(id: WorkflowId, options: RenderWorkflowOp
68
74
  * settings over it (`triggers` -> `on`, `jobs` -> jobs, `extra` -> top-level).
69
75
  */
70
76
  export declare function renderCustomWorkflow(id: string, options: RenderWorkflowOptions): string | undefined;
77
+ /** Render a complete vendor workflow (GitHub/GitLab/Azure) as YAML. */
78
+ export declare function renderVendorWorkflow(setting: VendorWorkflowSetting, tokens: Replacements): string;
71
79
  /**
72
80
  * Render every workflow, keyed by file name (disabled ones are omitted). A raw
73
81
  * string setting is used verbatim as the workflow content (no default merge and