zard-cli 1.0.0-beta.98 → 1.0.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 (253) hide show
  1. package/README.md +92 -36
  2. package/commands/add/component-installer.d.ts +3 -0
  3. package/commands/add/component-installer.d.ts.map +1 -1
  4. package/commands/add/component-installer.js +10 -4
  5. package/commands/add/component-installer.js.map +1 -1
  6. package/commands/add/component-selector.d.ts +6 -0
  7. package/commands/add/component-selector.d.ts.map +1 -1
  8. package/commands/add/component-selector.js +9 -27
  9. package/commands/add/component-selector.js.map +1 -1
  10. package/commands/add/dark-mode-setup.d.ts.map +1 -1
  11. package/commands/add/dark-mode-setup.js +2 -11
  12. package/commands/add/dark-mode-setup.js.map +1 -1
  13. package/commands/add/dependency-resolver.d.ts +8 -1
  14. package/commands/add/dependency-resolver.d.ts.map +1 -1
  15. package/commands/add/dependency-resolver.js +87 -16
  16. package/commands/add/dependency-resolver.js.map +1 -1
  17. package/commands/add/index.d.ts.map +1 -1
  18. package/commands/add/index.js +128 -96
  19. package/commands/add/index.js.map +1 -1
  20. package/commands/add/stylesheet-setup.d.ts +3 -0
  21. package/commands/add/stylesheet-setup.d.ts.map +1 -0
  22. package/commands/add/stylesheet-setup.js +92 -0
  23. package/commands/add/stylesheet-setup.js.map +1 -0
  24. package/commands/add/wizard.d.ts +35 -0
  25. package/commands/add/wizard.d.ts.map +1 -0
  26. package/commands/add/wizard.js +299 -0
  27. package/commands/add/wizard.js.map +1 -0
  28. package/commands/init/config-prompter.d.ts +55 -3
  29. package/commands/init/config-prompter.d.ts.map +1 -1
  30. package/commands/init/config-prompter.js +92 -74
  31. package/commands/init/config-prompter.js.map +1 -1
  32. package/commands/init/dependencies.d.ts +1 -8
  33. package/commands/init/dependencies.d.ts.map +1 -1
  34. package/commands/init/dependencies.js +51 -25
  35. package/commands/init/dependencies.js.map +1 -1
  36. package/commands/init/index.d.ts.map +1 -1
  37. package/commands/init/index.js +147 -81
  38. package/commands/init/index.js.map +1 -1
  39. package/commands/init/project-kind.d.ts +82 -0
  40. package/commands/init/project-kind.d.ts.map +1 -0
  41. package/commands/init/project-kind.js +166 -0
  42. package/commands/init/project-kind.js.map +1 -0
  43. package/commands/init/steps.d.ts +15 -0
  44. package/commands/init/steps.d.ts.map +1 -0
  45. package/commands/init/steps.js +154 -0
  46. package/commands/init/steps.js.map +1 -0
  47. package/commands/init/tailwind-setup.d.ts +9 -2
  48. package/commands/init/tailwind-setup.d.ts.map +1 -1
  49. package/commands/init/tailwind-setup.js +33 -12
  50. package/commands/init/tailwind-setup.js.map +1 -1
  51. package/commands/init/tsconfig-updater.d.ts +8 -1
  52. package/commands/init/tsconfig-updater.d.ts.map +1 -1
  53. package/commands/init/tsconfig-updater.js +30 -11
  54. package/commands/init/tsconfig-updater.js.map +1 -1
  55. package/commands/init/update-angular-config.d.ts.map +1 -1
  56. package/commands/init/update-angular-config.js +28 -50
  57. package/commands/init/update-angular-config.js.map +1 -1
  58. package/commands/init/vite-setup.d.ts +11 -0
  59. package/commands/init/vite-setup.d.ts.map +1 -0
  60. package/commands/init/vite-setup.js +61 -0
  61. package/commands/init/vite-setup.js.map +1 -0
  62. package/commands/init/wizard.d.ts +30 -0
  63. package/commands/init/wizard.d.ts.map +1 -0
  64. package/commands/init/wizard.js +560 -0
  65. package/commands/init/wizard.js.map +1 -0
  66. package/constants/app.constants.d.ts +17 -0
  67. package/constants/app.constants.d.ts.map +1 -1
  68. package/constants/app.constants.js +39 -16
  69. package/constants/app.constants.js.map +1 -1
  70. package/core/icons/families.d.ts +38 -0
  71. package/core/icons/families.d.ts.map +1 -0
  72. package/core/icons/families.js +26 -0
  73. package/core/icons/families.js.map +1 -0
  74. package/core/icons/icon-map.d.ts +24 -0
  75. package/core/icons/icon-map.d.ts.map +1 -0
  76. package/core/icons/icon-map.js +141 -0
  77. package/core/icons/icon-map.js.map +1 -0
  78. package/core/icons/index.d.ts +107 -0
  79. package/core/icons/index.d.ts.map +1 -0
  80. package/core/icons/index.js +183 -0
  81. package/core/icons/index.js.map +1 -0
  82. package/core/registry/registry-data.d.ts.map +1 -1
  83. package/core/registry/registry-data.js +482 -37
  84. package/core/registry/registry-data.js.map +1 -1
  85. package/core/themes/theme-definitions.d.ts.map +1 -1
  86. package/core/themes/theme-definitions.js +61 -72
  87. package/core/themes/theme-definitions.js.map +1 -1
  88. package/index.js +6 -3
  89. package/index.js.map +1 -1
  90. package/package.json +6 -11
  91. package/ui/blocks.d.ts +71 -0
  92. package/ui/blocks.d.ts.map +1 -0
  93. package/ui/blocks.js +116 -0
  94. package/ui/blocks.js.map +1 -0
  95. package/ui/brand.d.ts +14 -0
  96. package/ui/brand.d.ts.map +1 -0
  97. package/ui/brand.js +35 -0
  98. package/ui/brand.js.map +1 -0
  99. package/ui/engine/animation/index.d.ts +38 -0
  100. package/ui/engine/animation/index.d.ts.map +1 -0
  101. package/ui/engine/animation/index.js +102 -0
  102. package/ui/engine/animation/index.js.map +1 -0
  103. package/ui/engine/ansi/index.d.ts +51 -0
  104. package/ui/engine/ansi/index.d.ts.map +1 -0
  105. package/ui/engine/ansi/index.js +116 -0
  106. package/ui/engine/ansi/index.js.map +1 -0
  107. package/ui/engine/components/index.d.ts +211 -0
  108. package/ui/engine/components/index.d.ts.map +1 -0
  109. package/ui/engine/components/index.js +109 -0
  110. package/ui/engine/components/index.js.map +1 -0
  111. package/ui/engine/cursor/index.d.ts +16 -0
  112. package/ui/engine/cursor/index.d.ts.map +1 -0
  113. package/ui/engine/cursor/index.js +40 -0
  114. package/ui/engine/cursor/index.js.map +1 -0
  115. package/ui/engine/diff/index.d.ts +26 -0
  116. package/ui/engine/diff/index.d.ts.map +1 -0
  117. package/ui/engine/diff/index.js +56 -0
  118. package/ui/engine/diff/index.js.map +1 -0
  119. package/ui/engine/events/index.d.ts +24 -0
  120. package/ui/engine/events/index.d.ts.map +1 -0
  121. package/ui/engine/events/index.js +60 -0
  122. package/ui/engine/events/index.js.map +1 -0
  123. package/ui/engine/focus/index.d.ts +25 -0
  124. package/ui/engine/focus/index.d.ts.map +1 -0
  125. package/ui/engine/focus/index.js +77 -0
  126. package/ui/engine/focus/index.js.map +1 -0
  127. package/ui/engine/frame/index.d.ts +48 -0
  128. package/ui/engine/frame/index.d.ts.map +1 -0
  129. package/ui/engine/frame/index.js +0 -0
  130. package/ui/engine/frame/index.js.map +1 -0
  131. package/ui/engine/index.d.ts +28 -0
  132. package/ui/engine/index.d.ts.map +1 -0
  133. package/ui/engine/index.js +28 -0
  134. package/ui/engine/index.js.map +1 -0
  135. package/ui/engine/input/index.d.ts +36 -0
  136. package/ui/engine/input/index.d.ts.map +1 -0
  137. package/ui/engine/input/index.js +224 -0
  138. package/ui/engine/input/index.js.map +1 -0
  139. package/ui/engine/layout/index.d.ts +42 -0
  140. package/ui/engine/layout/index.d.ts.map +1 -0
  141. package/ui/engine/layout/index.js +241 -0
  142. package/ui/engine/layout/index.js.map +1 -0
  143. package/ui/engine/renderer/index.d.ts +43 -0
  144. package/ui/engine/renderer/index.d.ts.map +1 -0
  145. package/ui/engine/renderer/index.js +619 -0
  146. package/ui/engine/renderer/index.js.map +1 -0
  147. package/ui/engine/scheduler/index.d.ts +22 -0
  148. package/ui/engine/scheduler/index.d.ts.map +1 -0
  149. package/ui/engine/scheduler/index.js +77 -0
  150. package/ui/engine/scheduler/index.js.map +1 -0
  151. package/ui/engine/screen/index.d.ts +39 -0
  152. package/ui/engine/screen/index.d.ts.map +1 -0
  153. package/ui/engine/screen/index.js +255 -0
  154. package/ui/engine/screen/index.js.map +1 -0
  155. package/ui/engine/terminal/index.d.ts +84 -0
  156. package/ui/engine/terminal/index.d.ts.map +1 -0
  157. package/ui/engine/terminal/index.js +235 -0
  158. package/ui/engine/terminal/index.js.map +1 -0
  159. package/ui/engine/testing/index.d.ts +27 -0
  160. package/ui/engine/testing/index.d.ts.map +1 -0
  161. package/ui/engine/testing/index.js +63 -0
  162. package/ui/engine/testing/index.js.map +1 -0
  163. package/ui/engine/theme/index.d.ts +26 -0
  164. package/ui/engine/theme/index.d.ts.map +1 -0
  165. package/ui/engine/theme/index.js +128 -0
  166. package/ui/engine/theme/index.js.map +1 -0
  167. package/ui/engine/utils/index.d.ts +12 -0
  168. package/ui/engine/utils/index.d.ts.map +1 -0
  169. package/ui/engine/utils/index.js +143 -0
  170. package/ui/engine/utils/index.js.map +1 -0
  171. package/ui/gate.d.ts +19 -0
  172. package/ui/gate.d.ts.map +1 -0
  173. package/ui/gate.js +36 -0
  174. package/ui/gate.js.map +1 -0
  175. package/ui/index.d.ts +18 -0
  176. package/ui/index.d.ts.map +1 -0
  177. package/ui/index.js +18 -0
  178. package/ui/index.js.map +1 -0
  179. package/ui/log-sink.d.ts +24 -0
  180. package/ui/log-sink.d.ts.map +1 -0
  181. package/ui/log-sink.js +35 -0
  182. package/ui/log-sink.js.map +1 -0
  183. package/ui/output.d.ts +14 -0
  184. package/ui/output.d.ts.map +1 -0
  185. package/ui/output.js +28 -0
  186. package/ui/output.js.map +1 -0
  187. package/ui/report.d.ts +30 -0
  188. package/ui/report.d.ts.map +1 -0
  189. package/ui/report.js +45 -0
  190. package/ui/report.js.map +1 -0
  191. package/ui/runner.d.ts +66 -0
  192. package/ui/runner.d.ts.map +1 -0
  193. package/ui/runner.js +135 -0
  194. package/ui/runner.js.map +1 -0
  195. package/ui/style.d.ts +24 -0
  196. package/ui/style.d.ts.map +1 -0
  197. package/ui/style.js +44 -0
  198. package/ui/style.js.map +1 -0
  199. package/ui/testing/fake-tty.d.ts +26 -0
  200. package/ui/testing/fake-tty.d.ts.map +1 -0
  201. package/ui/testing/fake-tty.js +61 -0
  202. package/ui/testing/fake-tty.js.map +1 -0
  203. package/ui/text-input.d.ts +31 -0
  204. package/ui/text-input.d.ts.map +1 -0
  205. package/ui/text-input.js +89 -0
  206. package/ui/text-input.js.map +1 -0
  207. package/ui/theme.d.ts +10 -0
  208. package/ui/theme.d.ts.map +1 -0
  209. package/ui/theme.js +20 -0
  210. package/ui/theme.js.map +1 -0
  211. package/utils/angular-compat.d.ts +21 -0
  212. package/utils/angular-compat.d.ts.map +1 -0
  213. package/utils/angular-compat.js +52 -0
  214. package/utils/angular-compat.js.map +1 -0
  215. package/utils/config.d.ts +29 -0
  216. package/utils/config.d.ts.map +1 -1
  217. package/utils/config.js +50 -4
  218. package/utils/config.js.map +1 -1
  219. package/utils/errors.d.ts +11 -0
  220. package/utils/errors.d.ts.map +1 -1
  221. package/utils/errors.js +14 -0
  222. package/utils/errors.js.map +1 -1
  223. package/utils/get-project-info.d.ts +29 -0
  224. package/utils/get-project-info.d.ts.map +1 -1
  225. package/utils/get-project-info.js +176 -1
  226. package/utils/get-project-info.js.map +1 -1
  227. package/utils/http-client.d.ts.map +1 -1
  228. package/utils/http-client.js +18 -3
  229. package/utils/http-client.js.map +1 -1
  230. package/utils/icon-catalog.d.ts +34 -0
  231. package/utils/icon-catalog.d.ts.map +1 -0
  232. package/utils/icon-catalog.js +63 -0
  233. package/utils/icon-catalog.js.map +1 -0
  234. package/utils/logger.d.ts +13 -1
  235. package/utils/logger.d.ts.map +1 -1
  236. package/utils/logger.js +95 -15
  237. package/utils/logger.js.map +1 -1
  238. package/utils/package-manager.d.ts +42 -1
  239. package/utils/package-manager.d.ts.map +1 -1
  240. package/utils/package-manager.js +204 -11
  241. package/utils/package-manager.js.map +1 -1
  242. package/utils/registry.d.ts +84 -2
  243. package/utils/registry.d.ts.map +1 -1
  244. package/utils/registry.js +121 -18
  245. package/utils/registry.js.map +1 -1
  246. package/utils/schema-version.d.ts +21 -0
  247. package/utils/schema-version.d.ts.map +1 -0
  248. package/utils/schema-version.js +28 -0
  249. package/utils/schema-version.js.map +1 -0
  250. package/utils/source-file.d.ts +40 -0
  251. package/utils/source-file.d.ts.map +1 -0
  252. package/utils/source-file.js +104 -0
  253. package/utils/source-file.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-catalog.js","sourceRoot":"","sources":["../../src/utils/icon-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,kBAAkB,EAAqC,MAAM,0BAA0B,CAAC;AACjG,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAQrE,IAAI,OAAO,GAAgB,kBAAkB,CAAC;AAE9C,yEAAyE;AACzE,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB;IAC9B,OAAO,GAAG,kBAAkB,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAsB,GAAG,WAAW,aAAa,CAAC,CAAC;QACnF,qBAAqB,CAAC,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAExF,OAAO,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6EAA6E;QAC7E,2EAA2E;QAC3E,6EAA6E;QAC7E,0EAA0E;QAC1E,yDAAyD;QACzD,IAAI,KAAK,YAAY,kBAAkB;YAAE,MAAM,KAAK,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,6CAA6C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5G,OAAO,GAAG,kBAAkB,CAAC;IAC/B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAkB,EAAE,UAAuB,WAAW,EAAE;IACvF,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAE,OAAO;IAE3E,MAAM,IAAI,QAAQ,CAChB,qBAAqB,MAAM,oCAAoC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EACjH,qBAAqB,CACtB,CAAC;AACJ,CAAC"}
package/utils/logger.d.ts CHANGED
@@ -8,5 +8,17 @@ export declare const logger: {
8
8
  debug(...args: unknown[]): void;
9
9
  break(): void;
10
10
  };
11
- export declare function spinner(text: string): import("ora").Ora;
11
+ export interface Spinner {
12
+ text: string;
13
+ start(): Spinner;
14
+ stop(): Spinner;
15
+ succeed(text?: string): Spinner;
16
+ fail(text?: string): Spinner;
17
+ }
18
+ /**
19
+ * Progress indicator for the paths that run outside the interactive screen
20
+ * (headless, --yes, CI). Inside a wizard the engine does the animating, and here
21
+ * the transitions become nothing but records in the sink.
22
+ */
23
+ export declare function spinner(text: string): Spinner;
12
24
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAKA,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,eAAO,MAAM,MAAM;mBACF,OAAO,EAAE;kBAGV,OAAO,EAAE;kBAGT,OAAO,EAAE;qBAGN,OAAO,EAAE;mBAGX,OAAO,EAAE;;CAQzB,CAAC;AAEF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,qBAMnC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAMA,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAwBD,eAAO,MAAM,MAAM;mBACF,OAAO,EAAE;kBAGV,OAAO,EAAE;kBAGT,OAAO,EAAE;qBAGN,OAAO,EAAE;mBAGX,OAAO,EAAE;;CAQzB,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,IAAI,OAAO,CAAC;IACjB,IAAI,IAAI,OAAO,CAAC;IAChB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAKD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAuD7C"}
package/utils/logger.js CHANGED
@@ -1,5 +1,6 @@
1
- import chalk from 'chalk';
2
- import ora from 'ora';
1
+ import { capture, isCapturing } from '../ui/log-sink.js';
2
+ import { formatRecord, writeLine } from '../ui/output.js';
3
+ import { style } from '../ui/style.js';
3
4
  let debugEnabled = false;
4
5
  export function enableDebug() {
5
6
  debugEnabled = true;
@@ -7,33 +8,112 @@ export function enableDebug() {
7
8
  export function isDebugEnabled() {
8
9
  return debugEnabled;
9
10
  }
11
+ function toMessage(args) {
12
+ return args
13
+ .map(arg => {
14
+ if (typeof arg === 'string')
15
+ return arg;
16
+ if (arg instanceof Error)
17
+ return arg.message;
18
+ return String(arg);
19
+ })
20
+ .join(' ');
21
+ }
22
+ /**
23
+ * Writes a message — or holds it, while the interactive screen is mounted.
24
+ *
25
+ * Without that diversion, a `logger.warn` fired mid-install would write over the
26
+ * frame the engine just painted.
27
+ */
28
+ function emit(level, args) {
29
+ const message = toMessage(args);
30
+ if (capture(level, message))
31
+ return;
32
+ writeLine(formatRecord({ level, message }));
33
+ }
10
34
  export const logger = {
11
35
  error(...args) {
12
- console.log(chalk.red(...args));
36
+ emit('error', args);
13
37
  },
14
38
  warn(...args) {
15
- console.log(chalk.yellow(...args));
39
+ emit('warn', args);
16
40
  },
17
41
  info(...args) {
18
- console.log(chalk.cyan(...args));
42
+ emit('info', args);
19
43
  },
20
44
  success(...args) {
21
- console.log(chalk.green(...args));
45
+ emit('success', args);
22
46
  },
23
47
  debug(...args) {
24
- if (debugEnabled) {
25
- console.log(chalk.gray('[debug]', ...args));
26
- }
48
+ if (!debugEnabled)
49
+ return;
50
+ emit('debug', args);
27
51
  },
28
52
  break() {
29
- console.log('');
53
+ if (isCapturing())
54
+ return;
55
+ writeLine();
30
56
  },
31
57
  };
58
+ const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
59
+ const FRAME_MS = 80;
60
+ /**
61
+ * Progress indicator for the paths that run outside the interactive screen
62
+ * (headless, --yes, CI). Inside a wizard the engine does the animating, and here
63
+ * the transitions become nothing but records in the sink.
64
+ */
32
65
  export function spinner(text) {
33
- return ora({
34
- text: chalk.dim(text),
35
- spinner: 'dots',
36
- color: 'cyan',
37
- });
66
+ const animated = Boolean(process.stdout.isTTY) && !isCapturing();
67
+ let timer;
68
+ let frame = 0;
69
+ const clearLine = () => {
70
+ if (animated)
71
+ process.stdout.write('\r\x1b[2K');
72
+ };
73
+ const paint = () => {
74
+ // Capture can start after the spinner was already running; in that case the
75
+ // screen owns the terminal and nothing else may write to it directly.
76
+ if (isCapturing())
77
+ return;
78
+ clearLine();
79
+ process.stdout.write(`${style.primary(FRAMES[frame] ?? FRAMES[0] ?? '')} ${style.dim(instance.text)}`);
80
+ frame = (frame + 1) % FRAMES.length;
81
+ };
82
+ const finish = (level, message) => {
83
+ instance.stop();
84
+ emit(level, [message ?? instance.text]);
85
+ return instance;
86
+ };
87
+ const instance = {
88
+ text,
89
+ start() {
90
+ if (!animated) {
91
+ emit('info', [instance.text]);
92
+ return instance;
93
+ }
94
+ if (timer)
95
+ return instance;
96
+ paint();
97
+ timer = setInterval(paint, FRAME_MS);
98
+ // An active spinner must not keep the process alive on its own.
99
+ timer.unref?.();
100
+ return instance;
101
+ },
102
+ stop() {
103
+ if (timer) {
104
+ clearInterval(timer);
105
+ timer = undefined;
106
+ clearLine();
107
+ }
108
+ return instance;
109
+ },
110
+ succeed(message) {
111
+ return finish('success', message);
112
+ },
113
+ fail(message) {
114
+ return finish('error', message);
115
+ },
116
+ };
117
+ return instance;
38
118
  }
39
119
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB,MAAM,UAAU,WAAW;IACzB,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,CAAC,GAAG,IAAe;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,CAAC,GAAG,IAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,CAAC,GAAG,IAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,GAAG,IAAe;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,KAAK,CAAC,GAAG,IAAe;QACtB,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,KAAK;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,GAAG,CAAC;QACT,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QACrB,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,MAAM;KACd,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,48 @@
1
1
  type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';
2
- export declare function detectPackageManager(): Promise<PackageManager>;
2
+ /**
3
+ * Which manager the *project* uses.
4
+ *
5
+ * Order matters. `npm_config_user_agent` describes how the CLI was invoked
6
+ * (`npx` always says npm), not what the project uses — trusting it first gave a
7
+ * bun project `packageManager: "npm"` in its components.json and a
8
+ * package-lock.json next to its bun.lock. The project answers for itself: the
9
+ * package.json `packageManager` field first, then the lockfiles.
10
+ */
11
+ export declare function detectPackageManager(cwd?: string): Promise<PackageManager>;
12
+ /**
13
+ * How to suggest running the CLI again.
14
+ *
15
+ * A different question: not which manager the project installs dependencies
16
+ * with, but how the CLI was just invoked. Someone who ran `npx zard-cli init`
17
+ * in a bun project does not expect to finish reading `bunx` — and the `npx`
18
+ * they already used works. Only when that cannot be known does the project's
19
+ * manager answer.
20
+ */
21
+ export declare function suggestedRunner(packageManager: PackageManager): string;
3
22
  export declare function getPackageManager(cwd?: string): Promise<'npm' | 'yarn' | 'pnpm' | 'bun'>;
4
23
  export declare function getInstallCommand(packageManager: string, isDev?: boolean): Promise<string[]>;
5
24
  export declare function installPackages(packages: string[], cwd: string, packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun', isDev?: boolean, legacyPeerDeps?: boolean): Promise<void>;
25
+ /**
26
+ * Installs the batch and, if the manager rejects the tree over a peer conflict,
27
+ * retries with the check relaxed.
28
+ *
29
+ * The fallback is remembered for the rest of the run: once the first batch
30
+ * needed it, the following ones will need it for the same reason, and an
31
+ * attempt already known to be doomed costs a full tree resolution.
32
+ */
33
+ export declare function installPackagesWithRetry(packages: string[], cwd: string, packageManager: PackageManager, isDev?: boolean): Promise<void>;
34
+ /**
35
+ * Drops from the batch the packages the project already declares and resolves.
36
+ *
37
+ * The manager charges a lot per invocation — it revalidates the whole tree even
38
+ * when there is nothing to do — so the win is not in making the install faster
39
+ * but in not calling it. An `add` in an already-initialized project asks for
40
+ * exactly the dependencies `init` put there.
41
+ *
42
+ * The filter is deliberately conservative: when in doubt the package stays in
43
+ * the batch and the manager decides. Comparing only the major is enough because
44
+ * the versions the CLI asks for are always of the form `^N`.
45
+ */
46
+ export declare function filterInstalledPackages(packages: string[], cwd: string): Promise<string[]>;
6
47
  export {};
7
48
  //# sourceMappingURL=package-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAGA,KAAK,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAItD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,cAAc,CAAC,CAkBpE;AAED,wBAAsB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,CAG7G;AAED,wBAAsB,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYhG;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,EAC/C,KAAK,UAAQ,EACb,cAAc,UAAQ,GACrB,OAAO,CAAC,IAAI,CAAC,CAWf"}
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAQA,KAAK,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAYtD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB/F;AASD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,CAStE;AAYD,wBAAsB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,CAG7G;AAED,wBAAsB,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYhG;AAaD,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,EAC/C,KAAK,UAAQ,EACb,cAAc,UAAQ,GACrB,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAcD;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,cAAc,EAC9B,KAAK,UAAQ,GACZ,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAchG"}
@@ -1,9 +1,35 @@
1
1
  import { detect } from '@antfu/ni';
2
+ import { isCapturing } from '../ui/log-sink.js';
2
3
  import { getConfig } from '../utils/config.js';
4
+ import { logger } from '../utils/logger.js';
5
+ import { existsSync } from 'node:fs';
6
+ import { readFile } from 'node:fs/promises';
7
+ import * as path from 'node:path';
3
8
  let cachedPackageManager = null;
4
- export async function detectPackageManager() {
9
+ const SUPPORTED = ['npm', 'yarn', 'pnpm', 'bun'];
10
+ function asPackageManager(value) {
11
+ // `yarn@berry`, `pnpm@6`, `bun@1.3.14` — only the family matters.
12
+ const name = value?.split('@')[0];
13
+ return SUPPORTED.includes(name) ? name : null;
14
+ }
15
+ /**
16
+ * Which manager the *project* uses.
17
+ *
18
+ * Order matters. `npm_config_user_agent` describes how the CLI was invoked
19
+ * (`npx` always says npm), not what the project uses — trusting it first gave a
20
+ * bun project `packageManager: "npm"` in its components.json and a
21
+ * package-lock.json next to its bun.lock. The project answers for itself: the
22
+ * package.json `packageManager` field first, then the lockfiles.
23
+ */
24
+ export async function detectPackageManager(cwd = process.cwd()) {
5
25
  if (cachedPackageManager)
6
26
  return cachedPackageManager;
27
+ const declared = asPackageManager(await readPackageManagerField(cwd));
28
+ if (declared)
29
+ return (cachedPackageManager = declared);
30
+ const fromLockfile = asPackageManager(await detect({ programmatic: true, cwd }));
31
+ if (fromLockfile)
32
+ return (cachedPackageManager = fromLockfile);
7
33
  const userAgent = process.env.npm_config_user_agent || '';
8
34
  if (userAgent.includes('bun'))
9
35
  return (cachedPackageManager = 'bun');
@@ -11,16 +37,45 @@ export async function detectPackageManager() {
11
37
  return (cachedPackageManager = 'pnpm');
12
38
  if (userAgent.includes('yarn'))
13
39
  return (cachedPackageManager = 'yarn');
14
- if (userAgent.includes('npm'))
15
- return (cachedPackageManager = 'npm');
16
- const agent = await detect({ programmatic: true });
17
- if (agent === 'yarn@berry')
18
- return (cachedPackageManager = 'yarn');
19
- if (agent && ['npm', 'yarn', 'pnpm', 'bun'].includes(agent)) {
20
- return (cachedPackageManager = agent);
21
- }
22
40
  return (cachedPackageManager = 'npm');
23
41
  }
42
+ const RUNNER = {
43
+ npm: 'npx',
44
+ yarn: 'yarn dlx',
45
+ pnpm: 'pnpm dlx',
46
+ bun: 'bunx',
47
+ };
48
+ /**
49
+ * How to suggest running the CLI again.
50
+ *
51
+ * A different question: not which manager the project installs dependencies
52
+ * with, but how the CLI was just invoked. Someone who ran `npx zard-cli init`
53
+ * in a bun project does not expect to finish reading `bunx` — and the `npx`
54
+ * they already used works. Only when that cannot be known does the project's
55
+ * manager answer.
56
+ */
57
+ export function suggestedRunner(packageManager) {
58
+ const userAgent = process.env.npm_config_user_agent || '';
59
+ if (userAgent.startsWith('bun'))
60
+ return RUNNER.bun;
61
+ if (userAgent.startsWith('pnpm'))
62
+ return RUNNER.pnpm;
63
+ if (userAgent.startsWith('yarn'))
64
+ return RUNNER.yarn;
65
+ if (userAgent.startsWith('npm'))
66
+ return RUNNER.npm;
67
+ return RUNNER[packageManager];
68
+ }
69
+ /** The package.json `packageManager` field — the Corepack standard, an explicit declaration. */
70
+ async function readPackageManagerField(cwd) {
71
+ try {
72
+ const manifest = JSON.parse(await readFile(path.join(cwd, 'package.json'), 'utf8'));
73
+ return typeof manifest.packageManager === 'string' ? manifest.packageManager : null;
74
+ }
75
+ catch {
76
+ return null;
77
+ }
78
+ }
24
79
  export async function getPackageManager(cwd = process.cwd()) {
25
80
  const config = await getConfig(cwd);
26
81
  return config?.packageManager ?? 'npm';
@@ -38,13 +93,151 @@ export async function getInstallCommand(packageManager, isDev = false) {
38
93
  return isDev ? ['install', '-D'] : ['install'];
39
94
  }
40
95
  }
96
+ /**
97
+ * Work the manager does out of habit that the install itself does not need.
98
+ *
99
+ * The vulnerability audit sends the whole tree to the registry and waits for an
100
+ * answer; in an Angular project, with over a thousand packages, that alone
101
+ * accounts for several seconds of a call that installs half a dozen.
102
+ */
103
+ function speedFlags(packageManager) {
104
+ return packageManager === 'npm' ? ['--no-audit', '--no-fund'] : [];
105
+ }
41
106
  export async function installPackages(packages, cwd, packageManager, isDev = false, legacyPeerDeps = false) {
42
107
  const { execa } = await import('execa');
43
108
  const installCmd = await getInstallCommand(packageManager, isDev);
44
- const args = [...installCmd, ...packages];
109
+ const args = [...installCmd, ...packages, ...speedFlags(packageManager)];
45
110
  if (legacyPeerDeps && packageManager === 'npm') {
46
111
  args.push('--legacy-peer-deps');
47
112
  }
48
- await execa(packageManager, args, { cwd, stdio: 'inherit' });
113
+ if (legacyPeerDeps && packageManager === 'pnpm') {
114
+ args.push('--no-strict-peer-dependencies');
115
+ }
116
+ // With the interactive screen mounted, inheriting stdio would let the package
117
+ // manager write over the frame. In that case the output is captured and only
118
+ // shows up in debug mode; outside it, the behaviour stays "pass the output
119
+ // through live".
120
+ if (isCapturing()) {
121
+ const command = `${packageManager} ${args.join(' ')}`;
122
+ try {
123
+ // stdin ignored, not piped: an open input pipe never sees EOF and the
124
+ // package manager waits on it forever. Closing stdin also guarantees it
125
+ // never opens a prompt, which would be invisible behind the full screen.
126
+ const result = await execa(packageManager, args, {
127
+ cwd,
128
+ stdin: 'ignore',
129
+ stdout: 'pipe',
130
+ stderr: 'pipe',
131
+ });
132
+ logger.debug(`${command}\n${result.stdout}`);
133
+ }
134
+ catch (error) {
135
+ // Without this the failure reaches the user as one generic line: the
136
+ // package manager's real output stays in the sink and is printed with the
137
+ // summary.
138
+ logger.error(`${command} failed:\n${outputOf(error)}`);
139
+ throw error;
140
+ }
141
+ return;
142
+ }
143
+ // stdin ignored here too. The install takes its packages as arguments and has
144
+ // nothing to ask; inheriting a stdin that never closes (a pipe, CI, a
145
+ // background job) leaves the manager waiting for an EOF that never comes —
146
+ // output stays live because stdout and stderr are still inherited.
147
+ await execa(packageManager, args, { cwd, stdin: 'ignore', stdout: 'inherit', stderr: 'inherit' });
148
+ }
149
+ function outputOf(error) {
150
+ const { stderr, stdout, message } = (error ?? {});
151
+ return (stderr?.trim() || stdout?.trim() || message || String(error)).trim();
152
+ }
153
+ /** Only npm and pnpm can relax peer checking; elsewhere, retrying repeats the same failure. */
154
+ function canRelaxPeers(packageManager) {
155
+ return packageManager === 'npm' || packageManager === 'pnpm';
156
+ }
157
+ let peerRelaxationEngaged = false;
158
+ /**
159
+ * Installs the batch and, if the manager rejects the tree over a peer conflict,
160
+ * retries with the check relaxed.
161
+ *
162
+ * The fallback is remembered for the rest of the run: once the first batch
163
+ * needed it, the following ones will need it for the same reason, and an
164
+ * attempt already known to be doomed costs a full tree resolution.
165
+ */
166
+ export async function installPackagesWithRetry(packages, cwd, packageManager, isDev = false) {
167
+ if (packages.length === 0)
168
+ return;
169
+ if (peerRelaxationEngaged) {
170
+ await installPackages(packages, cwd, packageManager, isDev, true);
171
+ return;
172
+ }
173
+ try {
174
+ await installPackages(packages, cwd, packageManager, isDev);
175
+ }
176
+ catch (error) {
177
+ if (!canRelaxPeers(packageManager))
178
+ throw error;
179
+ logger.warn('Installation failed, retrying with relaxed peer dependency resolution...');
180
+ await installPackages(packages, cwd, packageManager, isDev, true);
181
+ peerRelaxationEngaged = true;
182
+ }
183
+ }
184
+ /**
185
+ * Drops from the batch the packages the project already declares and resolves.
186
+ *
187
+ * The manager charges a lot per invocation — it revalidates the whole tree even
188
+ * when there is nothing to do — so the win is not in making the install faster
189
+ * but in not calling it. An `add` in an already-initialized project asks for
190
+ * exactly the dependencies `init` put there.
191
+ *
192
+ * The filter is deliberately conservative: when in doubt the package stays in
193
+ * the batch and the manager decides. Comparing only the major is enough because
194
+ * the versions the CLI asks for are always of the form `^N`.
195
+ */
196
+ export async function filterInstalledPackages(packages, cwd) {
197
+ const declared = await readDeclaredDependencies(cwd);
198
+ if (!declared)
199
+ return packages;
200
+ return packages.filter(spec => {
201
+ const { name, range } = parseSpec(spec);
202
+ const declaredRange = declared[name];
203
+ if (!declaredRange)
204
+ return true;
205
+ if (!isResolvable(name, cwd))
206
+ return true;
207
+ if (range && majorOf(range) !== majorOf(declaredRange))
208
+ return true;
209
+ return false;
210
+ });
211
+ }
212
+ function parseSpec(spec) {
213
+ // The `@` in `@ng-icons/core` opens the scope, not the version — hence the last one.
214
+ const separator = spec.lastIndexOf('@');
215
+ if (separator <= 0)
216
+ return { name: spec, range: null };
217
+ return { name: spec.slice(0, separator), range: spec.slice(separator + 1) };
218
+ }
219
+ function majorOf(range) {
220
+ return /(\d+)/.exec(range)?.[1] ?? null;
221
+ }
222
+ async function readDeclaredDependencies(cwd) {
223
+ try {
224
+ const manifest = JSON.parse(await readFile(path.join(cwd, 'package.json'), 'utf8'));
225
+ return { ...manifest.dependencies, ...manifest.devDependencies };
226
+ }
227
+ catch {
228
+ return null;
229
+ }
230
+ }
231
+ /** node_modules can sit above the project — workspaces hoist everything to the root. */
232
+ function isResolvable(name, cwd) {
233
+ let dir = path.resolve(cwd);
234
+ for (;;) {
235
+ if (existsSync(path.join(dir, 'node_modules', name)))
236
+ return true;
237
+ const parent = path.dirname(dir);
238
+ if (parent === dir)
239
+ return false;
240
+ dir = parent;
241
+ }
49
242
  }
50
243
  //# sourceMappingURL=package-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,23 @@
1
+ import { type IconFamily } from '../core/icons/index.js';
1
2
  import type { Config } from '../utils/config.js';
2
3
  export declare const DEFAULT_REGISTRY_URL: string;
4
+ /**
5
+ * The icons a component draws, as the registry publishes them.
6
+ *
7
+ * `family` is the family the files are written in — anyone installing with a
8
+ * different family in `components.json` learns from this field that they need
9
+ * rewriting. Absent from items published before this property existed.
10
+ */
11
+ export interface RegistryIcons {
12
+ family: string;
13
+ symbols: string[];
14
+ tokens: string[];
15
+ /** The icons that only appear in the demos. Absent from the index, which does not carry them. */
16
+ demos?: {
17
+ symbols: string[];
18
+ tokens: string[];
19
+ };
20
+ }
3
21
  export interface RegistryItem {
4
22
  name: string;
5
23
  type: 'registry:component';
@@ -11,9 +29,43 @@ export interface RegistryItem {
11
29
  dependencies?: string[];
12
30
  devDependencies?: string[];
13
31
  registryDependencies?: string[];
32
+ icons?: RegistryIcons;
33
+ }
34
+ /**
35
+ * A block, as the registry publishes it.
36
+ *
37
+ * Blocks live under `/blocks/` in their own index, and their file entries carry
38
+ * a `path` the components' do not — so they get their own type instead of being
39
+ * bent into `RegistryItem`.
40
+ */
41
+ export interface BlockItem {
42
+ id: string;
43
+ title: string;
44
+ description: string;
45
+ category: string;
46
+ registryDependencies?: string[];
47
+ dependencies?: string[];
48
+ files: Array<{
49
+ name: string;
50
+ path: string;
51
+ content: string;
52
+ language: string;
53
+ }>;
54
+ }
55
+ export interface BlocksIndex {
56
+ blocks: Array<{
57
+ id: string;
58
+ title: string;
59
+ description: string;
60
+ category: string;
61
+ registryDependencies?: string[];
62
+ dependencies?: string[];
63
+ }>;
14
64
  }
15
65
  export interface RegistryIndex {
16
66
  $schema: string;
67
+ /** The file's shape. Absent from registries older than the field. */
68
+ schemaVersion?: number;
17
69
  name: string;
18
70
  homepage: string;
19
71
  version: string;
@@ -24,15 +76,45 @@ export interface RegistryIndex {
24
76
  dependencies?: string[];
25
77
  devDependencies?: string[];
26
78
  registryDependencies?: string[];
79
+ icons?: RegistryIcons;
27
80
  files: string[];
28
81
  }>;
29
82
  }
83
+ /**
84
+ * The family the item's files are written in.
85
+ *
86
+ * An item with no `icons` — published before the property existed — is in
87
+ * lucide, which was the only possibility. So is an unknown value: better the
88
+ * right guess than refusing to install over an unfamiliar field.
89
+ */
90
+ export declare function sourceFamilyOf(item: Pick<RegistryItem, 'icons'>): IconFamily;
30
91
  export declare function getRegistryUrl(config?: Config): string;
31
92
  export declare function validateRegistryUrl(url: string): void;
32
93
  export declare function fetchRegistryIndex(registryUrl?: string): Promise<RegistryIndex>;
33
94
  export declare function invalidateRegistryCache(): void;
34
95
  export declare function fetchComponentFromRegistry(componentName: string, registryUrl?: string): Promise<RegistryItem>;
96
+ /**
97
+ * The block index, cached like the component one.
98
+ *
99
+ * A registry that predates blocks has no `blocks-registry.json`; that is not an
100
+ * error, it just means this registry publishes none.
101
+ */
102
+ export declare function fetchBlocksIndex(registryUrl?: string): Promise<BlocksIndex>;
103
+ export declare function fetchBlockFromRegistry(blockId: string, registryUrl?: string): Promise<BlockItem>;
104
+ export declare function getAvailableBlocks(registryUrl?: string): Promise<string[]>;
35
105
  export declare function getAvailableComponents(registryUrl?: string): Promise<string[]>;
36
- export declare function transformContent(content: string, config: Config): string;
37
- export declare function fetchComponent(componentName: string, config: Config, registryUrl?: string): Promise<RegistryItem>;
106
+ export interface TransformOptions {
107
+ /**
108
+ * The destination came from `--path`, outside the configured alias.
109
+ *
110
+ * In that case the batch's components become neighbours on disk, and the
111
+ * relative path is what resolves — the alias would point at the folder they are
112
+ * not in. `utils` and `core` stay on the alias, because `init` installed them.
113
+ */
114
+ readonly siblingComponents?: boolean;
115
+ }
116
+ export declare function transformContent(content: string, config: Config, options?: TransformOptions): string;
117
+ export declare function fetchComponent(componentName: string, config: Config, registryUrl?: string, options?: TransformOptions & {
118
+ isBlock?: boolean;
119
+ }): Promise<RegistryItem>;
38
120
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAInD,eAAO,MAAM,oBAAoB,QAE0D,CAAC;AAE5F,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;QAChC,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAarD;AAKD,wBAAsB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAYrF;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,wBAAsB,0BAA0B,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAInH;AAED,wBAAsB,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGpF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAyCxE;AAED,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"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"}