@deltabox/toolchain 1.11.4 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/CHANGELOG.md +336 -4
  2. package/README.md +21 -14
  3. package/dist/_virtual/_rolldown/runtime.js +1 -1
  4. package/dist/changelog.d.ts +10 -6
  5. package/dist/changelog.js +1 -1
  6. package/dist/cli/commands/index.js +1 -1
  7. package/dist/cli/commands/providers.js +1 -1
  8. package/dist/cli/commands/reset.js +1 -1
  9. package/dist/cli/commands/shared.js +1 -1
  10. package/dist/cli/commands/sync.js +1 -1
  11. package/dist/cli/commands/watch.js +1 -1
  12. package/dist/cli/config-selection.d.ts +23 -0
  13. package/dist/cli/config-selection.js +1 -0
  14. package/dist/cli/context.js +1 -1
  15. package/dist/cli/index.d.ts +5 -3
  16. package/dist/cli/index.js +1 -1
  17. package/dist/cli/register.js +1 -1
  18. package/dist/config.d.ts +8 -8
  19. package/dist/config.js +1 -1
  20. package/dist/core.d.ts +7 -6
  21. package/dist/core.js +1 -1
  22. package/dist/globals.d.ts +31 -0
  23. package/dist/globals.js +1 -0
  24. package/dist/index.d.ts +33 -11
  25. package/dist/index.js +1 -1
  26. package/dist/migrate.d.ts +3 -2
  27. package/dist/migrate.js +1 -1
  28. package/dist/package.js +1 -1
  29. package/dist/packages/biome/src/index.d.ts +2 -1
  30. package/dist/packages/biome/src/index.js +1 -1
  31. package/dist/packages/changelog/src/cli/index.js +1 -1
  32. package/dist/packages/changelog/src/index.d.ts +11 -7
  33. package/dist/packages/changelog/src/index.js +1 -1
  34. package/dist/packages/changelog/src/run-workflows.d.ts +19 -4
  35. package/dist/packages/changelog/src/run-workflows.js +1 -1
  36. package/dist/packages/changelog/src/run.d.ts +4 -3
  37. package/dist/packages/changelog/src/run.js +1 -1
  38. package/dist/packages/changelog/src/sync.d.ts +7 -4
  39. package/dist/packages/changelog/src/sync.js +1 -1
  40. package/dist/packages/changelog/src/utils/args.js +1 -1
  41. package/dist/packages/changelog/src/utils/breaking.d.ts +16 -0
  42. package/dist/packages/changelog/src/utils/breaking.js +1 -0
  43. package/dist/packages/changelog/src/utils/format.d.ts +2 -1
  44. package/dist/packages/changelog/src/utils/format.js +5 -5
  45. package/dist/packages/changelog/src/utils/git.d.ts +3 -1
  46. package/dist/packages/changelog/src/utils/git.js +1 -1
  47. package/dist/packages/changelog/src/utils/reformat.d.ts +4 -1
  48. package/dist/packages/changelog/src/utils/reformat.js +4 -4
  49. package/dist/packages/changelog/src/utils/release-notes.d.ts +18 -0
  50. package/dist/packages/changelog/src/utils/release-notes.js +1 -0
  51. package/dist/packages/changelog/src/utils/summary.d.ts +29 -2
  52. package/dist/packages/changelog/src/utils/summary.js +3 -1
  53. package/dist/packages/changelog/src/utils/types.d.ts +39 -2
  54. package/dist/packages/changelog/src/utils/version.d.ts +1 -0
  55. package/dist/packages/changelog/src/utils/versioning.d.ts +30 -4
  56. package/dist/packages/changelog/src/utils/versioning.js +1 -1
  57. package/dist/packages/changelog/src/utils/write.js +1 -1
  58. package/dist/packages/changelog/src/workflows.d.ts +27 -7
  59. package/dist/packages/changelog/src/workflows.js +5 -5
  60. package/dist/packages/config/src/cli/index.js +1 -1
  61. package/dist/packages/config/src/collect.d.ts +10 -8
  62. package/dist/packages/config/src/collect.js +1 -1
  63. package/dist/packages/config/src/config-json.d.ts +4 -4
  64. package/dist/packages/config/src/config-json.js +1 -1
  65. package/dist/packages/config/src/engine.d.ts +14 -25
  66. package/dist/packages/config/src/engine.js +1 -1
  67. package/dist/packages/config/src/env-file.d.ts +4 -4
  68. package/dist/packages/config/src/env-file.js +2 -2
  69. package/dist/packages/config/src/env.d.ts +4 -6
  70. package/dist/packages/config/src/env.js +1 -1
  71. package/dist/packages/config/src/generators/cli.d.ts +6 -6
  72. package/dist/packages/config/src/generators/cli.js +1 -1
  73. package/dist/packages/config/src/generators/env.d.ts +9 -9
  74. package/dist/packages/config/src/generators/env.js +2 -2
  75. package/dist/packages/config/src/generators/index.d.ts +4 -4
  76. package/dist/packages/config/src/generators/index.js +1 -1
  77. package/dist/packages/config/src/generators/json.d.ts +5 -7
  78. package/dist/packages/config/src/generators/json.js +1 -1
  79. package/dist/packages/config/src/generators/markdown.d.ts +57 -35
  80. package/dist/packages/config/src/generators/markdown.js +18 -19
  81. package/dist/packages/config/src/generators/types.d.ts +28 -23
  82. package/dist/packages/config/src/generators/types.js +3 -3
  83. package/dist/packages/config/src/index.d.ts +9 -9
  84. package/dist/packages/config/src/index.js +1 -1
  85. package/dist/packages/config/src/schema.d.ts +31 -3
  86. package/dist/packages/config/src/schema.js +1 -1
  87. package/dist/packages/config/src/types.d.ts +134 -28
  88. package/dist/packages/core/src/editor-config.d.ts +14 -0
  89. package/dist/packages/core/src/editor-config.js +1 -0
  90. package/dist/packages/core/src/graph.js +1 -1
  91. package/dist/packages/core/src/index.d.ts +8 -7
  92. package/dist/packages/core/src/index.js +1 -1
  93. package/dist/packages/core/src/loader.d.ts +20 -2
  94. package/dist/packages/core/src/loader.js +1 -1
  95. package/dist/packages/core/src/manifest.d.ts +20 -1
  96. package/dist/packages/core/src/manifest.js +1 -1
  97. package/dist/packages/core/src/provider-registry.d.ts +48 -3
  98. package/dist/packages/core/src/provider-registry.js +1 -1
  99. package/dist/packages/core/src/reset.d.ts +15 -0
  100. package/dist/packages/core/src/reset.js +1 -1
  101. package/dist/packages/core/src/sync.d.ts +10 -0
  102. package/dist/packages/core/src/sync.js +1 -1
  103. package/dist/packages/core/src/watch.d.ts +9 -0
  104. package/dist/packages/core/src/watch.js +1 -1
  105. package/dist/packages/migrate/src/cli/index.js +1 -1
  106. package/dist/packages/migrate/src/index.d.ts +3 -2
  107. package/dist/packages/migrate/src/index.js +1 -1
  108. package/dist/packages/migrate/src/oxc.d.ts +13 -0
  109. package/dist/packages/migrate/src/oxc.js +1 -0
  110. package/dist/packages/migrate/src/registry.js +1 -1
  111. package/dist/packages/migrate/src/vite-target.js +1 -1
  112. package/dist/packages/migrate/src/vite.d.ts +25 -3
  113. package/dist/packages/migrate/src/vite.js +7 -2
  114. package/dist/packages/project/src/catalogs.d.ts +7 -0
  115. package/dist/packages/project/src/catalogs.js +1 -1
  116. package/dist/packages/project/src/cli/index.js +1 -1
  117. package/dist/packages/project/src/config.d.ts +6 -0
  118. package/dist/packages/project/src/config.js +1 -1
  119. package/dist/packages/project/src/index.d.ts +5 -4
  120. package/dist/packages/project/src/index.js +1 -1
  121. package/dist/packages/project/src/sync.js +1 -1
  122. package/dist/packages/project/src/typescript.d.ts +64 -12
  123. package/dist/packages/project/src/typescript.js +12 -7
  124. package/dist/packages/shared/src/changelog-breaking.d.ts +31 -0
  125. package/dist/packages/shared/src/changelog-groups.d.ts +59 -0
  126. package/dist/packages/shared/src/config-schema/biome.d.ts +10 -0
  127. package/dist/packages/shared/src/config-schema/biome.js +1 -0
  128. package/dist/packages/shared/src/config-schema/catalogs.d.ts +14 -0
  129. package/dist/packages/shared/src/config-schema/catalogs.js +1 -0
  130. package/dist/packages/shared/src/config-schema/changelog.d.ts +248 -0
  131. package/dist/packages/shared/src/config-schema/changelog.js +1 -0
  132. package/dist/packages/shared/src/config-schema/ci.d.ts +390 -0
  133. package/dist/packages/shared/src/config-schema/ci.js +1 -0
  134. package/dist/packages/shared/src/config-schema/format.d.ts +38 -0
  135. package/dist/packages/shared/src/config-schema/format.js +1 -0
  136. package/dist/packages/shared/src/config-schema/index.d.ts +1654 -0
  137. package/dist/packages/shared/src/config-schema/index.js +1 -0
  138. package/dist/packages/shared/src/config-schema/logger.d.ts +19 -0
  139. package/dist/packages/shared/src/config-schema/logger.js +1 -0
  140. package/dist/packages/shared/src/config-schema/meta.d.ts +16 -0
  141. package/dist/packages/shared/src/config-schema/meta.js +1 -0
  142. package/dist/packages/shared/src/config-schema/project.d.ts +35 -0
  143. package/dist/packages/shared/src/config-schema/project.js +1 -0
  144. package/dist/packages/shared/src/config-schema/providers.d.ts +9 -0
  145. package/dist/packages/shared/src/config-schema/providers.js +1 -0
  146. package/dist/packages/shared/src/config-schema/registry.d.ts +21 -0
  147. package/dist/packages/shared/src/config-schema/registry.js +1 -0
  148. package/dist/packages/shared/src/config-schema/templates.d.ts +81 -0
  149. package/dist/packages/shared/src/config-schema/templates.js +1 -0
  150. package/dist/packages/shared/src/config-schema/tsconfig.d.ts +30 -0
  151. package/dist/packages/shared/src/config-schema/tsconfig.js +1 -0
  152. package/dist/packages/shared/src/config-schema/vite.d.ts +26 -0
  153. package/dist/packages/shared/src/config-schema/vite.js +1 -0
  154. package/dist/packages/shared/src/config-schema/watch.d.ts +11 -0
  155. package/dist/packages/shared/src/config-schema/watch.js +1 -0
  156. package/dist/packages/shared/src/config-schema/workflow.d.ts +590 -0
  157. package/dist/packages/shared/src/config-schema/workflow.js +1 -0
  158. package/dist/packages/shared/src/config-types.d.ts +295 -90
  159. package/dist/packages/shared/src/fs-utils.js +1 -1
  160. package/dist/packages/shared/src/index.d.ts +27 -7
  161. package/dist/packages/shared/src/index.js +1 -1
  162. package/dist/packages/shared/src/logger.d.ts +26 -3
  163. package/dist/packages/shared/src/logger.js +1 -1
  164. package/dist/packages/shared/src/messages.d.ts +36 -0
  165. package/dist/packages/shared/src/messages.js +1 -0
  166. package/dist/packages/shared/src/object-utils.d.ts +5 -0
  167. package/dist/packages/shared/src/object-utils.js +1 -1
  168. package/dist/packages/shared/src/registry-policy.d.ts +17 -0
  169. package/dist/packages/shared/src/registry-policy.js +1 -0
  170. package/dist/packages/shared/src/toolchain.d.ts +90 -11
  171. package/dist/packages/shared/src/toolchain.js +1 -1
  172. package/dist/packages/shared/src/types.d.ts +6 -0
  173. package/dist/packages/shared/src/vite-defaults.d.ts +29 -0
  174. package/dist/packages/shared/src/vite-defaults.js +1 -0
  175. package/dist/packages/template/src/builtin.js +1 -1
  176. package/dist/packages/template/src/cli/index.js +1 -1
  177. package/dist/packages/template/src/global.d.ts +130 -0
  178. package/dist/packages/template/src/global.js +3 -0
  179. package/dist/packages/template/src/index.d.ts +3 -2
  180. package/dist/packages/template/src/index.js +1 -1
  181. package/dist/packages/template/src/online.d.ts +13 -4
  182. package/dist/packages/template/src/online.js +1 -1
  183. package/dist/packages/template/src/registry.d.ts +2 -1
  184. package/dist/packages/template/src/registry.js +1 -1
  185. package/dist/packages/template/src/scaffold.d.ts +5 -1
  186. package/dist/packages/template/src/scaffold.js +1 -1
  187. package/dist/packages/tsconfig/src/cli/generate/index.d.ts +3 -0
  188. package/dist/packages/tsconfig/src/cli/generate/index.js +1 -1
  189. package/dist/packages/tsconfig/src/cli/generate/utils.d.ts +10 -1
  190. package/dist/packages/tsconfig/src/cli/generate/utils.js +1 -1
  191. package/dist/packages/tsconfig/src/cli/index.js +1 -1
  192. package/dist/packages/tsconfig/src/index.d.ts +7 -4
  193. package/dist/packages/tsconfig/src/index.js +1 -1
  194. package/dist/packages/tsconfig/src/overrides.d.ts +74 -0
  195. package/dist/packages/tsconfig/src/overrides.js +1 -0
  196. package/dist/packages/tsconfig/src/resolve.d.ts +62 -0
  197. package/dist/packages/tsconfig/src/resolve.js +3 -0
  198. package/dist/packages/tsconfig/src/snapshots.d.ts +50 -0
  199. package/dist/packages/tsconfig/src/snapshots.js +1 -0
  200. package/dist/packages/tsconfig/src/sync.d.ts +14 -5
  201. package/dist/packages/tsconfig/src/sync.js +1 -1
  202. package/dist/packages/tsconfig/src/templates/tsconfig.default.js +1 -1
  203. package/dist/packages/tsconfig/src/templates.d.ts +12 -4
  204. package/dist/packages/tsconfig/src/templates.js +1 -1
  205. package/dist/packages/vite/src/index.d.ts +2 -2
  206. package/dist/packages/vite/src/index.js +1 -1
  207. package/dist/packages/vite/src/resolve.d.ts +13 -3
  208. package/dist/packages/vite/src/resolve.js +1 -1
  209. package/dist/packages/vite/src/sync.d.ts +46 -5
  210. package/dist/packages/vite/src/sync.js +5 -2
  211. package/dist/project.d.ts +4 -3
  212. package/dist/project.js +1 -1
  213. package/dist/providers.d.ts +11 -4
  214. package/dist/providers.js +1 -1
  215. package/dist/shared.d.ts +26 -6
  216. package/dist/shared.js +1 -1
  217. package/dist/sync.js +1 -1
  218. package/dist/template.d.ts +3 -2
  219. package/dist/template.js +1 -1
  220. package/dist/tooling.d.ts +21 -0
  221. package/dist/tooling.js +1 -0
  222. package/dist/tsconfig.d.ts +6 -3
  223. package/dist/tsconfig.js +1 -1
  224. package/dist/vite.d.ts +2 -2
  225. package/dist/vite.js +1 -1
  226. package/package.json +28 -23
  227. package/dist/packages/config/src/types.js +0 -1
  228. package/dist/packages/shared/src/config-schema.d.ts +0 -3928
  229. package/dist/packages/shared/src/config-schema.js +0 -1
@@ -3,21 +3,36 @@ import __tsdown_shims_url from 'node:url';
3
3
  import { ZodType } from "zod";
4
4
  import { Schema } from "untyped";
5
5
  //#region packages/config/src/types.d.ts
6
- /** The value type an env var resolves to. */
7
- export type EnvValueType = 'string' | 'number' | 'boolean' | 'array' | 'object';
6
+ export type ConfigMeta = ConfigBaseMeta & ConfigEnvMeta & ConfigTypeMeta & ConfigCliMeta;
8
7
  /**
9
- * The metadata a consumer attaches to a Zod leaf via `.meta()` to describe the
10
- * environment variable that backs a configuration value.
8
+ * The metadata attached to a Zod leaf via `.meta()` to describe the
9
+ * generated config that backs the config value.
11
10
  */
12
- export interface EnvVarMeta {
13
- /** The env var name, e.g. `MYAPP_AUTH_PASSWORD`. */
14
- env: string;
15
- /** The dotted config path, e.g. `auth.password`. */
16
- path?: string;
17
- /** Human-readable description (used by `.env.example` + the docs). */
11
+ export interface ConfigBaseMeta {
12
+ /** Identifier for this config eg. `ToolchainLoggerConfig`. */
13
+ id?: string;
14
+ /** Human-readable description (added to the generated types' JSDocs, generated .env and markdown files). */
18
15
  description?: string;
19
16
  /** Whether the var has no safe default and must be set. */
20
17
  required?: boolean;
18
+ /** Mark this config as deprecated (`@deprecated` in the generated types). */
19
+ deprecated?: boolean;
20
+ /** Optional deprecation message shown after `@deprecated` / `**Deprecated**`. */
21
+ deprecationMessage?: string;
22
+ /** Add custom example(s) that will be added to the generated documentation. */
23
+ example?: string[] | string;
24
+ /** Version or date this option was introduced (`@since`). */
25
+ since?: string;
26
+ /** Related link(s) for the option (`@see`). */
27
+ see?: string[] | string;
28
+ /** Extra notes shown after the description (`@remarks`). */
29
+ remarks?: string;
30
+ /** Mark the option as experimental (`@experimental`). */
31
+ experimental?: boolean;
32
+ /** Mark the option as alpha (`@alpha`). */
33
+ alpha?: boolean;
34
+ /** Mark the option as beta (`@beta`). */
35
+ beta?: boolean;
21
36
  /** Whether the value is a secret (never emitted/logged). */
22
37
  secret?: boolean;
23
38
  /** The scope the variable belongs to. */
@@ -26,42 +41,135 @@ export interface EnvVarMeta {
26
41
  public?: boolean;
27
42
  /**
28
43
  * The resolved-config default, when it differs from the raw env default
29
- * (e.g. the positive field behind a negative-named env flag).
44
+ * (e.g. the positive field behind a negative-named CLI flag).
30
45
  */
31
46
  defaultValue?: unknown;
32
47
  }
33
- /** A collected env-var definition. */
34
- export interface EnvVarDef {
35
- name: string;
48
+ /**
49
+ * The metadata attached to a Zod leaf via `.meta()` to describe the
50
+ * generated environment variable that backs the config value.
51
+ */
52
+ export interface ConfigEnvMeta {
53
+ /** The env var name, e.g. `MYAPP_AUTH_PASSWORD` (optional for non-env configs). */
54
+ envName?: string;
55
+ /**
56
+ * The env var name, e.g. `MYAPP_AUTH_PASSWORD` (optional for non-env configs).
57
+ * @deprecated use `envName` instead.
58
+ */
59
+ env?: string;
60
+ /** Use a different dotted config path, e.g. `auth.password` instead of the resolved one. */
61
+ envPath?: string;
62
+ /**
63
+ * Use a different dotted config path, e.g. `auth.password` instead of the resolved one.
64
+ * @deprecated use `envPath` instead.
65
+ */
66
+ path?: string;
67
+ }
68
+ /**
69
+ * The metadata attached to a Zod leaf via `.meta()` to describe the
70
+ * generated type that backs the config value.
71
+ */
72
+ export interface ConfigTypeMeta {
73
+ /**
74
+ * The generated type/interface name eg. `ToolchainTsconfigConfig`.
75
+ *
76
+ * Defaults to the zod schema's `.meta({ id: <value> })` ({@link ConfigBaseMeta.id})
77
+ * and falls back to `<PascalScope>Config`.
78
+ */
79
+ typeName?: string;
80
+ }
81
+ /**
82
+ * The metadata attached to a Zod leaf via `.meta()` to describe the
83
+ * generated cli flag that backs the config value.
84
+ */
85
+ export interface ConfigCliMeta {
86
+ /** Use a different CLI flag, e.g. CLI flag, e.g. `--base-url` instead of the resolved one. */
87
+ cliFlag?: string;
88
+ /** Shorthand CLI flag, e.g. `-u`. */
89
+ cliFlagShort?: string;
90
+ }
91
+ /** The value type a config value resolves to. */
92
+ export type ConfigValueType = 'string' | 'number' | 'boolean' | 'array' | 'object';
93
+ /** A collected config definition (env/cli metadata is optional). */
94
+ export interface ConfigDef {
95
+ /** The env var name, when the value is env-backed. */
96
+ name?: string;
97
+ /** The dotted config path. */
36
98
  path: string;
99
+ /** The CLI flag, when the value is CLI-backed or derives from an env var. */
100
+ cliFlag?: string;
37
101
  description?: string;
38
102
  default?: unknown;
39
103
  required?: boolean;
40
104
  secret?: boolean;
41
105
  public?: boolean;
42
106
  scope: string;
43
- envType?: EnvValueType;
44
- }
45
- /** One configuration scope: its Zod schema and an optional resolved schema. */
46
- export interface ConfigScopeDef {
47
- /** The Zod schema (the single source of truth). */
48
- zodSchema: ZodType;
49
- /** A pre-resolved untyped schema (resolved from the Zod schema if omitted). */
50
- jsonSchema?: Schema;
107
+ type?: ConfigValueType;
108
+ /** The raw config metadata attached to the schema leaf. */
109
+ meta?: ConfigMeta;
51
110
  }
111
+ /**
112
+ * The schema's object key that holds the config fields.
113
+ */
114
+ export type ConfigGroup = 'base' | (string & {}) | ConfigGroup[];
115
+ /** A config scope. */
116
+ export type ConfigScope = string;
117
+ /** A resolved untyped schema carrying the toolchain's config metadata. */
118
+ export type ConfigSchemaType = Schema & ConfigMeta;
119
+ /** A Zod schema or a resolved untyped schema. */
120
+ export type ConfigSchemaInput = ZodType | ConfigSchemaType;
121
+ /** A single schema, a list of schemas, or scoped schemas keyed by scope name. */
122
+ export type ConfigSchema<Scope extends ConfigScope = ConfigScope> = ConfigSchemaInput | ConfigSchemaInput[] | Record<Scope, ConfigSchemaInput | ConfigSchemaInput[]>;
123
+ /** Normalized schemas, keyed by scope name. */
124
+ export type ConfigSchemaMap = Record<string, ConfigSchemaType>;
52
125
  /** The scopes registered with an engine, keyed by scope name. */
53
- export type ConfigScopes = Record<string, ConfigScopeDef>;
126
+ export type ConfigScopes = Record<string, ConfigSchema | ConfigSchema[]>;
127
+ /**
128
+ * Flatten the schema by `n` levels.
129
+ *
130
+ * - When `true` the `baseGroup` will be ignored
131
+ * and the schema will flatten all top-level keys (for objects).
132
+ *
133
+ * - When defined as `{ level: <number> }` the `baseGroup` will be ignored
134
+ * and the schema will flatten keys `n` levels deep (for objects).
135
+ *
136
+ * - When defined as `{ maxDepth: <number> }` the `baseGroup` will be ignored
137
+ * and the schema will flatten keys `n` levels deep and stops at `maxDepth` (for objects).
138
+ */
139
+ export type ConfigEngineFlatten = boolean | {
140
+ level: number;
141
+ maxDepth?: never;
142
+ } | {
143
+ maxDepth: number;
144
+ level?: never;
145
+ };
54
146
  /** Options shared by every generator. */
55
147
  export interface ConfigEngineOptions {
56
148
  /** The scopes to walk, keyed by scope name (eg. `{ server, frontend, cli }`). */
57
- scopes: ConfigScopes;
149
+ schema: ConfigSchema;
58
150
  /** The env-var prefix (eg. `MYAPP_`). Kept as a replacement token in code. */
59
151
  envPrefix?: string;
60
152
  /**
61
- * The object key that holds the "flat" base config fields, hoisted out of
153
+ * The schema's object key that holds the "flat" base config fields, hoisted out of
62
154
  * the nested groups in the generated types/docs (default `base`).
63
155
  */
64
- baseGroup?: string;
156
+ baseGroup?: ConfigGroup;
157
+ /**
158
+ * Flattens the schema by `n` levels.
159
+ *
160
+ * - When `true` the `baseGroup` will be ignored
161
+ * and the schema will flatten all top-level keys (for objects).
162
+ *
163
+ * - When defined as `{ level: <number> }` the `baseGroup` will be ignored
164
+ * and the schema will flatten keys `n` levels deep (for objects).
165
+ */
166
+ flatten?: boolean | {
167
+ level: number;
168
+ maxLevel?: never;
169
+ } | {
170
+ maxLevel: number;
171
+ level?: never;
172
+ };
65
173
  /** The monorepo/project root used for default output paths. */
66
174
  root?: string;
67
175
  /**
@@ -70,6 +178,4 @@ export interface ConfigEngineOptions {
70
178
  */
71
179
  envPathOf?: (env: string) => string;
72
180
  }
73
- /** Derive the dotted config path from an env var name + prefix. */
74
- export declare function envPathOf(env: string, prefix?: string): string;
75
181
  //#endregion
@@ -0,0 +1,14 @@
1
+ import __tsdown_shims_path from 'node:path';
2
+ import __tsdown_shims_url from 'node:url';
3
+ import { SyncTask } from "../../shared/src/toolchain.js";
4
+ import "../../shared/src/index.js";
5
+ //#region packages/core/src/editor-config.d.ts
6
+ /**
7
+ * Emit centralized config warnings: tool precedence conflicts and deprecated
8
+ * sections. Runs even when editor defaults are off so CLI/extension users still
9
+ * see the notices.
10
+ */
11
+ export declare function toolingConfigTask(): SyncTask;
12
+ /** Add project-scoped VS Code defaults when `fmt.vscode` / `lint.vscode` is on. */
13
+ export declare function editorConfigSyncTask(): SyncTask;
14
+ //#endregion
@@ -0,0 +1 @@
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{deepMerge as t,isPlainObject as n}from"../../shared/src/object-utils.js";import{errorMessage as r,warningMessage as i}from"../../shared/src/messages.js";import{FORMATTER_PRECEDENCE as a,LINTER_PRECEDENCE as o,resolveFmtTool as s,resolveFmtTools as c,resolveLintTool as l,resolveLintTools as u,sectionConfig as d,sectionEnabled as f}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import p from"node:fs";const m={oxc:`oxc.oxc-vscode`,biome:`biomejs.biome`,prettier:`esbenp.prettier-vscode`,dprint:`dprint.dprint`},h={oxc:{"source.fixAll.oxc":`explicit`},biome:{"quickfix.biome":`explicit`,"source.organizeImports.biome":`explicit`},eslint:{"source.fixAll.eslint":`explicit`}},g=[`javascript`,`javascriptreact`,`typescript`,`typescriptreact`];function _(e){let t=m[e];return t?{"editor.defaultFormatter":t,...Object.fromEntries(g.map(e=>[`[${e}]`,{"editor.defaultFormatter":t}]))}:{}}function v(e,t){for(let[r,i]of Object.entries(t)){let t=e[r];t===void 0?e[r]=i:n(t)&&n(i)&&v(t,i)}}function y(e){return e===!0||n(e)}function b(e,r){if(!n(r))return e;let i=r,a=i.overrides?t(e,i.overrides):e;for(let e of i.exclude??[]){let{[e]:t,...n}=a;a=n}return a}function x(){return{name:`tooling`,enabled:e=>f(e.fmt)||f(e.lint)||f(e.biome),run:e=>{let t=f(e.config.biome),n=c(e.config),s=u(e.config),l=t?a.filter(e=>e===`biome`||n.includes(e)):n,d=t?o.filter(e=>e===`biome`||s.includes(e)):s;return l.length>1&&e.warn(i(`fmt.conflict`,{tools:l.join(`, `),winner:l[0]}),`fmt.conflict`),d.length>1&&e.warn(i(`lint.conflict`,{tools:d.join(`, `),winner:d[0]}),`lint.conflict`),t&&e.warn(r(`deprecated.section.biome`),`deprecated.section.biome`),[]}}}function S(){return{name:`editor-config`,projectTypes:[`monorepo-root`,`project`],enabled:e=>y(f(e.fmt)?d(e.fmt)?.vscode:void 0)||y(f(e.lint)?d(e.lint)?.vscode:void 0),run:t=>{let r=s(t.config),i=l(t.config),a=f(t.config.fmt)?d(t.config.fmt)?.vscode:void 0,o=f(t.config.lint)?d(t.config.lint)?.vscode:void 0,c={};if(y(a)&&r&&Object.assign(c,b(_(r),a)),y(o)&&i&&Object.assign(c,b({"editor.codeActionsOnSave":h[i]??{}},o)),Object.keys(c).length===0)return[];let u=e.join(t.cwd,`.vscode`,`settings.json`),m={};if(p.existsSync(u))try{let e=JSON.parse(p.readFileSync(u,`utf-8`).replace(/^\uFEFF/,``));if(!n(e))return t.warn(`cannot add editor defaults: ${u} is not a JSON object.`,`vscode.settings-invalid`),[];m=e}catch{return t.warn(`cannot add editor defaults: ${u} is not valid JSON.`,`vscode.settings-invalid`),[]}if(t.check)return[];let g=JSON.stringify(m);return v(m,c),JSON.stringify(m)!==g&&(p.mkdirSync(e.dirname(u),{recursive:!0}),p.writeFileSync(u,`${JSON.stringify(m,null,4)}\n`,`utf-8`)),[]}}}export{S as editorConfigSyncTask,x as toolingConfigTask};
@@ -1 +1 @@
1
- import{default as e}from"node:path";import"node:url";import.meta.url;import{readJsonAt as t,toJson as n}from"../../shared/src/fs-utils.js";import"../../shared/src/index.js";import{findConfigFile as r}from"./loader.js";import i from"node:fs";const a=/* @__PURE__ */ new Set([`node_modules`,`dist`,`build`,`out`,`coverage`,`tmp`,`temp`,`vendor`,`jspm_packages`,`web_modules`]);function o(e){return e.startsWith(`.`)||a.has(e)}function s(t){try{return i.readdirSync(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&!e.isSymbolicLink()&&!o(e.name)).map(n=>e.join(t,n.name))}catch{return[]}}function c(t,n){return e.relative(t,n).replace(/\\/g,`/`)||`.`}function l(t){let n=n=>i.existsSync(e.join(t,n));if(n(`yarn.lock`))return`yarn`;if(n(`pnpm-lock.yaml`))return`pnpm`;if(n(`package-lock.json`))return`npm`;if(n(`bun.lock`)||n(`bun.lockb`))return`bun`}const u=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`];function d(e,n={}){let i=n.maxDepth??5,a=/* @__PURE__ */ new Map,o=/* @__PURE__ */ new Map,d=(n,l)=>{let u=t(n,`package.json`),f=r(n);if(u||f){let t={...u?.name?{name:u.name}:{},dir:c(e,n),hasConfig:!!f,...f?{config:c(e,f)}:{},dependencies:[]};a.set(n,t),u?.name&&o.set(u.name,n)}if(!(l>=i))for(let e of s(n))d(e,l+1)};d(e,0);for(let[e,n]of a){let r=t(e,`package.json`);if(!r)continue;let i=/* @__PURE__ */ new Set;for(let t of u){let n=r[t];if(n&&typeof n==`object`)for(let t of Object.keys(n)){let n=o.get(t);n&&n!==e&&i.add(t)}}n.dependencies=[...i].sort()}let p=[...a.values()].sort((e,t)=>e.dir.localeCompare(t.dir)),m=p.filter(e=>e.hasConfig);return{root:e,packageManager:l(e),generatedAt:(/* @__PURE__ */ new Date()).toISOString(),projects:p,dbxProjects:m,order:f(m)}}function f(e){let t=/* @__PURE__ */ new Map;for(let n of e)n.name&&t.set(n.name,n.dir);let n=new Map(e.map(e=>[e.dir,e])),r=/* @__PURE__ */ new Set,i=/* @__PURE__ */ new Set,a=[],o=e=>{if(r.has(e)||i.has(e))return;i.add(e);let s=n.get(e);for(let e of s?.dependencies??[]){let r=t.get(e);r&&n.has(r)&&o(r)}i.delete(e),r.add(e),a.push(e)};for(let t of e)o(t.dir);return a}function p(t){return e.join(t,`.dbx`,`toolchain`,`projects.json`)}function m(t,r){let a=p(t);return i.mkdirSync(e.dirname(a),{recursive:!0}),i.writeFileSync(a,n(r??d(t)),`utf-8`),a}function h(e){try{return JSON.parse(i.readFileSync(p(e),`utf-8`))}catch{return}}export{a as IGNORED_DIRS,d as buildProjectGraph,l as detectPackageManager,f as orderProjects,p as projectGraphPath,h as readProjectGraph,m as writeProjectGraph};
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{readJsonAt as t,toJson as n}from"../../shared/src/fs-utils.js";import"../../shared/src/index.js";import{findConfigFile as r}from"./loader.js";import i from"node:fs";const a=/* @__PURE__ */ new Set([`node_modules`,`dist`,`build`,`out`,`coverage`,`tmp`,`temp`,`vendor`,`jspm_packages`,`web_modules`]);function o(e){return e.startsWith(`.`)||a.has(e)}function s(t){try{return i.readdirSync(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&!e.isSymbolicLink()&&!o(e.name)).map(n=>e.join(t,n.name))}catch{return[]}}function c(t,n){return e.relative(t,n).replace(/\\/g,`/`)||`.`}function l(t){let n=n=>i.existsSync(e.join(t,n));if(n(`yarn.lock`))return`yarn`;if(n(`pnpm-lock.yaml`))return`pnpm`;if(n(`package-lock.json`))return`npm`;if(n(`bun.lock`)||n(`bun.lockb`))return`bun`}const u=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`];function d(e,n={}){let i=n.maxDepth??5,a=/* @__PURE__ */ new Map,o=/* @__PURE__ */ new Map,d=(n,l)=>{let u=t(n,`package.json`),f=r(n);if(u||f){let t={...u?.name?{name:u.name}:{},dir:c(e,n),hasConfig:!!f,...f?{config:c(e,f)}:{},dependencies:[]};a.set(n,t),u?.name&&o.set(u.name,n)}if(!(l>=i))for(let e of s(n))d(e,l+1)};d(e,0);for(let[e,n]of a){let r=t(e,`package.json`);if(!r)continue;let i=/* @__PURE__ */ new Set;for(let t of u){let n=r[t];if(n&&typeof n==`object`)for(let t of Object.keys(n)){let n=o.get(t);n&&n!==e&&i.add(t)}}n.dependencies=[...i].sort()}let p=[...a.values()].sort((e,t)=>e.dir.localeCompare(t.dir)),m=p.filter(e=>e.hasConfig);return{root:e,packageManager:l(e),generatedAt:(/* @__PURE__ */ new Date()).toISOString(),projects:p,dbxProjects:m,order:f(m)}}function f(e){let t=/* @__PURE__ */ new Map;for(let n of e)n.name&&t.set(n.name,n.dir);let n=new Map(e.map(e=>[e.dir,e])),r=/* @__PURE__ */ new Set,i=/* @__PURE__ */ new Set,a=[],o=e=>{if(r.has(e)||i.has(e))return;i.add(e);let s=n.get(e);for(let e of s?.dependencies??[]){let r=t.get(e);r&&n.has(r)&&o(r)}i.delete(e),r.add(e),a.push(e)};for(let t of e)o(t.dir);return a}function p(t){return e.join(t,`.dbx`,`toolchain`,`projects.json`)}function m(t,r){let a=p(t);return i.mkdirSync(e.dirname(a),{recursive:!0}),i.writeFileSync(a,n(r??d(t)),`utf-8`),a}function h(e){try{return JSON.parse(i.readFileSync(p(e),`utf-8`).replace(/^\uFEFF/,``))}catch{return}}export{a as IGNORED_DIRS,d as buildProjectGraph,l as detectPackageManager,f as orderProjects,p as projectGraphPath,h as readProjectGraph,m as writeProjectGraph};
@@ -1,18 +1,19 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
+ import { editorConfigSyncTask, toolingConfigTask } from "./editor-config.js";
3
4
  import { DBX_GITIGNORE_BLOCK, ensureDbxGitignore } from "./gitignore.js";
4
5
  import { BuildProjectGraphOptions, IGNORED_DIRS, PackageManager, ProjectGraph, ProjectNode, buildProjectGraph, detectPackageManager, orderProjects, projectGraphPath, readProjectGraph, writeProjectGraph } from "./graph.js";
5
6
  import { LoadToolchainConfigOptions, LoadedConfig, findConfigFile, findParentConfigFile, loadToolchainConfig, mergeToolchainConfig } from "./loader.js";
6
- import { MANIFEST_DIR, MANIFEST_FILE, Manifest, TIMESTAMPS_FILE, readManifest, readSyncedAt, writeManifest } from "./manifest.js";
7
+ import { FileOrigin, MANIFEST_DIR, MANIFEST_FILE, Manifest, TIMESTAMPS_FILE, readManifest, readSyncedAt, writeManifest } from "./manifest.js";
7
8
  import { TsconfigFileNames, detectProjectType, resolveProjectType } from "./project-type.js";
8
- import { providerRegistryPath, readProviderRegistry, writeProviderRegistry } from "./provider-registry.js";
9
+ import { ProviderRegistryPath, addGlobalProviderRegistry, addProjectProviderRegistry, defaultGlobalProvidersDir, globalProviderRegistryPath, legacyProviderRegistryPath, providerRegistryPath, providerRegistryPaths, readAllProviders, readAllProvidersSync, readGlobalProviders, readProviderRegistry, removeGlobalProviderRegistry, removeProjectProviderRegistry, setGlobalProviderRegistries, setProjectProviderRegistries, writeGlobalProviders, writeProviderRegistry } from "./provider-registry.js";
9
10
  import { SelectProjectsOptions, SelectedProject, selectProjects } from "./select.js";
10
- import { ResetProjectsOptions, ResetProjectsResult, ResetSelectors, ResetToolchainOptions, ResetToolchainResult, resetProjects, resetToolchain } from "./reset.js";
11
- import { RunSyncOptions, SyncResult, runSync } from "./sync.js";
11
+ import { ResetProjectsOptions, ResetProjectsResult, ResetRestore, ResetSelectors, ResetToolchainOptions, ResetToolchainResult, resetProjects, resetToolchain } from "./reset.js";
12
+ import { RemovedFile, RunSyncOptions, SyncResult, runSync } from "./sync.js";
12
13
  import { VscodeSyncOptions, vscodeSyncTask } from "./vscode.js";
13
- import { RunWatchOptions, runWatch } from "./watch.js";
14
+ import { RunWatchOptions, resolveWatchGlobs, runWatch } from "./watch.js";
14
15
  declare namespace index_d_exports {
15
- export { BuildProjectGraphOptions, DBX_GITIGNORE_BLOCK, IGNORED_DIRS, LoadToolchainConfigOptions, LoadedConfig, MANIFEST_DIR, MANIFEST_FILE, Manifest, PackageManager, ProjectGraph, ProjectNode, ResetProjectsOptions, ResetProjectsResult, ResetSelectors, ResetToolchainOptions, ResetToolchainResult, RunSyncOptions, RunWatchOptions, SelectProjectsOptions, SelectedProject, SyncResult, TIMESTAMPS_FILE, TsconfigFileNames, VscodeSyncOptions, buildProjectGraph, detectPackageManager, detectProjectType, ensureDbxGitignore, findConfigFile, findParentConfigFile, loadToolchainConfig, mergeToolchainConfig, orderProjects, projectGraphPath, providerRegistryPath, readManifest, readProjectGraph, readProviderRegistry, readSyncedAt, resetProjects, resetToolchain, resolveProjectType, runSync, runWatch, selectProjects, vscodeSyncTask, writeManifest, writeProjectGraph, writeProviderRegistry };
16
+ export { BuildProjectGraphOptions, DBX_GITIGNORE_BLOCK, FileOrigin, IGNORED_DIRS, LoadToolchainConfigOptions, LoadedConfig, MANIFEST_DIR, MANIFEST_FILE, Manifest, PackageManager, ProjectGraph, ProjectNode, ProviderRegistryPath, RemovedFile, ResetProjectsOptions, ResetProjectsResult, ResetRestore, ResetSelectors, ResetToolchainOptions, ResetToolchainResult, RunSyncOptions, RunWatchOptions, SelectProjectsOptions, SelectedProject, SyncResult, TIMESTAMPS_FILE, TsconfigFileNames, VscodeSyncOptions, addGlobalProviderRegistry, addProjectProviderRegistry, buildProjectGraph, defaultGlobalProvidersDir, detectPackageManager, detectProjectType, editorConfigSyncTask, ensureDbxGitignore, findConfigFile, findParentConfigFile, globalProviderRegistryPath, legacyProviderRegistryPath, loadToolchainConfig, mergeToolchainConfig, orderProjects, projectGraphPath, providerRegistryPath, providerRegistryPaths, readAllProviders, readAllProvidersSync, readGlobalProviders, readManifest, readProjectGraph, readProviderRegistry, readSyncedAt, removeGlobalProviderRegistry, removeProjectProviderRegistry, resetProjects, resetToolchain, resolveProjectType, resolveWatchGlobs, runSync, runWatch, selectProjects, setGlobalProviderRegistries, setProjectProviderRegistries, toolingConfigTask, vscodeSyncTask, writeGlobalProviders, writeManifest, writeProjectGraph, writeProviderRegistry };
16
17
  }
17
18
  //#endregion
18
- export { BuildProjectGraphOptions, DBX_GITIGNORE_BLOCK, IGNORED_DIRS, LoadToolchainConfigOptions, LoadedConfig, MANIFEST_DIR, MANIFEST_FILE, Manifest, PackageManager, ProjectGraph, ProjectNode, ResetProjectsOptions, ResetProjectsResult, ResetSelectors, ResetToolchainOptions, ResetToolchainResult, RunSyncOptions, RunWatchOptions, SelectProjectsOptions, SelectedProject, SyncResult, TIMESTAMPS_FILE, TsconfigFileNames, VscodeSyncOptions, buildProjectGraph, detectPackageManager, detectProjectType, ensureDbxGitignore, findConfigFile, findParentConfigFile, index_d_exports, loadToolchainConfig, mergeToolchainConfig, orderProjects, projectGraphPath, providerRegistryPath, readManifest, readProjectGraph, readProviderRegistry, readSyncedAt, resetProjects, resetToolchain, resolveProjectType, runSync, runWatch, selectProjects, vscodeSyncTask, writeManifest, writeProjectGraph, writeProviderRegistry };
19
+ export { BuildProjectGraphOptions, DBX_GITIGNORE_BLOCK, FileOrigin, IGNORED_DIRS, LoadToolchainConfigOptions, LoadedConfig, MANIFEST_DIR, MANIFEST_FILE, Manifest, PackageManager, ProjectGraph, ProjectNode, ProviderRegistryPath, RemovedFile, ResetProjectsOptions, ResetProjectsResult, ResetRestore, ResetSelectors, ResetToolchainOptions, ResetToolchainResult, RunSyncOptions, RunWatchOptions, SelectProjectsOptions, SelectedProject, SyncResult, TIMESTAMPS_FILE, TsconfigFileNames, VscodeSyncOptions, addGlobalProviderRegistry, addProjectProviderRegistry, buildProjectGraph, defaultGlobalProvidersDir, detectPackageManager, detectProjectType, editorConfigSyncTask, ensureDbxGitignore, findConfigFile, findParentConfigFile, globalProviderRegistryPath, index_d_exports, legacyProviderRegistryPath, loadToolchainConfig, mergeToolchainConfig, orderProjects, projectGraphPath, providerRegistryPath, providerRegistryPaths, readAllProviders, readAllProvidersSync, readGlobalProviders, readManifest, readProjectGraph, readProviderRegistry, readSyncedAt, removeGlobalProviderRegistry, removeProjectProviderRegistry, resetProjects, resetToolchain, resolveProjectType, resolveWatchGlobs, runSync, runWatch, selectProjects, setGlobalProviderRegistries, setProjectProviderRegistries, toolingConfigTask, vscodeSyncTask, writeGlobalProviders, writeManifest, writeProjectGraph, writeProviderRegistry };
@@ -1 +1 @@
1
- import"node:path";import"node:url";import.meta.url;import{__exportAll as e}from"../../../_virtual/_rolldown/runtime.js";import{DBX_GITIGNORE_BLOCK as t,ensureDbxGitignore as n}from"./gitignore.js";import{detectProjectType as r,resolveProjectType as i}from"./project-type.js";import{findConfigFile as a,findParentConfigFile as o,loadToolchainConfig as s,mergeToolchainConfig as c}from"./loader.js";import{IGNORED_DIRS as l,buildProjectGraph as u,detectPackageManager as d,orderProjects as f,projectGraphPath as p,readProjectGraph as m,writeProjectGraph as h}from"./graph.js";import{MANIFEST_DIR as g,MANIFEST_FILE as _,TIMESTAMPS_FILE as v,readManifest as y,readSyncedAt as b,writeManifest as x}from"./manifest.js";import{providerRegistryPath as S,readProviderRegistry as C,writeProviderRegistry as w}from"./provider-registry.js";import{selectProjects as T}from"./select.js";import{resetProjects as E,resetToolchain as D}from"./reset.js";import{runSync as O}from"./sync.js";import{vscodeSyncTask as k}from"./vscode.js";import{runWatch as A}from"./watch.js";var j=/* @__PURE__ */ e({DBX_GITIGNORE_BLOCK:()=>t,IGNORED_DIRS:()=>l,MANIFEST_DIR:()=>g,MANIFEST_FILE:()=>_,TIMESTAMPS_FILE:()=>v,buildProjectGraph:()=>u,detectPackageManager:()=>d,detectProjectType:()=>r,ensureDbxGitignore:()=>n,findConfigFile:()=>a,findParentConfigFile:()=>o,loadToolchainConfig:()=>s,mergeToolchainConfig:()=>c,orderProjects:()=>f,projectGraphPath:()=>p,providerRegistryPath:()=>S,readManifest:()=>y,readProjectGraph:()=>m,readProviderRegistry:()=>C,readSyncedAt:()=>b,resetProjects:()=>E,resetToolchain:()=>D,resolveProjectType:()=>i,runSync:()=>O,runWatch:()=>A,selectProjects:()=>T,vscodeSyncTask:()=>k,writeManifest:()=>x,writeProjectGraph:()=>h,writeProviderRegistry:()=>w});export{t as DBX_GITIGNORE_BLOCK,l as IGNORED_DIRS,g as MANIFEST_DIR,_ as MANIFEST_FILE,v as TIMESTAMPS_FILE,u as buildProjectGraph,d as detectPackageManager,r as detectProjectType,n as ensureDbxGitignore,a as findConfigFile,o as findParentConfigFile,s as loadToolchainConfig,c as mergeToolchainConfig,f as orderProjects,p as projectGraphPath,S as providerRegistryPath,y as readManifest,m as readProjectGraph,C as readProviderRegistry,b as readSyncedAt,E as resetProjects,D as resetToolchain,i as resolveProjectType,O as runSync,A as runWatch,T as selectProjects,j as src_exports,k as vscodeSyncTask,x as writeManifest,h as writeProjectGraph,w as writeProviderRegistry};
1
+ import"node:path";import"node:url";import.meta.url;import{__exportAll as e}from"../../../_virtual/_rolldown/runtime.js";import{editorConfigSyncTask as t,toolingConfigTask as n}from"./editor-config.js";import{DBX_GITIGNORE_BLOCK as r,ensureDbxGitignore as i}from"./gitignore.js";import{detectProjectType as a,resolveProjectType as o}from"./project-type.js";import{findConfigFile as s,findParentConfigFile as c,loadToolchainConfig as l,mergeToolchainConfig as u}from"./loader.js";import{IGNORED_DIRS as d,buildProjectGraph as f,detectPackageManager as p,orderProjects as m,projectGraphPath as h,readProjectGraph as g,writeProjectGraph as _}from"./graph.js";import{MANIFEST_DIR as v,MANIFEST_FILE as y,TIMESTAMPS_FILE as b,readManifest as x,readSyncedAt as S,writeManifest as C}from"./manifest.js";import{addGlobalProviderRegistry as w,addProjectProviderRegistry as T,defaultGlobalProvidersDir as E,globalProviderRegistryPath as D,legacyProviderRegistryPath as O,providerRegistryPath as k,providerRegistryPaths as A,readAllProviders as j,readAllProvidersSync as M,readGlobalProviders as N,readProviderRegistry as P,removeGlobalProviderRegistry as F,removeProjectProviderRegistry as I,setGlobalProviderRegistries as L,setProjectProviderRegistries as R,writeGlobalProviders as z,writeProviderRegistry as B}from"./provider-registry.js";import{selectProjects as V}from"./select.js";import{resetProjects as H,resetToolchain as U}from"./reset.js";import{runSync as W}from"./sync.js";import{vscodeSyncTask as G}from"./vscode.js";import{resolveWatchGlobs as K,runWatch as q}from"./watch.js";var J=/* @__PURE__ */ e({DBX_GITIGNORE_BLOCK:()=>r,IGNORED_DIRS:()=>d,MANIFEST_DIR:()=>v,MANIFEST_FILE:()=>y,TIMESTAMPS_FILE:()=>b,addGlobalProviderRegistry:()=>w,addProjectProviderRegistry:()=>T,buildProjectGraph:()=>f,defaultGlobalProvidersDir:()=>E,detectPackageManager:()=>p,detectProjectType:()=>a,editorConfigSyncTask:()=>t,ensureDbxGitignore:()=>i,findConfigFile:()=>s,findParentConfigFile:()=>c,globalProviderRegistryPath:()=>D,legacyProviderRegistryPath:()=>O,loadToolchainConfig:()=>l,mergeToolchainConfig:()=>u,orderProjects:()=>m,projectGraphPath:()=>h,providerRegistryPath:()=>k,providerRegistryPaths:()=>A,readAllProviders:()=>j,readAllProvidersSync:()=>M,readGlobalProviders:()=>N,readManifest:()=>x,readProjectGraph:()=>g,readProviderRegistry:()=>P,readSyncedAt:()=>S,removeGlobalProviderRegistry:()=>F,removeProjectProviderRegistry:()=>I,resetProjects:()=>H,resetToolchain:()=>U,resolveProjectType:()=>o,resolveWatchGlobs:()=>K,runSync:()=>W,runWatch:()=>q,selectProjects:()=>V,setGlobalProviderRegistries:()=>L,setProjectProviderRegistries:()=>R,toolingConfigTask:()=>n,vscodeSyncTask:()=>G,writeGlobalProviders:()=>z,writeManifest:()=>C,writeProjectGraph:()=>_,writeProviderRegistry:()=>B});export{r as DBX_GITIGNORE_BLOCK,d as IGNORED_DIRS,v as MANIFEST_DIR,y as MANIFEST_FILE,b as TIMESTAMPS_FILE,w as addGlobalProviderRegistry,T as addProjectProviderRegistry,f as buildProjectGraph,E as defaultGlobalProvidersDir,p as detectPackageManager,a as detectProjectType,t as editorConfigSyncTask,i as ensureDbxGitignore,s as findConfigFile,c as findParentConfigFile,D as globalProviderRegistryPath,O as legacyProviderRegistryPath,l as loadToolchainConfig,u as mergeToolchainConfig,m as orderProjects,h as projectGraphPath,k as providerRegistryPath,A as providerRegistryPaths,j as readAllProviders,M as readAllProvidersSync,N as readGlobalProviders,x as readManifest,g as readProjectGraph,P as readProviderRegistry,S as readSyncedAt,F as removeGlobalProviderRegistry,I as removeProjectProviderRegistry,H as resetProjects,U as resetToolchain,o as resolveProjectType,K as resolveWatchGlobs,W as runSync,q as runWatch,V as selectProjects,L as setGlobalProviderRegistries,R as setProjectProviderRegistries,J as src_exports,n as toolingConfigTask,G as vscodeSyncTask,z as writeGlobalProviders,C as writeManifest,_ as writeProjectGraph,B as writeProviderRegistry};
@@ -8,6 +8,8 @@ import "../../shared/src/index.js";
8
8
  /** A loaded tooling config plus its resolved path + replacement tokens. */
9
9
  export interface LoadedConfig {
10
10
  config: ToolchainConfig;
11
+ /** The config from this project's own file (not the inherited parent). */
12
+ ownConfig: ToolchainConfig;
11
13
  /** The config file that was loaded (undefined when none was found). */
12
14
  path?: string;
13
15
  /** The inherited ancestor config, when the loaded config overrides one. */
@@ -30,6 +32,17 @@ export interface LoadToolchainConfigOptions {
30
32
  * VS Code tree views that drive them). Default: `false` (throw).
31
33
  */
32
34
  tolerant?: boolean;
35
+ /** Load this config file instead of discovering `dbx.config.*`. */
36
+ config?: string;
37
+ /** Ignore every config file and use defaults / CLI flags only. */
38
+ noConfig?: boolean;
39
+ /** Skip the config's `hooks.afterLoad` callback (metadata-only loads). */
40
+ skipHooks?: boolean;
41
+ /**
42
+ * Bypass the ESM/CJS module cache. Long-running callers (eg. `dbx watch`)
43
+ * must set this so an edited config is actually re-evaluated.
44
+ */
45
+ fresh?: boolean;
33
46
  }
34
47
  /** Find the first `dbx.config.*` file at `cwd`, if any. */
35
48
  export declare function findConfigFile(cwd?: string): string | undefined;
@@ -46,13 +59,18 @@ export declare function findParentConfigFile(cwd?: string): string | undefined;
46
59
  * **replace** the ancestor's value — so a non-root `dbx.config` can override
47
60
  * individual options of the root config (and keep the rest).
48
61
  *
62
+ * Some sections are workspace-scoped and are **never inherited**:
63
+ * - `ci` / the `changelog` section: workflows are repository-level;
64
+ * - `tsconfig`: the root task expands every workspace tsconfig;
65
+ * - `vite.test` and `vite.run`: they describe how that workspace runs;
66
+ * - `hooks`: a parent's hooks are code and must not run for a nested sync.
67
+ *
49
68
  * `project` is inherited **except the identity fields** (`name`, `scope`,
50
69
  * `description`, `type`): a workspace keeps its own name/description (or falls
51
70
  * back to its `package.json`), and is still detected from its own files — so a
52
71
  * root `project` never renames a workspace. The shared fields (author, license,
53
72
  * homepage, `repo`, `packageManager`, ...) flow down. `project.inherit: false`
54
- * disables project inheritance entirely. `hooks` are **not** inherited either —
55
- * a parent's hooks are code and must not run for a nested project's sync.
73
+ * disables project inheritance entirely.
56
74
  */
57
75
  export declare function mergeToolchainConfig(parent: ToolchainConfig, child: ToolchainConfig): ToolchainConfig;
58
76
  /**
@@ -1 +1 @@
1
- import{default as e}from"node:path";import{pathToFileURL as t}from"node:url";import.meta.url;import{deepMerge as n}from"../../shared/src/object-utils.js";import{readJsonAt as r}from"../../shared/src/fs-utils.js";import{projectFromPackageJson as i}from"../../shared/src/project.js";import{CONFIG_FILE_NAMES as a,resolveTokens as o}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import{resolveProjectType as s}from"./project-type.js";import c from"node:fs";function l(e){return e instanceof Error?e.message:String(e)}function u(t=process.cwd()){for(let n of a){let r=e.resolve(t,n);if(c.existsSync(r))return r}}function d(t=process.cwd()){let n=e.resolve(t);if(c.existsSync(e.join(n,`.git`)))return;let r=e.dirname(n);for(;;){let t=u(r);if(t)return t;if(c.existsSync(e.join(r,`.git`)))return;let n=e.dirname(r);if(n===r)return;r=n}}function f(e){let t=e?.code;return t===`ERR_UNKNOWN_FILE_EXTENSION`||t===`ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX`}function p(e){let t=e;for(let e=0;e<2&&t&&typeof t==`object`&&`default`in t&&Object.keys(t).every(e=>e==="default"||e==="__esModule");e++)t=t.default;return t}async function m(e){if(e.endsWith(`.json`))return JSON.parse(c.readFileSync(e,`utf-8`).replace(/^\uFEFF/,``));let n=t(e).href;try{let e=await import(n);return e.default??e}catch(e){if(!f(e))throw e;let{tsImport:t}=await import(`tsx/esm/api`);return p(await t(n,import.meta.url))}}async function h(e){let t=await m(e),n=t&&typeof t==`object`?t.toolchain:void 0;return n&&typeof n==`object`?n:{}}const g=/* @__PURE__ */ new Set([`name`,`scope`,`description`,`type`]);function _(e,t){let{hooks:r,project:i,...a}=e,o=a;if(t.project?.inherit!==!1&&i){let e=Object.fromEntries(Object.entries(i).filter(([e])=>!g.has(e)));Object.keys(e).length>0&&(o={...a,project:e})}return n(o,t)}async function v(e=process.cwd(),t={}){let n=u(e),a=d(e),c=t.tolerant??!1,f={},p;if(a)try{f=await h(a)}catch(e){if(!c)throw e;p=`failed to load ${a}: ${l(e)}`}if(n)try{let e=await h(n);f=a&&!p?_(f,e):e}catch(e){if(!c)throw e;p=`failed to load ${n}: ${l(e)}`}let m=r(e,`package.json`),g={...m?i(m):void 0,...f.project??void 0},v=o({...f,project:g});return await f.hooks?.afterLoad?.({cwd:e,config:f,tokens:v,...n?{path:n}:{}}),{config:f,...n?{path:n}:{},...a?{parentPath:a}:{},...p?{error:p}:{},tokens:v,projectType:s(e,f)}}export{u as findConfigFile,d as findParentConfigFile,v as loadToolchainConfig,_ as mergeToolchainConfig};
1
+ import{default as e}from"node:path";import{pathToFileURL as t}from"node:url";import.meta.url;import{deepMerge as n,isPlainObject as r}from"../../shared/src/object-utils.js";import{readJsonAt as i}from"../../shared/src/fs-utils.js";import{projectFromPackageJson as a}from"../../shared/src/project.js";import{CONFIG_FILE_NAMES as o,resolveTokens as s}from"../../shared/src/toolchain.js";import"../../shared/src/index.js";import{resolveProjectType as c}from"./project-type.js";import{createRequire as l}from"node:module";import u from"node:fs";function d(e){return e instanceof Error?e.message:String(e)}function f(t=process.cwd()){for(let n of o){let r=e.resolve(t,n);if(u.existsSync(r))return r}}function p(t=process.cwd()){let n=e.resolve(t);if(u.existsSync(e.join(n,`.git`)))return;let r=e.dirname(n);for(;;){let t=f(r);if(t)return t;if(u.existsSync(e.join(r,`.git`)))return;let n=e.dirname(r);if(n===r)return;r=n}}function m(e){let t=e?.code;return t===`ERR_UNKNOWN_FILE_EXTENSION`||t===`ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX`}function h(e){let t=e;for(let e=0;e<2&&t&&typeof t==`object`&&`default`in t&&Object.keys(t).every(e=>e==="default"||e==="__esModule");e++)t=t.default;return t}const g=l(import.meta.url);let _=0;async function v(e,n=!1){if(e.endsWith(`.json`))return JSON.parse(u.readFileSync(e,`utf-8`).replace(/^\uFEFF/,``));if(n)try{delete g.cache[e]}catch{}let r=t(e).href,i=n?`${r}?dbx=${Date.now()}-${++_}`:r;try{let e=await import(i);return e.default??e}catch(e){if(!m(e))throw e;let{tsImport:t}=await import(`tsx/esm/api`);return h(await t(i,import.meta.url))}}async function y(e,t=!1){let n=await b(await v(e,t)),r=n&&typeof n==`object`?n.toolchain:void 0;return r&&typeof r==`object`?r:{}}async function b(e){let t=await e;return typeof t==`function`&&(t=await t()),t}const x=/* @__PURE__ */ new Set([`name`,`scope`,`description`,`type`]),S=/* @__PURE__ */ new Set([`test`,`run`]);function C(e){if(!r(e))return e;let t=Object.fromEntries(Object.entries(e).filter(([e])=>!S.has(e)));return Object.keys(t).length>0?t:void 0}function w(e,t){let{hooks:r,project:i,ci:a,changelog:o,catalogs:s,tsconfig:c,vite:l,...u}=e,d=u,f=C(l);if(f!==void 0&&(d={...d,vite:f}),t.project?.inherit!==!1&&i){let e=Object.fromEntries(Object.entries(i).filter(([e])=>!x.has(e)));Object.keys(e).length>0&&(d={...d,project:e})}return n(d,t)}async function T(t=process.cwd(),n={}){let r=n.noConfig?void 0:n.config?e.isAbsolute(n.config)?n.config:e.resolve(t,n.config):f(t),o=n.noConfig?void 0:p(t),l=n.tolerant??!1,u=n.fresh??!1,m={},h={},g,_;if(o)try{g=await y(o,u),m=g}catch(e){if(!l)throw e;_=`failed to load ${o}: ${d(e)}`}if(r)try{let e=await y(r,u);h=e,m=o&&!_?w(m,e):e}catch(e){if(!l)throw e;_=`failed to load ${r}: ${d(e)}`}let v=i(t,`package.json`),b={...v?a(v):void 0,...m.project??void 0},x=s({...m,project:b});n.skipHooks||await m.hooks?.afterLoad?.({cwd:t,config:m,tokens:x,...r?{path:r}:{}});let S=m.tsconfig===void 0&&g?.tsconfig!==void 0?{...m,tsconfig:g.tsconfig}:m;return{config:m,ownConfig:h,...r?{path:r}:{},...o?{parentPath:o}:{},..._?{error:_}:{},tokens:x,projectType:c(t,S)}}export{f as findConfigFile,p as findParentConfigFile,T as loadToolchainConfig,w as mergeToolchainConfig};
@@ -9,15 +9,34 @@ export declare const MANIFEST_FILE = "manifest.json";
9
9
  * dirties the committed `manifest.json`, which tracks only the file list.
10
10
  */
11
11
  export declare const TIMESTAMPS_FILE = "timestamps.json";
12
+ /** Whether dbx created a managed file or adopted a pre-existing one. */
13
+ export type FileOrigin = 'created' | 'adopted';
12
14
  export interface Manifest {
13
15
  /** Repo-relative paths of every generated/managed file. */
14
16
  files: string[];
17
+ /** Per-file origin, so a sync only deletes files that dbx created. */
18
+ origins?: Record<string, FileOrigin>;
15
19
  /**
16
20
  * ISO timestamp of the last successful sync (absent when never synced).
17
21
  * Read from {@link TIMESTAMPS_FILE}, falling back to a legacy inline
18
22
  * `syncedAt` in the manifest until the next sync migrates it.
19
23
  */
20
24
  syncedAt?: string;
25
+ /**
26
+ * The `tsconfig.overrides` currently applied, keyed by the repo-relative
27
+ * target file (`{ kind, override }`), so a removed override can be reverted.
28
+ */
29
+ tsconfigOverrides?: Record<string, unknown>;
30
+ /**
31
+ * The original (pre-override) tsconfig contents, nested by repo-relative
32
+ * path (`{ packages: { core: { "tsconfig.build.json": { ... } } } }`).
33
+ */
34
+ snapshots?: Record<string, unknown>;
35
+ /**
36
+ * Task-defined metadata persisted across syncs (everything a task writes to
37
+ * `SyncContext.manifest` that is not one of the reserved keys).
38
+ */
39
+ extras?: Record<string, unknown>;
21
40
  }
22
41
  /**
23
42
  * The last-sync timestamp for a project: {@link TIMESTAMPS_FILE} first, then a
@@ -32,5 +51,5 @@ export declare function readManifest(cwd: string): Manifest;
32
51
  * creating the directory as needed. Rewriting `manifest.json` without
33
52
  * `syncedAt` is what migrates a legacy inline timestamp on the next sync.
34
53
  */
35
- export declare function writeManifest(cwd: string, files: string[], syncedAt?: string): void;
54
+ export declare function writeManifest(cwd: string, files: string[], syncedAt?: string, origins?: Record<string, FileOrigin>, extras?: Record<string, unknown>): void;
36
55
  //#endregion
@@ -1 +1 @@
1
- import{default as e}from"node:path";import"node:url";import.meta.url;import{toJson as t}from"../../shared/src/fs-utils.js";import"../../shared/src/index.js";import n from"node:fs";const r=`.dbx/toolchain`,i=`manifest.json`,a=`timestamps.json`;function o(t){return e.resolve(t,r)}function s(t,r){try{return JSON.parse(n.readFileSync(e.join(o(t),r),`utf-8`))}catch{return}}function c(e){let t=s(e,a);if(typeof t?.syncedAt==`string`)return t.syncedAt;let n=s(e,i);return typeof n?.syncedAt==`string`?n.syncedAt:void 0}function l(e){let t=s(e,i),n=c(e);return{files:Array.isArray(t?.files)?t.files:[],...n?{syncedAt:n}:{}}}function u(r,s,c){let l=o(r);n.mkdirSync(l,{recursive:!0}),n.writeFileSync(e.join(l,i),t({files:[...new Set(s)].sort()}),`utf-8`),n.writeFileSync(e.join(l,a),t({syncedAt:c??(/* @__PURE__ */ new Date()).toISOString()}),`utf-8`)}export{r as MANIFEST_DIR,i as MANIFEST_FILE,a as TIMESTAMPS_FILE,l as readManifest,c as readSyncedAt,u as writeManifest};
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{toJson as t}from"../../shared/src/fs-utils.js";import"../../shared/src/index.js";import n from"node:fs";const r=`.dbx/toolchain`,i=`manifest.json`,a=`timestamps.json`;function o(t){return e.resolve(t,r)}function s(t,r){try{return JSON.parse(n.readFileSync(e.join(o(t),r),`utf-8`).replace(/^\uFEFF/,``))}catch{return}}function c(e){let t=s(e,a);if(typeof t?.syncedAt==`string`)return t.syncedAt;let n=s(e,i);return typeof n?.syncedAt==`string`?n.syncedAt:void 0}function l(e){let t=s(e,i),n=c(e),r=t?.origins&&typeof t.origins==`object`?t.origins:void 0,a=t?.tsconfigOverrides&&typeof t.tsconfigOverrides==`object`?t.tsconfigOverrides:void 0,o=t?.snapshots&&typeof t.snapshots==`object`?t.snapshots:void 0,l=/* @__PURE__ */ new Set([`files`,`origins`,`syncedAt`,`tsconfigOverrides`,`snapshots`]),u=Object.fromEntries(Object.entries(t??{}).filter(([e])=>!l.has(e)));return{files:Array.isArray(t?.files)?t.files:[],...r?{origins:r}:{},...a?{tsconfigOverrides:a}:{},...o?{snapshots:o}:{},...Object.keys(u).length>0?{extras:u}:{},...n?{syncedAt:n}:{}}}function u(r,s,c,l,u){let d=o(r);n.mkdirSync(d,{recursive:!0});let f=[...new Set(s)].sort();n.writeFileSync(e.join(d,i),t({...u,files:f,...l?{origins:Object.fromEntries(f.filter(e=>l[e]!==void 0).map(e=>[e,l[e]]))}:{}}),`utf-8`),n.writeFileSync(e.join(d,a),t({syncedAt:c??(/* @__PURE__ */ new Date()).toISOString()}),`utf-8`)}export{r as MANIFEST_DIR,i as MANIFEST_FILE,a as TIMESTAMPS_FILE,l as readManifest,c as readSyncedAt,u as writeManifest};
@@ -1,12 +1,57 @@
1
1
  import __tsdown_shims_path from 'node:path';
2
2
  import __tsdown_shims_url from 'node:url';
3
3
  import { ToolchainProvider } from "../../shared/src/provider.js";
4
+ import { RegistryPolicy } from "../../shared/src/registry-policy.js";
4
5
  import "../../shared/src/index.js";
5
6
  //#region packages/core/src/provider-registry.d.ts
6
- /** The absolute path of a project's provider registry file. */
7
+ /** The absolute path of the legacy project provider file. */
8
+ export declare function legacyProviderRegistryPath(cwd?: string): string;
9
+ /** The default project provider registry file. */
7
10
  export declare function providerRegistryPath(cwd?: string): string;
8
- /** Read a project's custom providers (empty when the registry is absent/invalid). */
11
+ /** The `~/.dbx/toolchain/.registry/providers` default global directory. */
12
+ export declare function defaultGlobalProvidersDir(): string;
13
+ /** The legacy global provider file. */
14
+ export declare function globalProviderRegistryPath(): string;
15
+ /** Add a project-scoped provider registry path (or remote URL). */
16
+ export declare function addProjectProviderRegistry(cwd: string, entry: string): void;
17
+ /** Remove a project-scoped provider registry path (never the implicit default). */
18
+ export declare function removeProjectProviderRegistry(cwd: string, entry: string): void;
19
+ /** Add a global provider registry path (or remote URL). */
20
+ export declare function addGlobalProviderRegistry(entry: string): void;
21
+ /** Remove a global provider registry path. */
22
+ export declare function removeGlobalProviderRegistry(entry: string): void;
23
+ /** Replace the global provider search paths. */
24
+ export declare function setGlobalProviderRegistries(paths: string[]): void;
25
+ /** Replace the project-scoped provider search paths. */
26
+ export declare function setProjectProviderRegistries(cwd: string, paths: string[]): void;
27
+ export interface ProviderRegistryPath {
28
+ path: string;
29
+ scope: 'project' | 'global';
30
+ remote: boolean;
31
+ }
32
+ /**
33
+ * Every provider registry path, project first (implicit dir + project entries +
34
+ * the legacy project file), then global (CLI config paths or the default dir,
35
+ * plus the legacy global file). Duplicates are removed.
36
+ */
37
+ export declare function providerRegistryPaths(cwd?: string, policy?: RegistryPolicy): ProviderRegistryPath[];
38
+ /** Read a project's custom providers from its provider search paths. */
9
39
  export declare function readProviderRegistry(cwd?: string): ToolchainProvider[];
10
- /** Write a project's custom providers (removing the file when the list is empty). */
40
+ /** Write a project's custom providers to the default project registry file. */
11
41
  export declare function writeProviderRegistry(cwd: string, providers: ToolchainProvider[]): void;
42
+ /** Read the global providers from the global search paths. */
43
+ export declare function readGlobalProviders(): ToolchainProvider[];
44
+ /** Write the global providers to the default global providers file. */
45
+ export declare function writeGlobalProviders(providers: ToolchainProvider[]): void;
46
+ /**
47
+ * The project + global providers from local registries, deduped by id (a
48
+ * project provider wins). Remote registries are skipped; use
49
+ * {@link readAllProviders} for those.
50
+ */
51
+ export declare function readAllProvidersSync(cwd?: string, policy?: RegistryPolicy): ToolchainProvider[];
52
+ /**
53
+ * The project + global providers from every search path, including remote
54
+ * registries, deduped by id (a project provider wins).
55
+ */
56
+ export declare function readAllProviders(cwd?: string, policy?: RegistryPolicy): Promise<ToolchainProvider[]>;
12
57
  //#endregion
@@ -1 +1 @@
1
- import{default as e}from"node:path";import"node:url";import.meta.url;import t from"node:fs";const n=e.join(`.dbx`,`toolchain`);function r(t=process.cwd()){return e.join(t,n,`providers.json`)}function i(e=process.cwd()){try{let n=JSON.parse(t.readFileSync(r(e),`utf-8`));return Array.isArray(n)?n:[]}catch{return[]}}function a(n,i){let a=r(n);i.length===0?t.rmSync(a,{force:!0}):(t.mkdirSync(e.dirname(a),{recursive:!0}),t.writeFileSync(a,`${JSON.stringify(i,null,4)}\n`,`utf-8`))}export{r as providerRegistryPath,i as readProviderRegistry,a as writeProviderRegistry};
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{registrySourceAllowed as t}from"../../shared/src/registry-policy.js";import"../../shared/src/index.js";import n from"node:fs";import r from"node:os";const i=e.join(`.dbx`,`toolchain`),a=`providers.json`;function o(t){return t===`~`?r.homedir():t.startsWith(`~/`)||t.startsWith(`~\\`)?e.join(r.homedir(),t.slice(2)):t}function s(e){return/^https?:\/\//i.test(e)}function c(e){return e?(Array.isArray(e)?e:[e]).map(e=>o(String(e))).filter(Boolean):[]}function l(t=process.cwd()){return e.join(t,i,`providers.json`)}function u(t=process.cwd()){return e.join(t,i,`.registry`,`providers`,a)}function d(){return e.join(r.homedir(),`.dbx`,`toolchain`,`.registry`,`providers`)}function f(){return e.join(r.homedir(),`.dbx`,`toolchain`,`.registry`,a)}function p(){return e.join(r.homedir(),`.dbx`,`toolchain`,`cli`,`config.json`)}function m(){try{let e=n.readFileSync(p(),`utf-8`).replace(/^\uFEFF/,``),t=JSON.parse(e);return t&&typeof t==`object`?t:{}}catch{return{}}}function h(e=m()){if(e.providerRegistrySearchPaths!==void 0)return c(e.providerRegistrySearchPaths);let t=e.registrySearchPaths;return t&&typeof t==`object`&&!Array.isArray(t)?c(t.providers):[]}function g(t){return e.join(t,i,`registries.json`)}function _(e){try{let t=n.readFileSync(g(e),`utf-8`).replace(/^\uFEFF/,``),r=JSON.parse(t);return{templates:c(r.templates),providers:c(r.providers)}}catch{return{}}}function v(t,r){let i=g(t),a={...r.templates&&r.templates.length>0?{templates:r.templates}:{},...r.providers&&r.providers.length>0?{providers:r.providers}:{}};Object.keys(a).length===0?n.rmSync(i,{force:!0}):(n.mkdirSync(e.dirname(i),{recursive:!0}),n.writeFileSync(i,`${JSON.stringify(a,null,4)}\n`,`utf-8`))}function y(t){let r={...m(),...t},i=p();return n.mkdirSync(e.dirname(i),{recursive:!0}),n.writeFileSync(i,`${JSON.stringify(r,null,4)}\n`,`utf-8`),r}function b(t,n,r){let i=n=>s(n)?n:e.resolve(t,o(n));return i(n)===i(r)}function x(e,t){let n=_(e),r=n.providers??[];r.some(n=>b(e,n,t))||v(e,{...n.templates?{templates:n.templates}:{},providers:[...r,t]})}function S(e,t){let n=_(e);v(e,{...n.templates?{templates:n.templates}:{},...n.providers?{providers:n.providers.filter(n=>!b(e,n,t))}:{}})}function C(e){let t=h(m()),n=o(e);t.some(e=>b(process.cwd(),e,n))||y({providerRegistrySearchPaths:[...t,n]})}function w(e){let t=m(),n=o(e);y({providerRegistrySearchPaths:h(t).filter(e=>!b(process.cwd(),e,n))})}function T(e){y({providerRegistrySearchPaths:e.map(o)})}function E(e,t){let n=_(e);v(e,{...n.templates?{templates:n.templates}:{},providers:t})}function D(t){return(_(t).providers??[]).map(n=>s(n)?n:e.resolve(t,n))}function O(r=process.cwd(),a){let o=m(),c=[],u=e.join(r,i,`.registry`,`providers`);n.existsSync(u)&&c.push(u),c.push(...D(r)),n.existsSync(l(r))&&c.push(l(r));let p=[...h(o)],g=d();n.existsSync(g)&&p.push(g),n.existsSync(f())&&p.push(f());let _=/* @__PURE__ */ new Set,v=[];for(let[n,r]of[[`project`,c],[`global`,p]])for(let i of r){let r=s(i)?i:e.resolve(i);_.has(r)||t(r,a)&&(_.add(r),v.push({path:i,scope:n,remote:s(i)}))}return v}function k(e){return!!e&&typeof e==`object`&&typeof e.id==`string`&&typeof e.name==`string`&&Array.isArray(e.commands)}function A(e){return(Array.isArray(e)?e:e&&typeof e==`object`&&Array.isArray(e.providers)?e.providers:[]).filter(k)}function j(t){try{if(n.statSync(t).isDirectory()){let r=[];for(let i of n.readdirSync(t))i.toLowerCase().endsWith(`.json`)&&r.push(...j(e.join(t,i)));return r}return A(JSON.parse(n.readFileSync(t,`utf-8`)))}catch{return[]}}function M(t,r){r.length===0?n.rmSync(t,{force:!0}):(n.mkdirSync(e.dirname(t),{recursive:!0}),n.writeFileSync(t,`${JSON.stringify(r,null,4)}\n`,`utf-8`))}function N(e=process.cwd()){let t=/* @__PURE__ */ new Set,n=[];for(let r of O(e))if(!(r.scope!==`project`||r.remote))for(let e of j(r.path))t.has(e.id)||(t.add(e.id),n.push(e));return n}function P(e,t){M(u(e),t)}function F(){let e=/* @__PURE__ */ new Set,t=[];for(let n of O())if(!(n.scope!==`global`||n.remote))for(let r of j(n.path))e.has(r.id)||(e.add(r.id),t.push(r));return t}function I(t){M(e.join(d(),a),t)}function L(e){let t=/* @__PURE__ */ new Set,n=[];for(let r of e)t.has(r.id)||(t.add(r.id),n.push(r));return n}function R(e=process.cwd(),t){let n=O(e,t),r=n.filter(e=>e.scope===`project`&&!e.remote),i=n.filter(e=>e.scope===`global`&&!e.remote);return L([...r.flatMap(e=>j(e.path)),...i.flatMap(e=>j(e.path))])}async function z(e){try{let t=await fetch(e,{headers:{accept:`application/json`}});return t.ok?A(await t.json()):[]}catch{return[]}}async function B(e=process.cwd(),t){let n=O(e,t),r=[];for(let e of n)e.remote?r.push(...await z(e.path)):r.push(...j(e.path));return L(r)}export{C as addGlobalProviderRegistry,x as addProjectProviderRegistry,d as defaultGlobalProvidersDir,f as globalProviderRegistryPath,l as legacyProviderRegistryPath,u as providerRegistryPath,O as providerRegistryPaths,B as readAllProviders,R as readAllProvidersSync,F as readGlobalProviders,N as readProviderRegistry,w as removeGlobalProviderRegistry,S as removeProjectProviderRegistry,T as setGlobalProviderRegistries,E as setProjectProviderRegistries,I as writeGlobalProviders,P as writeProviderRegistry};
@@ -11,15 +11,27 @@ export interface ResetSelectors {
11
11
  /** Remove the `dbx.config.*` file(s). */
12
12
  config?: boolean;
13
13
  }
14
+ /**
15
+ * Undo the state a sync applied to user-owned files before the manifest that
16
+ * records it is removed (eg. `tsconfig.overrides`). Returns the repo-relative
17
+ * files it restored (or would restore on a dry run).
18
+ */
19
+ export type ResetRestore = (cwd: string, options: {
20
+ dryRun: boolean;
21
+ }) => string[];
14
22
  export interface ResetToolchainOptions extends ResetSelectors {
15
23
  /** The project directory to reset. */
16
24
  cwd: string;
17
25
  /** Report what would be removed without deleting anything. */
18
26
  dryRun?: boolean;
27
+ /** Run before the manifest is removed, while its recorded state still exists. */
28
+ restore?: ResetRestore;
19
29
  }
20
30
  export interface ResetToolchainResult {
21
31
  /** Repo-relative paths removed (or that would be removed). */
22
32
  removed: string[];
33
+ /** User-owned files restored before the manifest was removed. */
34
+ restored: string[];
23
35
  /** Whether this was a dry run. */
24
36
  dryRun: boolean;
25
37
  }
@@ -34,12 +46,15 @@ export interface ResetProjectsOptions extends ResetSelectors, Omit<SelectProject
34
46
  /** Apply to every discovered project under `root` (not just `root`). */
35
47
  recursive?: boolean;
36
48
  dryRun?: boolean;
49
+ /** Run per project before its manifest is removed (see {@link ResetRestore}). */
50
+ restore?: ResetRestore;
37
51
  }
38
52
  export interface ResetProjectsResult {
39
53
  results: {
40
54
  dir: string;
41
55
  rel: string;
42
56
  removed: string[];
57
+ restored: string[];
43
58
  }[];
44
59
  dryRun: boolean;
45
60
  }
@@ -1 +1 @@
1
- import{default as e}from"node:path";import"node:url";import.meta.url;import{findConfigFile as t}from"./loader.js";import{MANIFEST_DIR as n,readManifest as r}from"./manifest.js";import{selectProjects as i}from"./select.js";import a from"node:fs";function o(e){return e.replace(/\\/g,`/`)}function s(e){let t=e.generated!==void 0||e.manifest!==void 0||e.config!==void 0;return{generated:e.generated??!t,manifest:e.manifest??!t,config:e.config??!1}}function c(i){let{cwd:c}=i,l=i.dryRun??!1,u=s(i),d=[],f=(e,t)=>{a.existsSync(e)&&(l||a.rmSync(e,{force:!0}),d.push(t))};if(u.generated)for(let t of r(c).files)f(e.resolve(c,t),t);if(u.config){let n=t(c);n&&f(n,o(e.relative(c,n)))}if(u.manifest){let t=e.resolve(c,n);a.existsSync(t)&&(l||a.rmSync(t,{recursive:!0,force:!0}),d.push(`${n}/`))}return{removed:d,dryRun:l}}function l(e){let n=e.dryRun??!1;return{results:(e.recursive?i({root:e.root,...e.include?{include:e.include}:{},...e.exclude?{exclude:e.exclude}:{},...e.maxDepth===void 0?{}:{maxDepth:e.maxDepth}}):[{dir:e.root,rel:`.`,hasConfig:!!t(e.root)}]).map(t=>({dir:t.dir,rel:t.rel,removed:c({cwd:t.dir,...e.generated===void 0?{}:{generated:e.generated},...e.manifest===void 0?{}:{manifest:e.manifest},...e.config===void 0?{}:{config:e.config},dryRun:n}).removed})),dryRun:n}}export{l as resetProjects,c as resetToolchain};
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{findConfigFile as t}from"./loader.js";import{MANIFEST_DIR as n,readManifest as r}from"./manifest.js";import{selectProjects as i}from"./select.js";import a from"node:fs";function o(e){return e.replace(/\\/g,`/`)}function s(e){let t=e.generated!==void 0||e.manifest!==void 0||e.config!==void 0;return{generated:e.generated??!t,manifest:e.manifest??!t,config:e.config??!1}}function c(i){let{cwd:c}=i,l=i.dryRun??!1,u=s(i),d=[],f=(e,t)=>{a.existsSync(e)&&(l||a.rmSync(e,{force:!0}),d.push(t))};if(u.generated){let t=r(c);for(let n of t.files)t.origins?.[n]!==`adopted`&&f(e.resolve(c,n),n)}if(u.config){let n=t(c);n&&f(n,o(e.relative(c,n)))}let p=[];if(u.manifest&&i.restore&&p.push(...i.restore(c,{dryRun:l})),u.manifest){let t=e.resolve(c,n);a.existsSync(t)&&(l||a.rmSync(t,{recursive:!0,force:!0}),d.push(`${n}/`))}return{removed:d,restored:p,dryRun:l}}function l(e){let n=e.dryRun??!1;return{results:(e.recursive?i({root:e.root,...e.include?{include:e.include}:{},...e.exclude?{exclude:e.exclude}:{},...e.maxDepth===void 0?{}:{maxDepth:e.maxDepth}}):[{dir:e.root,rel:`.`,hasConfig:!!t(e.root)}]).map(t=>{let{removed:r,restored:i}=c({cwd:t.dir,...e.generated===void 0?{}:{generated:e.generated},...e.manifest===void 0?{}:{manifest:e.manifest},...e.config===void 0?{}:{config:e.config},...e.restore?{restore:e.restore}:{},dryRun:n});return{dir:t.dir,rel:t.rel,removed:r,restored:i}}),dryRun:n}}export{l as resetProjects,c as resetToolchain};
@@ -12,6 +12,8 @@ export interface RunSyncOptions {
12
12
  cwd: string;
13
13
  /** The loaded config. */
14
14
  config: ToolchainConfig;
15
+ /** The project's own (unmerged) config, when known. */
16
+ ownConfig?: ToolchainConfig;
15
17
  /** The resolved replacement tokens. */
16
18
  tokens: Replacements;
17
19
  /** The project kind (resolved from the config/cwd when omitted). */
@@ -23,6 +25,12 @@ export interface RunSyncOptions {
23
25
  /** Custom logger (default `logger.info`). */
24
26
  log?: (message: string) => void;
25
27
  }
28
+ export interface RemovedFile {
29
+ /** Repo-relative path. */
30
+ path: string;
31
+ /** The content before removal, so an editor can offer "Restore". */
32
+ content: string;
33
+ }
26
34
  export interface SyncResult {
27
35
  /** Paths written (empty in check mode). */
28
36
  written: string[];
@@ -30,6 +38,8 @@ export interface SyncResult {
30
38
  changed: string[];
31
39
  /** Previously-managed paths removed because they are no longer generated. */
32
40
  removed: string[];
41
+ /** The removed files' previous content (for a Restore action). */
42
+ removedFiles: RemovedFile[];
33
43
  /** Whether disk already matched the generated output. */
34
44
  upToDate: boolean;
35
45
  }
@@ -1 +1 @@
1
- import{default as e}from"node:path";import"node:url";import.meta.url;import{logger as t}from"../../shared/src/logger.js";import"../../shared/src/index.js";import{ensureDbxGitignore as n}from"./gitignore.js";import{resolveProjectType as r}from"./project-type.js";import{readManifest as i,writeManifest as a}from"./manifest.js";import o from"node:fs";function s(e){return e.replace(/\\/g,`/`)}async function c(c){let{tasks:l,cwd:u,config:d,tokens:f}=c,p=c.quiet?()=>{}:c.log??(e=>t.info(e)),m=c.quiet?()=>{}:e=>t.warn(e),h=c.projectType??r(u,d),g={cwd:u,projectType:h,config:d,tokens:f,log:p,warn:m},_=d.hooks??{};await _.beforeSync?.(g);let v=l.filter(e=>(!e.projectTypes||e.projectTypes.includes(h))&&(!e.enabled||e.enabled(d)));p(`running ${v.length} task(s)${c.check?` (check)`:``} [${h}]`);let y=[];for(let e of v){p(` - ${e.name}`),await _.beforeTask?.({task:e,ctx:g});let t=await e.run(g),n=Array.isArray(t)?t:void 0;n&&y.push(...n),await _.afterTask?.({task:e,ctx:g,...n?{files:n}:{}})}let b=new Map(y.map(e=>[s(e.path),e.content])),x=i(u),S=/* @__PURE__ */ new Set;for(let e of v)for(let t of e.keep??[])S.add(t);let C=e=>{for(let t of S)if(e===t||e.endsWith(`/${t}`)||e.endsWith(t))return!0;return!1},w=[];for(let[t,n]of b){let r=e.resolve(u,t);(o.existsSync(r)?o.readFileSync(r,`utf-8`):void 0)!==n&&w.push(t)}let T=x.files.filter(t=>!b.has(t)&&!C(t)&&o.existsSync(e.resolve(u,t))),E=w.length===0&&T.length===0;if(c.check){if(E)p(`generated files are in sync.`);else{p(`generated files are out of date:`);for(let e of w)p(` M ${e}`);for(let e of T)p(` D ${e}`);p("Run `dbx sync` to regenerate them.")}let e={written:[],changed:w,removed:T,upToDate:E};return await _.afterSync?.({cwd:u,config:d,result:e}),e}let D=[];for(let[t,n]of b){let r=e.resolve(u,t);o.mkdirSync(e.dirname(r),{recursive:!0}),o.writeFileSync(r,n,`utf-8`),D.push(t)}for(let t of T)o.rmSync(e.resolve(u,t),{force:!0});a(u,[...b.keys()]),n(u)&&p(` I .gitignore (added the .dbx ignore block)`),p(`wrote ${D.length}, removed ${T.length} file(s)${w.length?`, updated ${w.length}`:``}.`);let O={written:D,changed:w,removed:T,upToDate:E};return await _.afterSync?.({cwd:u,config:d,result:O}),O}export{c as runSync};
1
+ import{default as e}from"node:path";import"node:url";import.meta.url;import{logger as t}from"../../shared/src/logger.js";import"../../shared/src/index.js";import{ensureDbxGitignore as n}from"./gitignore.js";import{resolveProjectType as r}from"./project-type.js";import{readManifest as i,writeManifest as a}from"./manifest.js";import o from"node:fs";function s(e){return e.replace(/\\/g,`/`)}async function c(c){let{tasks:l,cwd:u,config:d,ownConfig:f,tokens:p}=c,m=c.quiet?()=>{}:c.log??(e=>t.info(e)),h=c.quiet?()=>{}:(e,n)=>t.warn(e,n),g=c.projectType??r(u,d),_=i(u),v={cwd:u,projectType:g,config:d,ownConfig:f??d,tokens:p,log:m,warn:h,check:c.check===!0,managedFiles:_.files,manifest:{..._.extras,..._.tsconfigOverrides?{tsconfigOverrides:_.tsconfigOverrides}:{},..._.snapshots?{snapshots:_.snapshots}:{}}},y=d.hooks??{};await y.beforeSync?.(v);let b=l.filter(e=>(!e.projectTypes||e.projectTypes.includes(g))&&(!e.enabled||e.enabled(d)));m(`running ${b.length} task(s)${c.check?` (check)`:``} [${g}]`);let x=[];for(let e of b){m(` - ${e.name}`),await y.beforeTask?.({task:e,ctx:v});let t=await e.run(v),n=Array.isArray(t)?t:void 0;n&&x.push(...n),await y.afterTask?.({task:e,ctx:v,...n?{files:n}:{}})}let S=new Map(x.map(e=>[s(e.path),e.content])),C=new Set(x.filter(e=>e.track===!1).map(e=>s(e.path))),w=/* @__PURE__ */ new Set;for(let e of b){let t=typeof e.keep==`function`?e.keep(d):e.keep??[];for(let e of t)w.add(e)}let T=e=>{for(let t of w)if(e===t||e.endsWith(`/${t}`)||e.endsWith(t))return!0;return!1},E=[];for(let[t,n]of S){let r=e.resolve(u,t);(o.existsSync(r)?o.readFileSync(r,`utf-8`):void 0)!==n&&E.push(t)}let D=new Map([...S.keys()].map(t=>[t,o.existsSync(e.resolve(u,t))])),O=e=>_.origins?.[e]??(_.files.includes(e)?`created`:D.get(e)?`adopted`:`created`),k=_.files.filter(t=>!S.has(t)&&!C.has(t)&&!T(t)&&o.existsSync(e.resolve(u,t))&&O(t)===`created`),A=k.map(t=>({path:t,content:o.readFileSync(e.resolve(u,t),`utf-8`)})),j=E.length===0&&k.length===0;if(c.check){if(j)m(`generated files are in sync.`);else{m(`generated files are out of date:`);for(let e of E)m(` M ${e}`);for(let e of k)m(` D ${e}`);m("Run `dbx sync` to regenerate them.")}let e={written:[],changed:E,removed:k,removedFiles:A,upToDate:j};return await y.afterSync?.({cwd:u,config:d,result:e}),e}let M=[];for(let[t,n]of S){let r=e.resolve(u,t);o.mkdirSync(e.dirname(r),{recursive:!0}),o.writeFileSync(r,n,`utf-8`),M.push(t)}for(let t of k)o.rmSync(e.resolve(u,t),{force:!0});let N=[...S.keys()].filter(e=>!C.has(e)),P={};for(let e of N)P[e]=O(e);a(u,N,void 0,P,v.manifest),n(u)&&m(` I .gitignore (added the .dbx ignore block)`),m(`wrote ${M.length}, removed ${k.length} file(s)${E.length?`, updated ${E.length}`:``}.`);let F={written:M,changed:E,removed:k,removedFiles:A,upToDate:j};return await y.afterSync?.({cwd:u,config:d,result:F}),F}export{c as runSync};