@deltabox/toolchain 1.7.8 → 1.9.0

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 (79) hide show
  1. package/CHANGELOG.md +136 -3
  2. package/dist/changelog.d.ts +3 -2
  3. package/dist/changelog.js +1 -1
  4. package/dist/cli/commands/shared.js +1 -1
  5. package/dist/cli/index.js +1 -1
  6. package/dist/cli/register.js +1 -1
  7. package/dist/core.d.ts +3 -3
  8. package/dist/core.js +1 -1
  9. package/dist/index.d.ts +10 -8
  10. package/dist/index.js +1 -1
  11. package/dist/package.js +1 -1
  12. package/dist/packages/changelog/src/index.d.ts +4 -3
  13. package/dist/packages/changelog/src/index.js +1 -1
  14. package/dist/packages/changelog/src/sync.d.ts +6 -2
  15. package/dist/packages/changelog/src/sync.js +1 -1
  16. package/dist/packages/changelog/src/utils/git.d.ts +2 -2
  17. package/dist/packages/changelog/src/utils/git.js +1 -1
  18. package/dist/packages/changelog/src/utils/graph.d.ts +23 -0
  19. package/dist/packages/changelog/src/utils/graph.js +1 -0
  20. package/dist/packages/changelog/src/utils/versioning.js +1 -1
  21. package/dist/packages/changelog/src/utils/write.js +1 -1
  22. package/dist/packages/changelog/src/workflows.d.ts +6 -2
  23. package/dist/packages/changelog/src/workflows.js +4 -4
  24. package/dist/packages/core/src/gitignore.d.ts +7 -1
  25. package/dist/packages/core/src/gitignore.js +1 -1
  26. package/dist/packages/core/src/graph.js +1 -1
  27. package/dist/packages/core/src/index.d.ts +4 -4
  28. package/dist/packages/core/src/index.js +1 -1
  29. package/dist/packages/core/src/loader.d.ts +30 -4
  30. package/dist/packages/core/src/loader.js +1 -1
  31. package/dist/packages/core/src/project-type.d.ts +8 -1
  32. package/dist/packages/core/src/project-type.js +1 -1
  33. package/dist/packages/core/src/sync.d.ts +1 -1
  34. package/dist/packages/core/src/sync.js +1 -1
  35. package/dist/packages/core/src/watch.d.ts +4 -0
  36. package/dist/packages/core/src/watch.js +1 -1
  37. package/dist/packages/migrate/src/cli/index.d.ts +4 -0
  38. package/dist/packages/migrate/src/cli/index.js +1 -1
  39. package/dist/packages/migrate/src/types.d.ts +11 -0
  40. package/dist/packages/migrate/src/vite.js +2 -1
  41. package/dist/packages/project/src/cli/index.js +1 -1
  42. package/dist/packages/project/src/index.d.ts +3 -2
  43. package/dist/packages/project/src/index.js +1 -1
  44. package/dist/packages/project/src/sync.d.ts +14 -0
  45. package/dist/packages/project/src/sync.js +1 -0
  46. package/dist/packages/project/src/typescript.js +1 -1
  47. package/dist/packages/shared/src/config-schema.d.ts +148 -77
  48. package/dist/packages/shared/src/config-schema.js +1 -1
  49. package/dist/packages/shared/src/config-types.d.ts +78 -16
  50. package/dist/packages/shared/src/ignore.d.ts +38 -0
  51. package/dist/packages/shared/src/ignore.js +1 -0
  52. package/dist/packages/shared/src/index.d.ts +9 -7
  53. package/dist/packages/shared/src/index.js +1 -1
  54. package/dist/packages/shared/src/project.d.ts +25 -0
  55. package/dist/packages/shared/src/project.js +1 -0
  56. package/dist/packages/shared/src/toolchain.d.ts +13 -2
  57. package/dist/packages/shared/src/toolchain.js +1 -1
  58. package/dist/packages/shared/src/types.d.ts +9 -2
  59. package/dist/packages/tsconfig/src/cli/generate/index.d.ts +16 -9
  60. package/dist/packages/tsconfig/src/cli/generate/index.js +1 -1
  61. package/dist/packages/tsconfig/src/cli/generate/utils.js +1 -1
  62. package/dist/packages/tsconfig/src/cli/index.d.ts +1 -1
  63. package/dist/packages/tsconfig/src/cli/index.js +1 -1
  64. package/dist/packages/tsconfig/src/sync.d.ts +4 -5
  65. package/dist/packages/tsconfig/src/sync.js +1 -1
  66. package/dist/packages/tsconfig/src/templates/tsconfig.default.js +1 -1
  67. package/dist/packages/tsconfig/src/templates.d.ts +1 -1
  68. package/dist/packages/vite/src/index.d.ts +2 -2
  69. package/dist/packages/vite/src/resolve.d.ts +8 -3
  70. package/dist/packages/vite/src/resolve.js +1 -1
  71. package/dist/packages/vite/src/sync.js +1 -1
  72. package/dist/project.d.ts +2 -1
  73. package/dist/project.js +1 -1
  74. package/dist/shared.d.ts +8 -6
  75. package/dist/shared.js +1 -1
  76. package/dist/sync.js +1 -1
  77. package/dist/vite.d.ts +2 -2
  78. package/package.json +16 -14
  79. package/scripts/bootstrap.mjs +55 -0
@@ -1,7 +1,7 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
- import { Replacements } from "../../shared/src/template.js";
4
3
  import { WorkflowConfig, WorkflowSetting, WorkflowStep } from "../../shared/src/config-types.js";
4
+ import { Replacements } from "../../shared/src/template.js";
5
5
  import "../../shared/src/index.js";
6
6
  //#region packages/changelog/src/workflows.d.ts
7
7
  export interface WorkflowJob {
@@ -48,6 +48,10 @@ export interface RenderWorkflowOptions {
48
48
  * `undefined` when the workflow is disabled.
49
49
  */
50
50
  export declare function renderWorkflow(id: WorkflowId, options: RenderWorkflowOptions): string | undefined;
51
- /** Render every workflow, keyed by file name (disabled ones are omitted). */
51
+ /**
52
+ * Render every workflow, keyed by file name (disabled ones are omitted). A raw
53
+ * string setting is used verbatim as the workflow content (no default merge and
54
+ * no token replacement).
55
+ */
52
56
  export declare function renderWorkflows(tokens: Replacements, workflows?: Partial<Record<WorkflowId, WorkflowSetting>>): Record<string, string>;
53
57
  //#endregion
@@ -1,5 +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(`
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:`main`,tooling:`dbx`,commitlintConfig:`commitlint.config.mjs`},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:typeof e==`string`?e.trim().length>0: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" --config ${e.commitlintConfig}`},{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
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 -u -- "*package.json" "*CHANGELOG.md"`,`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:`Toolchain 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};
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"`,`last_tag="$(git describe --tags --abbrev=0 2>/dev/null || true)"`,`if [ -n "$last_tag" ]; then`,' last_version="${last_tag#v}"',` notes="$(awk -v v="$last_version" '/^## / { if ($2 == v) exit; started = 1 } started { print }' CHANGELOG.md 2>/dev/null || true)"`,`else`,` notes="$(cat CHANGELOG.md 2>/dev/null || true)"`,`fi`,`[ -n "$notes" ] || notes="Release $version"`,`gh pr create --base ${n} --head "$branch" --title "release: $version" --body "$notes"`].join(`
4
+ `)}]}}},sync:{name:`Toolchain sync`,on:{push:{branches:[.../* @__PURE__ */ new Set([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;if(typeof o==`string`){n[r[a]]=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};
@@ -9,7 +9,13 @@ import __tsdown_shims_url from 'node:url';
9
9
  * the exception, since it holds no absolute paths and is useful to track. Only
10
10
  * an existing `.gitignore` is edited; a repo without one is left alone.
11
11
  */
12
- /** The block appended to a consumer's `.gitignore`. */
12
+ /**
13
+ * The block appended to a consumer's `.gitignore`.
14
+ *
15
+ * The leading globstar covers a nested project's `.dbx/` too (a monorepo
16
+ * workspace with its own `dbx.config.*` has its own manifest), while still
17
+ * tracking the manifest at any depth.
18
+ */
13
19
  export declare const DBX_GITIGNORE_BLOCK: string;
14
20
  /**
15
21
  * Append the `.dbx` ignore block to `<cwd>/.gitignore` when the file exists and
@@ -1,4 +1,4 @@
1
- import{default as e}from"node:path";import"node:url";import.meta.url;import t from"node:fs";const n=[`# @deltabox/toolchain (generated state; keep only the manifest)`,`.dbx/*`,`!.dbx/toolchain`,`.dbx/toolchain/*`,`!.dbx/toolchain/manifest.json`].join(`
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import t from"node:fs";const n=[`# @deltabox/toolchain (generated state; keep only the manifests)`,`**/.dbx/*`,`!**/.dbx/toolchain`,`**/.dbx/toolchain/*`,`!**/.dbx/toolchain/manifest.json`].join(`
2
2
  `);function r(r){let i=e.join(r,`.gitignore`),a;try{a=t.readFileSync(i,`utf-8`)}catch{return!1}if(a.includes(`.dbx`))return!1;let o=a.includes(`\r
3
3
  `)?`\r
4
4
  `:`
@@ -1 +1 @@
1
- import{default as e}from"node:path";import"node:url";import.meta.url;import{readJsonAt as t,toJson as n}from"../../shared/src/fs-utils.js";import"../../shared/src/index.js";import{findConfigFile as r}from"./loader.js";import i from"node:fs";const a=/* @__PURE__ */ new Set([`node_modules`,`dist`,`build`,`out`,`coverage`,`tmp`,`temp`,`vendor`,`jspm_packages`,`web_modules`]);function o(e){return e.startsWith(`.`)||a.has(e)}function s(t){try{return i.readdirSync(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&!o(e.name)).map(n=>e.join(t,n.name))}catch{return[]}}function c(t,n){return e.relative(t,n).replace(/\\/g,`/`)||`.`}function l(t){let n=n=>i.existsSync(e.join(t,n));if(n(`yarn.lock`))return`yarn`;if(n(`pnpm-lock.yaml`))return`pnpm`;if(n(`package-lock.json`))return`npm`;if(n(`bun.lock`)||n(`bun.lockb`))return`bun`}const u=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`];function d(e,n={}){let i=n.maxDepth??5,a=/* @__PURE__ */ new Map,o=/* @__PURE__ */ new Map,d=(n,l)=>{let u=t(n,`package.json`),f=r(n);if(u||f){let t={...u?.name?{name:u.name}:{},dir:c(e,n),hasConfig:!!f,...f?{config:c(e,f)}:{},dependencies:[]};a.set(n,t),u?.name&&o.set(u.name,n)}if(!(l>=i))for(let e of s(n))d(e,l+1)};d(e,0);for(let[e,n]of a){let r=t(e,`package.json`);if(!r)continue;let i=/* @__PURE__ */ new Set;for(let t of u){let n=r[t];if(n&&typeof n==`object`)for(let t of Object.keys(n)){let n=o.get(t);n&&n!==e&&i.add(t)}}n.dependencies=[...i].sort()}let p=[...a.values()].sort((e,t)=>e.dir.localeCompare(t.dir)),m=p.filter(e=>e.hasConfig);return{root:e,packageManager:l(e),generatedAt:(/* @__PURE__ */ new Date()).toISOString(),projects:p,dbxProjects:m,order:f(m)}}function f(e){let t=/* @__PURE__ */ new Map;for(let n of e)n.name&&t.set(n.name,n.dir);let n=new Map(e.map(e=>[e.dir,e])),r=/* @__PURE__ */ new Set,i=/* @__PURE__ */ new Set,a=[],o=e=>{if(r.has(e)||i.has(e))return;i.add(e);let s=n.get(e);for(let e of s?.dependencies??[]){let r=t.get(e);r&&n.has(r)&&o(r)}i.delete(e),r.add(e),a.push(e)};for(let t of e)o(t.dir);return a}function p(t){return e.join(t,`.dbx`,`toolchain`,`projects.json`)}function m(t,r){let a=p(t);return i.mkdirSync(e.dirname(a),{recursive:!0}),i.writeFileSync(a,n(r??d(t)),`utf-8`),a}function h(e){try{return JSON.parse(i.readFileSync(p(e),`utf-8`))}catch{return}}export{a as IGNORED_DIRS,d as buildProjectGraph,l as detectPackageManager,f as orderProjects,p as projectGraphPath,h as readProjectGraph,m as writeProjectGraph};
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{readJsonAt as t,toJson as n}from"../../shared/src/fs-utils.js";import"../../shared/src/index.js";import{findConfigFile as r}from"./loader.js";import i from"node:fs";const a=/* @__PURE__ */ new Set([`node_modules`,`dist`,`build`,`out`,`coverage`,`tmp`,`temp`,`vendor`,`jspm_packages`,`web_modules`]);function o(e){return e.startsWith(`.`)||a.has(e)}function s(t){try{return i.readdirSync(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&!e.isSymbolicLink()&&!o(e.name)).map(n=>e.join(t,n.name))}catch{return[]}}function c(t,n){return e.relative(t,n).replace(/\\/g,`/`)||`.`}function l(t){let n=n=>i.existsSync(e.join(t,n));if(n(`yarn.lock`))return`yarn`;if(n(`pnpm-lock.yaml`))return`pnpm`;if(n(`package-lock.json`))return`npm`;if(n(`bun.lock`)||n(`bun.lockb`))return`bun`}const u=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`];function d(e,n={}){let i=n.maxDepth??5,a=/* @__PURE__ */ new Map,o=/* @__PURE__ */ new Map,d=(n,l)=>{let u=t(n,`package.json`),f=r(n);if(u||f){let t={...u?.name?{name:u.name}:{},dir:c(e,n),hasConfig:!!f,...f?{config:c(e,f)}:{},dependencies:[]};a.set(n,t),u?.name&&o.set(u.name,n)}if(!(l>=i))for(let e of s(n))d(e,l+1)};d(e,0);for(let[e,n]of a){let r=t(e,`package.json`);if(!r)continue;let i=/* @__PURE__ */ new Set;for(let t of u){let n=r[t];if(n&&typeof n==`object`)for(let t of Object.keys(n)){let n=o.get(t);n&&n!==e&&i.add(t)}}n.dependencies=[...i].sort()}let p=[...a.values()].sort((e,t)=>e.dir.localeCompare(t.dir)),m=p.filter(e=>e.hasConfig);return{root:e,packageManager:l(e),generatedAt:(/* @__PURE__ */ new Date()).toISOString(),projects:p,dbxProjects:m,order:f(m)}}function f(e){let t=/* @__PURE__ */ new Map;for(let n of e)n.name&&t.set(n.name,n.dir);let n=new Map(e.map(e=>[e.dir,e])),r=/* @__PURE__ */ new Set,i=/* @__PURE__ */ new Set,a=[],o=e=>{if(r.has(e)||i.has(e))return;i.add(e);let s=n.get(e);for(let e of s?.dependencies??[]){let r=t.get(e);r&&n.has(r)&&o(r)}i.delete(e),r.add(e),a.push(e)};for(let t of e)o(t.dir);return a}function p(t){return e.join(t,`.dbx`,`toolchain`,`projects.json`)}function m(t,r){let a=p(t);return i.mkdirSync(e.dirname(a),{recursive:!0}),i.writeFileSync(a,n(r??d(t)),`utf-8`),a}function h(e){try{return JSON.parse(i.readFileSync(p(e),`utf-8`))}catch{return}}export{a as IGNORED_DIRS,d as buildProjectGraph,l as detectPackageManager,f as orderProjects,p as projectGraphPath,h as readProjectGraph,m as writeProjectGraph};
@@ -2,9 +2,9 @@ import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { DBX_GITIGNORE_BLOCK, ensureDbxGitignore } from "./gitignore.js";
4
4
  import { BuildProjectGraphOptions, IGNORED_DIRS, PackageManager, ProjectGraph, ProjectNode, buildProjectGraph, detectPackageManager, orderProjects, projectGraphPath, readProjectGraph, writeProjectGraph } from "./graph.js";
5
- import { LoadedConfig, findConfigFile, loadToolchainConfig } from "./loader.js";
5
+ import { LoadedConfig, findConfigFile, findParentConfigFile, loadToolchainConfig, mergeToolchainConfig } from "./loader.js";
6
6
  import { MANIFEST_DIR, MANIFEST_FILE, Manifest, readManifest, writeManifest } from "./manifest.js";
7
- import { detectProjectType, resolveProjectType } from "./project-type.js";
7
+ import { TsconfigFileNames, detectProjectType, resolveProjectType } from "./project-type.js";
8
8
  import { providerRegistryPath, readProviderRegistry, writeProviderRegistry } from "./provider-registry.js";
9
9
  import { SelectProjectsOptions, SelectedProject, selectProjects } from "./select.js";
10
10
  import { ResetProjectsOptions, ResetProjectsResult, ResetSelectors, ResetToolchainOptions, ResetToolchainResult, resetProjects, resetToolchain } from "./reset.js";
@@ -12,7 +12,7 @@ import { RunSyncOptions, SyncResult, runSync } from "./sync.js";
12
12
  import { VscodeSyncOptions, vscodeSyncTask } from "./vscode.js";
13
13
  import { RunWatchOptions, runWatch } from "./watch.js";
14
14
  declare namespace index_d_exports {
15
- export { BuildProjectGraphOptions, DBX_GITIGNORE_BLOCK, IGNORED_DIRS, LoadedConfig, MANIFEST_DIR, MANIFEST_FILE, Manifest, PackageManager, ProjectGraph, ProjectNode, ResetProjectsOptions, ResetProjectsResult, ResetSelectors, ResetToolchainOptions, ResetToolchainResult, RunSyncOptions, RunWatchOptions, SelectProjectsOptions, SelectedProject, SyncResult, VscodeSyncOptions, buildProjectGraph, detectPackageManager, detectProjectType, ensureDbxGitignore, findConfigFile, loadToolchainConfig, orderProjects, projectGraphPath, providerRegistryPath, readManifest, readProjectGraph, readProviderRegistry, resetProjects, resetToolchain, resolveProjectType, runSync, runWatch, selectProjects, vscodeSyncTask, writeManifest, writeProjectGraph, writeProviderRegistry };
15
+ export { BuildProjectGraphOptions, DBX_GITIGNORE_BLOCK, IGNORED_DIRS, LoadedConfig, MANIFEST_DIR, MANIFEST_FILE, Manifest, PackageManager, ProjectGraph, ProjectNode, ResetProjectsOptions, ResetProjectsResult, ResetSelectors, ResetToolchainOptions, ResetToolchainResult, RunSyncOptions, RunWatchOptions, SelectProjectsOptions, SelectedProject, SyncResult, TsconfigFileNames, VscodeSyncOptions, buildProjectGraph, detectPackageManager, detectProjectType, ensureDbxGitignore, findConfigFile, findParentConfigFile, loadToolchainConfig, mergeToolchainConfig, orderProjects, projectGraphPath, providerRegistryPath, readManifest, readProjectGraph, readProviderRegistry, resetProjects, resetToolchain, resolveProjectType, runSync, runWatch, selectProjects, vscodeSyncTask, writeManifest, writeProjectGraph, writeProviderRegistry };
16
16
  }
17
17
  //#endregion
18
- export { BuildProjectGraphOptions, DBX_GITIGNORE_BLOCK, IGNORED_DIRS, LoadedConfig, MANIFEST_DIR, MANIFEST_FILE, Manifest, PackageManager, ProjectGraph, ProjectNode, ResetProjectsOptions, ResetProjectsResult, ResetSelectors, ResetToolchainOptions, ResetToolchainResult, RunSyncOptions, RunWatchOptions, SelectProjectsOptions, SelectedProject, SyncResult, VscodeSyncOptions, buildProjectGraph, detectPackageManager, detectProjectType, ensureDbxGitignore, findConfigFile, index_d_exports, loadToolchainConfig, orderProjects, projectGraphPath, providerRegistryPath, readManifest, readProjectGraph, readProviderRegistry, resetProjects, resetToolchain, resolveProjectType, runSync, runWatch, selectProjects, vscodeSyncTask, writeManifest, writeProjectGraph, writeProviderRegistry };
18
+ export { BuildProjectGraphOptions, DBX_GITIGNORE_BLOCK, IGNORED_DIRS, LoadedConfig, MANIFEST_DIR, MANIFEST_FILE, Manifest, PackageManager, ProjectGraph, ProjectNode, ResetProjectsOptions, ResetProjectsResult, ResetSelectors, ResetToolchainOptions, ResetToolchainResult, RunSyncOptions, RunWatchOptions, SelectProjectsOptions, SelectedProject, SyncResult, TsconfigFileNames, VscodeSyncOptions, buildProjectGraph, detectPackageManager, detectProjectType, ensureDbxGitignore, findConfigFile, findParentConfigFile, index_d_exports, loadToolchainConfig, mergeToolchainConfig, orderProjects, projectGraphPath, providerRegistryPath, readManifest, readProjectGraph, readProviderRegistry, resetProjects, resetToolchain, resolveProjectType, runSync, runWatch, selectProjects, vscodeSyncTask, writeManifest, writeProjectGraph, writeProviderRegistry };
@@ -1 +1 @@
1
- import"node:path";import"node:url";import.meta.url;import{__exportAll as e}from"../../../_virtual/_rolldown/runtime.js";import{DBX_GITIGNORE_BLOCK as t,ensureDbxGitignore as n}from"./gitignore.js";import{detectProjectType as r,resolveProjectType as i}from"./project-type.js";import{findConfigFile as a,loadToolchainConfig as o}from"./loader.js";import{IGNORED_DIRS as s,buildProjectGraph as c,detectPackageManager as l,orderProjects as u,projectGraphPath as d,readProjectGraph as f,writeProjectGraph as p}from"./graph.js";import{MANIFEST_DIR as m,MANIFEST_FILE as h,readManifest as g,writeManifest as _}from"./manifest.js";import{providerRegistryPath as v,readProviderRegistry as y,writeProviderRegistry as b}from"./provider-registry.js";import{selectProjects as x}from"./select.js";import{resetProjects as S,resetToolchain as C}from"./reset.js";import{runSync as w}from"./sync.js";import{vscodeSyncTask as T}from"./vscode.js";import{runWatch as E}from"./watch.js";var D=/* @__PURE__ */ e({DBX_GITIGNORE_BLOCK:()=>t,IGNORED_DIRS:()=>s,MANIFEST_DIR:()=>m,MANIFEST_FILE:()=>h,buildProjectGraph:()=>c,detectPackageManager:()=>l,detectProjectType:()=>r,ensureDbxGitignore:()=>n,findConfigFile:()=>a,loadToolchainConfig:()=>o,orderProjects:()=>u,projectGraphPath:()=>d,providerRegistryPath:()=>v,readManifest:()=>g,readProjectGraph:()=>f,readProviderRegistry:()=>y,resetProjects:()=>S,resetToolchain:()=>C,resolveProjectType:()=>i,runSync:()=>w,runWatch:()=>E,selectProjects:()=>x,vscodeSyncTask:()=>T,writeManifest:()=>_,writeProjectGraph:()=>p,writeProviderRegistry:()=>b});export{t as DBX_GITIGNORE_BLOCK,s as IGNORED_DIRS,m as MANIFEST_DIR,h as MANIFEST_FILE,c as buildProjectGraph,l as detectPackageManager,r as detectProjectType,n as ensureDbxGitignore,a as findConfigFile,o as loadToolchainConfig,u as orderProjects,d as projectGraphPath,v as providerRegistryPath,g as readManifest,f as readProjectGraph,y as readProviderRegistry,S as resetProjects,C as resetToolchain,i as resolveProjectType,w as runSync,E as runWatch,x as selectProjects,D as src_exports,T as vscodeSyncTask,_ as writeManifest,p as writeProjectGraph,b as writeProviderRegistry};
1
+ import"node:path";import"node:url";import.meta.url;import{__exportAll as e}from"../../../_virtual/_rolldown/runtime.js";import{DBX_GITIGNORE_BLOCK as t,ensureDbxGitignore as n}from"./gitignore.js";import{detectProjectType as r,resolveProjectType as i}from"./project-type.js";import{findConfigFile as a,findParentConfigFile as o,loadToolchainConfig as s,mergeToolchainConfig as c}from"./loader.js";import{IGNORED_DIRS as l,buildProjectGraph as u,detectPackageManager as d,orderProjects as f,projectGraphPath as p,readProjectGraph as m,writeProjectGraph as h}from"./graph.js";import{MANIFEST_DIR as g,MANIFEST_FILE as _,readManifest as v,writeManifest as y}from"./manifest.js";import{providerRegistryPath as b,readProviderRegistry as x,writeProviderRegistry as S}from"./provider-registry.js";import{selectProjects as C}from"./select.js";import{resetProjects as w,resetToolchain as T}from"./reset.js";import{runSync as E}from"./sync.js";import{vscodeSyncTask as D}from"./vscode.js";import{runWatch as O}from"./watch.js";var k=/* @__PURE__ */ e({DBX_GITIGNORE_BLOCK:()=>t,IGNORED_DIRS:()=>l,MANIFEST_DIR:()=>g,MANIFEST_FILE:()=>_,buildProjectGraph:()=>u,detectPackageManager:()=>d,detectProjectType:()=>r,ensureDbxGitignore:()=>n,findConfigFile:()=>a,findParentConfigFile:()=>o,loadToolchainConfig:()=>s,mergeToolchainConfig:()=>c,orderProjects:()=>f,projectGraphPath:()=>p,providerRegistryPath:()=>b,readManifest:()=>v,readProjectGraph:()=>m,readProviderRegistry:()=>x,resetProjects:()=>w,resetToolchain:()=>T,resolveProjectType:()=>i,runSync:()=>E,runWatch:()=>O,selectProjects:()=>C,vscodeSyncTask:()=>D,writeManifest:()=>y,writeProjectGraph:()=>h,writeProviderRegistry:()=>S});export{t as DBX_GITIGNORE_BLOCK,l as IGNORED_DIRS,g as MANIFEST_DIR,_ as MANIFEST_FILE,u as buildProjectGraph,d as detectPackageManager,r as detectProjectType,n as ensureDbxGitignore,a as findConfigFile,o as findParentConfigFile,s as loadToolchainConfig,c as mergeToolchainConfig,f as orderProjects,p as projectGraphPath,b as providerRegistryPath,v as readManifest,m as readProjectGraph,x as readProviderRegistry,w as resetProjects,T as resetToolchain,i as resolveProjectType,E as runSync,O as runWatch,C as selectProjects,k as src_exports,D as vscodeSyncTask,y as writeManifest,h as writeProjectGraph,S as writeProviderRegistry};
@@ -1,7 +1,7 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
- import { Replacements } from "../../shared/src/template.js";
4
3
  import { ProjectType } from "../../shared/src/config-types.js";
4
+ import { Replacements } from "../../shared/src/template.js";
5
5
  import { ToolchainConfig } from "../../shared/src/toolchain.js";
6
6
  import "../../shared/src/index.js";
7
7
  //#region packages/core/src/loader.d.ts
@@ -10,18 +10,44 @@ export interface LoadedConfig {
10
10
  config: ToolchainConfig;
11
11
  /** The config file that was loaded (undefined when none was found). */
12
12
  path?: string;
13
+ /** The inherited ancestor config, when the loaded config overrides one. */
14
+ parentPath?: string;
13
15
  tokens: Replacements;
14
16
  /** The resolved project kind. */
15
17
  projectType: ProjectType;
16
18
  }
17
19
  /** Find the first `dbx.config.*` file at `cwd`, if any. */
18
20
  export declare function findConfigFile(cwd?: string): string | undefined;
21
+ /**
22
+ * Find the nearest ancestor `dbx.config.*` above `cwd` (never `cwd` itself).
23
+ * The walk stops at a repository boundary (a `.git` directory) or the
24
+ * filesystem root, so a nested project cannot inherit a config from outside its
25
+ * repository.
26
+ */
27
+ export declare function findParentConfigFile(cwd?: string): string | undefined;
28
+ /**
29
+ * Merge an ancestor config under a project's own config. Nested objects are
30
+ * merged, while leaves (booleans, strings, numbers, arrays) in the child
31
+ * **replace** the ancestor's value — so a non-root `dbx.config` can override
32
+ * individual options of the root config (and keep the rest).
33
+ *
34
+ * `project` is inherited **except the identity fields** (`name`, `scope`,
35
+ * `description`, `type`): a workspace keeps its own name/description (or falls
36
+ * back to its `package.json`), and is still detected from its own files — so a
37
+ * root `project` never renames a workspace. The shared fields (author, license,
38
+ * homepage, `repo`, `packageManager`, ...) flow down. `project.inherit: false`
39
+ * disables project inheritance entirely. `hooks` are **not** inherited either —
40
+ * a parent's hooks are code and must not run for a nested project's sync.
41
+ */
42
+ export declare function mergeToolchainConfig(parent: ToolchainConfig, child: ToolchainConfig): ToolchainConfig;
19
43
  /**
20
44
  * Load the tooling config for a project. A `dbx.config.*` file exports
21
45
  * `{ toolchain: { ...sections } }`; the `toolchain` value is unwrapped here so
22
- * the rest of the toolchain works with flat sections. When no config file (or no
23
- * `toolchain` key) exists an empty config is returned (so every task falls back
24
- * to its defaults).
46
+ * the rest of the toolchain works with flat sections. When the project is
47
+ * nested, the nearest ancestor `dbx.config.*` is loaded first and the project's
48
+ * own config is merged on top (see {@link mergeToolchainConfig}). When no config
49
+ * file (or no `toolchain` key) exists an empty config is returned (so every task
50
+ * falls back to its defaults).
25
51
  */
26
52
  export declare function loadToolchainConfig(cwd?: string): Promise<LoadedConfig>;
27
53
  //#endregion
@@ -1 +1 @@
1
- import{default as e}from"node:path";import{pathToFileURL as t}from"node:url";import.meta.url;import{CONFIG_FILE_NAMES as n,resolveTokens as r}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import{resolveProjectType as i}from"./project-type.js";import a from"node:fs";function o(t=process.cwd()){for(let r of n){let n=e.resolve(t,r);if(a.existsSync(n))return n}}async function s(e){if(e.endsWith(`.json`))return JSON.parse(a.readFileSync(e,`utf-8`).replace(/^\uFEFF/,``));let n=t(e).href;try{let e=await import(n);return e.default??e}catch(e){try{let{tsImport:e}=await import(`/home/runner/work/toolchain/toolchain/node_modules/tsx/dist/esm/api/index.mjs`),t=await e(n,import.meta.url);return t.default??t}catch{throw e}}}async function c(e=process.cwd()){let t=o(e),n={};if(t){let e=await s(t),r=e&&typeof e==`object`?e.toolchain:void 0;r&&typeof r==`object`&&(n=r)}let a=r(n);return await n.hooks?.afterLoad?.({cwd:e,config:n,tokens:a,...t?{path:t}:{}}),{config:n,...t?{path:t}:{},tokens:a,projectType:i(e,n)}}export{o as findConfigFile,c as loadToolchainConfig};
1
+ import{default as e}from"node:path";import{pathToFileURL as t}from"node:url";import.meta.url;import{deepMerge as n}from"../../shared/src/object-utils.js";import{readJsonAt as r}from"../../shared/src/fs-utils.js";import{projectFromPackageJson as i}from"../../shared/src/project.js";import{CONFIG_FILE_NAMES as a,resolveTokens as o}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import{resolveProjectType as s}from"./project-type.js";import c from"node:fs";function l(t=process.cwd()){for(let n of a){let r=e.resolve(t,n);if(c.existsSync(r))return r}}function u(t=process.cwd()){let n=e.resolve(t);if(c.existsSync(e.join(n,`.git`)))return;let r=e.dirname(n);for(;;){let t=l(r);if(t)return t;if(c.existsSync(e.join(r,`.git`)))return;let n=e.dirname(r);if(n===r)return;r=n}}async function d(e){if(e.endsWith(`.json`))return JSON.parse(c.readFileSync(e,`utf-8`).replace(/^\uFEFF/,``));let n=t(e).href;try{let e=await import(n);return e.default??e}catch(e){try{let{tsImport:e}=await import(`/home/runner/work/toolchain/toolchain/node_modules/tsx/dist/esm/api/index.mjs`),t=await e(n,import.meta.url);return t.default??t}catch{throw e}}}async function f(e){let t=await d(e),n=t&&typeof t==`object`?t.toolchain:void 0;return n&&typeof n==`object`?n:{}}const p=/* @__PURE__ */ new Set([`name`,`scope`,`description`,`type`]);function m(e,t){let{hooks:r,project:i,...a}=e,o=a;if(t.project?.inherit!==!1&&i){let e=Object.fromEntries(Object.entries(i).filter(([e])=>!p.has(e)));Object.keys(e).length>0&&(o={...a,project:e})}return n(o,t)}async function h(e=process.cwd()){let t=l(e),n=u(e),a={};if(n&&(a=await f(n)),t){let e=await f(t);a=n?m(a,e):e}let c=r(e,`package.json`),d={...c?i(c):void 0,...a.project??void 0},p=o({...a,project:d});return await a.hooks?.afterLoad?.({cwd:e,config:a,tokens:p,...t?{path:t}:{}}),{config:a,...t?{path:t}:{},...n?{parentPath:n}:{},tokens:p,projectType:s(e,a)}}export{l as findConfigFile,u as findParentConfigFile,h as loadToolchainConfig,m as mergeToolchainConfig};
@@ -4,11 +4,18 @@ import { ProjectType } from "../../shared/src/config-types.js";
4
4
  import { ToolchainConfig } from "../../shared/src/toolchain.js";
5
5
  import "../../shared/src/index.js";
6
6
  //#region packages/core/src/project-type.d.ts
7
+ /** The tsconfig file names a project can be detected from. */
8
+ export interface TsconfigFileNames {
9
+ /** The workspaces tsconfig file name (default `tsconfig.workspaces.json`). */
10
+ rootFile?: string;
11
+ /** The workspace default tsconfig file name (default `tsconfig.default.json`). */
12
+ defaultFile?: string;
13
+ }
7
14
  /**
8
15
  * Resolve the project kind: an explicit `project.type` in the config wins,
9
16
  * otherwise it is detected from the filesystem.
10
17
  */
11
18
  export declare function resolveProjectType(cwd: string, config?: ToolchainConfig): ProjectType;
12
19
  /** Detect the project kind from `cwd` (workspaces / monorepo file heuristics). */
13
- export declare function detectProjectType(cwd: string): ProjectType;
20
+ export declare function detectProjectType(cwd: string, files?: TsconfigFileNames): ProjectType;
14
21
  //#endregion
@@ -1 +1 @@
1
- import{default as e}from"node:path";import"node:url";import.meta.url;import{readJsonAt as t}from"../../shared/src/fs-utils.js";import"../../shared/src/index.js";import n from"node:fs";function r(e,t={}){return t.project?.type?t.project.type:i(e)}function i(r){let i=t(r,`package.json`)?.workspaces;return(Array.isArray(i)?i.length>0:i&&Array.isArray(i.packages)&&i.packages.length>0)||n.existsSync(e.join(r,`tsconfig.monorepo.json`))?`monorepo-root`:n.existsSync(e.join(r,`tsconfig.default.json`))?`monorepo-workspace`:`project`}export{i as detectProjectType,r as resolveProjectType};
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{readJsonAt as t}from"../../shared/src/fs-utils.js";import{sectionConfig as n}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import r from"node:fs";function i(e,t={}){if(t.project?.type)return t.project.type;let r=n(t.tsconfig)??{};return a(e,{...r.rootFile===void 0?{}:{rootFile:r.rootFile},...r.defaultFile===void 0?{}:{defaultFile:r.defaultFile}})}function a(n,i={}){let a=i.rootFile??`tsconfig.workspaces.json`,o=i.defaultFile??`tsconfig.default.json`,s=t(n,`package.json`)?.workspaces;return(Array.isArray(s)?s.length>0:s&&Array.isArray(s.packages)&&s.packages.length>0)||r.existsSync(e.join(n,a))?`monorepo-root`:r.existsSync(e.join(n,o))?`monorepo-workspace`:`project`}export{a as detectProjectType,i as resolveProjectType};
@@ -1,7 +1,7 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
- import { Replacements } from "../../shared/src/template.js";
4
3
  import { ProjectType } from "../../shared/src/config-types.js";
4
+ import { Replacements } from "../../shared/src/template.js";
5
5
  import { SyncTask, ToolchainConfig } from "../../shared/src/toolchain.js";
6
6
  import "../../shared/src/index.js";
7
7
  //#region packages/core/src/sync.d.ts
@@ -1 +1 @@
1
- import{default 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{ensureDbxGitignore as n}from"./gitignore.js";import{resolveProjectType as r}from"./project-type.js";import{readManifest as i,writeManifest as a}from"./manifest.js";import o from"node:fs";function s(e){return e.replace(/\\/g,`/`)}async function c(c){let{tasks:l,cwd:u,config:d,tokens:f}=c,p=c.quiet?()=>{}:c.log??(e=>t.info(e)),m=c.projectType??r(u,d),h={cwd:u,projectType:m,config:d,tokens:f,log:p},g=d.hooks??{};await g.beforeSync?.(h);let _=l.filter(e=>(!e.projectTypes||e.projectTypes.includes(m))&&(!e.enabled||e.enabled(d)));p(`running ${_.length} task(s)${c.check?` (check)`:``} [${m}]`);let v=[];for(let e of _){p(` - ${e.name}`),await g.beforeTask?.({task:e,ctx:h});let t=await e.run(h),n=Array.isArray(t)?t:void 0;n&&v.push(...n),await g.afterTask?.({task:e,ctx:h,...n?{files:n}:{}})}let y=new Map(v.map(e=>[s(e.path),e.content])),b=i(u),x=/* @__PURE__ */ new Set;for(let e of _)for(let t of e.keep??[])x.add(t);let S=e=>{for(let t of x)if(e===t||e.endsWith(`/${t}`)||e.endsWith(t))return!0;return!1},C=[];for(let[t,n]of y){let r=e.resolve(u,t);(o.existsSync(r)?o.readFileSync(r,`utf-8`):void 0)!==n&&C.push(t)}let w=b.files.filter(t=>!y.has(t)&&!S(t)&&o.existsSync(e.resolve(u,t))),T=C.length===0&&w.length===0;if(c.check){if(T)p(`generated files are in sync.`);else{p(`generated files are out of date:`);for(let e of C)p(` M ${e}`);for(let e of w)p(` D ${e}`);p("Run `dbx sync` to regenerate them.")}let e={written:[],changed:C,removed:w,upToDate:T};return await g.afterSync?.({cwd:u,config:d,result:e}),e}let E=[];for(let[t,n]of y){let r=e.resolve(u,t);o.mkdirSync(e.dirname(r),{recursive:!0}),o.writeFileSync(r,n,`utf-8`),E.push(t)}for(let t of w)o.rmSync(e.resolve(u,t),{force:!0});a(u,[...y.keys()]),n(u)&&p(` I .gitignore (added the .dbx ignore block)`),p(`wrote ${E.length}, removed ${w.length} file(s)${C.length?`, updated ${C.length}`:``}.`);let D={written:E,changed:C,removed:w,upToDate:T};return await g.afterSync?.({cwd:u,config:d,result:D}),D}export{c as runSync};
1
+ import{default 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{ensureDbxGitignore as n}from"./gitignore.js";import{resolveProjectType as r}from"./project-type.js";import{readManifest as i,writeManifest as a}from"./manifest.js";import o from"node:fs";function s(e){return e.replace(/\\/g,`/`)}async function c(c){let{tasks:l,cwd:u,config:d,tokens:f}=c,p=c.quiet?()=>{}:c.log??(e=>t.info(e)),m=c.quiet?()=>{}:e=>t.warn(e),h=c.projectType??r(u,d),g={cwd:u,projectType:h,config:d,tokens:f,log:p,warn:m},_=d.hooks??{};await _.beforeSync?.(g);let v=l.filter(e=>(!e.projectTypes||e.projectTypes.includes(h))&&(!e.enabled||e.enabled(d)));p(`running ${v.length} task(s)${c.check?` (check)`:``} [${h}]`);let y=[];for(let e of v){p(` - ${e.name}`),await _.beforeTask?.({task:e,ctx:g});let t=await e.run(g),n=Array.isArray(t)?t:void 0;n&&y.push(...n),await _.afterTask?.({task:e,ctx:g,...n?{files:n}:{}})}let b=new Map(y.map(e=>[s(e.path),e.content])),x=i(u),S=/* @__PURE__ */ new Set;for(let e of v)for(let t of e.keep??[])S.add(t);let C=e=>{for(let t of S)if(e===t||e.endsWith(`/${t}`)||e.endsWith(t))return!0;return!1},w=[];for(let[t,n]of b){let r=e.resolve(u,t);(o.existsSync(r)?o.readFileSync(r,`utf-8`):void 0)!==n&&w.push(t)}let T=x.files.filter(t=>!b.has(t)&&!C(t)&&o.existsSync(e.resolve(u,t))),E=w.length===0&&T.length===0;if(c.check){if(E)p(`generated files are in sync.`);else{p(`generated files are out of date:`);for(let e of w)p(` M ${e}`);for(let e of T)p(` D ${e}`);p("Run `dbx sync` to regenerate them.")}let e={written:[],changed:w,removed:T,upToDate:E};return await _.afterSync?.({cwd:u,config:d,result:e}),e}let D=[];for(let[t,n]of b){let r=e.resolve(u,t);o.mkdirSync(e.dirname(r),{recursive:!0}),o.writeFileSync(r,n,`utf-8`),D.push(t)}for(let t of T)o.rmSync(e.resolve(u,t),{force:!0});a(u,[...b.keys()]),n(u)&&p(` I .gitignore (added the .dbx ignore block)`),p(`wrote ${D.length}, removed ${T.length} file(s)${w.length?`, updated ${w.length}`:``}.`);let O={written:D,changed:w,removed:T,upToDate:E};return await _.afterSync?.({cwd:u,config:d,result:O}),O}export{c as runSync};
@@ -7,6 +7,10 @@ export interface RunWatchOptions extends Omit<RunSyncOptions, 'check'> {
7
7
  configPath?: string;
8
8
  /** Debounce window in ms (default 150). */
9
9
  debounce?: number;
10
+ /** Extra glob(s) excluded from watching (on top of the common ignored paths). */
11
+ exclude?: string | string[];
12
+ /** Respect `.gitignore` files (default true). */
13
+ gitignore?: boolean;
10
14
  }
11
15
  /**
12
16
  * Run one sync, then watch the config file + every task's `watch` globs and
@@ -1 +1 @@
1
- import{default 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{runSync as n}from"./sync.js";import r from"node:fs";import{Glob as i}from"glob";async function a(a){let{cwd:o,tasks:s}=a,c=a.debounce??150,l=a.quiet?()=>{}:a.log??(e=>t.info(e)),u=0,d,f=!1,p=!1,m=async()=>{if(f)p=!0;else{f=!0;try{await n(a)}finally{f=!1,u=Date.now()+Math.max(c*3,300),p&&(p=!1,h())}}},h=()=>{clearTimeout(d),d=setTimeout(m,c)};await m();let g=/* @__PURE__ */ new Set([o]),_=/* @__PURE__ */ new Set;for(let e of s)for(let t of e.watch??[])_.add(t);for(let t of _)try{let n=new i(t,{cwd:o,dot:!0,ignore:[`**/node_modules/**`]}).walkSync();for(let t of n)g.add(e.dirname(e.resolve(o,t)))}catch{}let v=[],y=e=>{Date.now()<u||(a.config?.hooks?.onChange?.(e?{path:e}:{}),h())};if(a.configPath)try{v.push(r.watch(a.configPath,()=>{l(`config changed; re-syncing`),y(a.configPath)}))}catch{}for(let e of g)try{v.push(r.watch(e,{recursive:!0},(e,t)=>y(t??void 0)))}catch{try{v.push(r.watch(e,(e,t)=>y(t??void 0)))}catch{}}l(`watching for changes (Ctrl+C to stop)`),await new Promise(e=>{let t=()=>{d&&clearTimeout(d),d=void 0;for(let e of v)e.close();process.off(`SIGINT`,t),process.off(`SIGTERM`,t),e()};process.on(`SIGINT`,t),process.on(`SIGTERM`,t)})}export{a as runWatch};
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{isIgnoredPath as t,resolveIgnorePatterns as n}from"../../shared/src/ignore.js";import{logger as r}from"../../shared/src/logger.js";import"../../shared/src/index.js";import{runSync as i}from"./sync.js";import a from"node:fs";import{Glob as o}from"glob";async function s(s){let{cwd:c,tasks:l}=s,u=s.debounce??150,d=s.quiet?()=>{}:s.log??(e=>r.info(e)),f=0,p,m=!1,h=!1,g=async()=>{if(m)h=!0;else{m=!0;try{await i(s)}finally{m=!1,f=Date.now()+Math.max(u*3,300),h&&(h=!1,_())}}},_=()=>{clearTimeout(p),p=setTimeout(g,u)};await g();let v=n(c,{...s.exclude===void 0?{}:{exclude:s.exclude},...s.gitignore===void 0?{}:{gitignore:s.gitignore}}),y=/* @__PURE__ */ new Set([c]),b=/* @__PURE__ */ new Set;for(let e of l)for(let t of e.watch??[])b.add(t);for(let n of b)try{let r=new o(n,{cwd:c,dot:!0,ignore:v}).walkSync();for(let n of r){let r=e.resolve(c,n),i=e.relative(c,r).replace(/\\/g,`/`);t(i,v)||y.add(e.dirname(r))}}catch{}let x=[],S=n=>{if(!(Date.now()<f)){if(n){let r=e.relative(c,n).replace(/\\/g,`/`);if(t(r,v))return}s.config?.hooks?.onChange?.(n?{path:n}:{}),_()}};if(s.configPath)try{x.push(a.watch(s.configPath,()=>{d(`config changed; re-syncing`),S(s.configPath)}))}catch{}for(let t of y){let n=n=>S(e.join(t,n??``));try{x.push(a.watch(t,{recursive:!0},(e,t)=>n(t)))}catch{try{x.push(a.watch(t,(e,t)=>n(t)))}catch{}}}d(`watching for changes (Ctrl+C to stop)`),await new Promise(e=>{let t=()=>{p&&clearTimeout(p),p=void 0;for(let e of x)e.close();process.off(`SIGINT`,t),process.off(`SIGTERM`,t),e()};process.on(`SIGINT`,t),process.on(`SIGTERM`,t)})}export{s as runWatch};
@@ -8,6 +8,10 @@ import "../../../shared/src/index.js";
8
8
  * tool (Biome / ESLint / Prettier / Dprint) to Oxc (Oxfmt / Oxlint), or fold a
9
9
  * hand-written `vite.config.*` into `dbx.config.*`. Dry-run by default; pass
10
10
  * `--write` to apply, or `--check` for a CI gate.
11
+ *
12
+ * `--recursive` migrates the discovered projects under the root (not just the
13
+ * root); on an interactive terminal it prompts for which projects (multi-select,
14
+ * with an "All projects" option).
11
15
  */
12
16
  export declare function migrateCommands(): ToolchainCommand[];
13
17
  //#endregion
@@ -1 +1 @@
1
- import{default 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{diffFiles as n,hasPending as r}from"../check.js";import{detectMigrations as i,listMigrations as a,migrations as o}from"../registry.js";function s(){return[{name:`migrate`,description:`Migrate Biome / ESLint / Prettier / Dprint config to Oxc, or fold vite.config.* into dbx.config.`,options:[{flags:`--from <tool>`,description:`Source tool: biome | eslint | prettier | dprint | vite | all.`},{flags:`--to <tool>`,description:`Target tool (default: oxc).`,default:`oxc`},{flags:`--cwd <dir>`,description:`Project root (default: cwd).`},{flags:`--write`,description:`Write the files (default: dry-run).`},{flags:`--dry-run`,description:`Do not write anything (default).`},{flags:`--check`,description:`CI: exit non-zero when the oxc config is stale.`},{flags:`--target <target>`,description:`files (default) | vite.`},{flags:`--online`,description:`Allow network (e.g. @oxlint/migrate).`},{flags:`--json`,description:`Print the result as JSON.`}],run:async(a,s)=>{let c=a.cwd??s.cwd,l=!!a.check,u=!!a.write&&!a.dryRun&&!l,d=!!a.online,f=a.from,p=a.target??`files`,m=!f||f===`all`?i(c):o().filter(e=>e.from===f);if(m.length===0){t.info(f&&f!==`all`?`no "${f}" migration is registered.`:`nothing to migrate (no Biome/ESLint/Prettier/Dprint/vite config detected).`);return}let h=[];for(let e of m)h.push(await e.run({cwd:c,write:u,online:d,target:p}));if(l){let i=h.flatMap(e=>n(e.files??[])),o=i.filter(e=>e.status!==`same`);if(a.json)t.raw(JSON.stringify(h,null,4));else if(o.length){for(let n of o)t.info(`${n.status} ${e.relative(c,n.path)||n.path}`);t.info(`${o.length} file(s) out of date — run \`migrate --write\` to apply.`)}else t.info(`up to date.`);r(i)&&(process.exitCode=1)}else if(a.json)t.raw(JSON.stringify(h,null,4));else{for(let e of h){t.info(`${e.from} -> ${e.to} ${u?`wrote`:`would write`}`);for(let n of e.written)t.info(` ${u?`+`:`?`} ${n}`);for(let n of e.notes??[])t.info(` ${n}`);if(e.unmapped?.length){t.info(` unmapped (${e.unmapped.length}):`);for(let n of e.unmapped.slice(0,25))t.info(` - ${n.source}: ${n.reason}`)}}u||t.info(`dry-run — re-run with --write to apply.`)}}},{name:`migrate:list`,description:`List the registered migrations and whether each is detected.`,options:[{flags:`--cwd <dir>`,description:`Project root (default: cwd).`},{flags:`--json`,description:`Print as JSON.`}],run:(e,n)=>{let r=e.cwd??n.cwd,i=a(r);if(e.json)t.raw(JSON.stringify(i,null,4));else for(let e of i)t.info(` ${e.id.padEnd(16)} ${e.from} -> ${e.to} [${e.detected?`detected`:`not found`}]`),t.info(` ${e.description}`)}}]}export{s as migrateCommands};
1
+ import{default 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{loadToolchainConfig as n}from"../../../core/src/loader.js";import{selectProjects as r}from"../../../core/src/select.js";import{runSync as i}from"../../../core/src/sync.js";import"../../../core/src/index.js";import{diffFiles as a,hasPending as o}from"../check.js";import{listMigrations as s,migrations as c}from"../registry.js";import{cancel as l,isCancel as u,multiselect as d}from"@clack/prompts";function f(e){return!!(process.stdin.isTTY&&process.stdout.isTTY)&&e.json!==!0}function p(){l(`Cancelled.`),process.exitCode=1}function m(){return[{name:`migrate`,description:`Migrate Biome / ESLint / Prettier / Dprint config to Oxc, or fold vite.config.* into dbx.config.`,options:[{flags:`--from <tool>`,description:`Source tool: biome | eslint | prettier | dprint | vite | all.`},{flags:`--to <tool>`,description:`Target tool (default: oxc).`,default:`oxc`},{flags:`--cwd <dir>`,description:`Project root (default: cwd).`},{flags:`--recursive`,description:`Also migrate the discovered projects under the root (default: root only).`},{flags:`--write`,description:`Write the files (default: dry-run).`},{flags:`--dry-run`,description:`Do not write anything (default).`},{flags:`--check`,description:`CI: exit non-zero when the oxc config is stale.`},{flags:`--target <target>`,description:`files (default) | vite.`},{flags:`--online`,description:`Allow network (e.g. @oxlint/migrate).`},{flags:`--ignore-vite-config-file`,description:"Do not remove the folded `vite.config.*`."},{flags:`--ignore-managed-files`,description:`Skip the post-migration sync (leave the toolchain-managed files as-is).`},{flags:`--ignore-changelog`,description:`Skip the changelog task in the post-migration sync.`},{flags:`--json`,description:`Print the result as JSON.`}],run:async(s,l)=>{let m=s.cwd??l.cwd,h=!!s.check,g=!!s.write&&!s.dryRun&&!h,_=!!s.online,v=s.from,y=s.target??`files`,b=!!s.recursive,x=e=>c().filter(t=>(!v||v===`all`||t.from===v)&&t.detect(e)),S=[m];if(b){let n=r({root:m}).filter(e=>x(e.dir).length>0);if(n.length===0){t.info(`nothing to migrate under ${m}.`);return}let i=n;if(f(s)){let t=await d({message:`Which projects should I migrate?`,required:!0,options:[{value:`__all__`,label:`All projects`},...n.map(t=>({value:t.dir,label:t.rel===`.`?e.basename(m):t.rel,...t.name?{hint:t.name}:{}}))]});if(u(t)){p();return}let r=t;i=r.includes(`__all__`)?n:n.filter(e=>r.includes(e.dir))}S=i.map(e=>e.dir)}let C=[];for(let e of S)for(let t of x(e))C.push({dir:e,result:await t.run({cwd:e,write:g,online:_,target:y,ignoreViteConfigFile:!!s.ignoreViteConfigFile,ignoreManagedFiles:!!s.ignoreManagedFiles,ignoreChangelog:!!s.ignoreChangelog})});if(C.length===0){t.info(v&&v!==`all`?`no "${v}" migration is registered.`:`nothing to migrate (no Biome/ESLint/Prettier/Dprint/vite config detected).`);return}let w=t=>b?`${e.relative(m,t)||`.`}: `:``,T=[...new Set(C.filter(({result:e})=>e.written.length>0||(e.removed?.length??0)>0).map(({dir:e})=>e))];if(h){let n=C.flatMap(({result:e})=>a(e.files??[])),r=n.filter(e=>e.status!==`same`);if(s.json)t.raw(JSON.stringify(C.map(e=>e.result),null,4));else if(r.length){for(let n of r)t.info(`${n.status} ${e.relative(m,n.path)||n.path}`);t.info(`${r.length} file(s) out of date — run \`migrate --write\` to apply.`)}else t.info(`up to date.`);o(n)&&(process.exitCode=1);return}let E=async()=>{if(!g||T.length===0||s.ignoreManagedFiles||!l.syncTasks?.length)return;let e=s.ignoreChangelog?l.syncTasks.filter(e=>e.name!==`changelog`):l.syncTasks;for(let r of T){let a=await n(r);s.json||t.info(`${w(r)}regenerating managed files.`),await i({tasks:e,cwd:r,projectType:a.projectType,config:a.config,tokens:a.tokens,quiet:s.json===!0})}};if(s.json)await E(),t.raw(JSON.stringify(C.map(e=>e.result),null,4));else{for(let{dir:e,result:n}of C){t.info(`${w(e)}${n.from} -> ${n.to} ${g?`wrote`:`would write`}`);for(let e of n.written)t.info(` ${g?`+`:`?`} ${e}`);for(let e of n.removed??[])t.info(` ${g?`-`:`?`} ${e}`);for(let e of n.notes??[])t.info(` ${e}`);if(n.unmapped?.length){t.info(` unmapped (${n.unmapped.length}):`);for(let e of n.unmapped.slice(0,25))t.info(` - ${e.source}: ${e.reason}`)}}!g&&T.length>0&&!s.ignoreManagedFiles&&t.info(`managed files are regenerated after --write; pass --ignore-managed-files to skip.`),await E(),g||t.info(`dry-run — re-run with --write to apply.`)}}},{name:`migrate:list`,description:`List the registered migrations and whether each is detected.`,options:[{flags:`--cwd <dir>`,description:`Project root (default: cwd).`},{flags:`--json`,description:`Print as JSON.`}],run:(e,n)=>{let r=e.cwd??n.cwd,i=s(r);if(e.json)t.raw(JSON.stringify(i,null,4));else for(let e of i)t.info(` ${e.id.padEnd(16)} ${e.from} -> ${e.to} [${e.detected?`detected`:`not found`}]`),t.info(` ${e.description}`)}}]}export{m as migrateCommands};
@@ -25,6 +25,15 @@ export interface MigrationContext {
25
25
  write?: boolean;
26
26
  /** Allow network (eg. npx-based migrators). Default false. */
27
27
  online?: boolean;
28
+ /**
29
+ * Do not modify or remove the source tool's config file (eg. the folded
30
+ * `vite.config.*`). Default false — the migration cleans it up.
31
+ */
32
+ ignoreViteConfigFile?: boolean;
33
+ /** Do not touch the toolchain's managed/generated files. Default false. */
34
+ ignoreManagedFiles?: boolean;
35
+ /** Do not touch the `CHANGELOG.md`. Default false. */
36
+ ignoreChangelog?: boolean;
28
37
  }
29
38
  /** A field that could not be mapped faithfully. */
30
39
  export interface UnmappedItem {
@@ -46,6 +55,8 @@ export interface MigrationResult {
46
55
  to: MigrateTool;
47
56
  /** Files written, or that would be written (dry-run). */
48
57
  written: string[];
58
+ /** Files removed, or that would be removed (eg. the folded `vite.config.*`). */
59
+ removed?: string[];
49
60
  /** The produced files with content (drives `--check`). */
50
61
  files?: MigrationFile[];
51
62
  /** The oxfmt config produced (present for formatter migrations). */
@@ -2,4 +2,5 @@ import{default as e}from"node:path";import"node:url";import.meta.url;import{CONF
2
2
  `;)t++;return t}if(n===`/`&&r===`*`){for(t+=2;t<e.length&&(e[t]!==`*`||e[t+1]!==`/`);)t++;return t+2}if(n===`"`||n===`'`){let r=n;for(t++;t<e.length&&e[t]!==r;)e[t]===`\\`&&t++,t++;return t+1}return t}function l(e,t){let n=e.lastIndexOf(`
3
3
  `,t-1)+1;return e.slice(n).match(/^[ \t]*/)?.[0]??``}function u(e,t){return e.split(`
4
4
  `).map((e,n)=>n===0?e:`${t}${e}`).join(`
5
- `)}function d(e){let t=e.match(/\bdefineConfig\s*\(/),n=0;if(t&&t.index!==void 0)n=t.index+t[0].length;else{let t=e.match(/export\s+default\s*/);if(!t||t.index===void 0)return;n=t.index+t[0].length}let i=n;for(;i<e.length&&e[i]!==`{`;)i++;if(i>=e.length)return;let a=r(e,i);return a===-1?void 0:[i,a]}function f(e){let t=e.match(/\bdefineConfig\s*\(/),n=-1;if(t&&t.index!==void 0)n=t.index+t[0].length;else{let t=e.match(/export\s+default\s*/);t&&t.index!==void 0&&(n=t.index+t[0].length)}if(n===-1)return{error:"no `defineConfig(...)` call or default-exported object found"};for(;n<e.length&&/\s/.test(e[n]);)n++;if(e[n]!==`{`)return{error:`the config value is not an object literal (it is a variable or an expression)`};let i=r(e,n);return i===-1?{error:`unbalanced braces in the config object`}:{text:e.slice(n,i)}}function p(e){let t=0;for(;t<e.length;){let n=e[t];if(n==="`")return{ok:!1,reason:`template literal`};let r=c(e,t);if(r!==t)t=r;else{if(n===`.`&&e[t+1]===`.`&&e[t+2]===`.`)return{ok:!1,reason:"spread (`...`)"};if(/[A-Za-z_$]/.test(n)){let n=t;for(;n<e.length&&/[\w$]/.test(e[n]);)n++;let r=e.slice(t,n),i=n;for(;i<e.length&&/\s/.test(e[i]);)i++;if(e[i]!==`:`&&![`true`,`false`,`null`,`undefined`].includes(r))return{ok:!1,reason:`non-literal value \`${r}\``};t=n}else t++}}return{ok:!0}}function m(e,t){let r=d(e);if(!r)return{error:`could not locate the config root object`};let[i,a]=r,o=n(e,i,a,`toolchain`);if(!o)return{error:"the config has no `toolchain` object to add `vite` to"};let[s,c]=o,f=n(e,s,c,`vite`);if(f){let[n,r]=f,i=u(t,l(e,n));return{content:`${e.slice(0,n)}${i}${e.slice(r)}`}}let p=`${l(e,s)} `,m=u(t,p);return{content:`${e.slice(0,s+1)}\n${p}vite: ${m},${e.slice(s+1)}`}}const h=`/vite.config.ts`;function g(e){let t=e.indexOf(`{`);if(t===-1)return e;let i=r(e,t);if(i===-1)return e;let a=`'${h}'`,o=n(e,t,i,`fmt`);if(o&&e[o[0]]===`{`&&e[o[1]-1]===`}`){let[t,r]=o,i=n(e,t,r,`ignorePatterns`);if(i){let[t,n]=i;return e.slice(t,n).includes(h)?e:e[t]===`[`?`${e.slice(0,t+1)}${a}, ${e.slice(t+1)}`:`${e.slice(0,t)}[${a}]${e.slice(n)}`}return`${e.slice(0,t+1)} ignorePatterns: [${a}],${e.slice(t+1)}`}return o?`${e.slice(0,o[0])}{ ignorePatterns: [${a}] }${e.slice(o[1])}`:`${e.slice(0,t+1)} fmt: { ignorePatterns: [${a}] },${e.slice(t+1)}`}const _={id:`vite-to-toolchain`,from:`vite`,to:`toolchain`,description:"Fold a hand-written root vite.config.* into dbx.config.* (`toolchain.vite`).",detect:e=>!!o(e),run:async t=>{let n=o(t.cwd);if(!n)throw Error(`vite-to-toolchain: no vite.config.* found.`);let r=i.readFileSync(n,`utf-8`).replace(/^\uFEFF/,``),a=[`Source: ${e.basename(n)}.`],c=[],l=()=>({id:_.id,from:`vite`,to:`toolchain`,written:[],files:[],unmapped:c,notes:a}),u=s(t.cwd);if(!u)return c.push({source:e.basename(n),reason:`no dbx.config.* found to fold into`}),a.push(`Create a dbx.config.* first, then re-run this migration.`),l();if(u.endsWith(`.json`))return c.push({source:e.basename(u),reason:`JSON configs cannot hold the extracted object by text-splice`}),a.push(`Fold into the JSON config by hand.`),l();let d=f(r);if(`error`in d)return c.push({source:e.basename(n),reason:d.error}),a.push(`Left vite.config.* unchanged; fold it by hand.`),l();let v=p(d.text);if(!v.ok)return c.push({source:e.basename(n),reason:`cannot fold faithfully (${v.reason})`}),a.push(`The config references helpers/imports or non-literal expressions; fold it by hand.`),l();let y=m(i.readFileSync(u,`utf-8`).replace(/^\uFEFF/,``),g(d.text));if(`error`in y)return c.push({source:e.basename(u),reason:y.error}),a.push("Left dbx.config.* unchanged; fold `toolchain.vite` in by hand."),l();let b={path:u,content:y.content};return t.write&&i.writeFileSync(u,b.content,`utf-8`),a.push(`Folded into \`toolchain.vite\` (${e.basename(u)}); added \`${h}\` to \`fmt.ignorePatterns\`; run \`dbx sync\` to regenerate vite.config.ts.`),{id:_.id,from:`vite`,to:`toolchain`,written:[u],files:[b],notes:a}}};export{a as VITE_CONFIG_FILES,g as ensureViteFmtIgnore,f as extractViteObject,s as findDbxConfig,o as findViteConfig,m as foldViteIntoConfig,p as scanLiteralObject,_ as viteToToolchain};
5
+ `)}function d(e){let t=e.match(/\bdefineConfig\s*\(/),n=0;if(t&&t.index!==void 0)n=t.index+t[0].length;else{let t=e.match(/export\s+default\s*/);if(!t||t.index===void 0)return;n=t.index+t[0].length}let i=n;for(;i<e.length&&e[i]!==`{`;)i++;if(i>=e.length)return;let a=r(e,i);return a===-1?void 0:[i,a]}function f(e){let t=e.match(/\bdefineConfig\s*\(/),n=-1;if(t&&t.index!==void 0)n=t.index+t[0].length;else{let t=e.match(/export\s+default\s*/);t&&t.index!==void 0&&(n=t.index+t[0].length)}if(n===-1)return{error:"no `defineConfig(...)` call or default-exported object found"};for(;n<e.length&&/\s/.test(e[n]);)n++;if(e[n]!==`{`)return{error:`the config value is not an object literal (it is a variable or an expression)`};let i=r(e,n);return i===-1?{error:`unbalanced braces in the config object`}:{text:e.slice(n,i)}}function p(e){let t=0;for(;t<e.length;){let n=e[t];if(n==="`")return{ok:!1,reason:`template literal`};let r=c(e,t);if(r!==t)t=r;else{if(n===`.`&&e[t+1]===`.`&&e[t+2]===`.`)return{ok:!1,reason:"spread (`...`)"};if(/[A-Za-z_$]/.test(n)){let n=t;for(;n<e.length&&/[\w$]/.test(e[n]);)n++;let r=e.slice(t,n),i=n;for(;i<e.length&&/\s/.test(e[i]);)i++;if(e[i]!==`:`&&![`true`,`false`,`null`,`undefined`].includes(r))return{ok:!1,reason:`non-literal value \`${r}\``};t=n}else t++}}return{ok:!0}}function m(e,t){let r=d(e);if(!r)return{error:`could not locate the config root object`};let[i,a]=r,o=n(e,i,a,`toolchain`);if(!o)return{error:"the config has no `toolchain` object to add `vite` to"};let[s,c]=o,f=n(e,s,c,`vite`);if(f){let[n,r]=f,i=u(t,l(e,n));return{content:`${e.slice(0,n)}${i}${e.slice(r)}`}}let p=`${l(e,s)} `,m=u(t,p);return{content:`${e.slice(0,s+1)}\n${p}vite: ${m},${e.slice(s+1)}`}}const h=`/vite.config.ts`;function g(e){return e.includes(`resolveVite(`)&&e.includes(`@deltabox/toolchain/vite`)}function _(e){return[`import { defineConfig } from '@deltabox/toolchain';`,``,`export default defineConfig({`,` toolchain: {`,` vite: ${u(e,` `)},`,` },`,`});`,``].join(`
6
+ `)}function v(e){let t=e.indexOf(`{`);if(t===-1)return e;let i=r(e,t);if(i===-1)return e;let a=`'${h}'`,o=n(e,t,i,`fmt`);if(o&&e[o[0]]===`{`&&e[o[1]-1]===`}`){let[t,r]=o,i=n(e,t,r,`ignorePatterns`);if(i){let[t,n]=i;return e.slice(t,n).includes(h)?e:e[t]===`[`?`${e.slice(0,t+1)}${a}, ${e.slice(t+1)}`:`${e.slice(0,t)}[${a}]${e.slice(n)}`}return`${e.slice(0,t+1)} ignorePatterns: [${a}],${e.slice(t+1)}`}return o?`${e.slice(0,o[0])}{ ignorePatterns: [${a}] }${e.slice(o[1])}`:`${e.slice(0,t+1)} fmt: { ignorePatterns: [${a}] },${e.slice(t+1)}`}const y={id:`vite-to-toolchain`,from:`vite`,to:`toolchain`,description:"Fold a hand-written vite.config.* into dbx.config.* (`toolchain.vite`).",detect:e=>{let t=o(e);if(!t)return!1;try{return!g(i.readFileSync(t,`utf-8`))}catch{return!0}},run:async t=>{let n=o(t.cwd);if(!n)throw Error(`vite-to-toolchain: no vite.config.* found.`);let r=i.readFileSync(n,`utf-8`).replace(/^\uFEFF/,``),a=[`Source: ${e.basename(n)}.`],c=[],l=()=>({id:y.id,from:`vite`,to:`toolchain`,written:[],files:[],unmapped:c,notes:a});if(g(r))return a.push("Already managed by `dbx sync`; nothing to fold."),l();let u=f(r);if(`error`in u)return c.push({source:e.basename(n),reason:u.error}),a.push(`Left vite.config.* unchanged; fold it by hand.`),l();let d=p(u.text);if(!d.ok)return c.push({source:e.basename(n),reason:`cannot fold faithfully (${d.reason})`}),a.push(`The config references helpers/imports or non-literal expressions; fold it by hand.`),l();let b=v(u.text),x=`added \`${h}\` to \`fmt.ignorePatterns\`; run \`dbx sync\` to regenerate vite.config.ts.`,S=s(t.cwd),C=()=>t.ignoreViteConfigFile?(a.push(`Kept \`${e.basename(n)}\` (ignoreViteConfigFile).`),[]):(t.write&&i.rmSync(n,{force:!0}),a.push(`Removed \`${e.basename(n)}\` (recreated by \`dbx sync\`).`),[n]);if(S&&S.endsWith(`.json`))return c.push({source:e.basename(S),reason:`JSON configs cannot hold the extracted object by text-splice`}),a.push(`Fold into the JSON config by hand.`),l();if(!S){let n=e.join(t.cwd,`dbx.config.ts`),r={path:n,content:_(b)};t.write&&i.writeFileSync(n,r.content,`utf-8`);let o=C();return a.push(`Created \`${e.basename(n)}\` with the folded \`toolchain.vite\`; ${x}`),{id:y.id,from:`vite`,to:`toolchain`,written:[n],removed:o,files:[r],notes:a}}let w=m(i.readFileSync(S,`utf-8`).replace(/^\uFEFF/,``),b);if(`error`in w)return c.push({source:e.basename(S),reason:w.error}),a.push("Left dbx.config.* unchanged; fold `toolchain.vite` in by hand."),l();let T={path:S,content:w.content};t.write&&i.writeFileSync(S,T.content,`utf-8`);let E=C();return a.push(`Folded into \`toolchain.vite\` (${e.basename(S)}); ${x}`),{id:y.id,from:`vite`,to:`toolchain`,written:[S],removed:E,files:[T],notes:a}}};export{a as VITE_CONFIG_FILES,v as ensureViteFmtIgnore,f as extractViteObject,s as findDbxConfig,o as findViteConfig,m as foldViteIntoConfig,p as scanLiteralObject,y as viteToToolchain};
@@ -1 +1 @@
1
- import"node:path";import"node:url";import.meta.url;import{logger as e}from"../../../shared/src/logger.js";import"../../../shared/src/index.js";import{createMonorepoRootFiles as t,createRootProjectFiles as n,createWorkspaceFiles as r,writeGeneratedFiles as i}from"../typescript.js";import{generateProjectConfigs as a}from"../config.js";const o=[{flags:`--no-config`,description:`Skip the dbx.config.ts file.`},{flags:`--type <type>`,description:`Project type: project | monorepo-root | monorepo-workspace.`}];function s(){return[{name:`project:init`,description:`Scaffold a single-package TypeScript project.`,options:[{flags:`-n, --name <name>`,description:`Project name.`},{flags:`-s, --scope <scope>`,description:`npm scope, eg. @acme.`},{flags:`-o, --out <dir>`,description:`Output directory (default: cwd).`},...o],run:(t,r)=>{let a=String(t.name??r.config.project?.name??`app`),o=n({name:a,...t.scope?{scope:t.scope}:{},type:t.type??`project`,includeConfig:t.config??!0}),s=i(o,t.out??r.cwd);for(let t of s)e.info(`Created ${t}`)}},{name:`project:init:monorepo`,description:`Scaffold a monorepo root + one example workspace.`,options:[{flags:`-n, --name <name>`,description:`Project name.`},{flags:`-s, --scope <scope>`,description:`npm scope, eg. @acme.`},{flags:`-o, --out <dir>`,description:`Output directory (default: cwd).`},...o],run:(n,a)=>{let o=String(n.name??a.config.project?.name??`monorepo`),s=n.scope??a.config.project?.scope??`@${o}`,c=n.out??a.cwd,l=n.config??!0,u=n.type??`monorepo-root`,d=t({name:o,scope:s,type:u,includeConfig:l,workspaces:[{alias:`core`,dir:`packages/core`}]});d.push(...r({name:o,scope:s,wsName:`core`,wsDir:`packages/core`,type:`monorepo-workspace`,includeConfig:l}).map(e=>({...e,path:`packages/core/${e.path}`})));let f=i(d,c);for(let t of f)e.info(`Created ${t}`)}},{name:`project:init:workspace`,description:`Scaffold a monorepo workspace package into an existing monorepo root.`,options:[{flags:`-n, --name <name>`,description:`Workspace package name (unscoped).`},{flags:`-s, --scope <scope>`,description:`npm scope, eg. @acme.`},{flags:`-r, --root <dir>`,description:`Monorepo root (default: cwd).`},{flags:`-d, --dir <dir>`,description:`Workspace dir relative to the root (default: packages/<name>).`},...o],run:(t,n)=>{let a=t.root??n.cwd,o=String(t.name??`workspace`),s=t.scope??n.config.project?.scope??`@${o}`,c=(t.dir??`packages/${o}`).replace(/\\/g,`/`).replace(/\/+$/,``),l=t.config??!0,u=t.type??`monorepo-workspace`,d=r({name:o,scope:s,wsName:o,wsDir:c,type:u,includeConfig:l}).map(e=>({...e,path:`${c}/${e.path}`})),f=i(d,a);for(let t of f)e.info(`Created ${t}`)}},{name:`project:config`,description:`Generate dbx.config.ts for existing projects that are missing one.`,options:[{flags:`--cwd <dir>`,description:`Root to scan (default: cwd).`},{flags:`--include <pattern...>`,description:`Only projects matching these patterns (glob or substring).`},{flags:`--exclude <pattern...>`,description:`Skip projects matching these patterns (glob or substring).`},{flags:`--type <type>`,description:`Force a project type for every config.`},{flags:`--force`,description:`Overwrite configs that already exist.`},{flags:`--dry-run`,description:`Report what would be written without writing.`},{flags:`--json`,description:`Print the result as JSON.`}],run:(t,n)=>{let r=t.cwd??n.cwd,i=a({root:r,...t.include?{include:t.include}:{},...t.exclude?{exclude:t.exclude}:{},...t.type?{type:t.type}:{},force:!!t.force,dryRun:!!t.dryRun});if(t.json){e.raw(JSON.stringify(i,null,4));return}let o=i.dryRun?`would create`:`created`;e.info(`${o} ${i.created.length} config(s), skipped ${i.skipped.length}.`);for(let t of i.configs)t.created&&e.info(` + ${t.rel===`.`?`dbx.config.ts`:`${t.rel}/dbx.config.ts`} [${t.type}]`)}}]}export{s as projectCommands};
1
+ import"node:path";import"node:url";import.meta.url;import{logger as e}from"../../../shared/src/logger.js";import"../../../shared/src/index.js";import{createMonorepoRootFiles as t,createRootProjectFiles as n,createWorkspaceFiles as r,writeGeneratedFiles as i}from"../typescript.js";import{generateProjectConfigs as a}from"../config.js";const o=[{flags:`--no-config`,description:`Skip the dbx.config.ts file.`},{flags:`--type <type>`,description:`Project type: project | monorepo-root | monorepo-workspace.`}],s=[`project`,`monorepo-root`,`monorepo-workspace`];function c(e,t){let n=String(e.name??t.project?.name??``).trim();if(!n)throw Error("a project name is required: pass `--name <name>` or set `project.name` in dbx.config.*.");return n}function l(e,t,n){let r=e.type??t.project?.type??n;if(!s.includes(r))throw Error(`invalid project type "${r}" (expected one of: ${s.join(`, `)}).`);return r}function u(){return[{name:`project:init`,description:`Scaffold a single-package TypeScript project.`,options:[{flags:`-n, --name <name>`,description:`Project name.`},{flags:`-s, --scope <scope>`,description:`npm scope, eg. @acme.`},{flags:`-o, --out <dir>`,description:`Output directory (default: cwd).`},...o],run:(t,r)=>{let a=c(t,r.config),o=n({name:a,...t.scope?{scope:t.scope}:{},type:l(t,r.config,`project`),includeConfig:t.config??!0}),s=i(o,t.out??r.cwd);for(let t of s)e.info(`Created ${t}`)}},{name:`project:init:monorepo`,description:`Scaffold a monorepo root + one example workspace.`,options:[{flags:`-n, --name <name>`,description:`Project name.`},{flags:`-s, --scope <scope>`,description:`npm scope, eg. @acme.`},{flags:`-o, --out <dir>`,description:`Output directory (default: cwd).`},...o],run:(n,a)=>{let o=c(n,a.config),s=n.scope??a.config.project?.scope??`@${o}`,u=n.out??a.cwd,d=n.config??!0,f=l(n,a.config,`monorepo-root`),p=t({name:o,scope:s,type:f,includeConfig:d,workspaces:[{alias:`core`,dir:`packages/core`}]});p.push(...r({name:o,scope:s,wsName:`core`,wsDir:`packages/core`,type:`monorepo-workspace`,includeConfig:d}).map(e=>({...e,path:`packages/core/${e.path}`})));let m=i(p,u);for(let t of m)e.info(`Created ${t}`)}},{name:`project:init:workspace`,description:`Scaffold a monorepo workspace package into an existing monorepo root.`,options:[{flags:`-n, --name <name>`,description:`Workspace package name (unscoped).`},{flags:`-s, --scope <scope>`,description:`npm scope, eg. @acme.`},{flags:`-r, --root <dir>`,description:`Monorepo root (default: cwd).`},{flags:`-d, --dir <dir>`,description:`Workspace dir relative to the root (default: packages/<name>).`},...o],run:(t,n)=>{let a=t.root??n.cwd,o=c(t,n.config),s=t.scope??n.config.project?.scope??`@${o}`,u=(t.dir??`packages/${o}`).replace(/\\/g,`/`).replace(/\/+$/,``),d=t.config??!0,f=l(t,n.config,`monorepo-workspace`),p=r({name:o,scope:s,wsName:o,wsDir:u,type:f,includeConfig:d}).map(e=>({...e,path:`${u}/${e.path}`})),m=i(p,a);for(let t of m)e.info(`Created ${t}`)}},{name:`project:config`,description:`Generate dbx.config.ts for existing projects that are missing one.`,options:[{flags:`--cwd <dir>`,description:`Root to scan (default: cwd).`},{flags:`--include <pattern...>`,description:`Only projects matching these patterns (glob or substring).`},{flags:`--exclude <pattern...>`,description:`Skip projects matching these patterns (glob or substring).`},{flags:`--type <type>`,description:`Force a project type for every config.`},{flags:`--force`,description:`Overwrite configs that already exist.`},{flags:`--dry-run`,description:`Report what would be written without writing.`},{flags:`--json`,description:`Print the result as JSON.`}],run:(t,n)=>{let r=t.cwd??n.cwd,i=a({root:r,...t.include?{include:t.include}:{},...t.exclude?{exclude:t.exclude}:{},...t.type?{type:t.type}:{},force:!!t.force,dryRun:!!t.dryRun});if(t.json){e.raw(JSON.stringify(i,null,4));return}let o=i.dryRun?`would create`:`created`;e.info(`${o} ${i.created.length} config(s), skipped ${i.skipped.length}.`);for(let t of i.configs)t.created&&e.info(` + ${t.rel===`.`?`dbx.config.ts`:`${t.rel}/dbx.config.ts`} [${t.type}]`)}}]}export{u as projectCommands};
@@ -2,9 +2,10 @@ import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { projectCommands } from "./cli/index.js";
4
4
  import { GENERATED_CONFIG_FILENAME, GenerateProjectConfigsOptions, GenerateProjectConfigsResult, GeneratedProjectConfig, generateProjectConfigs } from "./config.js";
5
+ import { projectSyncTask } from "./sync.js";
5
6
  import { MonorepoRootContext, ProjectContext, WorkspaceContext, createMonorepoRootFiles, createRootProjectFiles, createWorkspaceFiles, renderGitignore, renderToolchainConfig, renderTurboJson, renderWorkspaceTsconfig, writeGeneratedFiles } from "./typescript.js";
6
7
  declare namespace index_d_exports {
7
- export { GENERATED_CONFIG_FILENAME, GenerateProjectConfigsOptions, GenerateProjectConfigsResult, GeneratedProjectConfig, MonorepoRootContext, ProjectContext, WorkspaceContext, createMonorepoRootFiles, createRootProjectFiles, createWorkspaceFiles, generateProjectConfigs, projectCommands, renderGitignore, renderToolchainConfig, renderTurboJson, renderWorkspaceTsconfig, writeGeneratedFiles };
8
+ export { GENERATED_CONFIG_FILENAME, GenerateProjectConfigsOptions, GenerateProjectConfigsResult, GeneratedProjectConfig, MonorepoRootContext, ProjectContext, WorkspaceContext, createMonorepoRootFiles, createRootProjectFiles, createWorkspaceFiles, generateProjectConfigs, projectCommands, projectSyncTask, renderGitignore, renderToolchainConfig, renderTurboJson, renderWorkspaceTsconfig, writeGeneratedFiles };
8
9
  }
9
10
  //#endregion
10
- export { GENERATED_CONFIG_FILENAME, GenerateProjectConfigsOptions, GenerateProjectConfigsResult, GeneratedProjectConfig, MonorepoRootContext, ProjectContext, WorkspaceContext, createMonorepoRootFiles, createRootProjectFiles, createWorkspaceFiles, generateProjectConfigs, index_d_exports, projectCommands, renderGitignore, renderToolchainConfig, renderTurboJson, renderWorkspaceTsconfig, writeGeneratedFiles };
11
+ export { GENERATED_CONFIG_FILENAME, GenerateProjectConfigsOptions, GenerateProjectConfigsResult, GeneratedProjectConfig, MonorepoRootContext, ProjectContext, WorkspaceContext, createMonorepoRootFiles, createRootProjectFiles, createWorkspaceFiles, generateProjectConfigs, index_d_exports, projectCommands, projectSyncTask, renderGitignore, renderToolchainConfig, renderTurboJson, renderWorkspaceTsconfig, writeGeneratedFiles };
@@ -1 +1 @@
1
- import"node:path";import"node:url";import.meta.url;import{__exportAll as e}from"../../../_virtual/_rolldown/runtime.js";import{createMonorepoRootFiles as t,createRootProjectFiles as n,createWorkspaceFiles as r,renderGitignore as i,renderToolchainConfig as a,renderTurboJson as o,renderWorkspaceTsconfig as s,writeGeneratedFiles as c}from"./typescript.js";import{GENERATED_CONFIG_FILENAME as l,generateProjectConfigs as u}from"./config.js";import{projectCommands as d}from"./cli/index.js";var f=/* @__PURE__ */ e({GENERATED_CONFIG_FILENAME:()=>l,createMonorepoRootFiles:()=>t,createRootProjectFiles:()=>n,createWorkspaceFiles:()=>r,generateProjectConfigs:()=>u,projectCommands:()=>d,renderGitignore:()=>i,renderToolchainConfig:()=>a,renderTurboJson:()=>o,renderWorkspaceTsconfig:()=>s,writeGeneratedFiles:()=>c});export{l as GENERATED_CONFIG_FILENAME,t as createMonorepoRootFiles,n as createRootProjectFiles,r as createWorkspaceFiles,u as generateProjectConfigs,d as projectCommands,i as renderGitignore,a as renderToolchainConfig,o as renderTurboJson,s as renderWorkspaceTsconfig,f as src_exports,c as writeGeneratedFiles};
1
+ import"node:path";import"node:url";import.meta.url;import{__exportAll as e}from"../../../_virtual/_rolldown/runtime.js";import{createMonorepoRootFiles as t,createRootProjectFiles as n,createWorkspaceFiles as r,renderGitignore as i,renderToolchainConfig as a,renderTurboJson as o,renderWorkspaceTsconfig as s,writeGeneratedFiles as c}from"./typescript.js";import{GENERATED_CONFIG_FILENAME as l,generateProjectConfigs as u}from"./config.js";import{projectCommands as d}from"./cli/index.js";import{projectSyncTask as f}from"./sync.js";var p=/* @__PURE__ */ e({GENERATED_CONFIG_FILENAME:()=>l,createMonorepoRootFiles:()=>t,createRootProjectFiles:()=>n,createWorkspaceFiles:()=>r,generateProjectConfigs:()=>u,projectCommands:()=>d,projectSyncTask:()=>f,renderGitignore:()=>i,renderToolchainConfig:()=>a,renderTurboJson:()=>o,renderWorkspaceTsconfig:()=>s,writeGeneratedFiles:()=>c});export{l as GENERATED_CONFIG_FILENAME,t as createMonorepoRootFiles,n as createRootProjectFiles,r as createWorkspaceFiles,u as generateProjectConfigs,d as projectCommands,f as projectSyncTask,i as renderGitignore,a as renderToolchainConfig,o as renderTurboJson,s as renderWorkspaceTsconfig,p as src_exports,c as writeGeneratedFiles};
@@ -0,0 +1,14 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { SyncTask } from "../../shared/src/toolchain.js";
4
+ import "../../shared/src/index.js";
5
+ //#region packages/project/src/sync.d.ts
6
+ /**
7
+ * The `project` sync task: writes the fields a `dbx.config.project` **defines**
8
+ * into the project's `package.json` (name, description, author, license,
9
+ * homepage, repository, packageManager). It never clears a field the config does
10
+ * not mention, and `repo` resolves to the workspace path through
11
+ * `repository.directory`. Runs only when a `project` section is defined.
12
+ */
13
+ export declare function projectSyncTask(): SyncTask;
14
+ //#endregion
@@ -0,0 +1 @@
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{readJsonAt as t}from"../../shared/src/fs-utils.js";import{projectToPackageJson as n}from"../../shared/src/project.js";import"../../shared/src/index.js";import r from"node:fs";function i(t){let n=e.resolve(t);for(;;){if(r.existsSync(e.join(n,`.git`)))return n;let t=e.dirname(n);if(t===n)return;n=t}}function a(){return{name:`project`,enabled:e=>e.project!==void 0,run:r=>{let a=r.config.project;if(!a)return[];let o=t(r.cwd,`package.json`);if(!o)return[];let s=i(r.cwd),c=s&&e.resolve(s)!==e.resolve(r.cwd)?e.relative(s,r.cwd).replace(/\\/g,`/`):void 0,l=n(a,c?{directory:c}:{});if(Object.keys(l).length===0)return[];let u={...o,...l};return[{path:`package.json`,content:`${JSON.stringify(u,null,4)}\n`}]}}}export{a as projectSyncTask};
@@ -10,7 +10,7 @@ ${r.join(`
10
10
  `)}
11
11
  },
12
12
  });
13
- `}function u(e=!1){return c({extends:`./tsconfig.default.json`,compilerOptions:{composite:e}})}function d(e){let n={name:e.scope?`${e.scope}/${e.name}`:e.name,version:`0.1.0`,private:!0,type:`module`,description:``,...e.author?{author:e.author}:{},...e.license?{license:e.license}:{},scripts:{build:`tsdown --config-loader unrun`,format:`biome format --write .`,lint:`biome check --fix .`,test:`vitest run`,typecheck:`tsc -p tsconfig.json --noEmit`},devDependencies:{"@biomejs/biome":`catalog:`,tsdown:`catalog:`,typescript:`catalog:`,vitest:`catalog:`},...e.packageManager?{packageManager:e.packageManager}:{},engines:{node:e.nodeVersion?`>=${e.nodeVersion}`:`>=22`}};return[...e.includeConfig===!1?[]:[{path:`dbx.config.ts`,content:l({...e,type:e.type??`project`})}],{path:`package.json`,content:c(n)},{path:`tsconfig.base.json`,content:r(s(e))},{path:`tsconfig.default.json`,content:a(s(e))},{path:`tsconfig.build.json`,content:i(s(e))},{path:`tsconfig.json`,content:u()},{path:`biome.json`,content:t(s(e))},{path:`.gitignore`,content:h()},{path:`README.md`,content:`# ${e.name}\n`}]}function f(e){let i={name:e.name,version:`0.1.0`,private:!0,type:`module`,...e.author?{author:e.author}:{},...e.license?{license:e.license}:{},scripts:{build:`turbo build`,format:`turbo format`,lint:`turbo lint`,test:`turbo test`,typecheck:`turbo typecheck`},workspaces:e.workspaceGlobs??[`packages/*`],devDependencies:{"@biomejs/biome":`catalog:`,tsdown:`catalog:`,turbo:`^2.11.2`,typescript:`catalog:`,vitest:`catalog:`},...e.packageManager?{packageManager:e.packageManager}:{},engines:{node:e.nodeVersion?`>=${e.nodeVersion}`:`>=22`}};return[...e.includeConfig===!1?[]:[{path:`dbx.config.ts`,content:l({...e,type:e.type??`monorepo-root`})}],{path:`package.json`,content:c(i)},{path:`turbo.json`,content:m()},{path:`tsconfig.base.json`,content:r(s(e))},{path:`tsconfig.monorepo.json`,content:n({scope:e.scope??e.name,workspaces:e.workspaces})},{path:`biome.json`,content:t(s(e))},{path:`.gitignore`,content:h()},{path:`README.md`,content:`# ${e.name}\n`}]}function p(e){let t={name:e.scope?`${e.scope}/${e.wsName}`:e.wsName,version:`0.1.0`,type:`module`,files:[`dist`],scripts:{build:`tsdown --config-loader unrun`,format:`biome format --write .`,lint:`biome check --fix .`,test:`vitest run`,typecheck:`tsc -p tsconfig.build.json --noEmit`},publishConfig:{access:`public`,provenance:!0}},n=e.wsDir.split(`/`).length;return[...e.includeConfig===!1?[]:[{path:`dbx.config.ts`,content:l({...e,type:e.type??`monorepo-workspace`})}],{path:`package.json`,content:c(t)},{path:`tsconfig.default.json`,content:c({extends:`${`../`.repeat(n)}tsconfig.base.json`,compilerOptions:{module:`NodeNext`,moduleResolution:`NodeNext`,types:[`node`]},include:[`src`,`tests`,`tsdown.config.ts`,`vitest.config.ts`]})},{path:`tsconfig.build.json`,content:u()},{path:`tsconfig.json`,content:u()},{path:`tsdown.config.ts`,content:`import { defineConfig } from 'tsdown';
13
+ `}function u(e=!1){return c({extends:`./tsconfig.default.json`,compilerOptions:{composite:e}})}function d(e){let n={name:e.scope?`${e.scope}/${e.name}`:e.name,version:`0.1.0`,private:!0,type:`module`,description:``,...e.author?{author:e.author}:{},...e.license?{license:e.license}:{},scripts:{build:`tsdown --config-loader unrun`,format:`biome format --write .`,lint:`biome check --fix .`,test:`vitest run`,typecheck:`tsc -p tsconfig.json --noEmit`},devDependencies:{"@biomejs/biome":`catalog:`,tsdown:`catalog:`,typescript:`catalog:`,vitest:`catalog:`},...e.packageManager?{packageManager:e.packageManager}:{},engines:{node:e.nodeVersion?`>=${e.nodeVersion}`:`>=22`}};return[...e.includeConfig===!1?[]:[{path:`dbx.config.ts`,content:l({...e,type:e.type??`project`})}],{path:`package.json`,content:c(n)},{path:`tsconfig.base.json`,content:r(s(e))},{path:`tsconfig.default.json`,content:a(s(e))},{path:`tsconfig.build.json`,content:i(s(e))},{path:`tsconfig.json`,content:u()},{path:`biome.json`,content:t(s(e))},{path:`.gitignore`,content:h()},{path:`README.md`,content:`# ${e.name}\n`}]}function f(e){let i={name:e.name,version:`0.1.0`,private:!0,type:`module`,...e.author?{author:e.author}:{},...e.license?{license:e.license}:{},scripts:{build:`turbo build`,format:`turbo format`,lint:`turbo lint`,test:`turbo test`,typecheck:`turbo typecheck`},workspaces:e.workspaceGlobs??[`packages/*`],devDependencies:{"@biomejs/biome":`catalog:`,tsdown:`catalog:`,turbo:`^2.11.2`,typescript:`catalog:`,vitest:`catalog:`},...e.packageManager?{packageManager:e.packageManager}:{},engines:{node:e.nodeVersion?`>=${e.nodeVersion}`:`>=22`}};return[...e.includeConfig===!1?[]:[{path:`dbx.config.ts`,content:l({...e,type:e.type??`monorepo-root`})}],{path:`package.json`,content:c(i)},{path:`turbo.json`,content:m()},{path:`tsconfig.base.json`,content:r(s(e))},{path:`tsconfig.workspaces.json`,content:n({scope:e.scope??e.name,workspaces:e.workspaces})},{path:`biome.json`,content:t(s(e))},{path:`.gitignore`,content:h()},{path:`README.md`,content:`# ${e.name}\n`}]}function p(e){let t={name:e.scope?`${e.scope}/${e.wsName}`:e.wsName,version:`0.1.0`,type:`module`,files:[`dist`],scripts:{build:`tsdown --config-loader unrun`,format:`biome format --write .`,lint:`biome check --fix .`,test:`vitest run`,typecheck:`tsc -p tsconfig.build.json --noEmit`},publishConfig:{access:`public`,provenance:!0}},n=e.wsDir.split(`/`).length;return[...e.includeConfig===!1?[]:[{path:`dbx.config.ts`,content:l({...e,type:e.type??`monorepo-workspace`})}],{path:`package.json`,content:c(t)},{path:`tsconfig.default.json`,content:c({extends:`${`../`.repeat(n)}tsconfig.base.json`,compilerOptions:{module:`NodeNext`,moduleResolution:`NodeNext`,types:[`node`]},include:[`src`,`tests`,`tsdown.config.ts`,`vitest.config.ts`]})},{path:`tsconfig.build.json`,content:u()},{path:`tsconfig.json`,content:u()},{path:`tsdown.config.ts`,content:`import { defineConfig } from 'tsdown';
14
14
 
15
15
  import { baseTsdownConfig } from '@deltabox/toolchain-tsdown';
16
16