@deltabox/toolchain 2.3.4 → 2.6.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 (130) hide show
  1. package/CHANGELOG.md +141 -8
  2. package/dist/biome.d.ts +2 -2
  3. package/dist/biome.js +1 -1
  4. package/dist/cli/commands/sync.js +1 -1
  5. package/dist/cli/commands/watch.js +1 -1
  6. package/dist/cli/index.js +1 -1
  7. package/dist/cli/register.js +1 -1
  8. package/dist/cli/tooling-commands.js +1 -0
  9. package/dist/config.d.ts +2 -1
  10. package/dist/config.js +1 -1
  11. package/dist/core.d.ts +4 -3
  12. package/dist/core.js +1 -1
  13. package/dist/index.d.ts +14 -10
  14. package/dist/index.js +1 -1
  15. package/dist/migrate.d.ts +3 -3
  16. package/dist/migrate.js +1 -1
  17. package/dist/package.js +1 -1
  18. package/dist/packages/biome/src/index.d.ts +142 -7
  19. package/dist/packages/biome/src/index.js +1 -1
  20. package/dist/packages/changelog/src/workflows.d.ts +19 -5
  21. package/dist/packages/changelog/src/workflows.js +5 -4
  22. package/dist/packages/config/src/generators/commands.d.ts +22 -0
  23. package/dist/packages/config/src/generators/commands.js +2 -0
  24. package/dist/packages/config/src/generators/index.d.ts +2 -1
  25. package/dist/packages/config/src/generators/index.js +1 -1
  26. package/dist/packages/config/src/generators/types.js +1 -1
  27. package/dist/packages/config/src/index.d.ts +3 -2
  28. package/dist/packages/config/src/index.js +1 -1
  29. package/dist/packages/config/src/schema.js +1 -1
  30. package/dist/packages/core/src/editor-config.js +1 -1
  31. package/dist/packages/core/src/fmt-groups.d.ts +32 -0
  32. package/dist/packages/core/src/fmt-groups.js +1 -0
  33. package/dist/packages/core/src/index.d.ts +5 -4
  34. package/dist/packages/core/src/index.js +1 -1
  35. package/dist/packages/core/src/loader.js +1 -1
  36. package/dist/packages/core/src/select.d.ts +3 -0
  37. package/dist/packages/core/src/select.js +1 -1
  38. package/dist/packages/core/src/sync.d.ts +6 -0
  39. package/dist/packages/core/src/sync.js +1 -1
  40. package/dist/packages/core/src/watch.d.ts +41 -0
  41. package/dist/packages/core/src/watch.js +1 -1
  42. package/dist/packages/migrate/src/cli/index.js +1 -1
  43. package/dist/packages/migrate/src/index.d.ts +3 -3
  44. package/dist/packages/migrate/src/index.js +1 -1
  45. package/dist/packages/migrate/src/oxc.js +1 -1
  46. package/dist/packages/migrate/src/oxlint-map.d.ts +34 -1
  47. package/dist/packages/migrate/src/oxlint-map.js +1 -1
  48. package/dist/packages/migrate/src/types.d.ts +3 -2
  49. package/dist/packages/migrate/src/vite-target.d.ts +7 -0
  50. package/dist/packages/migrate/src/vite-target.js +2 -2
  51. package/dist/packages/migrate/src/vite.d.ts +30 -1
  52. package/dist/packages/migrate/src/vite.js +10 -8
  53. package/dist/packages/project/src/cli/index.js +1 -1
  54. package/dist/packages/project/src/config.d.ts +20 -5
  55. package/dist/packages/project/src/config.js +1 -1
  56. package/dist/packages/project/src/index.d.ts +3 -3
  57. package/dist/packages/project/src/index.js +1 -1
  58. package/dist/packages/project/src/sync.js +1 -1
  59. package/dist/packages/project/src/typescript.d.ts +34 -0
  60. package/dist/packages/project/src/typescript.js +18 -10
  61. package/dist/packages/shared/src/config-schema/alias-rewrite.d.ts +32 -0
  62. package/dist/packages/shared/src/config-schema/biome.js +1 -1
  63. package/dist/packages/shared/src/config-schema/changelog.d.ts +623 -56
  64. package/dist/packages/shared/src/config-schema/ci.d.ts +1873 -163
  65. package/dist/packages/shared/src/config-schema/format.d.ts +4 -6
  66. package/dist/packages/shared/src/config-schema/format.js +1 -1
  67. package/dist/packages/shared/src/config-schema/generated/gitlab-ci.d.ts +1 -1
  68. package/dist/packages/shared/src/config-schema/generated/oxfmt-config.d.ts +1 -1
  69. package/dist/packages/shared/src/config-schema/index.d.ts +6057 -862
  70. package/dist/packages/shared/src/config-schema/index.js +1 -1
  71. package/dist/packages/shared/src/config-schema/json.d.ts +1 -1
  72. package/dist/packages/shared/src/config-schema/tsconfig.d.ts +21 -0
  73. package/dist/packages/shared/src/config-schema/tsconfig.js +1 -1
  74. package/dist/packages/shared/src/config-schema/vendor-types.d.ts +156 -0
  75. package/dist/packages/shared/src/config-schema/workflow.d.ts +3678 -297
  76. package/dist/packages/shared/src/config-schema/workflow.js +1 -1
  77. package/dist/packages/shared/src/config-types.d.ts +219 -37
  78. package/dist/packages/shared/src/ignore.d.ts +9 -1
  79. package/dist/packages/shared/src/ignore.js +1 -1
  80. package/dist/packages/shared/src/index.d.ts +11 -8
  81. package/dist/packages/shared/src/index.js +1 -1
  82. package/dist/packages/shared/src/string-utils.d.ts +9 -2
  83. package/dist/packages/shared/src/string-utils.js +2 -2
  84. package/dist/packages/shared/src/template.d.ts +1 -1
  85. package/dist/packages/shared/src/toolchain.d.ts +13 -4
  86. package/dist/packages/shared/src/toolchain.js +1 -1
  87. package/dist/packages/shared/src/tsconfig-files.d.ts +14 -0
  88. package/dist/packages/shared/src/tsconfig-files.js +1 -0
  89. package/dist/packages/shared/src/types.d.ts +4 -2
  90. package/dist/packages/shared/src/vite-defaults.d.ts +102 -10
  91. package/dist/packages/shared/src/vite-defaults.js +1 -1
  92. package/dist/packages/shared/src/yaml.d.ts +1 -1
  93. package/dist/packages/tsconfig/src/auto.d.ts +11 -0
  94. package/dist/packages/tsconfig/src/auto.js +1 -0
  95. package/dist/packages/tsconfig/src/cli/generate/index.d.ts +58 -0
  96. package/dist/packages/tsconfig/src/cli/generate/index.js +1 -1
  97. package/dist/packages/tsconfig/src/cli/generate/utils.d.ts +12 -0
  98. package/dist/packages/tsconfig/src/cli/generate/utils.js +1 -1
  99. package/dist/packages/tsconfig/src/cli/index.js +1 -1
  100. package/dist/packages/tsconfig/src/files.d.ts +5 -0
  101. package/dist/packages/tsconfig/src/files.js +1 -0
  102. package/dist/packages/tsconfig/src/index.d.ts +6 -5
  103. package/dist/packages/tsconfig/src/index.js +1 -1
  104. package/dist/packages/tsconfig/src/overrides.d.ts +3 -3
  105. package/dist/packages/tsconfig/src/resolve.d.ts +15 -3
  106. package/dist/packages/tsconfig/src/resolve.js +1 -1
  107. package/dist/packages/tsconfig/src/sync.d.ts +5 -11
  108. package/dist/packages/tsconfig/src/sync.js +1 -1
  109. package/dist/packages/tsconfig/src/templates.d.ts +38 -4
  110. package/dist/packages/tsconfig/src/workspaces.d.ts +36 -0
  111. package/dist/packages/tsconfig/src/workspaces.js +1 -0
  112. package/dist/packages/tsdown/src/config/node.js +1 -1
  113. package/dist/packages/vite/src/commands.js +1 -1
  114. package/dist/packages/vite/src/index.d.ts +3 -1
  115. package/dist/packages/vite/src/index.js +1 -1
  116. package/dist/packages/vite/src/resolve.js +1 -1
  117. package/dist/packages/vite/src/sync.js +3 -3
  118. package/dist/project.d.ts +2 -2
  119. package/dist/project.js +1 -1
  120. package/dist/shared.d.ts +10 -7
  121. package/dist/shared.js +1 -1
  122. package/dist/sync.d.ts +2 -0
  123. package/dist/sync.js +1 -1
  124. package/dist/tooling.d.ts +18 -1
  125. package/dist/tooling.js +1 -1
  126. package/dist/tsconfig.d.ts +5 -4
  127. package/dist/tsconfig.js +1 -1
  128. package/dist/vite.d.ts +2 -1
  129. package/dist/vite.js +1 -1
  130. package/package.json +15 -14
@@ -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{sectionConfig as n}from"../../../shared/src/toolchain.js";import"../../../shared/src/index.js";import{loadToolchainConfig as r}from"../../../core/src/loader.js";import"../../../core/src/index.js";import{hasCatalog as i}from"../catalogs.js";import{tsconfigFileNames as a}from"../../../tsconfig/src/sync.js";import"../../../tsconfig/src/index.js";import{SCAFFOLD_CATALOG as o,createMonorepoRootFiles as s,createRootProjectFiles as c,createWorkspaceFiles as l,findRootOxcFiles as u,upsertWorkspaceTsconfig as d,workspaceDirForTsconfig as f,writeGeneratedFiles as p}from"../typescript.js";import{generateProjectConfigs as m}from"../config.js";const h=[{flags:`--no-config`,description:`Skip the dbx.config.ts file.`},{flags:`--type <type>`,description:`Project type: project | monorepo-root | monorepo-workspace.`},{flags:`--force`,description:`Overwrite existing files in the output directory.`}],g={flags:`--package-manager <pm>`,description:`Package manager: yarn (default) | pnpm | npm | bun.`},_=[`project`,`monorepo-root`,`monorepo-workspace`];function v(e){if(e!=null&&e!==``)return String(e)}function y(e,t={}){let n=v(e.description);return{...t.description!==!1&&n?{description:n}:{},...v(e.author)?{author:v(e.author)}:{},...v(e.license)?{license:v(e.license)}:{},...v(e.homepage)?{homepage:v(e.homepage)}:{},...v(e.repo)?{repo:v(e.repo)}:{},...v(e.nodeVersion)?{nodeVersion:v(e.nodeVersion)}:{}}}function b(e,t){let n=v(t.packageManager),r=e.packageManager??n??`yarn`,i=r===n?v(t.packageManagerVersion)??v(t.yarnVersion):void 0;return{packageManager:r,...i?{packageManagerVersion:i}:{}}}function x(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 S(t,n){return t===`.`?e.basename(e.resolve(n)):t}function C(e,t){let n=e.type??t;if(!_.includes(n))throw Error(`invalid project type "${n}" (expected one of: ${_.join(`, `)}).`);return n}function w(e){return n(e.tsconfig)?.extends}function T(){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).`},g,...h],run:(e,n)=>{let r=e.out??n.cwd,i=S(x(e,n.config),r),a=w(n.config),o=e.scope??v(n.tokens.scope),s=c({...y(n.tokens),name:i,...o?{scope:o}:{},...b(e,n.tokens),type:C(e,`project`),includeConfig:n.noConfig?!1:e.config??!0,rootOxc:u(r),...a?{tsconfigExtends:a}:{}}),l=p(s,r,{force:!!e.force});for(let e of l)t.info(`Created ${e}`)}},{name:`project:init:monorepo`,description:`Scaffold a monorepo root (add --example for 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).`},{flags:`--example`,description:`Also scaffold one example workspace package.`},g,...h],run:(e,n)=>{let r=e.out??n.cwd,i=S(x(e,n.config),r),a=e.scope??v(n.tokens.scope)??`@${i}`,o=n.noConfig?!1:e.config??!0,c=C(e,`monorepo-root`),u=!!e.example,d=b(e,n.tokens),f=w(n.config),m=s({...y(n.tokens),name:i,scope:a,type:c,includeConfig:o,...d,...f?{tsconfigExtends:f}:{},workspaces:u?[{alias:`core`,dir:`packages/core`}]:[]});u&&m.push(...l({...y(n.tokens,{description:!1}),name:i,scope:a,wsName:`core`,wsDir:`packages/core`,type:`monorepo-workspace`,includeConfig:o,useCatalog:!0,...d,...f?{tsconfigExtends:f}:{}}).map(e=>({...e,path:`packages/core/${e.path}`})));let h=p(m,r,{force:!!e.force});for(let e of h)t.info(`Created ${e}`)}},{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>).`},g,...h],run:async(n,s)=>{let c=n.root??s.cwd,{config:u,tokens:m}=e.resolve(c)===e.resolve(s.cwd)?{config:s.config,tokens:s.tokens}:await r(c,{tolerant:!0,skipHooks:!0,...s.noConfig?{noConfig:!0}:{}}),h=String(n.name??``).trim();if(!h)throw Error("a workspace name is required: pass `--name <name>` (the root project name is not the workspace name).");let g=S(h,c),_=v(m.name)??e.basename(e.resolve(c)),x=n.scope??v(m.scope)??`@${_}`,T=(n.dir??`packages/${g}`).replace(/\\/g,`/`).replace(/\/+$/,``);f(T);let E=s.noConfig?!1:n.config??!0,D=C(n,`monorepo-workspace`),O=b(n,m),k=w(u),A=l({...y(m,{description:!1}),name:g,scope:x,wsName:g,wsDir:T,type:D,includeConfig:E,useCatalog:i(c,O.packageManager,Object.keys(o)),...O,...k?{tsconfigExtends:k}:{}}).map(e=>({...e,path:`${T}/${e.path}`})),j=p(A,c,{force:!!n.force});d(c,{alias:g,dir:T},x,a(u).rootFile);for(let e of j)t.info(`Created ${e}`)}},{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:(n,r)=>{let i=n.cwd??r.cwd,a=m({root:i,...n.include?{include:n.include}:{},...n.exclude?{exclude:n.exclude}:{},...n.type?{type:n.type}:{},force:!!n.force,dryRun:!!n.dryRun});if(n.json){t.raw(JSON.stringify(a,null,4));return}let o=a.dryRun?`would create`:`created`;t.info(`${o} ${a.created.length} config(s), skipped ${a.skipped.length}.`);for(let n of a.configs)n.created&&(t.info(` + ${n.rel===`.`?`dbx.config.ts`:`${n.rel}/dbx.config.ts`} [${n.type}]`),n.vite&&t.info(n.vite.folded?` vite: folded ${e.basename(n.vite.path)} into toolchain.vite (run \`dbx sync\`)`:` vite: left ${e.basename(n.vite.path)} alone (${n.vite.error})`))}}]}export{T as projectCommands};
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{logger as t}from"../../../shared/src/logger.js";import{sectionConfig as n}from"../../../shared/src/toolchain.js";import{tsconfigFileNames as r}from"../../../shared/src/tsconfig-files.js";import"../../../shared/src/index.js";import{loadToolchainConfig as i}from"../../../core/src/loader.js";import"../../../core/src/index.js";import{hasCatalog as a}from"../catalogs.js";import"../../../tsconfig/src/index.js";import{SCAFFOLD_CATALOG as o,createMonorepoRootFiles as s,createRootProjectFiles as c,createWorkspaceFiles as l,findRootOxcFiles as u,isConfigExtension as d,upsertWorkspaceTsconfig as f,workspaceDirForTsconfig as p,writeGeneratedFiles as m}from"../typescript.js";import{generateProjectConfigs as h}from"../config.js";import{cancel as g,confirm as _,isCancel as v,select as y}from"@clack/prompts";const b=[{flags:`--no-config`,description:`Skip the dbx.config.ts file.`},{flags:`--type <type>`,description:`Project type: project | monorepo-root | monorepo-workspace.`},{flags:`--force`,description:`Overwrite existing files in the output directory.`}],x={flags:`--package-manager <pm>`,description:`Package manager: yarn (default) | pnpm | npm | bun.`},S=[`project`,`monorepo-root`,`monorepo-workspace`];function C(e){return!!(process.stdin.isTTY&&process.stdout.isTTY)&&e.json!==!0}function w(){g(`Cancelled.`),process.exitCode=1}function T(e){if(e==null||e===``)return;let t=String(e).toLowerCase();if(t===`ts`||t===`typescript`)return`ts`;if(t===`js`||t===`javascript`)return`js`;throw Error(`invalid config language "${e}" (expected: ts | js).`)}function E(e){if(e==null||e===``)return;let t=String(e).toLowerCase().replace(/^\./,``);if(!d(t))throw Error(`invalid config extension "${e}" (expected: ts | mts | js | mjs | cjs).`);return t}function D(e){if(e!=null&&e!==``)return String(e)}function O(e,t={}){let n=D(e.description);return{...t.description!==!1&&n?{description:n}:{},...D(e.author)?{author:D(e.author)}:{},...D(e.license)?{license:D(e.license)}:{},...D(e.homepage)?{homepage:D(e.homepage)}:{},...D(e.repo)?{repo:D(e.repo)}:{},...D(e.nodeVersion)?{nodeVersion:D(e.nodeVersion)}:{}}}function k(e,t){let n=D(t.packageManager),r=e.packageManager??n??`yarn`,i=r===n?D(t.packageManagerVersion)??D(t.yarnVersion):void 0;return{packageManager:r,...i?{packageManagerVersion:i}:{}}}function A(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 j(t,n){return t===`.`?e.basename(e.resolve(n)):t}function M(e,t){let n=e.type??t;if(!S.includes(n))throw Error(`invalid project type "${n}" (expected one of: ${S.join(`, `)}).`);return n}function N(e){return n(e.tsconfig)?.extends}function P(){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).`},x,...b],run:(e,n)=>{let r=e.out??n.cwd,i=j(A(e,n.config),r),a=N(n.config),o=e.scope??D(n.tokens.scope),s=c({...O(n.tokens),name:i,...o?{scope:o}:{},...k(e,n.tokens),type:M(e,`project`),includeConfig:n.noConfig?!1:e.config??!0,rootOxc:u(r),...a?{tsconfigExtends:a}:{}}),l=m(s,r,{force:!!e.force});for(let e of l)t.info(`Created ${e}`)}},{name:`project:init:monorepo`,description:`Scaffold a monorepo root (add --example for 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).`},{flags:`--example`,description:`Also scaffold one example workspace package.`},x,...b],run:(e,n)=>{let r=e.out??n.cwd,i=j(A(e,n.config),r),a=e.scope??D(n.tokens.scope)??`@${i}`,o=n.noConfig?!1:e.config??!0,c=M(e,`monorepo-root`),u=!!e.example,d=k(e,n.tokens),f=N(n.config),p=s({...O(n.tokens),name:i,scope:a,type:c,includeConfig:o,...d,...f?{tsconfigExtends:f}:{},workspaces:u?[{alias:`core`,dir:`packages/core`}]:[]});u&&p.push(...l({...O(n.tokens,{description:!1}),name:i,scope:a,wsName:`core`,wsDir:`packages/core`,type:`monorepo-workspace`,includeConfig:o,useCatalog:!0,...d,...f?{tsconfigExtends:f}:{}}).map(e=>({...e,path:`packages/core/${e.path}`})));let h=m(p,r,{force:!!e.force});for(let e of h)t.info(`Created ${e}`)}},{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>).`},x,...b],run:async(n,s)=>{let c=n.root??s.cwd,{config:u,tokens:d}=e.resolve(c)===e.resolve(s.cwd)?{config:s.config,tokens:s.tokens}:await i(c,{tolerant:!0,skipHooks:!0,...s.noConfig?{noConfig:!0}:{}}),h=String(n.name??``).trim();if(!h)throw Error("a workspace name is required: pass `--name <name>` (the root project name is not the workspace name).");let g=j(h,c),_=D(d.name)??e.basename(e.resolve(c)),v=n.scope??D(d.scope)??`@${_}`,y=(n.dir??`packages/${g}`).replace(/\\/g,`/`).replace(/\/+$/,``);p(y);let b=s.noConfig?!1:n.config??!0,x=M(n,`monorepo-workspace`),S=k(n,d),C=N(u),w=l({...O(d,{description:!1}),name:g,scope:v,wsName:g,wsDir:y,type:x,includeConfig:b,useCatalog:a(c,S.packageManager,Object.keys(o)),...S,...C?{tsconfigExtends:C}:{}}).map(e=>({...e,path:`${y}/${e.path}`})),T=m(w,c,{force:!!n.force});f(c,{alias:g,dir:y},v,r(u).rootFile);for(let e of T)t.info(`Created ${e}`)}},{name:`project:config`,description:`Generate dbx.config.* 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:`--language <language>`,description:`Config language: ts (default) | js.`},{flags:`--config-extension <ext>`,description:`Config extension: ts | mts | js | mjs | cjs (default inferred from the language and package type).`},{flags:`--skip-config`,description:`Only write .dbx/toolchain/projects.json; do not create dbx.config.* files.`},{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:async(n,r)=>{let i=n.cwd??r.cwd,a=T(n.language),o=E(n.configExtension),s=!!n.skipConfig;if(C(n)&&n.skipConfig===void 0&&n.language===void 0&&n.configExtension===void 0){let e=await _({message:`Create dbx.config.* files for projects missing one?`,initialValue:!0});if(v(e))return w();if(!e)s=!0;else{let e=await y({message:`Config language`,options:[{value:`ts`,label:`TypeScript`,hint:`dbx.config.ts`},{value:`js`,label:`JavaScript`,hint:`dbx.config.js / .mjs / .cjs`}]});if(v(e))return w();a=e}}let c=h({root:i,...n.include?{include:n.include}:{},...n.exclude?{exclude:n.exclude}:{},...n.type?{type:n.type}:{},force:!!n.force,dryRun:!!n.dryRun,...s?{skipConfig:!0}:{},...a?{language:a}:{},...o?{extension:o}:{}});if(n.json){t.raw(JSON.stringify(c,null,4));return}if(s){t.info(`wrote the project graph for ${c.configs.length} project(s); skipped config generation.`);return}let l=c.dryRun?`would create`:`created`;t.info(`${l} ${c.created.length} config(s), skipped ${c.skipped.length}.`);for(let n of c.configs){if(!n.created)continue;let r=e.basename(n.configPath);t.info(` + ${n.rel===`.`?r:`${n.rel}/${r}`} [${n.type}]`),n.removed&&t.info(` removed old ${e.basename(n.removed)}`),n.vite&&t.info(n.vite.folded?` vite: folded ${e.basename(n.vite.path)} into toolchain.vite (run \`dbx sync\`)`:` vite: left ${e.basename(n.vite.path)} alone (${n.vite.error})`)}}}]}export{P as projectCommands};
@@ -1,10 +1,11 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { ProjectType } from "../../shared/src/config-types.js";
4
+ import { ConfigExtension, ConfigLanguage } from "./typescript.js";
4
5
  import "../../shared/src/index.js";
5
6
  //#region packages/project/src/config.d.ts
6
- /** The file name a generated dbx config uses. */
7
- export declare const GENERATED_CONFIG_FILENAME = "dbx.config.ts";
7
+ /** The default file name a generated dbx config uses. */
8
+ export declare const GENERATED_CONFIG_FILENAME: string;
8
9
  export interface GenerateProjectConfigsOptions {
9
10
  /** Root to scan for projects. */
10
11
  root: string;
@@ -20,6 +21,12 @@ export interface GenerateProjectConfigsOptions {
20
21
  maxDepth?: number;
21
22
  /** Report what would be written without writing anything. */
22
23
  dryRun?: boolean;
24
+ /** Only write the project graph; do not create `dbx.config.*` files. */
25
+ skipConfig?: boolean;
26
+ /** Language for new configs (default `ts`). */
27
+ language?: ConfigLanguage;
28
+ /** Force a config extension instead of inferring it from the language. */
29
+ extension?: ConfigExtension;
23
30
  }
24
31
  /** One project considered for config generation. */
25
32
  export interface GeneratedProjectConfig {
@@ -35,8 +42,12 @@ export interface GeneratedProjectConfig {
35
42
  configPath: string;
36
43
  /** Whether the config was (or would be) written. */
37
44
  created: boolean;
45
+ /** The chosen config extension. */
46
+ extension: ConfigExtension;
38
47
  /** Why the project was skipped, when it was. */
39
48
  skipped?: string;
49
+ /** An old config removed when switching extension with `force`. */
50
+ removed?: string;
40
51
  /** How an existing hand-written `vite.config.*` was handled. */
41
52
  vite?: {
42
53
  path: string;
@@ -48,13 +59,17 @@ export interface GenerateProjectConfigsResult {
48
59
  configs: GeneratedProjectConfig[];
49
60
  /** Project dirs whose config was (or would be) written. */
50
61
  created: string[];
51
- /** Project dirs skipped (already have a config). */
62
+ /** Project dirs skipped (already configured, or config writing disabled). */
52
63
  skipped: string[];
53
64
  dryRun: boolean;
65
+ /** The written `.dbx/toolchain/projects.json` path (when not a dry run). */
66
+ graphPath?: string;
54
67
  }
55
68
  /**
56
- * Generate a `dbx.config.ts` for every discovered project that is missing one
57
- * (unless `force`). The project type is detected from the filesystem unless
69
+ * Generate a `dbx.config.*` for every discovered project that is missing one
70
+ * (unless `force`). The project graph is written to
71
+ * `.dbx/toolchain/projects.json` before any config, so the config generation can
72
+ * use it as context. The project type is detected from the filesystem unless
58
73
  * overridden. Returns the configs written (or that would be).
59
74
  */
60
75
  export declare function generateProjectConfigs(options: GenerateProjectConfigsOptions): GenerateProjectConfigsResult;
@@ -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{projectFromPackageJson as n}from"../../shared/src/project.js";import"../../shared/src/index.js";import{detectProjectType as r}from"../../core/src/project-type.js";import{selectProjects as i}from"../../core/src/select.js";import"../../core/src/index.js";import{ensureViteFmtIgnore as a,extractViteObject as o,findViteConfig as s,foldViteIntoConfig as c,scanLiteralObject as l}from"../../migrate/src/vite.js";import"../../migrate/src/index.js";import{renderToolchainConfig as u}from"./typescript.js";import d from"node:fs";const f=`dbx.config.ts`;function p(t,n){if(!t)return{name:e.basename(n)};let r=t.match(/^(@[^/]+)\/(.+)$/);return r?.[1]&&r[2]?{name:r[2],scope:r[1]}:{name:t}}function m(m){let h=m.dryRun??!1,g=m.force??!1,_=i({root:m.root,...m.include?{include:m.include}:{},...m.exclude?{exclude:m.exclude}:{},...m.maxDepth===void 0?{}:{maxDepth:m.maxDepth}}),v=[],y=[],b=[];for(let i of _){let _=e.join(i.dir,f);if((i.hasConfig||d.existsSync(_))&&!g){b.push(i.rel),v.push({dir:i.dir,rel:i.rel,...i.name?{name:i.name}:{},type:m.type??r(i.dir),configPath:_,created:!1,skipped:`has config`});continue}let x=m.type??r(i.dir),S=t(i.dir,`package.json`),{name:C,scope:w}=p(i.name??S?.name,i.dir),T=S?n(S):void 0,E=u({name:C,...w?{scope:w}:{},type:x,...T?.description?{description:T.description}:{},...T?.author?{author:T.author}:{},...T?.license?{license:T.license}:{},...T?.homepage?{homepage:T.homepage}:{},...T?.repo?{repo:T.repo}:{},...T?.nodeVersion?{nodeVersion:T.nodeVersion}:{},...T?.packageManager?{packageManager:T.packageManager}:{},...T?.packageManagerVersion?{packageManagerVersion:T.packageManagerVersion}:{}}),D=E,O,k=s(i.dir);if(k)try{let e=d.readFileSync(k,`utf-8`).replace(/^\uFEFF/,``);if(!e.includes(`@deltabox/toolchain/vite`)){let t=o(e),n=`error`in t?void 0:l(t.text);if(`error`in t||!n?.ok)O={path:k,folded:!1,error:`error`in t?t.error:n.reason};else{let e=c(E,a(t.text));`content`in e?(D=e.content,O={path:k,folded:!0}):O={path:k,folded:!1,error:e.error}}}}catch(e){O={path:k,folded:!1,error:String(e)}}h||d.writeFileSync(_,D,`utf-8`),y.push(i.rel),v.push({dir:i.dir,rel:i.rel,...i.name?{name:i.name}:{},type:x,configPath:_,created:!0,...O?{vite:O}:{}})}return{configs:v,created:y,skipped:b,dryRun:h}}export{f as GENERATED_CONFIG_FILENAME,m as generateProjectConfigs};
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{projectFromPackageJson as n}from"../../shared/src/project.js";import"../../shared/src/index.js";import{detectProjectType as r}from"../../core/src/project-type.js";import{findConfigFile as i}from"../../core/src/loader.js";import{buildProjectGraph as a,orderProjects as o,writeProjectGraph as s}from"../../core/src/graph.js";import{selectProjects as c}from"../../core/src/select.js";import"../../core/src/index.js";import{ensureViteFmtIgnore as l,extractViteObject as u,findViteConfig as d,foldViteIntoConfig as f,objectHasSections as p,scanLiteralObject as m}from"../../migrate/src/vite.js";import"../../migrate/src/index.js";import{configFileName as h,isConfigExtension as g,renderToolchainConfig as _,resolveConfigExtension as v}from"./typescript.js";import y from"node:fs";const b=h(`ts`);function x(t){let n=e.extname(t).slice(1);return g(n)?n:`ts`}function S(t,n){if(!t)return{name:e.basename(n)};let r=t.match(/^(@[^/]+)\/(.+)$/);return r?.[1]&&r[2]?{name:r[2],scope:r[1]}:{name:t}}function C(b){let C=b.dryRun??!1,w=b.force??!1,T=b.skipConfig??!1,E=b.language??`ts`,D=b.maxDepth===void 0?{}:{maxDepth:b.maxDepth},O=a(b.root,D),k;C||(k=s(b.root,O));let A=c({root:b.root,...b.include?{include:b.include}:{},...b.exclude?{exclude:b.exclude}:{},...b.maxDepth===void 0?{}:{maxDepth:b.maxDepth},graph:O}),j=[],M=[],N=[];for(let a of A){let o=t(a.dir,`package.json`),s=v(E,o?.type,b.extension),c=e.join(a.dir,h(s)),D=a.hasConfig?i(a.dir):void 0,O=D?e.extname(D).slice(1):void 0,k=D&&O&&g(O)?D:void 0,A=b.language!==void 0||b.extension!==void 0,P=D&&(!w||k&&!A)?D:c,F=x(P),I=!!D||y.existsSync(c),L=b.type??r(a.dir);if(T){N.push(a.rel),j.push({dir:a.dir,rel:a.rel,...a.name?{name:a.name}:{},type:L,configPath:P,extension:F,created:!1,skipped:`config skipped`});continue}if(I&&!w){N.push(a.rel),j.push({dir:a.dir,rel:a.rel,...a.name?{name:a.name}:{},type:L,configPath:P,extension:F,created:!1,skipped:`has config`});continue}let{name:R,scope:z}=S(a.name??o?.name,a.dir),B=o?n(o):void 0,V=_({name:R,...z?{scope:z}:{},type:L,configExtension:F,...o?.type?{packageType:o.type}:{},...B?.description?{description:B.description}:{},...B?.author?{author:B.author}:{},...B?.license?{license:B.license}:{},...B?.homepage?{homepage:B.homepage}:{},...B?.repo?{repo:B.repo}:{},...B?.nodeVersion?{nodeVersion:B.nodeVersion}:{},...B?.packageManager?{packageManager:B.packageManager}:{},...B?.packageManagerVersion?{packageManagerVersion:B.packageManagerVersion}:{}}),H=V,U,W=d(a.dir);if(W)try{let e=y.readFileSync(W,`utf-8`).replace(/^\uFEFF/,``);if(!e.includes(`@deltabox/toolchain/vite`)){let t=u(e),n=`error`in t?void 0:m(t.text);if(`error`in t||!n?.ok)U={path:W,folded:!1,error:`error`in t?t.error:n.reason};else{let e=f(V,l(t.text,p(t.text).fmt));`content`in e?(H=e.content,U={path:W,folded:!0}):U={path:W,folded:!1,error:e.error}}}}catch(e){U={path:W,folded:!1,error:String(e)}}let G=D&&D!==P?D:void 0;C||(y.writeFileSync(P,H,`utf-8`),G&&y.rmSync(G,{force:!0})),M.push(a.rel),j.push({dir:a.dir,rel:a.rel,...a.name?{name:a.name}:{},type:L,configPath:P,extension:F,created:!0,...G?{removed:G}:{},...U?{vite:U}:{}})}if(!C&&!T&&M.length>0){for(let t of j){if(!t.created)continue;let n=O.projects.find(n=>e.resolve(b.root,n.dir)===t.dir);n&&(n.hasConfig=!0,n.config=e.relative(b.root,t.configPath).replace(/\\/g,`/`))}O.dbxProjects=O.projects.filter(e=>e.hasConfig),O.order=o(O.dbxProjects),O.generatedAt=(/* @__PURE__ */ new Date()).toISOString(),k=s(b.root,O)}return{configs:j,created:M,skipped:N,dryRun:C,...k?{graphPath:k}:{}}}export{b as GENERATED_CONFIG_FILENAME,C as generateProjectConfigs};
@@ -2,12 +2,12 @@ import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { CATALOG_MARKER, CATALOG_PACKAGE_MANAGERS, Catalog, catalogFileFor, catalogsSyncTask, hasCatalog, renderPnpmWorkspace, renderYarnrc, supportsCatalogs } from "./catalogs.js";
4
4
  import { projectCommands } from "./cli/index.js";
5
+ import { CONFIG_EXTENSIONS, ConfigExtension, ConfigLanguage, DEFAULT_CONFIG_EXTENSION, MonorepoRootContext, ProjectContext, RootOxcFiles, SCAFFOLD_CATALOG, WorkspaceContext, WriteGeneratedFilesOptions, configFileName, configLanguage, configUsesEsm, createMonorepoRootFiles, createRootProjectFiles, createWorkspaceFiles, findRootOxcFiles, isConfigExtension, renderApplicationEntry, renderApplicationHtml, renderGitignore, renderSourceEntry, renderSourceTest, renderToolchainConfig, renderWorkspaceTsconfig, resolveConfigExtension, scaffoldCatalog, upsertWorkspaceTsconfig, workspaceDirForTsconfig, writeGeneratedFiles } from "./typescript.js";
5
6
  import { GENERATED_CONFIG_FILENAME, GenerateProjectConfigsOptions, GenerateProjectConfigsResult, GeneratedProjectConfig, generateProjectConfigs } from "./config.js";
6
7
  import { projectSyncTask } from "./sync.js";
7
- import { MonorepoRootContext, ProjectContext, RootOxcFiles, SCAFFOLD_CATALOG, WorkspaceContext, WriteGeneratedFilesOptions, createMonorepoRootFiles, createRootProjectFiles, createWorkspaceFiles, findRootOxcFiles, renderApplicationEntry, renderApplicationHtml, renderGitignore, renderSourceEntry, renderSourceTest, renderToolchainConfig, renderWorkspaceTsconfig, upsertWorkspaceTsconfig, workspaceDirForTsconfig, writeGeneratedFiles } from "./typescript.js";
8
8
  import { DEFAULT_PACKAGE_MANAGER_VERSIONS } from "../../shared/src/toolchain.js";
9
9
  declare namespace index_d_exports {
10
- export { CATALOG_MARKER, CATALOG_PACKAGE_MANAGERS, Catalog, DEFAULT_PACKAGE_MANAGER_VERSIONS, GENERATED_CONFIG_FILENAME, GenerateProjectConfigsOptions, GenerateProjectConfigsResult, GeneratedProjectConfig, MonorepoRootContext, ProjectContext, RootOxcFiles, SCAFFOLD_CATALOG, WorkspaceContext, WriteGeneratedFilesOptions, catalogFileFor, catalogsSyncTask, createMonorepoRootFiles, createRootProjectFiles, createWorkspaceFiles, findRootOxcFiles, generateProjectConfigs, hasCatalog, projectCommands, projectSyncTask, renderApplicationEntry, renderApplicationHtml, renderGitignore, renderPnpmWorkspace, renderSourceEntry, renderSourceTest, renderToolchainConfig, renderWorkspaceTsconfig, renderYarnrc, supportsCatalogs, upsertWorkspaceTsconfig, workspaceDirForTsconfig, writeGeneratedFiles };
10
+ export { CATALOG_MARKER, CATALOG_PACKAGE_MANAGERS, CONFIG_EXTENSIONS, Catalog, ConfigExtension, ConfigLanguage, DEFAULT_CONFIG_EXTENSION, DEFAULT_PACKAGE_MANAGER_VERSIONS, GENERATED_CONFIG_FILENAME, GenerateProjectConfigsOptions, GenerateProjectConfigsResult, GeneratedProjectConfig, MonorepoRootContext, ProjectContext, RootOxcFiles, SCAFFOLD_CATALOG, WorkspaceContext, WriteGeneratedFilesOptions, catalogFileFor, catalogsSyncTask, configFileName, configLanguage, configUsesEsm, createMonorepoRootFiles, createRootProjectFiles, createWorkspaceFiles, findRootOxcFiles, generateProjectConfigs, hasCatalog, isConfigExtension, projectCommands, projectSyncTask, renderApplicationEntry, renderApplicationHtml, renderGitignore, renderPnpmWorkspace, renderSourceEntry, renderSourceTest, renderToolchainConfig, renderWorkspaceTsconfig, renderYarnrc, resolveConfigExtension, scaffoldCatalog, supportsCatalogs, upsertWorkspaceTsconfig, workspaceDirForTsconfig, writeGeneratedFiles };
11
11
  }
12
12
  //#endregion
13
- export { CATALOG_MARKER, CATALOG_PACKAGE_MANAGERS, Catalog, DEFAULT_PACKAGE_MANAGER_VERSIONS, GENERATED_CONFIG_FILENAME, GenerateProjectConfigsOptions, GenerateProjectConfigsResult, GeneratedProjectConfig, MonorepoRootContext, ProjectContext, RootOxcFiles, SCAFFOLD_CATALOG, WorkspaceContext, WriteGeneratedFilesOptions, catalogFileFor, catalogsSyncTask, createMonorepoRootFiles, createRootProjectFiles, createWorkspaceFiles, findRootOxcFiles, generateProjectConfigs, hasCatalog, index_d_exports, projectCommands, projectSyncTask, renderApplicationEntry, renderApplicationHtml, renderGitignore, renderPnpmWorkspace, renderSourceEntry, renderSourceTest, renderToolchainConfig, renderWorkspaceTsconfig, renderYarnrc, supportsCatalogs, upsertWorkspaceTsconfig, workspaceDirForTsconfig, writeGeneratedFiles };
13
+ export { CATALOG_MARKER, CATALOG_PACKAGE_MANAGERS, CONFIG_EXTENSIONS, Catalog, ConfigExtension, ConfigLanguage, DEFAULT_CONFIG_EXTENSION, DEFAULT_PACKAGE_MANAGER_VERSIONS, GENERATED_CONFIG_FILENAME, GenerateProjectConfigsOptions, GenerateProjectConfigsResult, GeneratedProjectConfig, MonorepoRootContext, ProjectContext, RootOxcFiles, SCAFFOLD_CATALOG, WorkspaceContext, WriteGeneratedFilesOptions, catalogFileFor, catalogsSyncTask, configFileName, configLanguage, configUsesEsm, createMonorepoRootFiles, createRootProjectFiles, createWorkspaceFiles, findRootOxcFiles, generateProjectConfigs, hasCatalog, index_d_exports, isConfigExtension, projectCommands, projectSyncTask, renderApplicationEntry, renderApplicationHtml, renderGitignore, renderPnpmWorkspace, renderSourceEntry, renderSourceTest, renderToolchainConfig, renderWorkspaceTsconfig, renderYarnrc, resolveConfigExtension, scaffoldCatalog, supportsCatalogs, upsertWorkspaceTsconfig, workspaceDirForTsconfig, writeGeneratedFiles };
@@ -1 +1 @@
1
- import"node:path";import"node:url";import.meta.url;import{__exportAll as e}from"../../../_virtual/_rolldown/runtime.js";import{DEFAULT_PACKAGE_MANAGER_VERSIONS as t}from"../../shared/src/toolchain.js";import{CATALOG_MARKER as n,CATALOG_PACKAGE_MANAGERS as r,catalogFileFor as i,catalogsSyncTask as a,hasCatalog as o,renderPnpmWorkspace as s,renderYarnrc as c,supportsCatalogs as l}from"./catalogs.js";import{SCAFFOLD_CATALOG as u,createMonorepoRootFiles as d,createRootProjectFiles as f,createWorkspaceFiles as p,findRootOxcFiles as m,renderApplicationEntry as h,renderApplicationHtml as g,renderGitignore as _,renderSourceEntry as v,renderSourceTest as y,renderToolchainConfig as b,renderWorkspaceTsconfig as x,upsertWorkspaceTsconfig as S,workspaceDirForTsconfig as C,writeGeneratedFiles as w}from"./typescript.js";import{GENERATED_CONFIG_FILENAME as T,generateProjectConfigs as E}from"./config.js";import{projectCommands as D}from"./cli/index.js";import{projectSyncTask as O}from"./sync.js";var k=/* @__PURE__ */ e({CATALOG_MARKER:()=>n,CATALOG_PACKAGE_MANAGERS:()=>r,DEFAULT_PACKAGE_MANAGER_VERSIONS:()=>t,GENERATED_CONFIG_FILENAME:()=>T,SCAFFOLD_CATALOG:()=>u,catalogFileFor:()=>i,catalogsSyncTask:()=>a,createMonorepoRootFiles:()=>d,createRootProjectFiles:()=>f,createWorkspaceFiles:()=>p,findRootOxcFiles:()=>m,generateProjectConfigs:()=>E,hasCatalog:()=>o,projectCommands:()=>D,projectSyncTask:()=>O,renderApplicationEntry:()=>h,renderApplicationHtml:()=>g,renderGitignore:()=>_,renderPnpmWorkspace:()=>s,renderSourceEntry:()=>v,renderSourceTest:()=>y,renderToolchainConfig:()=>b,renderWorkspaceTsconfig:()=>x,renderYarnrc:()=>c,supportsCatalogs:()=>l,upsertWorkspaceTsconfig:()=>S,workspaceDirForTsconfig:()=>C,writeGeneratedFiles:()=>w});export{n as CATALOG_MARKER,r as CATALOG_PACKAGE_MANAGERS,t as DEFAULT_PACKAGE_MANAGER_VERSIONS,T as GENERATED_CONFIG_FILENAME,u as SCAFFOLD_CATALOG,i as catalogFileFor,a as catalogsSyncTask,d as createMonorepoRootFiles,f as createRootProjectFiles,p as createWorkspaceFiles,m as findRootOxcFiles,E as generateProjectConfigs,o as hasCatalog,D as projectCommands,O as projectSyncTask,h as renderApplicationEntry,g as renderApplicationHtml,_ as renderGitignore,s as renderPnpmWorkspace,v as renderSourceEntry,y as renderSourceTest,b as renderToolchainConfig,x as renderWorkspaceTsconfig,c as renderYarnrc,k as src_exports,l as supportsCatalogs,S as upsertWorkspaceTsconfig,C as workspaceDirForTsconfig,w as writeGeneratedFiles};
1
+ import"node:path";import"node:url";import.meta.url;import{__exportAll as e}from"../../../_virtual/_rolldown/runtime.js";import{DEFAULT_PACKAGE_MANAGER_VERSIONS as t}from"../../shared/src/toolchain.js";import{CATALOG_MARKER as n,CATALOG_PACKAGE_MANAGERS as r,catalogFileFor as i,catalogsSyncTask as a,hasCatalog as o,renderPnpmWorkspace as s,renderYarnrc as c,supportsCatalogs as l}from"./catalogs.js";import{CONFIG_EXTENSIONS as u,DEFAULT_CONFIG_EXTENSION as d,SCAFFOLD_CATALOG as f,configFileName as p,configLanguage as m,configUsesEsm as h,createMonorepoRootFiles as g,createRootProjectFiles as _,createWorkspaceFiles as v,findRootOxcFiles as y,isConfigExtension as b,renderApplicationEntry as x,renderApplicationHtml as S,renderGitignore as C,renderSourceEntry as w,renderSourceTest as T,renderToolchainConfig as E,renderWorkspaceTsconfig as D,resolveConfigExtension as O,scaffoldCatalog as k,upsertWorkspaceTsconfig as A,workspaceDirForTsconfig as j,writeGeneratedFiles as M}from"./typescript.js";import{GENERATED_CONFIG_FILENAME as N,generateProjectConfigs as P}from"./config.js";import{projectCommands as F}from"./cli/index.js";import{projectSyncTask as I}from"./sync.js";var L=/* @__PURE__ */ e({CATALOG_MARKER:()=>n,CATALOG_PACKAGE_MANAGERS:()=>r,CONFIG_EXTENSIONS:()=>u,DEFAULT_CONFIG_EXTENSION:()=>`ts`,DEFAULT_PACKAGE_MANAGER_VERSIONS:()=>t,GENERATED_CONFIG_FILENAME:()=>N,SCAFFOLD_CATALOG:()=>f,catalogFileFor:()=>i,catalogsSyncTask:()=>a,configFileName:()=>p,configLanguage:()=>m,configUsesEsm:()=>h,createMonorepoRootFiles:()=>g,createRootProjectFiles:()=>_,createWorkspaceFiles:()=>v,findRootOxcFiles:()=>y,generateProjectConfigs:()=>P,hasCatalog:()=>o,isConfigExtension:()=>b,projectCommands:()=>F,projectSyncTask:()=>I,renderApplicationEntry:()=>x,renderApplicationHtml:()=>S,renderGitignore:()=>C,renderPnpmWorkspace:()=>s,renderSourceEntry:()=>w,renderSourceTest:()=>T,renderToolchainConfig:()=>E,renderWorkspaceTsconfig:()=>D,renderYarnrc:()=>c,resolveConfigExtension:()=>O,scaffoldCatalog:()=>k,supportsCatalogs:()=>l,upsertWorkspaceTsconfig:()=>A,workspaceDirForTsconfig:()=>j,writeGeneratedFiles:()=>M});export{n as CATALOG_MARKER,r as CATALOG_PACKAGE_MANAGERS,u as CONFIG_EXTENSIONS,d as DEFAULT_CONFIG_EXTENSION,t as DEFAULT_PACKAGE_MANAGER_VERSIONS,N as GENERATED_CONFIG_FILENAME,f as SCAFFOLD_CATALOG,i as catalogFileFor,a as catalogsSyncTask,p as configFileName,m as configLanguage,h as configUsesEsm,g as createMonorepoRootFiles,_ as createRootProjectFiles,v as createWorkspaceFiles,y as findRootOxcFiles,P as generateProjectConfigs,o as hasCatalog,b as isConfigExtension,F as projectCommands,I as projectSyncTask,x as renderApplicationEntry,S as renderApplicationHtml,C as renderGitignore,s as renderPnpmWorkspace,w as renderSourceEntry,T as renderSourceTest,E as renderToolchainConfig,D as renderWorkspaceTsconfig,c as renderYarnrc,O as resolveConfigExtension,k as scaffoldCatalog,L as src_exports,l as supportsCatalogs,A as upsertWorkspaceTsconfig,j as workspaceDirForTsconfig,M as writeGeneratedFiles};
@@ -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{projectToPackageJson as n,splitPackageName as r}from"../../shared/src/project.js";import"../../shared/src/index.js";import i from"node:fs";function a(t){let n=e.resolve(t);for(;;){if(i.existsSync(e.join(n,`.git`)))return n;let t=e.dirname(n);if(t===n)return;n=t}}function o(){return{name:`project`,enabled:e=>e.project!==void 0,run:i=>{let o=i.config.project;if(!o)return[];let s=t(i.cwd,`package.json`);if(!s)return[];let c=a(i.cwd),l=c&&e.resolve(c)!==e.resolve(i.cwd)?e.relative(c,i.cwd).replace(/\\/g,`/`):void 0,u={...o};if(u.name!==void 0&&u.scope===void 0&&s.name){let{scope:e}=r(s.name);e&&(u.scope=e)}let d=n(u,l?{directory:l}:{});if(Object.keys(d).length===0)return[];let f={...s,...d};return[{path:`package.json`,content:`${JSON.stringify(f,null,4)}\n`,track:!1}]}}}export{o as projectSyncTask};
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,splitPackageName as r}from"../../shared/src/project.js";import{CONFIG_FILE_NAMES as i}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import a from"node:fs";function o(t){let n=e.resolve(t);for(;;){if(a.existsSync(e.join(n,`.git`)))return n;let t=e.dirname(n);if(t===n)return;n=t}}function s(t){let n=e.dirname(e.resolve(t));for(;;){if(i.some(t=>a.existsSync(e.join(n,t))))return n;let t=e.dirname(n);if(t===n)return;n=t}}function c(e){return o(e)??s(e)}function l(){return{name:`project`,enabled:e=>e.project!==void 0,run:i=>{let a=i.config.project;if(!a)return[];let o=t(i.cwd,`package.json`);if(!o)return[];let s=c(i.cwd),l=s&&e.resolve(s)!==e.resolve(i.cwd)?e.relative(s,i.cwd).replace(/\\/g,`/`):void 0,u={...a};if(u.name!==void 0&&u.scope===void 0&&o.name){let{scope:e}=r(o.name);e&&(u.scope=e)}let d=n(u,l?{directory:l}:{});if(Object.keys(d).length===0)return[];let f={...o,...d};return[{path:`package.json`,content:`${JSON.stringify(f,null,4)}\n`,track:!1}]}}}export{l as projectSyncTask};
@@ -9,6 +9,12 @@ import "../../shared/src/index.js";
9
9
  //#region packages/project/src/typescript.d.ts
10
10
  /** The catalog a scaffolded root writes into its package-manager file. */
11
11
  export declare const SCAFFOLD_CATALOG: Record<string, string>;
12
+ /**
13
+ * The catalog a scaffold writes for a package manager. `undefined` when the
14
+ * manager has no catalog file: npm has no catalog support, and Bun's lives in
15
+ * `package.json` `workspaces.catalog` (handled by {@link workspacesField}).
16
+ */
17
+ export declare function scaffoldCatalog(packageManager: string | undefined, exclude?: string[]): Record<string, string> | undefined;
12
18
  /** The replacement values a project scaffold understands. */
13
19
  export interface ProjectContext {
14
20
  /** The project/package name (unscoped). */
@@ -56,6 +62,28 @@ export interface RootOxcFiles {
56
62
  fmt: boolean;
57
63
  lint: boolean;
58
64
  }
65
+ /** The language a generated `dbx.config.*` uses. */
66
+ export type ConfigLanguage = 'ts' | 'js';
67
+ /** Every supported generated config extension. */
68
+ export declare const CONFIG_EXTENSIONS: readonly ['ts', 'mts', 'js', 'mjs', 'cjs'];
69
+ /** The extensions a generated `dbx.config.*` can use. */
70
+ export type ConfigExtension = (typeof CONFIG_EXTENSIONS)[number];
71
+ /** The default generated config extension. */
72
+ export declare const DEFAULT_CONFIG_EXTENSION: 'ts';
73
+ /** Whether a string is a supported generated config extension. */
74
+ export declare function isConfigExtension(value: string): value is ConfigExtension;
75
+ /** The generated config file name for an extension. */
76
+ export declare function configFileName(extension?: ConfigExtension): string;
77
+ /** The language a config extension belongs to. */
78
+ export declare function configLanguage(extension: ConfigExtension): ConfigLanguage;
79
+ /**
80
+ * Pick the extension for a language. TypeScript defaults to `.ts`; JavaScript
81
+ * follows the package's module kind (`.mjs` for ESM, `.cjs` for CJS, `.js` when
82
+ * `type` is unset).
83
+ */
84
+ export declare function resolveConfigExtension(language: ConfigLanguage, packageType?: string, explicit?: ConfigExtension): ConfigExtension;
85
+ /** Whether a generated config uses ESM syntax (import/export vs `module.exports`). */
86
+ export declare function configUsesEsm(extension: ConfigExtension, packageType?: string): boolean;
59
87
  /**
60
88
  * Find the nearest ancestor that owns Oxc config files. The walk stops at the
61
89
  * repository boundary (`.git`) so a nested project cannot inherit files from an
@@ -79,6 +107,12 @@ export declare function renderToolchainConfig(ctx: ProjectContext & {
79
107
  type: ProjectType;
80
108
  fmtOxc?: boolean;
81
109
  lintOxc?: boolean;
110
+ /** The catalog the scaffold writes (`toolchain.catalogs.packages`). */
111
+ catalogs?: Record<string, string>;
112
+ /** The generated file extension (default `ts`). */
113
+ configExtension?: ConfigExtension;
114
+ /** The package's `type` (`module`/`commonjs`), used for `.js` syntax. */
115
+ packageType?: string;
82
116
  }): string;
83
117
  /** A minimal tsconfig.json that extends the default template. */
84
118
  export declare function renderWorkspaceTsconfig(composite?: boolean, extendsValue?: string | string[] | false): string;
@@ -1,17 +1,25 @@
1
- import{default as e}from"node:path";import"node:url";import.meta.url;import{projectToPackageJson as t}from"../../shared/src/project.js";import{DEFAULT_PACKAGE_MANAGER_VERSIONS as n}from"../../shared/src/toolchain.js";import{DEFAULT_FMT_RULES as r,DEFAULT_LINT_RULES as i}from"../../shared/src/vite-defaults.js";import"../../shared/src/index.js";import{renderPnpmWorkspace as a,renderYarnrc as o,supportsCatalogs as s}from"./catalogs.js";import{parseTsconfig as c}from"../../tsconfig/src/resolve.js";import{renderMonorepoTsconfig as l,renderTsconfigBase as u,renderTsconfigBuild as d,renderTsconfigDefault as f}from"../../tsconfig/src/templates.js";import"../../tsconfig/src/index.js";import{version as p}from"../../../package.js";import m from"node:fs";import{applyEdits as h,modify as g}from"jsonc-parser";const _={"@deltabox/toolchain":`^${p}`,"@types/node":`^22.10.2`,tsdown:`^0.23.0`,typescript:`^6.0.3`,vite:`^8.3.0`,"vite-plus":`^1.2.0`,vitest:`^5.0.0`},v=_;function y(e,t){if(!e)return;let r=t??n[e];return r?`${e}@${r}`:e}function b(e,t,n=[]){let r=Object.entries(_).filter(([e])=>!n.includes(e));return Object.fromEntries(t?r.map(([e])=>[e,`catalog:`]):r)}function x(e,t){let n=e??`yarn`;return s(n)?n!==`bun`||t:!1}function S(e,t,n=[]){let r=Object.fromEntries(Object.entries(_).filter(([e])=>!n.includes(e)));switch(e??`yarn`){case`yarn`:return[{path:`.yarnrc.yml`,content:o({packages:r})}];case`pnpm`:return[{path:`pnpm-workspace.yaml`,content:a({packages:r},t?[`packages/*`]:void 0)}];default:return[]}}function C(e,t){return(e??`yarn`)===`bun`?{packages:t,catalog:_}:t}function w(t){let n=e.resolve(t);if(m.existsSync(e.join(n,`.git`)))return{fmt:!1,lint:!1};let r=e.dirname(n);for(;;){let t=m.existsSync(e.join(r,`.oxfmtrc.json`)),n=m.existsSync(e.join(r,`.oxlintrc.json`));if(t||n)return{fmt:t,lint:n};if(m.existsSync(e.join(r,`.git`)))break;let i=e.dirname(r);if(i===r)break;r=i}return{fmt:!1,lint:!1}}function T(e){let{tsconfigExtends:t,rootOxc:n,...r}=e;return r}function E(e){let n=e.repo??e.repoUrl;return t({...e.description?{description:e.description}:{},...e.author?{author:e.author}:{},...e.license?{license:e.license}:{},...e.homepage?{homepage:e.homepage}:{},...n?{repo:n}:{}})}const D=(e,t=4)=>`${JSON.stringify(e,null,t)}\n`;function O(e){return`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/[\u0000-\u001f\u007f\u2028\u2029]/g,e=>`\\u${e.charCodeAt(0).toString(16).padStart(4,`0`)}`)}'`}function k(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}const A=`./node_modules/oxfmt/configuration_schema.json`,j=`./node_modules/oxlint/configuration_schema.json`;function M(e,t){return`${JSON.stringify({$schema:e,...t},null,4)}\n`}function N(){return[`export function greet(who = 'world'): string {`," return `Hello, ${who}!`;",`}`,``].join(`
2
- `)}function P(){return[`import { greet } from './index.js';`,``,`const app = document.querySelector<HTMLDivElement>('#app');`,`if (app) app.textContent = greet('world');`,``].join(`
3
- `)}function F(e){return[`<!doctype html>`,`<html lang="en">`,` <head>`,` <meta charset="UTF-8" />`,` <meta name="viewport" content="width=device-width, initial-scale=1.0" />`,` <title>${k(e)}</title>`,` </head>`,` <body>`,` <div id="app"></div>`,` <script type="module" src="/src/main.ts"><\/script>`,` </body>`,`</html>`,``].join(`
4
- `)}function I(){return[`import { describe, expect, it } from 'vitest';`,``,`import { greet } from '../src/index.js';`,``,`describe('greet', () => {`,` it('greets the world by default', () => {`,` expect(greet()).toBe('Hello, world!');`,` });`,`});`,``].join(`
5
- `)}function L(e){let t=[[`type`,e.type],[`name`,e.name]];e.scope&&t.push([`scope`,e.scope]),e.description&&t.push([`description`,e.description]),e.author&&t.push([`author`,e.author]),e.license&&t.push([`license`,e.license]),e.homepage&&t.push([`homepage`,e.homepage]);let r=e.repo??e.repoUrl;r&&t.push([`repo`,r]),t.push([`nodeVersion`,e.nodeVersion??`22`]);let i=e.packageManager??`yarn`;t.push([`packageManager`,i]);let a=e.packageManagerVersion??e.yarnVersion??n[i];a&&t.push([`packageManagerVersion`,a]);let o=t.map(([e,t])=>` ${e}: ${O(t)},`).join(`
6
- `),s=e.fmtOxc??e.oxc===!0,c=e.lintOxc??e.oxc===!0;return`import { defineConfig } from '@deltabox/toolchain';
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{projectToPackageJson as t}from"../../shared/src/project.js";import{DEFAULT_PACKAGE_MANAGER_VERSIONS as n,defaultPackageManagerVersion as r}from"../../shared/src/toolchain.js";import{DEFAULT_FMT_RULES as i,DEFAULT_LINT_RULES as a}from"../../shared/src/vite-defaults.js";import"../../shared/src/index.js";import{renderPnpmWorkspace as o,renderYarnrc as s,supportsCatalogs as c}from"./catalogs.js";import{parseTsconfig as l}from"../../tsconfig/src/resolve.js";import{renderMonorepoTsconfig as u,renderTsconfigBase as d,renderTsconfigBuild as f,renderTsconfigDefault as p}from"../../tsconfig/src/templates.js";import"../../tsconfig/src/index.js";import{version as m}from"../../../package.js";import h from"node:fs";import{applyEdits as g,modify as _}from"jsonc-parser";const v={"@deltabox/toolchain":`^${m}`,"@types/node":`^22.10.2`,tsdown:`^0.23.0`,typescript:`^6.0.3`,vite:`^8.3.0`,"vite-plus":`^1.2.0`,vitest:`^5.0.0`},y=v;function b(e,t){if(!e)return;let n=t??r(e);return n?`${e}@${n}`:e}function x(e,t,n=[]){let r=Object.entries(v).filter(([e])=>!n.includes(e));return Object.fromEntries(t?r.map(([e])=>[e,`catalog:`]):r)}function S(e,t){let n=e??`yarn`;return c(n)?n!==`bun`||t:!1}function C(e,t=[]){let n=e??`yarn`;if(n===`yarn`||n===`pnpm`)return Object.fromEntries(Object.entries(v).filter(([e])=>!t.includes(e)))}function w(e,t,n=[]){let r=C(e,n);if(!r)return[];switch(e??`yarn`){case`yarn`:return[{path:`.yarnrc.yml`,content:s({packages:r})}];case`pnpm`:return[{path:`pnpm-workspace.yaml`,content:o({packages:r},t?[`packages/*`]:void 0)}];default:return[]}}function T(e,t){return(e??`yarn`)===`bun`?{packages:t,catalog:v}:t}const E=[`ts`,`mts`,`js`,`mjs`,`cjs`],ee=`ts`;function D(e){return E.includes(e)}function O(e=`ts`){return`dbx.config.${e}`}function k(e){return e===`ts`||e===`mts`?`ts`:`js`}function A(e,t,n){return n||(e===`ts`?`ts`:t===`module`?`mjs`:t===`commonjs`?`cjs`:`js`)}function j(e,t){return e===`cjs`?!1:e===`mjs`||e===`mts`||e!==`js`||t===`module`}function M(t){let n=e.resolve(t);if(h.existsSync(e.join(n,`.git`)))return{fmt:!1,lint:!1};let r=e.dirname(n);for(;;){let t=h.existsSync(e.join(r,`.oxfmtrc.json`)),n=h.existsSync(e.join(r,`.oxlintrc.json`));if(t||n)return{fmt:t,lint:n};if(h.existsSync(e.join(r,`.git`)))break;let i=e.dirname(r);if(i===r)break;r=i}return{fmt:!1,lint:!1}}function N(e){let{tsconfigExtends:t,rootOxc:n,...r}=e;return r}function P(e){let n=e.repo??e.repoUrl;return t({...e.description?{description:e.description}:{},...e.author?{author:e.author}:{},...e.license?{license:e.license}:{},...e.homepage?{homepage:e.homepage}:{},...n?{repo:n}:{}})}const F=(e,t=4)=>`${JSON.stringify(e,null,t)}\n`;function I(e){return`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`).replace(/[\u0000-\u001f\u007f\u2028\u2029]/g,e=>`\\u${e.charCodeAt(0).toString(16).padStart(4,`0`)}`)}'`}function L(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}const R=`./node_modules/oxfmt/configuration_schema.json`,z=`./node_modules/oxlint/configuration_schema.json`;function B(e,t){return`${JSON.stringify({$schema:e,...t},null,4)}\n`}function V(){return[`export function greet(who = 'world'): string {`," return `Hello, ${who}!`;",`}`,``].join(`
2
+ `)}function H(){return[`import { greet } from './index.js';`,``,`const app = document.querySelector<HTMLDivElement>('#app');`,`if (app) app.textContent = greet('world');`,``].join(`
3
+ `)}function U(e){return[`<!doctype html>`,`<html lang="en">`,` <head>`,` <meta charset="UTF-8" />`,` <meta name="viewport" content="width=device-width, initial-scale=1.0" />`,` <title>${L(e)}</title>`,` </head>`,` <body>`,` <div id="app"></div>`,` <script type="module" src="/src/main.ts"><\/script>`,` </body>`,`</html>`,``].join(`
4
+ `)}function W(){return[`import { describe, expect, it } from 'vitest';`,``,`import { greet } from '../src/index.js';`,``,`describe('greet', () => {`,` it('greets the world by default', () => {`,` expect(greet()).toBe('Hello, world!');`,` });`,`});`,``].join(`
5
+ `)}function G(e){let t=[[`type`,e.type],[`name`,e.name]];e.scope&&t.push([`scope`,e.scope]),e.description&&t.push([`description`,e.description]),e.author&&t.push([`author`,e.author]),e.license&&t.push([`license`,e.license]),e.homepage&&t.push([`homepage`,e.homepage]);let n=e.repo??e.repoUrl;n&&t.push([`repo`,n]),t.push([`nodeVersion`,e.nodeVersion??`22`]);let i=e.packageManager??`yarn`;t.push([`packageManager`,i]);let a=e.packageManagerVersion??e.yarnVersion??r(i);a&&t.push([`packageManagerVersion`,a]);let o=t.map(([e,t])=>` ${e}: ${I(t)},`).join(`
6
+ `),s=e.fmtOxc??e.oxc===!0,c=e.lintOxc??e.oxc===!0,l=e.catalogs?` catalogs: {\n packages: {\n${Object.entries(e.catalogs).map(([e,t])=>` ${I(e)}: ${I(t)},`).join(`
7
+ `)}\n },\n },`:void 0,u=[` project: {\n${o}\n },`,...l?[l]:[],...s?[` fmt: { oxc: true },`]:[],...c?[` lint: { oxc: true },`]:[]];return j(e.configExtension??`ts`,e.packageType)?`import { defineConfig } from '@deltabox/toolchain';
7
8
 
8
9
  export default defineConfig({
9
10
  toolchain: {
10
- ${[` project: {\n${o}\n },`,...s?[` fmt: { oxc: true },`]:[],...c?[` lint: { oxc: true },`]:[]].join(`
11
+ ${u.join(`
11
12
  `)}
12
13
  },
13
14
  });
14
- `}function R(e=!1,t=`./tsconfig.default.json`){return D({...t===!1?{}:{extends:t},compilerOptions:{composite:e}})}function z(e){let t=e.kind===`application`,n=e.oxc!==!1&&e.includeConfig!==!1,a=n&&e.rootOxc?.fmt!==!0,o=n&&e.rootOxc?.lint!==!0,s={name:e.scope?`${e.scope}/${e.name}`:e.name,version:`0.1.0`,private:!0,type:`module`,...E(e),scripts:t?{dev:`vite`,build:`vite build`,preview:`vite preview`,format:`dbx fmt`,lint:`dbx lint --fix`,test:`vitest run`,typecheck:`tsc -p tsconfig.json --noEmit`}:{build:`tsdown`,format:`dbx fmt`,lint:`dbx lint --fix`,test:`vitest run`,typecheck:`tsc -p tsconfig.json --noEmit`},devDependencies:b(e.packageManager,x(e.packageManager,!1),t?[`tsdown`]:[]),...y(e.packageManager,e.packageManagerVersion??e.yarnVersion)?{packageManager:y(e.packageManager,e.packageManagerVersion??e.yarnVersion)}:{},engines:{node:e.nodeVersion?`>=${e.nodeVersion}`:`>=22`}};return[...e.includeConfig===!1?[]:[{path:`dbx.config.ts`,content:L({...e,type:e.type??`project`,fmtOxc:a,lintOxc:o})}],{path:`package.json`,content:D(s)},...t?[{path:`index.html`,content:F(e.name)},{path:`src/main.ts`,content:P()}]:[],{path:`src/index.ts`,content:N()},{path:`tests/index.test.ts`,content:I()},{path:`tsconfig.base.json`,content:u(T(e),e.tsconfigExtends?.base)},{path:`tsconfig.default.json`,content:f(T(e),e.tsconfigExtends?.default)},{path:`tsconfig.build.json`,content:d(T(e),e.tsconfigExtends?.build)},{path:`tsconfig.json`,content:R()},...a?[{path:`.oxfmtrc.json`,content:M(A,r)}]:[],...o?[{path:`.oxlintrc.json`,content:M(j,i)}]:[],{path:`.gitignore`,content:G()},{path:`README.md`,content:`# ${e.name}\n`},...S(e.packageManager,!1,t?[`tsdown`]:[])]}function B(e){let t=e.oxc!==!1&&e.includeConfig!==!1,n={name:e.name,version:`0.1.0`,private:!0,type:`module`,...E(e),scripts:{build:`dbx run --filter "./packages/*" build`,test:`dbx run --filter "./packages/*" test`,typecheck:`dbx run --filter "./packages/*" typecheck`,format:`dbx fmt`,lint:`dbx lint --fix`},workspaces:C(e.packageManager,e.workspaceGlobs??[`packages/*`]),devDependencies:b(e.packageManager,x(e.packageManager,!0)),...y(e.packageManager,e.packageManagerVersion??e.yarnVersion)?{packageManager:y(e.packageManager,e.packageManagerVersion??e.yarnVersion)}:{},engines:{node:e.nodeVersion?`>=${e.nodeVersion}`:`>=22`}};return[...e.includeConfig===!1?[]:[{path:`dbx.config.ts`,content:L({...e,type:e.type??`monorepo-root`,oxc:t})}],{path:`package.json`,content:D(n)},{path:`tsconfig.base.json`,content:u(T(e),e.tsconfigExtends?.base)},{path:`tsconfig.workspaces.json`,content:l({scope:e.scope??e.name,workspaces:e.workspaces})},{path:`tsconfig.json`,content:D({extends:`./tsconfig.workspaces.json`,compilerOptions:{composite:!1},files:[]})},...t?[{path:`.oxfmtrc.json`,content:M(A,r)},{path:`.oxlintrc.json`,content:M(j,i)}]:[],{path:`.gitignore`,content:G()},{path:`README.md`,content:`# ${e.name}\n`},...S(e.packageManager,!0)]}function V(t){let n=t.replace(/\\/g,`/`).replace(/^\.?\//,``).replace(/\/+$/,``);if(!n||n===`.`||e.isAbsolute(t)||/^[a-zA-Z]:/.test(t)||n.split(`/`).includes(`..`))throw Error(`invalid workspace directory "${t}" (must be relative to the root).`);return n}function H(e){let t=e.match(/^([ \t]+)\S/m)?.[1]??` `,n=!t.includes(` `);return{insertSpaces:n,tabSize:n?t.length:1}}function U(t,n,r,i=`tsconfig.workspaces.json`){let a=V(n.dir),o=e.resolve(t,i);if(!m.existsSync(o))return!1;let s=m.readFileSync(o,`utf-8`),l;try{l=c(s)}catch{return!1}let u=Array.isArray(l.references)?l.references:void 0,d=l.compilerOptions&&typeof l.compilerOptions==`object`?l.compilerOptions:{},f=/* @__PURE__ */ new Set,p=/* @__PURE__ */ new Map;if(r){let e=d.paths&&typeof d.paths==`object`?d.paths:{};for(let t of[`${r}/${n.alias}`,`${r}/${n.alias}/*`]){let n=e[t],r=Array.isArray(n)?n[0]:void 0,i=typeof r==`string`?r.match(/^\.\/(.+)\/src\/(?:index\.ts|\*)$/):void 0;i?.[1]&&f.add(i[1]);let o=[t.endsWith(`/*`)?`./${a}/src/*`:`./${a}/src/index.ts`];e[t]=o,p.set(t,o)}d.paths=e}l.compilerOptions=d;let _=`./${a}/tsconfig.json`,v=new Set([...f].filter(e=>e!==a).map(e=>`./${e}/tsconfig.json`)),y=(Array.isArray(l.references)?l.references:[]).filter(e=>!v.has(e.path));y.some(e=>e.path===_)||y.push({path:_}),l.references=y;try{let e=H(s),t=s;for(let[n,r]of p)t=h(t,g(t,[`compilerOptions`,`paths`,n],r,{formattingOptions:e}));let n=u??[],r=n.findIndex(e=>e.path===_),i=n.map((e,t)=>typeof e.path==`string`&&v.has(e.path)?t:-1).filter(e=>e>=0);if(i.length>0){r===-1&&(t=h(t,g(t,[`references`,i[0],`path`],_,{formattingOptions:e})));for(let n of i.filter((e,t)=>r!==-1||t>0).sort((e,t)=>t-e))t=h(t,g(t,[`references`,n],void 0,{formattingOptions:e}))}else r===-1&&(t=u===void 0?h(t,g(t,[`references`],[{path:_}],{formattingOptions:e})):h(t,g(t,[`references`,n.length],{path:_},{formattingOptions:e})));m.writeFileSync(o,t,`utf-8`)}catch{m.writeFileSync(o,`${JSON.stringify(l,null,4)}\n`,`utf-8`)}return!0}function W(e){let t=e.useCatalog===!0&&x(e.packageManager,!0)?b(e.packageManager,!0):{..._},n={name:e.scope?`${e.scope}/${e.wsName}`:e.wsName,version:`0.1.0`,type:`module`,...E(e),main:`./dist/index.js`,module:`./dist/index.js`,types:`./dist/index.d.ts`,exports:{".":{types:`./dist/index.d.ts`,import:`./dist/index.js`},"./package.json":`./package.json`},sideEffects:!1,files:[`dist`],scripts:{build:`tsdown`,format:`dbx fmt`,lint:`dbx lint --fix`,test:`vitest run`,typecheck:`tsc -p tsconfig.build.json --noEmit`},devDependencies:t,...e.nodeVersion?{engines:{node:`>=${e.nodeVersion}`}}:{},publishConfig:{access:`public`,provenance:!0}},r=e.wsDir.split(`/`).length;return[...e.includeConfig===!1?[]:[{path:`dbx.config.ts`,content:L({...e,name:e.wsName,type:e.type??`monorepo-workspace`})}],{path:`package.json`,content:D(n)},{path:`src/index.ts`,content:N()},{path:`tests/index.test.ts`,content:I()},{path:`tsconfig.default.json`,content:D({...e.tsconfigExtends?.default===!1?{}:{extends:e.tsconfigExtends?.default??`${`../`.repeat(r)}tsconfig.base.json`},compilerOptions:{module:`NodeNext`,moduleResolution:`NodeNext`,types:[`node`]},include:[`src`,`tests`,`tsdown.config.ts`,`vitest.config.ts`]})},{path:`tsconfig.build.json`,content:R(!1,e.tsconfigExtends?.build)},{path:`tsconfig.json`,content:R()},{path:`tsdown.config.ts`,content:`import { defineConfig } from 'tsdown';
15
+ `:`/** @type {import('@deltabox/toolchain').DbxConfig} */
16
+ module.exports = {
17
+ toolchain: {
18
+ ${u.join(`
19
+ `)}
20
+ },
21
+ };
22
+ `}function K(e=!1,t=`./tsconfig.default.json`){return F({...t===!1?{}:{extends:t},compilerOptions:{composite:e}})}function q(e){let t=e.kind===`application`,n=e.oxc!==!1&&e.includeConfig!==!1,r=n&&e.rootOxc?.fmt!==!0,o=n&&e.rootOxc?.lint!==!0,s=C(e.packageManager,t?[`tsdown`]:[]),c={name:e.scope?`${e.scope}/${e.name}`:e.name,version:`0.1.0`,private:!0,type:`module`,...P(e),scripts:t?{dev:`vite`,build:`vite build`,preview:`vite preview`,format:`dbx fmt`,lint:`dbx lint --fix`,test:`vitest run`,typecheck:`tsc -p tsconfig.json --noEmit`}:{build:`tsdown`,format:`dbx fmt`,lint:`dbx lint --fix`,test:`vitest run`,typecheck:`tsc -p tsconfig.json --noEmit`},devDependencies:x(e.packageManager,S(e.packageManager,!1),t?[`tsdown`]:[]),...b(e.packageManager,e.packageManagerVersion??e.yarnVersion)?{packageManager:b(e.packageManager,e.packageManagerVersion??e.yarnVersion)}:{},engines:{node:e.nodeVersion?`>=${e.nodeVersion}`:`>=22`}};return[...e.includeConfig===!1?[]:[{path:`dbx.config.ts`,content:G({...e,type:e.type??`project`,fmtOxc:r,lintOxc:o,...s?{catalogs:s}:{}})}],{path:`package.json`,content:F(c)},...t?[{path:`index.html`,content:U(e.name)},{path:`src/main.ts`,content:H()}]:[],{path:`src/index.ts`,content:V()},{path:`tests/index.test.ts`,content:W()},{path:`tsconfig.base.json`,content:d(N(e),e.tsconfigExtends?.base)},{path:`tsconfig.default.json`,content:p(N(e),e.tsconfigExtends?.default)},{path:`tsconfig.build.json`,content:f(N(e),e.tsconfigExtends?.build)},{path:`tsconfig.json`,content:K()},...r?[{path:`.oxfmtrc.json`,content:B(R,i)}]:[],...o?[{path:`.oxlintrc.json`,content:B(z,a)}]:[],{path:`.gitignore`,content:$()},{path:`README.md`,content:`# ${e.name}\n`},...w(e.packageManager,!1,t?[`tsdown`]:[])]}function J(e){let t=e.oxc!==!1&&e.includeConfig!==!1,n=C(e.packageManager),r={name:e.name,version:`0.1.0`,private:!0,type:`module`,...P(e),scripts:{build:`dbx run --filter "./packages/*" build`,test:`dbx run --filter "./packages/*" test`,typecheck:`dbx run --filter "./packages/*" typecheck`,format:`dbx fmt`,lint:`dbx lint --fix`},workspaces:T(e.packageManager,e.workspaceGlobs??[`packages/*`]),devDependencies:x(e.packageManager,S(e.packageManager,!0)),...b(e.packageManager,e.packageManagerVersion??e.yarnVersion)?{packageManager:b(e.packageManager,e.packageManagerVersion??e.yarnVersion)}:{},engines:{node:e.nodeVersion?`>=${e.nodeVersion}`:`>=22`}};return[...e.includeConfig===!1?[]:[{path:`dbx.config.ts`,content:G({...e,type:e.type??`monorepo-root`,oxc:t,...n?{catalogs:n}:{}})}],{path:`package.json`,content:F(r)},{path:`tsconfig.base.json`,content:d(N(e),e.tsconfigExtends?.base)},{path:`tsconfig.workspaces.json`,content:u({scope:e.scope??e.name,workspaces:e.workspaces})},{path:`tsconfig.json`,content:F({extends:`./tsconfig.workspaces.json`,compilerOptions:{composite:!1},files:[]})},...t?[{path:`.oxfmtrc.json`,content:B(R,i)},{path:`.oxlintrc.json`,content:B(z,a)}]:[],{path:`.gitignore`,content:$()},{path:`README.md`,content:`# ${e.name}\n`},...w(e.packageManager,!0)]}function Y(t){let n=t.replace(/\\/g,`/`).replace(/^\.?\//,``).replace(/\/+$/,``);if(!n||n===`.`||e.isAbsolute(t)||/^[a-zA-Z]:/.test(t)||n.split(`/`).includes(`..`))throw Error(`invalid workspace directory "${t}" (must be relative to the root).`);return n}function X(e){let t=e.match(/^([ \t]+)\S/m)?.[1]??` `,n=!t.includes(` `);return{insertSpaces:n,tabSize:n?t.length:1}}function Z(t,n,r,i=`tsconfig.workspaces.json`){let a=Y(n.dir),o=e.resolve(t,i);if(!h.existsSync(o))return!1;let s=h.readFileSync(o,`utf-8`),c;try{c=l(s)}catch{return!1}let u=Array.isArray(c.references)?c.references:void 0,d=c.compilerOptions&&typeof c.compilerOptions==`object`?c.compilerOptions:{},f=/* @__PURE__ */ new Set,p=/* @__PURE__ */ new Map;if(r){let e=d.paths&&typeof d.paths==`object`?d.paths:{};for(let t of[`${r}/${n.alias}`,`${r}/${n.alias}/*`]){let n=e[t],r=Array.isArray(n)?n[0]:void 0,i=typeof r==`string`?r.match(/^\.\/(.+)\/src\/(?:index\.ts|\*)$/):void 0;i?.[1]&&f.add(i[1]);let o=[t.endsWith(`/*`)?`./${a}/src/*`:`./${a}/src/index.ts`];e[t]=o,p.set(t,o)}d.paths=e}c.compilerOptions=d;let m=`./${a}/tsconfig.json`,v=new Set([...f].filter(e=>e!==a).map(e=>`./${e}/tsconfig.json`)),y=(Array.isArray(c.references)?c.references:[]).filter(e=>!v.has(e.path));y.some(e=>e.path===m)||y.push({path:m}),c.references=y;try{let e=X(s),t=s;for(let[n,r]of p)t=g(t,_(t,[`compilerOptions`,`paths`,n],r,{formattingOptions:e}));let n=u??[],r=n.findIndex(e=>e.path===m),i=n.map((e,t)=>typeof e.path==`string`&&v.has(e.path)?t:-1).filter(e=>e>=0);if(i.length>0){r===-1&&(t=g(t,_(t,[`references`,i[0],`path`],m,{formattingOptions:e})));for(let n of i.filter((e,t)=>r!==-1||t>0).sort((e,t)=>t-e))t=g(t,_(t,[`references`,n],void 0,{formattingOptions:e}))}else r===-1&&(t=u===void 0?g(t,_(t,[`references`],[{path:m}],{formattingOptions:e})):g(t,_(t,[`references`,n.length],{path:m},{formattingOptions:e})));h.writeFileSync(o,t,`utf-8`)}catch{h.writeFileSync(o,`${JSON.stringify(c,null,4)}\n`,`utf-8`)}return!0}function Q(e){let t=e.useCatalog===!0&&S(e.packageManager,!0)?x(e.packageManager,!0):{...v},n={name:e.scope?`${e.scope}/${e.wsName}`:e.wsName,version:`0.1.0`,type:`module`,...P(e),main:`./dist/index.js`,module:`./dist/index.js`,types:`./dist/index.d.ts`,exports:{".":{types:`./dist/index.d.ts`,import:`./dist/index.js`},"./package.json":`./package.json`},sideEffects:!1,files:[`dist`],scripts:{build:`tsdown`,format:`dbx fmt`,lint:`dbx lint --fix`,test:`vitest run`,typecheck:`tsc -p tsconfig.build.json --noEmit`},devDependencies:t,...e.nodeVersion?{engines:{node:`>=${e.nodeVersion}`}}:{},publishConfig:{access:`public`,provenance:!0}},r=e.wsDir.split(`/`).length;return[...e.includeConfig===!1?[]:[{path:`dbx.config.ts`,content:G({...e,name:e.wsName,type:e.type??`monorepo-workspace`})}],{path:`package.json`,content:F(n)},{path:`src/index.ts`,content:V()},{path:`tests/index.test.ts`,content:W()},{path:`tsconfig.default.json`,content:F({...e.tsconfigExtends?.default===!1?{}:{extends:e.tsconfigExtends?.default??`${`../`.repeat(r)}tsconfig.base.json`},compilerOptions:{module:`NodeNext`,moduleResolution:`NodeNext`,types:[`node`]},include:[`src`,`tests`,`tsdown.config.ts`,`vitest.config.ts`]})},{path:`tsconfig.build.json`,content:K(!1,e.tsconfigExtends?.build)},{path:`tsconfig.json`,content:K()},{path:`tsdown.config.ts`,content:`import { defineConfig } from 'tsdown';
15
23
 
16
24
  import { baseTsdownConfig } from '@deltabox/toolchain/tsdown';
17
25
 
@@ -21,5 +29,5 @@ export default defineConfig({
21
29
  // Keep the explicit package.json exports (types + import conditions).
22
30
  exports: false,
23
31
  });
24
- `}]}function G(){return(/* @__PURE__ */ `node_modules/,dist/,coverage/,.vite/,*.tsbuildinfo,,.env,.env.*,!.env.example,!.env.example.*,,.DS_Store,,# Toolchain state; only the manifest is committed,.dbx/toolchain/*,!.dbx/toolchain/manifest.json,,# Yarn 4,.pnp.*,.yarn/*,!.yarn/patches,!.yarn/plugins,!.yarn/releases,!.yarn/sdks,!.yarn/versions,`.split(`,`)).join(`
25
- `)}function K(t,n){let r=process.platform===`win32`?t.toLowerCase():t,i=process.platform===`win32`?n.toLowerCase():n;return i===r||i.startsWith(`${r}${e.sep}`)}function q(t,n=process.cwd(),r={}){let i=e.resolve(n),a=t.map(t=>e.resolve(i,t.path)),o=/* @__PURE__ */ new Map;for(let t of a){if(!K(i,t))throw Error(`refusing to write outside ${i}: ${t}`);let n=process.platform===`win32`?t.toLowerCase():t,r=o.get(n);if(r!==void 0)throw Error(`refusing to write duplicate file(s): ${r} and ${e.relative(i,t)}`);o.set(n,e.relative(i,t))}if(r.force!==!0){let t=a.filter(e=>m.existsSync(e));if(t.length>0)throw Error(`refusing to overwrite existing file(s): ${t.map(t=>e.relative(i,t)).join(`, `)} (use --force to overwrite).`)}let s=[];for(let[n,r]of a.entries())m.mkdirSync(e.dirname(r),{recursive:!0}),m.writeFileSync(r,t[n].content,`utf-8`),s.push(r);return s}export{n as DEFAULT_PACKAGE_MANAGER_VERSIONS,v as SCAFFOLD_CATALOG,B as createMonorepoRootFiles,z as createRootProjectFiles,W as createWorkspaceFiles,w as findRootOxcFiles,P as renderApplicationEntry,F as renderApplicationHtml,G as renderGitignore,N as renderSourceEntry,I as renderSourceTest,L as renderToolchainConfig,R as renderWorkspaceTsconfig,U as upsertWorkspaceTsconfig,V as workspaceDirForTsconfig,q as writeGeneratedFiles};
32
+ `}]}function $(){return(/* @__PURE__ */ `node_modules/,dist/,coverage/,.vite/,*.tsbuildinfo,,.env,.env.*,!.env.example,!.env.example.*,,.DS_Store,,# Toolchain state; only the manifest is committed,.dbx/toolchain/*,!.dbx/toolchain/manifest.json,,# Yarn 4,.pnp.*,.yarn/*,!.yarn/patches,!.yarn/plugins,!.yarn/releases,!.yarn/sdks,!.yarn/versions,`.split(`,`)).join(`
33
+ `)}function te(t,n){let r=process.platform===`win32`?t.toLowerCase():t,i=process.platform===`win32`?n.toLowerCase():n;return i===r||i.startsWith(`${r}${e.sep}`)}function ne(t,n=process.cwd(),r={}){let i=e.resolve(n),a=t.map(t=>e.resolve(i,t.path)),o=/* @__PURE__ */ new Map;for(let t of a){if(!te(i,t))throw Error(`refusing to write outside ${i}: ${t}`);let n=process.platform===`win32`?t.toLowerCase():t,r=o.get(n);if(r!==void 0)throw Error(`refusing to write duplicate file(s): ${r} and ${e.relative(i,t)}`);o.set(n,e.relative(i,t))}if(r.force!==!0){let t=a.filter(e=>h.existsSync(e));if(t.length>0)throw Error(`refusing to overwrite existing file(s): ${t.map(t=>e.relative(i,t)).join(`, `)} (use --force to overwrite).`)}let s=[];for(let[n,r]of a.entries())h.mkdirSync(e.dirname(r),{recursive:!0}),h.writeFileSync(r,t[n].content,`utf-8`),s.push(r);return s}export{E as CONFIG_EXTENSIONS,ee as DEFAULT_CONFIG_EXTENSION,n as DEFAULT_PACKAGE_MANAGER_VERSIONS,y as SCAFFOLD_CATALOG,O as configFileName,k as configLanguage,j as configUsesEsm,J as createMonorepoRootFiles,q as createRootProjectFiles,Q as createWorkspaceFiles,M as findRootOxcFiles,D as isConfigExtension,H as renderApplicationEntry,U as renderApplicationHtml,$ as renderGitignore,V as renderSourceEntry,W as renderSourceTest,G as renderToolchainConfig,K as renderWorkspaceTsconfig,A as resolveConfigExtension,C as scaffoldCatalog,Z as upsertWorkspaceTsconfig,Y as workspaceDirForTsconfig,ne as writeGeneratedFiles};
@@ -0,0 +1,32 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ //#region packages/shared/src/config-schema/alias-rewrite.d.ts
4
+ /**
5
+ * URL-rewrite-style rewriting for auto-wired tsconfig alias keys.
6
+ *
7
+ * `rewriteAlias` only touches the `paths` keys that auto-wiring generated; any
8
+ * key you wrote yourself is preserved. A pattern is matched against a generated
9
+ * alias key and the replacement is applied with `String.prototype.replace`, so
10
+ * `$1`, `$2`, ... (and `$&`) work as capture-group references.
11
+ *
12
+ * A string pattern is a regular-expression source (use `^`/`$` for whole-key
13
+ * matches), a `RegExp` is used as-is, and an array of patterns tries each one in
14
+ * order until one matches. When `rewriteAlias` is an array of rules, the rules
15
+ * are applied in order and the first matching rule wins.
16
+ */
17
+ /** One pattern (or list of patterns) an alias rewrite can match. */
18
+ export type ToolchainTsconfigAliasRewriteKey = string | RegExp | Array<string | RegExp>;
19
+ /** A single ordered alias rewrite rule. */
20
+ export interface ToolchainTsconfigAliasRewriteRule {
21
+ /** Pattern(s) matched against generated alias keys. */
22
+ pattern: ToolchainTsconfigAliasRewriteKey;
23
+ /** Replacement for the matched key (`$1`, `$2`, ... refer to capture groups). */
24
+ replacement: string;
25
+ }
26
+ /**
27
+ * Auto-alias rewrite: either a `Record<string, string>` map of string patterns
28
+ * to replacements, or an ordered array of {@link ToolchainTsconfigAliasRewriteRule}
29
+ * (which additionally accepts `RegExp` patterns and arrays of patterns).
30
+ */
31
+ export type ToolchainTsconfigAliasRewrite = Record<string, string> | ToolchainTsconfigAliasRewriteRule[];
32
+ //#endregion
@@ -1 +1 @@
1
- import"node:path";import"node:url";import.meta.url;import{externalConfigSchema as e}from"./external.js";import{withEnabled as t}from"./meta.js";import{z as n}from"zod";const r=e(`Biome configuration options.`,`BiomeConfig`),i=t(n.object({vscode:n.boolean().describe(`Write the Biome VS Code settings (default true).`).optional(),overrides:r.describe("Deep-merged over the generated `biome.json` (arrays union).").optional()})).describe("Biome config generation (for consumers that still want a `biome.json`).").meta({id:`ToolchainBiomeConfig`,deprecated:!0,deprecationMessage:"use `toolchain.fmt.biome` / `toolchain.lint.biome`. Still writes `biome.json`."});export{r as biomeConfigOptionsSchema,i as biomeConfigSchema};
1
+ import"node:path";import"node:url";import.meta.url;import{externalConfigSchema as e}from"./external.js";import{withEnabled as t}from"./meta.js";import{z as n}from"zod";const r=e(`Biome configuration options.`,`BiomeConfig`),i=t(n.object({vscode:n.boolean().describe(`Write the Biome VS Code settings (default true).`).optional(),overrides:r.describe("Deep-merged over the generated `biome.json` (arrays union; `$remove:`/`$reset` prune or replace them).").optional()})).describe("Biome config generation (for consumers that still want a `biome.json`).").meta({id:`ToolchainBiomeConfig`,deprecated:!0,deprecationMessage:"use `toolchain.fmt.biome` / `toolchain.lint.biome`. Still writes `biome.json`."});export{r as biomeConfigOptionsSchema,i as biomeConfigSchema};