@deltabox/toolchain 0.0.0-stage → 1.1.21

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 (237) hide show
  1. package/CHANGELOG.md +314 -0
  2. package/LICENSE +373 -0
  3. package/README.md +235 -2
  4. package/dist/_virtual/_rolldown/runtime.js +1 -0
  5. package/dist/biome.d.ts +4 -0
  6. package/dist/biome.js +1 -0
  7. package/dist/changelog.d.ts +17 -0
  8. package/dist/changelog.js +1 -0
  9. package/dist/cli/commands/index.js +1 -0
  10. package/dist/cli/commands/projects.js +1 -0
  11. package/dist/cli/commands/providers.js +1 -0
  12. package/dist/cli/commands/reset.js +1 -0
  13. package/dist/cli/commands/shared.js +1 -0
  14. package/dist/cli/commands/sync.js +1 -0
  15. package/dist/cli/commands/watch.js +1 -0
  16. package/dist/cli/context.js +1 -0
  17. package/dist/cli/index.d.ts +15 -0
  18. package/dist/cli/index.js +2 -0
  19. package/dist/cli/options.js +1 -0
  20. package/dist/cli/register.d.ts +14 -0
  21. package/dist/cli/register.js +1 -0
  22. package/dist/config.d.ts +18 -0
  23. package/dist/config.js +1 -0
  24. package/dist/core.d.ts +13 -0
  25. package/dist/core.js +1 -0
  26. package/dist/index.d.ts +31 -0
  27. package/dist/index.js +1 -0
  28. package/dist/migrate.d.ts +15 -0
  29. package/dist/migrate.js +1 -0
  30. package/dist/package.js +1 -0
  31. package/dist/packages/biome/src/config.js +1 -0
  32. package/dist/packages/biome/src/index.d.ts +34 -0
  33. package/dist/packages/biome/src/index.js +1 -0
  34. package/dist/packages/biome/src/vscode-settings.js +1 -0
  35. package/dist/packages/changelog/src/cli/index.d.ts +8 -0
  36. package/dist/packages/changelog/src/cli/index.js +1 -0
  37. package/dist/packages/changelog/src/index.d.ts +19 -0
  38. package/dist/packages/changelog/src/index.js +1 -0
  39. package/dist/packages/changelog/src/run-workflows.d.ts +35 -0
  40. package/dist/packages/changelog/src/run-workflows.js +1 -0
  41. package/dist/packages/changelog/src/run.d.ts +14 -0
  42. package/dist/packages/changelog/src/run.js +1 -0
  43. package/dist/packages/changelog/src/sync.d.ts +18 -0
  44. package/dist/packages/changelog/src/sync.js +1 -0
  45. package/dist/packages/changelog/src/templates.d.ts +27 -0
  46. package/dist/packages/changelog/src/templates.js +27 -0
  47. package/dist/packages/changelog/src/utils/args.d.ts +7 -0
  48. package/dist/packages/changelog/src/utils/args.js +1 -0
  49. package/dist/packages/changelog/src/utils/format.d.ts +27 -0
  50. package/dist/packages/changelog/src/utils/format.js +5 -0
  51. package/dist/packages/changelog/src/utils/git.d.ts +9 -0
  52. package/dist/packages/changelog/src/utils/git.js +1 -0
  53. package/dist/packages/changelog/src/utils/packages.js +4 -0
  54. package/dist/packages/changelog/src/utils/reformat.d.ts +9 -0
  55. package/dist/packages/changelog/src/utils/reformat.js +6 -0
  56. package/dist/packages/changelog/src/utils/repo.js +1 -0
  57. package/dist/packages/changelog/src/utils/summary.d.ts +7 -0
  58. package/dist/packages/changelog/src/utils/summary.js +1 -0
  59. package/dist/packages/changelog/src/utils/types.d.ts +58 -0
  60. package/dist/packages/changelog/src/utils/version.d.ts +6 -0
  61. package/dist/packages/changelog/src/utils/version.js +14 -0
  62. package/dist/packages/changelog/src/utils/write.js +1 -0
  63. package/dist/packages/changelog/src/workflows.d.ts +53 -0
  64. package/dist/packages/changelog/src/workflows.js +5 -0
  65. package/dist/packages/config/src/cli/index.d.ts +28 -0
  66. package/dist/packages/config/src/cli/index.js +1 -0
  67. package/dist/packages/config/src/collect.d.ts +19 -0
  68. package/dist/packages/config/src/collect.js +1 -0
  69. package/dist/packages/config/src/config-json.d.ts +33 -0
  70. package/dist/packages/config/src/config-json.js +1 -0
  71. package/dist/packages/config/src/engine.d.ts +56 -0
  72. package/dist/packages/config/src/engine.js +1 -0
  73. package/dist/packages/config/src/env-file.d.ts +33 -0
  74. package/dist/packages/config/src/env-file.js +3 -0
  75. package/dist/packages/config/src/env.d.ts +31 -0
  76. package/dist/packages/config/src/env.js +1 -0
  77. package/dist/packages/config/src/generators/cli.d.ts +78 -0
  78. package/dist/packages/config/src/generators/cli.js +1 -0
  79. package/dist/packages/config/src/generators/env.d.ts +42 -0
  80. package/dist/packages/config/src/generators/env.js +23 -0
  81. package/dist/packages/config/src/generators/index.d.ts +8 -0
  82. package/dist/packages/config/src/generators/index.js +1 -0
  83. package/dist/packages/config/src/generators/json.d.ts +24 -0
  84. package/dist/packages/config/src/generators/json.js +1 -0
  85. package/dist/packages/config/src/generators/markdown.d.ts +77 -0
  86. package/dist/packages/config/src/generators/markdown.js +27 -0
  87. package/dist/packages/config/src/generators/types.d.ts +32 -0
  88. package/dist/packages/config/src/generators/types.js +1 -0
  89. package/dist/packages/config/src/index.d.ts +21 -0
  90. package/dist/packages/config/src/index.js +1 -0
  91. package/dist/packages/config/src/root.d.ts +11 -0
  92. package/dist/packages/config/src/root.js +1 -0
  93. package/dist/packages/config/src/schema.d.ts +34 -0
  94. package/dist/packages/config/src/schema.js +1 -0
  95. package/dist/packages/config/src/types.d.ts +75 -0
  96. package/dist/packages/config/src/types.js +1 -0
  97. package/dist/packages/core/src/graph.d.ts +55 -0
  98. package/dist/packages/core/src/graph.js +1 -0
  99. package/dist/packages/core/src/index.d.ts +16 -0
  100. package/dist/packages/core/src/index.js +1 -0
  101. package/dist/packages/core/src/loader.d.ts +27 -0
  102. package/dist/packages/core/src/loader.js +1 -0
  103. package/dist/packages/core/src/manifest.d.ts +17 -0
  104. package/dist/packages/core/src/manifest.js +1 -0
  105. package/dist/packages/core/src/project-type.d.ts +14 -0
  106. package/dist/packages/core/src/project-type.js +1 -0
  107. package/dist/packages/core/src/reset.d.ts +51 -0
  108. package/dist/packages/core/src/reset.js +1 -0
  109. package/dist/packages/core/src/select.d.ts +32 -0
  110. package/dist/packages/core/src/select.js +1 -0
  111. package/dist/packages/core/src/sync.d.ts +42 -0
  112. package/dist/packages/core/src/sync.js +1 -0
  113. package/dist/packages/core/src/vscode.d.ts +27 -0
  114. package/dist/packages/core/src/vscode.js +1 -0
  115. package/dist/packages/core/src/watch.d.ts +17 -0
  116. package/dist/packages/core/src/watch.js +1 -0
  117. package/dist/packages/migrate/src/biome.d.ts +18 -0
  118. package/dist/packages/migrate/src/biome.js +2 -0
  119. package/dist/packages/migrate/src/check.d.ts +14 -0
  120. package/dist/packages/migrate/src/check.js +1 -0
  121. package/dist/packages/migrate/src/cli/index.d.ts +12 -0
  122. package/dist/packages/migrate/src/cli/index.js +1 -0
  123. package/dist/packages/migrate/src/dprint.d.ts +18 -0
  124. package/dist/packages/migrate/src/dprint.js +1 -0
  125. package/dist/packages/migrate/src/eslint.d.ts +24 -0
  126. package/dist/packages/migrate/src/eslint.js +1 -0
  127. package/dist/packages/migrate/src/index.d.ts +14 -0
  128. package/dist/packages/migrate/src/index.js +1 -0
  129. package/dist/packages/migrate/src/oxfmt-map.d.ts +28 -0
  130. package/dist/packages/migrate/src/oxfmt-map.js +1 -0
  131. package/dist/packages/migrate/src/oxlint-map.d.ts +22 -0
  132. package/dist/packages/migrate/src/oxlint-map.js +1 -0
  133. package/dist/packages/migrate/src/prettier.d.ts +20 -0
  134. package/dist/packages/migrate/src/prettier.js +2 -0
  135. package/dist/packages/migrate/src/registry.d.ts +26 -0
  136. package/dist/packages/migrate/src/registry.js +1 -0
  137. package/dist/packages/migrate/src/types.d.ts +75 -0
  138. package/dist/packages/migrate/src/vite-target.d.ts +31 -0
  139. package/dist/packages/migrate/src/vite-target.js +5 -0
  140. package/dist/packages/project/src/cli/index.d.ts +8 -0
  141. package/dist/packages/project/src/cli/index.js +1 -0
  142. package/dist/packages/project/src/config.d.ts +55 -0
  143. package/dist/packages/project/src/config.js +1 -0
  144. package/dist/packages/project/src/index.d.ts +10 -0
  145. package/dist/packages/project/src/index.js +1 -0
  146. package/dist/packages/project/src/typescript.d.ts +66 -0
  147. package/dist/packages/project/src/typescript.js +22 -0
  148. package/dist/packages/shared/src/config-schema.d.ts +2039 -0
  149. package/dist/packages/shared/src/config-schema.js +1 -0
  150. package/dist/packages/shared/src/fs-utils.d.ts +18 -0
  151. package/dist/packages/shared/src/fs-utils.js +1 -0
  152. package/dist/packages/shared/src/index.d.ts +17 -0
  153. package/dist/packages/shared/src/index.js +1 -0
  154. package/dist/packages/shared/src/object-utils.d.ts +15 -0
  155. package/dist/packages/shared/src/object-utils.js +1 -0
  156. package/dist/packages/shared/src/provider.d.ts +66 -0
  157. package/dist/packages/shared/src/provider.js +1 -0
  158. package/dist/packages/shared/src/run.d.ts +26 -0
  159. package/dist/packages/shared/src/run.js +1 -0
  160. package/dist/packages/shared/src/string-utils.d.ts +52 -0
  161. package/dist/packages/shared/src/string-utils.js +3 -0
  162. package/dist/packages/shared/src/template.d.ts +53 -0
  163. package/dist/packages/shared/src/template.js +1 -0
  164. package/dist/packages/shared/src/toolchain.d.ts +159 -0
  165. package/dist/packages/shared/src/toolchain.js +1 -0
  166. package/dist/packages/shared/src/types.d.ts +100 -0
  167. package/dist/packages/shared/src/yaml.d.ts +17 -0
  168. package/dist/packages/shared/src/yaml.js +5 -0
  169. package/dist/packages/template/src/builtin.d.ts +10 -0
  170. package/dist/packages/template/src/builtin.js +1 -0
  171. package/dist/packages/template/src/cli/index.d.ts +8 -0
  172. package/dist/packages/template/src/cli/index.js +1 -0
  173. package/dist/packages/template/src/index.d.ts +10 -0
  174. package/dist/packages/template/src/index.js +1 -0
  175. package/dist/packages/template/src/local.d.ts +20 -0
  176. package/dist/packages/template/src/local.js +1 -0
  177. package/dist/packages/template/src/online.d.ts +17 -0
  178. package/dist/packages/template/src/online.js +1 -0
  179. package/dist/packages/template/src/registry.d.ts +48 -0
  180. package/dist/packages/template/src/registry.js +1 -0
  181. package/dist/packages/template/src/scaffold.d.ts +25 -0
  182. package/dist/packages/template/src/scaffold.js +1 -0
  183. package/dist/packages/template/src/types.d.ts +59 -0
  184. package/dist/packages/tsconfig/src/cli/generate/index.d.ts +35 -0
  185. package/dist/packages/tsconfig/src/cli/generate/index.js +1 -0
  186. package/dist/packages/tsconfig/src/cli/generate/utils.d.ts +43 -0
  187. package/dist/packages/tsconfig/src/cli/generate/utils.js +1 -0
  188. package/dist/packages/tsconfig/src/cli/index.d.ts +11 -0
  189. package/dist/packages/tsconfig/src/cli/index.js +1 -0
  190. package/dist/packages/tsconfig/src/index.d.ts +10 -0
  191. package/dist/packages/tsconfig/src/index.js +1 -0
  192. package/dist/packages/tsconfig/src/sync.d.ts +15 -0
  193. package/dist/packages/tsconfig/src/sync.js +1 -0
  194. package/dist/packages/tsconfig/src/templates/tsconfig.base.js +1 -0
  195. package/dist/packages/tsconfig/src/templates/tsconfig.build.js +1 -0
  196. package/dist/packages/tsconfig/src/templates/tsconfig.default.js +1 -0
  197. package/dist/packages/tsconfig/src/templates.d.ts +38 -0
  198. package/dist/packages/tsconfig/src/templates.js +1 -0
  199. package/dist/packages/tsdown/src/cleanup.d.ts +17 -0
  200. package/dist/packages/tsdown/src/cleanup.js +1 -0
  201. package/dist/packages/tsdown/src/cli/index.d.ts +11 -0
  202. package/dist/packages/tsdown/src/cli/index.js +1 -0
  203. package/dist/packages/tsdown/src/config/node.d.ts +37 -0
  204. package/dist/packages/tsdown/src/config/node.js +3 -0
  205. package/dist/packages/tsdown/src/index.d.ts +9 -0
  206. package/dist/packages/tsdown/src/index.js +1 -0
  207. package/dist/packages/vite/src/cli/index.d.ts +8 -0
  208. package/dist/packages/vite/src/cli/index.js +1 -0
  209. package/dist/packages/vite/src/commands.d.ts +29 -0
  210. package/dist/packages/vite/src/commands.js +1 -0
  211. package/dist/packages/vite/src/index.d.ts +9 -0
  212. package/dist/packages/vite/src/index.js +1 -0
  213. package/dist/packages/vite/src/plugin.d.ts +65 -0
  214. package/dist/packages/vite/src/plugin.js +1 -0
  215. package/dist/packages/vite/src/provider.d.ts +11 -0
  216. package/dist/packages/vite/src/provider.js +1 -0
  217. package/dist/packages/vite/src/sync.d.ts +25 -0
  218. package/dist/packages/vite/src/sync.js +2 -0
  219. package/dist/packages/vite/src/vp.d.ts +59 -0
  220. package/dist/packages/vite/src/vp.js +1 -0
  221. package/dist/project.d.ts +7 -0
  222. package/dist/project.js +1 -0
  223. package/dist/providers.d.ts +11 -0
  224. package/dist/providers.js +1 -0
  225. package/dist/shared.d.ts +14 -0
  226. package/dist/shared.js +1 -0
  227. package/dist/sync.d.ts +12 -0
  228. package/dist/sync.js +1 -0
  229. package/dist/template.d.ts +11 -0
  230. package/dist/template.js +1 -0
  231. package/dist/tsconfig.d.ts +8 -0
  232. package/dist/tsconfig.js +1 -0
  233. package/dist/tsdown.d.ts +7 -0
  234. package/dist/tsdown.js +1 -0
  235. package/dist/vite.d.ts +10 -0
  236. package/dist/vite.js +1 -0
  237. package/package.json +114 -3
@@ -0,0 +1,42 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { Replacements } from "../../shared/src/template.js";
4
+ import { ProjectType } from "../../shared/src/config-schema.js";
5
+ import { SyncTask, ToolingConfig } from "../../shared/src/toolchain.js";
6
+ import "../../shared/src/index.js";
7
+ //#region packages/core/src/sync.d.ts
8
+ export interface RunSyncOptions {
9
+ /** The task list to run. */
10
+ tasks: SyncTask[];
11
+ /** The project root. */
12
+ cwd: string;
13
+ /** The loaded config. */
14
+ config: ToolingConfig;
15
+ /** The resolved replacement tokens. */
16
+ tokens: Replacements;
17
+ /** The project kind (resolved from the config/cwd when omitted). */
18
+ projectType?: ProjectType;
19
+ /** Dry-run: report drift and exit non-zero without writing. */
20
+ check?: boolean;
21
+ /** Suppress logging. */
22
+ quiet?: boolean;
23
+ /** Custom logger (default `console.log`). */
24
+ log?: (message: string) => void;
25
+ }
26
+ export interface SyncResult {
27
+ /** Paths written (empty in check mode). */
28
+ written: string[];
29
+ /** Paths whose generated content differs from disk. */
30
+ changed: string[];
31
+ /** Previously-managed paths removed because they are no longer generated. */
32
+ removed: string[];
33
+ /** Whether disk already matched the generated output. */
34
+ upToDate: boolean;
35
+ }
36
+ /**
37
+ * Run every enabled sync task, writing the managed files and pruning files that
38
+ * are no longer generated. With `check: true` nothing is written: drift is
39
+ * reported instead (for CI).
40
+ */
41
+ export declare function runSync(options: RunSyncOptions): Promise<SyncResult>;
42
+ //#endregion
@@ -0,0 +1 @@
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{resolveProjectType as t}from"./project-type.js";import{readManifest as n,writeManifest as r}from"./manifest.js";import i from"node:fs";function a(e){return e.replace(/\\/g,`/`)}async function o(o){let{tasks:s,cwd:c,config:l,tokens:u}=o,d=o.quiet?()=>{}:o.log??(e=>console.log(e)),f=o.projectType??t(c,l),p={cwd:c,projectType:f,config:l,tokens:u,log:d},m=l.hooks??{};await m.beforeSync?.(p);let h=s.filter(e=>(!e.projectTypes||e.projectTypes.includes(f))&&(!e.enabled||e.enabled(l)));d(`dbx: running ${h.length} task(s)${o.check?` (check)`:``} [${f}]`);let g=[];for(let e of h){d(` - ${e.name}`),await m.beforeTask?.({task:e,ctx:p});let t=await e.run(p),n=Array.isArray(t)?t:void 0;n&&g.push(...n),await m.afterTask?.({task:e,ctx:p,...n?{files:n}:{}})}let _=new Map(g.map(e=>[a(e.path),e.content])),v=n(c),y=/* @__PURE__ */ new Set;for(let e of h)for(let t of e.keep??[])y.add(t);let b=e=>{for(let t of y)if(e===t||e.endsWith(`/${t}`)||e.endsWith(t))return!0;return!1},x=[];for(let[t,n]of _){let r=e.resolve(c,t);(i.existsSync(r)?i.readFileSync(r,`utf-8`):void 0)!==n&&x.push(t)}let S=v.files.filter(t=>!_.has(t)&&!b(t)&&i.existsSync(e.resolve(c,t))),C=x.length===0&&S.length===0;if(o.check){if(C)d(`dbx: generated files are in sync.`);else{d(`dbx: generated files are out of date:`);for(let e of x)d(` M ${e}`);for(let e of S)d(` D ${e}`);d("Run `dbx sync` to regenerate them.")}let e={written:[],changed:x,removed:S,upToDate:C};return await m.afterSync?.({cwd:c,config:l,result:e}),e}let w=[];for(let[t,n]of _){let r=e.resolve(c,t);i.mkdirSync(e.dirname(r),{recursive:!0}),i.writeFileSync(r,n,`utf-8`),w.push(t)}for(let t of S)i.rmSync(e.resolve(c,t),{force:!0});r(c,[..._.keys()]),d(`dbx: wrote ${w.length}, removed ${S.length} file(s)${x.length?`, updated ${x.length}`:``}.`);let T={written:w,changed:x,removed:S,upToDate:C};return await m.afterSync?.({cwd:c,config:l,result:T}),T}export{o as runSync};
@@ -0,0 +1,27 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { ProjectType } from "../../shared/src/config-schema.js";
4
+ import { SyncTask, ToolingConfig } from "../../shared/src/toolchain.js";
5
+ import "../../shared/src/index.js";
6
+ //#region packages/core/src/vscode.d.ts
7
+ export interface VscodeSyncOptions {
8
+ /**
9
+ * Settings patches, deep-merged in order (then merged into the consumer's).
10
+ * A function lets the patches depend on the config (eg. only inject Biome
11
+ * settings when the `biome` section is enabled).
12
+ */
13
+ settings?: Record<string, unknown>[] | ((config: ToolingConfig) => Record<string, unknown>[]);
14
+ /** Recommended extensions (unioned with the consumer's existing list). */
15
+ extensions?: string[];
16
+ /** Whether the task runs (default: always). */
17
+ enabled?: (config: ToolingConfig) => boolean;
18
+ /** The project kinds the task applies to (default root + single project). */
19
+ projectTypes?: ProjectType[];
20
+ }
21
+ /**
22
+ * The VS Code sync task: merges the given settings/extensions into the
23
+ * consumer's `.vscode/settings.json` / `.vscode/extensions.json`, preserving
24
+ * whatever they already have.
25
+ */
26
+ export declare function vscodeSyncTask(options?: VscodeSyncOptions): SyncTask;
27
+ //#endregion
@@ -0,0 +1 @@
1
+ import"node:path";import"node:url";import.meta.url;import{deepMerge as e}from"../../shared/src/object-utils.js";import{mergeJsonAt as t}from"../../shared/src/fs-utils.js";import"../../shared/src/index.js";function n(n={}){return{name:`vscode`,projectTypes:n.projectTypes??[`monorepo-root`,`project`],...n.enabled?{enabled:n.enabled}:{},run:r=>{let i=[],a=(typeof n.settings==`function`?n.settings(r.config):n.settings??[]).reduce((t,n)=>e(t,n),{});return Object.keys(a).length>0&&i.push({path:`.vscode/settings.json`,content:t(r.cwd,`.vscode/settings.json`,a)}),n.extensions?.length&&i.push({path:`.vscode/extensions.json`,content:t(r.cwd,`.vscode/extensions.json`,{recommendations:n.extensions})}),i}}}export{n as vscodeSyncTask};
@@ -0,0 +1,17 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { RunSyncOptions } from "./sync.js";
4
+ //#region packages/core/src/watch.d.ts
5
+ export interface RunWatchOptions extends Omit<RunSyncOptions, 'check'> {
6
+ /** The config file to watch (re-runs every task on change). */
7
+ configPath?: string;
8
+ /** Debounce window in ms (default 150). */
9
+ debounce?: number;
10
+ }
11
+ /**
12
+ * Run one sync, then watch the config file + every task's `watch` globs and
13
+ * re-run on change. Writing generated files must not re-trigger a run, so a
14
+ * short quiet window follows each sync.
15
+ */
16
+ export declare function runWatch(options: RunWatchOptions): Promise<void>;
17
+ //#endregion
@@ -0,0 +1 @@
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{runSync as t}from"./sync.js";import n from"node:fs";import{Glob as r}from"glob";async function i(i){let{cwd:a,tasks:o}=i,s=i.debounce??150,c=i.quiet?()=>{}:i.log??(e=>console.log(e)),l=0,u,d=!1,f=!1,p=async()=>{if(d)f=!0;else{d=!0;try{await t(i)}finally{d=!1,l=Date.now()+Math.max(s*3,300),f&&(f=!1,m())}}},m=()=>{clearTimeout(u),u=setTimeout(p,s)};await p();let h=/* @__PURE__ */ new Set([a]),g=/* @__PURE__ */ new Set;for(let e of o)for(let t of e.watch??[])g.add(t);for(let t of g)try{let n=new r(t,{cwd:a,dot:!0,ignore:[`**/node_modules/**`]}).walkSync();for(let t of n)h.add(e.dirname(e.resolve(a,t)))}catch{}let _=[],v=e=>{Date.now()<l||(i.config?.hooks?.onChange?.(e?{path:e}:{}),m())};if(i.configPath)try{_.push(n.watch(i.configPath,()=>{c(`config changed; re-syncing`),v(i.configPath)}))}catch{}for(let e of h)try{_.push(n.watch(e,{recursive:!0},(e,t)=>v(t??void 0)))}catch{try{_.push(n.watch(e,(e,t)=>v(t??void 0)))}catch{}}c(`dbx: watching for changes (Ctrl+C to stop)`),await new Promise(e=>{let t=()=>{for(let e of _)e.close();process.off(`SIGINT`,t),process.off(`SIGTERM`,t),e()};process.on(`SIGINT`,t),process.on(`SIGTERM`,t)})}export{i as runWatch};
@@ -0,0 +1,18 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { ToolingMigration } from "./types.js";
4
+ //#region packages/migrate/src/biome.d.ts
5
+ /** The Biome config file names, in priority order. */
6
+ export declare const BIOME_CONFIG_FILES: readonly ['biome.json', 'biome.jsonc'];
7
+ /** The Biome config path in `cwd`, if present. */
8
+ export declare function findBiomeConfig(cwd: string): string | undefined;
9
+ /**
10
+ * Strip JSONC comments + trailing commas. String-aware, so glob patterns such as
11
+ * `**\/*\/dist` (which contain `/*`) are never mistaken for comments.
12
+ */
13
+ export declare function stripJsonc(input: string): string;
14
+ /** Read and parse a JSON/JSONC file (BOM-tolerant). */
15
+ export declare function readJsonc(file: string): Record<string, any>;
16
+ /** Build the Biome -> ox migration. */
17
+ export declare const biomeToOx: ToolingMigration;
18
+ //#endregion
@@ -0,0 +1,2 @@
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{mapBiomeToOxfmt as t}from"./oxfmt-map.js";import{mapBiomeToOxlint as n}from"./oxlint-map.js";import{renderViteTarget as r}from"./vite-target.js";import i from"node:fs";const a=[`biome.json`,`biome.jsonc`];function o(t){for(let n of a){let r=e.join(t,n);if(i.existsSync(r))return r}}function s(e){let t=``,n=!1,r=``;for(let i=0;i<e.length;i++){let a=e[i];if(n)t+=a,a===`\\`?(t+=e[i+1]??``,i++):a===r&&(n=!1);else if(a===`"`||a===`'`)n=!0,r=a,t+=a;else if(a===`/`&&e[i+1]===`/`)for(;i<e.length&&e[i]!==`
2
+ `;)i++;else if(a===`/`&&e[i+1]===`*`){for(i+=2;i<e.length&&(e[i]!==`*`||e[i+1]!==`/`);)i++;i++}else t+=a}return t.replace(/,(\s*[}\]])/g,`$1`)}function c(e){let t=i.readFileSync(e,`utf-8`).replace(/^\uFEFF/,``);return JSON.parse(s(t))}const l={id:`biome-to-ox`,from:`biome`,to:`ox`,description:`Migrate Biome (formatter + organizeImports + linter) to Oxfmt/Oxlint.`,detect:e=>!!o(e),run:async a=>{let s=o(a.cwd);if(!s)throw Error(`biome-to-ox: no biome.json/biome.jsonc found.`);let u=c(s),d=t(u),f=n(u,d.oxfmt.ignorePatterns??[]),p=[...d.unmapped,...f.unmapped],m=[`Source: ${e.basename(s)}.`,`Formatter + organizeImports + linter rules mapped.`];if((a.target??`files`)===`vite`){let e=r(a.cwd,{fmt:d.oxfmt,lint:f.oxlint});return a.write&&i.writeFileSync(e.path,e.content,`utf-8`),{id:l.id,from:`biome`,to:`ox`,written:[e.path],files:[e],oxfmt:d.oxfmt,oxlint:f.oxlint,unmapped:p,notes:[...m,"Folded into vite.config.ts (`fmt` + `lint`)."]}}let h=[[`.oxfmtrc.json`,d.oxfmt],[`.oxlintrc.json`,f.oxlint]].map(([t,n])=>({path:e.join(a.cwd,t),content:`${JSON.stringify(n,null,4)}\n`}));if(a.write)for(let e of h)i.writeFileSync(e.path,e.content,`utf-8`);return{id:l.id,from:`biome`,to:`ox`,written:h.map(e=>e.path),files:h,oxfmt:d.oxfmt,oxlint:f.oxlint,unmapped:p,notes:[...m,"Next: run `oxfmt` to reformat, then drop Biome.","Tip: `--target vite` folds this into vite.config.ts instead."]}}};export{a as BIOME_CONFIG_FILES,l as biomeToOx,o as findBiomeConfig,c as readJsonc,s as stripJsonc};
@@ -0,0 +1,14 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { MigrationFile } from "./types.js";
4
+ //#region packages/migrate/src/check.d.ts
5
+ export type FileStatus = 'missing' | 'changed' | 'same';
6
+ export interface FileDiff {
7
+ path: string;
8
+ status: FileStatus;
9
+ }
10
+ /** Compare produced files against disk (`missing` / `changed` / `same`). */
11
+ export declare function diffFiles(files: MigrationFile[]): FileDiff[];
12
+ /** Whether any produced file is missing or out of date. */
13
+ export declare function hasPending(diffs: FileDiff[]): boolean;
14
+ //#endregion
@@ -0,0 +1 @@
1
+ import"node:path";import"node:url";import.meta.url;import e from"node:fs";function t(t){return t.map(t=>{if(!e.existsSync(t.path))return{path:t.path,status:`missing`};let n=e.readFileSync(t.path,`utf-8`).replace(/^\uFEFF/,``),r=t.content.replace(/^\uFEFF/,``);return{path:t.path,status:n===r?`same`:`changed`}})}function n(e){return e.some(e=>e.status!==`same`)}export{t as diffFiles,n as hasPending};
@@ -0,0 +1,12 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { ToolingCommand } from "../../../shared/src/types.js";
4
+ import "../../../shared/src/index.js";
5
+ //#region packages/migrate/src/cli/index.d.ts
6
+ /**
7
+ * `dbx migrate` — convert a project's tooling config from another
8
+ * tool (Biome / ESLint / Prettier / Dprint) to Ox (Oxfmt / Oxlint). Dry-run by
9
+ * default; pass `--write` to apply, or `--check` for a CI gate.
10
+ */
11
+ export declare function migrateCommands(): ToolingCommand[];
12
+ //#endregion
@@ -0,0 +1 @@
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{diffFiles as t,hasPending as n}from"../check.js";import{detectMigrations as r,listMigrations as i,migrations as a}from"../registry.js";function o(){return[{name:`migrate`,description:`Migrate Biome / ESLint / Prettier / Dprint config to Ox (oxlint + oxfmt).`,options:[{flags:`--from <tool>`,description:`Source tool: biome | eslint | prettier | dprint | all.`},{flags:`--to <tool>`,description:`Target tool (default: ox).`,default:`ox`},{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 ox 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(i,o)=>{let s=i.cwd??o.cwd,c=!!i.check,l=!!i.write&&!i.dryRun&&!c,u=!!i.online,d=i.from,f=i.target??`files`,p=!d||d===`all`?r(s):a().filter(e=>e.from===d);if(p.length===0){console.log(d&&d!==`all`?`dbx: no "${d}" migration is registered.`:`dbx: nothing to migrate (no Biome/ESLint/Prettier/Dprint config detected).`);return}let m=[];for(let e of p)m.push(await e.run({cwd:s,write:l,online:u,target:f}));if(c){let r=m.flatMap(e=>t(e.files??[])),a=r.filter(e=>e.status!==`same`);if(i.json)console.log(JSON.stringify(m,null,4));else if(a.length){for(let t of a)console.log(`dbx: ${t.status} ${e.relative(s,t.path)||t.path}`);console.log(`dbx: ${a.length} file(s) out of date — run \`migrate --write\` to apply.`)}else console.log(`dbx: up to date.`);n(r)&&(process.exitCode=1)}else if(i.json)console.log(JSON.stringify(m,null,4));else{for(let e of m){console.log(`dbx: ${e.from} -> ${e.to} ${l?`wrote`:`would write`}`);for(let t of e.written)console.log(` ${l?`+`:`?`} ${t}`);for(let t of e.notes??[])console.log(` ${t}`);if(e.unmapped?.length){console.log(` unmapped (${e.unmapped.length}):`);for(let t of e.unmapped.slice(0,25))console.log(` - ${t.source}: ${t.reason}`)}}l||console.log(`dbx: 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,t)=>{let n=e.cwd??t.cwd,r=i(n);if(e.json)console.log(JSON.stringify(r,null,4));else for(let e of r)console.log(` ${e.id.padEnd(16)} ${e.from} -> ${e.to} [${e.detected?`detected`:`not found`}]`),console.log(` ${e.description}`)}}]}export{o as migrateCommands};
@@ -0,0 +1,18 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { ToolingMigration } from "./types.js";
4
+ //#region packages/migrate/src/dprint.d.ts
5
+ type Json = Record<string, any>;
6
+ /** Locate a dprint config. */
7
+ export declare function findDprintConfig(cwd: string): {
8
+ file: string;
9
+ config: Json;
10
+ } | undefined;
11
+ /** Map a dprint config to Oxfmt options. */
12
+ export declare function mapDprintToOxfmt(dprint: Json): {
13
+ oxfmt: Json;
14
+ unmapped: string[];
15
+ };
16
+ export declare const dprintToOx: ToolingMigration;
17
+ //#endregion
18
+ export {};
@@ -0,0 +1 @@
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{renderViteTarget as t}from"./vite-target.js";import n from"node:fs";const r=[`dprint.json`,`dprint.jsonc`,`.dprint.json`];function i(t){for(let i of r){let r=e.join(t,i);if(!n.existsSync(r))continue;let a=n.readFileSync(r,`utf-8`).replace(/^\uFEFF/,``).replace(/\/\*[\s\S]*?\*\//g,``).replace(/(^|[^:])\/\/.*$/gm,`$1`).replace(/,(\s*[}\]])/g,`$1`);try{return{file:r,config:JSON.parse(a)}}catch{}}}function a(e){let t={},n=e.typescript??{};typeof e.lineWidth==`number`&&(t.printWidth=e.lineWidth),typeof e.indentWidth==`number`&&(t.tabWidth=e.indentWidth),typeof e.useTabs==`boolean`&&(t.useTabs=e.useTabs),(e.newLineKind===`lf`||e.newLineKind===`crlf`)&&(t.endOfLine=e.newLineKind),n.quoteStyle&&(t.singleQuote=String(n.quoteStyle).includes(`Single`)||n.quoteStyle===`alwaysSingle`),n.semiColons&&(t.semi=n.semiColons!==`asi`),n.trailingCommas&&(t.trailingComma=n.trailingCommas===`always`?`all`:n.trailingCommas===`never`?`none`:`es5`);let r=[],i=[`lineWidth`,`indentWidth`,`useTabs`,`newLineKind`,`typescript`,`plugins`];for(let t of Object.keys(e))i.includes(t)||r.push(`dprint section: ${t}`);return Array.isArray(e.plugins)&&e.plugins.length&&r.push(`plugins (Oxfmt has built-in equivalents for common cases)`),{oxfmt:t,unmapped:r}}const o={id:`dprint-to-ox`,from:`dprint`,to:`oxfmt`,description:`Migrate a dprint.json (formatter) to Oxfmt.`,detect:e=>!!i(e),run:async r=>{let o=i(r.cwd);if(!o)throw Error(`dprint-to-ox: no dprint.json found.`);let s=a(o.config),c=s.unmapped.map(e=>({source:e,reason:`no Oxfmt equivalent`})),l=[`Source: ${e.basename(o.file)}.`];if((r.target??`files`)===`vite`){let e=t(r.cwd,{fmt:s.oxfmt});return r.write&&n.writeFileSync(e.path,e.content,`utf-8`),{id:`dprint-to-ox`,from:`dprint`,to:`oxfmt`,written:[e.path],files:[e],oxfmt:s.oxfmt,unmapped:c,notes:[...l,"Folded into vite.config.ts (`fmt`)."]}}let u={path:e.join(r.cwd,`.oxfmtrc.json`),content:`${JSON.stringify(s.oxfmt,null,4)}\n`};return r.write&&n.writeFileSync(u.path,u.content,`utf-8`),{id:`dprint-to-ox`,from:`dprint`,to:`oxfmt`,written:[u.path],files:[u],oxfmt:s.oxfmt,unmapped:c,notes:l}}};export{o as dprintToOx,i as findDprintConfig,a as mapDprintToOxfmt};
@@ -0,0 +1,24 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { ToolingMigration } from "./types.js";
4
+ //#region packages/migrate/src/eslint.d.ts
5
+ type Json = Record<string, any>;
6
+ /** The ESLint config in `cwd`, preferring JSON (parseable) then JS. */
7
+ export declare function findEslintConfig(cwd: string): {
8
+ file: string;
9
+ json: boolean;
10
+ } | undefined;
11
+ /** Map an ESLint rule name to an Oxlint rule name. */
12
+ export declare function mapRuleName(name: string): {
13
+ name: string;
14
+ mapped: boolean;
15
+ };
16
+ /**
17
+ * Evaluate a JS/flat ESLint config with the official `@oxlint/migrate` and read
18
+ * the `.oxlintrc.json` it writes. Returns `undefined` on failure. Note: the
19
+ * migrator writes to disk, so callers only run it when writing.
20
+ */
21
+ export declare function runOxlintMigrate(cwd: string): Promise<Json | undefined>;
22
+ export declare const eslintToOx: ToolingMigration;
23
+ //#endregion
24
+ export {};
@@ -0,0 +1 @@
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{spawnCross as t}from"../../shared/src/run.js";import"../../shared/src/index.js";import{renderViteTarget as n}from"./vite-target.js";import r from"node:fs";const i=[`.eslintrc.json`,`.eslintrc`],a=[`eslint.config.js`,`eslint.config.mjs`,`eslint.config.cjs`,`eslint.config.ts`,`.eslintrc.js`,`.eslintrc.cjs`];function o(t){for(let n of i){let i=e.join(t,n);if(r.existsSync(i))return{file:i,json:!0}}for(let n of a){let i=e.join(t,n);if(r.existsSync(i))return{file:i,json:!1}}}function s(e){let t=Array.isArray(e)?e[0]:e;return t===2||t===`error`?`error`:t===1||t===`warn`?`warn`:`off`}function c(e){return e.startsWith(`@typescript-eslint/`)?{name:`typescript/${e.slice(19)}`,mapped:!0}:{name:e,mapped:!0}}function l(e,t,n){for(let[r,i]of Object.entries(e??{})){let e=c(r);t[e.name]=s(i),e.mapped||n.push({source:r,reason:`unknown plugin prefix`})}}function u(e,n,r){return new Promise(i=>{let a=t(e,n,{cwd:r,stdio:`inherit`});a.on(`error`,()=>i(1)),a.on(`exit`,e=>i(e??0))})}async function d(t){let n=e.join(t,`.oxlintrc.json`);if(await u(`npx`,[`--yes`,`@oxlint/migrate`],t)===0&&r.existsSync(n))try{return JSON.parse(r.readFileSync(n,`utf-8`).replace(/^\uFEFF/,``))}catch{return}}const f={id:`eslint-to-ox`,from:`eslint`,to:`oxlint`,description:`Migrate ESLint to Oxlint (JSON configs; flat configs via @oxlint/migrate --online).`,detect:e=>!!o(e),run:async t=>{let i=o(t.cwd);if(!i)throw Error(`eslint-to-ox: no ESLint config found.`);let a={},s=[],c=[`Source: ${e.basename(i.file)}.`];if(i.json)l(JSON.parse(r.readFileSync(i.file,`utf-8`).replace(/^\uFEFF/,``)).rules,a,s);else if(t.online&&t.write){let e=await d(t.cwd);e?(l(e.rules,a,s),c.push("Rules evaluated with `@oxlint/migrate` (online).")):c.push("`@oxlint/migrate` did not produce `.oxlintrc.json`; hand-map the rules.")}else t.online?c.push("Flat config: online evaluation runs `@oxlint/migrate`, which writes `.oxlintrc.json` — re-run with `--write`."):c.push("Flat config detected — re-run with `--online --write` to use `@oxlint/migrate`, or hand-map the rules.");let u={$schema:`./node_modules/oxlint/configuration_schema.json`,rules:a};if((t.target??`files`)===`vite`){let e=n(t.cwd,{lint:u});return t.write&&r.writeFileSync(e.path,e.content,`utf-8`),{id:f.id,from:`eslint`,to:`oxlint`,written:[e.path],files:[e],oxlint:u,unmapped:s,notes:[...c,"Folded into vite.config.ts (`lint`)."]}}let p={path:e.join(t.cwd,`.oxlintrc.json`),content:`${JSON.stringify(u,null,4)}\n`};return t.write&&r.writeFileSync(p.path,p.content,`utf-8`),{id:f.id,from:`eslint`,to:`oxlint`,written:[p.path],files:[p],oxlint:u,unmapped:s,notes:c}}};export{f as eslintToOx,o as findEslintConfig,c as mapRuleName,d as runOxlintMigrate};
@@ -0,0 +1,14 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { MigrateTarget, MigrateTool, MigrationContext, MigrationFile, MigrationResult, ToolingMigration, UnmappedItem } from "./types.js";
4
+ import { BIOME_CONFIG_FILES, biomeToOx, findBiomeConfig, readJsonc, stripJsonc } from "./biome.js";
5
+ import { FileDiff, FileStatus, diffFiles, hasPending } from "./check.js";
6
+ import { migrateCommands } from "./cli/index.js";
7
+ import { dprintToOx, findDprintConfig, mapDprintToOxfmt } from "./dprint.js";
8
+ import { eslintToOx, findEslintConfig, mapRuleName, runOxlintMigrate } from "./eslint.js";
9
+ import { DEFAULT_IGNORE, OxfmtMapping, mapBiomeFormatter, mapBiomeIncludes, mapBiomeToOxfmt, mapOrganizeImports } from "./oxfmt-map.js";
10
+ import { OxlintMapping, RULE_MAP, mapBiomeToOxlint } from "./oxlint-map.js";
11
+ import { findPrettierConfig, mapPrettierToOxfmt, prettierToOx, readPrettierIgnore } from "./prettier.js";
12
+ import { MigrationInfo, detectMigrations, findMigration, listMigrations, migrations, runDetectedMigrations, runMigration } from "./registry.js";
13
+ import { findTopLevelValue, matchBracket, mergeViteConfig, renderViteTarget, serializeTs, writeViteTarget } from "./vite-target.js";
14
+ export { BIOME_CONFIG_FILES, DEFAULT_IGNORE, FileDiff, FileStatus, MigrateTarget, MigrateTool, MigrationContext, MigrationFile, MigrationInfo, MigrationResult, OxfmtMapping, OxlintMapping, RULE_MAP, ToolingMigration, UnmappedItem, biomeToOx, detectMigrations, diffFiles, dprintToOx, eslintToOx, findBiomeConfig, findDprintConfig, findEslintConfig, findMigration, findPrettierConfig, findTopLevelValue, hasPending, listMigrations, mapBiomeFormatter, mapBiomeIncludes, mapBiomeToOxfmt, mapBiomeToOxlint, mapDprintToOxfmt, mapOrganizeImports, mapPrettierToOxfmt, mapRuleName, matchBracket, mergeViteConfig, migrateCommands, migrations, prettierToOx, readJsonc, readPrettierIgnore, renderViteTarget, runDetectedMigrations, runMigration, runOxlintMigrate, serializeTs, stripJsonc, writeViteTarget };
@@ -0,0 +1 @@
1
+ import"node:path";import"node:url";import.meta.url;import{diffFiles as e,hasPending as t}from"./check.js";import{DEFAULT_IGNORE as n,mapBiomeFormatter as r,mapBiomeIncludes as i,mapBiomeToOxfmt as a,mapOrganizeImports as o}from"./oxfmt-map.js";import{RULE_MAP as s,mapBiomeToOxlint as c}from"./oxlint-map.js";import{findTopLevelValue as l,matchBracket as u,mergeViteConfig as d,renderViteTarget as f,serializeTs as p,writeViteTarget as m}from"./vite-target.js";import{BIOME_CONFIG_FILES as h,biomeToOx as g,findBiomeConfig as _,readJsonc as v,stripJsonc as y}from"./biome.js";import{dprintToOx as b,findDprintConfig as x,mapDprintToOxfmt as S}from"./dprint.js";import{eslintToOx as C,findEslintConfig as w,mapRuleName as T,runOxlintMigrate as E}from"./eslint.js";import{findPrettierConfig as D,mapPrettierToOxfmt as O,prettierToOx as k,readPrettierIgnore as A}from"./prettier.js";import{detectMigrations as j,findMigration as M,listMigrations as N,migrations as P,runDetectedMigrations as F,runMigration as I}from"./registry.js";import{migrateCommands as L}from"./cli/index.js";export{h as BIOME_CONFIG_FILES,n as DEFAULT_IGNORE,s as RULE_MAP,g as biomeToOx,j as detectMigrations,e as diffFiles,b as dprintToOx,C as eslintToOx,_ as findBiomeConfig,x as findDprintConfig,w as findEslintConfig,M as findMigration,D as findPrettierConfig,l as findTopLevelValue,t as hasPending,N as listMigrations,r as mapBiomeFormatter,i as mapBiomeIncludes,a as mapBiomeToOxfmt,c as mapBiomeToOxlint,S as mapDprintToOxfmt,o as mapOrganizeImports,O as mapPrettierToOxfmt,T as mapRuleName,u as matchBracket,d as mergeViteConfig,L as migrateCommands,P as migrations,k as prettierToOx,v as readJsonc,A as readPrettierIgnore,f as renderViteTarget,F as runDetectedMigrations,I as runMigration,E as runOxlintMigrate,p as serializeTs,y as stripJsonc,m as writeViteTarget};
@@ -0,0 +1,28 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { UnmappedItem } from "./types.js";
4
+ //#region packages/migrate/src/oxfmt-map.d.ts
5
+ type Json = Record<string, any>;
6
+ /** Default ignore globs added on top of the migrated negations. */
7
+ export declare const DEFAULT_IGNORE: string[];
8
+ export interface OxfmtMapping {
9
+ oxfmt: Json;
10
+ unmapped: UnmappedItem[];
11
+ }
12
+ /** Map `formatter` + `javascript.formatter` to Oxfmt options. */
13
+ export declare function mapBiomeFormatter(biome: Json): OxfmtMapping;
14
+ /** Turn Biome `files.includes` negations into Oxfmt `ignorePatterns`. */
15
+ export declare function mapBiomeIncludes(biome: Json): string[];
16
+ /**
17
+ * Map `assist.actions.source.organizeImports.options.groups` to Oxfmt
18
+ * `sortImports`. Aliases become `internalPattern`, other literals become
19
+ * `customGroups`, and shorthand selectors map through {@link SELECTOR_MAP}.
20
+ */
21
+ export declare function mapOrganizeImports(groups: unknown): {
22
+ sortImports: Json;
23
+ unmapped: UnmappedItem[];
24
+ };
25
+ /** Build the complete Oxfmt config from a Biome config. */
26
+ export declare function mapBiomeToOxfmt(biome: Json): OxfmtMapping;
27
+ //#endregion
28
+ export {};
@@ -0,0 +1 @@
1
+ import"node:path";import"node:url";import.meta.url;const e=[`**/node_modules/**`,`**/dist/**`,`**/.turbo/**`];function t(e){let t=e.formatter??{},n=e.javascript?.formatter??{},r={},i=[];t.indentStyle&&(r.useTabs=t.indentStyle===`tab`),typeof t.indentWidth==`number`&&(r.tabWidth=t.indentWidth),typeof t.lineWidth==`number`&&(r.printWidth=t.lineWidth),t.lineEnding&&t.lineEnding!==`auto`&&(r.endOfLine=t.lineEnding),typeof t.bracketSameLine==`boolean`&&(r.bracketSameLine=t.bracketSameLine),typeof t.bracketSpacing==`boolean`&&(r.bracketSpacing=t.bracketSpacing),t.attributePosition===`multiline`&&(r.singleAttributePerLine=!0),n.quoteStyle&&(r.singleQuote=n.quoteStyle===`single`),n.jsxQuoteStyle&&(r.jsxSingleQuote=n.jsxQuoteStyle===`single`),n.quoteProperties&&(r.quoteProps=n.quoteProperties===`asNeeded`?`as-needed`:`preserve`),n.trailingCommas&&(r.trailingComma=n.trailingCommas),n.semicolons&&(r.semi=n.semicolons===`always`),n.arrowParentheses&&(r.arrowParens=n.arrowParentheses===`always`?`always`:`avoid`);for(let e of[`expand`,`useEditorconfig`,`formatWithErrors`,`jsxQuoteStyle`])e in t&&i.push({source:`formatter.${e}`,reason:`no Oxfmt equivalent`});return{oxfmt:r,unmapped:i}}function n(t){let n=(t.files?.includes??[]).filter(e=>typeof e==`string`&&e.startsWith(`!`)).map(e=>e.slice(1));return[.../* @__PURE__ */ new Set([...e,...n])]}const r={":NODE:":`builtin`,":BUN:":`builtin`,":PACKAGE:":`external`,":ALIAS:":`internal`,":PATH:":[`parent`,`sibling`,`index`]};function i(e){return/^[@~#][\w-]*\/?/.test(e)||e.endsWith(`/**`)}function a(e){let t=[],n=[],a=[],o=/* @__PURE__ */ new Set([`~/`,`@/`]),s=Array.isArray(e)?e:[];for(let e of s){if(e===`:BLANK_LINE:`)continue;let s=Array.isArray(e)?e:[e],c=[];for(let e of s){if(typeof e!=`string`)continue;if(e in r){let t=r[e];if(!t)continue;for(let e of Array.isArray(t)?t:[t])c.push(e);continue}if(e.startsWith(`:`)){t.push({source:`organizeImports ${e}`,reason:`unknown Biome selector`});continue}if(e.startsWith(`!`)){t.push({source:`organizeImports ${e}`,reason:`negated group members are approximated`});continue}if(i(e)){let t=e.replace(/\*+.*$/,``);t&&o.add(t),c.push(`internal`);continue}let n=`custom${a.length}`;a.push({groupName:n,elementNamePattern:[e]}),c.push(n)}let l=[...new Set(c)];l.length&&n.push(l.length===1?l[0]:l)}let c=[];for(let e of n){let t=c[c.length-1];(t===void 0||JSON.stringify(t)!==JSON.stringify(e))&&c.push(e)}let l={groups:c,internalPattern:[...o],newlinesBetween:!0,sortPackageJson:!1};return a.length&&(l.customGroups=a),{sortImports:l,unmapped:t}}function o(e){let r=t(e),i={...r.oxfmt,ignorePatterns:n(e)},o=[...r.unmapped],s=e.assist?.actions?.source?.organizeImports;if(s){let e=s.options?.groups;if(e){let t=a(e);i.sortImports=t.sortImports,o.push(...t.unmapped)}}return{oxfmt:i,unmapped:o}}export{e as DEFAULT_IGNORE,t as mapBiomeFormatter,n as mapBiomeIncludes,o as mapBiomeToOxfmt,a as mapOrganizeImports};
@@ -0,0 +1,22 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { UnmappedItem } from "./types.js";
4
+ //#region packages/migrate/src/oxlint-map.d.ts
5
+ type Json = Record<string, any>;
6
+ /**
7
+ * Biome rule path -> Oxlint rule name. `null` means "no known equivalent".
8
+ * Bare names are core ESLint rules; prefixed names use an Oxlint plugin.
9
+ */
10
+ export declare const RULE_MAP: Record<string, string | null>;
11
+ export interface OxlintMapping {
12
+ oxlint: Json;
13
+ unmapped: UnmappedItem[];
14
+ }
15
+ /**
16
+ * Build an `.oxlintrc.json` body from a Biome `linter` config. Only rules Biome
17
+ * explicitly configures are translated (so Oxlint's own defaults apply
18
+ * elsewhere), plus the migrated `files.includes` negations as `ignorePatterns`.
19
+ */
20
+ export declare function mapBiomeToOxlint(biome: Json, ignorePatterns: string[]): OxlintMapping;
21
+ //#endregion
22
+ export {};
@@ -0,0 +1 @@
1
+ import"node:path";import"node:url";import.meta.url;const e={"a11y.useAltText":`jsx-a11y/alt-text`,"a11y.useButtonType":`react/button-has-type`,"a11y.useKeyWithClickEvents":`jsx-a11y/click-events-have-key-events`,"a11y.noSvgWithoutTitle":null,"a11y.useAriaPropsForRole":null,"a11y.useFocusableInteractive":null,"a11y.useSemanticElements":`jsx-a11y/prefer-tag-over-role`,"a11y.noStaticElementInteractions":null,"a11y.noLabelWithoutControl":`jsx-a11y/label-has-associated-control`,"complexity.noBannedTypes":`typescript/no-empty-object-type`,"complexity.noUselessEmptyExport":`typescript/no-useless-empty-export`,"complexity.noUselessEscapeInRegex":`no-useless-escape`,"complexity.noImportantStyles":null,"complexity.noStaticOnlyClass":`unicorn/no-static-only-class`,"correctness.noConstantCondition":`no-constant-condition`,"correctness.noInnerDeclarations":`no-inner-declarations`,"correctness.noUnusedVariables":`no-unused-vars`,"correctness.noUnusedFunctionParameters":`no-unused-vars`,"correctness.noUnusedImports":`no-unused-vars`,"correctness.noSwitchDeclarations":`no-case-declarations`,"correctness.useExhaustiveDependencies":`react-hooks/exhaustive-deps`,"style.useExponentiationOperator":`prefer-exponentiation-operator`,"style.noNonNullAssertion":`typescript/no-non-null-assertion`,"style.useNodejsImportProtocol":`unicorn/prefer-node-protocol`,"style.useTemplate":`prefer-template`,"suspicious.noDoubleEquals":`eqeqeq`,"suspicious.noExplicitAny":`typescript/no-explicit-any`,"suspicious.noAssignInExpressions":`no-return-assign`,"suspicious.noUselessEscapeInString":`no-useless-escape`,"suspicious.noImplicitAnyLet":null,"suspicious.noUnknownAtRules":null,"performance.noAccumulatingSpread":`oxc/no-accumulating-spread`};function t(e){if(typeof e==`string`)return e;if(e&&typeof e==`object`)return e.level}function n(e){if(e===`error`)return`error`;if(e===`warn`)return`warn`;if(e===`info`||e===`off`)return`off`}function r(e){let t=[];for(let[n,r]of Object.entries(e??{}))if(r&&typeof r==`object`)for(let[e,i]of Object.entries(r))t.push([`${n}.${e}`,i]);return t}function i(i,a){let o={},s=[];for(let[a,c]of r(i.linter?.rules??{})){let r=n(t(c));if(!r)continue;let i=e[a];i===void 0?s.push({source:`linter.rules.${a}`,reason:`not in the Biome->Oxlint map`}):i===null?s.push({source:`linter.rules.${a}`,reason:`no Oxlint equivalent`}):o[i]=r}return{oxlint:{$schema:`./node_modules/oxlint/configuration_schema.json`,rules:o,ignorePatterns:a},unmapped:s}}export{e as RULE_MAP,i as mapBiomeToOxlint};
@@ -0,0 +1,20 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { ToolingMigration } from "./types.js";
4
+ //#region packages/migrate/src/prettier.d.ts
5
+ type Json = Record<string, any>;
6
+ /** Locate a Prettier config (JSON files or the `prettier` package.json field). */
7
+ export declare function findPrettierConfig(cwd: string): {
8
+ file: string;
9
+ config: Json;
10
+ } | undefined;
11
+ /** `.prettierignore` globs. */
12
+ export declare function readPrettierIgnore(cwd: string): string[];
13
+ /** Map a Prettier config to Oxfmt options. */
14
+ export declare function mapPrettierToOxfmt(prettier: Json): {
15
+ oxfmt: Json;
16
+ unmapped: string[];
17
+ };
18
+ export declare const prettierToOx: ToolingMigration;
19
+ //#endregion
20
+ export {};
@@ -0,0 +1,2 @@
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{renderViteTarget as t}from"./vite-target.js";import n from"node:fs";const r=[`.prettierrc`,`.prettierrc.json`,`.prettierrc.jsonc`,`prettier.config.json`],i=[`printWidth`,`tabWidth`,`useTabs`,`semi`,`singleQuote`,`jsxSingleQuote`,`quoteProps`,`trailingComma`,`bracketSpacing`,`bracketSameLine`,`arrowParens`,`endOfLine`,`singleAttributePerLine`,`htmlWhitespaceSensitivity`,`vueIndentScriptAndStyle`];function a(t){for(let i of r){let r=e.join(t,i);if(n.existsSync(r)){let e=n.readFileSync(r,`utf-8`).replace(/^\uFEFF/,``);try{return{file:r,config:JSON.parse(e)}}catch{}}}let i=e.join(t,`package.json`);if(n.existsSync(i))try{let e=JSON.parse(n.readFileSync(i,`utf-8`));if(e.prettier&&typeof e.prettier==`object`)return{file:i,config:e.prettier}}catch{}}function o(t){let r=e.join(t,`.prettierignore`);return n.existsSync(r)?n.readFileSync(r,`utf-8`).split(`
2
+ `).map(e=>e.trim()).filter(e=>e&&!e.startsWith(`#`)):[]}function s(e){let t={},n=[];for(let n of i)n in e&&(t[n]=e[n]);let r=Array.isArray(e.plugins)?e.plugins:[];for(let e of r)e.includes(`tailwindcss`)?t.sortTailwindcss=!0:e.includes(`packagejson`)?t.sortPackageJson=!0:n.push(`plugin: ${e}`);for(let t of Object.keys(e))!i.includes(t)&&t!==`plugins`&&t!==`overrides`&&n.push(`option: ${t}`),t===`overrides`&&n.push("option: overrides (convert to Oxfmt `overrides` manually)");return{oxfmt:t,unmapped:n}}const c={id:`prettier-to-ox`,from:`prettier`,to:`oxfmt`,description:`Migrate a Prettier config to Oxfmt (.oxfmtrc.json).`,detect:e=>!!a(e),run:async r=>{let i=a(r.cwd);if(!i)throw Error(`prettier-to-ox: no Prettier config found.`);let l=s(i.config),u=o(r.cwd);u.length&&(l.oxfmt.ignorePatterns=u);let d=l.unmapped.map(e=>({source:e,reason:`no Oxfmt equivalent`}));if((r.target??`files`)===`vite`){let a=t(r.cwd,{fmt:l.oxfmt});return r.write&&n.writeFileSync(a.path,a.content,`utf-8`),{id:c.id,from:`prettier`,to:`oxfmt`,written:[a.path],files:[a],oxfmt:l.oxfmt,unmapped:d,notes:[`Source: ${e.basename(i.file)}.`,"Folded into vite.config.ts (`fmt`)."]}}let f={path:e.join(r.cwd,`.oxfmtrc.json`),content:`${JSON.stringify(l.oxfmt,null,4)}\n`};return r.write&&n.writeFileSync(f.path,f.content,`utf-8`),{id:c.id,from:`prettier`,to:`oxfmt`,written:[f.path],files:[f],oxfmt:l.oxfmt,unmapped:d,notes:[`Source: ${e.basename(i.file)}.`]}}};export{a as findPrettierConfig,s as mapPrettierToOxfmt,c as prettierToOx,o as readPrettierIgnore};
@@ -0,0 +1,26 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { MigrateTool, MigrationContext, MigrationResult, ToolingMigration } from "./types.js";
4
+ //#region packages/migrate/src/registry.d.ts
5
+ /** Every registered migration. */
6
+ export declare function migrations(): ToolingMigration[];
7
+ /** A migration summary for listings. */
8
+ export interface MigrationInfo {
9
+ id: string;
10
+ from: MigrateTool;
11
+ to: MigrateTool;
12
+ description: string;
13
+ /** Whether the source config is present in the project. */
14
+ detected: boolean;
15
+ }
16
+ /** Describe every migration, flagging which are detected in `cwd`. */
17
+ export declare function listMigrations(cwd: string): MigrationInfo[];
18
+ /** The migrations whose source config is present in `cwd`. */
19
+ export declare function detectMigrations(cwd: string): ToolingMigration[];
20
+ /** Find a migration by id, or by source tool. */
21
+ export declare function findMigration(idOrFrom: string): ToolingMigration | undefined;
22
+ /** Run one migration by id (or source tool name). */
23
+ export declare function runMigration(idOrFrom: string, ctx: MigrationContext): Promise<MigrationResult>;
24
+ /** Run every migration detected in `ctx.cwd`. */
25
+ export declare function runDetectedMigrations(ctx: MigrationContext): Promise<MigrationResult[]>;
26
+ //#endregion
@@ -0,0 +1 @@
1
+ import"node:path";import"node:url";import.meta.url;import{biomeToOx as e}from"./biome.js";import{dprintToOx as t}from"./dprint.js";import{eslintToOx as n}from"./eslint.js";import{prettierToOx as r}from"./prettier.js";function i(){return[e,r,t,n]}function a(e){return i().map(t=>({id:t.id,from:t.from,to:t.to,description:t.description,detected:t.detect(e)}))}function o(e){return i().filter(t=>t.detect(e))}function s(e){return i().find(t=>t.id===e||t.from===e)}async function c(e,t){let n=s(e);if(!n)throw Error(`Unknown migration "${e}".`);return n.run(t)}async function l(e){let t=[];for(let n of o(e.cwd))t.push(await n.run(e));return t}export{o as detectMigrations,s as findMigration,a as listMigrations,i as migrations,l as runDetectedMigrations,c as runMigration};
@@ -0,0 +1,75 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ //#region packages/migrate/src/types.d.ts
4
+ /**
5
+ * The migration model.
6
+ *
7
+ * A *migration* converts a project's tooling config from a source tool (Biome,
8
+ * ESLint, Prettier, ...) to a target tool (Oxfmt / Oxlint, ie. "ox"). Migrations
9
+ * are pluggable: registering one here exposes it through the `dbx
10
+ * migrate` CLI, the programmatic API and (over JSON) the VS Code extension.
11
+ */
12
+ /** A tool a migration can read from or write to. */
13
+ export type MigrateTool = 'biome' | 'eslint' | 'prettier' | 'dprint' | 'oxfmt' | 'oxlint' | 'ox';
14
+ /** Where a migration writes its result. */
15
+ export type MigrateTarget = 'files' | 'vite';
16
+ export interface MigrationContext {
17
+ /** The project root. */
18
+ cwd: string;
19
+ /**
20
+ * `files` (default) writes `.oxfmtrc.json` / `.oxlintrc.json`; `vite` is
21
+ * reserved for folding the config into `vite.config.ts`.
22
+ */
23
+ target?: MigrateTarget;
24
+ /** Write the result (default false = dry-run). */
25
+ write?: boolean;
26
+ /** Allow network (eg. npx-based migrators). Default false. */
27
+ online?: boolean;
28
+ }
29
+ /** A field that could not be mapped faithfully. */
30
+ export interface UnmappedItem {
31
+ /** The source key/rule/option. */
32
+ source: string;
33
+ /** Why it could not be mapped. */
34
+ reason: string;
35
+ }
36
+ /** A file a migration produces (or would produce) with its exact content. */
37
+ export interface MigrationFile {
38
+ /** Absolute path. */
39
+ path: string;
40
+ /** The exact file content. */
41
+ content: string;
42
+ }
43
+ export interface MigrationResult {
44
+ id: string;
45
+ from: MigrateTool;
46
+ to: MigrateTool;
47
+ /** Files written, or that would be written (dry-run). */
48
+ written: string[];
49
+ /** The produced files with content (drives `--check`). */
50
+ files?: MigrationFile[];
51
+ /** The oxfmt config produced (present for formatter migrations). */
52
+ oxfmt?: Record<string, unknown>;
53
+ /** The oxlint config produced (present for linter migrations). */
54
+ oxlint?: Record<string, unknown>;
55
+ /** Source items with no target equivalent. */
56
+ unmapped?: UnmappedItem[];
57
+ /** Human-readable notes. */
58
+ notes?: string[];
59
+ }
60
+ /** A pluggable config migration. */
61
+ export interface ToolingMigration {
62
+ /** Stable id, eg. `biome-to-ox`. */
63
+ id: string;
64
+ /** The source tool. */
65
+ from: MigrateTool;
66
+ /** The target tool. */
67
+ to: MigrateTool;
68
+ /** Human-readable description. */
69
+ description: string;
70
+ /** Whether the source config is present in `cwd`. */
71
+ detect: (cwd: string) => boolean;
72
+ /** Run the migration. */
73
+ run: (ctx: MigrationContext) => Promise<MigrationResult>;
74
+ }
75
+ //#endregion
@@ -0,0 +1,31 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { MigrationFile } from "./types.js";
4
+ //#region packages/migrate/src/vite-target.d.ts
5
+ type Json = Record<string, unknown>;
6
+ /** Serialize a JSON-ish value as TypeScript source (single quotes, 4-space). */
7
+ export declare function serializeTs(value: unknown, indent?: number): string;
8
+ /** The index just past the `}`/`]` matching the opening bracket at `open`. */
9
+ export declare function matchBracket(source: string, open: number): number;
10
+ /** The `[valueStart, valueEnd)` range of a top-level `key:` inside an object. */
11
+ export declare function findTopLevelValue(source: string, open: number, close: number, key: string): [number, number] | undefined;
12
+ /**
13
+ * Insert or replace `fmt`/`lint` inside an existing `vite.config.ts`, or render
14
+ * a fresh one when none exists.
15
+ */
16
+ export declare function mergeViteConfig(existing: string | undefined, sections: {
17
+ fmt?: Json;
18
+ lint?: Json;
19
+ }): string;
20
+ /** The merged `vite.config.ts` for `cwd` (path + content), without writing it. */
21
+ export declare function renderViteTarget(cwd: string, sections: {
22
+ fmt?: Json;
23
+ lint?: Json;
24
+ }): MigrationFile;
25
+ /** Write the merged config to `<cwd>/vite.config.ts` and return its path. */
26
+ export declare function writeViteTarget(cwd: string, sections: {
27
+ fmt?: Json;
28
+ lint?: Json;
29
+ }, write: boolean): string;
30
+ //#endregion
31
+ export {};
@@ -0,0 +1,5 @@
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import t from"node:fs";const n=/^[A-Za-z_$][\w$]*$/;function r(e,t=0){let i=` `.repeat(t),a=` `.repeat(t+1);if(e==null)return`null`;if(typeof e==`string`)return`'${e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`)}'`;if(typeof e==`number`||typeof e==`boolean`)return String(e);if(Array.isArray(e))return e.length===0?`[]`:`[\n${e.map(e=>`${a}${r(e,t+1)}`).join(`,
2
+ `)},\n${i}]`;if(typeof e==`object`){let o=Object.entries(e);return o.length===0?`{}`:`{\n${o.map(([e,i])=>{let o=n.test(e)?e:JSON.stringify(e);return`${a}${o}: ${r(i,t+1)}`}).join(`,
3
+ `)},\n${i}}`}return JSON.stringify(e)}function i(e,t){let n=e[t],r=e[t+1];if(n===`/`&&r===`/`){for(;t<e.length&&e[t]!==`
4
+ `;)t++;return t}if(n===`/`&&r===`*`){for(t+=2;t<e.length&&(e[t]!==`*`||e[t+1]!==`/`);)t++;return t+2}if(n===`"`||n===`'`||n==="`"){let r=n;for(t++;t<e.length&&e[t]!==r;)e[t]===`\\`&&t++,t++;return t+1}return t}function a(e,t){let n={"{":`}`,"[":`]`}[e[t]];if(!n)return-1;let r=0;for(let a=t;a<e.length;a++){let o=i(e,a);if(o!==a)a=o-1;else if(e[a]===e[t])r++;else if(e[a]===n&&(r--,r===0))return a+1}return-1}function o(e,t,r,o){let s=1;for(let c=t+1;c<r;c++){let t=i(e,c);if(t!==c){c=t-1;continue}let l=e[c];if(l===`{`||l===`[`)s++;else if(l===`}`||l===`]`)s--;else if(s===1&&n.test(l)){let t=c;for(;t<r&&/[\w$]/.test(e[t]);)t++;let n=e.slice(c,t),i=t;for(;i<r&&/\s/.test(e[i]);)i++;if(n===o&&e[i]===`:`){let t=i+1;for(;t<r&&/\s/.test(e[t]);)t++;let n=e[t];if(n===`{`||n===`[`)return[t,a(e,t)];let o=t;for(;o<r&&e[o]!==`,`;)o++;return[t,o]}c=t-1}}}function s(e,t){let n=Object.entries(t).filter(([,e])=>e!==void 0);if(!e)return`import { defineConfig } from 'vite-plus';\n\nexport default defineConfig({\n${n.map(([e,t])=>` ${e}: ${r(t,1)},`).join(`
5
+ `)}\n});\n`;let i=e,s=i.match(/defineConfig\s*\(\s*\{/);if(!s||s.index===void 0)return i;for(let[e,t]of n){let n=i.match(/defineConfig\s*\(\s*\{/);if(!n||n.index===void 0)break;let s=i.indexOf(`{`,n.index),c=a(i,s);if(c===-1)break;let l=r(t,1),u=o(i,s,c,e);i=u?`${i.slice(0,u[0])}${l}${i.slice(u[1])}`:`${i.slice(0,s+1)}\n ${e}: ${l},${i.slice(s+1)}`}return i}function c(n,r){let i=e.join(n,`vite.config.ts`);return{path:i,content:s(t.existsSync(i)?t.readFileSync(i,`utf-8`):void 0,r)}}function l(e,n,r){let i=c(e,n);return r&&t.writeFileSync(i.path,i.content,`utf-8`),i.path}export{o as findTopLevelValue,a as matchBracket,s as mergeViteConfig,c as renderViteTarget,r as serializeTs,l as writeViteTarget};
@@ -0,0 +1,8 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { ToolingCommand } from "../../../shared/src/types.js";
4
+ import "../../../shared/src/index.js";
5
+ //#region packages/project/src/cli/index.d.ts
6
+ /** Build the project scaffolding commands. */
7
+ export declare function projectCommands(): ToolingCommand[];
8
+ //#endregion
@@ -0,0 +1 @@
1
+ import"node:path";import"node:url";import.meta.url;import{createMonorepoRootFiles as e,createRootProjectFiles as t,createWorkspaceFiles as n,writeGeneratedFiles as r}from"../typescript.js";import{generateProjectConfigs as i}from"../config.js";const a=[{flags:`--no-config`,description:`Skip the dbx.config.ts file.`},{flags:`--type <type>`,description:`Project type: project | monorepo-root | monorepo-workspace.`}];function o(){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).`},...a],run:(e,n)=>{let i=String(e.name??n.config.project?.name??`app`),a=t({name:i,...e.scope?{scope:e.scope}:{},type:e.type??`project`,includeConfig:e.config??!0}),o=r(a,e.out??n.cwd);for(let e of o)console.log(`Created ${e}`)}},{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).`},...a],run:(t,i)=>{let a=String(t.name??i.config.project?.name??`monorepo`),o=t.scope??i.config.project?.scope??`@${a}`,s=t.out??i.cwd,c=t.config??!0,l=t.type??`monorepo-root`,u=e({name:a,scope:o,type:l,includeConfig:c,workspaces:[{alias:`core`,dir:`packages/core`}]});u.push(...n({name:a,scope:o,wsName:`core`,wsDir:`packages/core`,type:`monorepo-workspace`,includeConfig:c}).map(e=>({...e,path:`packages/core/${e.path}`})));let d=r(u,s);for(let e of d)console.log(`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>).`},...a],run:(e,t)=>{let i=e.root??t.cwd,a=String(e.name??`workspace`),o=e.scope??t.config.project?.scope??`@${a}`,s=(e.dir??`packages/${a}`).replace(/\\/g,`/`).replace(/\/+$/,``),c=e.config??!0,l=e.type??`monorepo-workspace`,u=n({name:a,scope:o,wsName:a,wsDir:s,type:l,includeConfig:c}).map(e=>({...e,path:`${s}/${e.path}`})),d=r(u,i);for(let e of d)console.log(`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:(e,t)=>{let n=e.cwd??t.cwd,r=i({root:n,...e.include?{include:e.include}:{},...e.exclude?{exclude:e.exclude}:{},...e.type?{type:e.type}:{},force:!!e.force,dryRun:!!e.dryRun});if(e.json){console.log(JSON.stringify(r,null,4));return}let a=r.dryRun?`would create`:`created`;console.log(`dbx: ${a} ${r.created.length} config(s), skipped ${r.skipped.length}.`);for(let e of r.configs)e.created&&console.log(` + ${e.rel===`.`?`dbx.config.ts`:`${e.rel}/dbx.config.ts`} [${e.type}]`)}}]}export{o as projectCommands};
@@ -0,0 +1,55 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { ProjectType } from "../../shared/src/config-schema.js";
4
+ import "../../shared/src/index.js";
5
+ //#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";
8
+ export interface GenerateProjectConfigsOptions {
9
+ /** Root to scan for projects. */
10
+ root: string;
11
+ /** Keep only projects matching one of these patterns (glob or substring). */
12
+ include?: string[];
13
+ /** Drop projects matching any of these patterns (glob or substring). */
14
+ exclude?: string[];
15
+ /** Force a project type instead of detecting it. */
16
+ type?: ProjectType;
17
+ /** Overwrite existing config files (default: skip projects that have one). */
18
+ force?: boolean;
19
+ /** Maximum directory depth to scan (default 5). */
20
+ maxDepth?: number;
21
+ /** Report what would be written without writing anything. */
22
+ dryRun?: boolean;
23
+ }
24
+ /** One project considered for config generation. */
25
+ export interface GeneratedProjectConfig {
26
+ /** Absolute project directory. */
27
+ dir: string;
28
+ /** Directory relative to the root (posix). */
29
+ rel: string;
30
+ /** Package name when available. */
31
+ name?: string;
32
+ /** The resolved project type. */
33
+ type: ProjectType;
34
+ /** The config file path (absolute). */
35
+ configPath: string;
36
+ /** Whether the config was (or would be) written. */
37
+ created: boolean;
38
+ /** Why the project was skipped, when it was. */
39
+ skipped?: string;
40
+ }
41
+ export interface GenerateProjectConfigsResult {
42
+ configs: GeneratedProjectConfig[];
43
+ /** Project dirs whose config was (or would be) written. */
44
+ created: string[];
45
+ /** Project dirs skipped (already have a config). */
46
+ skipped: string[];
47
+ dryRun: boolean;
48
+ }
49
+ /**
50
+ * Generate a `dbx.config.ts` for every discovered project that is missing one
51
+ * (unless `force`). The project type is detected from the filesystem unless
52
+ * overridden. Returns the configs written (or that would be).
53
+ */
54
+ export declare function generateProjectConfigs(options: GenerateProjectConfigsOptions): GenerateProjectConfigsResult;
55
+ //#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"../../shared/src/index.js";import{detectProjectType as n}from"../../core/src/project-type.js";import{selectProjects as r}from"../../core/src/select.js";import"../../core/src/index.js";import{renderToolingConfig as i}from"./typescript.js";import a from"node:fs";const o=`dbx.config.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(c){let l=c.dryRun??!1,u=c.force??!1,d=r({root:c.root,...c.include?{include:c.include}:{},...c.exclude?{exclude:c.exclude}:{},...c.maxDepth===void 0?{}:{maxDepth:c.maxDepth}}),f=[],p=[],m=[];for(let r of d){let d=e.join(r.dir,o);if((r.hasConfig||a.existsSync(d))&&!u){m.push(r.rel),f.push({dir:r.dir,rel:r.rel,...r.name?{name:r.name}:{},type:c.type??n(r.dir),configPath:d,created:!1,skipped:`has config`});continue}let h=c.type??n(r.dir),g=t(r.dir,`package.json`),{name:_,scope:v}=s(r.name??g?.name,r.dir),y=i({name:_,...v?{scope:v}:{},type:h});l||a.writeFileSync(d,y,`utf-8`),p.push(r.rel),f.push({dir:r.dir,rel:r.rel,...r.name?{name:r.name}:{},type:h,configPath:d,created:!0})}return{configs:f,created:p,skipped:m,dryRun:l}}export{o as GENERATED_CONFIG_FILENAME,c as generateProjectConfigs};
@@ -0,0 +1,10 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { projectCommands } from "./cli/index.js";
4
+ import { GENERATED_CONFIG_FILENAME, GenerateProjectConfigsOptions, GenerateProjectConfigsResult, GeneratedProjectConfig, generateProjectConfigs } from "./config.js";
5
+ import { MonorepoRootContext, ProjectContext, WorkspaceContext, createMonorepoRootFiles, createRootProjectFiles, createWorkspaceFiles, renderGitignore, renderToolingConfig, renderTurboJson, renderWorkspaceTsconfig, writeGeneratedFiles } from "./typescript.js";
6
+ declare namespace index_d_exports {
7
+ export { GENERATED_CONFIG_FILENAME, GenerateProjectConfigsOptions, GenerateProjectConfigsResult, GeneratedProjectConfig, MonorepoRootContext, ProjectContext, WorkspaceContext, createMonorepoRootFiles, createRootProjectFiles, createWorkspaceFiles, generateProjectConfigs, projectCommands, renderGitignore, renderToolingConfig, renderTurboJson, renderWorkspaceTsconfig, writeGeneratedFiles };
8
+ }
9
+ //#endregion
10
+ export { GENERATED_CONFIG_FILENAME, GenerateProjectConfigsOptions, GenerateProjectConfigsResult, GeneratedProjectConfig, MonorepoRootContext, ProjectContext, WorkspaceContext, createMonorepoRootFiles, createRootProjectFiles, createWorkspaceFiles, generateProjectConfigs, index_d_exports, projectCommands, renderGitignore, renderToolingConfig, renderTurboJson, renderWorkspaceTsconfig, writeGeneratedFiles };
@@ -0,0 +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,renderToolingConfig 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,renderToolingConfig:()=>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 renderToolingConfig,o as renderTurboJson,s as renderWorkspaceTsconfig,f as src_exports,c as writeGeneratedFiles};