@deltabox/toolchain 2.3.2 → 2.4.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.
- package/CHANGELOG.md +55 -6
- package/dist/core.d.ts +2 -1
- package/dist/core.js +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.js +1 -1
- package/dist/migrate.d.ts +3 -3
- package/dist/migrate.js +1 -1
- package/dist/package.js +1 -1
- package/dist/packages/changelog/src/workflows.js +1 -1
- package/dist/packages/core/src/fmt-groups.d.ts +32 -0
- package/dist/packages/core/src/fmt-groups.js +1 -0
- package/dist/packages/core/src/index.d.ts +3 -2
- package/dist/packages/core/src/index.js +1 -1
- package/dist/packages/core/src/select.d.ts +3 -0
- package/dist/packages/core/src/select.js +1 -1
- package/dist/packages/core/src/sync.js +1 -1
- package/dist/packages/migrate/src/cli/index.js +1 -1
- package/dist/packages/migrate/src/index.d.ts +3 -3
- package/dist/packages/migrate/src/index.js +1 -1
- package/dist/packages/migrate/src/oxc.js +1 -1
- package/dist/packages/migrate/src/types.d.ts +3 -2
- package/dist/packages/migrate/src/vite-target.d.ts +7 -0
- package/dist/packages/migrate/src/vite-target.js +2 -2
- package/dist/packages/migrate/src/vite.d.ts +30 -1
- package/dist/packages/migrate/src/vite.js +10 -8
- package/dist/packages/project/src/cli/index.js +1 -1
- package/dist/packages/project/src/config.d.ts +20 -5
- package/dist/packages/project/src/config.js +1 -1
- package/dist/packages/project/src/index.d.ts +3 -3
- package/dist/packages/project/src/index.js +1 -1
- package/dist/packages/project/src/typescript.d.ts +26 -0
- package/dist/packages/project/src/typescript.js +17 -10
- package/dist/packages/shared/src/config-schema/changelog.d.ts +572 -10
- package/dist/packages/shared/src/config-schema/ci.d.ts +1746 -60
- package/dist/packages/shared/src/config-schema/index.d.ts +6090 -1032
- package/dist/packages/shared/src/config-schema/index.js +1 -1
- package/dist/packages/shared/src/config-schema/workflow.d.ts +3825 -481
- package/dist/packages/shared/src/config-schema/workflow.js +1 -1
- package/dist/packages/shared/src/config-types.d.ts +123 -15
- package/dist/packages/shared/src/ignore.d.ts +8 -0
- package/dist/packages/shared/src/ignore.js +1 -1
- package/dist/packages/shared/src/index.d.ts +7 -7
- package/dist/packages/shared/src/index.js +1 -1
- package/dist/packages/shared/src/string-utils.d.ts +9 -2
- package/dist/packages/shared/src/string-utils.js +2 -2
- package/dist/packages/shared/src/toolchain.d.ts +3 -3
- package/dist/packages/shared/src/toolchain.js +1 -1
- package/dist/packages/shared/src/vite-defaults.d.ts +33 -8
- package/dist/packages/shared/src/vite-defaults.js +1 -1
- package/dist/packages/vite/src/index.d.ts +3 -1
- package/dist/packages/vite/src/index.js +1 -1
- package/dist/packages/vite/src/resolve.js +1 -1
- package/dist/packages/vite/src/sync.js +3 -3
- package/dist/project.d.ts +2 -2
- package/dist/project.js +1 -1
- package/dist/shared.d.ts +6 -6
- package/dist/shared.js +1 -1
- package/dist/tooling.js +1 -1
- package/dist/vite.d.ts +2 -1
- package/dist/vite.js +1 -1
- package/package.json +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
import"node:path";import"node:url";import.meta.url;import{DEFAULT_IGNORE as e,mapBiomeFormatter as t,mapBiomeIncludes as n,mapBiomeToOxfmt as r,mapOrganizeImports as i}from"./oxfmt-map.js";import{RULE_MAP as a,mapBiomeToOxlint as o}from"./oxlint-map.js";import{findTopLevelValue as s,
|
|
1
|
+
import"node:path";import"node:url";import.meta.url;import{DEFAULT_IGNORE as e,mapBiomeFormatter as t,mapBiomeIncludes as n,mapBiomeToOxfmt as r,mapOrganizeImports as i}from"./oxfmt-map.js";import{RULE_MAP as a,mapBiomeToOxlint as o}from"./oxlint-map.js";import{findTopLevelValue as s,findViteMergeObject as c,matchBracket as l,mergeViteConfig as u,renderViteTarget as d,serializeTs as f,writeViteTarget as p}from"./vite-target.js";import{BIOME_CONFIG_FILES as m,biomeToOx as h,findBiomeConfig as g,readJsonc as _,stripJsonc as v}from"./biome.js";import{diffFiles as y,hasPending as b}from"./check.js";import{dprintToOx as x,findDprintConfig as S,mapDprintToOxfmt as C}from"./dprint.js";import{eslintToOx as w,findEslintConfig as T,mapRuleName as E,runOxlintMigrate as D}from"./eslint.js";import{VITE_CONFIG_FILES as O,ensureViteFmtIgnore as k,extractViteObject as A,findDbxConfig as j,findViteConfig as M,foldToolchainSection as N,foldViteIntoConfig as P,mergeViteObjects as F,objectHasSections as I,renderFreshSectionsConfig as L,renderFreshViteConfig as R,scanLiteralObject as z,viteConfigHasFmtLint as B,viteToToolchain as V}from"./vite.js";import{OXC_FMT_FILE as H,OXC_LINT_FILE as U,findOxcConfigs as W,oxcToToolchain as G}from"./oxc.js";import{findPrettierConfig as K,hasPrettierConfig as q,mapPrettierToOxfmt as J,prettierToOx as Y,readPrettierIgnore as X}from"./prettier.js";import{detectMigrations as Z,findMigration as Q,listMigrations as $,migrations as ee,runDetectedMigrations as te,runMigration as ne}from"./registry.js";import{migrateCommands as re}from"./cli/index.js";export{m as BIOME_CONFIG_FILES,e as DEFAULT_IGNORE,H as OXC_FMT_FILE,U as OXC_LINT_FILE,a as RULE_MAP,O as VITE_CONFIG_FILES,h as biomeToOx,Z as detectMigrations,y as diffFiles,x as dprintToOx,k as ensureViteFmtIgnore,w as eslintToOx,A as extractViteObject,g as findBiomeConfig,j as findDbxConfig,S as findDprintConfig,T as findEslintConfig,Q as findMigration,W as findOxcConfigs,K as findPrettierConfig,s as findTopLevelValue,M as findViteConfig,c as findViteMergeObject,N as foldToolchainSection,P as foldViteIntoConfig,b as hasPending,q as hasPrettierConfig,$ as listMigrations,t as mapBiomeFormatter,n as mapBiomeIncludes,r as mapBiomeToOxfmt,o as mapBiomeToOxlint,C as mapDprintToOxfmt,i as mapOrganizeImports,J as mapPrettierToOxfmt,E as mapRuleName,l as matchBracket,u as mergeViteConfig,F as mergeViteObjects,re as migrateCommands,ee as migrations,I as objectHasSections,G as oxcToToolchain,Y as prettierToOx,_ as readJsonc,X as readPrettierIgnore,L as renderFreshSectionsConfig,R as renderFreshViteConfig,d as renderViteTarget,te as runDetectedMigrations,ne as runMigration,D as runOxlintMigrate,z as scanLiteralObject,f as serializeTs,v as stripJsonc,B as viteConfigHasFmtLint,V as viteToToolchain,p as writeViteTarget};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{default as e}from"node:path";import"node:url";import.meta.url;import{readManifest as t}from"../../core/src/manifest.js";import"../../core/src/index.js";import{serializeTs as n}from"./vite-target.js";import{readJsonc as r}from"./biome.js";import{foldToolchainSection as i,renderFreshSectionsConfig as
|
|
1
|
+
import{default as e}from"node:path";import"node:url";import.meta.url;import{readManifest as t}from"../../core/src/manifest.js";import"../../core/src/index.js";import{serializeTs as n}from"./vite-target.js";import{readJsonc as r}from"./biome.js";import{foldToolchainSection as i,foldViteIntoConfig as a,renderFreshSectionsConfig as o,renderFreshViteConfig as s}from"./vite.js";import c from"node:fs";const l=`.oxfmtrc.json`,u=`.oxlintrc.json`;function d(e,n){try{return t(e).files.includes(n)}catch{return!1}}function f(t){let n=e.join(t,l),r=e.join(t,u);return{...c.existsSync(n)&&!d(t,`.oxfmtrc.json`)?{fmt:n}:{},...c.existsSync(r)&&!d(t,`.oxlintrc.json`)?{lint:r}:{}}}function p(e){let{$schema:t,...n}=e;return n}function m(t){for(let n of[`dbx.config.ts`,`dbx.config.mts`,`dbx.config.js`,`dbx.config.mjs`,`dbx.config.cjs`,`dbx.config.json`]){let r=e.join(t,n);if(c.existsSync(r))return r}}const h={id:`oxc-to-toolchain`,from:`oxc`,to:`toolchain`,description:`Fold .oxfmtrc.json / .oxlintrc.json into toolchain.fmt/lint.oxc.`,detect:e=>!!(f(e).fmt||f(e).lint),run:async t=>{let l=f(t.cwd);if(!l.fmt&&!l.lint)throw Error(`oxc-to-toolchain: no Oxc config found.`);let u=l.fmt?p(r(l.fmt)):void 0,d=l.lint?p(r(l.lint)):void 0,g=[...l.fmt?[`Source: ${e.basename(l.fmt)} (Oxfmt).`]:[],...l.lint?[`Source: ${e.basename(l.lint)} (Oxlint).`]:[]],_=(t.target??`files`)===`vite`,v=[...u?[{key:`fmt`,objectText:n({oxc:u})}]:[],...d?[{key:`lint`,objectText:n({oxc:d})}]:[]],y=_?n({...u?{fmt:u}:{},...d?{lint:d}:{}}):void 0,b=m(t.cwd),x,S;if(!b)x=e.join(t.cwd,`dbx.config.ts`),S=_?s(y):o(v);else if(b.endsWith(`.json`))return{id:h.id,from:`oxc`,to:`toolchain`,written:[],files:[],oxfmt:u,oxlint:d,unmapped:[{source:e.basename(b),reason:`JSON configs cannot hold the folded object by text-splice`}],notes:[...g,`Fold into the JSON config by hand.`]};else if(_){let t=c.readFileSync(b,`utf-8`).replace(/^\uFEFF/,``),n=a(t,y);if(`error`in n)return{id:h.id,from:`oxc`,to:`toolchain`,written:[],files:[],oxfmt:u,oxlint:d,unmapped:[{source:e.basename(b),reason:n.error}],notes:[...g,`Left dbx.config.* unchanged; fold it by hand.`]};x=b,S=n.content}else{let t=c.readFileSync(b,`utf-8`).replace(/^\uFEFF/,``);for(let n of v){let r=i(t,n.key,n.objectText);if(`error`in r)return{id:h.id,from:`oxc`,to:`toolchain`,written:[],files:[],oxfmt:u,oxlint:d,unmapped:[{source:e.basename(b),reason:r.error}],notes:[...g,`Left dbx.config.* unchanged; fold it by hand.`]};t=r.content}x=b,S=t}let C={path:x,content:S};t.write&&c.writeFileSync(x,S,`utf-8`);let w=[l.fmt,l.lint].filter(e=>!!e),T=t.ignoreManagedFiles?[]:w;if(t.ignoreManagedFiles)g.push(`Kept the source Oxc files (ignoreManagedFiles).`);else{if(t.write)for(let e of T)c.rmSync(e,{force:!0});T.length>0&&g.push(`${t.write?`Removed`:`Would remove`} the source Oxc files; \`dbx sync\` regenerates them.`)}return{id:h.id,from:`oxc`,to:`toolchain`,written:[x],removed:T,files:[C],oxfmt:u,oxlint:d,notes:[...g,_?"Folded into `toolchain.vite.fmt` / `toolchain.vite.lint`.":"Folded into `toolchain.fmt.oxc` / `toolchain.lint.oxc`."]}}};export{l as OXC_FMT_FILE,u as OXC_LINT_FILE,f as findOxcConfigs,h as oxcToToolchain};
|
|
@@ -17,8 +17,9 @@ export interface MigrationContext {
|
|
|
17
17
|
/** The project root. */
|
|
18
18
|
cwd: string;
|
|
19
19
|
/**
|
|
20
|
-
* `files` (default) writes `.oxfmtrc.json` / `.oxlintrc.json`; `vite`
|
|
21
|
-
*
|
|
20
|
+
* `files` (default) writes `.oxfmtrc.json` / `.oxlintrc.json`; `vite` merges
|
|
21
|
+
* `fmt`/`lint` into `vite.config.ts` (or into `toolchain.vite` for the
|
|
22
|
+
* `oxc` source).
|
|
22
23
|
*/
|
|
23
24
|
target?: MigrateTarget;
|
|
24
25
|
/** Write the result (default false = dry-run). */
|
|
@@ -9,6 +9,13 @@ export declare function serializeTs(value: unknown, indent?: number): string;
|
|
|
9
9
|
export declare function matchBracket(source: string, open: number): number;
|
|
10
10
|
/** The `[valueStart, valueEnd)` range of a top-level `key:` inside an object. */
|
|
11
11
|
export declare function findTopLevelValue(source: string, open: number, close: number, key: string): [number, number] | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* The index of the object literal `fmt`/`lint` can be merged into: the argument
|
|
14
|
+
* of `defineConfig({ ... })`, or an `export default { ... }` /
|
|
15
|
+
* `module.exports = { ... }` object. Returns `undefined` for function/async
|
|
16
|
+
* configs (which cannot be safely text-spliced).
|
|
17
|
+
*/
|
|
18
|
+
export declare function findViteMergeObject(source: string): number | undefined;
|
|
12
19
|
/**
|
|
13
20
|
* Insert or replace `fmt`/`lint` inside an existing `vite.config.ts`, or render
|
|
14
21
|
* a fresh one when none exists.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
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
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
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]!==`,`&&e[o]!==`}`;)o++;for(;o>t&&/\s/.test(e[o-1]);)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
|
|
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]!==`,`&&e[o]!==`}`;)o++;for(;o>t&&/\s/.test(e[o-1]);)o--;return[t,o]}c=t-1}}}function s(e){let t=e.match(/\bdefineConfig\s*\(\s*\{/);if(t?.index!==void 0)return e.indexOf(`{`,t.index);let n=e.match(/\bexport\s+default\s*\{/)??e.match(/\bmodule\.exports\s*=\s*\{/);if(n?.index!==void 0)return e.indexOf(`{`,n.index)}function c(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;if(s(i)===void 0)throw Error("cannot merge into a function/async vite config; add `fmt`/`lint` manually.");for(let[e,t]of n){let n=s(i);if(n===void 0)break;let c=a(i,n);if(c===-1)break;let l=r(t,1),u=o(i,n,c,e);i=u?`${i.slice(0,u[0])}${l}${i.slice(u[1])}`:`${i.slice(0,n+1)}\n ${e}: ${l},${i.slice(n+1)}`}return i}function l(n,r){let i=e.join(n,`vite.config.ts`);return{path:i,content:c(t.existsSync(i)?t.readFileSync(i,`utf-8`).replace(/^\uFEFF/,``):void 0,r)}}function u(e,n,r){let i=l(e,n);return r&&t.writeFileSync(i.path,i.content,`utf-8`),i.path}export{o as findTopLevelValue,s as findViteMergeObject,a as matchBracket,c as mergeViteConfig,l as renderViteTarget,r as serializeTs,u as writeViteTarget};
|
|
@@ -25,6 +25,23 @@ export declare function extractViteObject(source: string): {
|
|
|
25
25
|
} | {
|
|
26
26
|
error: string;
|
|
27
27
|
};
|
|
28
|
+
/** The top-level `fmt`/`lint` keys present in an object literal. */
|
|
29
|
+
export declare function objectHasSections(objectText: string): {
|
|
30
|
+
fmt: boolean;
|
|
31
|
+
lint: boolean;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Whether an existing hand-written `vite.config.*` or an existing
|
|
35
|
+
* `dbx.config.*`'s `toolchain.vite` already defines `fmt`/`lint`.
|
|
36
|
+
*
|
|
37
|
+
* This decides where a formatter/linter migration lands: when Vite already owns
|
|
38
|
+
* `fmt`/`lint`, the migrated options belong in `toolchain.vite`; otherwise they
|
|
39
|
+
* belong in the top-level `toolchain.fmt`/`toolchain.lint`.
|
|
40
|
+
*/
|
|
41
|
+
export declare function viteConfigHasFmtLint(cwd: string): {
|
|
42
|
+
fmt: boolean;
|
|
43
|
+
lint: boolean;
|
|
44
|
+
} | undefined;
|
|
28
45
|
/**
|
|
29
46
|
* Whether `text` (an object literal, braces included) is made only of literals:
|
|
30
47
|
* objects, arrays, strings, numbers, booleans, `null`/`undefined` and bare keys.
|
|
@@ -62,13 +79,25 @@ export declare function renderFreshSectionsConfig(sections: {
|
|
|
62
79
|
key: string;
|
|
63
80
|
objectText: string;
|
|
64
81
|
}[]): string;
|
|
82
|
+
/**
|
|
83
|
+
* Render a fresh `dbx.config.ts` holding the folded Vite object, for a project
|
|
84
|
+
* that has a hand-written `vite.config.*` but no `dbx.config.*` yet. Like the
|
|
85
|
+
* scaffold, it wraps the config in `defineConfig` from `@deltabox/toolchain` (a
|
|
86
|
+
* workspace resolves it through the root's installed dependency).
|
|
87
|
+
*/
|
|
88
|
+
export declare function renderFreshViteConfig(objectText: string): string;
|
|
65
89
|
/**
|
|
66
90
|
* Ensure `fmt.ignorePatterns` contains `'/vite.config.ts'` in a folded Vite
|
|
67
91
|
* object literal, so Oxfmt does not reformat the generated root `vite.config.ts`
|
|
68
92
|
* shim (which would make `dbx sync --check` drift). Works on the object text
|
|
69
93
|
* (braces included) with the same balanced scanner used to fold it in.
|
|
94
|
+
*
|
|
95
|
+
* `create` (default true) adds a `fmt` object when the literal has none. Pass
|
|
96
|
+
* `false` when `fmt` belongs in the top-level `toolchain.fmt` instead: the
|
|
97
|
+
* default fmt ignores already cover the generated shim, and adding `vite.fmt`
|
|
98
|
+
* here would make Vite own formatting even though the original config did not.
|
|
70
99
|
*/
|
|
71
|
-
export declare function ensureViteFmtIgnore(objectText: string): string;
|
|
100
|
+
export declare function ensureViteFmtIgnore(objectText: string, create?: boolean): string;
|
|
72
101
|
/** Fold a hand-written root `vite.config.*` into `dbx.config.*`. */
|
|
73
102
|
export declare const viteToToolchain: ToolchainMigration;
|
|
74
103
|
//#endregion
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import{default as e}from"node:path";import"node:url";import.meta.url;import{CONFIG_FILE_NAMES as t}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import{findTopLevelValue as n,matchBracket as
|
|
2
|
-
`;)t++;return t}if(n===`/`&&r===`*`){for(t+=2;t<e.length&&(e[t]!==`*`||e[t+1]!==`/`);)t++;return t+2}if(n===`"`||n===`'`){let r=n;for(t++;t<e.length&&e[t]!==r;)e[t]===`\\`&&t++,t++;return t+1}return t}function
|
|
3
|
-
`,t-1)+1;return e.slice(n).match(/^[ \t]*/)?.[0]??``}function
|
|
1
|
+
import{default as e}from"node:path";import"node:url";import.meta.url;import{CONFIG_FILE_NAMES as t}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import{findTopLevelValue as n,findViteMergeObject as r,matchBracket as i}from"./vite-target.js";import a from"node:fs";const o=[`vite.config.ts`,`vite.config.mts`,`vite.config.js`,`vite.config.mjs`];function s(t){for(let n of o){let r=e.join(t,n);if(a.existsSync(r))return r}}function c(n){for(let r of t){let t=e.join(n,r);if(a.existsSync(t))return t}}function l(e,t){let n=e[t],r=e[t+1];if(n===`/`&&r===`/`){for(;t<e.length&&e[t]!==`
|
|
2
|
+
`;)t++;return t}if(n===`/`&&r===`*`){for(t+=2;t<e.length&&(e[t]!==`*`||e[t+1]!==`/`);)t++;return t+2}if(n===`"`||n===`'`){let r=n;for(t++;t<e.length&&e[t]!==r;)e[t]===`\\`&&t++,t++;return t+1}return t}function u(e,t){let n=e.lastIndexOf(`
|
|
3
|
+
`,t-1)+1;return e.slice(n).match(/^[ \t]*/)?.[0]??``}function d(e,t){return e.split(`
|
|
4
4
|
`).map((e,n)=>n===0?e:`${t}${e}`).join(`
|
|
5
|
-
`)}function
|
|
5
|
+
`)}function f(e,t){return t?e.split(`
|
|
6
6
|
`).map((e,n)=>n>0&&e.startsWith(t)?e.slice(t.length):e).join(`
|
|
7
|
-
`):e}function
|
|
8
|
-
`)&&m?
|
|
7
|
+
`):e}function p(e,t,n){let r=[],i=1;for(let a=t+1;a<n;a++){let t=l(e,a);if(t!==a){a=t-1;continue}let o=e[a];if(o===`{`||o===`[`)i++;else if(o===`}`||o===`]`)i--;else if(i===1&&/[A-Za-z_$]/.test(o)){let t=a;for(;t<n&&/[\w$]/.test(e[t]);)t++;let i=t;for(;i<n&&/\s/.test(e[i]);)i++;i<n&&e[i]===`:`&&r.push(e.slice(a,t)),a=t-1}}return r}function m(e,t){let r=e.indexOf(`{`),a=r===-1?-1:i(e,r);if(r===-1||a===-1)return e;let o=a-1,s=e.slice(0,o),c=e.slice(o),l=s.replace(/\s+$/,``),d=u(e,o),f=p(e,r,a)[0],m=f===void 0?void 0:n(e,r,a,f),h=s.includes(`
|
|
8
|
+
`)&&m?u(e,m[0]):`${d} `;return`${l}${l.endsWith(`{`)||l.endsWith(`,`)?``:`,`}${t.map(({key:e,value:t})=>`\n${h}${e}: ${t},`).join(``)}\n${d}${c}`}function h(e,t){let r=e.indexOf(`{`),a=t.indexOf(`{`),o=r===-1?-1:i(e,r),s=a===-1?-1:i(t,a);if(r===-1||o===-1||a===-1||s===-1)return t;let c=[],l=[];for(let i of p(t,a,s)){let u=n(t,a,s,i);if(!u)continue;let d=t.slice(u[0],u[1]),f=n(e,r,o,i);if(f){let t=e.slice(f[0],f[1]),n=t.trimStart().startsWith(`{`)&&d.trimStart().startsWith(`{`)?h(t,d):d;c.push({start:f[0],end:f[1],text:n})}else l.push({key:i,value:d})}let u=e;for(let e of c.sort((e,t)=>t.start-e.start))u=`${u.slice(0,e.start)}${e.text}${u.slice(e.end)}`;return l.length>0?m(u,l):u}function g(e){let t=e.indexOf(`{`),r=t===-1?-1:i(e,t);if(t===-1||r===-1)return e;let a=n(e,t,r,`config`);return!a||e.slice(a[0],a[1]).trim()!==`false`?e:`${e.slice(0,a[0])}true${e.slice(a[1])}`}function _(e){let t=e.match(/\bdefineConfig\s*\(/),n=0;if(t&&t.index!==void 0)n=t.index+t[0].length;else{let t=e.match(/export\s+default\s*/)??e.match(/\bmodule\.exports\s*=\s*/);if(!t||t.index===void 0)return;n=t.index+t[0].length}let r=n;for(;r<e.length&&e[r]!==`{`;)r++;if(r>=e.length)return;let a=i(e,r);return a===-1?void 0:[r,a]}function v(e){let t=e.match(/\bdefineConfig\s*\(/),n=-1;if(t&&t.index!==void 0)n=t.index+t[0].length;else{let t=e.match(/export\s+default\s*/)??e.match(/\bmodule\.exports\s*=\s*/);t&&t.index!==void 0&&(n=t.index+t[0].length)}if(n===-1)return{error:"no `defineConfig(...)` call or default-exported object found"};for(;n<e.length&&/\s/.test(e[n]);)n++;if(e[n]!==`{`)return{error:`the config value is not an object literal (it is a variable or an expression)`};let r=i(e,n);return r===-1?{error:`unbalanced braces in the config object`}:{text:e.slice(n,r)}}function y(e){let t=e.indexOf(`{`);if(t===-1)return{fmt:!1,lint:!1};let r=i(e,t);return r===-1?{fmt:!1,lint:!1}:{fmt:!!n(e,t,r,`fmt`),lint:!!n(e,t,r,`lint`)}}function b(e){let t=_(e);if(!t)return;let r=n(e,t[0],t[1],`toolchain`);if(!r)return;let i=n(e,r[0],r[1],`vite`);if(!i)return;let a=e.slice(i[0],i[1]);return a.trimStart().startsWith(`{`)?a:void 0}function x(e){let t,n=s(e);if(n)try{let e=a.readFileSync(n,`utf-8`).replace(/^\uFEFF/,``);if(!D(e)&&r(e)!==void 0){let n=v(e);`error`in n||(t=y(n.text))}}catch{}let i,o=c(e);if(o&&!o.endsWith(`.json`))try{let e=b(a.readFileSync(o,`utf-8`).replace(/^\uFEFF/,``));e&&(i=y(e))}catch{}return t&&i?{fmt:t.fmt||i.fmt,lint:t.lint||i.lint}:t??i}function S(e){let t=0;for(;t<e.length;){let n=e[t];if(n==="`")return{ok:!1,reason:`template literal`};let r=l(e,t);if(r!==t)t=r;else{if(n===`.`&&e[t+1]===`.`&&e[t+2]===`.`)return{ok:!1,reason:"spread (`...`)"};if(/[A-Za-z_$]/.test(n)){let n=t;for(;n<e.length&&/[\w$]/.test(e[n]);)n++;let r=e.slice(t,n),i=n;for(;i<e.length&&/\s/.test(e[i]);)i++;if(e[i]!==`:`&&![`true`,`false`,`null`,`undefined`].includes(r))return{ok:!1,reason:`non-literal value \`${r}\``};t=n}else t++}}return{ok:!0}}function C(e,t){let r=_(e);if(!r)return{error:`could not locate the config root object`};let[i,a]=r,o=n(e,i,a,`toolchain`);if(!o)return{error:"the config has no `toolchain` object to add `vite` to"};let[s,c]=o,l=n(e,s,c,`vite`);if(l){let[n,r]=l,i=u(e,n),a=f(e.slice(n,r),i),o=d(g(a.trimStart().startsWith(`{`)&&t.trimStart().startsWith(`{`)?h(a,t):t),i);return{content:`${e.slice(0,n)}${o}${e.slice(r)}`}}let p=`${u(e,s)} `,m=d(t,p);return{content:`${e.slice(0,s+1)}\n${p}vite: ${m},${e.slice(s+1)}`}}function w(e,t,r){let i=_(e);if(!i)return{error:`could not locate the config root object`};let[a,o]=i,s=n(e,a,o,`toolchain`);if(!s)return{error:`the config has no \`toolchain\` object to add \`${t}\` to`};let[c,l]=s,p=n(e,c,l,t);if(p){let[t,n]=p,i=u(e,t),a=f(e.slice(t,n),i),o=a.trimStart().startsWith(`{`)&&r.trimStart().startsWith(`{`)?h(a,r):r;return{content:`${e.slice(0,t)}${d(o,i)}${e.slice(n)}`}}let m=`${u(e,c)} `;return{content:`${e.slice(0,c+1)}\n${m}${t}: ${d(r,m)},${e.slice(c+1)}`}}function T(e){return[`import { defineConfig } from '@deltabox/toolchain';`,``,`export default defineConfig({`,` toolchain: {`,e.map(({key:e,objectText:t})=>` ${e}: ${d(t,` `)},`).join(`
|
|
9
9
|
`),` },`,`});`,``].join(`
|
|
10
|
-
`)}const
|
|
11
|
-
`)}function
|
|
10
|
+
`)}const E=`/vite.config.ts`;function D(e){return/resolveVite\s*(?:<[^>]*>)?\s*\(/.test(e)&&e.includes(`@deltabox/toolchain/vite`)}function O(e){return[`import { defineConfig } from '@deltabox/toolchain';`,``,`export default defineConfig({`,` toolchain: {`,` vite: ${d(e,` `)},`,` },`,`});`,``].join(`
|
|
11
|
+
`)}function k(e,t=!0){let r=e.indexOf(`{`);if(r===-1)return e;let a=i(e,r);if(a===-1)return e;let o=`'${E}'`,s=n(e,r,a,`fmt`);if(s&&e[s[0]]===`{`&&e[s[1]-1]===`}`){let[t,r]=s,i=n(e,t,r,`ignorePatterns`);if(i){let[t,n]=i;if(e.slice(t,n).includes(E))return e;if(e[t]===`[`){let n=e.slice(t+1),r=n.startsWith(`
|
|
12
|
+
`)||n.startsWith(`\r
|
|
13
|
+
`)?`,`:`, `;return`${e.slice(0,t+1)}${o}${r}${n}`}return`${e.slice(0,t)}[${o}]${e.slice(n)}`}return`${e.slice(0,t+1)} ignorePatterns: [${o}],${e.slice(t+1)}`}return s?`${e.slice(0,s[0])}{ ignorePatterns: [${o}] }${e.slice(s[1])}`:t?`${e.slice(0,r+1)} fmt: { ignorePatterns: [${o}] },${e.slice(r+1)}`:e}const A={id:`vite-to-toolchain`,from:`vite`,to:`toolchain`,description:"Fold a hand-written vite.config.* into dbx.config.* (`toolchain.vite`).",detect:e=>{let t=s(e);if(!t)return!1;try{return!D(a.readFileSync(t,`utf-8`))}catch{return!0}},run:async t=>{let n=s(t.cwd);if(!n)throw Error(`vite-to-toolchain: no vite.config.* found.`);let r=a.readFileSync(n,`utf-8`).replace(/^\uFEFF/,``),i=[`Source: ${e.basename(n)}.`],o=[],l=()=>({id:A.id,from:`vite`,to:`toolchain`,written:[],files:[],unmapped:o,notes:i});if(D(r))return i.push("Already managed by `dbx sync`; nothing to fold."),l();let u=v(r);if(`error`in u)return o.push({source:e.basename(n),reason:u.error}),i.push(`Left vite.config.* unchanged; fold it by hand.`),l();let d=S(u.text);if(!d.ok)return o.push({source:e.basename(n),reason:`cannot fold faithfully (${d.reason})`}),i.push(`The config references helpers/imports or non-literal expressions; fold it by hand.`),l();let f=y(u.text),p=k(u.text,f.fmt),m=f.fmt?`added \`${E}\` to \`fmt.ignorePatterns\`; run \`dbx sync\` to regenerate vite.config.ts.`:"left `fmt` out of `toolchain.vite` (the default fmt ignores cover the generated `vite.config.ts`); run `dbx sync` to regenerate it.",h=c(t.cwd),g=()=>t.ignoreViteConfigFile?(i.push(`Kept \`${e.basename(n)}\` (ignoreViteConfigFile).`),[]):(t.write&&a.rmSync(n,{force:!0}),i.push(`Removed \`${e.basename(n)}\` (recreated by \`dbx sync\`).`),[n]);if(h&&h.endsWith(`.json`))return o.push({source:e.basename(h),reason:`JSON configs cannot hold the extracted object by text-splice`}),i.push(`Fold into the JSON config by hand.`),l();if(!h){let n=e.join(t.cwd,`dbx.config.ts`),r={path:n,content:O(p)};t.write&&a.writeFileSync(n,r.content,`utf-8`);let o=g();return i.push(`Created \`${e.basename(n)}\` with the folded \`toolchain.vite\`; ${m}`),{id:A.id,from:`vite`,to:`toolchain`,written:[n],removed:o,files:[r],notes:i}}let _=C(a.readFileSync(h,`utf-8`).replace(/^\uFEFF/,``),p);if(`error`in _)return o.push({source:e.basename(h),reason:_.error}),i.push("Left dbx.config.* unchanged; fold `toolchain.vite` in by hand."),l();let b={path:h,content:_.content};t.write&&a.writeFileSync(h,b.content,`utf-8`);let x=g();return i.push(`Folded into \`toolchain.vite\` (${e.basename(h)}); ${m}`),{id:A.id,from:`vite`,to:`toolchain`,written:[h],removed:x,files:[b],notes:i}}};export{o as VITE_CONFIG_FILES,k as ensureViteFmtIgnore,v as extractViteObject,c as findDbxConfig,s as findViteConfig,w as foldToolchainSection,C as foldViteIntoConfig,h as mergeViteObjects,y as objectHasSections,T as renderFreshSectionsConfig,O as renderFreshViteConfig,S as scanLiteralObject,x as viteConfigHasFmtLint,A as viteToToolchain};
|
|
@@ -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,
|
|
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,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 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=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:i(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,a(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
|
|
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
|
|
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
|
|
57
|
-
* (unless `force`). The project
|
|
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{
|
|
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, 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, 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, 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{
|
|
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,upsertWorkspaceTsconfig as k,workspaceDirForTsconfig as A,writeGeneratedFiles as j}from"./typescript.js";import{GENERATED_CONFIG_FILENAME as M,generateProjectConfigs as N}from"./config.js";import{projectCommands as P}from"./cli/index.js";import{projectSyncTask as F}from"./sync.js";var I=/* @__PURE__ */ e({CATALOG_MARKER:()=>n,CATALOG_PACKAGE_MANAGERS:()=>r,CONFIG_EXTENSIONS:()=>u,DEFAULT_CONFIG_EXTENSION:()=>`ts`,DEFAULT_PACKAGE_MANAGER_VERSIONS:()=>t,GENERATED_CONFIG_FILENAME:()=>M,SCAFFOLD_CATALOG:()=>f,catalogFileFor:()=>i,catalogsSyncTask:()=>a,configFileName:()=>p,configLanguage:()=>m,configUsesEsm:()=>h,createMonorepoRootFiles:()=>g,createRootProjectFiles:()=>_,createWorkspaceFiles:()=>v,findRootOxcFiles:()=>y,generateProjectConfigs:()=>N,hasCatalog:()=>o,isConfigExtension:()=>b,projectCommands:()=>P,projectSyncTask:()=>F,renderApplicationEntry:()=>x,renderApplicationHtml:()=>S,renderGitignore:()=>C,renderPnpmWorkspace:()=>s,renderSourceEntry:()=>w,renderSourceTest:()=>T,renderToolchainConfig:()=>E,renderWorkspaceTsconfig:()=>D,renderYarnrc:()=>c,resolveConfigExtension:()=>O,supportsCatalogs:()=>l,upsertWorkspaceTsconfig:()=>k,workspaceDirForTsconfig:()=>A,writeGeneratedFiles:()=>j});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,M 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,N as generateProjectConfigs,o as hasCatalog,b as isConfigExtension,P as projectCommands,F 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,I as src_exports,l as supportsCatalogs,k as upsertWorkspaceTsconfig,A as workspaceDirForTsconfig,j as writeGeneratedFiles};
|
|
@@ -56,6 +56,28 @@ export interface RootOxcFiles {
|
|
|
56
56
|
fmt: boolean;
|
|
57
57
|
lint: boolean;
|
|
58
58
|
}
|
|
59
|
+
/** The language a generated `dbx.config.*` uses. */
|
|
60
|
+
export type ConfigLanguage = 'ts' | 'js';
|
|
61
|
+
/** The extensions a generated `dbx.config.*` can use. */
|
|
62
|
+
export type ConfigExtension = 'ts' | 'mts' | 'js' | 'mjs' | 'cjs';
|
|
63
|
+
/** Every supported generated config extension. */
|
|
64
|
+
export declare const CONFIG_EXTENSIONS: readonly ConfigExtension[];
|
|
65
|
+
/** The default generated config extension. */
|
|
66
|
+
export declare const DEFAULT_CONFIG_EXTENSION: ConfigExtension;
|
|
67
|
+
/** Whether a string is a supported generated config extension. */
|
|
68
|
+
export declare function isConfigExtension(value: string): value is ConfigExtension;
|
|
69
|
+
/** The generated config file name for an extension. */
|
|
70
|
+
export declare function configFileName(extension?: ConfigExtension): string;
|
|
71
|
+
/** The language a config extension belongs to. */
|
|
72
|
+
export declare function configLanguage(extension: ConfigExtension): ConfigLanguage;
|
|
73
|
+
/**
|
|
74
|
+
* Pick the extension for a language. TypeScript defaults to `.ts`; JavaScript
|
|
75
|
+
* follows the package's module kind (`.mjs` for ESM, `.cjs` for CJS, `.js` when
|
|
76
|
+
* `type` is unset).
|
|
77
|
+
*/
|
|
78
|
+
export declare function resolveConfigExtension(language: ConfigLanguage, packageType?: string, explicit?: ConfigExtension): ConfigExtension;
|
|
79
|
+
/** Whether a generated config uses ESM syntax (import/export vs `module.exports`). */
|
|
80
|
+
export declare function configUsesEsm(extension: ConfigExtension, packageType?: string): boolean;
|
|
59
81
|
/**
|
|
60
82
|
* Find the nearest ancestor that owns Oxc config files. The walk stops at the
|
|
61
83
|
* repository boundary (`.git`) so a nested project cannot inherit files from an
|
|
@@ -79,6 +101,10 @@ export declare function renderToolchainConfig(ctx: ProjectContext & {
|
|
|
79
101
|
type: ProjectType;
|
|
80
102
|
fmtOxc?: boolean;
|
|
81
103
|
lintOxc?: boolean;
|
|
104
|
+
/** The generated file extension (default `ts`). */
|
|
105
|
+
configExtension?: ConfigExtension;
|
|
106
|
+
/** The package's `type` (`module`/`commonjs`), used for `.js` syntax. */
|
|
107
|
+
packageType?: string;
|
|
82
108
|
}): string;
|
|
83
109
|
/** A minimal tsconfig.json that extends the default template. */
|
|
84
110
|
export declare function renderWorkspaceTsconfig(composite?: boolean, extendsValue?: string | string[] | false): string;
|
|
@@ -1,17 +1,24 @@
|
|
|
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
|
|
2
|
-
`)}function
|
|
3
|
-
`)}function
|
|
4
|
-
`)}function
|
|
5
|
-
`)}function
|
|
6
|
-
`),s=e.fmtOxc??e.oxc===!0,c=e.lintOxc??e.oxc===!0;return
|
|
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}const w=[`ts`,`mts`,`js`,`mjs`,`cjs`],T=`ts`;function E(e){return w.includes(e)}function D(e=`ts`){return`dbx.config.${e}`}function O(e){return e===`ts`||e===`mts`?`ts`:`js`}function k(e,t,n){return n||(e===`ts`?`ts`:t===`module`?`mjs`:t===`commonjs`?`cjs`:`js`)}function A(e,t){return e===`cjs`?!1:e===`mjs`||e===`mts`||e!==`js`||t===`module`}function j(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 M(e){let{tsconfigExtends:t,rootOxc:n,...r}=e;return r}function N(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 P=(e,t=4)=>`${JSON.stringify(e,null,t)}\n`;function F(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 I(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}const L=`./node_modules/oxfmt/configuration_schema.json`,R=`./node_modules/oxlint/configuration_schema.json`;function z(e,t){return`${JSON.stringify({$schema:e,...t},null,4)}\n`}function B(){return[`export function greet(who = 'world'): string {`," return `Hello, ${who}!`;",`}`,``].join(`
|
|
2
|
+
`)}function V(){return[`import { greet } from './index.js';`,``,`const app = document.querySelector<HTMLDivElement>('#app');`,`if (app) app.textContent = greet('world');`,``].join(`
|
|
3
|
+
`)}function H(e){return[`<!doctype html>`,`<html lang="en">`,` <head>`,` <meta charset="UTF-8" />`,` <meta name="viewport" content="width=device-width, initial-scale=1.0" />`,` <title>${I(e)}</title>`,` </head>`,` <body>`,` <div id="app"></div>`,` <script type="module" src="/src/main.ts"><\/script>`,` </body>`,`</html>`,``].join(`
|
|
4
|
+
`)}function U(){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 W(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}: ${F(t)},`).join(`
|
|
6
|
+
`),s=e.fmtOxc??e.oxc===!0,c=e.lintOxc??e.oxc===!0,l=[` project: {\n${o}\n },`,...s?[` fmt: { oxc: true },`]:[],...c?[` lint: { oxc: true },`]:[]];return A(e.configExtension??`ts`,e.packageType)?`import { defineConfig } from '@deltabox/toolchain';
|
|
7
7
|
|
|
8
8
|
export default defineConfig({
|
|
9
9
|
toolchain: {
|
|
10
|
-
${
|
|
10
|
+
${l.join(`
|
|
11
11
|
`)}
|
|
12
12
|
},
|
|
13
13
|
});
|
|
14
|
-
|
|
14
|
+
`:`/** @type {import('@deltabox/toolchain').DbxConfig} */
|
|
15
|
+
module.exports = {
|
|
16
|
+
toolchain: {
|
|
17
|
+
${l.join(`
|
|
18
|
+
`)}
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
`}function G(e=!1,t=`./tsconfig.default.json`){return P({...t===!1?{}:{extends:t},compilerOptions:{composite:e}})}function K(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`,...N(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:W({...e,type:e.type??`project`,fmtOxc:a,lintOxc:o})}],{path:`package.json`,content:P(s)},...t?[{path:`index.html`,content:H(e.name)},{path:`src/main.ts`,content:V()}]:[],{path:`src/index.ts`,content:B()},{path:`tests/index.test.ts`,content:U()},{path:`tsconfig.base.json`,content:u(M(e),e.tsconfigExtends?.base)},{path:`tsconfig.default.json`,content:f(M(e),e.tsconfigExtends?.default)},{path:`tsconfig.build.json`,content:d(M(e),e.tsconfigExtends?.build)},{path:`tsconfig.json`,content:G()},...a?[{path:`.oxfmtrc.json`,content:z(L,r)}]:[],...o?[{path:`.oxlintrc.json`,content:z(R,i)}]:[],{path:`.gitignore`,content:Q()},{path:`README.md`,content:`# ${e.name}\n`},...S(e.packageManager,!1,t?[`tsdown`]:[])]}function q(e){let t=e.oxc!==!1&&e.includeConfig!==!1,n={name:e.name,version:`0.1.0`,private:!0,type:`module`,...N(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:W({...e,type:e.type??`monorepo-root`,oxc:t})}],{path:`package.json`,content:P(n)},{path:`tsconfig.base.json`,content:u(M(e),e.tsconfigExtends?.base)},{path:`tsconfig.workspaces.json`,content:l({scope:e.scope??e.name,workspaces:e.workspaces})},{path:`tsconfig.json`,content:P({extends:`./tsconfig.workspaces.json`,compilerOptions:{composite:!1},files:[]})},...t?[{path:`.oxfmtrc.json`,content:z(L,r)},{path:`.oxlintrc.json`,content:z(R,i)}]:[],{path:`.gitignore`,content:Q()},{path:`README.md`,content:`# ${e.name}\n`},...S(e.packageManager,!0)]}function J(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 Y(e){let t=e.match(/^([ \t]+)\S/m)?.[1]??` `,n=!t.includes(` `);return{insertSpaces:n,tabSize:n?t.length:1}}function X(t,n,r,i=`tsconfig.workspaces.json`){let a=J(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=Y(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 Z(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`,...N(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:W({...e,name:e.wsName,type:e.type??`monorepo-workspace`})}],{path:`package.json`,content:P(n)},{path:`src/index.ts`,content:B()},{path:`tests/index.test.ts`,content:U()},{path:`tsconfig.default.json`,content:P({...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:G(!1,e.tsconfigExtends?.build)},{path:`tsconfig.json`,content:G()},{path:`tsdown.config.ts`,content:`import { defineConfig } from 'tsdown';
|
|
15
22
|
|
|
16
23
|
import { baseTsdownConfig } from '@deltabox/toolchain/tsdown';
|
|
17
24
|
|
|
@@ -21,5 +28,5 @@ export default defineConfig({
|
|
|
21
28
|
// Keep the explicit package.json exports (types + import conditions).
|
|
22
29
|
exports: false,
|
|
23
30
|
});
|
|
24
|
-
`}]}function
|
|
25
|
-
`)}function
|
|
31
|
+
`}]}function Q(){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(`
|
|
32
|
+
`)}function $(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 ee(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(!$(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{w as CONFIG_EXTENSIONS,T as DEFAULT_CONFIG_EXTENSION,n as DEFAULT_PACKAGE_MANAGER_VERSIONS,v as SCAFFOLD_CATALOG,D as configFileName,O as configLanguage,A as configUsesEsm,q as createMonorepoRootFiles,K as createRootProjectFiles,Z as createWorkspaceFiles,j as findRootOxcFiles,E as isConfigExtension,V as renderApplicationEntry,H as renderApplicationHtml,Q as renderGitignore,B as renderSourceEntry,U as renderSourceTest,W as renderToolchainConfig,G as renderWorkspaceTsconfig,k as resolveConfigExtension,X as upsertWorkspaceTsconfig,J as workspaceDirForTsconfig,ee as writeGeneratedFiles};
|