@deltabox/toolchain 0.0.0-stage → 1.0.7

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 (235) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/LICENSE +373 -0
  3. package/README.md +235 -2
  4. package/dist/_virtual/_rolldown/runtime.js +1 -0
  5. package/dist/biome.d.ts +4 -0
  6. package/dist/biome.js +1 -0
  7. package/dist/changelog.d.ts +17 -0
  8. package/dist/changelog.js +1 -0
  9. package/dist/cli/commands/index.js +1 -0
  10. package/dist/cli/commands/projects.js +1 -0
  11. package/dist/cli/commands/providers.js +1 -0
  12. package/dist/cli/commands/reset.js +1 -0
  13. package/dist/cli/commands/shared.js +1 -0
  14. package/dist/cli/commands/sync.js +1 -0
  15. package/dist/cli/commands/watch.js +1 -0
  16. package/dist/cli/context.js +1 -0
  17. package/dist/cli/index.d.ts +15 -0
  18. package/dist/cli/index.js +2 -0
  19. package/dist/cli/options.js +1 -0
  20. package/dist/cli/register.d.ts +14 -0
  21. package/dist/cli/register.js +1 -0
  22. package/dist/config.d.ts +18 -0
  23. package/dist/config.js +1 -0
  24. package/dist/core.d.ts +13 -0
  25. package/dist/core.js +1 -0
  26. package/dist/index.d.ts +31 -0
  27. package/dist/index.js +1 -0
  28. package/dist/migrate.d.ts +15 -0
  29. package/dist/migrate.js +1 -0
  30. package/dist/package.js +1 -0
  31. package/dist/packages/biome/src/config.js +1 -0
  32. package/dist/packages/biome/src/index.d.ts +34 -0
  33. package/dist/packages/biome/src/index.js +1 -0
  34. package/dist/packages/biome/src/vscode-settings.js +1 -0
  35. package/dist/packages/changelog/src/cli/index.d.ts +8 -0
  36. package/dist/packages/changelog/src/cli/index.js +1 -0
  37. package/dist/packages/changelog/src/index.d.ts +19 -0
  38. package/dist/packages/changelog/src/index.js +1 -0
  39. package/dist/packages/changelog/src/run-workflows.d.ts +35 -0
  40. package/dist/packages/changelog/src/run-workflows.js +1 -0
  41. package/dist/packages/changelog/src/run.d.ts +14 -0
  42. package/dist/packages/changelog/src/run.js +1 -0
  43. package/dist/packages/changelog/src/sync.d.ts +18 -0
  44. package/dist/packages/changelog/src/sync.js +1 -0
  45. package/dist/packages/changelog/src/templates.d.ts +27 -0
  46. package/dist/packages/changelog/src/templates.js +27 -0
  47. package/dist/packages/changelog/src/utils/args.d.ts +7 -0
  48. package/dist/packages/changelog/src/utils/args.js +1 -0
  49. package/dist/packages/changelog/src/utils/format.d.ts +27 -0
  50. package/dist/packages/changelog/src/utils/format.js +5 -0
  51. package/dist/packages/changelog/src/utils/git.d.ts +9 -0
  52. package/dist/packages/changelog/src/utils/git.js +1 -0
  53. package/dist/packages/changelog/src/utils/packages.js +4 -0
  54. package/dist/packages/changelog/src/utils/reformat.d.ts +9 -0
  55. package/dist/packages/changelog/src/utils/reformat.js +6 -0
  56. package/dist/packages/changelog/src/utils/repo.js +1 -0
  57. package/dist/packages/changelog/src/utils/summary.d.ts +7 -0
  58. package/dist/packages/changelog/src/utils/summary.js +1 -0
  59. package/dist/packages/changelog/src/utils/types.d.ts +58 -0
  60. package/dist/packages/changelog/src/utils/version.d.ts +6 -0
  61. package/dist/packages/changelog/src/utils/version.js +14 -0
  62. package/dist/packages/changelog/src/utils/write.js +1 -0
  63. package/dist/packages/changelog/src/workflows.d.ts +51 -0
  64. package/dist/packages/changelog/src/workflows.js +5 -0
  65. package/dist/packages/config/src/cli/index.d.ts +28 -0
  66. package/dist/packages/config/src/cli/index.js +1 -0
  67. package/dist/packages/config/src/collect.d.ts +19 -0
  68. package/dist/packages/config/src/collect.js +1 -0
  69. package/dist/packages/config/src/config-json.d.ts +33 -0
  70. package/dist/packages/config/src/config-json.js +1 -0
  71. package/dist/packages/config/src/engine.d.ts +56 -0
  72. package/dist/packages/config/src/engine.js +1 -0
  73. package/dist/packages/config/src/env-file.d.ts +33 -0
  74. package/dist/packages/config/src/env-file.js +3 -0
  75. package/dist/packages/config/src/env.d.ts +31 -0
  76. package/dist/packages/config/src/env.js +1 -0
  77. package/dist/packages/config/src/generators/cli.d.ts +78 -0
  78. package/dist/packages/config/src/generators/cli.js +1 -0
  79. package/dist/packages/config/src/generators/env.d.ts +42 -0
  80. package/dist/packages/config/src/generators/env.js +23 -0
  81. package/dist/packages/config/src/generators/index.d.ts +8 -0
  82. package/dist/packages/config/src/generators/index.js +1 -0
  83. package/dist/packages/config/src/generators/json.d.ts +24 -0
  84. package/dist/packages/config/src/generators/json.js +1 -0
  85. package/dist/packages/config/src/generators/markdown.d.ts +77 -0
  86. package/dist/packages/config/src/generators/markdown.js +27 -0
  87. package/dist/packages/config/src/generators/types.d.ts +32 -0
  88. package/dist/packages/config/src/generators/types.js +1 -0
  89. package/dist/packages/config/src/index.d.ts +21 -0
  90. package/dist/packages/config/src/index.js +1 -0
  91. package/dist/packages/config/src/root.d.ts +11 -0
  92. package/dist/packages/config/src/root.js +1 -0
  93. package/dist/packages/config/src/schema.d.ts +34 -0
  94. package/dist/packages/config/src/schema.js +1 -0
  95. package/dist/packages/config/src/types.d.ts +75 -0
  96. package/dist/packages/config/src/types.js +1 -0
  97. package/dist/packages/core/src/graph.d.ts +55 -0
  98. package/dist/packages/core/src/graph.js +1 -0
  99. package/dist/packages/core/src/index.d.ts +16 -0
  100. package/dist/packages/core/src/index.js +1 -0
  101. package/dist/packages/core/src/loader.d.ts +27 -0
  102. package/dist/packages/core/src/loader.js +1 -0
  103. package/dist/packages/core/src/manifest.d.ts +17 -0
  104. package/dist/packages/core/src/manifest.js +1 -0
  105. package/dist/packages/core/src/project-type.d.ts +14 -0
  106. package/dist/packages/core/src/project-type.js +1 -0
  107. package/dist/packages/core/src/reset.d.ts +51 -0
  108. package/dist/packages/core/src/reset.js +1 -0
  109. package/dist/packages/core/src/select.d.ts +32 -0
  110. package/dist/packages/core/src/select.js +1 -0
  111. package/dist/packages/core/src/sync.d.ts +42 -0
  112. package/dist/packages/core/src/sync.js +1 -0
  113. package/dist/packages/core/src/vscode.d.ts +27 -0
  114. package/dist/packages/core/src/vscode.js +1 -0
  115. package/dist/packages/core/src/watch.d.ts +17 -0
  116. package/dist/packages/core/src/watch.js +1 -0
  117. package/dist/packages/migrate/src/biome.d.ts +18 -0
  118. package/dist/packages/migrate/src/biome.js +2 -0
  119. package/dist/packages/migrate/src/check.d.ts +14 -0
  120. package/dist/packages/migrate/src/check.js +1 -0
  121. package/dist/packages/migrate/src/cli/index.d.ts +12 -0
  122. package/dist/packages/migrate/src/cli/index.js +1 -0
  123. package/dist/packages/migrate/src/dprint.d.ts +18 -0
  124. package/dist/packages/migrate/src/dprint.js +1 -0
  125. package/dist/packages/migrate/src/eslint.d.ts +24 -0
  126. package/dist/packages/migrate/src/eslint.js +1 -0
  127. package/dist/packages/migrate/src/index.d.ts +14 -0
  128. package/dist/packages/migrate/src/index.js +1 -0
  129. package/dist/packages/migrate/src/oxfmt-map.d.ts +28 -0
  130. package/dist/packages/migrate/src/oxfmt-map.js +1 -0
  131. package/dist/packages/migrate/src/oxlint-map.d.ts +22 -0
  132. package/dist/packages/migrate/src/oxlint-map.js +1 -0
  133. package/dist/packages/migrate/src/prettier.d.ts +20 -0
  134. package/dist/packages/migrate/src/prettier.js +2 -0
  135. package/dist/packages/migrate/src/registry.d.ts +26 -0
  136. package/dist/packages/migrate/src/registry.js +1 -0
  137. package/dist/packages/migrate/src/types.d.ts +75 -0
  138. package/dist/packages/migrate/src/vite-target.d.ts +31 -0
  139. package/dist/packages/migrate/src/vite-target.js +5 -0
  140. package/dist/packages/project/src/cli/index.d.ts +8 -0
  141. package/dist/packages/project/src/cli/index.js +1 -0
  142. package/dist/packages/project/src/config.d.ts +55 -0
  143. package/dist/packages/project/src/config.js +1 -0
  144. package/dist/packages/project/src/index.d.ts +10 -0
  145. package/dist/packages/project/src/index.js +1 -0
  146. package/dist/packages/project/src/typescript.d.ts +66 -0
  147. package/dist/packages/project/src/typescript.js +22 -0
  148. package/dist/packages/shared/src/config-schema.d.ts +2039 -0
  149. package/dist/packages/shared/src/config-schema.js +1 -0
  150. package/dist/packages/shared/src/fs-utils.d.ts +18 -0
  151. package/dist/packages/shared/src/fs-utils.js +1 -0
  152. package/dist/packages/shared/src/index.d.ts +17 -0
  153. package/dist/packages/shared/src/index.js +1 -0
  154. package/dist/packages/shared/src/object-utils.d.ts +15 -0
  155. package/dist/packages/shared/src/object-utils.js +1 -0
  156. package/dist/packages/shared/src/provider.d.ts +66 -0
  157. package/dist/packages/shared/src/provider.js +1 -0
  158. package/dist/packages/shared/src/run.d.ts +26 -0
  159. package/dist/packages/shared/src/run.js +1 -0
  160. package/dist/packages/shared/src/string-utils.d.ts +52 -0
  161. package/dist/packages/shared/src/string-utils.js +3 -0
  162. package/dist/packages/shared/src/template.d.ts +53 -0
  163. package/dist/packages/shared/src/template.js +1 -0
  164. package/dist/packages/shared/src/toolchain.d.ts +159 -0
  165. package/dist/packages/shared/src/toolchain.js +1 -0
  166. package/dist/packages/shared/src/types.d.ts +100 -0
  167. package/dist/packages/shared/src/yaml.d.ts +17 -0
  168. package/dist/packages/shared/src/yaml.js +5 -0
  169. package/dist/packages/template/src/builtin.d.ts +10 -0
  170. package/dist/packages/template/src/builtin.js +1 -0
  171. package/dist/packages/template/src/cli/index.d.ts +8 -0
  172. package/dist/packages/template/src/cli/index.js +1 -0
  173. package/dist/packages/template/src/index.d.ts +10 -0
  174. package/dist/packages/template/src/index.js +1 -0
  175. package/dist/packages/template/src/local.d.ts +20 -0
  176. package/dist/packages/template/src/local.js +1 -0
  177. package/dist/packages/template/src/online.d.ts +17 -0
  178. package/dist/packages/template/src/online.js +1 -0
  179. package/dist/packages/template/src/registry.d.ts +48 -0
  180. package/dist/packages/template/src/registry.js +1 -0
  181. package/dist/packages/template/src/scaffold.d.ts +25 -0
  182. package/dist/packages/template/src/scaffold.js +1 -0
  183. package/dist/packages/template/src/types.d.ts +59 -0
  184. package/dist/packages/tsconfig/src/cli/generate/index.d.ts +35 -0
  185. package/dist/packages/tsconfig/src/cli/generate/index.js +1 -0
  186. package/dist/packages/tsconfig/src/cli/generate/utils.d.ts +43 -0
  187. package/dist/packages/tsconfig/src/cli/generate/utils.js +1 -0
  188. package/dist/packages/tsconfig/src/cli/index.d.ts +11 -0
  189. package/dist/packages/tsconfig/src/cli/index.js +1 -0
  190. package/dist/packages/tsconfig/src/index.d.ts +10 -0
  191. package/dist/packages/tsconfig/src/index.js +1 -0
  192. package/dist/packages/tsconfig/src/sync.d.ts +15 -0
  193. package/dist/packages/tsconfig/src/sync.js +1 -0
  194. package/dist/packages/tsconfig/src/templates/tsconfig.base.js +1 -0
  195. package/dist/packages/tsconfig/src/templates/tsconfig.build.js +1 -0
  196. package/dist/packages/tsconfig/src/templates/tsconfig.default.js +1 -0
  197. package/dist/packages/tsconfig/src/templates.d.ts +38 -0
  198. package/dist/packages/tsconfig/src/templates.js +1 -0
  199. package/dist/packages/tsdown/src/cleanup.d.ts +17 -0
  200. package/dist/packages/tsdown/src/cleanup.js +1 -0
  201. package/dist/packages/tsdown/src/cli/index.d.ts +11 -0
  202. package/dist/packages/tsdown/src/cli/index.js +1 -0
  203. package/dist/packages/tsdown/src/config/node.d.ts +37 -0
  204. package/dist/packages/tsdown/src/config/node.js +3 -0
  205. package/dist/packages/tsdown/src/index.d.ts +9 -0
  206. package/dist/packages/tsdown/src/index.js +1 -0
  207. package/dist/packages/vite/src/cli/index.d.ts +8 -0
  208. package/dist/packages/vite/src/cli/index.js +1 -0
  209. package/dist/packages/vite/src/commands.d.ts +29 -0
  210. package/dist/packages/vite/src/commands.js +1 -0
  211. package/dist/packages/vite/src/index.d.ts +8 -0
  212. package/dist/packages/vite/src/index.js +1 -0
  213. package/dist/packages/vite/src/provider.d.ts +11 -0
  214. package/dist/packages/vite/src/provider.js +1 -0
  215. package/dist/packages/vite/src/sync.d.ts +25 -0
  216. package/dist/packages/vite/src/sync.js +2 -0
  217. package/dist/packages/vite/src/vp.d.ts +59 -0
  218. package/dist/packages/vite/src/vp.js +1 -0
  219. package/dist/project.d.ts +7 -0
  220. package/dist/project.js +1 -0
  221. package/dist/providers.d.ts +11 -0
  222. package/dist/providers.js +1 -0
  223. package/dist/shared.d.ts +14 -0
  224. package/dist/shared.js +1 -0
  225. package/dist/sync.d.ts +12 -0
  226. package/dist/sync.js +1 -0
  227. package/dist/template.d.ts +11 -0
  228. package/dist/template.js +1 -0
  229. package/dist/tsconfig.d.ts +8 -0
  230. package/dist/tsconfig.js +1 -0
  231. package/dist/tsdown.d.ts +7 -0
  232. package/dist/tsdown.js +1 -0
  233. package/dist/vite.d.ts +9 -0
  234. package/dist/vite.js +1 -0
  235. package/package.json +114 -3
@@ -0,0 +1,19 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { AuthorInfo, BumpType, CliOptions, CommitRecord, ExistingEntry, GroupedItem, GroupedRule, IssueInfo, ParsedCommit, ProcessingMethod } from "./utils/types.js";
4
+ import { parseArgsCli } from "./utils/args.js";
5
+ import { formatBody, groupItems, parseCcSubject, renderGroups, ruleTitle, splitInlineDescription } from "./utils/format.js";
6
+ import { deriveBump, readCommits } from "./utils/git.js";
7
+ import { parseExistingChangelog, reformatChangelogContent } from "./utils/reformat.js";
8
+ import { buildSummary } from "./utils/summary.js";
9
+ import { renderChangelogEntry } from "./utils/version.js";
10
+ import { main, runChangelog } from "./run.js";
11
+ import { DEFAULT_WORKFLOW_TOKENS, RenderWorkflowOptions, WORKFLOW_FILENAMES, Workflow, WorkflowId, WorkflowJob, applyWorkflowConfig, defaultWorkflows, isEnabled, renderWorkflow, renderWorkflows } from "./workflows.js";
12
+ import { RanWorkflow, RunWorkflowsOptions, RunWorkflowsResult, resolveWorkflowId, runWorkflows } from "./run-workflows.js";
13
+ import { COMMITLINT_HEADER, WORKFLOW_HEADER, changelogSyncTask, workflowFilenames } from "./sync.js";
14
+ import { CommitlintOptions, conventionalCommitsVscodeExtensions, conventionalCommitsVscodeSettings, renderCommitlintConfig } from "./templates.js";
15
+ declare namespace index_d_exports {
16
+ export { AuthorInfo, BumpType, COMMITLINT_HEADER, CliOptions, CommitRecord, CommitlintOptions, DEFAULT_WORKFLOW_TOKENS, ExistingEntry, GroupedItem, GroupedRule, IssueInfo, ParsedCommit, ProcessingMethod, RanWorkflow, RenderWorkflowOptions, RunWorkflowsOptions, RunWorkflowsResult, WORKFLOW_FILENAMES, WORKFLOW_HEADER, Workflow, WorkflowId, WorkflowJob, applyWorkflowConfig, buildSummary, changelogSyncTask, conventionalCommitsVscodeExtensions, conventionalCommitsVscodeSettings, defaultWorkflows, deriveBump, formatBody, groupItems, isEnabled, main, parseArgsCli, parseCcSubject, parseExistingChangelog, readCommits, reformatChangelogContent, renderChangelogEntry, renderCommitlintConfig, renderGroups, renderWorkflow, renderWorkflows, resolveWorkflowId, ruleTitle, runChangelog, runWorkflows, splitInlineDescription, workflowFilenames };
17
+ }
18
+ //#endregion
19
+ export { AuthorInfo, BumpType, COMMITLINT_HEADER, CliOptions, CommitRecord, CommitlintOptions, DEFAULT_WORKFLOW_TOKENS, ExistingEntry, GroupedItem, GroupedRule, IssueInfo, ParsedCommit, ProcessingMethod, RanWorkflow, RenderWorkflowOptions, RunWorkflowsOptions, RunWorkflowsResult, WORKFLOW_FILENAMES, WORKFLOW_HEADER, Workflow, WorkflowId, WorkflowJob, applyWorkflowConfig, buildSummary, changelogSyncTask, conventionalCommitsVscodeExtensions, conventionalCommitsVscodeSettings, defaultWorkflows, deriveBump, formatBody, groupItems, index_d_exports, isEnabled, main, parseArgsCli, parseCcSubject, parseExistingChangelog, readCommits, reformatChangelogContent, renderChangelogEntry, renderCommitlintConfig, renderGroups, renderWorkflow, renderWorkflows, resolveWorkflowId, ruleTitle, runChangelog, runWorkflows, splitInlineDescription, workflowFilenames };
@@ -0,0 +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{deriveBump as n,readCommits as r}from"./utils/git.js";import{formatBody as i,groupItems as a,parseCcSubject as o,renderGroups as s,ruleTitle as c,splitInlineDescription as l}from"./utils/format.js";import{renderChangelogEntry as u}from"./utils/version.js";import{parseExistingChangelog as d,reformatChangelogContent as f}from"./utils/reformat.js";import{buildSummary as p}from"./utils/summary.js";import{main as m,runChangelog as h}from"./run.js";import{DEFAULT_WORKFLOW_TOKENS as g,WORKFLOW_FILENAMES as _,applyWorkflowConfig as v,defaultWorkflows as y,isEnabled as b,renderWorkflow as x,renderWorkflows as S}from"./workflows.js";import{resolveWorkflowId as C,runWorkflows as w}from"./run-workflows.js";import{conventionalCommitsVscodeExtensions as T,conventionalCommitsVscodeSettings as E,renderCommitlintConfig as D}from"./templates.js";import{COMMITLINT_HEADER as O,WORKFLOW_HEADER as k,changelogSyncTask as A,workflowFilenames as j}from"./sync.js";var M=/* @__PURE__ */ e({COMMITLINT_HEADER:()=>O,DEFAULT_WORKFLOW_TOKENS:()=>g,WORKFLOW_FILENAMES:()=>_,WORKFLOW_HEADER:()=>k,applyWorkflowConfig:()=>v,buildSummary:()=>p,changelogSyncTask:()=>A,conventionalCommitsVscodeExtensions:()=>T,conventionalCommitsVscodeSettings:()=>E,defaultWorkflows:()=>y,deriveBump:()=>n,formatBody:()=>i,groupItems:()=>a,isEnabled:()=>b,main:()=>m,parseArgsCli:()=>t,parseCcSubject:()=>o,parseExistingChangelog:()=>d,readCommits:()=>r,reformatChangelogContent:()=>f,renderChangelogEntry:()=>u,renderCommitlintConfig:()=>D,renderGroups:()=>s,renderWorkflow:()=>x,renderWorkflows:()=>S,resolveWorkflowId:()=>C,ruleTitle:()=>c,runChangelog:()=>h,runWorkflows:()=>w,splitInlineDescription:()=>l,workflowFilenames:()=>j});export{O as COMMITLINT_HEADER,g as DEFAULT_WORKFLOW_TOKENS,_ as WORKFLOW_FILENAMES,k as WORKFLOW_HEADER,v as applyWorkflowConfig,p as buildSummary,A as changelogSyncTask,T as conventionalCommitsVscodeExtensions,E as conventionalCommitsVscodeSettings,y as defaultWorkflows,n as deriveBump,i as formatBody,a as groupItems,b as isEnabled,m as main,t as parseArgsCli,o as parseCcSubject,d as parseExistingChangelog,r as readCommits,f as reformatChangelogContent,u as renderChangelogEntry,D as renderCommitlintConfig,s as renderGroups,x as renderWorkflow,S as renderWorkflows,C as resolveWorkflowId,c as ruleTitle,h as runChangelog,w as runWorkflows,l as splitInlineDescription,M as src_exports,j as workflowFilenames};
@@ -0,0 +1,35 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { ToolingConfig } from "../../shared/src/toolchain.js";
4
+ import "../../shared/src/index.js";
5
+ import { WorkflowId } from "./workflows.js";
6
+ //#region packages/changelog/src/run-workflows.d.ts
7
+ export interface RunWorkflowsOptions {
8
+ /** The project root the workflows live under. */
9
+ cwd: string;
10
+ /** Workflow ids or file names to run (default: every enabled workflow). */
11
+ workflows?: string[];
12
+ /** Git ref to run the workflow on (eg. `main`). */
13
+ ref?: string;
14
+ /** The loaded tooling config, used to check `changelog.workflows`. */
15
+ config?: ToolingConfig;
16
+ /** The `gh` executable (default `gh`). */
17
+ gh?: string;
18
+ }
19
+ export interface RanWorkflow {
20
+ id: WorkflowId;
21
+ file: string;
22
+ /** The `gh` exit code (0 = triggered). */
23
+ code: number;
24
+ }
25
+ export interface RunWorkflowsResult {
26
+ ran: RanWorkflow[];
27
+ }
28
+ /** Resolve a workflow id or file name (`ci` / `ci.yml`) to a known id. */
29
+ export declare function resolveWorkflowId(name: string): WorkflowId | undefined;
30
+ /**
31
+ * Trigger the requested workflows (all enabled ones when none are named).
32
+ * Throws when a workflow is unknown, disabled in the config or not generated.
33
+ */
34
+ export declare function runWorkflows(options: RunWorkflowsOptions): Promise<RunWorkflowsResult>;
35
+ //#endregion
@@ -0,0 +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}from"./workflows.js";import a from"node:fs";import{spawn as o}from"node:child_process";function s(e){let t=e.trim().replace(/\.ya?ml$/i,``).toLowerCase();return Object.keys(r).find(e=>e===t)}function c(e,t,n){return new Promise(r=>{let i=o(n,e,{cwd:t,stdio:`inherit`});i.on(`error`,()=>r(1)),i.on(`exit`,e=>r(e??0))})}async function l(o){let{cwd:l}=o,u=e=>n(o.config?.changelog)&&i(t(o.config?.changelog)?.workflows?.[e]),d=(o.workflows??[]).map(e=>e.trim()).filter(Boolean),f=[];if(d.length===0){for(let e of Object.keys(r))u(e)&&f.push(e);if(f.length===0)throw Error(`No workflows are enabled in dbx.config.* (changelog.workflows).`)}else for(let e of d){let t=s(e);if(!t)throw Error(`Unknown workflow "${e}". Known workflows: ${Object.keys(r).join(`, `)}.`);if(!u(t))throw Error(`Workflow "${t}" is not enabled in dbx.config.* (changelog.workflows.${t}).`);f.includes(t)||f.push(t)}let p=o.gh??`gh`,m=[];for(let t of f){let n=r[t],i=e.resolve(l,`.github/workflows`,n);if(!a.existsSync(i))throw Error(`Workflow file not found: .github/workflows/${n}. Run \`dbx sync\` first.`);let s=[`workflow`,`run`,n];o.ref&&s.push(`--ref`,o.ref),m.push({id:t,file:n,code:await c(s,l,p)})}return{ran:m}}export{s as resolveWorkflowId,l as runWorkflows};
@@ -0,0 +1,14 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { parseArgsCli } from "./utils/args.js";
4
+ import { formatBody, groupItems, parseCcSubject, renderGroups, ruleTitle, splitInlineDescription } from "./utils/format.js";
5
+ import { deriveBump, readCommits } from "./utils/git.js";
6
+ import { parseExistingChangelog, reformatChangelogContent } from "./utils/reformat.js";
7
+ import { buildSummary } from "./utils/summary.js";
8
+ import { renderChangelogEntry } from "./utils/version.js";
9
+ //#region packages/changelog/src/run.d.ts
10
+ /** Run the changelog pipeline (bump versions + write changelogs). */
11
+ export declare function runChangelog(argv?: string[]): void;
12
+ /** Alias kept for backwards compatibility. */
13
+ export declare const main: typeof runChangelog;
14
+ //#endregion
@@ -0,0 +1 @@
1
+ import{resolve as e}from"node:path";import{fileURLToPath as t}from"node:url";import.meta.url;import{parseArgsCli as n}from"./utils/args.js";import{deriveBump as r,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{bumpVersion as u,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{buildSummary as _}from"./utils/summary.js";import{writeChangelogs as v}from"./utils/write.js";import{existsSync as y,readFileSync as b,realpathSync as x,writeFileSync as S}from"node:fs";function C(t=process.argv.slice(2)){let x=n(t);if(x.formatOnly){console.log(`[format-only] Reformatting ${a().length} changelog file(s)${x.dryRun?` (dry run)`:``}.`),m(x.dryRun,x.packageChanges);return}let C=o();if(x.version){let e=x.version.trim();if(!/^\d+\.\d+\.\d+$/.test(e))throw Error(`Invalid version: ${e}`);if(e===C){console.log(`Version is already ${e}; nothing to do.`);return}c(e),p(C,e),console.log(`Retagged versions ${C} -> ${e}.`);return}let w=C;if(x.baseVersion){if(!/^\d+\.\d+\.\d+$/.test(x.baseVersion.trim()))throw Error(`Invalid base version: ${x.baseVersion}`);w=x.baseVersion.trim()}let T=x.processingMethod,E=T===`all`,D=T!==`latest`&&T!==`all`?T:x.range,O=i(D),k=r(O),A=_(O),j=u(w,k);if(x.dryRun){let t=s(),n=e(t,`CHANGELOG.md`),r=y(n)?b(n,`utf8`):``,i=h(r)[0]?.version,a=x.packageChanges&&i?l(i):``,o=f(j,A,/* @__PURE__ */ new Date,!0,a);console.log(`[DRY-RUN] Range: ${D}`),console.log(`[DRY-RUN] Processing method: ${T}${E?` (backward reformat)`:``}`),console.log(`[DRY-RUN] Bump: ${k} (\`${w}\` -> \`${j}\`)`),console.log(`[DRY-RUN] ${O.length} commit(s) scanned. Project files untouched.`),console.log(``),console.log(`Proposed new CHANGELOG.md entry (new version only):`),console.log(``),console.log(o),console.log(`--- end of proposed entry ---`);let c=E?g(x.packageChanges):r,u=d(c,o),p=e(t,`CHANGELOG.proposed.md`);S(p,u,`utf8`),console.log(`Wrote ${p}`)}else c(j),v(j,D,O,A,E,x.packageChanges),console.log(`Bumped ${w} -> ${j} (${k}) from ${O.length} commit(s).`)}const w=C;process.argv[1]&&T(process.argv[1])===t(import.meta.url)&&C();function T(e){try{return x(e)}catch{return e}}export{w as main,C as runChangelog};
@@ -0,0 +1,18 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { SyncTask, ToolingConfig } from "../../shared/src/toolchain.js";
4
+ import "../../shared/src/index.js";
5
+ //#region packages/changelog/src/sync.d.ts
6
+ /** The header prepended to every generated GitHub workflow. */
7
+ export declare const WORKFLOW_HEADER = "# Generated by @deltabox/toolchain — edit dbx.config.* and run `dbx sync`.";
8
+ /** The header prepended to the generated commitlint config. */
9
+ export declare const COMMITLINT_HEADER = "// Generated by @deltabox/toolchain — edit dbx.config.* and run `dbx sync`.";
10
+ /** The workflow file names produced for a config. */
11
+ export declare function workflowFilenames(config: ToolingConfig): string[];
12
+ /**
13
+ * The changelog sync task: writes the GitHub workflows + the commitlint config
14
+ * from the loaded `dbx.config.*`. Branches, triggers, steps, jobs and
15
+ * per-workflow tokens are all taken from the config.
16
+ */
17
+ export declare function changelogSyncTask(): SyncTask;
18
+ //#endregion
@@ -0,0 +1 @@
1
+ import"node:path";import"node:url";import.meta.url;import{sectionConfig as e,sectionEnabled as t}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import{renderWorkflows as n}from"./workflows.js";import{renderCommitlintConfig as r}from"./templates.js";const i="# Generated by @deltabox/toolchain — edit dbx.config.* and run `dbx sync`.",a="// Generated by @deltabox/toolchain — edit dbx.config.* and run `dbx sync`.";function o(t){return Object.keys(n({},e(t.changelog)?.workflows??{}))}function s(){return{name:`changelog`,projectTypes:[`monorepo-root`,`project`],enabled:e=>t(e.changelog),run:t=>{let o=e(t.config.changelog)??{},s=[];for(let[e,r]of Object.entries(n(t.tokens,o.workflows??{})))s.push({path:`.github/workflows/${e}`,content:`${i}\n${r}`});return s.push({path:`commitlint.config.mjs`,content:`${a}\n${r({...o.types?{types:o.types}:{},...o.scopes?{scopes:o.scopes}:{}})}`}),s}}}export{a as COMMITLINT_HEADER,i as WORKFLOW_HEADER,s as changelogSyncTask,o as workflowFilenames};
@@ -0,0 +1,27 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ //#region packages/changelog/src/templates.d.ts
4
+ /**
5
+ * Conventional-Commits supporting templates (commitlint config + the VS Code
6
+ * settings/extensions). The GitHub Actions workflows are built as data in
7
+ * `workflows.ts`.
8
+ */
9
+ export interface CommitlintOptions {
10
+ /** Allowed commit types (defaults to the Conventional-Commits set). */
11
+ types?: string[];
12
+ /** Allowed scopes (only enforced when a scope is present). */
13
+ scopes?: string[];
14
+ }
15
+ /** Render a `commitlint.config.mjs` module string (Oxfmt-formatted). */
16
+ export declare function renderCommitlintConfig(options?: CommitlintOptions): string;
17
+ /** The recommended VS Code settings for Conventional Commits. */
18
+ export declare const conventionalCommitsVscodeSettings: {
19
+ readonly 'conventionalCommits.autoCommit': false;
20
+ readonly 'conventionalCommits.gitmoji': false;
21
+ readonly 'git.postCommitCommand': 'none';
22
+ };
23
+ /** The recommended VS Code extension for Conventional Commits. */
24
+ export declare const conventionalCommitsVscodeExtensions: {
25
+ readonly recommendations: readonly ['vivaxy.vscode-conventional-commits'];
26
+ };
27
+ //#endregion
@@ -0,0 +1,27 @@
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=>e.map(e=>` '${e}',`).join(`
2
+ `);return`/**
3
+ * Conventional Commits enforcement (https://www.conventionalcommits.org/en/v1.0.0/).
4
+ * Generated by @deltabox/toolchain-changelog.
5
+ */
6
+ export default {
7
+ extends: ['@commitlint/config-conventional'],
8
+ rules: {
9
+ 'type-enum': [
10
+ 2,
11
+ 'always',
12
+ [
13
+ ${a(r)}
14
+ ],
15
+ ],
16
+ 'scope-enum': [
17
+ 2,
18
+ 'always',
19
+ [
20
+ ${a(i)}
21
+ ],
22
+ ],
23
+ 'body-max-line-length': [0],
24
+ 'footer-max-line-length': [0],
25
+ },
26
+ };
27
+ `}const r={"conventionalCommits.autoCommit":!1,"conventionalCommits.gitmoji":!1,"git.postCommitCommand":`none`},i={recommendations:[`vivaxy.vscode-conventional-commits`]};export{i as conventionalCommitsVscodeExtensions,r as conventionalCommitsVscodeSettings,n as renderCommitlintConfig};
@@ -0,0 +1,7 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { CliOptions } from "./types.js";
4
+ //#region packages/changelog/src/utils/args.d.ts
5
+ /** Parse the CLI argv into the pipeline options. */
6
+ export declare function parseArgsCli(argv: string[]): CliOptions;
7
+ //#endregion
@@ -0,0 +1 @@
1
+ import"node:path";import"node:url";import.meta.url;import{parseArgs as e}from"node:util";function t(t){let{values:n,positionals:r}=e({args:t,allowPositionals:!0,options:{range:{type:`string`},"dry-run":{type:`boolean`,default:!1},version:{type:`string`},"base-version":{type:`string`},"processing-method":{type:`string`},"format-only":{type:`boolean`,default:!1},"no-package-changes-section":{type:`boolean`,default:!1}}}),i=n[`processing-method`]?.trim()||process.env.CHANGELOG_PROCESSING_METHOD?.trim()||`latest`;return{range:n.range??r[0]??`HEAD`,dryRun:n[`dry-run`]??!1,version:n.version,baseVersion:n[`base-version`],processingMethod:i,formatOnly:n[`format-only`]??!1,packageChanges:!(n[`no-package-changes-section`]??!1)}}export{t as parseArgsCli};
@@ -0,0 +1,27 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { GroupedItem, GroupedRule, ParsedCommit } from "./types.js";
4
+ //#region packages/changelog/src/utils/format.d.ts
5
+ export declare function ruleTitle(type: string): string;
6
+ /** Parse a Conventional-Commits subject into its parts. */
7
+ export declare function parseCcSubject(subject: string): ParsedCommit;
8
+ /** Group a list of parsed commits by CC rule, then by scope. */
9
+ export declare function groupItems(items: GroupedItem[]): GroupedRule[];
10
+ export declare function renderGroups(groups: GroupedRule[]): string;
11
+ /**
12
+ * Split a changelog bullet's trailing inline content (after the commit credit
13
+ * suffix `([#<hash>](<url>) by <author>)` and an optional `(fixes ...)` block)
14
+ * into a description, so it can be nested under the commit like the rest.
15
+ */
16
+ export declare function splitInlineDescription(rest: string): {
17
+ main: string;
18
+ inline: string;
19
+ };
20
+ /**
21
+ * Split a commit body into description paragraphs and conventional footers
22
+ * (`KEY: value` lines), skipping bullet/numbered lists and issue-only lines so
23
+ * each commit's details are rendered as nested bullets rather than one long
24
+ * line. Blank lines separate paragraphs.
25
+ */
26
+ export declare function formatBody(body: string): string[][];
27
+ //#endregion
@@ -0,0 +1,5 @@
1
+ import"node:path";import"node:url";import.meta.url;import{readFileSync as e,writeFileSync as t}from"node:fs";const n={feat:`New features`,fix:`Bug fixes`,refactor:`Refactors`,docs:`Documentation`,style:`Styles`,chore:`Chores`,test:`Tests`,perf:`Performance`,build:`Build system`,ci:`Continuous integration`,revert:`Reverts`,breaking:`Breaking changes`},r=[`breaking`,`feat`,`fix`,`perf`,`refactor`,`docs`,`style`,`test`,`build`,`ci`,`chore`,`revert`];function i(e){return n[e]??n[e.toLowerCase()]??`Other changes`}function a(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 o(e){let t=/* @__PURE__ */ new Map;for(let n of e){let{parsed:e}=n,r=t.get(e.type)??{title:i(e.type),ungrouped:[],scopes:/* @__PURE__ */ new Map};if(e.scope){let t=r.scopes.get(e.scope)??[];t.push(n),r.scopes.set(e.scope,t)}else r.ungrouped.push(n);t.set(e.type,r)}return[...t.entries()].sort((e,t)=>{let n=r.indexOf(e[0]),i=r.indexOf(t[0]);return(n===-1?r.length:n)-(i===-1?r.length:i)}).map(([,e])=>e)}function s(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(...c(e.bodyParagraphs));for(let[e,r]of n.scopes){t.push(`#### ${l(e)}`);for(let e of r)t.push(e.text),t.push(...c(e.bodyParagraphs))}}return t.join(`
2
+ `)}function c(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 l(e){return e.charAt(0).toUpperCase()+e.slice(1)}function u(e){return e.length>0?e.charAt(0).toUpperCase()+e.slice(1):e}function d(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 f(e){let t=[],n=[];for(let r of e.split(`
3
+ `)){let e=r.trim();if(!e){n.length>0&&(t.push(n),n=[]);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 i=/^(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);i&&!/^(http|https)\b/.test(e)?(n.length>0&&(t.push(n),n=[]),t.push([`**${(i[1]??``).trim()}:** ${(i[2]??``).trim()}`])):n.push(e)}return n.length>0&&t.push(n),t}function p(e,t){return`https://github.com/${e}/commit/${t}`}function m(e,t){return`https://github.com/${e}/issues/${t}`}function h(e,t){return e.replace(/\[(#[0-9a-fA-F]{6,40})\]\(([^)]*)\)/g,(e,n)=>{let r=n.replace(`#`,``).slice(0,7);return`[#${r}](${p(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}](${p(t,i)})`})}function g(e,t){return e.replace(/\[#(\d+)(?=[ \]])(?:[^\]]*)\]\([^)]*\)/g,(e,n)=>`[#${n}](${m(t,n)})`).replace(/(^|[^\w[])#(\d+)(?=[)\].,;:\s]|$)/g,(e,n,r)=>`${n}[#${r}](${m(t,r)})`)}function _(e,t){if(!t)return e;let n=h(e,t);return n=g(n,t),n}function v(n,r){if(!r)return;let i=e(n,`utf8`),a=i.split(`
4
+ `).map(e=>_(e,r)).join(`
5
+ `);a!==i&&(t(n,a,`utf8`),console.log(` formatted ${n}`))}export{u as capitalize,f as formatBody,v as formatChangelogFile,_ as formatLine,o as groupItems,a as parseCcSubject,s as renderGroups,i as ruleTitle,d as splitInlineDescription};
@@ -0,0 +1,9 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { BumpType, CommitRecord } from "./types.js";
4
+ //#region packages/changelog/src/utils/git.d.ts
5
+ /** Read the commits in a git range (optionally limited to a path), newest first. */
6
+ export declare function readCommits(range: string, path?: string): CommitRecord[];
7
+ /** Derive the semver bump from the commits (major > minor > patch). */
8
+ export declare function deriveBump(records: CommitRecord[]): BumpType;
9
+ //#endregion
@@ -0,0 +1 @@
1
+ import"node:path";import"node:url";import.meta.url;import{execFileSync as e}from"node:child_process";function t(t,n){let r=[`log`,`--no-merges`,`--pretty=format:%H%x1f%s%x1f%b%x1f%an%x1f%ae%x1e`,t];return n&&r.push(`--`,n),e(`git`,r,{encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`]}).split(``).filter(e=>e.length>0).map(e=>{let[t,n,r,i,a]=e.split(``);return{hash:t.trim(),subject:(n??``).trim(),body:(r??``).trim(),author:(i??``).trim(),authorEmail:(a??``).trim()}}).filter(e=>e.subject.length>0)}function n(){try{let t=e(`git`,[`remote`,`get-url`,`origin`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim().match(/(?:github\.com[/:])([^/]+)\/([^/.]+?)(?:\.git)?$/);if(t?.[1]&&t[2])return`${t[1]}/${t[2]}`}catch{}}let r;function i(){if(r!==void 0)return r;try{e(`gh`,[`auth`,`status`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`]}),r=!0}catch{r=!1}return r}const a=/* @__PURE__ */ new Map;function o(t,n,r){if(!i())return;let o=`repos/${t}${n}::${r}`;if(a.has(o))return a.get(o);let s;try{let i=e(`gh`,[`api`,`repos/${t}${n}`,`--jq`,r],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`]}).trim();s=i&&i!==`null`?i:void 0}catch{s=void 0}return a.set(o,s),s}function s(e){return/^(\d+)\+([^@]+)@users\.noreply\.github\.com$/.exec(e.trim())?.[2]}function c(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}function l(e,t){let n;t&&(n=o(t,`/commits/${e.hash}/pulls`,`.[0].user.login`),n||=o(t,`/commits/${e.hash}`,`.author.login`)),n||=s(e.authorEmail);let r=n??e.author;return c(r)&&(r=s(r)??r.split(`@`)[0]??r),{name:r,url:n?`https://github.com/${n}`:void 0}}function u(e){return e.url?`[${e.name}](${e.url})`:e.name}function d(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 f(e,t){let n={number:t},r=o(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 p(e,t){let n=d(`${e.subject}\n${e.body}`);return n.length===0?[]:t?n.map(e=>f(t,e)):n.map(e=>({number:e}))}function m(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(`, `)})`}function h(e){return/\[(#[0-9a-fA-F]{6,40})\]\([^)]*\)/.exec(e)?.[1]?.replace(`#`,``)}function g(t){try{return e(`git`,[`log`,`-1`,`--format=%aI`,t],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim()}catch{return}}function _(t){for(let n of[`v${t}`,t])try{let t=e(`git`,[`log`,`-1`,`--format=%aI`,n],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim();if(t)return t}catch{}}function v(e,t){let n=_(e);if(n)return new Date(n);for(let e of t){let t=h(e);if(t){let e=g(t);if(e)return new Date(e)}}}let y;function b(){if(y)return y;let t=/* @__PURE__ */ new Map;try{let n=e(`git`,[`log`,`--no-merges`,`--all`,`--format=%H%x1f%s%x1f%b%x1e`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`],maxBuffer:134217728});for(let e of n.split(``)){if(!e.trim())continue;let[n=``,r=``,i=``]=e.split(``);if(!n)continue;let a={subject:r.trim(),body:i.trim()};t.set(n.trim(),a),t.set(n.trim().slice(0,7),a)}}catch{}return y=t,t}function x(e){return b().get(e)}function S(e){let t=`patch`;for(let n of e){let e=`${n.subject}\n${n.body}`;/\bBREAKING CHANGE\b/.test(e)||/^[a-zA-Z]+(\([^)]*\))?!:/.test(n.subject)?t=`major`:t!==`major`&&/^feat(\([^)]*\))?:/i.test(n.subject)&&(t=`minor`)}return t}export{h as bulletHash,S as deriveBump,v as deriveVersionDate,x as readCommit,t as readCommits,p as recordIssues,u as renderAuthor,m as renderIssues,n as repoSlug,l as resolveAuthorInfo};
@@ -0,0 +1,4 @@
1
+ import{resolve as e}from"node:path";import"node:url";import.meta.url;import{discoverWorkspaceDirs as t,repoRoot as n}from"./repo.js";import{readFileSync as r}from"node:fs";import{execFileSync as i}from"node:child_process";const a=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`];function o(e,t,n){for(let r of a){let i=e[r];if(i&&typeof i==`object`)for(let[e,r]of Object.entries(i)){let i=String(r);t.set(e,i===`catalog:`?n.get(e)??i:i)}}let r=e.resolutions;if(r&&typeof r==`object`)for(let[e,n]of Object.entries(r))t.set(`resolutions:${e}`,String(n))}function s(e,t){let n=!1;for(let r of e.split(`
2
+ `)){if(/^catalog:\s*$/.test(r)){n=!0;continue}if(!n||r.trim()===``)continue;if(!/^\s/.test(r)){n=!1;continue}let e=/^\s+(?:"([^"]+)"|([^:\s]+)):\s*(.+?)\s*$/.exec(r);e&&t.set(e[1]??e[2],e[3])}}function c(){let i=n(),a=/* @__PURE__ */ new Map;try{s(r(e(i,`.yarnrc.yml`),`utf8`),a)}catch{}let c=new Map(a);for(let n of t())try{o(JSON.parse(r(e(n,`package.json`),`utf8`)),c,a)}catch{}return c}function l(e){let t;try{t=i(`git`,[`ls-tree`,`-r`,`--name-only`,e],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).split(`
3
+ `).map(e=>e.trim()).filter(e=>e===`package.json`||e.endsWith(`/package.json`))}catch{return}if(t.length===0)return;let n=/* @__PURE__ */ new Map;try{s(i(`git`,[`show`,`${e}:.yarnrc.yml`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}),n)}catch{}let r=new Map(n);for(let a of t)try{let t=i(`git`,[`show`,`${e}:${a}`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]});o(JSON.parse(t),r,n)}catch{}return r}function u(e){for(let t of[`v${e}`,e])try{return i(`git`,[`rev-parse`,`--verify`,`--quiet`,t],{stdio:[`ignore`,`pipe`,`ignore`]}),t}catch{}try{let t=i(`git`,[`log`,`--all`,`--grep=version packages (${e})`,`--format=%H`,`-1`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim();if(t)return t}catch{}}function d(e,t){return e.name.localeCompare(t.name)}function f(e,t){let n=[],r=[],i=[];for(let[i,a]of t)e.has(i)?e.get(i)!==a&&r.push({name:i,from:e.get(i),to:a}):n.push({name:i,to:a});for(let[n,r]of e)t.has(n)||i.push({name:n,from:r});return{added:n.sort(d),updated:r.sort(d),removed:i.sort(d)}}function p(e){let{added:t,updated:n,removed:r}=e;if(t.length===0&&n.length===0&&r.length===0)return``;let i=[`### Package changes`];if(t.length>0){i.push(`#### Added`);for(let e of t)i.push(`- \`${e.name}\` \`${e.to}\``)}if(n.length>0){i.push(`#### Updated`);for(let e of n)i.push(`- \`${e.name}\` \`${e.from}\` → \`${e.to}\``)}if(r.length>0){i.push(`#### Removed`);for(let e of r)i.push(`- \`${e.name}\``)}return i.join(`
4
+ `)}function m(e,t){let n=u(e),r=u(t);if(!n||!r)return``;let i=l(n),a=l(r);return!i||!a?``:p(f(a,i))}function h(e){let t=u(e);if(!t)return``;let n=l(t);return n?p(f(n,c())):``}export{f as diffDependencies,h as packageChangesForCurrent,m as packageChangesForVersion,c as readCurrentDependencies,l as readDependenciesAtRef,p as renderPackageChanges,u as resolveVersionRef};
@@ -0,0 +1,9 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { ExistingEntry } from "./types.js";
4
+ //#region packages/changelog/src/utils/reformat.d.ts
5
+ /** Split a changelog into `## <version>` sections with their bullet lines. */
6
+ export declare function parseExistingChangelog(content: string): ExistingEntry[];
7
+ /** Backward-reformat an entire changelog file's content (all versions). */
8
+ export declare function reformatChangelogContent(content: string, repo: string | undefined, markersOnNewest?: boolean, includePackageChanges?: boolean): string;
9
+ //#endregion
@@ -0,0 +1,6 @@
1
+ import{resolve as e}from"node:path";import"node:url";import.meta.url;import{bulletHash as t,deriveVersionDate as n,readCommit as r,repoSlug as i}from"./git.js";import{changelogFiles as a,repoRoot as o}from"./repo.js";import{packageChangesForVersion as s}from"./packages.js";import{capitalize as c,formatBody as l,formatLine as u,groupItems as d,parseCcSubject as f,renderGroups as p}from"./format.js";import{renderChangelogEntry as m}from"./version.js";import{existsSync as h,readFileSync as g,writeFileSync as _}from"node:fs";function v(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 y(e){let t=e.lastIndexOf(`([#`);if(t===-1)return``;let n=e.slice(t);return/^(\(\[#[^\]]+\]\([^)]*\) by [^)]*\)\)?)(?:\(fixes [^)]*\)\)?)?/.exec(n)?.[0]??``}function b(e,i,a=!1,o=``){let s=[];for(let n of e.bullets){let e=n.replace(/^-\s+/,``),a=t(n),o=a?r(a):void 0,d=o?.subject??e.replace(/\*\*/g,``),p=f(d),m=y(e),h=`- ${[u(c(p.rest),i),m].filter(Boolean).join(` `)}`,g=o?l(o.body):[];s.push({parsed:p,text:h,bodyParagraphs:g})}let h=n(e.version,e.bullets);return m(e.version,p(d(s)),h,a,o)}function x(e,t,n=!1,r=!1){let i=v(e);if(i.length===0)return e;let a=e.split(`
3
+ `)[0]??`# Changelog`;return`${a.startsWith(`# `)?a:`# Changelog`}\n\n${i.map((e,a)=>{let o=i[a+1],c=r&&o?s(e.version,o.version):``;return b(e,t,n&&a===0,c)}).filter(Boolean).join(`
4
+
5
+
6
+ `)}\n`}function S(t=!1){let n=o(),r=e(n,`CHANGELOG.md`);return h(r)?x(g(r,`utf8`),i(),!1,t):``}function C(t,n=!1){let r=e(o(),`CHANGELOG.md`);for(let e of a()){let a=x(g(e,`utf8`),i(),!0,n&&e===r);if(t){let t=e.replace(/CHANGELOG\.md$/,`CHANGELOG.proposed.md`);_(t,a,`utf8`),console.log(`[DRY-RUN] Wrote ${t}`)}else _(e,a,`utf8`),console.log(` formatted ${e}`)}}export{C as formatExistingChangelogs,v as parseExistingChangelog,x as reformatChangelogContent,S as reformatRootChangelog};
@@ -0,0 +1 @@
1
+ import{resolve as e}from"node:path";import"node:url";import.meta.url;import{existsSync as t,globSync as n,readFileSync as r,writeFileSync as i}from"node:fs";function a(){let n=process.cwd();for(let r=0;r<8;r++){if(t(e(n,`package.json`)))return n;let r=e(n,`..`);if(r===n)break;n=r}return process.cwd()}function o(){let i=a(),o=JSON.parse(r(e(i,`package.json`),`utf8`)),s=/* @__PURE__ */ new Set([i]);for(let r of o.workspaces??[])if(r!==`.`)for(let a of n(r,{cwd:i})){let n=e(i,a);t(e(n,`package.json`))&&s.add(n)}return[...s]}function s(){let t=e(a(),`package.json`);return JSON.parse(r(t,`utf8`)).version??`0.0.0`}function c(n){for(let a of o()){let o=e(a,`package.json`);if(!t(o))continue;let s=JSON.parse(r(o,`utf8`));s.version=n,i(o,`${JSON.stringify(s,null,4)}\n`,`utf8`),console.log(` bumped ${o}`)}}function l(){let n=a();return[e(n,`CHANGELOG.md`),...o().filter(t=>e(t)!==e(n)).map(t=>e(t,`CHANGELOG.md`))].filter(e=>t(e))}export{l as changelogFiles,o as discoverWorkspaceDirs,s as readRootVersion,a as repoRoot,c as writeVersion};
@@ -0,0 +1,7 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { CommitRecord } from "./types.js";
4
+ //#region packages/changelog/src/utils/summary.d.ts
5
+ /** Render the grouped changelog summary for a set of commits. */
6
+ export declare function buildSummary(records: CommitRecord[]): string;
7
+ //#endregion
@@ -0,0 +1 @@
1
+ import"node:path";import"node:url";import.meta.url;import{recordIssues as e,renderAuthor as t,renderIssues as n,repoSlug as r,resolveAuthorInfo as i}from"./git.js";import{capitalize as a,formatBody as o,groupItems as s,parseCcSubject as c,renderGroups as l}from"./format.js";function u(u){let d=r(),f=s(u.map(r=>{let s=c(r.subject),l=r.hash.slice(0,7),u=t(i(r,d));return{parsed:s,text:`- ${a(s.rest)} ([#${l}](https://github.com/${d}/commit/${r.hash}) by ${u})${n(e(r,d))}`,bodyParagraphs:o(r.body)}}));return l(f)}export{u as buildSummary};
@@ -0,0 +1,58 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ //#region packages/changelog/src/utils/types.d.ts
4
+ /** Shared types for the changelog pipeline. */
5
+ export type BumpType = 'major' | 'minor' | 'patch';
6
+ export type ProcessingMethod = 'latest' | 'all' | string;
7
+ export interface CommitRecord {
8
+ hash: string;
9
+ subject: string;
10
+ body: string;
11
+ author: string;
12
+ authorEmail: string;
13
+ }
14
+ export interface AuthorInfo {
15
+ name: string;
16
+ url?: string;
17
+ }
18
+ export interface IssueInfo {
19
+ number: number;
20
+ title?: string;
21
+ url?: string;
22
+ }
23
+ export interface CliOptions {
24
+ range: string;
25
+ dryRun: boolean;
26
+ version?: string;
27
+ baseVersion?: string;
28
+ processingMethod: ProcessingMethod;
29
+ formatOnly: boolean;
30
+ /** Include the `### Package changes` footer (disable with --no-package-changes-section). */
31
+ packageChanges: boolean;
32
+ }
33
+ /** A Conventional-Commits subject parsed into its parts. */
34
+ export interface ParsedCommit {
35
+ type: string;
36
+ scope?: string;
37
+ breaking: boolean;
38
+ /** Everything after the `type(scope):` prefix (subject + link/author suffix). */
39
+ rest: string;
40
+ }
41
+ /** A list of parsed commits grouped by CC rule, then by scope. */
42
+ export interface GroupedRule {
43
+ title: string;
44
+ ungrouped: GroupedItem[];
45
+ scopes: Map<string, GroupedItem[]>;
46
+ }
47
+ export interface GroupedItem {
48
+ parsed: ParsedCommit;
49
+ text: string;
50
+ /** Description paragraphs; each becomes one nested bullet with wrapped continuations. */
51
+ bodyParagraphs: string[][];
52
+ }
53
+ /** A `## <version>` section parsed out of an existing changelog. */
54
+ export interface ExistingEntry {
55
+ version: string;
56
+ bullets: string[];
57
+ }
58
+ //#endregion
@@ -0,0 +1,6 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ //#region packages/changelog/src/utils/version.d.ts
4
+ /** Render a `## <version> (Month Year)` heading + summary, optionally marked. */
5
+ export declare function renderChangelogEntry(version: string, summary: string, date?: Date, withMarkers?: boolean, packageChanges?: string): string;
6
+ //#endregion
@@ -0,0 +1,14 @@
1
+ import{resolve as e}from"node:path";import"node:url";import.meta.url;import{discoverWorkspaceDirs as t,repoRoot as n}from"./repo.js";import{existsSync as r,readFileSync as i,writeFileSync as a}from"node:fs";function o(e){return`${e.toLocaleString(`en-US`,{month:`long`})} ${e.getFullYear()}`}function s(e,t){let n=/^(\d+)\.(\d+)\.(\d+)/.exec(e);if(!n)throw Error(`Cannot parse version "${e}"`);let r=Number(n[1]),i=Number(n[2]),a=Number(n[3]);return t===`major`?(r+=1,i=0,a=0):t===`minor`?(i+=1,a=0):a+=1,`${r}.${i}.${a}`}function c(e,t,n,r=!0,i=``){let a=n?` (${o(n)})`:``,s=i?`${t}\n\n${i}`:t;return r?`## ${e}${a}
2
+
3
+ <!-- release:start -->
4
+
5
+ ${s}
6
+
7
+ <!-- release:end -->`:`## ${e}${a}\n\n${s}`}function l(e,t){let n=e.split(`
8
+ `).filter(e=>!e.includes(`<!-- release:start -->`)&&!e.includes(`<!-- release:end -->`)).join(`
9
+ `).trimEnd().replace(/\n{3,}/g,`
10
+
11
+ `),r=n.split(`
12
+ `),i=r[0],a;return a=i!==void 0&&i.startsWith(`# `)?[i,``,t.trimEnd(),``,...r.slice(1)].join(`
13
+ `):`${t.trimEnd()}\n\n${n}`,`${a.trimEnd()}\n`}function u(e,t){let n=r(e)?i(e,`utf8`):`# Changelog
14
+ `;a(e,l(n,t),`utf8`)}function d(o,s){let c=n(),l=[e(c,`CHANGELOG.md`),...t().map(t=>e(t,`CHANGELOG.md`))];for(let e of l){if(!r(e))continue;let t=i(e,`utf8`),n=t.replace(`## ${o}`,`## ${s}`);n!==t&&(a(e,n,`utf8`),console.log(` retagged ${e}`))}}export{s as bumpVersion,l as insertNewEntry,o as monthYear,u as prependChangelogEntry,c as renderChangelogEntry,d as retagChangelogs};
@@ -0,0 +1 @@
1
+ import{relative as e,resolve as t}from"node:path";import"node:url";import.meta.url;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{existsSync as p,readFileSync as m,writeFileSync as h}from"node:fs";function g(g,_,v,y,b,x=!1){let S=a(),C=r(),w=t(S,`CHANGELOG.md`),T=``;if(x&&p(w)){let e=u(m(w,`utf8`))[0];e&&(T=o(e.version))}if(b){let e=d(x);e&&(h(w,e,`utf8`),console.log(` reformatted ${w}`))}let E=l(g,y,/* @__PURE__ */ new Date,!0,T);c(w,E),console.log(` updated ${w}`);for(let r of i()){if(t(r)===t(S))continue;let i=t(r,`CHANGELOG.md`);if(!p(i))continue;let a=e(S,r).replace(/\\/g,`/`),o=n(_,a);if(o.length===0){console.log(` skipped ${i} (no commits in ${a})`);continue}let s=f(o);c(i,l(g,s,/* @__PURE__ */ new Date)),console.log(` updated ${i}`)}for(let e of[t(S,`CHANGELOG.md`),...i().filter(e=>t(e)!==t(S)).map(e=>t(e,`CHANGELOG.md`)).filter(e=>p(e))])s(e,C)}export{g as writeChangelogs};
@@ -0,0 +1,51 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { Replacements } from "../../shared/src/template.js";
4
+ import { WorkflowConfig, WorkflowSetting, WorkflowStep } from "../../shared/src/config-schema.js";
5
+ import "../../shared/src/index.js";
6
+ //#region packages/changelog/src/workflows.d.ts
7
+ export interface WorkflowJob {
8
+ name?: string;
9
+ 'runs-on': string;
10
+ if?: string;
11
+ needs?: string | string[];
12
+ permissions?: Record<string, string>;
13
+ env?: Record<string, string>;
14
+ outputs?: Record<string, string>;
15
+ steps: WorkflowStep[];
16
+ }
17
+ export interface Workflow {
18
+ name: string;
19
+ on: Record<string, unknown>;
20
+ permissions?: Record<string, string>;
21
+ concurrency?: unknown;
22
+ env?: Record<string, string>;
23
+ jobs: Record<string, WorkflowJob>;
24
+ [key: string]: unknown;
25
+ }
26
+ /** The default replacement values for the workflow templates. */
27
+ export declare const DEFAULT_WORKFLOW_TOKENS: Replacements;
28
+ /** The workflow ids the builder knows about. */
29
+ export type WorkflowId = 'ci' | 'changelog' | 'release' | 'sync' | 'issues';
30
+ /** Default file name per workflow id. */
31
+ export declare const WORKFLOW_FILENAMES: Record<WorkflowId, string>;
32
+ /** Whether a workflow setting enables the workflow (default true). */
33
+ export declare function isEnabled(setting: WorkflowSetting | undefined): boolean;
34
+ /** Build all default workflows for a set of tokens. */
35
+ export declare function defaultWorkflows(tokens: Replacements): Record<WorkflowId, Workflow>;
36
+ /** Merge a consumer's {@link WorkflowConfig} over a default workflow. */
37
+ export declare function applyWorkflowConfig(workflow: Workflow, config?: WorkflowConfig): Workflow;
38
+ export interface RenderWorkflowOptions {
39
+ /** Base replacement tokens (merged with the workflow's own `tokens`). */
40
+ tokens: Replacements;
41
+ /** The consumer's per-workflow config. */
42
+ config?: WorkflowConfig;
43
+ }
44
+ /**
45
+ * Build one workflow as a YAML string, applying the consumer's config. Returns
46
+ * `undefined` when the workflow is disabled.
47
+ */
48
+ export declare function renderWorkflow(id: WorkflowId, options: RenderWorkflowOptions): string | undefined;
49
+ /** Render every workflow, keyed by file name (disabled ones are omitted). */
50
+ export declare function renderWorkflows(tokens: Replacements, workflows?: Partial<Record<WorkflowId, WorkflowSetting>>): Record<string, string>;
51
+ //#endregion
@@ -0,0 +1,5 @@
1
+ import"node:path";import"node:url";import.meta.url;import{applyReplacementsDeep as e}from"../../shared/src/template.js";import{toYaml as t}from"../../shared/src/yaml.js";import"../../shared/src/index.js";const n={nodeVersion:`22`,yarnVersion:`4.17.1`,packageManager:`yarn`,mainBranch:`main`,devBranch:`dev`,tooling:`dbx`},r={ci:`ci.yml`,changelog:`changelog.yml`,release:`release.yml`,sync:`sync.yml`,issues:`issues.yml`};function i(e){return e===void 0?!0:typeof e==`boolean`?e:e.enabled!==!1}function a(e){return`${e.packageManager} ${e.tooling}`}function o(e){return[{name:`Checkout`,uses:`actions/checkout@v4`,with:{"fetch-depth":0,token:"${{ secrets.GITHUB_TOKEN }}"}},{name:`Setup Node`,uses:`actions/setup-node@v4`,with:{"node-version":String(e.nodeVersion)}},{name:`Enable Corepack`,run:`corepack enable\ncorepack prepare ${e.packageManager}@${e.yarnVersion} --activate`},{name:`Install dependencies`,run:`${e.packageManager} install --immutable`}]}function s(e){let t=a(e),n=String(e.mainBranch),r=String(e.devBranch);return{ci:{name:`CI`,on:{push:{branches:[n]},pull_request:{branches:[`release/**`,`feat/**`,`feature/**`,`fix/**`,`chore/**`]}},jobs:{ci:{"runs-on":`ubuntu-latest`,steps:[...o(e),{name:`Commitlint (Conventional Commits)`,if:"${{ github.event_name == 'pull_request' || github.event.before != '0000000000000000000000000000000000000000' }}",run:`set -euo pipefail\nbase="\${{ github.event.pull_request.base.sha || github.event.before }}"\nhead="\${{ github.event.pull_request.head.sha || github.event.after }}"\n${e.packageManager} commitlint --from "$base" --to "$head"`},{name:`Verify generated files are in sync`,run:`${t} sync --check`},{name:`Build`,run:`${e.packageManager} build`}]}}},changelog:{name:`Changelog (dev)`,on:{push:{branches:[r]}},permissions:{contents:`write`},concurrency:{group:`changelog-dev`,"cancel-in-progress":!1},jobs:{"generate-changelog":{"runs-on":`ubuntu-latest`,if:`!startsWith(github.event.head_commit.message, 'chore: version packages ') && !startsWith(github.event.head_commit.message, 'release: ')`,env:{GITHUB_TOKEN:"${{ secrets.GITHUB_TOKEN }}"},steps:[...o(e),{name:`Generate changelog + bump versions`,env:{GITHUB_TOKEN:"${{ secrets.GITHUB_TOKEN }}"},run:[`set -euo pipefail`,'after="${{ github.event.after }}"; [ -n "$after" ] || after="HEAD"',`boundary="$(git log --format=%H --grep='^chore: version packages ' -1 || true)"`,`if [ -n "$boundary" ]; then range="$boundary..$after"; else range="$after"; fi`,`${t} changelog --range "$range"`].join(`
2
+ `)},{name:`Commit + push changelog updates`,env:{GITHUB_TOKEN:"${{ secrets.GITHUB_TOKEN }}"},run:[`set -euo pipefail`,`git diff --quiet && { echo "No changelog changes."; exit 0; }`,`git config user.name "github-actions[bot]"`,`git config user.email "41898282+github-actions[bot]@users.noreply.github.com"`,`git add -A`,`git commit -m "chore: version packages ($(node -p "require('./package.json').version"))"`,`git push origin ${r}`].join(`
3
+ `)}]}}},release:{name:`Release`,on:{push:{branches:[n]},workflow_dispatch:null},permissions:{contents:`write`,"pull-requests":`write`},concurrency:{group:`release`,"cancel-in-progress":!1},jobs:{"create-release-pr":{"runs-on":`ubuntu-latest`,if:`(github.event_name == 'push' || github.event_name == 'workflow_dispatch') && !startsWith(github.event.head_commit.message, 'chore: version packages ') && !startsWith(github.event.head_commit.message, 'release: ')`,env:{GITHUB_TOKEN:"${{ secrets.GITHUB_TOKEN }}"},steps:[...o(e),{name:`Open release PR`,env:{GITHUB_TOKEN:"${{ secrets.GITHUB_TOKEN }}"},run:[`set -euo pipefail`,`version="$(node -p "require('./package.json').version")"`,`branch="release/$version"`,`if git ls-remote --exit-code --heads origin "$branch" >/dev/null 2>&1; then`,` echo "Release PR already open for $version."; exit 0`,`fi`,`git config user.name "github-actions[bot]"`,`git config user.email "41898282+github-actions[bot]@users.noreply.github.com"`,`git checkout -b "$branch"`,`git add -A`,`git commit -m "chore: version packages ($version)" || true`,`git push origin "$branch"`,`notes="$(awk '/<!-- release:start -->/{f=1;next} /<!-- release:end -->/{exit} f{print}' CHANGELOG.md 2>/dev/null || true)"`,`[ -n "$notes" ] || notes="Release $version"`,`gh pr create --base ${n} --head "$branch" --title "release: $version" --body "$notes"`].join(`
4
+ `)}]}}},sync:{name:`Tooling sync`,on:{push:{branches:[n,r]},pull_request:null},jobs:{sync:{"runs-on":`ubuntu-latest`,steps:[...o(e),{name:`Verify generated files are in sync`,run:`${t} sync --check`}]}}},issues:{name:`Issues`,on:{issues:{types:[`opened`]}},permissions:{issues:`write`},jobs:{"enforce-title":{"runs-on":`ubuntu-latest`,steps:[{name:`Check and rename issue title`,env:{GH_TOKEN:"${{ github.token }}",ISSUE_NUMBER:"${{ github.event.issue.number }}"},run:[`set -euo pipefail`,`labels=$(gh issue view "$ISSUE_NUMBER" --json labels -q '.labels[].name' || true)`,`title=$(gh issue view "$ISSUE_NUMBER" --json title -q '.title')`,`type=""`,`for label in $labels; do case "$label" in *bug*) type="bug" ;; esac; done`,`if [ -z "$type" ]; then for label in $labels; do case "$label" in *enhancement*|*feature*|*feat*) type="feat" ;; esac; done; fi`,`if [ -z "$type" ]; then echo "No bug/enhancement label on issue #$ISSUE_NUMBER; skipping."; exit 0; fi`,`prefix="[bug]"; [ "$type" = "feat" ] && prefix="[feat]"`,`stripped=$(printf '%s' "$title" | sed -E 's/^\\[(bug|feat)\\] *//i')`,`new_title="$prefix $stripped"`,`if [ "$new_title" = "$title" ]; then echo "Issue #$ISSUE_NUMBER title already conforms."; exit 0; fi`,`gh issue edit "$ISSUE_NUMBER" --title "$new_title"`].join(`
5
+ `)}]}}}}}function c(e){return e.steps?Array.isArray(e.steps)?e.steps:[e.steps]:[]}function l(e,t={}){let n=structuredClone(e);if(t.pushBranches){let e=n.on.push??{};n.on.push={...e,branches:t.pushBranches}}if(t.pullRequestBranches){let e=n.on.pull_request??{};n.on.pull_request={...e,branches:t.pullRequestBranches}}t.triggers&&(n.on={...n.on,...t.triggers}),t.extra&&Object.assign(n,t.extra),t.jobs&&(n.jobs={...n.jobs,...t.jobs});let r=Object.keys(n.jobs)[0];for(let e of c(t)){let t=e.job??r;if(!t)continue;let i=n.jobs[t];i&&(i.steps=[...e.before??[],...i.steps,...e.after??[]])}return n}function u(r,i){let a=i.config??{};if(a.enabled===!1)return;let o={...n,...i.tokens,...a.tokens},c=s(o)[r],u=e(l(c,a),o);return t(u)}function d(e,t={}){let n={};for(let a of Object.keys(r)){let o=t[a];if(!i(o))continue;let s=u(a,{tokens:e,config:typeof o==`object`?o:{}});s&&(n[r[a]]=s)}return n}export{n as DEFAULT_WORKFLOW_TOKENS,r as WORKFLOW_FILENAMES,l as applyWorkflowConfig,s as defaultWorkflows,i as isEnabled,u as renderWorkflow,d as renderWorkflows};
@@ -0,0 +1,28 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { ToolingCommand } from "../../../shared/src/types.js";
4
+ import "../../../shared/src/index.js";
5
+ import { ConfigEngine } from "../engine.js";
6
+ //#region packages/config/src/cli/index.d.ts
7
+ /** Default output locations for the config commands. */
8
+ export interface ConfigCommandDefaults {
9
+ /** Where `.env.example[.dev]` are written (default: engine root). */
10
+ envDir?: string;
11
+ /** Where the config + env types are written. */
12
+ typesDir?: string;
13
+ /** Where the markdown reference is written. */
14
+ docsDir?: string;
15
+ /** The JSON Schema output path. */
16
+ schemaPath?: string;
17
+ /** The config metadata output path. */
18
+ configJsonPath?: string;
19
+ /** The CLI options output path. */
20
+ cliOptionsPath?: string;
21
+ }
22
+ export interface ConfigCommandContext {
23
+ engine: ConfigEngine;
24
+ defaults?: ConfigCommandDefaults;
25
+ }
26
+ /** Build the config commands bound to a consumer's engine. */
27
+ export declare function configCommands(ctx: ConfigCommandContext): ToolingCommand[];
28
+ //#endregion
@@ -0,0 +1 @@
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import t from"node:fs";function n(t,n){return e.resolve(t??n)}function r(r){let{engine:i}=r,a=r.defaults??{};return[{name:`config:env`,description:`Generate .env.example from the config schemas.`,options:[{flags:`-o, --out <dir>`,description:`Output directory.`}],run:({out:t})=>{let r=e.join(n(t,a.envDir??i.root),`.env.example`);i.writeEnvFile({output:r}),console.log(`Generated ${e.relative(process.cwd(),r)}`)}},{name:`config:types`,description:`Generate the config and env types.`,options:[{flags:`-o, --out <dir>`,description:`Output directory.`},{flags:`--env`,description:`Also write the env type files.`}],run:({out:t,env:r})=>{let o=n(t,a.typesDir??i.root),s=i.writeConfigTypes({outputDir:o});r&&s.push(...i.writeEnvTypes({outputDir:o}));for(let t of s)console.log(`Generated ${e.relative(process.cwd(),t)}`)}},{name:`config:json`,description:`Generate the config metadata JSON.`,options:[{flags:`-o, --out <file>`,description:`Output file.`}],run:({out:r})=>{let o=n(r,a.configJsonPath??e.join(i.root,`config.json`)),s=i.buildConfigJson();t.mkdirSync(e.dirname(o),{recursive:!0}),t.writeFileSync(o,`${JSON.stringify(s,null,4)}\n`,`utf-8`),console.log(`Generated ${e.relative(process.cwd(),o)}`)}},{name:`config:schema`,description:`Generate the untyped JSON Schema.`,options:[{flags:`-o, --out <file>`,description:`Output file.`}],run:async({out:t})=>{let r=n(t,a.schemaPath??e.join(i.root,`config.schema.json`));await i.writeJsonSchema({output:r}),console.log(`Generated ${e.relative(process.cwd(),r)}`)}},{name:`config:markdown`,description:`Generate the markdown configuration reference.`,options:[{flags:`-o, --out <dir>`,description:`Output directory.`}],run:({out:t})=>{let r=n(t,a.docsDir??e.join(i.root,`docs/reference/configuration`)),o=i.writeMarkdown({outDir:r});for(let t of o)console.log(`Generated ${e.relative(process.cwd(),t)}`)}},{name:`config:cli`,description:`Generate the CLI options JSON.`,options:[{flags:`-o, --out <file>`,description:`Output file.`}],run:({out:t})=>{let r=n(t,a.cliOptionsPath??e.join(i.root,`cli-options.json`));i.generateCliOptions({output:r}),console.log(`Generated ${e.relative(process.cwd(),r)}`)}},{name:`config:all`,description:`Run every config generator.`,options:[{flags:`-o, --out <dir>`,description:`Base output directory.`}],run:async({out:t})=>{let r=n(t,i.root),a=[];a.push(i.writeEnvFile({output:e.join(r,`.env.example`)})),a.push(...i.writeConfigTypes({outputDir:e.join(r,`types`)}),...i.writeEnvTypes({outputDir:e.join(r,`types`)}),...i.writeMarkdown({outDir:e.join(r,`docs/reference/configuration`)})),a.push(await i.writeJsonSchema({output:e.join(r,`config.schema.json`)})),a.push(i.generateCliOptions({output:e.join(r,`cli-options.json`)}));for(let t of a.filter(e=>typeof e==`string`))console.log(`Generated ${e.relative(process.cwd(),t)}`)}}]}export{r as configCommands};
@@ -0,0 +1,19 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { ConfigScopes, EnvVarDef } from "./types.js";
4
+ //#region packages/config/src/collect.d.ts
5
+ /** The default env-var prefix used when none is configured. */
6
+ export declare const DEFAULT_ENV_PREFIX = "APP_";
7
+ /** Options for {@link collectEnvVars}. */
8
+ export interface CollectEnvVarsOptions {
9
+ /**
10
+ * Custom env-name -> dotted-path derivation, used when a leaf does not set
11
+ * an explicit `path` (eg. to handle dual `PROXIFIED_`/`VITE_` prefixes).
12
+ */
13
+ envPathOf?: (env: string) => string;
14
+ }
15
+ /** Collect every env-var-backed leaf from the scope schemas. */
16
+ export declare function collectEnvVars(scopes: ConfigScopes, envPrefix?: string, options?: CollectEnvVarsOptions): EnvVarDef[];
17
+ /** Collect the env var names marked `required` for a scope. */
18
+ export declare function collectRequiredEnvVars(scopes: ConfigScopes, scope: string, envPrefix?: string, options?: CollectEnvVarsOptions): string[];
19
+ //#endregion
@@ -0,0 +1 @@
1
+ import"node:path";import"node:url";import.meta.url;import{envMetaOf as e}from"./schema.js";import{envPathOf as t}from"./types.js";const n=`APP_`;function r(e){let t=Array.isArray(e)?e:[e];if(t.includes(`array`))return`array`;if(t.includes(`object`))return`object`;if(t.includes(`boolean`))return`boolean`;if(t.includes(`number`))return`number`;if(t.includes(`string`))return`string`}function i(n,a,o,s){let c=e(n);if(c?.env){let e;try{e=n.toJSONSchema?.()}catch{}a.push({name:c.env,path:c.path??s.envPathOf?.(c.env)??t(c.env,o),...c.description?{description:c.description}:{},...e?.default===void 0?{}:{default:e.default},...c.required?{required:!0}:{},...c.secret?{secret:!0}:{},scope:c.scope??`default`,...c.public?{public:!0}:{},...r(e?.type)?{envType:r(e?.type)}:{}});return}let l=n.shape;if(l)for(let e of Object.values(l))i(e,a,o,s)}function a(e,t=n,r={}){let a=[];for(let[n,o]of Object.entries(e)){let e=a.length;i(o.zodSchema,a,t,r);for(let t=e;t<a.length;t++)(!a[t].scope||a[t].scope==="default")&&(a[t].scope=n)}return a}function o(e,t,r=n,i={}){return a(e,r,i).filter(e=>e.scope===t&&e.required).map(e=>e.name)}export{n as DEFAULT_ENV_PREFIX,a as collectEnvVars,o as collectRequiredEnvVars};
@@ -0,0 +1,33 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { ConfigScopes } from "./types.js";
4
+ import { CollectEnvVarsOptions } from "./collect.js";
5
+ //#region packages/config/src/config-json.d.ts
6
+ /** A serialized env var entry in `config.json`. */
7
+ export interface ConfigJsonEntry {
8
+ name: string;
9
+ path: string;
10
+ scope: string;
11
+ description?: string;
12
+ default?: unknown;
13
+ required?: boolean;
14
+ secret?: boolean;
15
+ public?: boolean;
16
+ }
17
+ /** The generated config metadata document (`config.json`). */
18
+ export interface ConfigJsonDoc {
19
+ $comment: string;
20
+ version: number;
21
+ env: ConfigJsonEntry[];
22
+ }
23
+ export interface BuildConfigJsonOptions {
24
+ /** The env-var prefix (default `APP_`). */
25
+ envPrefix?: string;
26
+ /** Override the `$comment` banner. */
27
+ comment?: string;
28
+ /** Custom env-name -> dotted-path derivation. */
29
+ envPathOf?: CollectEnvVarsOptions['envPathOf'];
30
+ }
31
+ /** Build the config metadata JSON document. */
32
+ export declare function buildConfigJson(scopes: ConfigScopes, options?: BuildConfigJsonOptions): ConfigJsonDoc;
33
+ //#endregion
@@ -0,0 +1 @@
1
+ import"node:path";import"node:url";import.meta.url;import{collectEnvVars as e}from"./collect.js";function t(t,n={}){let r=e(t,n.envPrefix,{envPathOf:n.envPathOf});return{$comment:n.comment??`Generated from the config engine — edit the config schemas instead.`,version:1,env:r.map(e=>({name:e.name,path:e.path,scope:e.scope,...e.description?{description:e.description}:{},...e.default===void 0?{}:{default:e.default},...e.required?{required:!0}:{},...e.secret?{secret:!0}:{},...e.public?{public:!0}:{}}))}}export{t as buildConfigJson};