@aussieljk/forkbook 0.0.0-stage → 0.0.1-2

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 (598) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +77 -2
  3. package/assets/addon-vitest/templates/vitest.config.4.template.ts +36 -0
  4. package/assets/browser/favicon-wrapper.svg +46 -0
  5. package/assets/browser/favicon.svg +1 -0
  6. package/assets/browser/nunito-sans-bold-italic.woff2 +0 -0
  7. package/assets/browser/nunito-sans-bold.woff2 +0 -0
  8. package/assets/browser/nunito-sans-italic.woff2 +0 -0
  9. package/assets/browser/nunito-sans-regular.woff2 +0 -0
  10. package/assets/builder-vite/iframe.html +99 -0
  11. package/assets/create/rendererAssets/.eslintrc.json +16 -0
  12. package/assets/create/rendererAssets/common/Configure.mdx +388 -0
  13. package/assets/create/rendererAssets/common/assets/accessibility.png +0 -0
  14. package/assets/create/rendererAssets/common/assets/accessibility.svg +1 -0
  15. package/assets/create/rendererAssets/common/assets/addon-library.png +0 -0
  16. package/assets/create/rendererAssets/common/assets/assets.png +0 -0
  17. package/assets/create/rendererAssets/common/assets/avif-test-image.avif +0 -0
  18. package/assets/create/rendererAssets/common/assets/context.png +0 -0
  19. package/assets/create/rendererAssets/common/assets/discord.svg +1 -0
  20. package/assets/create/rendererAssets/common/assets/docs.png +0 -0
  21. package/assets/create/rendererAssets/common/assets/figma-plugin.png +0 -0
  22. package/assets/create/rendererAssets/common/assets/github.svg +1 -0
  23. package/assets/create/rendererAssets/common/assets/share.png +0 -0
  24. package/assets/create/rendererAssets/common/assets/styling.png +0 -0
  25. package/assets/create/rendererAssets/common/assets/testing.png +0 -0
  26. package/assets/create/rendererAssets/common/assets/theming.png +0 -0
  27. package/assets/create/rendererAssets/common/assets/tutorials.svg +1 -0
  28. package/assets/create/rendererAssets/common/assets/youtube.svg +1 -0
  29. package/assets/create/rendererAssets/common/button.css +30 -0
  30. package/assets/create/rendererAssets/common/header.css +32 -0
  31. package/assets/create/rendererAssets/common/page.css +68 -0
  32. package/assets/create/templates/react-native/index.expo.js +20 -0
  33. package/assets/create/templates/react-native/index.js +25 -0
  34. package/assets/docs/addon-backgrounds.gif +0 -0
  35. package/assets/docs/addon-controls-args-annotated.png +0 -0
  36. package/assets/docs/addon-controls-args-background-color.png +0 -0
  37. package/assets/docs/addon-controls-args-background-string.png +0 -0
  38. package/assets/docs/addon-controls-args-docs.png +0 -0
  39. package/assets/docs/addon-controls-args-logging.png +0 -0
  40. package/assets/docs/addon-controls-args-no-annotation.png +0 -0
  41. package/assets/docs/addon-controls-args-reflow-slider.png +0 -0
  42. package/assets/docs/addon-controls-args-reflow.png +0 -0
  43. package/assets/docs/addon-controls-args-template.png +0 -0
  44. package/assets/docs/addon-controls-expanded.png +0 -0
  45. package/assets/docs/addon-controls-hero.gif +0 -0
  46. package/assets/docs/addon-controls-install.png +0 -0
  47. package/assets/docs/hero.gif +0 -0
  48. package/assets/docs/highlight.png +0 -0
  49. package/assets/docs/message-reference.png +0 -0
  50. package/assets/docs/viewport.png +0 -0
  51. package/assets/react-native/metro-env.d.ts +69 -0
  52. package/assets/server/addon.tsconfig.json +6 -0
  53. package/assets/server/base-preview-body.html +116 -0
  54. package/assets/server/base-preview-head.html +494 -0
  55. package/assets/server/openBrowser.applescript +94 -0
  56. package/assets/server/template.ejs +87 -0
  57. package/dist/.build-stamp +0 -0
  58. package/dist/_browser-chunks/Color-PCLE2J36.js +1025 -0
  59. package/dist/_browser-chunks/DocsRenderer-JXND3PVQ.js +10 -0
  60. package/dist/_browser-chunks/WithTooltip-XSQFTBMB.js +1619 -0
  61. package/dist/_browser-chunks/chunk-2JDQ35OA.js +247 -0
  62. package/dist/_browser-chunks/chunk-2JT76G3E.js +104 -0
  63. package/dist/_browser-chunks/chunk-2MEPHP35.js +17 -0
  64. package/dist/_browser-chunks/chunk-2SCZVUKW.js +24 -0
  65. package/dist/_browser-chunks/chunk-46Z7NGAS.js +41 -0
  66. package/dist/_browser-chunks/chunk-4ATQOMJB.js +30 -0
  67. package/dist/_browser-chunks/chunk-52CW7FF7.js +49 -0
  68. package/dist/_browser-chunks/chunk-5I7E4GMO.js +62 -0
  69. package/dist/_browser-chunks/chunk-5P4QA6MY.js +20 -0
  70. package/dist/_browser-chunks/chunk-5WMXI5GW.js +816 -0
  71. package/dist/_browser-chunks/chunk-66OCZ54D.js +2604 -0
  72. package/dist/_browser-chunks/chunk-6SXYJQST.js +253 -0
  73. package/dist/_browser-chunks/chunk-AYRF6EJB.js +36 -0
  74. package/dist/_browser-chunks/chunk-B4AUNNU4.js +156 -0
  75. package/dist/_browser-chunks/chunk-BCP2FFXF.js +369 -0
  76. package/dist/_browser-chunks/chunk-C3D4HEFY.js +3396 -0
  77. package/dist/_browser-chunks/chunk-CFAOWGL7.js +43 -0
  78. package/dist/_browser-chunks/chunk-CFWWCCZV.js +223 -0
  79. package/dist/_browser-chunks/chunk-CNED6RYH.js +18 -0
  80. package/dist/_browser-chunks/chunk-DRQKCCAG.js +136 -0
  81. package/dist/_browser-chunks/chunk-ECQ75MKQ.js +0 -0
  82. package/dist/_browser-chunks/chunk-EIYAKDGP.js +302 -0
  83. package/dist/_browser-chunks/chunk-ENKK74N4.js +12 -0
  84. package/dist/_browser-chunks/chunk-FENFYI4X.js +698 -0
  85. package/dist/_browser-chunks/chunk-FJGWSWL5.js +155 -0
  86. package/dist/_browser-chunks/chunk-FVSEPWWX.js +2810 -0
  87. package/dist/_browser-chunks/chunk-GNZY6LOW.js +10116 -0
  88. package/dist/_browser-chunks/chunk-IE4ULIOQ.js +14 -0
  89. package/dist/_browser-chunks/chunk-IMSF75WX.js +42 -0
  90. package/dist/_browser-chunks/chunk-IWQGIXJS.js +14 -0
  91. package/dist/_browser-chunks/chunk-JMC7AIKT.js +108 -0
  92. package/dist/_browser-chunks/chunk-JPUOQJUI.js +8 -0
  93. package/dist/_browser-chunks/chunk-JSBKXXXF.js +218 -0
  94. package/dist/_browser-chunks/chunk-JWSKPMPC.js +73 -0
  95. package/dist/_browser-chunks/chunk-JYVGARBG.js +2943 -0
  96. package/dist/_browser-chunks/chunk-KBK7GKBN.js +35 -0
  97. package/dist/_browser-chunks/chunk-KQ7CRO2B.js +108 -0
  98. package/dist/_browser-chunks/chunk-LAWXTSXK.js +18 -0
  99. package/dist/_browser-chunks/chunk-LE2LTDW3.js +14 -0
  100. package/dist/_browser-chunks/chunk-LEVSOOLQ.js +48 -0
  101. package/dist/_browser-chunks/chunk-LV5PIKV4.js +93 -0
  102. package/dist/_browser-chunks/chunk-MDOL7KML.js +56 -0
  103. package/dist/_browser-chunks/chunk-MFMDGWP6.js +34 -0
  104. package/dist/_browser-chunks/chunk-MLBOOZL4.js +67 -0
  105. package/dist/_browser-chunks/chunk-NQUD4B7H.js +91 -0
  106. package/dist/_browser-chunks/chunk-NULBREPZ.js +43 -0
  107. package/dist/_browser-chunks/chunk-NZMVUW5T.js +7 -0
  108. package/dist/_browser-chunks/chunk-OD6IBQCC.js +117 -0
  109. package/dist/_browser-chunks/chunk-ODVJ3XZJ.js +157 -0
  110. package/dist/_browser-chunks/chunk-OQWFVDIN.js +386 -0
  111. package/dist/_browser-chunks/chunk-OVH3USFB.js +20 -0
  112. package/dist/_browser-chunks/chunk-OZZPSYQR.js +14 -0
  113. package/dist/_browser-chunks/chunk-P6PK47TQ.js +1970 -0
  114. package/dist/_browser-chunks/chunk-PFRNG3UC.js +22 -0
  115. package/dist/_browser-chunks/chunk-PJSMZ27A.js +13 -0
  116. package/dist/_browser-chunks/chunk-QC4HFS6K.js +41 -0
  117. package/dist/_browser-chunks/chunk-QDXFODK4.js +274 -0
  118. package/dist/_browser-chunks/chunk-RBCHTR7C.js +28 -0
  119. package/dist/_browser-chunks/chunk-RMYQ3QN3.js +294 -0
  120. package/dist/_browser-chunks/chunk-RNTIV5CE.js +411 -0
  121. package/dist/_browser-chunks/chunk-RSPAQWVJ.js +80 -0
  122. package/dist/_browser-chunks/chunk-S6TK43XQ.js +836 -0
  123. package/dist/_browser-chunks/chunk-SC67XZST.js +18 -0
  124. package/dist/_browser-chunks/chunk-SFVA4SBT.js +683 -0
  125. package/dist/_browser-chunks/chunk-SZYFOQMT.js +25 -0
  126. package/dist/_browser-chunks/chunk-TBJCJXK4.js +18 -0
  127. package/dist/_browser-chunks/chunk-UMDO3KB7.js +205 -0
  128. package/dist/_browser-chunks/chunk-V2G23FV7.js +11 -0
  129. package/dist/_browser-chunks/chunk-V5M7Q4HT.js +88 -0
  130. package/dist/_browser-chunks/chunk-W5M6NPS3.js +198 -0
  131. package/dist/_browser-chunks/chunk-W7NE2JXW.js +84 -0
  132. package/dist/_browser-chunks/chunk-WGVAAM43.js +1110 -0
  133. package/dist/_browser-chunks/chunk-WHQRNHXD.js +8 -0
  134. package/dist/_browser-chunks/chunk-WOSOWBCA.js +12 -0
  135. package/dist/_browser-chunks/chunk-WZ7KR7SH.js +85 -0
  136. package/dist/_browser-chunks/chunk-YEKO6BHJ.js +20 -0
  137. package/dist/_browser-chunks/chunk-YI2IBIQS.js +7 -0
  138. package/dist/_browser-chunks/chunk-YTIT5NA5.js +1966 -0
  139. package/dist/_browser-chunks/chunk-ZEHRUHTA.js +6 -0
  140. package/dist/_browser-chunks/chunk-ZTQ5MEJ5.js +203 -0
  141. package/dist/_browser-chunks/matchers-YLBYSYAF.js +1263 -0
  142. package/dist/_browser-chunks/react-dom-client-4OHE3QDV.js +9 -0
  143. package/dist/_node-chunks/attached-runtime-I2G4WLJI.js +282 -0
  144. package/dist/_node-chunks/builder-manager-VVHYQXCH.js +1661 -0
  145. package/dist/_node-chunks/chunk-2BUPBPFB.js +82 -0
  146. package/dist/_node-chunks/chunk-2DSIDINN.js +884 -0
  147. package/dist/_node-chunks/chunk-2RU7BKEW.js +23 -0
  148. package/dist/_node-chunks/chunk-34EO2PUT.js +26 -0
  149. package/dist/_node-chunks/chunk-3BKIBF5S.js +3008 -0
  150. package/dist/_node-chunks/chunk-3SDUYDXH.js +98 -0
  151. package/dist/_node-chunks/chunk-3T4ZSNPH.js +662 -0
  152. package/dist/_node-chunks/chunk-3W7F2B7P.js +79 -0
  153. package/dist/_node-chunks/chunk-3Y6AAY5H.js +80 -0
  154. package/dist/_node-chunks/chunk-42UWAGPW.js +1193 -0
  155. package/dist/_node-chunks/chunk-4FEANXWU.js +1986 -0
  156. package/dist/_node-chunks/chunk-5DQFEZEA.js +40 -0
  157. package/dist/_node-chunks/chunk-6KEHV53S.js +1218 -0
  158. package/dist/_node-chunks/chunk-6LMWA44H.js +3837 -0
  159. package/dist/_node-chunks/chunk-6YKBRP72.js +20 -0
  160. package/dist/_node-chunks/chunk-7GUDZVRQ.js +110 -0
  161. package/dist/_node-chunks/chunk-B5J7Q7J4.js +21 -0
  162. package/dist/_node-chunks/chunk-BS2WMZMR.js +90 -0
  163. package/dist/_node-chunks/chunk-BSKFCWQD.js +47 -0
  164. package/dist/_node-chunks/chunk-BXVYT7SB.js +36 -0
  165. package/dist/_node-chunks/chunk-CCOTJ4FC.js +688 -0
  166. package/dist/_node-chunks/chunk-CQKMLL5J.js +33 -0
  167. package/dist/_node-chunks/chunk-CXRU72ET.js +63 -0
  168. package/dist/_node-chunks/chunk-DC7DKR5K.js +20 -0
  169. package/dist/_node-chunks/chunk-DHJFTB4K.js +25 -0
  170. package/dist/_node-chunks/chunk-DUR55DJJ.js +1094 -0
  171. package/dist/_node-chunks/chunk-E6YESGLX.js +7032 -0
  172. package/dist/_node-chunks/chunk-EHUNOMDD.js +52345 -0
  173. package/dist/_node-chunks/chunk-ET7PWEO7.js +298 -0
  174. package/dist/_node-chunks/chunk-EWOX7HPJ.js +20 -0
  175. package/dist/_node-chunks/chunk-F3ZFKBHY.js +844 -0
  176. package/dist/_node-chunks/chunk-FK7KGTV7.js +26 -0
  177. package/dist/_node-chunks/chunk-FPZB5OI7.js +35 -0
  178. package/dist/_node-chunks/chunk-FW2HQUBQ.js +25 -0
  179. package/dist/_node-chunks/chunk-FY6UXW6G.js +11 -0
  180. package/dist/_node-chunks/chunk-GEFQN7K3.js +499 -0
  181. package/dist/_node-chunks/chunk-GRBLDJCR.js +989 -0
  182. package/dist/_node-chunks/chunk-H32DYT6P.js +87 -0
  183. package/dist/_node-chunks/chunk-H4PPVMP5.js +23 -0
  184. package/dist/_node-chunks/chunk-HMP2G23X.js +25 -0
  185. package/dist/_node-chunks/chunk-ICPBH3E7.js +59 -0
  186. package/dist/_node-chunks/chunk-IDEL2J23.js +23 -0
  187. package/dist/_node-chunks/chunk-IK4FGZLR.js +223 -0
  188. package/dist/_node-chunks/chunk-JDXXX6LB.js +68 -0
  189. package/dist/_node-chunks/chunk-JGGFYIG5.js +5468 -0
  190. package/dist/_node-chunks/chunk-JPAZLYJ3.js +29 -0
  191. package/dist/_node-chunks/chunk-JZOO7GGC.js +48 -0
  192. package/dist/_node-chunks/chunk-KISMCCP5.js +4744 -0
  193. package/dist/_node-chunks/chunk-LCK4ZQKG.js +115 -0
  194. package/dist/_node-chunks/chunk-LO56I6E2.js +132 -0
  195. package/dist/_node-chunks/chunk-LXBD4UL4.js +104 -0
  196. package/dist/_node-chunks/chunk-MA24JW6C.js +7162 -0
  197. package/dist/_node-chunks/chunk-MK2KYAI6.js +5414 -0
  198. package/dist/_node-chunks/chunk-NDWKJ4CL.js +2102 -0
  199. package/dist/_node-chunks/chunk-NIBT7XDZ.js +168 -0
  200. package/dist/_node-chunks/chunk-NPO45IMH.js +33 -0
  201. package/dist/_node-chunks/chunk-OISX4AGQ.js +414 -0
  202. package/dist/_node-chunks/chunk-OUW6R7C3.js +26 -0
  203. package/dist/_node-chunks/chunk-OWNFOGTA.js +194 -0
  204. package/dist/_node-chunks/chunk-Q7QNUM5H.js +49 -0
  205. package/dist/_node-chunks/chunk-QEQLR22M.js +1877 -0
  206. package/dist/_node-chunks/chunk-RRN2V55B.js +45 -0
  207. package/dist/_node-chunks/chunk-RWFIFGO5.js +144 -0
  208. package/dist/_node-chunks/chunk-RXNJDRGO.js +209 -0
  209. package/dist/_node-chunks/chunk-RZMQ7S3L.js +92 -0
  210. package/dist/_node-chunks/chunk-SIEXZVCR.js +51 -0
  211. package/dist/_node-chunks/chunk-SLWQNBGO.js +2034 -0
  212. package/dist/_node-chunks/chunk-SVTBJ7Q3.js +35 -0
  213. package/dist/_node-chunks/chunk-SWO5CDYU.js +32 -0
  214. package/dist/_node-chunks/chunk-TD5PLLQG.js +121 -0
  215. package/dist/_node-chunks/chunk-TEQGGSP7.js +33 -0
  216. package/dist/_node-chunks/chunk-TFCEV2XX.js +155 -0
  217. package/dist/_node-chunks/chunk-TFEWM4E3.js +1073 -0
  218. package/dist/_node-chunks/chunk-TINO74G5.js +21 -0
  219. package/dist/_node-chunks/chunk-TNJIXE37.js +40 -0
  220. package/dist/_node-chunks/chunk-TWI4GVH7.js +19 -0
  221. package/dist/_node-chunks/chunk-U5W53R2J.js +1011 -0
  222. package/dist/_node-chunks/chunk-UBOGWBEA.js +148 -0
  223. package/dist/_node-chunks/chunk-UMUBKI6E.js +3787 -0
  224. package/dist/_node-chunks/chunk-UVINFLGY.js +56 -0
  225. package/dist/_node-chunks/chunk-V2DY426G.js +1133 -0
  226. package/dist/_node-chunks/chunk-VLOXOXXE.js +45 -0
  227. package/dist/_node-chunks/chunk-W4OMYLSP.js +1297 -0
  228. package/dist/_node-chunks/chunk-WAXVSN3O.js +18 -0
  229. package/dist/_node-chunks/chunk-WCULS5TP.js +3767 -0
  230. package/dist/_node-chunks/chunk-WNZ2UMFM.js +153 -0
  231. package/dist/_node-chunks/chunk-WZJF2OUH.js +74 -0
  232. package/dist/_node-chunks/chunk-XGIUVY52.js +611 -0
  233. package/dist/_node-chunks/chunk-XHL2LVBM.js +415 -0
  234. package/dist/_node-chunks/chunk-XI6B6P47.js +59 -0
  235. package/dist/_node-chunks/chunk-XLP2ZKXV.js +60 -0
  236. package/dist/_node-chunks/chunk-YCMRA6RX.js +95 -0
  237. package/dist/_node-chunks/chunk-YZFWBA5L.js +2700 -0
  238. package/dist/_node-chunks/chunk-ZMAMXQKP.js +4731 -0
  239. package/dist/_node-chunks/chunk-ZWBCQ4MJ.js +110 -0
  240. package/dist/_node-chunks/dist-VTSTZKUB.js +16 -0
  241. package/dist/_node-chunks/globby-OEMHPBFY.js +2884 -0
  242. package/dist/_node-chunks/jiti-NFX6UU74.js +3848 -0
  243. package/dist/_node-chunks/lib-MDVARD7W.js +366 -0
  244. package/dist/_node-chunks/local-runtime-NTKIN2QT.js +78 -0
  245. package/dist/_node-chunks/mdx-plugin-MWISDWDQ.js +5680 -0
  246. package/dist/_node-chunks/monorepo-LIRFMQXE.js +121 -0
  247. package/dist/_node-chunks/monorepo-optimized-tests-relaxed-limits-no-story-deletion-CPDW4XTW.js +121 -0
  248. package/dist/_node-chunks/optimized-tests-HDOLR3EY.js +22 -0
  249. package/dist/_node-chunks/pattern-copy-play-EKHIUAU2.js +807 -0
  250. package/dist/_node-chunks/postinstallAddon-GYGMWDL6.js +20 -0
  251. package/dist/_node-chunks/rehype-external-links-BUN3HUCO.js +121 -0
  252. package/dist/_node-chunks/rehype-slug-PLADX223.js +52 -0
  253. package/dist/_node-chunks/relaxed-limits-GBHW6KIQ.js +117 -0
  254. package/dist/_node-chunks/run-KDTIZNSY.js +103 -0
  255. package/dist/_node-chunks/run-NL66VTNR.js +4532 -0
  256. package/dist/_node-chunks/session-id-KIIVOQLR.js +23 -0
  257. package/dist/_node-chunks/setup-MGC7BQO6.js +278 -0
  258. package/dist/_node-chunks/vitest.config.4.template-JH2THZFG.js +54 -0
  259. package/dist/actions/decorator.d.ts +7 -0
  260. package/dist/actions/decorator.js +43 -0
  261. package/dist/actions/index.d.ts +67 -0
  262. package/dist/actions/index.js +28 -0
  263. package/dist/addon-a11y/index.d.ts +52 -0
  264. package/dist/addon-a11y/index.js +16 -0
  265. package/dist/addon-a11y/manager.js +1429 -0
  266. package/dist/addon-a11y/preset.js +18 -0
  267. package/dist/addon-a11y/preview.d.ts +17 -0
  268. package/dist/addon-a11y/preview.js +15 -0
  269. package/dist/addon-docs/blocks.d.ts +1061 -0
  270. package/dist/addon-docs/blocks.js +2461 -0
  271. package/dist/addon-docs/index.d.ts +236 -0
  272. package/dist/addon-docs/index.js +16 -0
  273. package/dist/addon-docs/manager.js +90 -0
  274. package/dist/addon-docs/mdx-react-shim.d.ts +1 -0
  275. package/dist/addon-docs/mdx-react-shim.js +2 -0
  276. package/dist/addon-docs/preset.js +378 -0
  277. package/dist/addon-docs/preview.d.ts +4 -0
  278. package/dist/addon-docs/preview.js +7 -0
  279. package/dist/addon-links/index.d.ts +22 -0
  280. package/dist/addon-links/index.js +20 -0
  281. package/dist/addon-links/manager.js +14 -0
  282. package/dist/addon-links/preview.d.ts +6 -0
  283. package/dist/addon-links/preview.js +9 -0
  284. package/dist/addon-links/react/index.d.ts +25 -0
  285. package/dist/addon-links/react/index.js +52 -0
  286. package/dist/addon-mcp/preset.js +1345 -0
  287. package/dist/addon-mcp/preview.js +29 -0
  288. package/dist/addon-mcp/tools/preview-stories/preview-stories-app-script.js +1153 -0
  289. package/dist/addon-ondevice-actions/index.d.ts +4 -0
  290. package/dist/addon-ondevice-actions/index.js +7 -0
  291. package/dist/addon-ondevice-actions/register.js +7 -0
  292. package/dist/addon-ondevice-controls/index.d.ts +6 -0
  293. package/dist/addon-ondevice-controls/index.js +14 -0
  294. package/dist/addon-ondevice-controls/register.js +10 -0
  295. package/dist/addon-pseudo-states/index.d.ts +35 -0
  296. package/dist/addon-pseudo-states/index.js +15 -0
  297. package/dist/addon-pseudo-states/manager.js +53 -0
  298. package/dist/addon-pseudo-states/preview.d.ts +9 -0
  299. package/dist/addon-pseudo-states/preview.js +10 -0
  300. package/dist/addon-themes/index.d.ts +80 -0
  301. package/dist/addon-themes/index.js +104 -0
  302. package/dist/addon-themes/manager.js +97 -0
  303. package/dist/addon-themes/postinstall.js +33 -0
  304. package/dist/addon-themes/preview.d.ts +6 -0
  305. package/dist/addon-themes/preview.js +8 -0
  306. package/dist/addon-vitest/constants.d.ts +132 -0
  307. package/dist/addon-vitest/constants.js +66 -0
  308. package/dist/addon-vitest/index.d.ts +4 -0
  309. package/dist/addon-vitest/index.js +8 -0
  310. package/dist/addon-vitest/manager.js +665 -0
  311. package/dist/addon-vitest/node/coverage-reporter.js +1284 -0
  312. package/dist/addon-vitest/node/vitest.js +674 -0
  313. package/dist/addon-vitest/postinstall.js +24 -0
  314. package/dist/addon-vitest/preset.js +943 -0
  315. package/dist/addon-vitest/vitest-plugin/global-setup.js +162 -0
  316. package/dist/addon-vitest/vitest-plugin/index.d.ts +56 -0
  317. package/dist/addon-vitest/vitest-plugin/index.js +463 -0
  318. package/dist/addon-vitest/vitest-plugin/setup-file-with-project-annotations.js +9 -0
  319. package/dist/addon-vitest/vitest-plugin/setup-file.browser.4.js +20 -0
  320. package/dist/addon-vitest/vitest-plugin/setup-file.js +50 -0
  321. package/dist/addon-vitest/vitest-plugin/test-utils.js +128 -0
  322. package/dist/babel/index.d.ts +2301 -0
  323. package/dist/babel/index.js +61 -0
  324. package/dist/backgrounds/index.d.ts +6 -0
  325. package/dist/backgrounds/index.js +15 -0
  326. package/dist/bin/core.js +1705 -0
  327. package/dist/bin/dispatcher.js +43 -0
  328. package/dist/bin/loader.js +115 -0
  329. package/dist/builder-vite/index.d.ts +50 -0
  330. package/dist/builder-vite/index.js +245 -0
  331. package/dist/builder-vite/preset.js +27 -0
  332. package/dist/channels/index.d.ts +2 -0
  333. package/dist/channels/index.js +352 -0
  334. package/dist/chunk-B2t1tGRh.d.ts +284 -0
  335. package/dist/chunk-BCoJQE-f.d.ts +602 -0
  336. package/dist/chunk-BGkgZp-H.d.ts +214 -0
  337. package/dist/chunk-BTVrWliM.d.ts +115 -0
  338. package/dist/chunk-BXLImeLy.d.ts +197 -0
  339. package/dist/chunk-BfBzpgct.d.ts +916 -0
  340. package/dist/chunk-Bpi2tz-6.d.ts +511 -0
  341. package/dist/chunk-BxWufQms.d.ts +142 -0
  342. package/dist/chunk-C-bavsOH.d.ts +34 -0
  343. package/dist/chunk-C2p5r3Vt.d.ts +13001 -0
  344. package/dist/chunk-C6PAgHLT.d.ts +12 -0
  345. package/dist/chunk-CMeX4WRe.d.ts +179 -0
  346. package/dist/chunk-Ct9xd6IM.d.ts +65 -0
  347. package/dist/chunk-CwQKNaYL.d.ts +15 -0
  348. package/dist/chunk-D7DwV41f.d.ts +3622 -0
  349. package/dist/chunk-DEVFdzxR.d.ts +253 -0
  350. package/dist/chunk-DaVb55-_.d.ts +124 -0
  351. package/dist/chunk-DgRNfmj_.d.ts +40 -0
  352. package/dist/chunk-DoIGKY33.d.ts +666 -0
  353. package/dist/chunk-Dr3R0DXk.d.ts +40 -0
  354. package/dist/chunk-DtHByo32.d.ts +55 -0
  355. package/dist/chunk-Dw1z1Pki.d.ts +933 -0
  356. package/dist/chunk-DzuY9DXg.d.ts +79 -0
  357. package/dist/chunk-FjDVzZTj.d.ts +62 -0
  358. package/dist/chunk-Kt1tW-D1.d.ts +59 -0
  359. package/dist/chunk-XP8oHzpE.d.ts +6 -0
  360. package/dist/chunk-gCX81nOr.d.ts +61 -0
  361. package/dist/chunk-pcFXCimE.d.ts +741 -0
  362. package/dist/cli/index.d.ts +1174 -0
  363. package/dist/cli/index.js +5613 -0
  364. package/dist/cli/skills/content/index.d.ts +72 -0
  365. package/dist/cli/skills/content/index.js +335 -0
  366. package/dist/cli/tools/sdk/child-host.d.ts +61 -0
  367. package/dist/cli/tools/sdk/child-host.js +131 -0
  368. package/dist/cli/tools/sdk/index.d.ts +137 -0
  369. package/dist/cli/tools/sdk/index.js +44 -0
  370. package/dist/cli-commands/bin/index.js +25 -0
  371. package/dist/client-logger/index.d.ts +31 -0
  372. package/dist/client-logger/index.js +63 -0
  373. package/dist/common/index.d.ts +1103 -0
  374. package/dist/common/index.js +364 -0
  375. package/dist/components/index.d.ts +1924 -0
  376. package/dist/components/index.js +13759 -0
  377. package/dist/core-events/index.d.ts +155 -0
  378. package/dist/core-events/index.js +136 -0
  379. package/dist/core-server/index.d.ts +2200 -0
  380. package/dist/core-server/index.js +4165 -0
  381. package/dist/core-server/presets/common-manager.css +170 -0
  382. package/dist/core-server/presets/common-manager.js +4168 -0
  383. package/dist/core-server/presets/common-override-preset.js +81 -0
  384. package/dist/core-server/presets/common-preset.js +2187 -0
  385. package/dist/create/bin/index.js +23 -0
  386. package/dist/create/index.js +25 -0
  387. package/dist/csf/csf-utils.d.ts +2 -0
  388. package/dist/csf/csf-utils.js +19 -0
  389. package/dist/csf/index.d.ts +7 -0
  390. package/dist/csf/index.js +2142 -0
  391. package/dist/csf-tools/index.d.ts +1157 -0
  392. package/dist/csf-tools/index.js +736 -0
  393. package/dist/docs-tools/index.d.ts +197 -0
  394. package/dist/docs-tools/index.js +61 -0
  395. package/dist/highlight/index.d.ts +10 -0
  396. package/dist/highlight/index.js +15 -0
  397. package/dist/instrumenter/index.d.ts +113 -0
  398. package/dist/instrumenter/index.js +2595 -0
  399. package/dist/manager/_manager-chunks/globals-runtime-8HkdnU2F.js +6144 -0
  400. package/dist/manager/_manager-chunks/globals-runtime-BIKBO23x.js +3389 -0
  401. package/dist/manager/_manager-chunks/globals-runtime-BdGkqNEt.js +45 -0
  402. package/dist/manager/_manager-chunks/globals-runtime-BmphMP6z.js +1190 -0
  403. package/dist/manager/_manager-chunks/globals-runtime-BvM-NY2g.js +13307 -0
  404. package/dist/manager/_manager-chunks/globals-runtime-C02fvgcd.js +9243 -0
  405. package/dist/manager/_manager-chunks/globals-runtime-DkAPXCvc.js +9766 -0
  406. package/dist/manager/_manager-chunks/globals-runtime-DpNYC-qi.js +5564 -0
  407. package/dist/manager/_manager-chunks/globals-runtime-DtcOnYHR.js +5357 -0
  408. package/dist/manager/_manager-chunks/globals-runtime-DwFqpqya.js +722 -0
  409. package/dist/manager/_manager-chunks/globals-runtime-FC201B7s.js +6837 -0
  410. package/dist/manager/_manager-chunks/globals-runtime-Rp_zjGnh.js +121 -0
  411. package/dist/manager/_manager-chunks/globals-runtime-ZHrQFa3-.js +10463 -0
  412. package/dist/manager/_manager-chunks/globals-runtime-eLPTIfX-.js +7759 -0
  413. package/dist/manager/_manager-chunks/globals-runtime-qKvCZHFY.js +4468 -0
  414. package/dist/manager/_manager-chunks/globals-runtime-sGpNlIJ1.js +5102 -0
  415. package/dist/manager/_manager-chunks/runtime-B1L9TH89.js +452 -0
  416. package/dist/manager/_manager-chunks/runtime-BK0zF7FN.js +22 -0
  417. package/dist/manager/_manager-chunks/runtime-BhkT2CXl.js +1408 -0
  418. package/dist/manager/_manager-chunks/runtime-Bly6WJLN.js +998 -0
  419. package/dist/manager/_manager-chunks/runtime-D0UOWx0U.js +979 -0
  420. package/dist/manager/_manager-chunks/runtime-D94Vq3oR.js +4014 -0
  421. package/dist/manager/_manager-chunks/runtime-DMig8mT7.js +77 -0
  422. package/dist/manager/_manager-chunks/runtime-EITvVbkG.js +46 -0
  423. package/dist/manager/_manager-chunks/runtime-cp5pazY2.js +8936 -0
  424. package/dist/manager/_manager-chunks/runtime-eDVAYF7N.js +6860 -0
  425. package/dist/manager/_manager-chunks/runtime-i-PDAHLR.js +2493 -0
  426. package/dist/manager/globals-runtime.js +2 -0
  427. package/dist/manager/globals.d.ts +23 -0
  428. package/dist/manager/globals.js +26 -0
  429. package/dist/manager/manager-stores.d.ts +2 -0
  430. package/dist/manager/manager-stores.js +19 -0
  431. package/dist/manager/runtime.js +2 -0
  432. package/dist/manager-api/index.d.ts +2 -0
  433. package/dist/manager-api/index.js +3257 -0
  434. package/dist/manager-errors.d.ts +89 -0
  435. package/dist/manager-errors.js +20 -0
  436. package/dist/mcp/index.d.ts +270 -0
  437. package/dist/mcp/index.js +305 -0
  438. package/dist/mocking-utils/index.d.ts +689 -0
  439. package/dist/mocking-utils/index.js +521 -0
  440. package/dist/mocking-utils/mocker-runtime.js +1254 -0
  441. package/dist/nextjs-vite/config/preview.js +3 -0
  442. package/dist/nextjs-vite/export-mocks/cache/index.d.ts +25 -0
  443. package/dist/nextjs-vite/export-mocks/cache/index.js +29 -0
  444. package/dist/nextjs-vite/export-mocks/headers/index.d.ts +37 -0
  445. package/dist/nextjs-vite/export-mocks/headers/index.js +54 -0
  446. package/dist/nextjs-vite/export-mocks/link/index.d.ts +9 -0
  447. package/dist/nextjs-vite/export-mocks/link/index.js +59 -0
  448. package/dist/nextjs-vite/export-mocks/navigation/index.d.ts +28 -0
  449. package/dist/nextjs-vite/export-mocks/navigation/index.js +58 -0
  450. package/dist/nextjs-vite/export-mocks/router/index.d.ts +34 -0
  451. package/dist/nextjs-vite/export-mocks/router/index.js +63 -0
  452. package/dist/nextjs-vite/index.d.ts +92 -0
  453. package/dist/nextjs-vite/index.js +58 -0
  454. package/dist/nextjs-vite/node/index.d.ts +6 -0
  455. package/dist/nextjs-vite/node/index.js +20 -0
  456. package/dist/nextjs-vite/preset.js +648 -0
  457. package/dist/nextjs-vite/preview.d.ts +20 -0
  458. package/dist/nextjs-vite/preview.js +11 -0
  459. package/dist/nextjs-vite/vite-plugin/index.d.ts +6 -0
  460. package/dist/nextjs-vite/vite-plugin/index.js +19 -0
  461. package/dist/nextjs-vite-plugin/index.d.ts +28 -0
  462. package/dist/nextjs-vite-plugin/index.js +923 -0
  463. package/dist/nextjs-vite-plugin/mocks/storybook.global.js +29 -0
  464. package/dist/nextjs-vite-plugin/plugins/next-image/alias/image-context.js +8 -0
  465. package/dist/nextjs-vite-plugin/plugins/next-image/alias/image-default-loader.js +23 -0
  466. package/dist/nextjs-vite-plugin/plugins/next-image/alias/next-image.js +28 -0
  467. package/dist/nextjs-vite-plugin/plugins/next-image/alias/next-legacy-image.js +17 -0
  468. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/cache/index.js +29 -0
  469. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/dynamic/index.js +40 -0
  470. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/headers/index.js +55 -0
  471. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/link/index.js +63 -0
  472. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/navigation/index.js +71 -0
  473. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/router/index.js +74 -0
  474. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/rsc/server-only.js +7 -0
  475. package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/safe-stable-stringify/index.js +13 -0
  476. package/dist/nextjs-vite-plugin/plugins/next-mocks/compatibility/draft-mode.compat.js +7 -0
  477. package/dist/node-logger/index.d.ts +495 -0
  478. package/dist/node-logger/index.js +42 -0
  479. package/dist/oxc-parser/index.d.ts +99 -0
  480. package/dist/oxc-parser/index.js +275 -0
  481. package/dist/oxc-parser/worker.js +37 -0
  482. package/dist/preview/_chunks/runtime-BIzIdDbb.js +10263 -0
  483. package/dist/preview/_chunks/runtime-BTPtVY1p.js +1102 -0
  484. package/dist/preview/_chunks/runtime-BZSnICCg.js +8484 -0
  485. package/dist/preview/_chunks/runtime-BdGkqNEt.js +45 -0
  486. package/dist/preview/_chunks/runtime-BwSxqk3t.js +63 -0
  487. package/dist/preview/_chunks/runtime-CqHxptiK.js +6143 -0
  488. package/dist/preview/_chunks/runtime-CsV4HZPV.js +5064 -0
  489. package/dist/preview/_chunks/runtime-CxZK_Ln3.js +284 -0
  490. package/dist/preview/_chunks/runtime-DZToXfvO.js +9767 -0
  491. package/dist/preview/_chunks/runtime-DrTjJkPY.js +3872 -0
  492. package/dist/preview/_chunks/runtime-DuHdxMFA.js +387 -0
  493. package/dist/preview/_chunks/runtime-iXdo8CR8.js +3635 -0
  494. package/dist/preview/_chunks/runtime-q3wt0e_N.js +6838 -0
  495. package/dist/preview/globals.d.ts +16 -0
  496. package/dist/preview/globals.js +20 -0
  497. package/dist/preview/runtime.js +6 -0
  498. package/dist/preview-api/index.d.ts +4 -0
  499. package/dist/preview-api/index.js +147 -0
  500. package/dist/preview-errors.d.ts +186 -0
  501. package/dist/preview-errors.js +56 -0
  502. package/dist/react/docgen/docgen-worker.js +38 -0
  503. package/dist/react/entry-preview-argtypes.js +9 -0
  504. package/dist/react/entry-preview-docs.js +12 -0
  505. package/dist/react/entry-preview-rsc.js +11 -0
  506. package/dist/react/entry-preview.js +21 -0
  507. package/dist/react/index.d.ts +119 -0
  508. package/dist/react/index.js +26 -0
  509. package/dist/react/preset.js +301 -0
  510. package/dist/react/preview.d.ts +2 -0
  511. package/dist/react/preview.js +11 -0
  512. package/dist/react-native/bin/get-stories.js +34 -0
  513. package/dist/react-native/index.d.ts +160 -0
  514. package/dist/react-native/index.js +1547 -0
  515. package/dist/react-native/metro/node.d.ts +83 -0
  516. package/dist/react-native/metro/node.js +21 -0
  517. package/dist/react-native/metro/withStorybook.d.ts +2269 -0
  518. package/dist/react-native/metro/withStorybook.js +138 -0
  519. package/dist/react-native/preview.d.ts +6 -0
  520. package/dist/react-native/preview.js +20 -0
  521. package/dist/react-native/scripts/generate.d.ts +22 -0
  522. package/dist/react-native/scripts/generate.js +18 -0
  523. package/dist/react-native/stub.js +20 -0
  524. package/dist/react-native-theming/index.d.ts +175 -0
  525. package/dist/react-native-theming/index.js +2591 -0
  526. package/dist/react-native-ui/index.d.ts +130 -0
  527. package/dist/react-native-ui/index.js +1448 -0
  528. package/dist/react-native-ui-common/index.d.ts +230 -0
  529. package/dist/react-native-ui-common/index.js +514 -0
  530. package/dist/react-vite/index.d.ts +4 -0
  531. package/dist/react-vite/index.js +8 -0
  532. package/dist/react-vite/node/index.d.ts +6 -0
  533. package/dist/react-vite/node/index.js +20 -0
  534. package/dist/react-vite/preset.d.ts +6 -0
  535. package/dist/react-vite/preset.js +21 -0
  536. package/dist/router/index.d.ts +141 -0
  537. package/dist/router/index.js +1217 -0
  538. package/dist/server-errors.d.ts +2 -0
  539. package/dist/server-errors.js +149 -0
  540. package/dist/shared/open-service/index.d.ts +3 -0
  541. package/dist/shared/open-service/index.js +115 -0
  542. package/dist/shared/open-service/services/docgen/worker/docgen-worker.js +75 -0
  543. package/dist/shared/open-service/toolsets/docs/public.d.ts +1296 -0
  544. package/dist/shared/open-service/toolsets/docs/public.js +991 -0
  545. package/dist/telemetry/index.d.ts +314 -0
  546. package/dist/telemetry/index.js +103 -0
  547. package/dist/test/index.d.ts +158 -0
  548. package/dist/test/index.js +19421 -0
  549. package/dist/theming/create.d.ts +15 -0
  550. package/dist/theming/create.js +11 -0
  551. package/dist/theming/index.d.ts +54 -0
  552. package/dist/theming/index.js +511 -0
  553. package/dist/types/index.d.ts +2 -0
  554. package/dist/types/index.js +48 -0
  555. package/dist/viewport/index.d.ts +275 -0
  556. package/dist/viewport/index.js +21 -0
  557. package/package.json +1054 -4
  558. package/template/nextjs-vite/cli/.eslintrc.json +6 -0
  559. package/template/nextjs-vite/cli/js/Button.jsx +42 -0
  560. package/template/nextjs-vite/cli/js/Button.stories.js +49 -0
  561. package/template/nextjs-vite/cli/js/Configure.mdx +470 -0
  562. package/template/nextjs-vite/cli/js/Header.jsx +58 -0
  563. package/template/nextjs-vite/cli/js/Header.stories.js +30 -0
  564. package/template/nextjs-vite/cli/js/Page.jsx +68 -0
  565. package/template/nextjs-vite/cli/js/Page.stories.js +28 -0
  566. package/template/nextjs-vite/cli/ts/Button.stories.ts +54 -0
  567. package/template/nextjs-vite/cli/ts/Button.tsx +39 -0
  568. package/template/nextjs-vite/cli/ts/Configure.mdx +446 -0
  569. package/template/nextjs-vite/cli/ts/Header.stories.ts +34 -0
  570. package/template/nextjs-vite/cli/ts/Header.tsx +54 -0
  571. package/template/nextjs-vite/cli/ts/Page.stories.ts +33 -0
  572. package/template/nextjs-vite/cli/ts/Page.tsx +73 -0
  573. package/template/react/cli/.eslintrc.json +5 -0
  574. package/template/react/cli/js/Button.jsx +39 -0
  575. package/template/react/cli/js/Button.stories.js +49 -0
  576. package/template/react/cli/js/Header.jsx +56 -0
  577. package/template/react/cli/js/Header.stories.js +29 -0
  578. package/template/react/cli/js/Page.jsx +69 -0
  579. package/template/react/cli/js/Page.stories.js +28 -0
  580. package/template/react/cli/ts/Button.stories.ts +54 -0
  581. package/template/react/cli/ts/Button.tsx +37 -0
  582. package/template/react/cli/ts/Header.stories.ts +34 -0
  583. package/template/react/cli/ts/Header.tsx +56 -0
  584. package/template/react/cli/ts/Page.stories.ts +33 -0
  585. package/template/react/cli/ts/Page.tsx +73 -0
  586. package/template/react-vite/cli/.eslintrc.json +5 -0
  587. package/template/react-vite/cli/js/Button.jsx +39 -0
  588. package/template/react-vite/cli/js/Button.stories.js +49 -0
  589. package/template/react-vite/cli/js/Header.jsx +56 -0
  590. package/template/react-vite/cli/js/Header.stories.js +29 -0
  591. package/template/react-vite/cli/js/Page.jsx +69 -0
  592. package/template/react-vite/cli/js/Page.stories.js +28 -0
  593. package/template/react-vite/cli/ts/Button.stories.ts +54 -0
  594. package/template/react-vite/cli/ts/Button.tsx +37 -0
  595. package/template/react-vite/cli/ts/Header.stories.ts +34 -0
  596. package/template/react-vite/cli/ts/Header.tsx +56 -0
  597. package/template/react-vite/cli/ts/Page.stories.ts +33 -0
  598. package/template/react-vite/cli/ts/Page.tsx +73 -0
@@ -0,0 +1,3787 @@
1
+ import CJS_COMPAT_NODE_URL_ro17f80mg6k from 'node:url';
2
+ import CJS_COMPAT_NODE_PATH_ro17f80mg6k from 'node:path';
3
+ import CJS_COMPAT_NODE_MODULE_ro17f80mg6k from "node:module";
4
+
5
+ var __filename = CJS_COMPAT_NODE_URL_ro17f80mg6k.fileURLToPath(import.meta.url);
6
+ var __dirname = CJS_COMPAT_NODE_PATH_ro17f80mg6k.dirname(__filename);
7
+ var require = CJS_COMPAT_NODE_MODULE_ro17f80mg6k.createRequire(import.meta.url);
8
+
9
+ // ------------------------------------------------------------
10
+ // end of CJS compatibility banner, injected by Forkbook's esbuild configuration
11
+ // ------------------------------------------------------------
12
+ import {
13
+ require_dist
14
+ } from "./chunk-JGGFYIG5.js";
15
+ import {
16
+ cache,
17
+ up as up3
18
+ } from "./chunk-UVINFLGY.js";
19
+ import {
20
+ FORKBOOK_PACKAGE_PATTERNS,
21
+ FORKBOOK_RERUN_INSTRUCTION,
22
+ JsPackageManager,
23
+ defaultConfigDir,
24
+ extractFrameworkPackageName,
25
+ frameworkPackages,
26
+ getAddonNames,
27
+ getAgeInMinutes,
28
+ getConfigInfo,
29
+ getErrorLogs,
30
+ getInterpretedFile,
31
+ getLatestStableVersionAdheringToMinimumAgeGate,
32
+ getPrettyPackageManagerName,
33
+ getStorybookRerunCommand,
34
+ hasStorybookMinimumAgeExclusions,
35
+ loadMainConfig,
36
+ normalizeAddonName,
37
+ parsePackageData,
38
+ parsePackageTimeMap,
39
+ parsePositiveIntegerConfigValue,
40
+ parseReleaseTime,
41
+ validateConfigurationFiles,
42
+ versions_default,
43
+ withForkbookFramework
44
+ } from "./chunk-GRBLDJCR.js";
45
+ import {
46
+ createModuleResolver,
47
+ isSelfContained,
48
+ parseReferenceModule,
49
+ resolveReferencedValue,
50
+ sourceOf,
51
+ unwrapExpression
52
+ } from "./chunk-YZFWBA5L.js";
53
+ import {
54
+ stripJsonComments
55
+ } from "./chunk-SIEXZVCR.js";
56
+ import {
57
+ logger
58
+ } from "./chunk-6LMWA44H.js";
59
+ import {
60
+ STORY_FILE_TEST_REGEXP,
61
+ execa,
62
+ execaCommandSync,
63
+ execaNode,
64
+ getStoryImportPathFromEntry
65
+ } from "./chunk-MK2KYAI6.js";
66
+ import {
67
+ BUN_LOCKFILE,
68
+ BUN_LOCKFILE_BINARY,
69
+ NPM_LOCKFILE,
70
+ PNPM_LOCKFILE,
71
+ YARN_LOCKFILE,
72
+ getProjectRoot,
73
+ normalizeStoryPath,
74
+ require_picomatch
75
+ } from "./chunk-SLWQNBGO.js";
76
+ import {
77
+ any,
78
+ from,
79
+ up,
80
+ up2
81
+ } from "./chunk-JDXXX6LB.js";
82
+ import {
83
+ importModule,
84
+ resolveModulePath,
85
+ resolvePackageDir,
86
+ safeResolveModule
87
+ } from "./chunk-F3ZFKBHY.js";
88
+ import {
89
+ jsModuleExtensions,
90
+ jsTsSourceExtensions
91
+ } from "./chunk-TNJIXE37.js";
92
+ import {
93
+ ExecaCommandFailedError,
94
+ PackageInstallDependencyConflictError,
95
+ PackageInstallFailedError,
96
+ PackageInstallMissingManifestError,
97
+ PackageManagerBinaryNotFoundError,
98
+ PlaywrightInstallFailedError,
99
+ PnpmIgnoredBuildsError,
100
+ PnpmNoTtyModulesDirError,
101
+ StorybookError
102
+ } from "./chunk-U5W53R2J.js";
103
+ import {
104
+ require_picocolors
105
+ } from "./chunk-2BUPBPFB.js";
106
+ import {
107
+ slash
108
+ } from "./chunk-DC7DKR5K.js";
109
+ import {
110
+ globSync
111
+ } from "./chunk-ZMAMXQKP.js";
112
+ import {
113
+ __toESM
114
+ } from "./chunk-CXRU72ET.js";
115
+
116
+ // src/common/presets.ts
117
+ import { logger as logger2 } from "@aussieljk/forkbook/internal/node-logger";
118
+ import { CriticalPresetLoadError } from "@aussieljk/forkbook/internal/server-errors";
119
+ import { readFileSync } from "node:fs";
120
+ import { isAbsolute, join, parse, resolve } from "pathe";
121
+ import { dedent } from "ts-dedent";
122
+
123
+ // src/common/utils/strip-abs-node-modules-path.ts
124
+ import { posix, sep } from "node:path";
125
+ function normalizePath(id) {
126
+ return posix.normalize(slash(id));
127
+ }
128
+ function stripAbsNodeModulesPath(absPath) {
129
+ let splits = absPath.split(`node_modules${sep}`);
130
+ return normalizePath(splits[splits.length - 1]);
131
+ }
132
+
133
+ // src/common/presets.ts
134
+ var isObject = (val) => val != null && typeof val == "object" && Array.isArray(val) === !1, isFunction = (val) => typeof val == "function";
135
+ function resolvePresetFunction(input, presetOptions, storybookOptions) {
136
+ return isFunction(input) ? [...input({ ...storybookOptions, ...presetOptions })] : Array.isArray(input) ? [...input] : [];
137
+ }
138
+ function readAddonManifest(dir) {
139
+ try {
140
+ let { name, exports } = JSON.parse(readFileSync(join(dir, "package.json"), "utf8"));
141
+ return { name: typeof name == "string" && name !== "" ? name : void 0, exports };
142
+ } catch {
143
+ return;
144
+ }
145
+ }
146
+ var resolveAddonName = (configDir, name, options) => {
147
+ let resolved = safeResolveModule({ specifier: name, parent: configDir });
148
+ if (resolved && parse(name).name === "preset")
149
+ return {
150
+ type: "presets",
151
+ name: resolved
152
+ };
153
+ let manifest = isAbsolute(name) ? readAddonManifest(name) : void 0, exportsSpecifier = manifest?.exports ? manifest.name : void 0, resolveEntryFile = (entry) => (exportsSpecifier ? safeResolveModule({ specifier: `${exportsSpecifier}/${entry}`, parent: name }) : void 0) ?? safeResolveModule({ specifier: join(name, entry), parent: configDir }), presetFile = resolveEntryFile("preset"), managerFile = resolveEntryFile("manager"), previewFile = resolveEntryFile("preview");
154
+ if (managerFile || previewFile || presetFile) {
155
+ let previewAnnotations = [];
156
+ if (previewFile) {
157
+ let parsedPreviewFile = stripAbsNodeModulesPath(previewFile);
158
+ parsedPreviewFile !== previewFile ? previewAnnotations.push({
159
+ bare: parsedPreviewFile,
160
+ absolute: previewFile
161
+ }) : previewAnnotations.push(previewFile);
162
+ }
163
+ return {
164
+ type: "virtual",
165
+ name,
166
+ presets: presetFile ? [{ name: presetFile, options }] : [],
167
+ managerEntries: managerFile ? [managerFile] : [],
168
+ previewAnnotations
169
+ };
170
+ }
171
+ if (resolved)
172
+ return {
173
+ type: "presets",
174
+ name: resolved
175
+ };
176
+ }, map = ({ configDir }) => (item) => {
177
+ let options = isObject(item) && item.options || void 0, name = isObject(item) ? item.name : item, resolved;
178
+ try {
179
+ resolved = resolveAddonName(configDir, name, options);
180
+ } catch {
181
+ logger2.error(
182
+ `Addon value should end in /manager or /preview or /register OR it should be a valid preset https://storybook.js.org/docs/addons/writing-presets/
183
+ ${item}`
184
+ );
185
+ return;
186
+ }
187
+ if (!resolved) {
188
+ let packageName = isAbsolute(name) ? readAddonManifest(name)?.name : void 0;
189
+ logger2.warn(
190
+ packageName ? dedent`
191
+ Could not resolve addon "${packageName}", skipping.
192
+ It is installed at ${name}, but none of its preset, manager or preview entry points could be resolved.
193
+ If your main config wraps it in getAbsolutePath(), try referencing "${packageName}" directly instead.
194
+ ` : `Could not resolve addon "${name}", skipping. Is it installed?`
195
+ );
196
+ return;
197
+ }
198
+ return {
199
+ ...options ? { options } : {},
200
+ ...resolved
201
+ };
202
+ };
203
+ async function getContent(input, configDir) {
204
+ if (input.type === "virtual") {
205
+ let { type, name: name2, ...rest } = input;
206
+ return rest;
207
+ }
208
+ let name = input.name ? input.name : input;
209
+ return importModule(safeResolveModule({ specifier: name, parent: configDir }) ?? name);
210
+ }
211
+ async function loadPreset(input, level, storybookOptions) {
212
+ let presetName = input.name ? input.name : input;
213
+ try {
214
+ let presetOptions = input.options ? input.options : {}, contents = await getContent(input, storybookOptions.configDir);
215
+ if (typeof contents == "function" && (contents = contents(storybookOptions, presetOptions)), Array.isArray(contents))
216
+ return await loadPresets(contents, level + 1, storybookOptions);
217
+ if (isObject(contents)) {
218
+ let {
219
+ addons: addonsInput = [],
220
+ presets: presetsInput = [],
221
+ ...rest
222
+ } = withForkbookFramework(contents), filter = (i) => !0;
223
+ storybookOptions.isCritical !== !0 && (storybookOptions.build?.test?.disabledAddons?.length || 0) > 0 && (filter = (i) => {
224
+ let name = i.name ? i.name : i;
225
+ return !storybookOptions.build?.test?.disabledAddons?.find((n) => name.includes(n));
226
+ });
227
+ let subPresets = resolvePresetFunction(
228
+ presetsInput,
229
+ presetOptions,
230
+ storybookOptions
231
+ ).filter(filter), subAddons = resolvePresetFunction(addonsInput, presetOptions, storybookOptions).filter(
232
+ filter
233
+ );
234
+ return [
235
+ ...await loadPresets([...subPresets], level + 1, storybookOptions),
236
+ ...await loadPresets(
237
+ [...subAddons.map(map(storybookOptions))].filter(Boolean),
238
+ level + 1,
239
+ storybookOptions
240
+ ),
241
+ {
242
+ name: presetName,
243
+ preset: rest,
244
+ options: presetOptions
245
+ }
246
+ ];
247
+ }
248
+ throw new Error(dedent`
249
+ ${input} is not a valid preset
250
+ `);
251
+ } catch (error) {
252
+ if (storybookOptions?.isCritical)
253
+ throw new CriticalPresetLoadError({
254
+ error,
255
+ presetName
256
+ });
257
+ let warning = level > 0 ? ` Failed to load preset: ${JSON.stringify(input)} on level ${level}` : ` Failed to load preset: ${JSON.stringify(input)}`;
258
+ return logger2.warn(warning), logger2.error(error), [];
259
+ }
260
+ }
261
+ async function loadPresets(presets, level, storybookOptions) {
262
+ return !presets || !Array.isArray(presets) || !presets.length ? [] : (await Promise.all(
263
+ presets.map(async (preset) => loadPreset(preset, level, storybookOptions))
264
+ )).reduce((acc, loaded) => acc.concat(loaded), []);
265
+ }
266
+ function applyPresets(presets, extension, config, args, storybookOptions) {
267
+ let presetResult = new Promise((res) => res(config));
268
+ return presets.length ? presets.reduce((accumulationPromise, { preset, options }) => {
269
+ let change = preset[extension];
270
+ if (!change)
271
+ return accumulationPromise;
272
+ if (typeof change == "function") {
273
+ let extensionFn = change, context = {
274
+ preset,
275
+ combinedOptions: {
276
+ ...storybookOptions,
277
+ ...args,
278
+ ...options,
279
+ presetsList: presets,
280
+ presets: {
281
+ apply: async (ext, c, a = {}) => applyPresets(presets, ext, c, a, storybookOptions)
282
+ }
283
+ }
284
+ };
285
+ return accumulationPromise.then(
286
+ (newConfig) => extensionFn.call(context.preset, newConfig, context.combinedOptions)
287
+ );
288
+ }
289
+ return accumulationPromise.then((newConfig) => Array.isArray(newConfig) && Array.isArray(change) ? [...newConfig, ...change] : isObject(newConfig) && isObject(change) ? { ...newConfig, ...change } : change);
290
+ }, presetResult) : presetResult;
291
+ }
292
+ async function getPresets(presets, storybookOptions) {
293
+ let loadedPresets = await loadPresets(presets, 0, storybookOptions);
294
+ return {
295
+ apply: async (extension, config, args = {}) => applyPresets(loadedPresets, extension, config, args, storybookOptions)
296
+ };
297
+ }
298
+ async function loadAllPresets(options) {
299
+ let { corePresets = [], overridePresets = [], ...restOptions } = options;
300
+ validateConfigurationFiles(options.configDir);
301
+ let mainUrl = getInterpretedFile(resolve(options.configDir, "main")), presetsConfig = [...corePresets, mainUrl, ...overridePresets];
302
+ return getPresets(presetsConfig, restOptions);
303
+ }
304
+
305
+ // src/common/utils/file-cache.ts
306
+ import { createHash, randomBytes } from "node:crypto";
307
+ import { mkdirSync, readFileSync as readFileSync2, readdirSync, rmSync, writeFileSync } from "node:fs";
308
+ import { mkdir, readFile, readdir, rm } from "node:fs/promises";
309
+ import { tmpdir } from "node:os";
310
+ import { join as join2 } from "node:path";
311
+
312
+ // src/common/utils/write-file-with-retry.ts
313
+ import { writeFile } from "node:fs/promises";
314
+ async function writeFileWithRetry(file, data, options) {
315
+ for (let attempt = 1; attempt <= 5; attempt++)
316
+ try {
317
+ await writeFile(file, data, options);
318
+ return;
319
+ } catch (err) {
320
+ if (attempt < 5 && err instanceof Error && "code" in err && err.code === "EBUSY")
321
+ await new Promise((resolve7) => setTimeout(resolve7, 100));
322
+ else
323
+ throw err;
324
+ }
325
+ }
326
+
327
+ // src/common/utils/file-cache.ts
328
+ var FileSystemCache = class {
329
+ constructor(options = {}) {
330
+ this.prefix = (options.ns || options.prefix || "") + "-", this.hash_alg = options.hash_alg || "sha256", this.cache_dir = options.basePath || join2(tmpdir(), randomBytes(15).toString("base64").replace(/\//g, "-")), this.ttl = options.ttl || 0, createHash(this.hash_alg), mkdirSync(this.cache_dir, { recursive: !0 });
331
+ }
332
+ generateHash(name) {
333
+ return join2(this.cache_dir, this.prefix + createHash(this.hash_alg).update(name).digest("hex"));
334
+ }
335
+ isExpired(parsed, now) {
336
+ return parsed.ttl != null && now > parsed.ttl;
337
+ }
338
+ parseCacheData(data, fallback) {
339
+ let parsed = JSON.parse(data);
340
+ return this.isExpired(parsed, Date.now()) ? fallback : parsed.content;
341
+ }
342
+ parseSetData(key, data, opts = {}) {
343
+ let ttl = opts.ttl ?? this.ttl;
344
+ return JSON.stringify({ key, content: data, ...ttl && { ttl: Date.now() + ttl * 1e3 } });
345
+ }
346
+ async get(name, fallback) {
347
+ try {
348
+ let data = await readFile(this.generateHash(name), "utf8");
349
+ return this.parseCacheData(data, fallback);
350
+ } catch {
351
+ return fallback;
352
+ }
353
+ }
354
+ getSync(name, fallback) {
355
+ try {
356
+ let data = readFileSync2(this.generateHash(name), "utf8");
357
+ return this.parseCacheData(data, fallback);
358
+ } catch {
359
+ return fallback;
360
+ }
361
+ }
362
+ async set(name, data, orgOpts = {}) {
363
+ let opts = typeof orgOpts == "number" ? { ttl: orgOpts } : orgOpts;
364
+ await mkdir(this.cache_dir, { recursive: !0 }), await writeFileWithRetry(this.generateHash(name), this.parseSetData(name, data, opts), {
365
+ encoding: opts.encoding || "utf8"
366
+ });
367
+ }
368
+ setSync(name, data, orgOpts = {}) {
369
+ let opts = typeof orgOpts == "number" ? { ttl: orgOpts } : orgOpts;
370
+ mkdirSync(this.cache_dir, { recursive: !0 }), writeFileSync(this.generateHash(name), this.parseSetData(name, data, opts), {
371
+ encoding: opts.encoding || "utf8"
372
+ });
373
+ }
374
+ async setMany(items, options) {
375
+ await Promise.all(items.map((item) => this.set(item.key, item.content ?? item.value, options)));
376
+ }
377
+ setManySync(items, options) {
378
+ items.forEach((item) => this.setSync(item.key, item.content ?? item.value, options));
379
+ }
380
+ async remove(name) {
381
+ await rm(this.generateHash(name), { force: !0 });
382
+ }
383
+ removeSync(name) {
384
+ rmSync(this.generateHash(name), { force: !0 });
385
+ }
386
+ async clear() {
387
+ let files = await readdir(this.cache_dir);
388
+ await Promise.all(
389
+ files.filter((f) => f.startsWith(this.prefix)).map((f) => rm(join2(this.cache_dir, f), { force: !0 }))
390
+ );
391
+ }
392
+ clearSync() {
393
+ readdirSync(this.cache_dir).filter((f) => f.startsWith(this.prefix)).forEach((f) => rmSync(join2(this.cache_dir, f), { force: !0 }));
394
+ }
395
+ async getAll() {
396
+ let now = Date.now(), files = await readdir(this.cache_dir);
397
+ return (await Promise.all(
398
+ files.filter((f) => f.startsWith(this.prefix)).map((f) => readFile(join2(this.cache_dir, f), "utf8"))
399
+ )).map((data) => JSON.parse(data)).filter((entry) => entry.content && !this.isExpired(entry, now));
400
+ }
401
+ async load() {
402
+ return {
403
+ files: (await this.getAll()).map((entry) => ({
404
+ path: this.generateHash(entry.key),
405
+ value: entry.content,
406
+ key: entry.key
407
+ }))
408
+ };
409
+ }
410
+ };
411
+ function createFileSystemCache(options) {
412
+ return new FileSystemCache(options);
413
+ }
414
+
415
+ // src/common/utils/resolve-path-in-sb-cache.ts
416
+ import { join as join3 } from "node:path";
417
+ function resolvePathInStorybookCache(fileOrDirectoryName, sub = "default") {
418
+ let cacheDirectory = cache("storybook");
419
+ cacheDirectory ||= join3(process.cwd(), "node_modules", ".cache", "storybook");
420
+ let version = versions_default["@aussieljk/forkbook"] || "unknown";
421
+ return join3(cacheDirectory, version, sub, fileOrDirectoryName);
422
+ }
423
+
424
+ // src/common/utils/cache.ts
425
+ var cache2 = createFileSystemCache({
426
+ basePath: resolvePathInStorybookCache("dev-server"),
427
+ ns: "storybook"
428
+ // Optional. A grouping namespace for items.
429
+ });
430
+
431
+ // src/common/utils/cli.ts
432
+ import { createWriteStream, mkdirSync as mkdirSync2 } from "node:fs";
433
+ import { copyFile, readFile as readFile2, realpath, rm as rm2, writeFile as writeFile2 } from "node:fs/promises";
434
+ import os from "node:os";
435
+ import { join as join4 } from "node:path";
436
+
437
+ // ../../node_modules/crypto-random-string/index.js
438
+ import { promisify } from "util";
439
+ import crypto from "crypto";
440
+ var randomBytesAsync = promisify(crypto.randomBytes), urlSafeCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~".split(""), numericCharacters = "0123456789".split(""), distinguishableCharacters = "CDEHKMPRTUWXY012458".split(""), asciiPrintableCharacters = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~".split(""), alphanumericCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""), generateForCustomCharacters = (length, characters) => {
441
+ let characterCount = characters.length, maxValidSelector = Math.floor(65536 / characterCount) * characterCount - 1, entropyLength = 2 * Math.ceil(1.1 * length), string = "", stringLength = 0;
442
+ for (; stringLength < length; ) {
443
+ let entropy = crypto.randomBytes(entropyLength), entropyPosition = 0;
444
+ for (; entropyPosition < entropyLength && stringLength < length; ) {
445
+ let entropyValue = entropy.readUInt16LE(entropyPosition);
446
+ entropyPosition += 2, !(entropyValue > maxValidSelector) && (string += characters[entropyValue % characterCount], stringLength++);
447
+ }
448
+ }
449
+ return string;
450
+ }, generateForCustomCharactersAsync = async (length, characters) => {
451
+ let characterCount = characters.length, maxValidSelector = Math.floor(65536 / characterCount) * characterCount - 1, entropyLength = 2 * Math.ceil(1.1 * length), string = "", stringLength = 0;
452
+ for (; stringLength < length; ) {
453
+ let entropy = await randomBytesAsync(entropyLength), entropyPosition = 0;
454
+ for (; entropyPosition < entropyLength && stringLength < length; ) {
455
+ let entropyValue = entropy.readUInt16LE(entropyPosition);
456
+ entropyPosition += 2, !(entropyValue > maxValidSelector) && (string += characters[entropyValue % characterCount], stringLength++);
457
+ }
458
+ }
459
+ return string;
460
+ }, generateRandomBytes = (byteLength, type, length) => crypto.randomBytes(byteLength).toString(type).slice(0, length), generateRandomBytesAsync = async (byteLength, type, length) => (await randomBytesAsync(byteLength)).toString(type).slice(0, length), allowedTypes = /* @__PURE__ */ new Set([
461
+ void 0,
462
+ "hex",
463
+ "base64",
464
+ "url-safe",
465
+ "numeric",
466
+ "distinguishable",
467
+ "ascii-printable",
468
+ "alphanumeric"
469
+ ]), createGenerator = (generateForCustomCharacters2, generateRandomBytes2) => ({ length, type, characters }) => {
470
+ if (!(length >= 0 && Number.isFinite(length)))
471
+ throw new TypeError("Expected a `length` to be a non-negative finite number");
472
+ if (type !== void 0 && characters !== void 0)
473
+ throw new TypeError("Expected either `type` or `characters`");
474
+ if (characters !== void 0 && typeof characters != "string")
475
+ throw new TypeError("Expected `characters` to be string");
476
+ if (!allowedTypes.has(type))
477
+ throw new TypeError(`Unknown type: ${type}`);
478
+ if (type === void 0 && characters === void 0 && (type = "hex"), type === "hex" || type === void 0 && characters === void 0)
479
+ return generateRandomBytes2(Math.ceil(length * 0.5), "hex", length);
480
+ if (type === "base64")
481
+ return generateRandomBytes2(Math.ceil(length * 0.75), "base64", length);
482
+ if (type === "url-safe")
483
+ return generateForCustomCharacters2(length, urlSafeCharacters);
484
+ if (type === "numeric")
485
+ return generateForCustomCharacters2(length, numericCharacters);
486
+ if (type === "distinguishable")
487
+ return generateForCustomCharacters2(length, distinguishableCharacters);
488
+ if (type === "ascii-printable")
489
+ return generateForCustomCharacters2(length, asciiPrintableCharacters);
490
+ if (type === "alphanumeric")
491
+ return generateForCustomCharacters2(length, alphanumericCharacters);
492
+ if (characters.length === 0)
493
+ throw new TypeError("Expected `characters` string length to be greater than or equal to 1");
494
+ if (characters.length > 65536)
495
+ throw new TypeError("Expected `characters` string length to be less or equal to 65536");
496
+ return generateForCustomCharacters2(length, characters.split(""));
497
+ }, cryptoRandomString = createGenerator(generateForCustomCharacters, generateRandomBytes);
498
+ cryptoRandomString.async = createGenerator(generateForCustomCharactersAsync, generateRandomBytesAsync);
499
+ var crypto_random_string_default = cryptoRandomString;
500
+
501
+ // ../../node_modules/unique-string/index.js
502
+ function uniqueString() {
503
+ return crypto_random_string_default({ length: 32 });
504
+ }
505
+
506
+ // src/common/satellite-addons.ts
507
+ var satellite_addons_default = [
508
+ "@storybook/addon-coverage",
509
+ // Storybook for React Native related packages
510
+ "@storybook/addon-ondevice-actions",
511
+ "@storybook/addon-ondevice-backgrounds",
512
+ "@storybook/addon-ondevice-controls",
513
+ "@storybook/addon-ondevice-notes",
514
+ "@storybook/react-native"
515
+ ];
516
+
517
+ // src/common/utils/cli.ts
518
+ var tempDir = () => realpath(os.tmpdir()), getPath = async (prefix = "") => join4(await tempDir(), prefix + uniqueString());
519
+ async function temporaryDirectory({ prefix = "" } = {}) {
520
+ let directory = await getPath(prefix);
521
+ return mkdirSync2(directory), directory;
522
+ }
523
+ async function temporaryFile({ name, extension } = {}) {
524
+ if (name) {
525
+ if (extension != null)
526
+ throw new Error("The `name` and `extension` options are mutually exclusive");
527
+ return join4(await temporaryDirectory(), name);
528
+ }
529
+ return await getPath() + (extension == null ? "" : "." + extension.replace(/^\./, ""));
530
+ }
531
+ function parseList(str) {
532
+ return str.split(",").map((item) => item.trim()).filter((item) => item.length > 0);
533
+ }
534
+ function getEnvConfig(program, configEnv) {
535
+ Object.keys(configEnv).forEach((fieldName) => {
536
+ let envVarName = configEnv[fieldName], envVarValue = process.env[envVarName];
537
+ envVarValue && (program[fieldName] = envVarValue);
538
+ });
539
+ }
540
+ var createLogStream = async (logFileName = "storybook.log") => {
541
+ let finalLogPath = join4(process.cwd(), logFileName), temporaryLogPath = await temporaryFile({ name: logFileName }), logStream = createWriteStream(temporaryLogPath, { encoding: "utf8" });
542
+ return new Promise((resolve7, reject) => {
543
+ logStream.once("open", () => {
544
+ let clearLogFile = async () => writeFile2(temporaryLogPath, ""), removeLogFile = async () => rm2(temporaryLogPath, { recursive: !0, force: !0 });
545
+ resolve7({ logStream, moveLogFile: async () => copyFile(temporaryLogPath, finalLogPath).then(removeLogFile), clearLogFile, removeLogFile, readLogFile: async () => readFile2(temporaryLogPath, { encoding: "utf8" }) });
546
+ }), logStream.once("error", reject);
547
+ });
548
+ }, isCorePackage = (pkg) => pkg === "@aussieljk/forkbook" || pkg.startsWith("@aussieljk/forkbook/"), isSatelliteAddon = (pkg) => satellite_addons_default.includes(pkg);
549
+
550
+ // src/common/utils/check-addon-order.ts
551
+ import { logger as logger3 } from "@aussieljk/forkbook/internal/node-logger";
552
+ var predicateFor = (addon) => (entry) => {
553
+ let name = entry.name || entry;
554
+ return name && name.replaceAll(/(\\){1,2}/g, "/").includes(addon);
555
+ }, isCorrectOrder = (addons, before, after) => {
556
+ let essentialsIndex = addons.findIndex(predicateFor("@storybook/addon-essentials")), beforeIndex = addons.findIndex(predicateFor(before.name)), afterIndex = addons.findIndex(predicateFor(after.name));
557
+ return beforeIndex === -1 && before.inEssentials && (beforeIndex = essentialsIndex), afterIndex === -1 && after.inEssentials && (afterIndex = essentialsIndex), beforeIndex !== -1 && afterIndex !== -1 && beforeIndex <= afterIndex;
558
+ }, checkAddonOrder = async ({ before, after, configFile, getConfig }) => {
559
+ try {
560
+ let config = await getConfig(configFile);
561
+ if (!config?.addons) {
562
+ logger3.warn("Unable to find 'addons' config in main Forkbook config");
563
+ return;
564
+ }
565
+ if (!isCorrectOrder(config.addons, before, after)) {
566
+ let orEssentials = " (or '@storybook/addon-essentials')", beforeText = `'${before.name}'${before.inEssentials ? orEssentials : ""}`, afterText = `'${after.name}'${after.inEssentials ? orEssentials : ""}`;
567
+ logger3.warn(
568
+ `Expected ${beforeText} to be listed before ${afterText} in main Forkbook config.`
569
+ );
570
+ }
571
+ } catch {
572
+ logger3.warn(`Unable to load config file: ${configFile}`);
573
+ }
574
+ };
575
+
576
+ // src/common/utils/find-storybook-package-root.ts
577
+ import { readFileSync as readFileSync3, realpathSync } from "node:fs";
578
+ import { fileURLToPath } from "node:url";
579
+ import { dirname, join as join5, normalize } from "pathe";
580
+ var ownDir = normalize(dirname(fileURLToPath(import.meta.url)));
581
+ function findStorybookPackageRoot() {
582
+ let dir = ownDir;
583
+ for (; ; ) {
584
+ if (readManifestName(dir) === "@aussieljk/forkbook")
585
+ try {
586
+ return normalize(realpathSync(dir));
587
+ } catch {
588
+ return;
589
+ }
590
+ let parent = dirname(dir);
591
+ if (parent === dir)
592
+ return;
593
+ dir = parent;
594
+ }
595
+ }
596
+ function readManifestName(dir) {
597
+ try {
598
+ let manifest = JSON.parse(readFileSync3(join5(dir, "package.json"), "utf-8"));
599
+ return typeof manifest.name == "string" ? manifest.name : void 0;
600
+ } catch {
601
+ return;
602
+ }
603
+ }
604
+
605
+ // src/common/utils/common-glob-options.ts
606
+ var NODE_MODULES_RE = /node_modules/, commonGlobOptions = (glob) => NODE_MODULES_RE.test(glob) ? {} : { ignore: ["**/node_modules/**"] };
607
+
608
+ // src/common/utils/deep-merge.ts
609
+ function deepMerge(target, source) {
610
+ let result = { ...target };
611
+ for (let key in source)
612
+ source[key] !== void 0 && source[key] !== null && (typeof source[key] == "object" && !Array.isArray(source[key]) && typeof target[key] == "object" && !Array.isArray(target[key]) && target[key] !== null ? result[key] = deepMerge(target[key], source[key]) : result[key] = source[key]);
613
+ return result;
614
+ }
615
+
616
+ // src/common/utils/get-builder-options.ts
617
+ async function getBuilderOptions(options) {
618
+ let framework = await options.presets.apply("framework", {}, options);
619
+ if (typeof framework != "string" && framework?.options?.builder)
620
+ return framework.options.builder;
621
+ let { builder } = await options.presets.apply("core", {}, options);
622
+ return typeof builder != "string" && builder?.options ? builder.options : {};
623
+ }
624
+
625
+ // src/common/utils/get-storybook-version-specifier-from-ancestry.ts
626
+ var PKG_PR_NEW_CLI_SPECIFIER_IN_TEXT_RE = /https?:\/\/[^/\s'"]*pkg\.pr\.new\/(?:[^@\s/]+\/[^@\s/]+\/)?(?:create-storybook|storybook)@[^\s'"]+/, PACKAGE_AT_SPECIFIER_RE = /\s(?:create-storybook|storybook)@([^\s'"]+)/, stripQuotedUrls = (command) => command.replace(/['"](https?:\/\/[^'"]+)['"]/g, "$1"), getStorybookVersionSpecifierFromAncestry = (ancestry) => {
627
+ for (let ancestor of ancestry.toReversed()) {
628
+ let command = ancestor.command;
629
+ if (!command)
630
+ continue;
631
+ let normalized = stripQuotedUrls(command), pkgPrNewMatch = normalized.match(PKG_PR_NEW_CLI_SPECIFIER_IN_TEXT_RE);
632
+ if (pkgPrNewMatch)
633
+ return pkgPrNewMatch[0];
634
+ let packageAtMatch = normalized.match(PACKAGE_AT_SPECIFIER_RE);
635
+ if (packageAtMatch)
636
+ return packageAtMatch[1];
637
+ }
638
+ };
639
+
640
+ // src/common/utils/resolve-storybook-version-specifier.ts
641
+ var FORKBOOK_VERSION_SPECIFIER_ENV = "FORKBOOK_VERSION_SPECIFIER", resolveStorybookVersionSpecifier = (ancestry = [], env = process.env) => {
642
+ let fromEnv = env[FORKBOOK_VERSION_SPECIFIER_ENV]?.trim();
643
+ return fromEnv || getStorybookVersionSpecifierFromAncestry(ancestry);
644
+ };
645
+
646
+ // src/common/utils/get-storybook-refs.ts
647
+ import { readFile as readFile4 } from "node:fs/promises";
648
+ import { dirname as dirname3 } from "node:path";
649
+
650
+ // src/common/utils/read-dependency-manifest.ts
651
+ import { readFile as readFile3 } from "node:fs/promises";
652
+ import { dirname as dirname2, join as join6 } from "node:path";
653
+ import { logger as logger4 } from "@aussieljk/forkbook/internal/node-logger";
654
+ var readDependencyManifest = async (directory, dependency) => {
655
+ let subpath = from(directory, join6(dependency, "package.json"), !0);
656
+ if (subpath)
657
+ try {
658
+ let manifest = JSON.parse(await readFile3(subpath, { encoding: "utf8" }));
659
+ if (manifest?.name)
660
+ return manifest;
661
+ } catch {
662
+ }
663
+ let entry = from(directory, dependency, !0);
664
+ if (!entry) {
665
+ logger4.debug(`readDependencyManifest: could not resolve "${dependency}"`);
666
+ return;
667
+ }
668
+ let dir = dirname2(entry);
669
+ for (; ; ) {
670
+ try {
671
+ let manifest = JSON.parse(await readFile3(join6(dir, "package.json"), { encoding: "utf8" }));
672
+ if (manifest?.name)
673
+ return manifest;
674
+ } catch {
675
+ }
676
+ let parent = dirname2(dir);
677
+ if (parent === dir)
678
+ return;
679
+ dir = parent;
680
+ }
681
+ };
682
+
683
+ // src/common/utils/get-storybook-refs.ts
684
+ var getAutoRefs = async (options) => {
685
+ let location = up3({ cwd: options.configDir, last: getProjectRoot() });
686
+ if (!location)
687
+ return {};
688
+ let directory = dirname3(location), { dependencies = [], devDependencies = [] } = JSON.parse(await readFile4(location, { encoding: "utf8" })) || {}, deps = Object.keys({ ...dependencies, ...devDependencies });
689
+ return (await Promise.all(
690
+ deps.map(async (d) => {
691
+ let manifest = await readDependencyManifest(directory, d);
692
+ if (manifest?.storybook?.url)
693
+ return { id: manifest.name, ...manifest.storybook, version: manifest.version };
694
+ })
695
+ )).filter(Boolean).reduce(
696
+ (acc, cur) => ({
697
+ ...acc,
698
+ [cur.id]: {
699
+ id: cur.id.toLowerCase(),
700
+ url: stripTrailingSlash(cur.url),
701
+ title: cur.title,
702
+ version: cur.version
703
+ }
704
+ }),
705
+ {}
706
+ );
707
+ }, checkRef = async (url) => {
708
+ try {
709
+ let { ok, status } = await fetch(`${url}/iframe.html`);
710
+ if (!ok || status !== 200)
711
+ return !1;
712
+ let data = await fetch(`${url}/iframe.html`, {
713
+ headers: { Accept: "application/json" }
714
+ });
715
+ return data.ok ? !(await data.json().catch(() => ({}))).loginUrl : !0;
716
+ } catch {
717
+ return !1;
718
+ }
719
+ }, stripTrailingSlash = (url) => url.replace(/\/$/, ""), toTitle = (input) => {
720
+ let result = input.replace(/[A-Z]/g, (f) => ` ${f}`).replace(/[-_][A-Z]/gi, (f) => ` ${f.toUpperCase()}`).replace(/-/g, " ").replace(/_/g, " ");
721
+ return `${result.substring(0, 1).toUpperCase()}${result.substring(1)}`.trim();
722
+ };
723
+ async function getRefs(options) {
724
+ if (options.test)
725
+ return {};
726
+ let refs = await options.presets.apply("refs", await getAutoRefs(options));
727
+ return Object.entries(refs).forEach(([key, value]) => {
728
+ if (value.disable) {
729
+ delete refs[key];
730
+ return;
731
+ }
732
+ refs[key.toLowerCase()] = {
733
+ ...value,
734
+ id: key.toLowerCase(),
735
+ title: value.title || toTitle(value.id || key),
736
+ url: stripTrailingSlash(value.url)
737
+ };
738
+ }), await Promise.all(
739
+ Object.entries(refs).map(async ([k, value]) => {
740
+ let ok = await checkRef(value.url);
741
+ refs[k] = { ...value, type: ok ? "server-checked" : "unknown" };
742
+ })
743
+ ), refs;
744
+ }
745
+
746
+ // src/common/utils/glob-to-regexp.ts
747
+ var pico = __toESM(require_picomatch(), 1);
748
+ function globToRegexp(glob) {
749
+ let regex = pico.makeRe(glob, {
750
+ fastpaths: !1,
751
+ noglobstar: !1,
752
+ bash: !1
753
+ });
754
+ if (!regex.source.startsWith("^"))
755
+ throw new Error(`Invalid glob: >> ${glob} >> ${regex}`);
756
+ return glob.startsWith("./") ? new RegExp(
757
+ ["^\\.", glob.startsWith("./**") ? "" : "[\\\\/]", regex.source.substring(1)].join("")
758
+ ) : regex;
759
+ }
760
+
761
+ // src/common/utils/interpolate.ts
762
+ var interpolate = (template, bindings) => Object.entries(bindings).reduce((acc, [k, v]) => {
763
+ let escapedString = v.replace(/\\/g, "/").replace(/\$/g, "$$$");
764
+ return acc.replace(new RegExp(`{{${k}}}`, "g"), escapedString);
765
+ }, template);
766
+
767
+ // src/common/utils/load-manager-or-addons-file.ts
768
+ import { resolve as resolve2 } from "node:path";
769
+ import { logger as logger5 } from "@aussieljk/forkbook/internal/node-logger";
770
+ import { dedent as dedent2 } from "ts-dedent";
771
+ function loadManagerOrAddonsFile({ configDir }) {
772
+ let storybookCustomAddonsPath = getInterpretedFile(resolve2(configDir, "addons")), storybookCustomManagerPath = getInterpretedFile(resolve2(configDir, "manager"));
773
+ if ((storybookCustomAddonsPath || storybookCustomManagerPath) && logger5.step("Loading custom manager config"), storybookCustomAddonsPath && storybookCustomManagerPath)
774
+ throw new Error(dedent2`
775
+ You have both a "addons.js" and a "manager.js", remove the "addons.js" file from your configDir (${resolve2(
776
+ configDir,
777
+ "addons"
778
+ )})`);
779
+ return storybookCustomManagerPath || storybookCustomAddonsPath;
780
+ }
781
+
782
+ // src/common/utils/load-preview-or-config-file.ts
783
+ import { resolve as resolve3 } from "node:path";
784
+ import { dedent as dedent3 } from "ts-dedent";
785
+ function loadPreviewOrConfigFile({ configDir }) {
786
+ let storybookConfigPath = getInterpretedFile(resolve3(configDir, "config")), storybookPreviewPath = getInterpretedFile(resolve3(configDir, "preview"));
787
+ if (storybookConfigPath && storybookPreviewPath)
788
+ throw new Error(dedent3`
789
+ You have both a "config.js" and a "preview.js", remove the "config.js" file from your configDir (${resolve3(
790
+ configDir,
791
+ "config"
792
+ )})`);
793
+ return storybookPreviewPath || storybookConfigPath;
794
+ }
795
+
796
+ // src/common/utils/log-config.ts
797
+ var import_picocolors = __toESM(require_picocolors(), 1);
798
+ function logConfig(caption, config) {
799
+ console.log(import_picocolors.default.cyan(String(caption))), console.dir(config, { depth: null });
800
+ }
801
+
802
+ // src/common/utils/normalize-stories.ts
803
+ var pico2 = __toESM(require_picomatch(), 1);
804
+ import { lstatSync } from "node:fs";
805
+ import { basename, dirname as dirname4, relative, resolve as resolve4 } from "node:path";
806
+ import { InvalidStoriesEntryError } from "@aussieljk/forkbook/internal/server-errors";
807
+ var DEFAULT_TITLE_PREFIX = "", DEFAULT_FILES_PATTERN = "**/*.@(mdx|stories.@(js|jsx|mjs|ts|tsx))", isDirectory = (configDir, entry) => {
808
+ try {
809
+ return lstatSync(resolve4(configDir, entry)).isDirectory();
810
+ } catch {
811
+ return !1;
812
+ }
813
+ }, getDirectoryFromWorkingDir = ({
814
+ configDir,
815
+ workingDir,
816
+ directory
817
+ }) => {
818
+ let directoryFromConfig = resolve4(configDir, directory), directoryFromWorking = relative(workingDir, directoryFromConfig);
819
+ return normalizeStoryPath(directoryFromWorking);
820
+ }, normalizeStoriesEntry = (entry, { configDir, workingDir, defaultFilesPattern = DEFAULT_FILES_PATTERN }) => {
821
+ let specifierWithoutMatcher;
822
+ if (typeof entry == "string") {
823
+ let globResult = pico2.scan(entry);
824
+ if (globResult.isGlob) {
825
+ let directory2 = globResult.prefix + globResult.base, files2 = globResult.glob;
826
+ specifierWithoutMatcher = {
827
+ titlePrefix: DEFAULT_TITLE_PREFIX,
828
+ directory: directory2,
829
+ files: files2
830
+ };
831
+ } else isDirectory(configDir, entry) ? specifierWithoutMatcher = {
832
+ titlePrefix: DEFAULT_TITLE_PREFIX,
833
+ directory: entry,
834
+ files: defaultFilesPattern
835
+ } : specifierWithoutMatcher = {
836
+ titlePrefix: DEFAULT_TITLE_PREFIX,
837
+ directory: dirname4(entry),
838
+ files: basename(entry)
839
+ };
840
+ } else
841
+ specifierWithoutMatcher = {
842
+ titlePrefix: DEFAULT_TITLE_PREFIX,
843
+ files: defaultFilesPattern,
844
+ ...entry
845
+ };
846
+ let files = slash(specifierWithoutMatcher.files), { directory: directoryRelativeToConfig } = specifierWithoutMatcher, directory = slash(
847
+ getDirectoryFromWorkingDir({
848
+ configDir,
849
+ workingDir,
850
+ directory: directoryRelativeToConfig
851
+ })
852
+ ).replace(/\/$/, ""), importPathMatcher = globToRegexp(`${directory}/${files}`);
853
+ return {
854
+ ...specifierWithoutMatcher,
855
+ directory,
856
+ importPathMatcher
857
+ };
858
+ }, normalizeStories = (entries, options) => {
859
+ if (!entries || Array.isArray(entries) && entries.length === 0)
860
+ throw new InvalidStoriesEntryError();
861
+ return entries.map((entry) => normalizeStoriesEntry(entry, options));
862
+ };
863
+
864
+ // src/common/utils/readTemplate.ts
865
+ import { readFile as readFile5 } from "node:fs/promises";
866
+ async function readTemplate(filename) {
867
+ return readFile5(filename, {
868
+ encoding: "utf8"
869
+ });
870
+ }
871
+
872
+ // src/common/utils/resolve-meta-component.ts
873
+ import { types as t } from "@aussieljk/forkbook/internal/babel";
874
+ var unwrapComponentExpression = (node) => {
875
+ let unwrapped = unwrapExpression(node);
876
+ return t.isTSInstantiationExpression(unwrapped) ? unwrapComponentExpression(unwrapped.expression) : unwrapped;
877
+ };
878
+ function createMetaComponentResolver(options = {}) {
879
+ let resolver = createModuleResolver({
880
+ extensions: [...options.extensions ?? [], ...jsTsSourceExtensions],
881
+ mainFields: ["module", "main"],
882
+ tsconfig: "auto"
883
+ }), resolveFile = (fromFile, specifier) => {
884
+ try {
885
+ return resolver.resolveFileSync(fromFile, specifier);
886
+ } catch {
887
+ return;
888
+ }
889
+ }, resolveModule = (fromFile, specifier) => {
890
+ let filePath = resolveFile(fromFile, specifier);
891
+ return filePath ? parseReferenceModule(filePath) : void 0;
892
+ }, fromIdentifier = (module, localName) => {
893
+ let binding = findImport(module.program, localName);
894
+ if (binding.kind === "unsupported" || binding.kind === "namespace")
895
+ return { reason: "no-component-import" };
896
+ if (binding.kind === "local")
897
+ return { component: { localName, exportName: localName, path: module.filePath } };
898
+ let { importId, exportName } = binding;
899
+ return {
900
+ component: { localName, importId, exportName, path: resolveFile(module.filePath, importId) }
901
+ };
902
+ };
903
+ return function(csf, storyPath) {
904
+ let node = csf._metaAnnotations.component;
905
+ if (!node)
906
+ return { reason: "no-meta-component" };
907
+ let storyModule = { program: csf._file.path, filePath: storyPath }, expression = unwrapComponentExpression(node);
908
+ if (t.isIdentifier(expression))
909
+ return fromIdentifier(storyModule, expression.name);
910
+ if (t.isMemberExpression(expression) && !expression.computed && t.isIdentifier(expression.object) && t.isIdentifier(expression.property)) {
911
+ let namespace = findImport(csf._file.path, expression.object.name);
912
+ if (namespace.kind === "namespace") {
913
+ let exportName = expression.property.name;
914
+ return {
915
+ component: {
916
+ localName: exportName,
917
+ importId: namespace.importId,
918
+ exportName,
919
+ path: resolveFile(storyPath, namespace.importId)
920
+ }
921
+ };
922
+ }
923
+ }
924
+ let referenced = resolveReferencedValue(
925
+ {
926
+ ...storyModule,
927
+ resolveModule,
928
+ externalize: (n) => isSelfContained(n) ? n : void 0
929
+ },
930
+ expression
931
+ );
932
+ if (referenced) {
933
+ let value = unwrapComponentExpression(referenced.node);
934
+ if (t.isIdentifier(value))
935
+ return fromIdentifier(referenced.ctx, value.name);
936
+ }
937
+ return { reason: "unreadable-component-expression", expression: sourceOf(node) };
938
+ };
939
+ }
940
+ function findImport(program, localName) {
941
+ for (let statement of program.get("body"))
942
+ if (statement.isImportDeclaration())
943
+ for (let specifier of statement.node.specifiers) {
944
+ if (specifier.local.name !== localName)
945
+ continue;
946
+ if (statement.node.importKind === "type")
947
+ return { kind: "unsupported" };
948
+ let importId = statement.node.source.value;
949
+ return t.isImportNamespaceSpecifier(specifier) ? { kind: "namespace", importId } : t.isImportDefaultSpecifier(specifier) ? { kind: "import", importId, exportName: "default" } : specifier.importKind === "type" ? { kind: "unsupported" } : {
950
+ kind: "import",
951
+ importId,
952
+ exportName: t.isIdentifier(specifier.imported) ? specifier.imported.name : specifier.imported.value
953
+ };
954
+ }
955
+ return { kind: "local" };
956
+ }
957
+
958
+ // src/common/utils/subcomponents.ts
959
+ import { types as t2 } from "@aussieljk/forkbook/internal/babel";
960
+ function extractDeclaredSubcomponents(csf) {
961
+ let rawSubcomponents = unwrapSubcomponentNode(
962
+ csf._metaAnnotations.subcomponents,
963
+ csf._ast.program
964
+ );
965
+ return !rawSubcomponents || !t2.isObjectExpression(rawSubcomponents) ? [] : rawSubcomponents.properties.flatMap((property) => {
966
+ if (!t2.isObjectProperty(property))
967
+ return [];
968
+ let name = getObjectKeyName(property.key), directComponentName = getComponentExpressionName(property.value), componentExpression = unwrapSubcomponentNode(property.value, csf._ast.program), componentName = getComponentExpressionName(componentExpression) ?? directComponentName;
969
+ return name && componentName ? [{ name, componentName }] : [];
970
+ });
971
+ }
972
+ function findVariableInitialization(identifier, program) {
973
+ for (let node of program.body) {
974
+ let declaration = (t2.isVariableDeclaration(node) ? node.declarations : t2.isExportNamedDeclaration(node) && t2.isVariableDeclaration(node.declaration) ? node.declaration.declarations : void 0)?.find(
975
+ (decl) => t2.isVariableDeclarator(decl) && t2.isIdentifier(decl.id) && decl.id.name === identifier
976
+ );
977
+ if (declaration?.init && t2.isExpression(declaration.init))
978
+ return declaration.init;
979
+ }
980
+ }
981
+ function unwrapSubcomponentNode(node, program, visitedIdentifiers = /* @__PURE__ */ new Set()) {
982
+ let current = node;
983
+ for (; current; ) {
984
+ if (t2.isIdentifier(current)) {
985
+ if (visitedIdentifiers.has(current.name))
986
+ return;
987
+ visitedIdentifiers.add(current.name), current = findVariableInitialization(current.name, program);
988
+ continue;
989
+ }
990
+ if (t2.isParenthesizedExpression(current) || t2.isTSAsExpression(current) || t2.isTSSatisfiesExpression(current) || t2.isTSNonNullExpression(current)) {
991
+ current = current.expression;
992
+ continue;
993
+ }
994
+ return current;
995
+ }
996
+ }
997
+ function getObjectKeyName(key) {
998
+ if (t2.isIdentifier(key))
999
+ return key.name;
1000
+ if (t2.isStringLiteral(key))
1001
+ return key.value;
1002
+ }
1003
+ function getComponentExpressionName(node) {
1004
+ if (node) {
1005
+ if (t2.isIdentifier(node))
1006
+ return node.name;
1007
+ if (t2.isMemberExpression(node) && !node.computed) {
1008
+ let objectName = getComponentExpressionName(node.object), propertyName = getComponentExpressionName(node.property);
1009
+ return objectName && propertyName ? `${objectName}.${propertyName}` : void 0;
1010
+ }
1011
+ }
1012
+ }
1013
+
1014
+ // src/common/utils/remove.ts
1015
+ import { readConfig, writeConfig } from "@aussieljk/forkbook/internal/csf-tools";
1016
+ import { logger as logger6 } from "@aussieljk/forkbook/internal/node-logger";
1017
+ import { dedent as dedent4 } from "ts-dedent";
1018
+ async function removeAddon(addon, options) {
1019
+ let { packageManager, skipInstall } = options, { mainConfigPath, configDir } = getConfigInfo(options.configDir);
1020
+ if (typeof configDir > "u")
1021
+ throw new Error(dedent4`
1022
+ Unable to find storybook config directory
1023
+ `);
1024
+ if (!mainConfigPath) {
1025
+ logger6.error("Unable to find storybook main.js config");
1026
+ return;
1027
+ }
1028
+ let main = await readConfig(mainConfigPath);
1029
+ logger6.debug(`Uninstalling ${addon}`), await packageManager.removeDependencies([addon]), skipInstall || await packageManager.installDependencies();
1030
+ try {
1031
+ let entries = (main.getNamesFromPath(["addons"]) ?? []).filter(
1032
+ (name) => normalizeAddonName(name) === addon
1033
+ );
1034
+ entries.length > 0 && (logger6.debug(`Removing '${addon}' from main.js addons field.`), entries.forEach((entry) => main.removeEntryFromArray(["addons"], entry)), await writeConfig(main));
1035
+ } catch (err) {
1036
+ logger6.warn(`Failed to remove '${addon}' from main.js addons field. ${String(err)}`);
1037
+ }
1038
+ }
1039
+
1040
+ // src/common/utils/symlinks.ts
1041
+ function isPreservingSymlinks() {
1042
+ let { NODE_OPTIONS, NODE_PRESERVE_SYMLINKS } = process.env;
1043
+ return !!NODE_PRESERVE_SYMLINKS || NODE_OPTIONS?.includes("--preserve-symlinks");
1044
+ }
1045
+
1046
+ // src/common/utils/template.ts
1047
+ import { existsSync, readFileSync as readFileSync4 } from "node:fs";
1048
+ import { join as join7, resolve as resolve5 } from "pathe";
1049
+ var interpolate2 = (string, data = {}) => Object.entries(data).reduce((acc, [k, v]) => acc.replace(new RegExp(`%${k}%`, "g"), v), string);
1050
+ function getPreviewBodyTemplate(configDirPath, interpolations) {
1051
+ let base = readFileSync4(
1052
+ join7(resolvePackageDir("@aussieljk/forkbook"), "assets/server/base-preview-body.html"),
1053
+ "utf8"
1054
+ ), bodyHtmlPath = resolve5(configDirPath, "preview-body.html"), result = base;
1055
+ return existsSync(bodyHtmlPath) && (result = readFileSync4(bodyHtmlPath, "utf8") + result), interpolate2(result, interpolations);
1056
+ }
1057
+ function getPreviewHeadTemplate(configDirPath, interpolations) {
1058
+ let base = readFileSync4(
1059
+ join7(resolvePackageDir("@aussieljk/forkbook"), "assets/server/base-preview-head.html"),
1060
+ "utf8"
1061
+ ), headHtmlPath = resolve5(configDirPath, "preview-head.html"), result = base;
1062
+ return existsSync(headHtmlPath) && (result += readFileSync4(headHtmlPath, "utf8")), interpolate2(result, interpolations);
1063
+ }
1064
+
1065
+ // src/common/utils/tsconfig.ts
1066
+ import { existsSync as existsSync2, readFileSync as readFileSync5, statSync } from "node:fs";
1067
+ import { basename as basename2, dirname as dirname5, extname, relative as relative2, resolve as resolve6 } from "node:path";
1068
+ var import_picomatch = __toESM(require_picomatch(), 1);
1069
+ var TSCONFIG_CANDIDATES = ["tsconfig.json", "tsconfig.base.json", "tsconfig.app.json"], DEFAULT_EXCLUDE_PATTERNS = ["node_modules", "bower_components", "jspm_packages"], findTsconfigPath = (cwd) => {
1070
+ let projectRoot = getProjectRoot();
1071
+ for (let candidate of TSCONFIG_CANDIDATES) {
1072
+ let found = up2(candidate, { cwd, last: projectRoot });
1073
+ if (found)
1074
+ return found;
1075
+ }
1076
+ }, findTsconfigPathForFile = (cwd, filePath) => {
1077
+ let rootTsconfigPath = findTsconfigPath(cwd);
1078
+ if (!rootTsconfigPath)
1079
+ return;
1080
+ let absoluteFilePath = resolve6(filePath), matchingConfigs = collectTsconfigEntries(rootTsconfigPath, /* @__PURE__ */ new Set()).filter(
1081
+ (entry) => tsconfigIncludesFile(entry, absoluteFilePath)
1082
+ );
1083
+ return matchingConfigs.sort((left, right) => compareTsconfigEntries(absoluteFilePath, left, right)), matchingConfigs[0]?.path ?? rootTsconfigPath;
1084
+ }, findTsconfigPathForPath = (path) => isDirectoryPath(path) ? findTsconfigPath(path) : findTsconfigPathForFile(dirname5(path), path), getTsconfigPathsBaseDir = (configPath) => {
1085
+ let normalizedConfigPath = resolve6(configPath), resolved = resolvePathsBase(normalizedConfigPath, /* @__PURE__ */ new Set());
1086
+ return resolved.absoluteBaseUrl ?? resolved.pathsBasePath ?? dirname5(normalizedConfigPath);
1087
+ };
1088
+ function resolvePathsBase(configPath, seen) {
1089
+ let normalizedConfigPath = resolve6(configPath);
1090
+ if (seen.has(normalizedConfigPath))
1091
+ return {};
1092
+ seen.add(normalizedConfigPath);
1093
+ let config = readTsconfigConfig(normalizedConfigPath);
1094
+ if (!config)
1095
+ return {};
1096
+ let inherited = {};
1097
+ for (let extendsPath of getExtendsPaths(normalizedConfigPath, config)) {
1098
+ let base = resolvePathsBase(extendsPath, seen);
1099
+ inherited = {
1100
+ absoluteBaseUrl: base.absoluteBaseUrl ?? inherited.absoluteBaseUrl,
1101
+ pathsBasePath: base.pathsBasePath ?? inherited.pathsBasePath
1102
+ };
1103
+ }
1104
+ let ownBaseUrl = config.compilerOptions?.baseUrl, ownPaths = config.compilerOptions?.paths;
1105
+ return {
1106
+ absoluteBaseUrl: typeof ownBaseUrl == "string" && ownBaseUrl.length > 0 ? resolve6(dirname5(normalizedConfigPath), ownBaseUrl) : inherited.absoluteBaseUrl,
1107
+ pathsBasePath: ownPaths != null && typeof ownPaths == "object" ? dirname5(normalizedConfigPath) : inherited.pathsBasePath
1108
+ };
1109
+ }
1110
+ function isDirectoryPath(path) {
1111
+ try {
1112
+ if (existsSync2(path))
1113
+ return statSync(path).isDirectory();
1114
+ } catch {
1115
+ }
1116
+ return extname(path) === "";
1117
+ }
1118
+ function collectTsconfigEntries(configPath, seen) {
1119
+ let normalizedConfigPath = resolve6(configPath);
1120
+ if (seen.has(normalizedConfigPath))
1121
+ return [];
1122
+ seen.add(normalizedConfigPath);
1123
+ let config = readTsconfigConfig(normalizedConfigPath);
1124
+ return config ? [
1125
+ { path: normalizedConfigPath, config },
1126
+ ...getReferencedTsconfigPaths(normalizedConfigPath, config).flatMap(
1127
+ (referencePath) => collectTsconfigEntries(referencePath, seen)
1128
+ )
1129
+ ] : [];
1130
+ }
1131
+ function getReferencedTsconfigPaths(configPath, config) {
1132
+ return (Array.isArray(config.references) ? config.references : []).map((reference) => reference.path).filter((referencePath) => typeof referencePath == "string").map((referencePath) => resolve6(dirname5(configPath), referencePath)).flatMap((referencePath) => resolveReferenceConfigPaths(referencePath));
1133
+ }
1134
+ function resolveReferenceConfigPaths(referencePath) {
1135
+ return referencePath.endsWith(".json") ? [referencePath] : TSCONFIG_CANDIDATES.map((candidate) => resolve6(referencePath, candidate));
1136
+ }
1137
+ function tsconfigIncludesFile(entry, filePath) {
1138
+ let configDir = dirname5(entry.path), relativeFilePath = normalizePath2(relative2(configDir, filePath));
1139
+ if (relativeFilePath.startsWith("../") || relativeFilePath === ".." || isReferencesShell(entry.config))
1140
+ return !1;
1141
+ let ownership = resolveOwnershipSpec(entry.path, entry.config, /* @__PURE__ */ new Set());
1142
+ if (ownership.files && ownership.files.length > 0) {
1143
+ let normalizedFilePath = normalizePath2(filePath);
1144
+ return ownership.files.some(
1145
+ (candidatePath) => normalizePath2(resolve6(configDir, candidatePath)) === normalizedFilePath
1146
+ );
1147
+ }
1148
+ let includePatterns = getIncludePatterns(ownership, entry.config);
1149
+ if (includePatterns.length === 0)
1150
+ return !1;
1151
+ let excludePatterns = [
1152
+ ...DEFAULT_EXCLUDE_PATTERNS,
1153
+ ...(ownership.exclude ?? []).map(normalizeTsconfigPattern)
1154
+ ];
1155
+ return matchesPatterns(relativeFilePath, excludePatterns) ? !1 : matchesPatterns(relativeFilePath, includePatterns);
1156
+ }
1157
+ function resolveOwnershipSpec(configPath, config, seen) {
1158
+ let normalizedConfigPath = resolve6(configPath);
1159
+ if (seen.has(normalizedConfigPath))
1160
+ return {};
1161
+ seen.add(normalizedConfigPath);
1162
+ let ownership = {};
1163
+ for (let extendsPath of getExtendsPaths(normalizedConfigPath, config)) {
1164
+ let baseConfig = readTsconfigConfig(extendsPath);
1165
+ if (!baseConfig)
1166
+ continue;
1167
+ let baseOwnership = resolveOwnershipSpec(extendsPath, baseConfig, seen);
1168
+ ownership = mergeOwnershipSpec(
1169
+ ownership,
1170
+ rebaseOwnershipSpec(baseOwnership, dirname5(extendsPath), dirname5(normalizedConfigPath))
1171
+ );
1172
+ }
1173
+ return mergeOwnershipSpec(ownership, ownOwnershipSpec(config));
1174
+ }
1175
+ function getExtendsPaths(configPath, config) {
1176
+ return (typeof config.extends == "string" ? [config.extends] : Array.isArray(config.extends) ? config.extends.filter((value) => typeof value == "string") : []).map((extendsPath) => resolveExtendsPath(configPath, extendsPath));
1177
+ }
1178
+ function resolveExtendsPath(configPath, extendsPath) {
1179
+ let resolved = resolve6(dirname5(configPath), extendsPath);
1180
+ if (existsSync2(resolved))
1181
+ return resolved;
1182
+ if (!resolved.endsWith(".json")) {
1183
+ let withJson = `${resolved}.json`;
1184
+ if (existsSync2(withJson))
1185
+ return withJson;
1186
+ }
1187
+ return resolved;
1188
+ }
1189
+ function ownOwnershipSpec(config) {
1190
+ let ownership = {};
1191
+ return config.files !== void 0 && (ownership.files = asStringArray(config.files).map(normalizePath2)), config.include !== void 0 && (ownership.include = asStringArray(config.include).map(normalizePath2)), config.exclude !== void 0 && (ownership.exclude = asStringArray(config.exclude).map(normalizePath2)), ownership;
1192
+ }
1193
+ function mergeOwnershipSpec(base, overlay) {
1194
+ return {
1195
+ files: overlay.files !== void 0 ? overlay.files : base.files,
1196
+ include: overlay.include !== void 0 ? overlay.include : base.include,
1197
+ exclude: overlay.exclude !== void 0 ? overlay.exclude : base.exclude
1198
+ };
1199
+ }
1200
+ function rebaseOwnershipSpec(ownership, fromDir, toDir) {
1201
+ return {
1202
+ files: ownership.files?.map((pattern) => rebasePattern(pattern, fromDir, toDir)),
1203
+ include: ownership.include?.map((pattern) => rebasePattern(pattern, fromDir, toDir)),
1204
+ exclude: ownership.exclude?.map((pattern) => rebasePattern(pattern, fromDir, toDir))
1205
+ };
1206
+ }
1207
+ function rebasePattern(pattern, fromDir, toDir) {
1208
+ return normalizePath2(relative2(toDir, resolve6(fromDir, pattern)));
1209
+ }
1210
+ function isReferencesShell(config) {
1211
+ if (!Array.isArray(config.references))
1212
+ return !1;
1213
+ let hasOwnFiles = Array.isArray(config.files) && config.files.length > 0, hasOwnInclude = Array.isArray(config.include) && config.include.length > 0;
1214
+ return !hasOwnFiles && !hasOwnInclude;
1215
+ }
1216
+ function getIncludePatterns(ownership, leafConfig) {
1217
+ return ownership.include && ownership.include.length > 0 ? ownership.include.map(normalizeTsconfigPattern) : ownership.files && ownership.files.length > 0 ? ownership.files.map(normalizePath2) : Array.isArray(leafConfig.files) && leafConfig.files.length === 0 && !ownership.include ? [] : ["**/*"];
1218
+ }
1219
+ function compareTsconfigEntries(filePath, left, right) {
1220
+ let leftDir = dirname5(left.path), rightDir = dirname5(right.path), leftDepth = normalizePath2(relative2(leftDir, filePath)).split("/").length, rightDepth = normalizePath2(relative2(rightDir, filePath)).split("/").length;
1221
+ if (leftDepth !== rightDepth)
1222
+ return leftDepth - rightDepth;
1223
+ let leftIsPrimaryTsconfig = basename2(left.path) === "tsconfig.json" ? 1 : 0;
1224
+ return (basename2(right.path) === "tsconfig.json" ? 1 : 0) - leftIsPrimaryTsconfig;
1225
+ }
1226
+ function readTsconfigConfig(configPath) {
1227
+ try {
1228
+ let content = readFileSync5(configPath, "utf-8");
1229
+ return JSON.parse(stripJsonComments(content, { trailingCommas: !0 }));
1230
+ } catch {
1231
+ return;
1232
+ }
1233
+ }
1234
+ function matchesPatterns(filePath, patterns) {
1235
+ return patterns.some((pattern) => (0, import_picomatch.default)(pattern, { dot: !0 })(filePath));
1236
+ }
1237
+ function normalizeTsconfigPattern(pattern) {
1238
+ let normalizedPattern = normalizePath2(pattern);
1239
+ return normalizedPattern.endsWith("/") ? `${normalizedPattern}**/*` : !import_picomatch.default.scan(normalizedPattern).isGlob && !/\.[^/]+$/.test(normalizedPattern) ? `${normalizedPattern}/**/*` : normalizedPattern;
1240
+ }
1241
+ function normalizePath2(value) {
1242
+ return value.replaceAll("\\", "/");
1243
+ }
1244
+ function asStringArray(value) {
1245
+ return Array.isArray(value) ? value.filter((item) => typeof item == "string") : [];
1246
+ }
1247
+
1248
+ // src/common/utils/validate-config.ts
1249
+ import {
1250
+ CouldNotEvaluateFrameworkError,
1251
+ InvalidFrameworkNameError,
1252
+ MissingFrameworkFieldError
1253
+ } from "@aussieljk/forkbook/internal/server-errors";
1254
+ var rendererNames = ["react", "@aussieljk/forkbook/react"];
1255
+ function validateFrameworkName(frameworkName) {
1256
+ if (!frameworkName)
1257
+ throw new MissingFrameworkFieldError();
1258
+ if (rendererNames.includes(frameworkName))
1259
+ throw new InvalidFrameworkNameError({ frameworkName });
1260
+ let normalizedFrameworkName = extractFrameworkPackageName(frameworkName);
1261
+ if (!Object.keys(frameworkPackages).includes(normalizedFrameworkName))
1262
+ try {
1263
+ resolveModulePath(`${frameworkName}/preset`, {
1264
+ extensions: [...jsModuleExtensions],
1265
+ conditions: ["node", "import", "require"]
1266
+ });
1267
+ } catch {
1268
+ throw new CouldNotEvaluateFrameworkError({ frameworkName });
1269
+ }
1270
+ }
1271
+
1272
+ // src/common/utils/babel.ts
1273
+ import { readFileSync as readFileSync6 } from "node:fs";
1274
+ import { createRequire } from "node:module";
1275
+ import { logger as logger7 } from "@aussieljk/forkbook/internal/node-logger";
1276
+ var require2 = createRequire(import.meta.url), getBabelPresetEnvMajor = () => {
1277
+ try {
1278
+ let pkgPath = require2.resolve("@babel/preset-env/package.json"), { version } = JSON.parse(readFileSync6(pkgPath, "utf8")), parsed = Number.parseInt(version, 10);
1279
+ return Number.isNaN(parsed) ? void 0 : parsed;
1280
+ } catch {
1281
+ logger7.debug(
1282
+ "Could not determine @babel/preset-env version in use. In case of runtime errors with @babel/preset-env, you may need to set the babelRemoveBugfixes feature flag in your `main.ts` file."
1283
+ );
1284
+ return;
1285
+ }
1286
+ };
1287
+
1288
+ // src/common/utils/formatter.ts
1289
+ import { readFileSync as readFileSync7 } from "node:fs";
1290
+ import { dirname as dirname6 } from "node:path";
1291
+ import { parse as parse2 } from "jsonc-parser";
1292
+ import { format } from "oxfmt";
1293
+ var CONFIG_FILES = [".oxfmtrc.json", ".oxfmtrc.jsonc"];
1294
+ async function formatCode(filePath, content, options = {}) {
1295
+ try {
1296
+ let { code, errors } = await format(filePath, content, options);
1297
+ return errors.length > 0 ? content : code;
1298
+ } catch {
1299
+ return content;
1300
+ }
1301
+ }
1302
+ async function formatFileContent(filePath, content) {
1303
+ let configPath = any(CONFIG_FILES, { cwd: dirname6(filePath) });
1304
+ if (!configPath)
1305
+ return content;
1306
+ let { $schema, ignorePatterns, overrides, ...options } = parse2(
1307
+ readFileSync7(configPath, "utf8")
1308
+ );
1309
+ return formatCode(filePath, content, options);
1310
+ }
1311
+
1312
+ // src/common/utils/get-story-id.ts
1313
+ import { relative as relative3 } from "node:path";
1314
+ import { normalizeStories as normalizeStories2, normalizeStoryPath as normalizeStoryPath2 } from "@aussieljk/forkbook/internal/common";
1315
+ import { sanitize as sanitize2, storyNameFromExport, toId } from "@aussieljk/forkbook/internal/csf/csf-utils";
1316
+ import { dedent as dedent5 } from "ts-dedent";
1317
+
1318
+ // src/shared/story-index/autoTitle.ts
1319
+ var sanitize = (parts) => {
1320
+ if (parts.length === 0)
1321
+ return parts;
1322
+ let last = parts[parts.length - 1], lastStripped = last?.replace(/(?:[.](?:story|stories))?([.][^.]+)$/i, "");
1323
+ if (parts.length === 1)
1324
+ return [lastStripped];
1325
+ let nextToLast = parts[parts.length - 2];
1326
+ return lastStripped && nextToLast && lastStripped.toLowerCase() === nextToLast.toLowerCase() ? [...parts.slice(0, -2), lastStripped] : lastStripped && (/^(story|stories)([.][^.]+)$/i.test(last) || /^index$/i.test(lastStripped)) ? parts.slice(0, -1) : [...parts.slice(0, -1), lastStripped];
1327
+ };
1328
+ function pathJoin(paths) {
1329
+ return paths.flatMap((p) => p.split("/")).filter(Boolean).join("/");
1330
+ }
1331
+ var userOrAutoTitleFromSpecifier = (fileName, entry, userTitle) => {
1332
+ let { directory, importPathMatcher, titlePrefix = "" } = entry || {}, normalizedFileName = slash(String(fileName));
1333
+ if (importPathMatcher.exec(normalizedFileName)) {
1334
+ if (!userTitle) {
1335
+ let suffix = normalizedFileName.replace(directory, ""), parts = pathJoin([titlePrefix, suffix]).split("/");
1336
+ return parts = sanitize(parts), parts.join("/");
1337
+ }
1338
+ return titlePrefix ? pathJoin([titlePrefix, userTitle]) : userTitle;
1339
+ }
1340
+ };
1341
+
1342
+ // src/common/utils/posix.ts
1343
+ import { posix as posixPath, sep as sep2 } from "node:path";
1344
+ var posix2 = (localPath, seperator = sep2) => localPath.split(seperator).filter(Boolean).join(posixPath.sep);
1345
+
1346
+ // src/common/utils/get-story-id.ts
1347
+ async function getStoryId(data, options) {
1348
+ let stories = await options.presets.apply("stories", [], options), autoTitle = getStoryTitle({
1349
+ ...data,
1350
+ stories,
1351
+ configDir: options.configDir
1352
+ });
1353
+ if (autoTitle === void 0)
1354
+ throw new Error(dedent5`
1355
+ The new story file was successfully generated, but we are unable to index it. Please ensure that the new Story file is matched by the 'stories' glob pattern in your Forkbook configuration.
1356
+ `);
1357
+ let storyName = storyNameFromExport(data.exportedStoryName), storyId = toId(autoTitle, storyName), kind = sanitize2(autoTitle);
1358
+ return { storyId, kind };
1359
+ }
1360
+ function getStoryTitle({
1361
+ storyFilePath,
1362
+ configDir,
1363
+ stories,
1364
+ workingDir = process.cwd(),
1365
+ userTitle
1366
+ }) {
1367
+ let normalizedStories = normalizeStories2(stories, {
1368
+ configDir,
1369
+ workingDir
1370
+ }), relativePath = relative3(workingDir, storyFilePath), importPath = posix2(normalizeStoryPath2(relativePath));
1371
+ return normalizedStories.map((normalizeStory) => userOrAutoTitleFromSpecifier(importPath, normalizeStory, userTitle)).filter(Boolean)[0];
1372
+ }
1373
+
1374
+ // src/common/utils/lazy-docgen-middleware.ts
1375
+ function createLazyDocgenMiddleware({
1376
+ storyFileTest = STORY_FILE_TEST_REGEXP,
1377
+ createManager,
1378
+ extract
1379
+ }) {
1380
+ let managerPromise, getManager = () => managerPromise ??= createManager();
1381
+ return (nextDocgen) => async (input) => {
1382
+ let storyImportPath = getStoryImportPathFromEntry(input.entry);
1383
+ if (!storyImportPath || !storyFileTest.test(storyImportPath))
1384
+ return nextDocgen(input);
1385
+ let manager = await getManager();
1386
+ if (!manager)
1387
+ return nextDocgen(input);
1388
+ let ours = await extract(manager, input);
1389
+ return ours ? { ...await nextDocgen(input), ...ours } : nextDocgen(input);
1390
+ };
1391
+ }
1392
+
1393
+ // src/common/utils/sync-main-preview-addons.ts
1394
+ var import_picocolors2 = __toESM(require_picocolors(), 1);
1395
+ import { types as t3 } from "@aussieljk/forkbook/internal/babel";
1396
+ import {
1397
+ isCsfFactoryPreview,
1398
+ readConfig as readConfig2,
1399
+ writeConfig as writeConfig2
1400
+ } from "@aussieljk/forkbook/internal/csf-tools";
1401
+ import { logger as logger8 } from "@aussieljk/forkbook/internal/node-logger";
1402
+
1403
+ // src/common/utils/get-addon-annotations.ts
1404
+ import { createRequire as createRequire2 } from "node:module";
1405
+ function getAnnotationsName(addonName) {
1406
+ return addonName.replace(/^@storybook\//, "").split(/[^a-zA-Z0-9]+/).map(
1407
+ (word, index) => index === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()
1408
+ ).join("").replace(/^./, (char) => char.toLowerCase());
1409
+ }
1410
+ async function getAddonAnnotations(addon, configDir) {
1411
+ let data = {
1412
+ // core addons will have a function as default export in index entrypoint
1413
+ importPath: addon,
1414
+ importName: getAnnotationsName(addon),
1415
+ isCoreAddon: isCorePackage(addon)
1416
+ };
1417
+ data.isCoreAddon || (data.importPath = `${addon}/preview`);
1418
+ try {
1419
+ createRequire2(import.meta.url).resolve(`${addon}/preview`, { paths: [configDir] });
1420
+ } catch {
1421
+ return null;
1422
+ }
1423
+ return data;
1424
+ }
1425
+
1426
+ // src/common/utils/sync-main-preview-addons.ts
1427
+ async function syncStorybookAddons(mainConfig, previewConfigPath, configDir) {
1428
+ let previewConfig = await readConfig2(previewConfigPath), modifiedConfig = await syncPreviewAddonsWithMainConfig(
1429
+ mainConfig,
1430
+ previewConfig,
1431
+ configDir
1432
+ );
1433
+ await writeConfig2(modifiedConfig);
1434
+ }
1435
+ async function syncPreviewAddonsWithMainConfig(mainConfig, previewConfig, configDir) {
1436
+ if (!isCsfFactoryPreview(previewConfig))
1437
+ return previewConfig;
1438
+ let existingAddons = previewConfig.getFieldNode(["addons"]);
1439
+ existingAddons || previewConfig.set(["addons"], []);
1440
+ let addons = getAddonNames(mainConfig);
1441
+ if (!addons)
1442
+ return previewConfig;
1443
+ let syncedAddons = [];
1444
+ for (let addon of addons) {
1445
+ let annotations = await getAddonAnnotations(addon, configDir);
1446
+ if (annotations) {
1447
+ if (previewConfig._ast.program.body.find(
1448
+ (node) => t3.isImportDeclaration(node) && node.source.value === annotations.importPath
1449
+ ))
1450
+ continue;
1451
+ (!existingAddons || t3.isArrayExpression(existingAddons) && !existingAddons.elements.some(
1452
+ (element) => t3.isIdentifier(element) && element.name === annotations.importName
1453
+ )) && (syncedAddons.push(addon), annotations.isCoreAddon ? (previewConfig.setImport(annotations.importName, annotations.importPath), previewConfig.appendNodeToArray(
1454
+ ["addons"],
1455
+ t3.callExpression(t3.identifier(annotations.importName), [])
1456
+ )) : (previewConfig.setImport({ namespace: annotations.importName }, annotations.importPath), previewConfig.appendNodeToArray(["addons"], t3.identifier(annotations.importName))));
1457
+ }
1458
+ }
1459
+ return syncedAddons.length > 0 && logger8.log(
1460
+ `Synchronizing addons from main config in ${import_picocolors2.default.cyan(previewConfig.fileName)}:
1461
+ ${syncedAddons.map(import_picocolors2.default.magenta).join(", ")}`
1462
+ ), previewConfig;
1463
+ }
1464
+
1465
+ // src/common/utils/setup-addon-in-config.ts
1466
+ import { writeConfig as writeConfig3 } from "@aussieljk/forkbook/internal/csf-tools";
1467
+
1468
+ // src/common/utils/wrap-getAbsolutePath-utils.ts
1469
+ import { types as t4 } from "@aussieljk/forkbook/internal/babel";
1470
+ var PREFERRED_GET_ABSOLUTE_PATH_WRAPPER_NAME = "getAbsolutePath", ALTERNATIVE_GET_ABSOLUTE_PATH_WRAPPER_NAME = "wrapForPnp";
1471
+ function doesVariableOrFunctionDeclarationExist(node, name) {
1472
+ return t4.isVariableDeclaration(node) && node.declarations.length === 1 && t4.isVariableDeclarator(node.declarations[0]) && t4.isIdentifier(node.declarations[0].id) && node.declarations[0].id?.name === name || t4.isFunctionDeclaration(node) && t4.isIdentifier(node.id) && node.id.name === name;
1473
+ }
1474
+ function getReferenceToGetAbsolutePathWrapper(config, value) {
1475
+ return t4.callExpression(
1476
+ t4.identifier(getAbsolutePathWrapperName(config) ?? PREFERRED_GET_ABSOLUTE_PATH_WRAPPER_NAME),
1477
+ [t4.stringLiteral(value)]
1478
+ );
1479
+ }
1480
+ function getAbsolutePathWrapperName(config) {
1481
+ let declarationName = config.getBodyDeclarations().flatMap(
1482
+ (node) => doesVariableOrFunctionDeclarationExist(node, ALTERNATIVE_GET_ABSOLUTE_PATH_WRAPPER_NAME) ? [ALTERNATIVE_GET_ABSOLUTE_PATH_WRAPPER_NAME] : doesVariableOrFunctionDeclarationExist(node, PREFERRED_GET_ABSOLUTE_PATH_WRAPPER_NAME) ? [PREFERRED_GET_ABSOLUTE_PATH_WRAPPER_NAME] : []
1483
+ );
1484
+ return declarationName.length ? declarationName[0] : null;
1485
+ }
1486
+ function isGetAbsolutePathWrapperNecessary(node, cb = () => {
1487
+ }) {
1488
+ if (t4.isStringLiteral(node))
1489
+ return cb(node), !0;
1490
+ if (t4.isObjectExpression(node)) {
1491
+ let nameProperty = node.properties.find(
1492
+ (property) => t4.isObjectProperty(property) && t4.isIdentifier(property.key) && property.key.name === "name"
1493
+ );
1494
+ if (nameProperty && t4.isStringLiteral(nameProperty.value))
1495
+ return cb(nameProperty), !0;
1496
+ }
1497
+ return t4.isArrayExpression(node) && node.elements.some((element) => element && isGetAbsolutePathWrapperNecessary(element)) ? (cb(node), !0) : !1;
1498
+ }
1499
+ function getFieldsForGetAbsolutePathWrapper(config) {
1500
+ let frameworkNode = config.getFieldNode(["framework"]), builderNode = config.getFieldNode(["core", "builder"]), rendererNode = config.getFieldNode(["core", "renderer"]), addons = config.getFieldNode(["addons"]);
1501
+ return [
1502
+ ...frameworkNode ? [frameworkNode] : [],
1503
+ ...builderNode ? [builderNode] : [],
1504
+ ...rendererNode ? [rendererNode] : [],
1505
+ ...addons && t4.isArrayExpression(addons) ? [addons] : []
1506
+ ];
1507
+ }
1508
+ function getAbsolutePathWrapperAsCallExpression(isConfigTypescript, names = { dirname: "dirname", fileURLToPath: "fileURLToPath" }) {
1509
+ let parameter = "value";
1510
+ for (; Object.values(names).includes(parameter); )
1511
+ parameter = `_${parameter}`;
1512
+ let functionDeclaration = {
1513
+ ...t4.functionDeclaration(
1514
+ t4.identifier(PREFERRED_GET_ABSOLUTE_PATH_WRAPPER_NAME),
1515
+ [
1516
+ {
1517
+ ...t4.identifier(parameter),
1518
+ ...isConfigTypescript ? { typeAnnotation: t4.tsTypeAnnotation(t4.tSStringKeyword()) } : {}
1519
+ }
1520
+ ],
1521
+ t4.blockStatement([
1522
+ t4.returnStatement(
1523
+ t4.callExpression(t4.identifier(names.dirname), [
1524
+ t4.callExpression(t4.identifier(names.fileURLToPath), [
1525
+ t4.callExpression(
1526
+ t4.memberExpression(
1527
+ t4.metaProperty(t4.identifier("import"), t4.identifier("meta")),
1528
+ t4.identifier("resolve")
1529
+ ),
1530
+ [
1531
+ t4.templateLiteral(
1532
+ [
1533
+ t4.templateElement({ raw: "" }),
1534
+ t4.templateElement({ raw: "/package.json" }, !0)
1535
+ ],
1536
+ [t4.identifier(parameter)]
1537
+ )
1538
+ ]
1539
+ )
1540
+ ])
1541
+ ])
1542
+ )
1543
+ ])
1544
+ ),
1545
+ ...isConfigTypescript ? { returnType: t4.tSTypeAnnotation(t4.tsAnyKeyword()) } : {}
1546
+ };
1547
+ return t4.addComment(
1548
+ functionDeclaration,
1549
+ "leading",
1550
+ `*
1551
+ * This function is used to resolve the absolute path of a package.
1552
+ * It is needed in projects that are set up within a monorepo.
1553
+ `
1554
+ ), functionDeclaration;
1555
+ }
1556
+ function wrapValueWithGetAbsolutePathWrapper(config, node) {
1557
+ isGetAbsolutePathWrapperNecessary(node, (n) => {
1558
+ if (t4.isStringLiteral(n)) {
1559
+ let wrapperNode = getReferenceToGetAbsolutePathWrapper(config, n.value);
1560
+ Object.keys(n).forEach((k) => {
1561
+ delete n[k];
1562
+ }), Object.keys(wrapperNode).forEach((k) => {
1563
+ n[k] = wrapperNode[k];
1564
+ });
1565
+ }
1566
+ t4.isObjectProperty(n) && t4.isStringLiteral(n.value) && (n.value = getReferenceToGetAbsolutePathWrapper(config, n.value.value)), t4.isArrayExpression(n) && n.elements.forEach((element) => {
1567
+ element && isGetAbsolutePathWrapperNecessary(element) && wrapValueWithGetAbsolutePathWrapper(config, element);
1568
+ });
1569
+ });
1570
+ }
1571
+ var topLevelNames = (node) => t4.isImportDeclaration(node) ? node.specifiers.map((specifier) => specifier.local.name) : t4.isExportNamedDeclaration(node) && node.declaration ? topLevelNames(node.declaration) : t4.isVariableDeclaration(node) ? node.declarations.flatMap(({ id }) => Object.keys(t4.getBindingIdentifiers(id))) : (t4.isFunctionDeclaration(node) || t4.isClassDeclaration(node)) && node.id ? [node.id.name] : [];
1572
+ function ensureNamedImport(config, imported, source) {
1573
+ let { body } = config._ast.program;
1574
+ for (let node of body)
1575
+ if (t4.isImportDeclaration(node) && node.source.value.replace(/^node:/, "") === source.replace(/^node:/, "")) {
1576
+ let existing = node.specifiers.find(
1577
+ (specifier) => t4.isImportSpecifier(specifier) && (t4.isIdentifier(specifier.imported) ? specifier.imported.name : specifier.imported.value) === imported
1578
+ );
1579
+ if (existing)
1580
+ return existing.local.name;
1581
+ }
1582
+ let taken = new Set(body.flatMap(topLevelNames));
1583
+ if (!taken.has(imported))
1584
+ return config.setImport([imported], source), imported;
1585
+ let local = `${source.replace(/^node:/, "")}${imported[0].toUpperCase()}${imported.slice(1)}`;
1586
+ for (; taken.has(local); )
1587
+ local = `_${local}`;
1588
+ return body.unshift(
1589
+ t4.importDeclaration(
1590
+ [t4.importSpecifier(t4.identifier(local), t4.identifier(imported))],
1591
+ t4.stringLiteral(source)
1592
+ )
1593
+ ), local;
1594
+ }
1595
+
1596
+ // src/common/utils/setup-addon-in-config.ts
1597
+ async function setupAddonInConfig({
1598
+ addonName,
1599
+ previewConfigPath,
1600
+ configDir,
1601
+ mainConfigCSFFile
1602
+ }) {
1603
+ if (mainConfigCSFFile.getFieldNode(["addons"]) && getAbsolutePathWrapperName(mainConfigCSFFile) !== null) {
1604
+ let addonNode = mainConfigCSFFile.valueToNode(addonName);
1605
+ mainConfigCSFFile.appendNodeToArray(["addons"], addonNode), wrapValueWithGetAbsolutePathWrapper(mainConfigCSFFile, addonNode);
1606
+ } else
1607
+ mainConfigCSFFile.appendValueToArray(["addons"], addonName);
1608
+ await writeConfig3(mainConfigCSFFile);
1609
+ try {
1610
+ let newMainConfig = await loadMainConfig({ configDir, skipCache: !0 });
1611
+ previewConfigPath && await syncStorybookAddons(newMainConfig, previewConfigPath, configDir);
1612
+ } catch {
1613
+ }
1614
+ }
1615
+
1616
+ // src/common/js-package-manager/JsPackageManagerFactory.ts
1617
+ import { existsSync as existsSync5, readFileSync as readFileSync13 } from "node:fs";
1618
+ import { basename as basename3, join as join14, parse as parse3, relative as relative4 } from "node:path";
1619
+
1620
+ // src/common/utils/command.ts
1621
+ import { logger as logger9, prompt } from "@aussieljk/forkbook/internal/node-logger";
1622
+ import { existsSync as existsSync3 } from "node:fs";
1623
+ import { delimiter, join as join8 } from "node:path";
1624
+
1625
+ // src/common/utils/categorize-execa-error.ts
1626
+ var PACKAGE_MANAGER_COMMANDS = /* @__PURE__ */ new Set(["npm", "pnpm", "yarn", "bun"]), PACKAGE_INSTALL_ARGS = /* @__PURE__ */ new Set(["install", "add", "ci", "i"]);
1627
+ function extractExecaCommandErrorData(error, context) {
1628
+ let structured = error, args = context.args ?? [], logs = getErrorLogs(error);
1629
+ return logs === "[object Object]" && (logs = ""), {
1630
+ command: context.command,
1631
+ args,
1632
+ exitCode: structured.exitCode ?? structured.code,
1633
+ signal: structured.signal,
1634
+ logs,
1635
+ packageManagerErrorCode: extractPackageManagerErrorCode(logs)
1636
+ };
1637
+ }
1638
+ function extractPackageManagerErrorCode(logs) {
1639
+ let npmMatch = logs.match(/npm\s+(?:ERR!|error)\s+code\s+([A-Z0-9_]+)/i);
1640
+ if (npmMatch)
1641
+ return npmMatch[1];
1642
+ let pnpmMatch = logs.match(/(ERR_PNPM_[A-Z0-9_]+)/);
1643
+ if (pnpmMatch)
1644
+ return pnpmMatch[1];
1645
+ }
1646
+ function isPlaywrightInstall(args) {
1647
+ let joined = args.join(" ");
1648
+ return joined.includes("playwright") && joined.includes("install");
1649
+ }
1650
+ function isPackageManagerCommand(command) {
1651
+ let normalizedCommand = command.replace(/\.(cmd|exe|ps1)$/i, "");
1652
+ return PACKAGE_MANAGER_COMMANDS.has(normalizedCommand);
1653
+ }
1654
+ function isPackageInstall(command, args) {
1655
+ return isPackageManagerCommand(command) ? args.some((arg) => PACKAGE_INSTALL_ARGS.has(arg)) : !1;
1656
+ }
1657
+ function isBinaryNotFound(data) {
1658
+ let logs = data.logs.toLowerCase();
1659
+ return data.exitCode === 127 || logs.includes("enoent") && logs.includes("spawn") || logs.includes("command not found") || logs.includes("couldn't find the binary") || logs.includes("is not recognized as an internal or external command") || logs.includes("err_pnpm_recursive_exec_first_fail");
1660
+ }
1661
+ function isMissingPackageManifest(data) {
1662
+ let logs = data.logs;
1663
+ return data.packageManagerErrorCode === "ENOENT" && logs.includes("package.json") || logs.includes("ERR_PNPM_NO_PKG_MANIFEST");
1664
+ }
1665
+ function isDependencyConflict(data) {
1666
+ return data.packageManagerErrorCode === "ERESOLVE";
1667
+ }
1668
+ function isPnpmIgnoredBuilds(data) {
1669
+ return data.packageManagerErrorCode === "ERR_PNPM_IGNORED_BUILDS" || data.logs.includes("Ignored build scripts");
1670
+ }
1671
+ function isPnpmNoTtyModulesDir(data) {
1672
+ return data.packageManagerErrorCode === "ERR_PNPM_ABORTED_REMOVE_MODULES_DIR_NO_TTY";
1673
+ }
1674
+ function categorizeExecaError(error, context) {
1675
+ if (error instanceof StorybookError)
1676
+ return error;
1677
+ let data = extractExecaCommandErrorData(error, context), { command, args } = data;
1678
+ return isPlaywrightInstall(args) ? new PlaywrightInstallFailedError({ ...data, cause: error }) : isBinaryNotFound(data) && isPackageManagerCommand(command) ? new PackageManagerBinaryNotFoundError({ ...data, cause: error }) : isPackageInstall(command, args) ? isDependencyConflict(data) ? new PackageInstallDependencyConflictError({ ...data, cause: error }) : isMissingPackageManifest(data) ? new PackageInstallMissingManifestError({ ...data, cause: error }) : isPnpmIgnoredBuilds(data) ? new PnpmIgnoredBuildsError({ ...data, cause: error }) : isPnpmNoTtyModulesDir(data) ? new PnpmNoTtyModulesDirError({ ...data, cause: error }) : new PackageInstallFailedError({ ...data, cause: error }) : new ExecaCommandFailedError({ ...data, cause: error });
1679
+ }
1680
+
1681
+ // src/common/utils/command.ts
1682
+ var COMMON_ENV_VARS = {
1683
+ COREPACK_ENABLE_STRICT: "0",
1684
+ COREPACK_ENABLE_AUTO_PIN: "0",
1685
+ NO_UPDATE_NOTIFIER: "true"
1686
+ };
1687
+ function attachCategorizedExecaFailureHandler(execaProcess, context) {
1688
+ let categorize = (error) => categorizeExecaError(error, context), originalThen = execaProcess.then.bind(execaProcess), originalCatch = execaProcess.catch.bind(execaProcess);
1689
+ execaProcess.then = ((onFulfilled, onRejected) => originalThen(
1690
+ onFulfilled,
1691
+ typeof onRejected == "function" ? (error) => onRejected(categorize(error)) : (error) => {
1692
+ throw categorize(error);
1693
+ }
1694
+ )), execaProcess.catch = ((onRejected) => originalCatch((error) => {
1695
+ throw categorize(error);
1696
+ }).catch(typeof onRejected == "function" ? onRejected : void 0));
1697
+ }
1698
+ function getExecaOptions({
1699
+ stdio,
1700
+ cwd,
1701
+ env,
1702
+ signal,
1703
+ ...execaOptions
1704
+ }) {
1705
+ return {
1706
+ cwd,
1707
+ stdio: stdio ?? prompt.getPreferredStdio(),
1708
+ encoding: "utf8",
1709
+ cleanup: !0,
1710
+ env: {
1711
+ ...COMMON_ENV_VARS,
1712
+ ...env
1713
+ },
1714
+ ...signal && { cancelSignal: signal },
1715
+ // Map signal to cancelSignal for execa v9
1716
+ ...execaOptions
1717
+ };
1718
+ }
1719
+ function executeCommand(options) {
1720
+ let { command, args = [], ignoreError = !1 } = options;
1721
+ logger9.debug(`Executing command: ${command} ${args.join(" ")}`);
1722
+ let commandVariations = resolveCommand(command), execaProcess = tryCommandVariations(commandVariations, args, getExecaOptions(options));
1723
+ return ignoreError ? execaProcess.catch(() => {
1724
+ }) : attachCategorizedExecaFailureHandler(execaProcess, { command, args }), execaProcess;
1725
+ }
1726
+ function executeCommandSync(options) {
1727
+ let { command, args = [], ignoreError = !1 } = options;
1728
+ try {
1729
+ let commandVariations = resolveCommand(command);
1730
+ return tryCommandVariationsSync(
1731
+ commandVariations,
1732
+ args,
1733
+ getExecaOptions(options)
1734
+ );
1735
+ } catch (err) {
1736
+ if (!ignoreError)
1737
+ throw categorizeExecaError(err, { command, args });
1738
+ return "";
1739
+ }
1740
+ }
1741
+ function executeNodeCommand({
1742
+ scriptPath,
1743
+ args,
1744
+ options
1745
+ }) {
1746
+ return execaNode(scriptPath, args, {
1747
+ ...options
1748
+ });
1749
+ }
1750
+ function isCommandNotFoundError(error) {
1751
+ return error ? (error.stderr || "").includes("is not recognized as an internal or external command") : !1;
1752
+ }
1753
+ function shouldRetry(error, isLastVariation) {
1754
+ return isCommandNotFoundError(error) && !isLastVariation;
1755
+ }
1756
+ function isExecutableInPath(command) {
1757
+ return (process.env.PATH || "").split(delimiter).some((dir) => existsSync3(join8(dir, command)));
1758
+ }
1759
+ function tryCommandVariations(commandVariations, args, options) {
1760
+ if (commandVariations.length <= 1)
1761
+ return execa(commandVariations[0], args, options);
1762
+ for (let cmd of commandVariations.slice(0, -1))
1763
+ if (isExecutableInPath(cmd))
1764
+ return logger9.debug(`Resolved command variation: ${cmd}`), execa(cmd, args, options);
1765
+ return execa(commandVariations[commandVariations.length - 1], args, options);
1766
+ }
1767
+ function tryCommandVariationsSync(commandVariations, args, options) {
1768
+ let lastError;
1769
+ for (let i = 0; i < commandVariations.length; i++) {
1770
+ let cmd = commandVariations[i];
1771
+ try {
1772
+ let commandResult = execaCommandSync([cmd, ...args].join(" "), options);
1773
+ return typeof commandResult.stdout == "string" ? commandResult.stdout : "";
1774
+ } catch (error) {
1775
+ if (lastError = error, !shouldRetry(error, i === commandVariations.length - 1))
1776
+ throw error;
1777
+ logger9.debug(`Command "${cmd}" not found, trying next variation...`);
1778
+ }
1779
+ }
1780
+ throw lastError;
1781
+ }
1782
+ function resolveCommand(command) {
1783
+ let WINDOWS_SHIM_COMMANDS = /* @__PURE__ */ new Set([
1784
+ "npm",
1785
+ "npx",
1786
+ "pnpm",
1787
+ "yarn",
1788
+ "ng"
1789
+ // Anything installed via node_modules/.bin (vite, eslint, prettier, etc)
1790
+ // can be added here as needed. Do NOT list native executables.
1791
+ ]);
1792
+ return process.platform !== "win32" ? [command] : WINDOWS_SHIM_COMMANDS.has(command) ? [`${command}.cmd`, `${command}.exe`, `${command}.ps1`, command] : [command];
1793
+ }
1794
+
1795
+ // src/common/js-package-manager/BUNProxy.ts
1796
+ import { readFileSync as readFileSync8, writeFileSync as writeFileSync2 } from "node:fs";
1797
+ import { join as join9 } from "node:path";
1798
+ import { logger as logger10, prompt as prompt2 } from "@aussieljk/forkbook/internal/node-logger";
1799
+ import {
1800
+ FindPackageVersionsError,
1801
+ MinimumReleaseAgeHandledError
1802
+ } from "@aussieljk/forkbook/internal/server-errors";
1803
+ import sort from "semver/functions/sort.js";
1804
+ import { dedent as dedent6 } from "ts-dedent";
1805
+ var BUNProxy = class extends JsPackageManager {
1806
+ constructor() {
1807
+ super(...arguments);
1808
+ this.type = "bun" /* BUN */;
1809
+ }
1810
+ async initPackageJson() {
1811
+ return executeCommand({ command: "bun", args: ["init"] });
1812
+ }
1813
+ getCommandName() {
1814
+ return "bun";
1815
+ }
1816
+ getInstallCommand(deps, dev) {
1817
+ return `bun add ${dev ? "-D " : ""}${deps.join(" ")}`;
1818
+ }
1819
+ getRunStorybookCommand() {
1820
+ return "bun run storybook";
1821
+ }
1822
+ getRunCommand(command) {
1823
+ return `bun run ${command}`;
1824
+ }
1825
+ getRemoteRunCommand(args) {
1826
+ return `bunx ${args.join(" ")}`;
1827
+ }
1828
+ getPackageCommand(args) {
1829
+ return `bunx ${args.join(" ")}`;
1830
+ }
1831
+ async getModulePackageJSON(packageName) {
1832
+ let wantedPath = join9("node_modules", packageName, "package.json"), packageJsonPath = up2(wantedPath, {
1833
+ cwd: this.primaryPackageJson.operationDir,
1834
+ last: getProjectRoot()
1835
+ });
1836
+ return packageJsonPath ? JSON.parse(readFileSync8(packageJsonPath, "utf-8")) : null;
1837
+ }
1838
+ getInstallArgs() {
1839
+ return this.installArgs || (this.installArgs = []), this.installArgs;
1840
+ }
1841
+ runPackageCommand(options) {
1842
+ return executeCommand({
1843
+ command: "bunx",
1844
+ ...options
1845
+ });
1846
+ }
1847
+ runInternalCommand(command, args, cwd, stdio) {
1848
+ return executeCommand({
1849
+ command: "bun",
1850
+ args: [command, ...args],
1851
+ cwd: cwd ?? this.cwd,
1852
+ stdio
1853
+ });
1854
+ }
1855
+ async findInstallations(pattern, { depth = 99 } = {}) {
1856
+ let exec = async ({ packageDepth }) => executeCommand({
1857
+ command: "npm",
1858
+ args: ["ls", "--json", `--depth=${packageDepth}`],
1859
+ cwd: this.cwd,
1860
+ stdio: ["ignore", "pipe", "ignore"],
1861
+ env: {
1862
+ FORCE_COLOR: "false"
1863
+ }
1864
+ });
1865
+ try {
1866
+ let result = await await exec({ packageDepth: depth }), commandResult = typeof result.stdout == "string" ? result.stdout : "", parsedOutput = JSON.parse(commandResult);
1867
+ return this.mapDependencies(parsedOutput, pattern);
1868
+ } catch {
1869
+ try {
1870
+ let result = await await exec({ packageDepth: 0 }), commandResult = typeof result.stdout == "string" ? result.stdout : "", parsedOutput = JSON.parse(commandResult);
1871
+ return this.mapDependencies(parsedOutput, pattern);
1872
+ } catch (err) {
1873
+ logger10.debug(
1874
+ `An issue occurred while trying to find dependencies metadata using npm: ${err}`
1875
+ );
1876
+ return;
1877
+ }
1878
+ }
1879
+ }
1880
+ getResolutions(packageJson, versions) {
1881
+ return {
1882
+ overrides: {
1883
+ ...packageJson.overrides,
1884
+ ...versions
1885
+ }
1886
+ };
1887
+ }
1888
+ runInstall(options) {
1889
+ return executeCommand({
1890
+ command: "bun",
1891
+ args: ["install", ...this.getInstallArgs(), ...options?.force ? ["--force"] : []],
1892
+ cwd: this.cwd,
1893
+ stdio: prompt2.getPreferredStdio()
1894
+ });
1895
+ }
1896
+ async installDependencies(options) {
1897
+ try {
1898
+ await super.installDependencies(options);
1899
+ } catch (error) {
1900
+ let logs = getErrorLogs(error);
1901
+ if (logs.includes("minimum-release-age") || logs.includes("minimum release age")) {
1902
+ let handledError = new MinimumReleaseAgeHandledError({
1903
+ packageManagerName: "bun",
1904
+ minimumReleaseAgeConfigName: "minimumReleaseAge",
1905
+ minimumReleaseAgeConfigDocs: "https://bun.com/docs/pm/cli/install#minimum-release-age",
1906
+ minimumReleaseAgeExclusionsConfigName: "minimumReleaseAgeExcludes",
1907
+ failedPackage: this.extractMinimumReleaseAgePackage(logs),
1908
+ cause: error
1909
+ });
1910
+ throw logger10.error(handledError.message), handledError;
1911
+ }
1912
+ throw error;
1913
+ }
1914
+ }
1915
+ async precheckStorybookPackageInstall({
1916
+ storybookVersion,
1917
+ nonInteractive
1918
+ }) {
1919
+ let bunfig = this.readBunfig(), minimumReleaseAgeSeconds = this.getMinimumReleaseAgeSeconds(bunfig);
1920
+ if (!minimumReleaseAgeSeconds || hasStorybookMinimumAgeExclusions(this.getMinimumReleaseAgeExcludes(bunfig ?? "")))
1921
+ return;
1922
+ let timeMap = await this.getPackageTimeMap("@aussieljk/forkbook");
1923
+ if (!timeMap)
1924
+ return;
1925
+ let releaseTime = timeMap[storybookVersion];
1926
+ if (!releaseTime)
1927
+ return;
1928
+ let publishedAt = parseReleaseTime(releaseTime);
1929
+ if (!publishedAt || Math.floor((Date.now() - publishedAt.getTime()) / 1e3) >= minimumReleaseAgeSeconds)
1930
+ return;
1931
+ let compatibleVersion = getLatestStableVersionAdheringToMinimumAgeGate(
1932
+ timeMap,
1933
+ Math.ceil(minimumReleaseAgeSeconds / 60)
1934
+ );
1935
+ if (nonInteractive) {
1936
+ this.updateMinimumReleaseAgeExcludes(), logger10.info(
1937
+ dedent6`
1938
+ bun minimumReleaseAge would block storybook@${storybookVersion} from being installed because it was released within the configured minimumReleaseAge window, so Forkbook updated minimumReleaseAgeExcludes for this project automatically.
1939
+
1940
+ Added patterns: storybook, @storybook/*, eslint-plugin-storybook
1941
+
1942
+ Read more:
1943
+ - https://bun.com/docs/pm/cli/install#minimum-release-age
1944
+ `
1945
+ );
1946
+ return;
1947
+ }
1948
+ logger10.warn(
1949
+ `bun minimumReleaseAge will block storybook@${storybookVersion} from being installed because it was released within the disallowed immaturity window.`
1950
+ );
1951
+ let rerunError = new MinimumReleaseAgeHandledError({
1952
+ message: this.createMinimumReleaseAgeRerunMessage({
1953
+ currentVersion: storybookVersion,
1954
+ compatibleVersion
1955
+ })
1956
+ });
1957
+ if (await prompt2.select(
1958
+ {
1959
+ message: "How would you like to proceed?",
1960
+ options: [
1961
+ {
1962
+ label: "Update bunfig.toml to exclude Forkbook packages from minimumReleaseAge",
1963
+ value: "exclude"
1964
+ },
1965
+ {
1966
+ label: compatibleVersion ? `Stop now and rerun with the most recent allowed release: storybook@${compatibleVersion}` : "Stop now and rerun with an older stable Forkbook release later",
1967
+ value: "rerun"
1968
+ }
1969
+ ]
1970
+ },
1971
+ {
1972
+ onCancel: () => {
1973
+ throw logger10.error(rerunError.message), rerunError;
1974
+ }
1975
+ }
1976
+ ) === "exclude") {
1977
+ this.updateMinimumReleaseAgeExcludes();
1978
+ return;
1979
+ }
1980
+ throw logger10.error(rerunError.message), rerunError;
1981
+ }
1982
+ async getRegistryURL() {
1983
+ let result = await executeCommand({
1984
+ command: "npm",
1985
+ cwd: this.cwd,
1986
+ // "npm config" commands are not allowed in workspaces per default
1987
+ // https://github.com/npm/cli/issues/6099#issuecomment-1847584792
1988
+ args: ["config", "get", "registry", "--workspaces=false", "--include-workspace-root"]
1989
+ }), url = (typeof result.stdout == "string" ? result.stdout : "").trim();
1990
+ return url === "undefined" ? void 0 : url;
1991
+ }
1992
+ runAddDeps(dependencies, installAsDevDependencies) {
1993
+ let args = [...dependencies];
1994
+ return installAsDevDependencies && (args = ["-D", ...args]), executeCommand({
1995
+ command: "bun",
1996
+ args: ["add", ...args, ...this.getInstallArgs()],
1997
+ stdio: "pipe",
1998
+ cwd: this.primaryPackageJson.operationDir
1999
+ });
2000
+ }
2001
+ async runGetVersions(packageName, fetchAllVersions) {
2002
+ let args = fetchAllVersions ? ["versions", "--json"] : ["version"];
2003
+ try {
2004
+ let result = await executeCommand({
2005
+ command: "npm",
2006
+ cwd: this.cwd,
2007
+ args: ["info", packageName, ...args]
2008
+ }), commandResult = typeof result.stdout == "string" ? result.stdout : "", parsedOutput = fetchAllVersions ? JSON.parse(commandResult) : commandResult.trim();
2009
+ if (parsedOutput.error?.summary)
2010
+ throw parsedOutput.error.summary;
2011
+ return parsedOutput;
2012
+ } catch (error) {
2013
+ throw new FindPackageVersionsError({
2014
+ error,
2015
+ packageManager: "NPM",
2016
+ packageName
2017
+ });
2018
+ }
2019
+ }
2020
+ /**
2021
+ * @param input The output of `npm ls --json`
2022
+ * @param pattern A list of package names to filter the result. * can be used as a placeholder
2023
+ */
2024
+ mapDependencies(input, pattern) {
2025
+ let acc = {}, existingVersions = {}, duplicatedDependencies = {}, recurse = ([name, packageInfo]) => {
2026
+ if (!name || !pattern.some((p) => new RegExp(`^${p.replace(/\*/g, ".*")}$`).test(name)))
2027
+ return;
2028
+ let value = {
2029
+ version: packageInfo.version,
2030
+ location: ""
2031
+ };
2032
+ existingVersions[name]?.includes(value.version) || (acc[name] ? acc[name].push(value) : acc[name] = [value], existingVersions[name] = sort([...existingVersions[name] || [], value.version]), existingVersions[name].length > 1 && (duplicatedDependencies[name] = existingVersions[name])), packageInfo.dependencies && Object.entries(packageInfo.dependencies).forEach(recurse);
2033
+ };
2034
+ return Object.entries(input.dependencies).forEach(recurse), {
2035
+ dependencies: acc,
2036
+ duplicatedDependencies,
2037
+ infoCommand: "npm ls --depth=1",
2038
+ dedupeCommand: "npm dedupe"
2039
+ };
2040
+ }
2041
+ getMinimumReleaseAgeSeconds(bunfig = this.readBunfig()) {
2042
+ if (!bunfig)
2043
+ return null;
2044
+ let match = bunfig.match(/^minimumReleaseAge\s*=\s*(\d+)\s*$/m);
2045
+ if (!match)
2046
+ return null;
2047
+ let parsedValue = Number.parseInt(match[1], 10);
2048
+ return Number.isFinite(parsedValue) && parsedValue > 0 ? parsedValue : null;
2049
+ }
2050
+ async getPackageTimeMap(packageName) {
2051
+ let result = await executeCommand({
2052
+ command: "npm",
2053
+ cwd: this.cwd,
2054
+ args: ["info", packageName, "time", "--json"],
2055
+ stdio: "pipe"
2056
+ }), normalizedValue = typeof result.stdout == "string" ? result.stdout.trim() : "";
2057
+ return normalizedValue ? parsePackageTimeMap(JSON.parse(normalizedValue)) : null;
2058
+ }
2059
+ createMinimumReleaseAgeRerunMessage({
2060
+ currentVersion,
2061
+ compatibleVersion
2062
+ }) {
2063
+ let rerunCommand = getStorybookRerunCommand(compatibleVersion);
2064
+ return dedent6`
2065
+ bun minimumReleaseAge blocked storybook@${currentVersion} from being installed.
2066
+
2067
+ ${FORKBOOK_RERUN_INSTRUCTION}
2068
+ ${rerunCommand}
2069
+
2070
+ Read more:
2071
+ - https://bun.com/docs/pm/cli/install#minimum-release-age
2072
+ `;
2073
+ }
2074
+ updateMinimumReleaseAgeExcludes() {
2075
+ let bunfigPath = join9(this.cwd, "bunfig.toml"), currentContent = this.readBunfig() ?? "", lineEnding = currentContent.includes(`\r
2076
+ `) ? `\r
2077
+ ` : `
2078
+ `, replacement = [
2079
+ "minimumReleaseAgeExcludes = [",
2080
+ ...Array.from(
2081
+ /* @__PURE__ */ new Set([...this.getMinimumReleaseAgeExcludes(currentContent), ...FORKBOOK_PACKAGE_PATTERNS])
2082
+ ).map((pattern) => ` "${pattern}",`),
2083
+ "]"
2084
+ ].join(lineEnding), installSectionRange = this.getTomlSectionRange(currentContent, "install"), nextContent = installSectionRange ? [
2085
+ currentContent.slice(0, installSectionRange.start),
2086
+ this.updateMinimumReleaseAgeExcludesInContent(
2087
+ currentContent.slice(installSectionRange.start, installSectionRange.end),
2088
+ replacement,
2089
+ lineEnding
2090
+ ),
2091
+ currentContent.slice(installSectionRange.end)
2092
+ ].join("") : this.updateMinimumReleaseAgeExcludesInContent(currentContent, replacement, lineEnding);
2093
+ writeFileSync2(bunfigPath, nextContent);
2094
+ }
2095
+ updateMinimumReleaseAgeExcludesInContent(content, replacement, lineEnding) {
2096
+ return content.match(/^minimumReleaseAgeExcludes\s*=\s*\[[\s\S]*?\]/m) ? content.replace(/^minimumReleaseAgeExcludes\s*=\s*\[[\s\S]*?\]/m, replacement) : content.match(/^minimumReleaseAge\s*=\s*.+$/m) ? content.replace(
2097
+ /^minimumReleaseAge\s*=\s*.+$/m,
2098
+ (minimumReleaseAgeLine) => `${minimumReleaseAgeLine}${lineEnding}${replacement}`
2099
+ ) : `${content}${content.trim().length > 0 ? `${lineEnding}${lineEnding}` : ""}${replacement}${lineEnding}`;
2100
+ }
2101
+ getTomlSectionRange(content, sectionName) {
2102
+ let escapedSectionName = sectionName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), sectionMatch = new RegExp(`^\\[${escapedSectionName}\\]\\s*$`, "m").exec(content);
2103
+ if (!sectionMatch || sectionMatch.index === void 0)
2104
+ return null;
2105
+ let nextSectionHeader = /^\[[^\]]+\]\s*$/gm;
2106
+ nextSectionHeader.lastIndex = sectionMatch.index + sectionMatch[0].length;
2107
+ let nextSectionMatch = nextSectionHeader.exec(content);
2108
+ return {
2109
+ start: sectionMatch.index,
2110
+ end: nextSectionMatch?.index ?? content.length
2111
+ };
2112
+ }
2113
+ getMinimumReleaseAgeExcludes(bunfig) {
2114
+ let match = bunfig.match(/^minimumReleaseAgeExcludes\s*=\s*\[([\s\S]*?)\]/m);
2115
+ return match ? Array.from(match[1].matchAll(/"([^"]+)"/g), (entry) => entry[1]) : [];
2116
+ }
2117
+ readBunfig() {
2118
+ try {
2119
+ return readFileSync8(join9(this.cwd, "bunfig.toml"), "utf-8");
2120
+ } catch {
2121
+ return null;
2122
+ }
2123
+ }
2124
+ extractMinimumReleaseAgePackage(logs) {
2125
+ let exactVersionMatch = logs.match(
2126
+ /Version\s+"((?:@[^/\s"]+\/)?[^@\s"]+@[^\s"]+)"\s+was published within minimum release age/
2127
+ );
2128
+ if (exactVersionMatch)
2129
+ return exactVersionMatch[1];
2130
+ let rangedSpecifierMatch = logs.match(
2131
+ /No version matching\s+"((?:@[^/\s"]+\/)?[^\s"]+)"\s+found for specifier\s+"([^"]+)"\s+\(blocked by minimum-release-age:/
2132
+ );
2133
+ if (rangedSpecifierMatch) {
2134
+ let [, packageName2, specifier] = rangedSpecifierMatch;
2135
+ return `${packageName2}@${specifier}`;
2136
+ }
2137
+ let failedToResolveMatch = logs.match(
2138
+ /error:\s+((?:@[^/\s]+\/)?[^@\s]+@[^\s]+)\s+failed to resolve/
2139
+ );
2140
+ if (failedToResolveMatch)
2141
+ return failedToResolveMatch[1];
2142
+ let match = logs.match(/((?:@[^/\s]+\/)?[^@\s]+)@([^\s"']+)/);
2143
+ if (!match)
2144
+ return null;
2145
+ let [, packageName, version] = match;
2146
+ return `${packageName}@${version}`;
2147
+ }
2148
+ };
2149
+
2150
+ // src/common/js-package-manager/NPMProxy.ts
2151
+ import { readFileSync as readFileSync9 } from "node:fs";
2152
+ import { dirname as dirname7, join as join10 } from "node:path";
2153
+ import { logger as logger11, prompt as prompt3 } from "@aussieljk/forkbook/internal/node-logger";
2154
+ import {
2155
+ FindPackageVersionsError as FindPackageVersionsError2,
2156
+ MinimumReleaseAgeHandledError as MinimumReleaseAgeHandledError2
2157
+ } from "@aussieljk/forkbook/internal/server-errors";
2158
+ import sort2 from "semver/functions/sort.js";
2159
+ import { dedent as dedent7 } from "ts-dedent";
2160
+ var NPM_CONFIG_WORKSPACE_ARGS = ["--workspaces=false", "--include-workspace-root"];
2161
+ var NPMProxy = class extends JsPackageManager {
2162
+ constructor() {
2163
+ super(...arguments);
2164
+ this.type = "npm" /* NPM */;
2165
+ }
2166
+ getCommandName() {
2167
+ return "npm";
2168
+ }
2169
+ getInstallCommand(deps, dev) {
2170
+ return `npm install ${dev ? "-D " : ""}${deps.join(" ")}`;
2171
+ }
2172
+ getRunCommand(command) {
2173
+ return `npm run ${command}`;
2174
+ }
2175
+ async getModulePackageJSON(packageName) {
2176
+ let wantedPath = join10("node_modules", packageName, "package.json"), packageJsonPath = up2(wantedPath, {
2177
+ cwd: this.primaryPackageJson.operationDir,
2178
+ last: getProjectRoot()
2179
+ });
2180
+ return packageJsonPath ? JSON.parse(readFileSync9(packageJsonPath, "utf-8")) : null;
2181
+ }
2182
+ getInstallArgs() {
2183
+ return this.installArgs || (this.installArgs = []), this.installArgs;
2184
+ }
2185
+ getPackageCommand(args) {
2186
+ return `npx ${args.join(" ")}`;
2187
+ }
2188
+ getRemoteRunCommand(args) {
2189
+ return `npx ${args.join(" ")}`;
2190
+ }
2191
+ runPackageCommand({
2192
+ useRemotePkg = !1,
2193
+ ...options
2194
+ }) {
2195
+ return executeCommand({
2196
+ command: "npx",
2197
+ ...options,
2198
+ ...useRemotePkg && { env: { npm_config_yes: "true", ...options.env } }
2199
+ });
2200
+ }
2201
+ runInternalCommand(command, args, cwd, stdio) {
2202
+ return executeCommand({
2203
+ command: "npm",
2204
+ args: [command, ...args],
2205
+ cwd: cwd ?? this.cwd,
2206
+ stdio
2207
+ });
2208
+ }
2209
+ async findInstallations(pattern, { depth = 99 } = {}) {
2210
+ let exec = ({ packageDepth }) => executeCommand({
2211
+ command: "npm",
2212
+ args: ["ls", "--json", `--depth=${packageDepth}`],
2213
+ env: {
2214
+ FORCE_COLOR: "false"
2215
+ },
2216
+ cwd: this.instanceDir,
2217
+ stdio: ["pipe", "pipe", "ignore"]
2218
+ });
2219
+ try {
2220
+ let childProcess = await exec({ packageDepth: depth }), commandResult = typeof childProcess.stdout == "string" ? childProcess.stdout : "", parsedOutput = JSON.parse(commandResult);
2221
+ return this.mapDependencies(parsedOutput, pattern);
2222
+ } catch {
2223
+ try {
2224
+ let childProcess = await exec({ packageDepth: 0 }), commandResult = typeof childProcess.stdout == "string" ? childProcess.stdout : "", parsedOutput = JSON.parse(commandResult);
2225
+ return this.mapDependencies(parsedOutput, pattern);
2226
+ } catch (e) {
2227
+ logger11.debug(`Error finding installations for ${pattern.join(", ")}: ${String(e)}`);
2228
+ return;
2229
+ }
2230
+ }
2231
+ }
2232
+ getResolutions(packageJson, versions) {
2233
+ return {
2234
+ overrides: {
2235
+ ...packageJson.overrides,
2236
+ ...versions
2237
+ }
2238
+ };
2239
+ }
2240
+ runInstall(options) {
2241
+ let packageJsonPath = this.packageJsonPaths[0], workspacePackageJsonPath = this.packageJsonPaths.find((ancestorPath) => {
2242
+ let workspaces = JsPackageManager.getPackageJson(ancestorPath).workspaces, patterns = Array.isArray(workspaces) ? workspaces : workspaces?.packages;
2243
+ return packageJsonPath && patterns?.length && globSync(
2244
+ patterns.filter((pattern) => !pattern.startsWith("!")).map((pattern) => `${pattern}/package.json`),
2245
+ {
2246
+ cwd: dirname7(ancestorPath),
2247
+ absolute: !0,
2248
+ ignore: patterns.filter((pattern) => pattern.startsWith("!")).map((pattern) => `${pattern.slice(1)}/package.json`)
2249
+ }
2250
+ ).includes(packageJsonPath);
2251
+ });
2252
+ return executeCommand({
2253
+ command: "npm",
2254
+ args: ["install", ...this.getInstallArgs(), ...options?.force ? ["--force"] : []],
2255
+ cwd: workspacePackageJsonPath ? dirname7(workspacePackageJsonPath) : this.cwd,
2256
+ stdio: prompt3.getPreferredStdio()
2257
+ });
2258
+ }
2259
+ async installDependencies(options) {
2260
+ try {
2261
+ await super.installDependencies(options);
2262
+ } catch (error) {
2263
+ let logs = getErrorLogs(error);
2264
+ if (logs.match(/npm\s+(ERR!|error)\s+code\s+ETARGET/i) && logs.includes("with a date before")) {
2265
+ let handledError = new MinimumReleaseAgeHandledError2({
2266
+ packageManagerName: "npm",
2267
+ minimumReleaseAgeConfigName: "min-release-age",
2268
+ minimumReleaseAgeConfigDocs: "https://docs.npmjs.com/cli/v11/using-npm/config#min-release-age",
2269
+ failedPackage: this.extractMinimumReleaseAgePackage(logs),
2270
+ cause: error
2271
+ });
2272
+ throw logger11.error(handledError.message), handledError;
2273
+ }
2274
+ throw error;
2275
+ }
2276
+ }
2277
+ async precheckStorybookPackageInstall({
2278
+ storybookVersion
2279
+ }) {
2280
+ let minimumReleaseAgeDays = await this.getMinimumReleaseAge();
2281
+ if (!minimumReleaseAgeDays)
2282
+ return;
2283
+ let timeMap = await this.getPackageTimeMap("@aussieljk/forkbook");
2284
+ if (!timeMap)
2285
+ return;
2286
+ let releaseTime = timeMap[storybookVersion];
2287
+ if (!releaseTime)
2288
+ return;
2289
+ let publishedAt = parseReleaseTime(releaseTime);
2290
+ if (!publishedAt || getAgeInMinutes(publishedAt, /* @__PURE__ */ new Date()) / 1440 >= minimumReleaseAgeDays)
2291
+ return;
2292
+ let compatibleVersion = getLatestStableVersionAdheringToMinimumAgeGate(
2293
+ timeMap,
2294
+ minimumReleaseAgeDays * 24 * 60
2295
+ ), error = new MinimumReleaseAgeHandledError2({
2296
+ message: this.createMinimumReleaseAgeRerunMessage({
2297
+ currentVersion: storybookVersion,
2298
+ compatibleVersion
2299
+ })
2300
+ });
2301
+ throw logger11.error(error.message), error;
2302
+ }
2303
+ async getRegistryURL() {
2304
+ let result = await executeCommand({
2305
+ command: "npm",
2306
+ // "npm config" commands are not allowed in workspaces per default
2307
+ // https://github.com/npm/cli/issues/6099#issuecomment-1847584792
2308
+ args: ["config", "get", "registry", ...NPM_CONFIG_WORKSPACE_ARGS]
2309
+ }), url = (typeof result.stdout == "string" ? result.stdout : "").trim();
2310
+ return url === "undefined" ? void 0 : url;
2311
+ }
2312
+ runAddDeps(dependencies, installAsDevDependencies) {
2313
+ let args = [...dependencies];
2314
+ return installAsDevDependencies && (args = ["-D", ...args]), executeCommand({
2315
+ command: "npm",
2316
+ args: ["install", ...args, ...this.getInstallArgs()],
2317
+ stdio: prompt3.getPreferredStdio(),
2318
+ cwd: this.primaryPackageJson.operationDir
2319
+ });
2320
+ }
2321
+ async runGetVersions(packageName, fetchAllVersions) {
2322
+ let args = fetchAllVersions ? ["versions", "--json"] : ["version"];
2323
+ try {
2324
+ let result = await executeCommand({
2325
+ command: "npm",
2326
+ args: ["info", packageName, ...args]
2327
+ }), commandResult = typeof result.stdout == "string" ? result.stdout : "", parsedOutput = fetchAllVersions ? JSON.parse(commandResult) : commandResult.trim();
2328
+ if (parsedOutput.error?.summary)
2329
+ throw parsedOutput.error.summary;
2330
+ return parsedOutput;
2331
+ } catch (error) {
2332
+ throw new FindPackageVersionsError2({
2333
+ error,
2334
+ packageManager: "NPM",
2335
+ packageName
2336
+ });
2337
+ }
2338
+ }
2339
+ /**
2340
+ * @param input The output of `npm ls --json`
2341
+ * @param pattern A list of package names to filter the result. * can be used as a placeholder
2342
+ */
2343
+ mapDependencies(input, pattern) {
2344
+ let acc = {}, existingVersions = {}, duplicatedDependencies = {}, recurse = ([name, packageInfo]) => {
2345
+ if (!name || !pattern.some((p) => new RegExp(`^${p.replace(/\*/g, ".*")}$`).test(name)))
2346
+ return;
2347
+ let value = {
2348
+ version: packageInfo.version,
2349
+ location: ""
2350
+ };
2351
+ existingVersions[name]?.includes(value.version) || (acc[name] ? acc[name].push(value) : acc[name] = [value], existingVersions[name] = sort2([...existingVersions[name] || [], value.version]), existingVersions[name].length > 1 && (duplicatedDependencies[name] = existingVersions[name])), packageInfo.dependencies && Object.entries(packageInfo.dependencies).forEach(recurse);
2352
+ };
2353
+ return Object.entries(input.dependencies).forEach(recurse), {
2354
+ dependencies: acc,
2355
+ duplicatedDependencies,
2356
+ infoCommand: "npm ls --depth=1",
2357
+ dedupeCommand: "npm dedupe"
2358
+ };
2359
+ }
2360
+ async getMinimumReleaseAge() {
2361
+ let result = await executeCommand({
2362
+ command: "npm",
2363
+ args: ["config", "get", "min-release-age", ...NPM_CONFIG_WORKSPACE_ARGS],
2364
+ cwd: this.cwd,
2365
+ stdio: "pipe"
2366
+ });
2367
+ return parsePositiveIntegerConfigValue(
2368
+ typeof result.stdout == "string" ? result.stdout : void 0
2369
+ );
2370
+ }
2371
+ async getPackageTimeMap(packageName) {
2372
+ let result = await executeCommand({
2373
+ command: "npm",
2374
+ args: ["info", packageName, "time", "--json"],
2375
+ cwd: this.cwd,
2376
+ stdio: "pipe"
2377
+ }), normalizedValue = typeof result.stdout == "string" ? result.stdout.trim() : "";
2378
+ return normalizedValue ? parsePackageTimeMap(JSON.parse(normalizedValue)) : null;
2379
+ }
2380
+ createMinimumReleaseAgeRerunMessage({
2381
+ currentVersion,
2382
+ compatibleVersion
2383
+ }) {
2384
+ let rerunCommand = getStorybookRerunCommand(compatibleVersion);
2385
+ return dedent7`
2386
+ npm min-release-age blocked storybook@${currentVersion} from being installed.
2387
+
2388
+ ${FORKBOOK_RERUN_INSTRUCTION}
2389
+ ${rerunCommand}
2390
+
2391
+ Read more:
2392
+ - https://docs.npmjs.com/cli/v11/using-npm/config#min-release-age
2393
+ `;
2394
+ }
2395
+ extractMinimumReleaseAgePackage(logs) {
2396
+ let exactVersionMatch = logs.match(
2397
+ /No matching version found for\s+((?:@[^/\s]+\/)?[^@\s]+)@([^\s]+)\s+with a date before/i
2398
+ );
2399
+ if (exactVersionMatch) {
2400
+ let [, packageName2, version2] = exactVersionMatch;
2401
+ return `${packageName2}@${version2}`;
2402
+ }
2403
+ let scopedMatch = logs.match(/((?:@[^/\s]+\/)?[^@\s]+)@([^\s"']+)/);
2404
+ if (!scopedMatch)
2405
+ return null;
2406
+ let [, packageName, version] = scopedMatch;
2407
+ return `${packageName}@${version}`;
2408
+ }
2409
+ };
2410
+
2411
+ // src/common/js-package-manager/PNPMProxy.ts
2412
+ import { existsSync as existsSync4, readFileSync as readFileSync10, writeFileSync as writeFileSync3 } from "node:fs";
2413
+ import { join as join11 } from "node:path";
2414
+ import { logger as logger12, prompt as prompt4 } from "@aussieljk/forkbook/internal/node-logger";
2415
+ import {
2416
+ FindPackageVersionsError as FindPackageVersionsError3,
2417
+ MinimumReleaseAgeHandledError as MinimumReleaseAgeHandledError3
2418
+ } from "@aussieljk/forkbook/internal/server-errors";
2419
+ var import_yaml = __toESM(require_dist(), 1);
2420
+ import { coerce, gte } from "semver";
2421
+ import { dedent as dedent8 } from "ts-dedent";
2422
+ var PNPM_ALLOW_BUILD_DLX_MIN = "10.2.0", PNPMProxy = class extends JsPackageManager {
2423
+ constructor() {
2424
+ super(...arguments);
2425
+ this.type = "pnpm" /* PNPM */;
2426
+ }
2427
+ /** Cached `pnpm --version` output; `undefined` until read, `null` if lookup failed. */
2428
+ #pnpmVersion;
2429
+ detectWorkspaceRoot() {
2430
+ let pnpmWorkspaceYaml = `${process.cwd()}/pnpm-workspace.yaml`;
2431
+ return existsSync4(pnpmWorkspaceYaml);
2432
+ }
2433
+ getCommandName() {
2434
+ return "pnpm";
2435
+ }
2436
+ getInstallCommand(deps, dev) {
2437
+ return `pnpm add ${dev ? "-D " : ""}${deps.join(" ")}`;
2438
+ }
2439
+ getRunCommand(command) {
2440
+ return `pnpm run ${command}`;
2441
+ }
2442
+ async getPnpmVersion() {
2443
+ return this.#readPnpmVersion() ?? "";
2444
+ }
2445
+ #readPnpmVersion() {
2446
+ if (this.#pnpmVersion !== void 0)
2447
+ return this.#pnpmVersion;
2448
+ try {
2449
+ logger12.debug("Executing command: pnpm --version");
2450
+ let stdout = executeCommandSync({
2451
+ cwd: this.cwd,
2452
+ command: "pnpm",
2453
+ args: ["--version"],
2454
+ stdio: "pipe"
2455
+ });
2456
+ this.#pnpmVersion = stdout.trim();
2457
+ } catch {
2458
+ this.#pnpmVersion = null;
2459
+ }
2460
+ return this.#pnpmVersion;
2461
+ }
2462
+ #pnpmGte(minimum) {
2463
+ let version = coerce(this.#readPnpmVersion());
2464
+ return version != null && gte(version, minimum);
2465
+ }
2466
+ /**
2467
+ * `pnpm add` at a workspace root needs `-w` (pnpm 8 and 9 reject it otherwise), but `pnpm install
2468
+ * -w` skips every other workspace project from pnpm 9 on.
2469
+ */
2470
+ getInstallArgs(command) {
2471
+ return command === "add" && this.detectWorkspaceRoot() ? ["-w"] : [];
2472
+ }
2473
+ getPackageCommand(args) {
2474
+ return `pnpm exec ${args.join(" ")}`;
2475
+ }
2476
+ getRemoteRunCommand(args) {
2477
+ return `pnpm ${this.#pnpmGte(PNPM_ALLOW_BUILD_DLX_MIN) ? "--allow-build=esbuild " : ""}dlx ${args.join(" ")}`;
2478
+ }
2479
+ runPackageCommand({
2480
+ args,
2481
+ useRemotePkg = !1,
2482
+ ...options
2483
+ }) {
2484
+ let pnpmArgs = useRemotePkg ? [
2485
+ ...this.#pnpmGte(PNPM_ALLOW_BUILD_DLX_MIN) ? ["--allow-build=esbuild"] : [],
2486
+ "dlx",
2487
+ ...args
2488
+ ] : ["exec", ...args];
2489
+ return executeCommand({
2490
+ command: "pnpm",
2491
+ args: pnpmArgs,
2492
+ ...options
2493
+ });
2494
+ }
2495
+ runInternalCommand(command, args, cwd, stdio) {
2496
+ return executeCommand({
2497
+ command: "pnpm",
2498
+ args: [command, ...args],
2499
+ cwd: cwd ?? this.cwd,
2500
+ stdio
2501
+ });
2502
+ }
2503
+ async getRegistryURL() {
2504
+ let childProcess = await executeCommand({
2505
+ command: "npm",
2506
+ cwd: this.cwd,
2507
+ args: ["config", "get", "registry", "--workspaces=false", "--include-workspace-root"]
2508
+ }), url = (typeof childProcess.stdout == "string" ? childProcess.stdout : "").trim();
2509
+ return url === "undefined" ? void 0 : url;
2510
+ }
2511
+ async findInstallations(pattern, { depth = 99 } = {}) {
2512
+ try {
2513
+ let args = ["list", pattern.map((p) => `"${p}"`).join(" "), "--json", `--depth=${depth}`], childProcess = await executeCommand({
2514
+ command: "pnpm",
2515
+ shell: !0,
2516
+ args,
2517
+ env: {
2518
+ FORCE_COLOR: "false"
2519
+ },
2520
+ cwd: this.instanceDir
2521
+ }), commandResult = typeof childProcess.stdout == "string" ? childProcess.stdout : "", parsedOutput = JSON.parse(commandResult);
2522
+ return this.mapDependencies(parsedOutput, pattern);
2523
+ } catch (e) {
2524
+ logger12.debug(`Error finding installations for ${pattern.join(", ")}: ${String(e)}`);
2525
+ return;
2526
+ }
2527
+ }
2528
+ async getModulePackageJSON(packageName) {
2529
+ let wantedPath = join11("node_modules", packageName, "package.json"), packageJsonPath = up2(wantedPath, {
2530
+ cwd: this.primaryPackageJson.operationDir,
2531
+ last: getProjectRoot()
2532
+ });
2533
+ return packageJsonPath ? JSON.parse(readFileSync10(packageJsonPath, "utf-8")) : null;
2534
+ }
2535
+ getResolutions(packageJson, versions) {
2536
+ return {
2537
+ overrides: {
2538
+ ...packageJson.overrides,
2539
+ ...versions
2540
+ }
2541
+ };
2542
+ }
2543
+ async getDeclaredVersionSpecifier(packageName) {
2544
+ let specifier = await super.getDeclaredVersionSpecifier(packageName);
2545
+ if (specifier)
2546
+ return specifier;
2547
+ let catalogName = this.#getCatalogName(this.getAllDependencies()[packageName]);
2548
+ if (catalogName === null)
2549
+ return null;
2550
+ let workspace = this.#readWorkspaceYaml();
2551
+ if (!workspace)
2552
+ return null;
2553
+ let version = workspace.doc.getIn([
2554
+ ...this.#catalogKeyPath(workspace.doc, catalogName),
2555
+ packageName
2556
+ ]);
2557
+ return typeof version == "string" || typeof version == "number" ? String(version) : null;
2558
+ }
2559
+ applyVersionToRelatedPackages(packages, version, anchorPackage) {
2560
+ let catalogName = this.#getCatalogName(this.getAllDependencies()[anchorPackage]);
2561
+ return catalogName !== null && this.#registerCatalogEntries(packages, version, anchorPackage, catalogName) ? packages.map((pkg) => `${pkg}@catalog:${catalogName}`) : super.applyVersionToRelatedPackages(packages, version, anchorPackage);
2562
+ }
2563
+ /**
2564
+ * If `specifier` is a pnpm catalog reference (`catalog:` / `catalog:<name>`), return the catalog
2565
+ * name (`''` for the default catalog); otherwise return null.
2566
+ */
2567
+ #getCatalogName(specifier) {
2568
+ let match = specifier?.match(/^catalog:(.*)$/);
2569
+ return match ? match[1].trim() : null;
2570
+ }
2571
+ /**
2572
+ * Locate and parse the `pnpm-workspace.yaml` that governs this project's catalogs, walking up
2573
+ * from the package.json we operate on. Returns null when the file is missing or malformed.
2574
+ */
2575
+ #readWorkspaceYaml() {
2576
+ let path = up2("pnpm-workspace.yaml", {
2577
+ cwd: this.primaryPackageJson.operationDir,
2578
+ last: getProjectRoot()
2579
+ });
2580
+ if (!path)
2581
+ return null;
2582
+ try {
2583
+ let doc = (0, import_yaml.parseDocument)(readFileSync10(path, "utf8"));
2584
+ if (doc.errors.length > 0)
2585
+ throw doc.errors[0];
2586
+ return { path, doc };
2587
+ } catch (e) {
2588
+ return logger12.debug(`Could not read pnpm workspace file ${path}: ${String(e)}`), null;
2589
+ }
2590
+ }
2591
+ /**
2592
+ * The key path within a parsed `pnpm-workspace.yaml` for a catalog. Named catalogs live under
2593
+ * `catalogs.<name>`. The default catalog (referenced as `catalog:` or `catalog:default`) may be
2594
+ * defined either as top-level `catalog` or as `catalogs.default` — defining both is a pnpm config
2595
+ * error, so follow whichever form the workspace already uses.
2596
+ */
2597
+ #catalogKeyPath(doc, catalogName) {
2598
+ return catalogName && catalogName !== "default" ? ["catalogs", catalogName] : doc.hasIn(["catalogs", "default"]) ? ["catalogs", "default"] : ["catalog"];
2599
+ }
2600
+ /**
2601
+ * Register `packages` in the same catalog as `anchorPackage`, editing `pnpm-workspace.yaml` via
2602
+ * the `yaml` document API so the user's comments and formatting are preserved. The pnpm CLI can't
2603
+ * do this: `pnpm config set` rejects scoped keys and `pnpm add --save-catalog` writes a resolved
2604
+ * direct version whenever the requested range doesn't match an existing entry. Entries the user
2605
+ * already pinned are never overridden. Returns whether the entries are now present, i.e. whether
2606
+ * `catalog:` references to them will resolve.
2607
+ */
2608
+ #registerCatalogEntries(packages, version, anchorPackage, catalogName) {
2609
+ let workspace = this.#readWorkspaceYaml();
2610
+ if (!workspace)
2611
+ return logger12.warn(
2612
+ `Could not read pnpm-workspace.yaml to register catalog entries for: ${packages.join(", ")}`
2613
+ ), !1;
2614
+ try {
2615
+ let keyPath = this.#catalogKeyPath(workspace.doc, catalogName), anchorVersion = workspace.doc.getIn([...keyPath, anchorPackage]), entryVersion = typeof anchorVersion == "string" || typeof anchorVersion == "number" ? String(anchorVersion) : version, changed = !1;
2616
+ for (let pkg of packages)
2617
+ workspace.doc.getIn([...keyPath, pkg]) === void 0 && (workspace.doc.setIn([...keyPath, pkg], entryVersion), changed = !0);
2618
+ return changed && writeFileSync3(workspace.path, workspace.doc.toString(), "utf8"), !0;
2619
+ } catch (e) {
2620
+ return logger12.warn(`Could not update pnpm catalog in ${workspace.path}: ${String(e)}`), !1;
2621
+ }
2622
+ }
2623
+ runInstall(options) {
2624
+ return executeCommand({
2625
+ command: "pnpm",
2626
+ args: ["install", ...this.getInstallArgs("install"), ...options?.force ? ["--force"] : []],
2627
+ stdio: prompt4.getPreferredStdio(),
2628
+ cwd: this.cwd
2629
+ });
2630
+ }
2631
+ async installDependencies(options) {
2632
+ try {
2633
+ await super.installDependencies(options);
2634
+ } catch (error) {
2635
+ let logs = getErrorLogs(error);
2636
+ if (logs.includes("ERR_PNPM_NO_MATURE_MATCHING_VERSION")) {
2637
+ let handledError = new MinimumReleaseAgeHandledError3({
2638
+ packageManagerName: "pnpm",
2639
+ minimumReleaseAgeConfigName: "minimumReleaseAge",
2640
+ minimumReleaseAgeConfigDocs: "https://pnpm.io/settings#minimumreleaseage",
2641
+ minimumReleaseAgeExclusionsConfigName: "minimumReleaseAgeExclude",
2642
+ minimumReleaseAgeExclusionsConfigDocs: "https://pnpm.io/settings#minimumreleaseageexclude",
2643
+ failedPackage: this.extractFailedPackage(logs),
2644
+ cause: error
2645
+ });
2646
+ throw logger12.error(handledError.message), handledError;
2647
+ }
2648
+ throw error;
2649
+ }
2650
+ }
2651
+ async precheckStorybookPackageInstall({
2652
+ storybookVersion,
2653
+ nonInteractive
2654
+ }) {
2655
+ let minimumReleaseAge = await this.getMinimumReleaseAge();
2656
+ if (!minimumReleaseAge || hasStorybookMinimumAgeExclusions(await this.getMinimumReleaseAgeExclude()))
2657
+ return;
2658
+ let publishedAt = await this.getPackageReleaseTime("@aussieljk/forkbook", storybookVersion);
2659
+ if (!publishedAt || getAgeInMinutes(publishedAt, /* @__PURE__ */ new Date()) >= minimumReleaseAge)
2660
+ return;
2661
+ let compatibleVersion = await this.getLatestStableVersionAdheringToMinimumReleaseAge(
2662
+ "@aussieljk/forkbook",
2663
+ minimumReleaseAge
2664
+ );
2665
+ if (nonInteractive) {
2666
+ await this.updateMinimumReleaseAgeExclude(), logger12.info(
2667
+ dedent8`
2668
+ pnpm minimumReleaseAge would block storybook@${storybookVersion} from being installed because it was released within the configured minimumReleaseAge window, so Forkbook updated minimumReleaseAgeExclude for this project automatically.
2669
+
2670
+ Added patterns: storybook, @storybook/*, eslint-plugin-storybook
2671
+
2672
+ Read more:
2673
+ - https://pnpm.io/settings#minimumreleaseage
2674
+ - https://pnpm.io/settings#minimumreleaseageexclude
2675
+ `
2676
+ );
2677
+ return;
2678
+ }
2679
+ logger12.warn(
2680
+ `pnpm minimumReleaseAge will block storybook@${storybookVersion} from being installed because it was published within the configured minimum-release-age window.`
2681
+ );
2682
+ let rerunError = new MinimumReleaseAgeHandledError3({
2683
+ message: this.createMinimumReleaseAgeRerunMessage({
2684
+ currentVersion: storybookVersion,
2685
+ compatibleVersion
2686
+ })
2687
+ });
2688
+ if (await prompt4.select(
2689
+ {
2690
+ message: "How would you like to proceed?",
2691
+ options: [
2692
+ {
2693
+ label: "Update pnpm config to exclude Forkbook packages",
2694
+ value: "exclude"
2695
+ },
2696
+ {
2697
+ label: compatibleVersion ? `Stop now and rerun with the most recent allowed release: storybook@${compatibleVersion}` : "Stop now and rerun with an older stable Forkbook release later",
2698
+ value: "rerun"
2699
+ }
2700
+ ]
2701
+ },
2702
+ {
2703
+ onCancel: () => {
2704
+ throw logger12.error(rerunError.message), rerunError;
2705
+ }
2706
+ }
2707
+ ) === "exclude") {
2708
+ await this.updateMinimumReleaseAgeExclude();
2709
+ return;
2710
+ }
2711
+ throw logger12.error(rerunError.message), rerunError;
2712
+ }
2713
+ runAddDeps(dependencies, installAsDevDependencies) {
2714
+ let args = [...dependencies];
2715
+ installAsDevDependencies && (args = ["-D", ...args]);
2716
+ let commandArgs = ["add", ...args, ...this.getInstallArgs("add")];
2717
+ return executeCommand({
2718
+ command: "pnpm",
2719
+ args: commandArgs,
2720
+ stdio: prompt4.getPreferredStdio(),
2721
+ cwd: this.primaryPackageJson.operationDir
2722
+ });
2723
+ }
2724
+ async runGetVersions(packageName, fetchAllVersions) {
2725
+ let args = fetchAllVersions ? ["versions", "--json"] : ["version"];
2726
+ try {
2727
+ let result = await executeCommand({
2728
+ command: "pnpm",
2729
+ args: ["info", packageName, ...args]
2730
+ }), commandResult = typeof result.stdout == "string" ? result.stdout : "", parsedOutput = fetchAllVersions ? JSON.parse(commandResult) : commandResult.trim();
2731
+ if (parsedOutput.error?.summary)
2732
+ throw parsedOutput.error.summary;
2733
+ return parsedOutput;
2734
+ } catch (error) {
2735
+ throw new FindPackageVersionsError3({
2736
+ error,
2737
+ packageManager: "PNPM",
2738
+ packageName
2739
+ });
2740
+ }
2741
+ }
2742
+ mapDependencies(input, pattern) {
2743
+ let acc = {}, existingVersions = {}, duplicatedDependencies = {}, items = input.reduce((curr, item) => {
2744
+ let { devDependencies, dependencies, peerDependencies } = item, allDependencies = { ...devDependencies, ...dependencies, ...peerDependencies };
2745
+ return Object.assign(curr, allDependencies);
2746
+ }, {}), recurse = ([name, packageInfo]) => {
2747
+ if (!name || !pattern.some((p) => new RegExp(`^${p.replace(/\*/g, ".*")}$`).test(name)))
2748
+ return;
2749
+ let value = {
2750
+ version: packageInfo.version,
2751
+ location: ""
2752
+ };
2753
+ existingVersions[name]?.includes(value.version) || (acc[name] ? acc[name].push(value) : acc[name] = [value], existingVersions[name] = [...existingVersions[name] || [], value.version], existingVersions[name].length > 1 && (duplicatedDependencies[name] = existingVersions[name])), packageInfo.dependencies && Object.entries(packageInfo.dependencies).forEach(recurse);
2754
+ };
2755
+ return Object.entries(items).forEach(recurse), {
2756
+ dependencies: acc,
2757
+ duplicatedDependencies,
2758
+ infoCommand: "pnpm list --depth=1",
2759
+ dedupeCommand: "pnpm dedupe"
2760
+ };
2761
+ }
2762
+ extractFailedPackage(logs) {
2763
+ let match = logs.match(
2764
+ /Version\s+([^\s]+)\s+\([^)]*\)\s+of\s+((?:@[^/\s]+\/)?[^\s]+)\s+does not meet the minimumReleaseAge constraint/
2765
+ );
2766
+ if (!match)
2767
+ return null;
2768
+ let [, version, packageName] = match;
2769
+ return `${packageName}@${version}`;
2770
+ }
2771
+ async getMinimumReleaseAge() {
2772
+ let result = await this.runInternalCommand(
2773
+ "config",
2774
+ ["get", "minimumReleaseAge"],
2775
+ void 0,
2776
+ "pipe"
2777
+ );
2778
+ return parsePositiveIntegerConfigValue(
2779
+ typeof result.stdout == "string" ? result.stdout : void 0
2780
+ );
2781
+ }
2782
+ async getPackageReleaseTime(packageName, version) {
2783
+ let result = await this.runInternalCommand(
2784
+ "view",
2785
+ ["--json", packageName, "time"],
2786
+ void 0,
2787
+ "pipe"
2788
+ ), normalizedValue = typeof result.stdout == "string" ? result.stdout.trim() : "";
2789
+ if (!normalizedValue)
2790
+ return null;
2791
+ let timeMap = parsePackageTimeMap(JSON.parse(normalizedValue));
2792
+ return parseReleaseTime(timeMap?.[version]);
2793
+ }
2794
+ async getLatestStableVersionAdheringToMinimumReleaseAge(packageName, minimumReleaseAgeMinutes, now = /* @__PURE__ */ new Date()) {
2795
+ let result = await this.runInternalCommand(
2796
+ "view",
2797
+ ["--json", packageName, "time"],
2798
+ void 0,
2799
+ "pipe"
2800
+ ), normalizedValue = typeof result.stdout == "string" ? result.stdout.trim() : "";
2801
+ if (!normalizedValue)
2802
+ return null;
2803
+ let timeMap = parsePackageTimeMap(JSON.parse(normalizedValue));
2804
+ return timeMap ? getLatestStableVersionAdheringToMinimumAgeGate(timeMap, minimumReleaseAgeMinutes, now) : null;
2805
+ }
2806
+ createMinimumReleaseAgeRerunMessage({
2807
+ currentVersion,
2808
+ compatibleVersion
2809
+ }) {
2810
+ let rerunCommand = getStorybookRerunCommand(compatibleVersion);
2811
+ return dedent8`
2812
+ pnpm minimumReleaseAge blocked storybook@${currentVersion} from being installed.
2813
+
2814
+ ${FORKBOOK_RERUN_INSTRUCTION}
2815
+ ${rerunCommand}
2816
+
2817
+ Read more:
2818
+ - https://pnpm.io/settings#minimumreleaseage
2819
+ `;
2820
+ }
2821
+ async updateMinimumReleaseAgeExclude() {
2822
+ let currentMinimumReleaseAgeExclude = await this.getMinimumReleaseAgeExclude(), nextMinimumReleaseAgeExclude = Array.from(
2823
+ /* @__PURE__ */ new Set([...currentMinimumReleaseAgeExclude, ...FORKBOOK_PACKAGE_PATTERNS])
2824
+ );
2825
+ await prompt4.executeTaskWithSpinner(
2826
+ () => this.runInternalCommand(
2827
+ "config",
2828
+ [
2829
+ "set",
2830
+ "--location=project",
2831
+ "--json",
2832
+ "minimumReleaseAgeExclude",
2833
+ JSON.stringify(nextMinimumReleaseAgeExclude)
2834
+ ],
2835
+ void 0,
2836
+ "pipe"
2837
+ ),
2838
+ {
2839
+ id: "update-pnpm-minimum-release-age-exclude",
2840
+ intro: "Updating pnpm minimumReleaseAgeExclude...",
2841
+ error: "Failed to update pnpm minimumReleaseAgeExclude.",
2842
+ success: "Updated pnpm minimumReleaseAgeExclude"
2843
+ }
2844
+ );
2845
+ }
2846
+ async getMinimumReleaseAgeExclude() {
2847
+ let result = await this.runInternalCommand(
2848
+ "config",
2849
+ ["get", "minimumReleaseAgeExclude", "--json"],
2850
+ void 0,
2851
+ "pipe"
2852
+ ), normalizedValue = typeof result.stdout == "string" ? result.stdout.trim() : "";
2853
+ if (!normalizedValue || normalizedValue === "undefined" || normalizedValue === "null")
2854
+ return [];
2855
+ let parsedValue = JSON.parse(normalizedValue);
2856
+ return Array.isArray(parsedValue) ? parsedValue.filter(
2857
+ (value) => typeof value == "string" && value.length > 0
2858
+ ) : [];
2859
+ }
2860
+ };
2861
+
2862
+ // src/common/js-package-manager/Yarn1Proxy.ts
2863
+ import { readFileSync as readFileSync11 } from "node:fs";
2864
+ import { join as join12 } from "node:path";
2865
+ import process2 from "node:process";
2866
+ import { logger as logger13, prompt as prompt5 } from "@aussieljk/forkbook/internal/node-logger";
2867
+ import { FindPackageVersionsError as FindPackageVersionsError4 } from "@aussieljk/forkbook/internal/server-errors";
2868
+ var Yarn1Proxy = class extends JsPackageManager {
2869
+ constructor() {
2870
+ super(...arguments);
2871
+ this.type = "yarn1" /* YARN1 */;
2872
+ }
2873
+ getInstallArgs() {
2874
+ return this.installArgs || (this.installArgs = process2.env.CI ? [] : ["--ignore-workspace-root-check"]), this.installArgs;
2875
+ }
2876
+ getCommandName() {
2877
+ return "yarn";
2878
+ }
2879
+ getRunCommand(command) {
2880
+ return `yarn ${command}`;
2881
+ }
2882
+ getInstallCommand(deps, dev) {
2883
+ return `yarn add ${dev ? "-D " : ""}${deps.join(" ")}`;
2884
+ }
2885
+ getPackageCommand(args) {
2886
+ let [command, ...rest] = args;
2887
+ return `yarn exec ${command} -- ${rest.join(" ")}`;
2888
+ }
2889
+ getRemoteRunCommand(args) {
2890
+ return `npx ${args.join(" ")}`;
2891
+ }
2892
+ runPackageCommand({
2893
+ args,
2894
+ useRemotePkg = !1,
2895
+ ...options
2896
+ }) {
2897
+ let [command, ...rest] = args;
2898
+ return executeCommand({
2899
+ ...options,
2900
+ ...useRemotePkg ? { command: "npx", args, env: { npm_config_yes: "true", ...options.env } } : { command: "yarn", args: ["exec", command, "--", ...rest] }
2901
+ });
2902
+ }
2903
+ runInternalCommand(command, args, cwd, stdio) {
2904
+ return executeCommand({
2905
+ command: "yarn",
2906
+ args: [command, ...args],
2907
+ cwd: cwd ?? this.cwd,
2908
+ stdio
2909
+ });
2910
+ }
2911
+ async getModulePackageJSON(packageName) {
2912
+ let wantedPath = join12("node_modules", packageName, "package.json"), packageJsonPath = up2(wantedPath, {
2913
+ cwd: this.primaryPackageJson.operationDir,
2914
+ last: getProjectRoot()
2915
+ });
2916
+ return packageJsonPath ? JSON.parse(readFileSync11(packageJsonPath, "utf-8")) : null;
2917
+ }
2918
+ async getRegistryURL() {
2919
+ let childProcess = await executeCommand({
2920
+ command: "yarn",
2921
+ args: ["config", "get", "registry"]
2922
+ }), url = (typeof childProcess.stdout == "string" ? childProcess.stdout : "").trim();
2923
+ return url === "undefined" ? void 0 : url;
2924
+ }
2925
+ async findInstallations(pattern, { depth = 99 } = {}) {
2926
+ let yarnArgs = ["list", "--pattern", pattern.map((p) => `"${p}"`).join(" "), "--json"];
2927
+ depth !== 0 && yarnArgs.push("--recursive");
2928
+ try {
2929
+ let result = await executeCommand({
2930
+ command: "yarn",
2931
+ args: yarnArgs.concat(pattern),
2932
+ shell: !0,
2933
+ env: {
2934
+ FORCE_COLOR: "false"
2935
+ },
2936
+ cwd: this.instanceDir
2937
+ }), commandResult = typeof result.stdout == "string" ? result.stdout : "", parsedOutput = JSON.parse(commandResult);
2938
+ return this.mapDependencies(parsedOutput, pattern);
2939
+ } catch (e) {
2940
+ logger13.debug(`Error finding installations for ${pattern.join(", ")}: ${String(e)}`);
2941
+ return;
2942
+ }
2943
+ }
2944
+ getResolutions(packageJson, versions) {
2945
+ return {
2946
+ resolutions: {
2947
+ ...packageJson.resolutions,
2948
+ ...versions
2949
+ }
2950
+ };
2951
+ }
2952
+ runInstall(options) {
2953
+ return executeCommand({
2954
+ command: "yarn",
2955
+ args: ["install", ...this.getInstallArgs(), ...options?.force ? ["--force"] : []],
2956
+ stdio: prompt5.getPreferredStdio(),
2957
+ cwd: this.cwd
2958
+ });
2959
+ }
2960
+ runAddDeps(dependencies, installAsDevDependencies) {
2961
+ let args = [...dependencies];
2962
+ return installAsDevDependencies && (args = ["-D", ...args]), executeCommand({
2963
+ command: "yarn",
2964
+ args: ["add", ...this.getInstallArgs(), ...args],
2965
+ stdio: prompt5.getPreferredStdio(),
2966
+ cwd: this.primaryPackageJson.operationDir
2967
+ });
2968
+ }
2969
+ async runGetVersions(packageName, fetchAllVersions) {
2970
+ let taggedPackage = packageName.match(/^(.*)@(next)$/), args = [
2971
+ taggedPackage ? "dist-tags" : fetchAllVersions ? "versions" : "version",
2972
+ "--json"
2973
+ ];
2974
+ try {
2975
+ let result = await executeCommand({
2976
+ command: "yarn",
2977
+ args: ["info", taggedPackage?.[1] ?? packageName, ...args]
2978
+ }), commandResult = typeof result.stdout == "string" ? result.stdout : "", parsedOutput = JSON.parse(commandResult);
2979
+ if (parsedOutput.type === "inspect") {
2980
+ if (taggedPackage && typeof parsedOutput.data == "object") {
2981
+ let version = parsedOutput.data[taggedPackage[2]];
2982
+ if (typeof version == "string")
2983
+ return version;
2984
+ throw new Error(`Yarn did not provide the ${taggedPackage[2]} dist-tag.`);
2985
+ }
2986
+ return parsedOutput.data;
2987
+ }
2988
+ throw new Error("Yarn did not provide an output with type 'inspect'.");
2989
+ } catch (error) {
2990
+ throw new FindPackageVersionsError4({
2991
+ error,
2992
+ packageManager: "Yarn 1",
2993
+ packageName
2994
+ });
2995
+ }
2996
+ }
2997
+ mapDependencies(input, pattern) {
2998
+ if (input.type === "tree") {
2999
+ let { trees } = input.data, acc = {}, existingVersions = {}, duplicatedDependencies = {}, recurse = (tree) => {
3000
+ let { children } = tree, { name, value } = parsePackageData(tree.name);
3001
+ !name || !pattern.some((p) => new RegExp(`^${p.replace(/\*/g, ".*")}$`).test(name)) || (existingVersions[name]?.includes(value.version) || (acc[name] ? acc[name].push(value) : acc[name] = [value], existingVersions[name] = [...existingVersions[name] || [], value.version], existingVersions[name].length > 1 && (duplicatedDependencies[name] = existingVersions[name])), children.forEach(recurse));
3002
+ };
3003
+ return trees.forEach(recurse), {
3004
+ dependencies: acc,
3005
+ duplicatedDependencies,
3006
+ infoCommand: "yarn why",
3007
+ dedupeCommand: "yarn dedupe"
3008
+ };
3009
+ }
3010
+ throw new Error("Something went wrong while parsing yarn output");
3011
+ }
3012
+ };
3013
+
3014
+ // src/common/js-package-manager/Yarn2Proxy.ts
3015
+ import { readFileSync as readFileSync12 } from "node:fs";
3016
+ import { join as join13 } from "node:path";
3017
+ import { prompt as prompt6 } from "@aussieljk/forkbook/internal/node-logger";
3018
+ import {
3019
+ FindPackageVersionsError as FindPackageVersionsError5,
3020
+ MinimumReleaseAgeHandledError as MinimumReleaseAgeHandledError4
3021
+ } from "@aussieljk/forkbook/internal/server-errors";
3022
+ import { dedent as dedent9 } from "ts-dedent";
3023
+ var Yarn2Proxy = class extends JsPackageManager {
3024
+ constructor() {
3025
+ super(...arguments);
3026
+ this.type = "yarn2" /* YARN2 */;
3027
+ }
3028
+ getInstallArgs() {
3029
+ return this.installArgs || (this.installArgs = []), this.installArgs;
3030
+ }
3031
+ getCommandName() {
3032
+ return "yarn";
3033
+ }
3034
+ getRunCommand(command) {
3035
+ return `yarn ${command}`;
3036
+ }
3037
+ getInstallCommand(deps, dev) {
3038
+ return `yarn add ${dev ? "-D " : ""}${deps.join(" ")}`;
3039
+ }
3040
+ getPackageCommand(args) {
3041
+ return `yarn exec ${args.join(" ")}`;
3042
+ }
3043
+ getRemoteRunCommand(args) {
3044
+ return `yarn dlx ${args.join(" ")}`;
3045
+ }
3046
+ runPackageCommand({
3047
+ args,
3048
+ useRemotePkg = !1,
3049
+ ...options
3050
+ }) {
3051
+ return executeCommand({
3052
+ command: "yarn",
3053
+ args: [useRemotePkg ? "dlx" : "exec", ...args],
3054
+ ...options
3055
+ });
3056
+ }
3057
+ runInternalCommand(command, args, cwd, stdio) {
3058
+ return executeCommand({
3059
+ command: "yarn",
3060
+ args: [command, ...args],
3061
+ cwd: cwd ?? this.cwd,
3062
+ stdio
3063
+ });
3064
+ }
3065
+ async findInstallations(pattern, { depth = 99 } = {}) {
3066
+ let yarnArgs = ["info", "--name-only"];
3067
+ depth !== 0 && yarnArgs.push("--recursive");
3068
+ try {
3069
+ let childProcess = await executeCommand({
3070
+ command: "yarn",
3071
+ args: yarnArgs.concat(pattern),
3072
+ env: {
3073
+ FORCE_COLOR: "false"
3074
+ },
3075
+ cwd: this.instanceDir
3076
+ }), commandResult = typeof childProcess.stdout == "string" ? childProcess.stdout : "";
3077
+ return logger.debug(`Installation found for ${pattern.join(", ")}: ${commandResult}`), this.mapDependencies(commandResult, pattern);
3078
+ } catch (e) {
3079
+ logger.debug(`Error finding installations for ${pattern.join(", ")}: ${String(e)}`);
3080
+ return;
3081
+ }
3082
+ }
3083
+ async getModulePackageJSON(packageName) {
3084
+ let wantedPath = join13("node_modules", packageName, "package.json"), packageJsonPath = up2(wantedPath, {
3085
+ cwd: this.primaryPackageJson.operationDir,
3086
+ last: getProjectRoot()
3087
+ });
3088
+ return packageJsonPath ? JSON.parse(readFileSync12(packageJsonPath, "utf-8")) : null;
3089
+ }
3090
+ getResolutions(packageJson, versions) {
3091
+ return {
3092
+ resolutions: {
3093
+ ...packageJson.resolutions,
3094
+ ...versions
3095
+ }
3096
+ };
3097
+ }
3098
+ runInstall() {
3099
+ return executeCommand({
3100
+ command: "yarn",
3101
+ args: ["install", ...this.getInstallArgs()],
3102
+ cwd: this.cwd,
3103
+ stdio: prompt6.getPreferredStdio()
3104
+ });
3105
+ }
3106
+ async installDependencies(options) {
3107
+ try {
3108
+ await super.installDependencies(options);
3109
+ } catch (error) {
3110
+ let logs = getErrorLogs(error);
3111
+ if (logs.includes("YN0016") && logs.includes("quarantined")) {
3112
+ let handledError = new MinimumReleaseAgeHandledError4({
3113
+ packageManagerName: "yarn",
3114
+ minimumReleaseAgeConfigName: "npmMinimalAgeGate",
3115
+ minimumReleaseAgeConfigDocs: "https://yarnpkg.com/configuration/yarnrc#npmMinimalAgeGate",
3116
+ minimumReleaseAgeExclusionsConfigName: "npmPreapprovedPackages",
3117
+ minimumReleaseAgeExclusionsConfigDocs: "https://yarnpkg.com/configuration/yarnrc#npmPreapprovedPackages",
3118
+ failedPackage: this.extractQuarantinedPackage(logs),
3119
+ cause: error
3120
+ });
3121
+ throw logger.error(handledError.message), handledError;
3122
+ }
3123
+ throw error;
3124
+ }
3125
+ }
3126
+ async precheckStorybookPackageInstall({
3127
+ storybookVersion,
3128
+ nonInteractive
3129
+ }) {
3130
+ let minimumAgeGate = await this.getMinimumAgeGate();
3131
+ if (!minimumAgeGate || hasStorybookMinimumAgeExclusions(await this.getPreapprovedPackages()))
3132
+ return;
3133
+ let timeMap = await this.getPackageTimeMap("@aussieljk/forkbook");
3134
+ if (!timeMap)
3135
+ return;
3136
+ let releaseTime = timeMap[storybookVersion];
3137
+ if (!releaseTime)
3138
+ return;
3139
+ let publishedAt = parseReleaseTime(releaseTime);
3140
+ if (!publishedAt || getAgeInMinutes(publishedAt, /* @__PURE__ */ new Date()) >= minimumAgeGate)
3141
+ return;
3142
+ let compatibleVersion = getLatestStableVersionAdheringToMinimumAgeGate(
3143
+ timeMap,
3144
+ minimumAgeGate
3145
+ );
3146
+ if (nonInteractive) {
3147
+ await this.updatePreapprovedPackages(), logger.info(
3148
+ dedent9`
3149
+ yarn npmMinimalAgeGate would block storybook@${storybookVersion} from being installed because it was released within the configured npmMinimalAgeGate window, so Forkbook updated npmPreapprovedPackages for this project automatically.
3150
+
3151
+ Added patterns: storybook, @storybook/*, eslint-plugin-storybook
3152
+
3153
+ Read more:
3154
+ - https://yarnpkg.com/configuration/yarnrc#npmMinimalAgeGate
3155
+ - https://yarnpkg.com/configuration/yarnrc#npmPreapprovedPackages
3156
+ `
3157
+ );
3158
+ return;
3159
+ }
3160
+ logger.warn(
3161
+ `yarn npmMinimalAgeGate will block storybook@${storybookVersion} from being installed because it was published within the configured minimum-release-age window.`
3162
+ );
3163
+ let rerunError = new MinimumReleaseAgeHandledError4({
3164
+ message: this.createMinimalAgeGateRerunMessage({
3165
+ currentVersion: storybookVersion,
3166
+ compatibleVersion
3167
+ })
3168
+ });
3169
+ if (await prompt6.select(
3170
+ {
3171
+ message: "How would you like to proceed?",
3172
+ options: [
3173
+ {
3174
+ label: "Update yarn config to preapprove Forkbook packages",
3175
+ value: "exclude"
3176
+ },
3177
+ {
3178
+ label: compatibleVersion ? `Stop now and rerun with the most recent allowed release: storybook@${compatibleVersion}` : "Stop now and rerun with an older stable Forkbook release later",
3179
+ value: "rerun"
3180
+ }
3181
+ ]
3182
+ },
3183
+ {
3184
+ onCancel: () => {
3185
+ throw logger.error(rerunError.message), rerunError;
3186
+ }
3187
+ }
3188
+ ) === "exclude") {
3189
+ await this.updatePreapprovedPackages();
3190
+ return;
3191
+ }
3192
+ throw logger.error(rerunError.message), rerunError;
3193
+ }
3194
+ runAddDeps(dependencies, installAsDevDependencies) {
3195
+ let args = [...dependencies];
3196
+ return installAsDevDependencies && (args = ["-D", ...args]), executeCommand({
3197
+ command: "yarn",
3198
+ args: ["add", ...this.getInstallArgs(), ...args],
3199
+ stdio: prompt6.getPreferredStdio(),
3200
+ cwd: this.primaryPackageJson.operationDir
3201
+ });
3202
+ }
3203
+ async getRegistryURL() {
3204
+ let result = await executeCommand({
3205
+ command: "yarn",
3206
+ args: ["config", "get", "npmRegistryServer"]
3207
+ }), url = (typeof result.stdout == "string" ? result.stdout : "").trim();
3208
+ return url === "undefined" ? void 0 : url;
3209
+ }
3210
+ async runGetVersions(packageName, fetchAllVersions) {
3211
+ let field = fetchAllVersions ? "versions" : "version", args = ["--fields", field, "--json"];
3212
+ try {
3213
+ let result = await executeCommand({
3214
+ command: "yarn",
3215
+ args: ["npm", "info", packageName, ...args]
3216
+ }), commandResult = typeof result.stdout == "string" ? result.stdout : "";
3217
+ return JSON.parse(commandResult)[field];
3218
+ } catch (error) {
3219
+ throw new FindPackageVersionsError5({
3220
+ error,
3221
+ packageManager: "Yarn Berry",
3222
+ packageName
3223
+ });
3224
+ }
3225
+ }
3226
+ mapDependencies(input, pattern) {
3227
+ let lines = input.split(`
3228
+ `), acc = {}, existingVersions = {}, duplicatedDependencies = {};
3229
+ return lines.forEach((packageName) => {
3230
+ if (logger.debug(`Processing package ${packageName}`), !packageName || !pattern.some((p) => new RegExp(`${p.replace(/\*/g, ".*")}`).test(packageName)))
3231
+ return;
3232
+ let { name, value } = parsePackageData(packageName.replaceAll('"', ""));
3233
+ logger.debug(`Package ${name} found with version ${value.version}`), existingVersions[name]?.includes(value.version) || (acc[name] ? acc[name].push(value) : acc[name] = [value], existingVersions[name] = [...existingVersions[name] || [], value.version], existingVersions[name].length > 1 && (duplicatedDependencies[name] = existingVersions[name]));
3234
+ }), {
3235
+ dependencies: acc,
3236
+ duplicatedDependencies,
3237
+ infoCommand: "yarn why",
3238
+ dedupeCommand: "yarn dedupe"
3239
+ };
3240
+ }
3241
+ extractQuarantinedPackage(logs) {
3242
+ let match = logs.match(
3243
+ /│\s+((?:@[^/\s]+\/)?[^@\s]+)@npm:([^:\s]+):\s+All versions satisfying/
3244
+ );
3245
+ if (!match)
3246
+ return null;
3247
+ let [, packageName, version] = match;
3248
+ return `${packageName}@${version}`;
3249
+ }
3250
+ async getMinimumAgeGate() {
3251
+ try {
3252
+ let result = await this.runInternalCommand(
3253
+ "config",
3254
+ ["get", "npmMinimalAgeGate"],
3255
+ void 0,
3256
+ "pipe"
3257
+ );
3258
+ return parsePositiveIntegerConfigValue(
3259
+ typeof result.stdout == "string" ? result.stdout : void 0
3260
+ );
3261
+ } catch {
3262
+ return null;
3263
+ }
3264
+ }
3265
+ async getPackageTimeMap(packageName) {
3266
+ let result = await this.runInternalCommand(
3267
+ "npm",
3268
+ ["info", packageName, "--fields", "time", "--json"],
3269
+ void 0,
3270
+ "pipe"
3271
+ ), normalizedValue = typeof result.stdout == "string" ? result.stdout.trim() : "";
3272
+ return normalizedValue ? parsePackageTimeMap(JSON.parse(normalizedValue)?.time) : null;
3273
+ }
3274
+ createMinimalAgeGateRerunMessage({
3275
+ currentVersion,
3276
+ compatibleVersion
3277
+ }) {
3278
+ let rerunCommand = getStorybookRerunCommand(compatibleVersion);
3279
+ return dedent9`
3280
+ yarn npmMinimalAgeGate blocked storybook@${currentVersion} from being installed.
3281
+
3282
+ ${FORKBOOK_RERUN_INSTRUCTION}
3283
+ ${rerunCommand}
3284
+
3285
+ Read more:
3286
+ - https://yarnpkg.com/configuration/yarnrc#npmMinimalAgeGate
3287
+ `;
3288
+ }
3289
+ async updatePreapprovedPackages() {
3290
+ let currentPreapprovedPackages = await this.getPreapprovedPackages(), nextPreapprovedPackages = Array.from(
3291
+ /* @__PURE__ */ new Set([...currentPreapprovedPackages, ...FORKBOOK_PACKAGE_PATTERNS])
3292
+ );
3293
+ await prompt6.executeTaskWithSpinner(
3294
+ () => this.runInternalCommand(
3295
+ "config",
3296
+ ["set", "npmPreapprovedPackages", "--json", JSON.stringify(nextPreapprovedPackages)],
3297
+ void 0,
3298
+ "pipe"
3299
+ ),
3300
+ {
3301
+ id: "update-yarn-npm-preapproved-packages",
3302
+ intro: "Updating yarn npmPreapprovedPackages...",
3303
+ error: "Failed to update yarn npmPreapprovedPackages.",
3304
+ success: "Updated yarn npmPreapprovedPackages"
3305
+ }
3306
+ );
3307
+ }
3308
+ async getPreapprovedPackages() {
3309
+ try {
3310
+ let result = await this.runInternalCommand(
3311
+ "config",
3312
+ ["get", "npmPreapprovedPackages"],
3313
+ void 0,
3314
+ "pipe"
3315
+ ), normalizedValue = typeof result.stdout == "string" ? result.stdout.trim() : "";
3316
+ return normalizedValue ? this.parsePreapprovedPackages(normalizedValue) : [];
3317
+ } catch {
3318
+ return [];
3319
+ }
3320
+ }
3321
+ parsePreapprovedPackages(value) {
3322
+ try {
3323
+ let parsedValue = JSON.parse(value);
3324
+ return Array.isArray(parsedValue) ? parsedValue.filter(
3325
+ (entry) => typeof entry == "string" && entry.length > 0
3326
+ ) : [];
3327
+ } catch {
3328
+ return Array.from(value.matchAll(/['"]([^'"\n]+)['"]/g), (match) => match[1]);
3329
+ }
3330
+ }
3331
+ };
3332
+
3333
+ // src/common/js-package-manager/JsPackageManagerFactory.ts
3334
+ var JsPackageManagerFactory = class {
3335
+ static {
3336
+ /** Cache for package manager instances */
3337
+ this.cache = /* @__PURE__ */ new Map();
3338
+ }
3339
+ /** Generate a cache key based on the parameters */
3340
+ static getCacheKey(force, configDir = defaultConfigDir(), cwd = process.cwd(), storiesPaths) {
3341
+ return JSON.stringify({ force: force || null, configDir, cwd, storiesPaths });
3342
+ }
3343
+ /** Clear the package manager cache */
3344
+ static clearCache() {
3345
+ this.cache.clear();
3346
+ }
3347
+ /**
3348
+ * Determine which package manager type to use based on lockfiles, commands, and environment
3349
+ *
3350
+ * @param cwd - Current working directory
3351
+ * @returns Package manager type as string: 'npm', 'pnpm', 'bun', 'yarn1', or 'yarn2'
3352
+ * @throws Error if no usable package manager is found
3353
+ */
3354
+ static getPackageManagerType(cwd = process.cwd()) {
3355
+ let root = getProjectRoot(), closestLockfilePath = [
3356
+ up2(YARN_LOCKFILE, { cwd, last: root }),
3357
+ up2(PNPM_LOCKFILE, { cwd, last: root }),
3358
+ up2(NPM_LOCKFILE, { cwd, last: root }),
3359
+ up2(BUN_LOCKFILE, { cwd, last: root }),
3360
+ up2(BUN_LOCKFILE_BINARY, { cwd, last: root })
3361
+ ].filter(Boolean).sort((a, b) => {
3362
+ let dirA = parse3(a).dir, dirB = parse3(b).dir, compare = relative4(dirA, dirB);
3363
+ return dirA === dirB ? 0 : compare.startsWith("..") ? -1 : 1;
3364
+ })[0], closestLockfile = closestLockfilePath && basename3(closestLockfilePath), yarnVersion = getYarnVersion(cwd);
3365
+ if (yarnVersion && closestLockfile === YARN_LOCKFILE)
3366
+ return yarnVersion === 1 ? "yarn1" /* YARN1 */ : "yarn2" /* YARN2 */;
3367
+ if (hasPNPM(cwd) && closestLockfile === PNPM_LOCKFILE)
3368
+ return "pnpm" /* PNPM */;
3369
+ let isNPMCommandOk = hasNPM(cwd);
3370
+ if (isNPMCommandOk && closestLockfile === NPM_LOCKFILE)
3371
+ return "npm" /* NPM */;
3372
+ if (hasBun(cwd) && (closestLockfile === BUN_LOCKFILE || closestLockfile === BUN_LOCKFILE_BINARY))
3373
+ return "bun" /* BUN */;
3374
+ let inferredPackageManager = this.inferPackageManagerFromUserAgent();
3375
+ if (inferredPackageManager && inferredPackageManager in this.PROXY_MAP)
3376
+ return inferredPackageManager;
3377
+ if (isNPMCommandOk)
3378
+ return "npm" /* NPM */;
3379
+ throw new Error("Unable to find a usable package manager within NPM, PNPM, Yarn and Yarn 2");
3380
+ }
3381
+ static getPackageManager({
3382
+ force,
3383
+ configDir = defaultConfigDir(),
3384
+ storiesPaths,
3385
+ ignoreCache = !1
3386
+ } = {}, cwd = process.cwd()) {
3387
+ let cacheKey = this.getCacheKey(force, configDir, cwd, storiesPaths), cached = this.cache.get(cacheKey);
3388
+ if (cached && !ignoreCache)
3389
+ return cached;
3390
+ if (force && force in this.PROXY_MAP) {
3391
+ let packageManager2 = new this.PROXY_MAP[force]({
3392
+ cwd,
3393
+ configDir,
3394
+ storiesPaths
3395
+ });
3396
+ return this.cache.set(cacheKey, packageManager2), packageManager2;
3397
+ }
3398
+ let packageManagerType = this.getPackageManagerType(cwd), packageManager = new this.PROXY_MAP[packageManagerType]({ cwd, configDir, storiesPaths });
3399
+ return this.cache.set(cacheKey, packageManager), packageManager;
3400
+ }
3401
+ static {
3402
+ /** Look up map of package manager proxies by name */
3403
+ this.PROXY_MAP = {
3404
+ npm: NPMProxy,
3405
+ pnpm: PNPMProxy,
3406
+ yarn1: Yarn1Proxy,
3407
+ yarn2: Yarn2Proxy,
3408
+ bun: BUNProxy
3409
+ };
3410
+ }
3411
+ /**
3412
+ * Infer the package manager based on the command the user is running. Each package manager sets
3413
+ * the `npm_config_user_agent` environment variable with its name and version e.g. "npm/7.24.0"
3414
+ * Which is really useful when invoking commands via npx/pnpx/yarn create/etc.
3415
+ */
3416
+ static inferPackageManagerFromUserAgent() {
3417
+ let userAgent = process.env.npm_config_user_agent;
3418
+ if (userAgent) {
3419
+ let packageSpec = userAgent.split(" ")[0], [pkgMgrName, pkgMgrVersion] = packageSpec.split("/");
3420
+ if (pkgMgrName === "pnpm")
3421
+ return "pnpm" /* PNPM */;
3422
+ if (pkgMgrName === "npm")
3423
+ return "npm" /* NPM */;
3424
+ if (pkgMgrName === "yarn")
3425
+ return pkgMgrVersion?.startsWith("1.") ? "yarn1" /* YARN1 */ : "yarn2" /* YARN2 */;
3426
+ }
3427
+ }
3428
+ };
3429
+ function hasNPM(cwd) {
3430
+ try {
3431
+ return executeCommandSync({
3432
+ command: "npm",
3433
+ args: ["--version"],
3434
+ cwd,
3435
+ env: Object.fromEntries(
3436
+ Object.entries(process.env).filter(([, value]) => value !== void 0)
3437
+ )
3438
+ }), !0;
3439
+ } catch {
3440
+ return !1;
3441
+ }
3442
+ }
3443
+ function hasBun(cwd) {
3444
+ try {
3445
+ return executeCommandSync({
3446
+ command: "bun",
3447
+ args: ["--version"],
3448
+ cwd,
3449
+ env: Object.fromEntries(
3450
+ Object.entries(process.env).filter(([, value]) => value !== void 0)
3451
+ )
3452
+ }), !0;
3453
+ } catch {
3454
+ return !1;
3455
+ }
3456
+ }
3457
+ function hasPNPM(cwd) {
3458
+ try {
3459
+ return executeCommandSync({
3460
+ command: "pnpm",
3461
+ args: ["--version"],
3462
+ cwd,
3463
+ env: Object.fromEntries(
3464
+ Object.entries(process.env).filter(([, value]) => value !== void 0)
3465
+ )
3466
+ }), !0;
3467
+ } catch {
3468
+ return !1;
3469
+ }
3470
+ }
3471
+ function getYarnVersionFromPackageJson(cwd, root) {
3472
+ let effectiveRoot = root ?? getProjectRoot(), directories = up(cwd ?? process.cwd(), { last: effectiveRoot });
3473
+ for (let dir of directories) {
3474
+ let packageJsonPath = join14(dir, "package.json");
3475
+ if (existsSync5(packageJsonPath))
3476
+ try {
3477
+ let packageManager = JSON.parse(readFileSync13(packageJsonPath, "utf-8")).packageManager;
3478
+ if (typeof packageManager == "string") {
3479
+ let match = packageManager.match(/^yarn@(\d+)\./);
3480
+ if (match)
3481
+ return match[1] === "1" ? 1 : 2;
3482
+ }
3483
+ } catch {
3484
+ }
3485
+ }
3486
+ }
3487
+ function hasYarnBerryConfig(cwd, root) {
3488
+ return up2(".yarnrc.yml", { cwd, last: root }) !== void 0;
3489
+ }
3490
+ function getYarnVersion(cwd) {
3491
+ let root = getProjectRoot(), versionFromPackageJson = getYarnVersionFromPackageJson(cwd, root);
3492
+ if (versionFromPackageJson !== void 0)
3493
+ return versionFromPackageJson;
3494
+ let hasBerryConfig = hasYarnBerryConfig(cwd, root);
3495
+ try {
3496
+ let yarnVersion = executeCommandSync({
3497
+ command: "yarn",
3498
+ args: ["--version"],
3499
+ cwd,
3500
+ env: Object.fromEntries(
3501
+ Object.entries(process.env).filter(([, value]) => value !== void 0)
3502
+ )
3503
+ });
3504
+ return /^1\./.test(yarnVersion.trim()) ? hasBerryConfig ? 2 : 1 : 2;
3505
+ } catch {
3506
+ return hasBerryConfig ? 2 : void 0;
3507
+ }
3508
+ }
3509
+
3510
+ // src/common/js-package-manager/warnOnYarn1.ts
3511
+ import { once } from "@aussieljk/forkbook/internal/node-logger";
3512
+ var PACKAGE_MANAGER_INSTALL_DOCS_URL = "https://storybook.js.org/docs/get-started/install";
3513
+ function warnOnYarn1(packageManagerType) {
3514
+ if (packageManagerType === "yarn1" /* YARN1 */)
3515
+ try {
3516
+ once.warn(
3517
+ `${getPrettyPackageManagerName(packageManagerType)} is supported on a best-effort basis. Forkbook works best with npm, pnpm, or Yarn Berry. For more information, see: ${PACKAGE_MANAGER_INSTALL_DOCS_URL}`
3518
+ );
3519
+ } catch {
3520
+ }
3521
+ }
3522
+
3523
+ // src/common/utils/scan-and-transform-files.ts
3524
+ import { logger as logger14, prompt as prompt7 } from "@aussieljk/forkbook/internal/node-logger";
3525
+ async function scanAndTransformFiles({
3526
+ promptMessage = "Enter a custom glob pattern to scan (or press enter to use default):",
3527
+ defaultGlob = "**/*.{mjs,cjs,js,jsx,ts,tsx,mdx}",
3528
+ dryRun = !1,
3529
+ force = !1,
3530
+ transformFn,
3531
+ transformOptions
3532
+ }) {
3533
+ let glob = force ? defaultGlob : await prompt7.text({
3534
+ message: promptMessage,
3535
+ initialValue: defaultGlob
3536
+ });
3537
+ logger14.log("Scanning for affected files...");
3538
+ let globby = (await import("./globby-OEMHPBFY.js")).globby, sourceFiles = await globby([glob], {
3539
+ ...commonGlobOptions(""),
3540
+ ignore: ["**/node_modules/**"],
3541
+ dot: !0,
3542
+ cwd: getProjectRoot(),
3543
+ absolute: !0
3544
+ });
3545
+ return logger14.log(`Scanning ${sourceFiles.length} files...`), transformFn(sourceFiles, transformOptions, dryRun);
3546
+ }
3547
+
3548
+ // src/common/utils/transform-imports.ts
3549
+ function transformImports(source, renamedImports) {
3550
+ let hasChanges = !1, transformed = source;
3551
+ for (let [from2, to] of Object.entries(renamedImports)) {
3552
+ let regex = new RegExp(`(['"])${from2}(/.*)?\\1`, "g");
3553
+ regex.test(transformed) && (transformed = transformed.replace(regex, `$1${to}$2$1`), hasChanges = !0);
3554
+ }
3555
+ return hasChanges ? transformed : null;
3556
+ }
3557
+
3558
+ // src/common/utils/file-lock.ts
3559
+ import { logger as logger15 } from "@aussieljk/forkbook/internal/node-logger";
3560
+ import { randomUUID } from "node:crypto";
3561
+ import { readFileSync as readFileSync14, rmSync as rmSync2 } from "node:fs";
3562
+ import { mkdir as mkdir2, open, readFile as readFile6, rm as rm3, stat, utimes } from "node:fs/promises";
3563
+ import { dirname as dirname8 } from "node:path";
3564
+ var POLL_INTERVAL_MS = 50, DEFAULT_STALE_AFTER_MS = 3e4, DEFAULT_WAIT_BUDGET_MS = 2e4, MALFORMED_LOCK_GRACE_MS = 5e3, errorCode = (error) => typeof error == "object" && error !== null && "code" in error ? error.code : void 0, delay = (ms) => new Promise((resolve7) => setTimeout(resolve7, ms)), isProcessAlive = (pid) => {
3565
+ try {
3566
+ return process.kill(pid, 0), !0;
3567
+ } catch (error) {
3568
+ return errorCode(error) !== "ESRCH";
3569
+ }
3570
+ }, readPayload = async (lockPath) => {
3571
+ try {
3572
+ return JSON.parse(await readFile6(lockPath, "utf8"));
3573
+ } catch {
3574
+ return;
3575
+ }
3576
+ }, tryAcquire = async (lockPath) => {
3577
+ await mkdir2(dirname8(lockPath), { recursive: !0 });
3578
+ let handle;
3579
+ try {
3580
+ handle = await open(lockPath, "wx");
3581
+ } catch (error) {
3582
+ if (errorCode(error) === "EEXIST")
3583
+ return;
3584
+ throw error;
3585
+ }
3586
+ let payload = { token: randomUUID(), pid: process.pid };
3587
+ try {
3588
+ await handle.writeFile(JSON.stringify(payload));
3589
+ } catch (error) {
3590
+ throw await handle.close(), await rm3(lockPath, { force: !0 }).catch(() => {
3591
+ }), error;
3592
+ }
3593
+ return await handle.close(), payload.token;
3594
+ }, breakStaleLock = async (lockPath, staleAfterMs) => {
3595
+ let stats;
3596
+ try {
3597
+ stats = await stat(lockPath);
3598
+ } catch (error) {
3599
+ return errorCode(error) === "ENOENT";
3600
+ }
3601
+ let payload = await readPayload(lockPath), holderPid = typeof payload?.pid == "number" ? payload.pid : void 0, age = Date.now() - stats.mtimeMs;
3602
+ return (holderPid !== void 0 ? !isProcessAlive(holderPid) || age > staleAfterMs : age > MALFORMED_LOCK_GRACE_MS) ? ((await readPayload(lockPath))?.token !== payload?.token || (await rm3(lockPath, { force: !0 }), logger15.debug(`Cleared an abandoned lock at ${lockPath} (holder pid ${holderPid ?? "unknown"})`)), !0) : !1;
3603
+ }, releaseIfOurs = (lockPath, token) => {
3604
+ try {
3605
+ JSON.parse(readFileSync14(lockPath, "utf8"))?.token === token && rmSync2(lockPath, { force: !0 });
3606
+ } catch {
3607
+ }
3608
+ }, holdLock = (lockPath, token, staleAfterMs) => {
3609
+ let removeSync = () => releaseIfOurs(lockPath, token);
3610
+ process.once("exit", removeSync);
3611
+ let heartbeat = setInterval(
3612
+ () => {
3613
+ let now = /* @__PURE__ */ new Date();
3614
+ utimes(lockPath, now, now).catch(() => {
3615
+ });
3616
+ },
3617
+ Math.max(10, staleAfterMs / 3)
3618
+ );
3619
+ return heartbeat.unref?.(), () => {
3620
+ clearInterval(heartbeat), process.off("exit", removeSync), removeSync();
3621
+ };
3622
+ }, withFileLock = async (lockPath, run, {
3623
+ waitBudgetMs = DEFAULT_WAIT_BUDGET_MS,
3624
+ staleAfterMs = DEFAULT_STALE_AFTER_MS
3625
+ } = {}) => {
3626
+ let deadline = Date.now() + waitBudgetMs;
3627
+ for (; ; ) {
3628
+ let token = await tryAcquire(lockPath);
3629
+ if (token !== void 0) {
3630
+ let release = holdLock(lockPath, token, staleAfterMs);
3631
+ try {
3632
+ return await run(), "ran";
3633
+ } finally {
3634
+ release();
3635
+ }
3636
+ }
3637
+ let retryImmediately = await breakStaleLock(lockPath, staleAfterMs);
3638
+ if (Date.now() >= deadline)
3639
+ return "busy";
3640
+ retryImmediately || await delay(POLL_INTERVAL_MS);
3641
+ }
3642
+ };
3643
+
3644
+ // src/common/utils/process-ancestry.ts
3645
+ import { execSync } from "node:child_process";
3646
+ import os2 from "node:os";
3647
+ var UNIX_TIMEOUT = 5e3, WINDOWS_TIMEOUT = 1e4, MAX_DEPTH = 1e3, EXEC_STDIO = ["ignore", "pipe", "ignore"];
3648
+ function getProcessInfoUnix(pid) {
3649
+ try {
3650
+ let output = execSync(`ps -p ${pid} -o pid=,ppid=,command=`, {
3651
+ encoding: "utf8",
3652
+ timeout: UNIX_TIMEOUT,
3653
+ stdio: EXEC_STDIO
3654
+ }).trim();
3655
+ if (!output)
3656
+ return null;
3657
+ let [pidStr, ppidStr, ...commandParts] = output.split(/\s+/), parsedPid = pidStr ? parseInt(pidStr, 10) : NaN, parsedPpid = ppidStr ? parseInt(ppidStr, 10) : NaN;
3658
+ return Number.isNaN(parsedPid) || Number.isNaN(parsedPpid) ? null : {
3659
+ pid: parsedPid,
3660
+ ppid: parsedPpid,
3661
+ command: commandParts.join(" ") || void 0
3662
+ };
3663
+ } catch (error) {
3664
+ return error instanceof Error && error.message.includes("timeout") && console.warn(`Process lookup timed out for PID ${pid}`), null;
3665
+ }
3666
+ }
3667
+ function getProcessInfoWindows(pid) {
3668
+ try {
3669
+ let output = execSync(
3670
+ `wmic process where (ProcessId=${pid}) get ProcessId,ParentProcessId,CommandLine /format:csv`,
3671
+ {
3672
+ encoding: "utf8",
3673
+ timeout: WINDOWS_TIMEOUT,
3674
+ stdio: EXEC_STDIO
3675
+ }
3676
+ );
3677
+ if (!output)
3678
+ return null;
3679
+ let fields = output.split(`
3680
+ `).filter((line) => line.trim() && !line.startsWith("Node")).pop()?.split(",");
3681
+ if (!fields || fields.length < 4)
3682
+ return null;
3683
+ let [_node, commandLine, parentPid, thisPid] = fields, parsedPid = thisPid ? parseInt(thisPid.trim(), 10) : NaN, parsedPpid = parentPid ? parseInt(parentPid.trim(), 10) : NaN;
3684
+ return Number.isNaN(parsedPid) || Number.isNaN(parsedPpid) ? null : {
3685
+ pid: parsedPid,
3686
+ ppid: parsedPpid,
3687
+ command: commandLine?.trim() || void 0
3688
+ };
3689
+ } catch (error) {
3690
+ return error instanceof Error && error.message.includes("timeout") && console.warn(`Process lookup timed out for PID ${pid}`), null;
3691
+ }
3692
+ }
3693
+ function walkAncestry(startPid, getProcessInfo, isRootPpid) {
3694
+ let result = [], visited = /* @__PURE__ */ new Set(), currentPid = startPid, maxDepth = MAX_DEPTH;
3695
+ for (; currentPid && maxDepth > 0 && !visited.has(currentPid); ) {
3696
+ visited.add(currentPid);
3697
+ let info = getProcessInfo(currentPid);
3698
+ if (!info || isRootPpid(info.ppid))
3699
+ break;
3700
+ result.push(info), currentPid = info.ppid, maxDepth -= 1;
3701
+ }
3702
+ return maxDepth === 0 && console.warn(`Reached maximum depth limit while traversing process tree from PID ${startPid}`), result;
3703
+ }
3704
+ function getProcessAncestry(pid = process.pid) {
3705
+ if (typeof pid != "number" || !Number.isInteger(pid) || pid <= 0)
3706
+ throw new Error("PID must be a positive integer");
3707
+ return os2.platform() === "win32" ? walkAncestry(pid, getProcessInfoWindows, (ppid) => ppid === 0 || ppid === 4) : walkAncestry(pid, getProcessInfoUnix, (ppid) => ppid === 0 || ppid === 1);
3708
+ }
3709
+
3710
+ export {
3711
+ resolveAddonName,
3712
+ loadPreset,
3713
+ getPresets,
3714
+ loadAllPresets,
3715
+ FileSystemCache,
3716
+ createFileSystemCache,
3717
+ resolvePathInStorybookCache,
3718
+ cache2 as cache,
3719
+ temporaryDirectory,
3720
+ temporaryFile,
3721
+ parseList,
3722
+ getEnvConfig,
3723
+ createLogStream,
3724
+ isCorePackage,
3725
+ isSatelliteAddon,
3726
+ checkAddonOrder,
3727
+ findStorybookPackageRoot,
3728
+ commonGlobOptions,
3729
+ deepMerge,
3730
+ getBuilderOptions,
3731
+ getStorybookVersionSpecifierFromAncestry,
3732
+ FORKBOOK_VERSION_SPECIFIER_ENV,
3733
+ resolveStorybookVersionSpecifier,
3734
+ readDependencyManifest,
3735
+ getAutoRefs,
3736
+ checkRef,
3737
+ toTitle,
3738
+ getRefs,
3739
+ globToRegexp,
3740
+ interpolate,
3741
+ loadManagerOrAddonsFile,
3742
+ loadPreviewOrConfigFile,
3743
+ logConfig,
3744
+ DEFAULT_FILES_PATTERN,
3745
+ getDirectoryFromWorkingDir,
3746
+ normalizeStoriesEntry,
3747
+ normalizeStories,
3748
+ readTemplate,
3749
+ createMetaComponentResolver,
3750
+ extractDeclaredSubcomponents,
3751
+ removeAddon,
3752
+ isPreservingSymlinks,
3753
+ getPreviewBodyTemplate,
3754
+ getPreviewHeadTemplate,
3755
+ findTsconfigPath,
3756
+ findTsconfigPathForFile,
3757
+ findTsconfigPathForPath,
3758
+ getTsconfigPathsBaseDir,
3759
+ validateFrameworkName,
3760
+ getBabelPresetEnvMajor,
3761
+ formatCode,
3762
+ formatFileContent,
3763
+ userOrAutoTitleFromSpecifier,
3764
+ posix2 as posix,
3765
+ getStoryId,
3766
+ getStoryTitle,
3767
+ createLazyDocgenMiddleware,
3768
+ syncStorybookAddons,
3769
+ syncPreviewAddonsWithMainConfig,
3770
+ doesVariableOrFunctionDeclarationExist,
3771
+ getAbsolutePathWrapperName,
3772
+ isGetAbsolutePathWrapperNecessary,
3773
+ getFieldsForGetAbsolutePathWrapper,
3774
+ getAbsolutePathWrapperAsCallExpression,
3775
+ wrapValueWithGetAbsolutePathWrapper,
3776
+ ensureNamedImport,
3777
+ setupAddonInConfig,
3778
+ executeCommand,
3779
+ executeCommandSync,
3780
+ executeNodeCommand,
3781
+ JsPackageManagerFactory,
3782
+ warnOnYarn1,
3783
+ scanAndTransformFiles,
3784
+ transformImports,
3785
+ withFileLock,
3786
+ getProcessAncestry
3787
+ };