@sanity/ui 4.2.0 → 5.0.0-alpha.10

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 (339) hide show
  1. package/README.md +194 -28
  2. package/bin/sanity-ui.js +14 -0
  3. package/dist/_chunks-es/LazyRefractor.js +20 -0
  4. package/dist/_chunks-es/LazyRefractor.js.map +1 -0
  5. package/dist/cli/checks.js +148 -0
  6. package/dist/cli/config.js +23 -0
  7. package/dist/cli/detect.js +181 -0
  8. package/dist/cli/doctor.js +49 -0
  9. package/dist/cli/index.js +69 -0
  10. package/dist/cli/init.js +189 -0
  11. package/dist/cli/install.js +79 -0
  12. package/dist/cli/log.js +66 -0
  13. package/dist/cli/selfPackage.js +11 -0
  14. package/dist/cli/styles.js +185 -0
  15. package/dist/cli/test-utils.js +8 -0
  16. package/dist/cli/tsconfig.js +236 -0
  17. package/dist/cli/types.js +1 -0
  18. package/dist/cli/versions.js +45 -0
  19. package/dist/index.d.ts +1203 -1469
  20. package/dist/index.js +2123 -1989
  21. package/dist/index.js.map +1 -1
  22. package/dist/polyfills.d.ts +1 -0
  23. package/dist/polyfills.js +5 -0
  24. package/dist/polyfills.js.map +1 -0
  25. package/dist/styles.css +1 -547
  26. package/package.json +57 -58
  27. package/src/cli/checks.test.ts +38 -0
  28. package/src/cli/checks.ts +200 -0
  29. package/src/cli/config.ts +44 -0
  30. package/src/cli/detect.test.ts +191 -0
  31. package/src/cli/detect.ts +205 -0
  32. package/src/cli/doctor.test.ts +52 -0
  33. package/src/cli/doctor.ts +65 -0
  34. package/src/cli/index.ts +77 -0
  35. package/src/cli/init.ts +225 -0
  36. package/src/cli/install.test.ts +52 -0
  37. package/src/cli/install.ts +108 -0
  38. package/src/cli/log.ts +79 -0
  39. package/src/cli/selfPackage.ts +14 -0
  40. package/src/cli/styles.test.ts +130 -0
  41. package/src/cli/styles.ts +205 -0
  42. package/src/cli/test-utils.ts +10 -0
  43. package/src/cli/tsconfig.test.ts +174 -0
  44. package/src/cli/tsconfig.ts +282 -0
  45. package/src/cli/types.ts +77 -0
  46. package/src/cli/versions.test.ts +35 -0
  47. package/src/cli/versions.ts +41 -0
  48. package/src/components/badge/Badge.tsx +53 -0
  49. package/src/components/badge/badge.css +6 -0
  50. package/src/components/badge/badge.props.ts +31 -0
  51. package/src/components/box/Box.tsx +30 -0
  52. package/src/components/box/box.css +4 -0
  53. package/src/components/box/box.props.ts +29 -0
  54. package/src/components/button/Button.tsx +78 -0
  55. package/src/components/button/button.css +72 -0
  56. package/src/components/button/button.props.ts +122 -0
  57. package/src/components/card/Card.tsx +31 -0
  58. package/src/components/card/card.css +4 -0
  59. package/src/components/card/card.props.ts +58 -0
  60. package/src/components/checkbox/Checkbox.tsx +64 -0
  61. package/src/components/checkbox/checkbox.css +100 -0
  62. package/src/components/checkbox/checkbox.props.ts +33 -0
  63. package/src/components/code/Code.tsx +38 -0
  64. package/src/components/code/LazyRefractor.tsx +9 -0
  65. package/src/components/code/code.css +40 -0
  66. package/src/components/code/code.props.ts +44 -0
  67. package/src/components/container/Container.tsx +30 -0
  68. package/src/components/container/container.css +4 -0
  69. package/src/components/container/container.props.ts +28 -0
  70. package/src/components/dialog/Dialog.tsx +139 -0
  71. package/src/components/dialog/dialog.css +49 -0
  72. package/src/components/dialog/dialog.props.ts +45 -0
  73. package/src/components/divider/Divider.tsx +23 -0
  74. package/src/components/divider/divider.props.ts +9 -0
  75. package/src/components/eyebrow/Eyebrow.tsx +54 -0
  76. package/src/components/eyebrow/eyebrow.css +11 -0
  77. package/src/components/eyebrow/eyebrow.props.ts +28 -0
  78. package/src/components/flex/Flex.tsx +30 -0
  79. package/src/components/flex/flex.css +4 -0
  80. package/src/components/flex/flex.props.ts +33 -0
  81. package/src/components/grid/Grid.tsx +30 -0
  82. package/src/components/grid/grid.css +4 -0
  83. package/src/components/grid/grid.props.ts +33 -0
  84. package/src/components/h-stack/HStack.tsx +34 -0
  85. package/src/components/h-stack/hStack.props.ts +17 -0
  86. package/src/components/heading/Heading.tsx +54 -0
  87. package/src/components/heading/heading.css +9 -0
  88. package/src/components/heading/heading.props.ts +31 -0
  89. package/src/components/icon/Icon.tsx +24 -0
  90. package/src/components/icon/icon.css +17 -0
  91. package/src/components/icon/icon.props.ts +35 -0
  92. package/src/components/icon-button/IconButton.tsx +32 -0
  93. package/src/components/icon-button/iconButton.props.ts +31 -0
  94. package/src/components/index.css +28 -0
  95. package/src/components/indicator/Indicator.tsx +42 -0
  96. package/src/components/indicator/indicator.css +4 -0
  97. package/src/components/indicator/indicator.props.ts +24 -0
  98. package/src/components/indicator-stack/IndicatorStack.tsx +31 -0
  99. package/src/components/indicator-stack/indicator-stack.css +7 -0
  100. package/src/components/indicator-stack/indicatorStack.props.ts +15 -0
  101. package/src/components/inline/Inline.tsx +38 -0
  102. package/src/components/inline/inline.css +4 -0
  103. package/src/components/inline/inline.props.ts +100 -0
  104. package/src/components/label/Label.tsx +34 -0
  105. package/src/components/label/label.css +3 -0
  106. package/src/components/label/label.props.ts +25 -0
  107. package/src/components/link/Link.tsx +29 -0
  108. package/src/components/link/link.css +12 -0
  109. package/src/components/link/link.props.ts +23 -0
  110. package/src/components/list/List.tsx +167 -0
  111. package/src/components/list/list.css +25 -0
  112. package/src/components/list/list.props.ts +130 -0
  113. package/src/components/popover/Popover.tsx +85 -0
  114. package/src/components/popover/popover.css +21 -0
  115. package/src/components/popover/popover.props.ts +38 -0
  116. package/src/components/press-area/PressArea.tsx +29 -0
  117. package/src/components/press-area/press-area.css +22 -0
  118. package/src/components/press-area/pressArea.props.ts +16 -0
  119. package/src/components/radio/Radio.tsx +48 -0
  120. package/src/components/radio/radio.css +97 -0
  121. package/src/components/radio/radio.props.ts +25 -0
  122. package/src/components/skip-to-content/SkipToContent.tsx +35 -0
  123. package/src/components/skip-to-content/skip-to-content.css +9 -0
  124. package/src/components/skip-to-content/skipToContent.props.ts +25 -0
  125. package/src/components/spinner/Spinner.tsx +28 -0
  126. package/src/components/spinner/spinner.css +10 -0
  127. package/src/components/spinner/spinner.props.ts +19 -0
  128. package/src/components/switch/Switch.tsx +48 -0
  129. package/src/components/switch/switch.css +119 -0
  130. package/src/components/switch/switch.props.ts +25 -0
  131. package/src/components/text/Text.tsx +53 -0
  132. package/src/components/text/text.css +9 -0
  133. package/src/components/text/text.props.ts +28 -0
  134. package/src/components/tooltip/Tooltip.tsx +97 -0
  135. package/src/components/tooltip/tooltip.css +31 -0
  136. package/src/components/tooltip/tooltip.props.ts +36 -0
  137. package/src/components/tooltip-group/TooltipGroup.tsx +64 -0
  138. package/src/components/tooltip-group/tooltipGroup.props.ts +15 -0
  139. package/src/components/v-stack/VStack.tsx +32 -0
  140. package/src/components/v-stack/vStack.props.ts +17 -0
  141. package/src/components/visually-hidden/VisuallyHidden.tsx +29 -0
  142. package/src/components/visually-hidden/visually-hidden.css +9 -0
  143. package/src/components/visually-hidden/visuallyHidden.props.ts +23 -0
  144. package/src/css/classes/dynamic/flex-child.css +5 -0
  145. package/src/css/classes/dynamic/grid-child.css +8 -0
  146. package/src/css/classes/dynamic/grid-parent.css +6 -0
  147. package/src/css/classes/dynamic/height.css +5 -0
  148. package/src/css/classes/dynamic/index.css +7 -0
  149. package/src/css/classes/dynamic/line-clamp.css +5 -0
  150. package/src/css/classes/dynamic/readme.md +3 -0
  151. package/src/css/classes/dynamic/width.css +7 -0
  152. package/src/css/classes/dynamic/z-index.css +3 -0
  153. package/src/css/classes/generic/display.css +10 -0
  154. package/src/css/classes/generic/flex.css +24 -0
  155. package/src/css/classes/generic/grid.css +7 -0
  156. package/src/css/classes/generic/index.css +7 -0
  157. package/src/css/classes/generic/overflow.css +19 -0
  158. package/src/css/classes/generic/placement.css +202 -0
  159. package/src/css/classes/generic/position.css +7 -0
  160. package/src/css/classes/generic/readme.md +3 -0
  161. package/src/css/classes/generic/text-align.css +5 -0
  162. package/src/css/classes/index.css +4 -0
  163. package/src/css/classes/local/animation.css +4 -0
  164. package/src/css/classes/local/border.css +20 -0
  165. package/src/css/classes/local/index.css +6 -0
  166. package/src/css/classes/local/readme.md +3 -0
  167. package/src/css/classes/local/text-overflow.css +5 -0
  168. package/src/css/classes/local/text-trim.css +45 -0
  169. package/src/css/classes/local/tone.css +75 -0
  170. package/src/css/classes/local/top-anchor.css +4 -0
  171. package/src/css/classes/system/color.css +223 -0
  172. package/src/css/classes/system/container.css +8 -0
  173. package/src/css/classes/system/font-family.css +2 -0
  174. package/src/css/classes/system/font-weight.css +4 -0
  175. package/src/css/classes/system/gap.css +37 -0
  176. package/src/css/classes/system/index.css +10 -0
  177. package/src/css/classes/system/inset.css +56 -0
  178. package/src/css/classes/system/margin.css +148 -0
  179. package/src/css/classes/system/padding.css +78 -0
  180. package/src/css/classes/system/radius.css +10 -0
  181. package/src/css/classes/system/readme.md +3 -0
  182. package/src/css/classes/system/shadow.css +6 -0
  183. package/src/css/classes/system/typography.css +31 -0
  184. package/src/css/global/font-face.css +20 -0
  185. package/src/css/global/index.css +2 -0
  186. package/src/css/global/reset.css +76 -0
  187. package/src/css/tokens/index.css +3 -0
  188. package/src/css/tokens/opacity.css +6 -0
  189. package/src/css/tokens/semantic.css +25 -0
  190. package/src/css/tokens/surface.css +27 -0
  191. package/src/hooks/useIsClient.ts +10 -0
  192. package/src/index.css +18 -0
  193. package/src/index.ts +65 -0
  194. package/src/polyfills.ts +15 -0
  195. package/src/props/border.ts +51 -0
  196. package/src/props/flexChild.ts +29 -0
  197. package/src/props/flexParent.ts +47 -0
  198. package/src/props/gap.ts +31 -0
  199. package/src/props/gridChild.ts +50 -0
  200. package/src/props/gridParent.ts +45 -0
  201. package/src/props/height.ts +29 -0
  202. package/src/props/layout.ts +44 -0
  203. package/src/props/margin.ts +59 -0
  204. package/src/props/overflow.ts +30 -0
  205. package/src/props/padding.ts +59 -0
  206. package/src/props/placement.ts +16 -0
  207. package/src/props/position.ts +52 -0
  208. package/src/props/shadow.ts +15 -0
  209. package/src/props/tone.ts +15 -0
  210. package/src/props/typography.ts +62 -0
  211. package/src/props/width.ts +29 -0
  212. package/src/props/zIndex.ts +15 -0
  213. package/src/styles.css.d.ts +1 -0
  214. package/src/styles.css.node.js +2 -0
  215. package/src/styles.css.test.ts +24 -0
  216. package/src/types/Button.ts +8 -0
  217. package/src/types/Code.ts +6 -0
  218. package/src/types/Container.ts +3 -0
  219. package/src/types/Density.ts +3 -0
  220. package/src/types/Display.ts +11 -0
  221. package/src/types/Eyebrow.ts +3 -0
  222. package/src/types/Flex.ts +22 -0
  223. package/src/types/FontWeight.ts +3 -0
  224. package/src/types/Grid.ts +3 -0
  225. package/src/types/Heading.ts +6 -0
  226. package/src/types/Icon.ts +3 -0
  227. package/src/types/Interactive.ts +8 -0
  228. package/src/types/List.ts +2 -0
  229. package/src/types/Overflow.ts +3 -0
  230. package/src/types/Placement.ts +16 -0
  231. package/src/types/Position.ts +3 -0
  232. package/src/types/PropDef.ts +73 -0
  233. package/src/types/Radius.ts +3 -0
  234. package/src/types/Responsive.ts +10 -0
  235. package/src/types/Shadow.ts +3 -0
  236. package/src/types/Space.ts +15 -0
  237. package/src/types/Text.ts +3 -0
  238. package/src/types/TextAlign.ts +3 -0
  239. package/src/types/Tone.ts +3 -0
  240. package/src/utils/getProps.test.ts +156 -0
  241. package/src/utils/getProps.ts +156 -0
  242. package/src/utils/mergeTriggerProps.ts +66 -0
  243. package/src/utils/renderPortal.tsx +14 -0
  244. package/src/utils/suffixClassName.ts +5 -0
  245. package/src/version.ts +3 -0
  246. package/LICENSE +0 -21
  247. package/dist/_system-CTe2lb5l.d.ts +0 -40
  248. package/dist/_system-CTe2lb5l.d.ts.map +0 -1
  249. package/dist/arrow-BmX6qbAS.js +0 -170
  250. package/dist/arrow-BmX6qbAS.js.map +0 -1
  251. package/dist/autocomplete.d.ts +0 -140
  252. package/dist/autocomplete.d.ts.map +0 -1
  253. package/dist/autocomplete.js +0 -470
  254. package/dist/autocomplete.js.map +0 -1
  255. package/dist/breadcrumbs.d.ts +0 -18
  256. package/dist/breadcrumbs.d.ts.map +0 -1
  257. package/dist/breadcrumbs.js +0 -119
  258. package/dist/breadcrumbs.js.map +0 -1
  259. package/dist/button-BNyKSDyA.js +0 -180
  260. package/dist/button-BNyKSDyA.js.map +0 -1
  261. package/dist/button-dnqMFkWg.d.ts +0 -76
  262. package/dist/button-dnqMFkWg.d.ts.map +0 -1
  263. package/dist/card-C0a0wQTc.d.ts +0 -7
  264. package/dist/card-C0a0wQTc.d.ts.map +0 -1
  265. package/dist/code.d.ts +0 -20
  266. package/dist/code.d.ts.map +0 -1
  267. package/dist/code.js +0 -90
  268. package/dist/code.js.map +0 -1
  269. package/dist/codeFontStyle-84SMhFtI.js +0 -11
  270. package/dist/codeFontStyle-84SMhFtI.js.map +0 -1
  271. package/dist/component-DVlwaWB-.d.ts +0 -25
  272. package/dist/component-DVlwaWB-.d.ts.map +0 -1
  273. package/dist/element-BYgCE_iK.js +0 -51
  274. package/dist/element-BYgCE_iK.js.map +0 -1
  275. package/dist/factory-BzXTX8_Q.js +0 -3056
  276. package/dist/factory-BzXTX8_Q.js.map +0 -1
  277. package/dist/flex-DmbDG2ks.js +0 -76
  278. package/dist/flex-DmbDG2ks.js.map +0 -1
  279. package/dist/font-EtfxKPUz.d.ts +0 -49
  280. package/dist/font-EtfxKPUz.d.ts.map +0 -1
  281. package/dist/getElementRef-Jw7gY0eV.js +0 -102
  282. package/dist/getElementRef-Jw7gY0eV.js.map +0 -1
  283. package/dist/getScopedTheme-C-sZsyAz.js +0 -267
  284. package/dist/getScopedTheme-C-sZsyAz.js.map +0 -1
  285. package/dist/getTheme_v2-y09KqtEb.js +0 -487
  286. package/dist/getTheme_v2-y09KqtEb.js.map +0 -1
  287. package/dist/grid-6JSgMj1O.js +0 -115
  288. package/dist/grid-6JSgMj1O.js.map +0 -1
  289. package/dist/helpers-C8xxXAQC.js +0 -63
  290. package/dist/helpers-C8xxXAQC.js.map +0 -1
  291. package/dist/hotkeys-CaHsQlsO.js +0 -168
  292. package/dist/hotkeys-CaHsQlsO.js.map +0 -1
  293. package/dist/index.d.ts.map +0 -1
  294. package/dist/layer-Bl5R3uNR.js +0 -61
  295. package/dist/layer-Bl5R3uNR.js.map +0 -1
  296. package/dist/layer-ChlP9Ik6.d.ts +0 -242
  297. package/dist/layer-ChlP9Ik6.d.ts.map +0 -1
  298. package/dist/menu.d.ts +0 -146
  299. package/dist/menu.d.ts.map +0 -1
  300. package/dist/menu.js +0 -626
  301. package/dist/menu.js.map +0 -1
  302. package/dist/popover-B7-28L8y.js +0 -408
  303. package/dist/popover-B7-28L8y.js.map +0 -1
  304. package/dist/popover-CMlQeKn0.d.ts +0 -96
  305. package/dist/popover-CMlQeKn0.d.ts.map +0 -1
  306. package/dist/popover.d.ts +0 -2
  307. package/dist/popover.js +0 -3
  308. package/dist/refractor-CC48DwHi.js +0 -20
  309. package/dist/refractor-CC48DwHi.js.map +0 -1
  310. package/dist/responsiveFont-CilwaORG.js +0 -55
  311. package/dist/responsiveFont-CilwaORG.js.map +0 -1
  312. package/dist/rgba-BSYaEUW6.d.ts +0 -846
  313. package/dist/rgba-BSYaEUW6.d.ts.map +0 -1
  314. package/dist/selectable-B0GUIL74.d.ts +0 -7
  315. package/dist/selectable-B0GUIL74.d.ts.map +0 -1
  316. package/dist/stack-rsNFPq2-.js +0 -112
  317. package/dist/stack-rsNFPq2-.js.map +0 -1
  318. package/dist/styles-css.d.ts +0 -2
  319. package/dist/styles-css.js +0 -4
  320. package/dist/textInput-pSfQjkmx.js +0 -313
  321. package/dist/textInput-pSfQjkmx.js.map +0 -1
  322. package/dist/theme.d.ts +0 -280
  323. package/dist/theme.d.ts.map +0 -1
  324. package/dist/theme.js +0 -55
  325. package/dist/theme.js.map +0 -1
  326. package/dist/toast.d.ts +0 -73
  327. package/dist/toast.d.ts.map +0 -1
  328. package/dist/toast.js +0 -302
  329. package/dist/toast.js.map +0 -1
  330. package/dist/tooltip.d.ts +0 -88
  331. package/dist/tooltip.d.ts.map +0 -1
  332. package/dist/tooltip.js +0 -435
  333. package/dist/tooltip.js.map +0 -1
  334. package/dist/useClickOutsideEvent-wGLGWBZN.js +0 -36
  335. package/dist/useClickOutsideEvent-wGLGWBZN.js.map +0 -1
  336. package/dist/useElementSize-BJvbGHq8.js +0 -51
  337. package/dist/useElementSize-BJvbGHq8.js.map +0 -1
  338. package/dist/useLayer-D1usxIE0.js +0 -712
  339. package/dist/useLayer-D1usxIE0.js.map +0 -1
@@ -0,0 +1,236 @@
1
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
3
+ import { parse, stringify } from 'comment-json';
4
+ /** moduleResolution values that read a package `exports` map and its types. */
5
+ const MODERN_RESOLUTIONS = new Set(['bundler', 'node16', 'nodenext']);
6
+ /** module values compatible with moduleResolution: bundler. */
7
+ const BUNDLER_MODULES = new Set(['esnext', 'preserve', 'es2015', 'es2020', 'es2022']);
8
+ const VALID_JSX = new Set(['react-jsx', 'react-jsxdev', 'preserve', 'react', 'react-native']);
9
+ /** DOM globals the component types reference, plus a modern JS baseline. */
10
+ const DOM_LIBS = ['DOM', 'DOM.Iterable'];
11
+ const ES_BASELINE = 'ES2022';
12
+ /**
13
+ * The full known-good config written when no tsconfig.json exists. Mirrors the
14
+ * repo's own framework apps so a fresh project type-checks predictably.
15
+ */
16
+ const DEFAULT_TSCONFIG = {
17
+ compilerOptions: {
18
+ target: ES_BASELINE,
19
+ lib: [...DOM_LIBS, ES_BASELINE],
20
+ module: 'esnext',
21
+ moduleResolution: 'bundler',
22
+ jsx: 'react-jsx',
23
+ strict: true,
24
+ esModuleInterop: true,
25
+ skipLibCheck: true,
26
+ resolveJsonModule: true,
27
+ isolatedModules: true,
28
+ moduleDetection: 'force',
29
+ },
30
+ include: ['src', 'app'],
31
+ };
32
+ function readJsonc(file) {
33
+ const data = parse(readFileSync(file, 'utf8'));
34
+ // comment-json happily parses valid-but-non-object JSON (null, true, []). Treat
35
+ // those as unreadable so callers don't crash on later property reads.
36
+ if (typeof data !== 'object' || data === null || Array.isArray(data)) {
37
+ throw new Error('tsconfig.json is not an object');
38
+ }
39
+ return data;
40
+ }
41
+ /**
42
+ * Picks the tsconfig file to edit. Solution-style configs (Vite) keep their
43
+ * real options in a referenced file, so we follow the first reference that
44
+ * actually carries compilerOptions.
45
+ */
46
+ export function resolveTargetTsconfig(cwd) {
47
+ const root = join(cwd, 'tsconfig.json');
48
+ if (!existsSync(root))
49
+ return { file: root, exists: false };
50
+ let data;
51
+ try {
52
+ data = readJsonc(root);
53
+ }
54
+ catch {
55
+ return { file: root, exists: true, unreadable: true };
56
+ }
57
+ const hasOwnOptions = data.compilerOptions && Object.keys(data.compilerOptions).length > 0;
58
+ if (hasOwnOptions || !Array.isArray(data.references)) {
59
+ return { file: root, exists: true };
60
+ }
61
+ const referenced = data.references
62
+ .map((ref) => ref.path)
63
+ .filter((p) => typeof p === 'string')
64
+ .map((p) => join(cwd, p.endsWith('.json') ? p : join(p, 'tsconfig.json')))
65
+ .filter((p) => existsSync(p));
66
+ // Keep only references we can parse and that actually carry compilerOptions, so
67
+ // we never write into a reference that has none or crash on an unreadable one.
68
+ // Prefer an "app" config, the common Vite solution-style layout.
69
+ const withOptions = referenced.filter((p) => {
70
+ try {
71
+ const doc = readJsonc(p);
72
+ return Boolean(doc.compilerOptions && Object.keys(doc.compilerOptions).length > 0);
73
+ }
74
+ catch {
75
+ return false;
76
+ }
77
+ });
78
+ const appConfig = withOptions.find((p) => p.includes('app')) ?? withOptions[0];
79
+ return { file: appConfig ?? root, exists: true };
80
+ }
81
+ /** Merges compilerOptions across the resolvable `extends` chain (relative paths only). */
82
+ function effectiveCompilerOptions(file, seen = new Set()) {
83
+ if (!existsSync(file) || seen.has(file))
84
+ return {};
85
+ seen.add(file);
86
+ let data;
87
+ try {
88
+ data = readJsonc(file);
89
+ }
90
+ catch {
91
+ return {};
92
+ }
93
+ const base = {};
94
+ const extendsField = data.extends;
95
+ const extendsList = Array.isArray(extendsField)
96
+ ? extendsField
97
+ : extendsField
98
+ ? [extendsField]
99
+ : [];
100
+ for (const ext of extendsList) {
101
+ if (typeof ext !== 'string')
102
+ continue;
103
+ if (ext.startsWith('.') || isAbsolute(ext)) {
104
+ const resolved = isAbsolute(ext) ? ext : resolve(dirname(file), ext);
105
+ const withExt = resolved.endsWith('.json') ? resolved : `${resolved}.json`;
106
+ Object.assign(base, effectiveCompilerOptions(withExt, seen));
107
+ }
108
+ }
109
+ return { ...base, ...data.compilerOptions };
110
+ }
111
+ function libIncludes(libs, name) {
112
+ if (!Array.isArray(libs))
113
+ return false;
114
+ return libs.some((entry) => String(entry).toLowerCase() === name.toLowerCase());
115
+ }
116
+ function hasEsBaseline(libs) {
117
+ if (!Array.isArray(libs))
118
+ return false;
119
+ return libs.some((entry) => /^es(\d{4}|next)$/i.test(String(entry)));
120
+ }
121
+ /**
122
+ * Compares effective options against the minimum a project needs to consume
123
+ * this package and returns the changes to make. Pure: callers decide whether to
124
+ * apply them.
125
+ *
126
+ * Only options that actually break consumption are touched, so merging into an
127
+ * existing project never introduces type errors in the user's own code:
128
+ * - jsx: required to compile .tsx
129
+ * - moduleResolution: required to read the package exports map + its types
130
+ * - module: must stay compatible with a bundler resolution
131
+ * - lib: DOM/DOM.Iterable back the component element types
132
+ * - skipLibCheck: only ever removes errors, safe to add
133
+ *
134
+ * `load: true` marks the load-bearing changes that doctor reports as failures.
135
+ */
136
+ export function planTsconfigChanges(effective) {
137
+ const changes = [];
138
+ const opts = effective;
139
+ const jsx = opts['jsx'];
140
+ if (!jsx)
141
+ changes.push({ key: 'jsx', from: undefined, to: 'react-jsx', load: true });
142
+ else if (typeof jsx !== 'string' || !VALID_JSX.has(jsx)) {
143
+ changes.push({ key: 'jsx', from: jsx, to: 'react-jsx', load: true });
144
+ }
145
+ const resolution = opts['moduleResolution'];
146
+ const resolutionLower = typeof resolution === 'string' ? resolution.toLowerCase() : null;
147
+ const resolutionIsModern = Boolean(resolutionLower && MODERN_RESOLUTIONS.has(resolutionLower));
148
+ let willSetBundler = false;
149
+ if (!resolution) {
150
+ changes.push({ key: 'moduleResolution', from: undefined, to: 'bundler', load: true });
151
+ willSetBundler = true;
152
+ }
153
+ else if (!resolutionIsModern) {
154
+ changes.push({ key: 'moduleResolution', from: resolution, to: 'bundler', load: true });
155
+ willSetBundler = true;
156
+ }
157
+ // module only matters when resolution is (or becomes) bundler, which requires
158
+ // esnext/preserve/es2015+. node16/nodenext pair with their own module values,
159
+ // so we leave those alone.
160
+ const resolutionWillBeBundler = willSetBundler || resolutionLower === 'bundler';
161
+ const module = opts['module'];
162
+ const moduleLower = typeof module === 'string' ? module.toLowerCase() : null;
163
+ const moduleCompatible = Boolean(moduleLower && BUNDLER_MODULES.has(moduleLower));
164
+ // Only enforce module when resolution is (or becomes) bundler. node16/nodenext
165
+ // pair with their own module values, so a missing or non-bundler module under
166
+ // those resolutions is left alone rather than forced to esnext (which would be
167
+ // an invalid combination and could change a NodeNext project's semantics).
168
+ if (resolutionWillBeBundler && !moduleCompatible) {
169
+ changes.push({ key: 'module', from: module, to: 'esnext', load: true });
170
+ }
171
+ const lib = opts['lib'];
172
+ if (lib === undefined) {
173
+ changes.push({ key: 'lib', from: undefined, to: [...DOM_LIBS, ES_BASELINE], load: true });
174
+ }
175
+ else {
176
+ const missing = DOM_LIBS.filter((entry) => !libIncludes(lib, entry));
177
+ if (!hasEsBaseline(lib))
178
+ missing.push(ES_BASELINE);
179
+ if (missing.length > 0) {
180
+ changes.push({ key: 'lib', from: lib, to: missing, merge: true, load: true });
181
+ }
182
+ }
183
+ if (opts['skipLibCheck'] === undefined) {
184
+ changes.push({ key: 'skipLibCheck', from: undefined, to: true });
185
+ }
186
+ return changes;
187
+ }
188
+ /** Read-only: what would `init` change about tsconfig? Used by `doctor` too. */
189
+ export function inspectTsconfig(cwd) {
190
+ const target = resolveTargetTsconfig(cwd);
191
+ if (!target.exists) {
192
+ return { file: target.file, exists: false, changes: planTsconfigChanges({}) };
193
+ }
194
+ if (target.unreadable) {
195
+ return { file: target.file, exists: true, unreadable: true, changes: [] };
196
+ }
197
+ const effective = effectiveCompilerOptions(target.file);
198
+ return { file: target.file, exists: true, effective, changes: planTsconfigChanges(effective) };
199
+ }
200
+ /**
201
+ * Applies the required options. Existing comments and unrelated settings are
202
+ * preserved (comment-json round-trips them). Returns what happened.
203
+ */
204
+ export function reconcileTsconfig(cwd, { dryRun = false } = {}) {
205
+ const target = resolveTargetTsconfig(cwd);
206
+ if (!target.exists) {
207
+ if (!dryRun) {
208
+ writeFileSync(target.file, `${JSON.stringify(DEFAULT_TSCONFIG, null, 2)}\n`);
209
+ }
210
+ return { file: target.file, created: true, changes: [], wrote: !dryRun };
211
+ }
212
+ if (target.unreadable) {
213
+ return { file: target.file, created: false, changes: [], wrote: false, unreadable: true };
214
+ }
215
+ const effective = effectiveCompilerOptions(target.file);
216
+ const changes = planTsconfigChanges(effective);
217
+ if (changes.length === 0) {
218
+ return { file: target.file, created: false, changes, wrote: false };
219
+ }
220
+ if (!dryRun) {
221
+ const doc = readJsonc(target.file);
222
+ const options = doc.compilerOptions ?? {};
223
+ doc.compilerOptions = options;
224
+ for (const change of changes) {
225
+ if (change.merge && change.key === 'lib') {
226
+ const current = Array.isArray(options['lib']) ? options['lib'] : [];
227
+ options['lib'] = [...current, ...change.to];
228
+ }
229
+ else {
230
+ options[change.key] = change.to;
231
+ }
232
+ }
233
+ writeFileSync(target.file, `${stringify(doc, null, 2)}\n`);
234
+ }
235
+ return { file: target.file, created: false, changes, wrote: !dryRun };
236
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,45 @@
1
+ export const REACT_MIN = '19.2';
2
+ export const NODE_REQUIREMENT = '>=20.19 <22 || >=22.12';
3
+ /** Parses a loose semver string into [major, minor, patch]; missing parts are 0. */
4
+ export function parseVersion(value) {
5
+ if (typeof value !== 'string')
6
+ return null;
7
+ const match = value.match(/(\d+)(?:\.(\d+))?(?:\.(\d+))?/);
8
+ if (!match)
9
+ return null;
10
+ return [Number(match[1] ?? 0), Number(match[2] ?? 0), Number(match[3] ?? 0)];
11
+ }
12
+ function gte(version, target) {
13
+ const a = parseVersion(version);
14
+ const b = parseVersion(target);
15
+ if (!a || !b)
16
+ return false;
17
+ for (let i = 0; i < 3; i++) {
18
+ const left = a[i] ?? 0;
19
+ const right = b[i] ?? 0;
20
+ if (left > right)
21
+ return true;
22
+ if (left < right)
23
+ return false;
24
+ }
25
+ return true;
26
+ }
27
+ export function meetsReact(version) {
28
+ return gte(version, REACT_MIN);
29
+ }
30
+ /** Implements the package's engines range: >=20.19 <22 || >=22.12 */
31
+ export function meetsNode(version) {
32
+ const v = parseVersion(version);
33
+ if (!v)
34
+ return false;
35
+ const [major, minor] = v;
36
+ if (major === 20 && minor >= 19)
37
+ return true;
38
+ if (major === 21)
39
+ return true;
40
+ if (major === 22 && minor >= 12)
41
+ return true;
42
+ if (major > 22)
43
+ return true;
44
+ return false;
45
+ }