@aussieljk/forkbook 0.0.0-stage → 0.0.1-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +77 -2
- package/assets/addon-vitest/templates/vitest.config.4.template.ts +36 -0
- package/assets/browser/favicon-wrapper.svg +46 -0
- package/assets/browser/favicon.svg +1 -0
- package/assets/browser/nunito-sans-bold-italic.woff2 +0 -0
- package/assets/browser/nunito-sans-bold.woff2 +0 -0
- package/assets/browser/nunito-sans-italic.woff2 +0 -0
- package/assets/browser/nunito-sans-regular.woff2 +0 -0
- package/assets/builder-vite/iframe.html +99 -0
- package/assets/create/rendererAssets/.eslintrc.json +16 -0
- package/assets/create/rendererAssets/common/Configure.mdx +388 -0
- package/assets/create/rendererAssets/common/assets/accessibility.png +0 -0
- package/assets/create/rendererAssets/common/assets/accessibility.svg +1 -0
- package/assets/create/rendererAssets/common/assets/addon-library.png +0 -0
- package/assets/create/rendererAssets/common/assets/assets.png +0 -0
- package/assets/create/rendererAssets/common/assets/avif-test-image.avif +0 -0
- package/assets/create/rendererAssets/common/assets/context.png +0 -0
- package/assets/create/rendererAssets/common/assets/discord.svg +1 -0
- package/assets/create/rendererAssets/common/assets/docs.png +0 -0
- package/assets/create/rendererAssets/common/assets/figma-plugin.png +0 -0
- package/assets/create/rendererAssets/common/assets/github.svg +1 -0
- package/assets/create/rendererAssets/common/assets/share.png +0 -0
- package/assets/create/rendererAssets/common/assets/styling.png +0 -0
- package/assets/create/rendererAssets/common/assets/testing.png +0 -0
- package/assets/create/rendererAssets/common/assets/theming.png +0 -0
- package/assets/create/rendererAssets/common/assets/tutorials.svg +1 -0
- package/assets/create/rendererAssets/common/assets/youtube.svg +1 -0
- package/assets/create/rendererAssets/common/button.css +30 -0
- package/assets/create/rendererAssets/common/header.css +32 -0
- package/assets/create/rendererAssets/common/page.css +68 -0
- package/assets/create/templates/react-native/index.expo.js +20 -0
- package/assets/create/templates/react-native/index.js +25 -0
- package/assets/docs/addon-backgrounds.gif +0 -0
- package/assets/docs/addon-controls-args-annotated.png +0 -0
- package/assets/docs/addon-controls-args-background-color.png +0 -0
- package/assets/docs/addon-controls-args-background-string.png +0 -0
- package/assets/docs/addon-controls-args-docs.png +0 -0
- package/assets/docs/addon-controls-args-logging.png +0 -0
- package/assets/docs/addon-controls-args-no-annotation.png +0 -0
- package/assets/docs/addon-controls-args-reflow-slider.png +0 -0
- package/assets/docs/addon-controls-args-reflow.png +0 -0
- package/assets/docs/addon-controls-args-template.png +0 -0
- package/assets/docs/addon-controls-expanded.png +0 -0
- package/assets/docs/addon-controls-hero.gif +0 -0
- package/assets/docs/addon-controls-install.png +0 -0
- package/assets/docs/hero.gif +0 -0
- package/assets/docs/highlight.png +0 -0
- package/assets/docs/message-reference.png +0 -0
- package/assets/docs/viewport.png +0 -0
- package/assets/react-native/metro-env.d.ts +69 -0
- package/assets/server/addon.tsconfig.json +6 -0
- package/assets/server/base-preview-body.html +116 -0
- package/assets/server/base-preview-head.html +494 -0
- package/assets/server/openBrowser.applescript +94 -0
- package/assets/server/template.ejs +87 -0
- package/dist/.build-stamp +0 -0
- package/dist/_browser-chunks/Color-OEKZ7XSW.js +1025 -0
- package/dist/_browser-chunks/DocsRenderer-JXND3PVQ.js +10 -0
- package/dist/_browser-chunks/WithTooltip-GZSSFOG3.js +1619 -0
- package/dist/_browser-chunks/chunk-2JDQ35OA.js +247 -0
- package/dist/_browser-chunks/chunk-2JT76G3E.js +104 -0
- package/dist/_browser-chunks/chunk-2MEPHP35.js +17 -0
- package/dist/_browser-chunks/chunk-2SCZVUKW.js +24 -0
- package/dist/_browser-chunks/chunk-46Z7NGAS.js +41 -0
- package/dist/_browser-chunks/chunk-4ATQOMJB.js +30 -0
- package/dist/_browser-chunks/chunk-52CW7FF7.js +49 -0
- package/dist/_browser-chunks/chunk-5I7E4GMO.js +62 -0
- package/dist/_browser-chunks/chunk-5P4QA6MY.js +20 -0
- package/dist/_browser-chunks/chunk-5WMXI5GW.js +816 -0
- package/dist/_browser-chunks/chunk-66OCZ54D.js +2604 -0
- package/dist/_browser-chunks/chunk-6SXYJQST.js +253 -0
- package/dist/_browser-chunks/chunk-73OX2G56.js +2943 -0
- package/dist/_browser-chunks/chunk-AYRF6EJB.js +36 -0
- package/dist/_browser-chunks/chunk-B4AUNNU4.js +156 -0
- package/dist/_browser-chunks/chunk-BCP2FFXF.js +369 -0
- package/dist/_browser-chunks/chunk-C3D4HEFY.js +3396 -0
- package/dist/_browser-chunks/chunk-CFAOWGL7.js +43 -0
- package/dist/_browser-chunks/chunk-CFWWCCZV.js +223 -0
- package/dist/_browser-chunks/chunk-CNED6RYH.js +18 -0
- package/dist/_browser-chunks/chunk-DRQKCCAG.js +136 -0
- package/dist/_browser-chunks/chunk-ECQ75MKQ.js +0 -0
- package/dist/_browser-chunks/chunk-EIYAKDGP.js +302 -0
- package/dist/_browser-chunks/chunk-ENKK74N4.js +12 -0
- package/dist/_browser-chunks/chunk-FENFYI4X.js +698 -0
- package/dist/_browser-chunks/chunk-FJGWSWL5.js +155 -0
- package/dist/_browser-chunks/chunk-FVSEPWWX.js +2810 -0
- package/dist/_browser-chunks/chunk-GNZY6LOW.js +10116 -0
- package/dist/_browser-chunks/chunk-IE4ULIOQ.js +14 -0
- package/dist/_browser-chunks/chunk-IMSF75WX.js +42 -0
- package/dist/_browser-chunks/chunk-IWQGIXJS.js +14 -0
- package/dist/_browser-chunks/chunk-JMC7AIKT.js +108 -0
- package/dist/_browser-chunks/chunk-JPUOQJUI.js +8 -0
- package/dist/_browser-chunks/chunk-JSBKXXXF.js +218 -0
- package/dist/_browser-chunks/chunk-JWSKPMPC.js +73 -0
- package/dist/_browser-chunks/chunk-KBK7GKBN.js +35 -0
- package/dist/_browser-chunks/chunk-LAWXTSXK.js +18 -0
- package/dist/_browser-chunks/chunk-LE2LTDW3.js +14 -0
- package/dist/_browser-chunks/chunk-LEVSOOLQ.js +48 -0
- package/dist/_browser-chunks/chunk-LV5PIKV4.js +93 -0
- package/dist/_browser-chunks/chunk-MDOL7KML.js +56 -0
- package/dist/_browser-chunks/chunk-MFMDGWP6.js +34 -0
- package/dist/_browser-chunks/chunk-MLBOOZL4.js +67 -0
- package/dist/_browser-chunks/chunk-NQUD4B7H.js +91 -0
- package/dist/_browser-chunks/chunk-NULBREPZ.js +43 -0
- package/dist/_browser-chunks/chunk-NZMVUW5T.js +7 -0
- package/dist/_browser-chunks/chunk-OD6IBQCC.js +117 -0
- package/dist/_browser-chunks/chunk-ODVJ3XZJ.js +157 -0
- package/dist/_browser-chunks/chunk-OQWFVDIN.js +386 -0
- package/dist/_browser-chunks/chunk-OVH3USFB.js +20 -0
- package/dist/_browser-chunks/chunk-OZZPSYQR.js +14 -0
- package/dist/_browser-chunks/chunk-PFRNG3UC.js +22 -0
- package/dist/_browser-chunks/chunk-PJSMZ27A.js +13 -0
- package/dist/_browser-chunks/chunk-PP4R7USA.js +2167 -0
- package/dist/_browser-chunks/chunk-QC4HFS6K.js +41 -0
- package/dist/_browser-chunks/chunk-QDXFODK4.js +274 -0
- package/dist/_browser-chunks/chunk-RBCHTR7C.js +28 -0
- package/dist/_browser-chunks/chunk-RMYQ3QN3.js +294 -0
- package/dist/_browser-chunks/chunk-RNTIV5CE.js +411 -0
- package/dist/_browser-chunks/chunk-RSPAQWVJ.js +80 -0
- package/dist/_browser-chunks/chunk-S6TK43XQ.js +836 -0
- package/dist/_browser-chunks/chunk-SC67XZST.js +18 -0
- package/dist/_browser-chunks/chunk-SFVA4SBT.js +683 -0
- package/dist/_browser-chunks/chunk-SZYFOQMT.js +25 -0
- package/dist/_browser-chunks/chunk-TBJCJXK4.js +18 -0
- package/dist/_browser-chunks/chunk-UMDO3KB7.js +205 -0
- package/dist/_browser-chunks/chunk-V2G23FV7.js +11 -0
- package/dist/_browser-chunks/chunk-V5M7Q4HT.js +88 -0
- package/dist/_browser-chunks/chunk-VVWPND3J.js +108 -0
- package/dist/_browser-chunks/chunk-W5M6NPS3.js +198 -0
- package/dist/_browser-chunks/chunk-W7NE2JXW.js +84 -0
- package/dist/_browser-chunks/chunk-WGVAAM43.js +1110 -0
- package/dist/_browser-chunks/chunk-WHQRNHXD.js +8 -0
- package/dist/_browser-chunks/chunk-WOSOWBCA.js +12 -0
- package/dist/_browser-chunks/chunk-WZ7KR7SH.js +85 -0
- package/dist/_browser-chunks/chunk-YEKO6BHJ.js +20 -0
- package/dist/_browser-chunks/chunk-YI2IBIQS.js +7 -0
- package/dist/_browser-chunks/chunk-YTIT5NA5.js +1966 -0
- package/dist/_browser-chunks/chunk-ZEHRUHTA.js +6 -0
- package/dist/_browser-chunks/chunk-ZTQ5MEJ5.js +203 -0
- package/dist/_browser-chunks/matchers-YLBYSYAF.js +1263 -0
- package/dist/_browser-chunks/react-dom-client-4OHE3QDV.js +9 -0
- package/dist/_node-chunks/attached-runtime-O4YTVUKE.js +282 -0
- package/dist/_node-chunks/builder-manager-FPV2L36T.js +1661 -0
- package/dist/_node-chunks/chunk-2BJIHWOK.js +25 -0
- package/dist/_node-chunks/chunk-2JSABFAM.js +148 -0
- package/dist/_node-chunks/chunk-2QTI45JU.js +1094 -0
- package/dist/_node-chunks/chunk-2UG3IYCC.js +26 -0
- package/dist/_node-chunks/chunk-2XDUXZGI.js +153 -0
- package/dist/_node-chunks/chunk-356LV3NX.js +36 -0
- package/dist/_node-chunks/chunk-3CLITGI2.js +121 -0
- package/dist/_node-chunks/chunk-4PK3LUHM.js +82 -0
- package/dist/_node-chunks/chunk-4TV3Z3S3.js +20 -0
- package/dist/_node-chunks/chunk-5BTU7UZ5.js +1877 -0
- package/dist/_node-chunks/chunk-5GN5N22E.js +989 -0
- package/dist/_node-chunks/chunk-5J3BMBMY.js +51 -0
- package/dist/_node-chunks/chunk-5J3O7EDY.js +21 -0
- package/dist/_node-chunks/chunk-5RNOGGO6.js +35 -0
- package/dist/_node-chunks/chunk-5WHA37KG.js +1297 -0
- package/dist/_node-chunks/chunk-6APBQVEX.js +611 -0
- package/dist/_node-chunks/chunk-6EJ5NPEM.js +98 -0
- package/dist/_node-chunks/chunk-7BVUZZIY.js +56 -0
- package/dist/_node-chunks/chunk-7DCDBICW.js +415 -0
- package/dist/_node-chunks/chunk-7LLQDMVS.js +223 -0
- package/dist/_node-chunks/chunk-7TSL7D5D.js +26 -0
- package/dist/_node-chunks/chunk-A724RK5H.js +168 -0
- package/dist/_node-chunks/chunk-AANHLH5M.js +87 -0
- package/dist/_node-chunks/chunk-ASJFOW6O.js +1133 -0
- package/dist/_node-chunks/chunk-AWJOXJAZ.js +144 -0
- package/dist/_node-chunks/chunk-AWXGCPW6.js +92 -0
- package/dist/_node-chunks/chunk-B6SKX4JF.js +414 -0
- package/dist/_node-chunks/chunk-BCRWDMAU.js +11 -0
- package/dist/_node-chunks/chunk-BE6ULVPN.js +662 -0
- package/dist/_node-chunks/chunk-BENYUF74.js +2107 -0
- package/dist/_node-chunks/chunk-CDRLLNRQ.js +209 -0
- package/dist/_node-chunks/chunk-CSXS6LVI.js +29 -0
- package/dist/_node-chunks/chunk-CWD5A6NI.js +45 -0
- package/dist/_node-chunks/chunk-CXLL2F6O.js +7162 -0
- package/dist/_node-chunks/chunk-CYPPELO4.js +1011 -0
- package/dist/_node-chunks/chunk-DUOXRUVQ.js +18 -0
- package/dist/_node-chunks/chunk-DWE36J35.js +3767 -0
- package/dist/_node-chunks/chunk-EWXASIWR.js +60 -0
- package/dist/_node-chunks/chunk-FUYZNTIS.js +23 -0
- package/dist/_node-chunks/chunk-G5OYQQDY.js +21 -0
- package/dist/_node-chunks/chunk-G6PUNHCI.js +33 -0
- package/dist/_node-chunks/chunk-GP5YLBNS.js +499 -0
- package/dist/_node-chunks/chunk-GSWBRZLU.js +110 -0
- package/dist/_node-chunks/chunk-GT5EHMNM.js +90 -0
- package/dist/_node-chunks/chunk-GVSFRNWZ.js +110 -0
- package/dist/_node-chunks/chunk-HKQEE62W.js +1193 -0
- package/dist/_node-chunks/chunk-HKUNJELN.js +132 -0
- package/dist/_node-chunks/chunk-I2ANCID7.js +3787 -0
- package/dist/_node-chunks/chunk-ICADUNQM.js +155 -0
- package/dist/_node-chunks/chunk-IJL5JOLL.js +95 -0
- package/dist/_node-chunks/chunk-ILVD64RB.js +844 -0
- package/dist/_node-chunks/chunk-ILWHW4HU.js +1218 -0
- package/dist/_node-chunks/chunk-IZISFDKM.js +7032 -0
- package/dist/_node-chunks/chunk-JBCKN6P4.js +59 -0
- package/dist/_node-chunks/chunk-JE6JEGXA.js +115 -0
- package/dist/_node-chunks/chunk-JEC2OK5B.js +5468 -0
- package/dist/_node-chunks/chunk-JVQYQTTM.js +1094 -0
- package/dist/_node-chunks/chunk-KGOAOPKR.js +35 -0
- package/dist/_node-chunks/chunk-M2BRIUUP.js +25 -0
- package/dist/_node-chunks/chunk-MDKFZRYG.js +80 -0
- package/dist/_node-chunks/chunk-MJ2UD7FU.js +26 -0
- package/dist/_node-chunks/chunk-NIHZECYO.js +48 -0
- package/dist/_node-chunks/chunk-NKAUZU4C.js +63 -0
- package/dist/_node-chunks/chunk-NZ3GOT7V.js +68 -0
- package/dist/_node-chunks/chunk-PBMWZVLD.js +49 -0
- package/dist/_node-chunks/chunk-PEIAGMSR.js +23 -0
- package/dist/_node-chunks/chunk-QMU5ODXZ.js +47 -0
- package/dist/_node-chunks/chunk-QVMUIU7S.js +40 -0
- package/dist/_node-chunks/chunk-R5FYRP6X.js +74 -0
- package/dist/_node-chunks/chunk-R7CY5LX6.js +33 -0
- package/dist/_node-chunks/chunk-RHG33T7C.js +688 -0
- package/dist/_node-chunks/chunk-RJUHZH32.js +20 -0
- package/dist/_node-chunks/chunk-RJXEPYEN.js +2700 -0
- package/dist/_node-chunks/chunk-RQVK2TOI.js +298 -0
- package/dist/_node-chunks/chunk-SRXCCL2O.js +194 -0
- package/dist/_node-chunks/chunk-SVZ6Q3CS.js +40 -0
- package/dist/_node-chunks/chunk-TB6Y6NSL.js +3837 -0
- package/dist/_node-chunks/chunk-U4GKV7GZ.js +4744 -0
- package/dist/_node-chunks/chunk-ULW4SLMN.js +2034 -0
- package/dist/_node-chunks/chunk-URRTQ2QM.js +104 -0
- package/dist/_node-chunks/chunk-US7L4S72.js +45 -0
- package/dist/_node-chunks/chunk-VQEQ7ZLS.js +4731 -0
- package/dist/_node-chunks/chunk-VXDWOVWD.js +52345 -0
- package/dist/_node-chunks/chunk-WQ7PSP6H.js +19 -0
- package/dist/_node-chunks/chunk-WVCU34IS.js +23 -0
- package/dist/_node-chunks/chunk-X6OWHTYE.js +20 -0
- package/dist/_node-chunks/chunk-XCGMRAV5.js +33 -0
- package/dist/_node-chunks/chunk-XJSYJTBD.js +59 -0
- package/dist/_node-chunks/chunk-XTTAS346.js +25 -0
- package/dist/_node-chunks/chunk-XURIZ7IC.js +32 -0
- package/dist/_node-chunks/chunk-Y2DEKWVE.js +3008 -0
- package/dist/_node-chunks/chunk-Y2GH4XO7.js +884 -0
- package/dist/_node-chunks/chunk-YWMICX2T.js +1986 -0
- package/dist/_node-chunks/chunk-ZBAIFZNB.js +5414 -0
- package/dist/_node-chunks/chunk-ZMEGPR47.js +79 -0
- package/dist/_node-chunks/dist-ZGSN23B7.js +16 -0
- package/dist/_node-chunks/globby-HWZL7XSQ.js +2884 -0
- package/dist/_node-chunks/jiti-GNDCTFYU.js +3848 -0
- package/dist/_node-chunks/lib-DI662U2R.js +366 -0
- package/dist/_node-chunks/local-runtime-4UNT5EZJ.js +78 -0
- package/dist/_node-chunks/mdx-plugin-ZY6XLLA4.js +5680 -0
- package/dist/_node-chunks/monorepo-B65J4UFS.js +121 -0
- package/dist/_node-chunks/monorepo-optimized-tests-relaxed-limits-no-story-deletion-45ZTNWJS.js +121 -0
- package/dist/_node-chunks/optimized-tests-ZMNICF4R.js +22 -0
- package/dist/_node-chunks/pattern-copy-play-LOHSM7ID.js +807 -0
- package/dist/_node-chunks/postinstallAddon-NT5XE7IT.js +20 -0
- package/dist/_node-chunks/rehype-external-links-22ZBI6K4.js +121 -0
- package/dist/_node-chunks/rehype-slug-ROZVEEFZ.js +52 -0
- package/dist/_node-chunks/relaxed-limits-EDE2B34G.js +117 -0
- package/dist/_node-chunks/run-372BSBV5.js +4532 -0
- package/dist/_node-chunks/run-IR3BRDJV.js +103 -0
- package/dist/_node-chunks/session-id-OO2WQF5N.js +23 -0
- package/dist/_node-chunks/setup-6TMCKUTA.js +278 -0
- package/dist/_node-chunks/vitest.config.4.template-QJBEVCKG.js +54 -0
- package/dist/actions/decorator.d.ts +7 -0
- package/dist/actions/decorator.js +43 -0
- package/dist/actions/index.d.ts +67 -0
- package/dist/actions/index.js +28 -0
- package/dist/addon-a11y/index.d.ts +52 -0
- package/dist/addon-a11y/index.js +16 -0
- package/dist/addon-a11y/manager.js +1429 -0
- package/dist/addon-a11y/preset.js +18 -0
- package/dist/addon-a11y/preview.d.ts +17 -0
- package/dist/addon-a11y/preview.js +15 -0
- package/dist/addon-docs/blocks.d.ts +1061 -0
- package/dist/addon-docs/blocks.js +2461 -0
- package/dist/addon-docs/index.d.ts +236 -0
- package/dist/addon-docs/index.js +16 -0
- package/dist/addon-docs/manager.js +90 -0
- package/dist/addon-docs/mdx-react-shim.d.ts +1 -0
- package/dist/addon-docs/mdx-react-shim.js +2 -0
- package/dist/addon-docs/preset.js +378 -0
- package/dist/addon-docs/preview.d.ts +4 -0
- package/dist/addon-docs/preview.js +7 -0
- package/dist/addon-links/index.d.ts +22 -0
- package/dist/addon-links/index.js +20 -0
- package/dist/addon-links/manager.js +14 -0
- package/dist/addon-links/preview.d.ts +6 -0
- package/dist/addon-links/preview.js +9 -0
- package/dist/addon-links/react/index.d.ts +25 -0
- package/dist/addon-links/react/index.js +52 -0
- package/dist/addon-mcp/preset.js +1345 -0
- package/dist/addon-mcp/preview.js +29 -0
- package/dist/addon-mcp/tools/preview-stories/preview-stories-app-script.js +1174 -0
- package/dist/addon-ondevice-actions/index.d.ts +4 -0
- package/dist/addon-ondevice-actions/index.js +7 -0
- package/dist/addon-ondevice-actions/register.js +7 -0
- package/dist/addon-ondevice-controls/index.d.ts +6 -0
- package/dist/addon-ondevice-controls/index.js +14 -0
- package/dist/addon-ondevice-controls/register.js +10 -0
- package/dist/addon-pseudo-states/index.d.ts +35 -0
- package/dist/addon-pseudo-states/index.js +15 -0
- package/dist/addon-pseudo-states/manager.js +53 -0
- package/dist/addon-pseudo-states/preview.d.ts +9 -0
- package/dist/addon-pseudo-states/preview.js +10 -0
- package/dist/addon-themes/index.d.ts +80 -0
- package/dist/addon-themes/index.js +104 -0
- package/dist/addon-themes/manager.js +97 -0
- package/dist/addon-themes/postinstall.js +33 -0
- package/dist/addon-themes/preview.d.ts +6 -0
- package/dist/addon-themes/preview.js +8 -0
- package/dist/addon-vitest/constants.d.ts +132 -0
- package/dist/addon-vitest/constants.js +66 -0
- package/dist/addon-vitest/index.d.ts +4 -0
- package/dist/addon-vitest/index.js +8 -0
- package/dist/addon-vitest/manager.js +665 -0
- package/dist/addon-vitest/node/coverage-reporter.js +1284 -0
- package/dist/addon-vitest/node/vitest.js +674 -0
- package/dist/addon-vitest/postinstall.js +24 -0
- package/dist/addon-vitest/preset.js +943 -0
- package/dist/addon-vitest/vitest-plugin/global-setup.js +162 -0
- package/dist/addon-vitest/vitest-plugin/index.d.ts +56 -0
- package/dist/addon-vitest/vitest-plugin/index.js +463 -0
- package/dist/addon-vitest/vitest-plugin/setup-file-with-project-annotations.js +9 -0
- package/dist/addon-vitest/vitest-plugin/setup-file.browser.4.js +20 -0
- package/dist/addon-vitest/vitest-plugin/setup-file.js +50 -0
- package/dist/addon-vitest/vitest-plugin/test-utils.js +128 -0
- package/dist/babel/index.d.ts +2301 -0
- package/dist/babel/index.js +61 -0
- package/dist/backgrounds/index.d.ts +6 -0
- package/dist/backgrounds/index.js +15 -0
- package/dist/bin/core.js +1705 -0
- package/dist/bin/dispatcher.js +43 -0
- package/dist/bin/loader.js +115 -0
- package/dist/builder-vite/index.d.ts +50 -0
- package/dist/builder-vite/index.js +245 -0
- package/dist/builder-vite/preset.js +27 -0
- package/dist/channels/index.d.ts +2 -0
- package/dist/channels/index.js +352 -0
- package/dist/chunk-B2t1tGRh.d.ts +284 -0
- package/dist/chunk-BCoJQE-f.d.ts +602 -0
- package/dist/chunk-BGkgZp-H.d.ts +214 -0
- package/dist/chunk-BTVrWliM.d.ts +115 -0
- package/dist/chunk-BXLImeLy.d.ts +197 -0
- package/dist/chunk-BfBzpgct.d.ts +916 -0
- package/dist/chunk-Bpi2tz-6.d.ts +511 -0
- package/dist/chunk-BxWufQms.d.ts +142 -0
- package/dist/chunk-C-bavsOH.d.ts +34 -0
- package/dist/chunk-C2p5r3Vt.d.ts +13001 -0
- package/dist/chunk-C6PAgHLT.d.ts +12 -0
- package/dist/chunk-CMeX4WRe.d.ts +179 -0
- package/dist/chunk-Ct9xd6IM.d.ts +65 -0
- package/dist/chunk-CwQKNaYL.d.ts +15 -0
- package/dist/chunk-D7DwV41f.d.ts +3622 -0
- package/dist/chunk-DEVFdzxR.d.ts +253 -0
- package/dist/chunk-DaVb55-_.d.ts +124 -0
- package/dist/chunk-DgRNfmj_.d.ts +40 -0
- package/dist/chunk-DoIGKY33.d.ts +666 -0
- package/dist/chunk-Dr3R0DXk.d.ts +40 -0
- package/dist/chunk-DtHByo32.d.ts +55 -0
- package/dist/chunk-Dw1z1Pki.d.ts +933 -0
- package/dist/chunk-DzuY9DXg.d.ts +79 -0
- package/dist/chunk-FjDVzZTj.d.ts +62 -0
- package/dist/chunk-Kt1tW-D1.d.ts +59 -0
- package/dist/chunk-XP8oHzpE.d.ts +6 -0
- package/dist/chunk-gCX81nOr.d.ts +61 -0
- package/dist/chunk-pcFXCimE.d.ts +741 -0
- package/dist/cli/index.d.ts +1174 -0
- package/dist/cli/index.js +5613 -0
- package/dist/cli/skills/content/index.d.ts +72 -0
- package/dist/cli/skills/content/index.js +335 -0
- package/dist/cli/tools/sdk/child-host.d.ts +61 -0
- package/dist/cli/tools/sdk/child-host.js +131 -0
- package/dist/cli/tools/sdk/index.d.ts +137 -0
- package/dist/cli/tools/sdk/index.js +44 -0
- package/dist/cli-commands/bin/index.js +25 -0
- package/dist/client-logger/index.d.ts +31 -0
- package/dist/client-logger/index.js +63 -0
- package/dist/common/index.d.ts +1103 -0
- package/dist/common/index.js +364 -0
- package/dist/components/index.d.ts +1924 -0
- package/dist/components/index.js +13759 -0
- package/dist/core-events/index.d.ts +155 -0
- package/dist/core-events/index.js +136 -0
- package/dist/core-server/index.d.ts +2200 -0
- package/dist/core-server/index.js +4165 -0
- package/dist/core-server/presets/common-manager.css +170 -0
- package/dist/core-server/presets/common-manager.js +4168 -0
- package/dist/core-server/presets/common-override-preset.js +81 -0
- package/dist/core-server/presets/common-preset.js +2187 -0
- package/dist/create/bin/index.js +23 -0
- package/dist/create/index.js +25 -0
- package/dist/csf/csf-utils.d.ts +2 -0
- package/dist/csf/csf-utils.js +19 -0
- package/dist/csf/index.d.ts +7 -0
- package/dist/csf/index.js +2142 -0
- package/dist/csf-tools/index.d.ts +1157 -0
- package/dist/csf-tools/index.js +736 -0
- package/dist/docs-tools/index.d.ts +197 -0
- package/dist/docs-tools/index.js +61 -0
- package/dist/highlight/index.d.ts +10 -0
- package/dist/highlight/index.js +15 -0
- package/dist/instrumenter/index.d.ts +113 -0
- package/dist/instrumenter/index.js +2595 -0
- package/dist/manager/_manager-chunks/globals-runtime-8HkdnU2F.js +6144 -0
- package/dist/manager/_manager-chunks/globals-runtime-B0I9dSVs.js +5564 -0
- package/dist/manager/_manager-chunks/globals-runtime-BIKBO23x.js +3389 -0
- package/dist/manager/_manager-chunks/globals-runtime-BQCkfH1B.js +121 -0
- package/dist/manager/_manager-chunks/globals-runtime-BdGkqNEt.js +45 -0
- package/dist/manager/_manager-chunks/globals-runtime-BmphMP6z.js +1190 -0
- package/dist/manager/_manager-chunks/globals-runtime-BvM-NY2g.js +13307 -0
- package/dist/manager/_manager-chunks/globals-runtime-C02fvgcd.js +9243 -0
- package/dist/manager/_manager-chunks/globals-runtime-CXoVXiJA.js +4468 -0
- package/dist/manager/_manager-chunks/globals-runtime-DkAPXCvc.js +9766 -0
- package/dist/manager/_manager-chunks/globals-runtime-DtcOnYHR.js +5357 -0
- package/dist/manager/_manager-chunks/globals-runtime-DwFqpqya.js +722 -0
- package/dist/manager/_manager-chunks/globals-runtime-FC201B7s.js +6837 -0
- package/dist/manager/_manager-chunks/globals-runtime-ZHrQFa3-.js +10463 -0
- package/dist/manager/_manager-chunks/globals-runtime-eLPTIfX-.js +7759 -0
- package/dist/manager/_manager-chunks/globals-runtime-f5oIrim0.js +5102 -0
- package/dist/manager/_manager-chunks/runtime-B1L9TH89.js +452 -0
- package/dist/manager/_manager-chunks/runtime-Bly6WJLN.js +998 -0
- package/dist/manager/_manager-chunks/runtime-Bry1Biu7.js +8936 -0
- package/dist/manager/_manager-chunks/runtime-D94Vq3oR.js +4014 -0
- package/dist/manager/_manager-chunks/runtime-DMig8mT7.js +77 -0
- package/dist/manager/_manager-chunks/runtime-DcJBhKG9.js +1408 -0
- package/dist/manager/_manager-chunks/runtime-DpgBAFGf.js +22 -0
- package/dist/manager/_manager-chunks/runtime-DtyerpFe.js +979 -0
- package/dist/manager/_manager-chunks/runtime-EITvVbkG.js +46 -0
- package/dist/manager/_manager-chunks/runtime-eDVAYF7N.js +6860 -0
- package/dist/manager/_manager-chunks/runtime-i-PDAHLR.js +2493 -0
- package/dist/manager/globals-runtime.js +2 -0
- package/dist/manager/globals.d.ts +23 -0
- package/dist/manager/globals.js +26 -0
- package/dist/manager/manager-stores.d.ts +2 -0
- package/dist/manager/manager-stores.js +19 -0
- package/dist/manager/runtime.js +2 -0
- package/dist/manager-api/index.d.ts +2 -0
- package/dist/manager-api/index.js +3257 -0
- package/dist/manager-errors.d.ts +89 -0
- package/dist/manager-errors.js +20 -0
- package/dist/mcp/index.d.ts +270 -0
- package/dist/mcp/index.js +305 -0
- package/dist/mocking-utils/index.d.ts +689 -0
- package/dist/mocking-utils/index.js +521 -0
- package/dist/mocking-utils/mocker-runtime.js +1254 -0
- package/dist/nextjs-vite/config/preview.js +3 -0
- package/dist/nextjs-vite/export-mocks/cache/index.d.ts +25 -0
- package/dist/nextjs-vite/export-mocks/cache/index.js +29 -0
- package/dist/nextjs-vite/export-mocks/headers/index.d.ts +37 -0
- package/dist/nextjs-vite/export-mocks/headers/index.js +54 -0
- package/dist/nextjs-vite/export-mocks/link/index.d.ts +9 -0
- package/dist/nextjs-vite/export-mocks/link/index.js +59 -0
- package/dist/nextjs-vite/export-mocks/navigation/index.d.ts +28 -0
- package/dist/nextjs-vite/export-mocks/navigation/index.js +58 -0
- package/dist/nextjs-vite/export-mocks/router/index.d.ts +34 -0
- package/dist/nextjs-vite/export-mocks/router/index.js +63 -0
- package/dist/nextjs-vite/index.d.ts +92 -0
- package/dist/nextjs-vite/index.js +58 -0
- package/dist/nextjs-vite/node/index.d.ts +6 -0
- package/dist/nextjs-vite/node/index.js +20 -0
- package/dist/nextjs-vite/preset.js +648 -0
- package/dist/nextjs-vite/preview.d.ts +20 -0
- package/dist/nextjs-vite/preview.js +11 -0
- package/dist/nextjs-vite/vite-plugin/index.d.ts +6 -0
- package/dist/nextjs-vite/vite-plugin/index.js +19 -0
- package/dist/nextjs-vite-plugin/index.d.ts +28 -0
- package/dist/nextjs-vite-plugin/index.js +923 -0
- package/dist/nextjs-vite-plugin/mocks/storybook.global.js +29 -0
- package/dist/nextjs-vite-plugin/plugins/next-image/alias/image-context.js +8 -0
- package/dist/nextjs-vite-plugin/plugins/next-image/alias/image-default-loader.js +23 -0
- package/dist/nextjs-vite-plugin/plugins/next-image/alias/next-image.js +28 -0
- package/dist/nextjs-vite-plugin/plugins/next-image/alias/next-legacy-image.js +17 -0
- package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/cache/index.js +29 -0
- package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/dynamic/index.js +40 -0
- package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/headers/index.js +55 -0
- package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/link/index.js +63 -0
- package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/navigation/index.js +71 -0
- package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/router/index.js +74 -0
- package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/rsc/server-only.js +7 -0
- package/dist/nextjs-vite-plugin/plugins/next-mocks/alias/safe-stable-stringify/index.js +13 -0
- package/dist/nextjs-vite-plugin/plugins/next-mocks/compatibility/draft-mode.compat.js +7 -0
- package/dist/node-logger/index.d.ts +495 -0
- package/dist/node-logger/index.js +42 -0
- package/dist/oxc-parser/index.d.ts +99 -0
- package/dist/oxc-parser/index.js +275 -0
- package/dist/oxc-parser/worker.js +37 -0
- package/dist/preview/_chunks/runtime-BIzIdDbb.js +10263 -0
- package/dist/preview/_chunks/runtime-BTPtVY1p.js +1102 -0
- package/dist/preview/_chunks/runtime-BZSnICCg.js +8484 -0
- package/dist/preview/_chunks/runtime-BdGkqNEt.js +45 -0
- package/dist/preview/_chunks/runtime-BwSxqk3t.js +63 -0
- package/dist/preview/_chunks/runtime-CqHxptiK.js +6143 -0
- package/dist/preview/_chunks/runtime-CsV4HZPV.js +5064 -0
- package/dist/preview/_chunks/runtime-CxZK_Ln3.js +284 -0
- package/dist/preview/_chunks/runtime-DZToXfvO.js +9767 -0
- package/dist/preview/_chunks/runtime-DrTjJkPY.js +3872 -0
- package/dist/preview/_chunks/runtime-DuHdxMFA.js +387 -0
- package/dist/preview/_chunks/runtime-iXdo8CR8.js +3635 -0
- package/dist/preview/_chunks/runtime-q3wt0e_N.js +6838 -0
- package/dist/preview/globals.d.ts +16 -0
- package/dist/preview/globals.js +20 -0
- package/dist/preview/runtime.js +6 -0
- package/dist/preview-api/index.d.ts +4 -0
- package/dist/preview-api/index.js +147 -0
- package/dist/preview-errors.d.ts +186 -0
- package/dist/preview-errors.js +56 -0
- package/dist/react/docgen/docgen-worker.js +38 -0
- package/dist/react/entry-preview-argtypes.js +9 -0
- package/dist/react/entry-preview-docs.js +12 -0
- package/dist/react/entry-preview-rsc.js +11 -0
- package/dist/react/entry-preview.js +21 -0
- package/dist/react/index.d.ts +119 -0
- package/dist/react/index.js +26 -0
- package/dist/react/preset.js +301 -0
- package/dist/react/preview.d.ts +2 -0
- package/dist/react/preview.js +11 -0
- package/dist/react-native/bin/get-stories.js +34 -0
- package/dist/react-native/index.d.ts +160 -0
- package/dist/react-native/index.js +1547 -0
- package/dist/react-native/metro/node.d.ts +83 -0
- package/dist/react-native/metro/node.js +21 -0
- package/dist/react-native/metro/withStorybook.d.ts +2269 -0
- package/dist/react-native/metro/withStorybook.js +138 -0
- package/dist/react-native/preview.d.ts +6 -0
- package/dist/react-native/preview.js +20 -0
- package/dist/react-native/scripts/generate.d.ts +22 -0
- package/dist/react-native/scripts/generate.js +18 -0
- package/dist/react-native/stub.js +20 -0
- package/dist/react-native-theming/index.d.ts +175 -0
- package/dist/react-native-theming/index.js +2591 -0
- package/dist/react-native-ui/index.d.ts +130 -0
- package/dist/react-native-ui/index.js +1865 -0
- package/dist/react-native-ui-common/index.d.ts +230 -0
- package/dist/react-native-ui-common/index.js +514 -0
- package/dist/react-vite/index.d.ts +4 -0
- package/dist/react-vite/index.js +8 -0
- package/dist/react-vite/node/index.d.ts +6 -0
- package/dist/react-vite/node/index.js +20 -0
- package/dist/react-vite/preset.d.ts +6 -0
- package/dist/react-vite/preset.js +21 -0
- package/dist/router/index.d.ts +141 -0
- package/dist/router/index.js +1217 -0
- package/dist/server-errors.d.ts +2 -0
- package/dist/server-errors.js +149 -0
- package/dist/shared/open-service/index.d.ts +3 -0
- package/dist/shared/open-service/index.js +115 -0
- package/dist/shared/open-service/services/docgen/worker/docgen-worker.js +75 -0
- package/dist/shared/open-service/toolsets/docs/public.d.ts +1296 -0
- package/dist/shared/open-service/toolsets/docs/public.js +991 -0
- package/dist/telemetry/index.d.ts +314 -0
- package/dist/telemetry/index.js +103 -0
- package/dist/test/index.d.ts +158 -0
- package/dist/test/index.js +19421 -0
- package/dist/theming/create.d.ts +15 -0
- package/dist/theming/create.js +11 -0
- package/dist/theming/index.d.ts +54 -0
- package/dist/theming/index.js +511 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +48 -0
- package/dist/viewport/index.d.ts +275 -0
- package/dist/viewport/index.js +21 -0
- package/package.json +1075 -4
- package/template/nextjs-vite/cli/.eslintrc.json +6 -0
- package/template/nextjs-vite/cli/js/Button.jsx +42 -0
- package/template/nextjs-vite/cli/js/Button.stories.js +49 -0
- package/template/nextjs-vite/cli/js/Configure.mdx +470 -0
- package/template/nextjs-vite/cli/js/Header.jsx +58 -0
- package/template/nextjs-vite/cli/js/Header.stories.js +30 -0
- package/template/nextjs-vite/cli/js/Page.jsx +68 -0
- package/template/nextjs-vite/cli/js/Page.stories.js +28 -0
- package/template/nextjs-vite/cli/ts/Button.stories.ts +54 -0
- package/template/nextjs-vite/cli/ts/Button.tsx +39 -0
- package/template/nextjs-vite/cli/ts/Configure.mdx +446 -0
- package/template/nextjs-vite/cli/ts/Header.stories.ts +34 -0
- package/template/nextjs-vite/cli/ts/Header.tsx +54 -0
- package/template/nextjs-vite/cli/ts/Page.stories.ts +33 -0
- package/template/nextjs-vite/cli/ts/Page.tsx +73 -0
- package/template/react/cli/.eslintrc.json +5 -0
- package/template/react/cli/js/Button.jsx +39 -0
- package/template/react/cli/js/Button.stories.js +49 -0
- package/template/react/cli/js/Header.jsx +56 -0
- package/template/react/cli/js/Header.stories.js +29 -0
- package/template/react/cli/js/Page.jsx +69 -0
- package/template/react/cli/js/Page.stories.js +28 -0
- package/template/react/cli/ts/Button.stories.ts +54 -0
- package/template/react/cli/ts/Button.tsx +37 -0
- package/template/react/cli/ts/Header.stories.ts +34 -0
- package/template/react/cli/ts/Header.tsx +56 -0
- package/template/react/cli/ts/Page.stories.ts +33 -0
- package/template/react/cli/ts/Page.tsx +73 -0
- package/template/react-vite/cli/.eslintrc.json +5 -0
- package/template/react-vite/cli/js/Button.jsx +39 -0
- package/template/react-vite/cli/js/Button.stories.js +49 -0
- package/template/react-vite/cli/js/Header.jsx +56 -0
- package/template/react-vite/cli/js/Header.stories.js +29 -0
- package/template/react-vite/cli/js/Page.jsx +69 -0
- package/template/react-vite/cli/js/Page.stories.js +28 -0
- package/template/react-vite/cli/ts/Button.stories.ts +54 -0
- package/template/react-vite/cli/ts/Button.tsx +37 -0
- package/template/react-vite/cli/ts/Header.stories.ts +34 -0
- package/template/react-vite/cli/ts/Header.tsx +56 -0
- package/template/react-vite/cli/ts/Page.stories.ts +33 -0
- package/template/react-vite/cli/ts/Page.tsx +73 -0
|
@@ -0,0 +1,4165 @@
|
|
|
1
|
+
import CJS_COMPAT_NODE_URL_5ewvyy4zw6m from 'node:url';
|
|
2
|
+
import CJS_COMPAT_NODE_PATH_5ewvyy4zw6m from 'node:path';
|
|
3
|
+
import CJS_COMPAT_NODE_MODULE_5ewvyy4zw6m from "node:module";
|
|
4
|
+
|
|
5
|
+
var __filename = CJS_COMPAT_NODE_URL_5ewvyy4zw6m.fileURLToPath(import.meta.url);
|
|
6
|
+
var __dirname = CJS_COMPAT_NODE_PATH_5ewvyy4zw6m.dirname(__filename);
|
|
7
|
+
var require = CJS_COMPAT_NODE_MODULE_5ewvyy4zw6m.createRequire(import.meta.url);
|
|
8
|
+
|
|
9
|
+
// ------------------------------------------------------------
|
|
10
|
+
// end of CJS compatibility banner, injected by Forkbook's esbuild configuration
|
|
11
|
+
// ------------------------------------------------------------
|
|
12
|
+
import {
|
|
13
|
+
fromMarkdown,
|
|
14
|
+
mdxFromMarkdown,
|
|
15
|
+
mdxjs
|
|
16
|
+
} from "../_node-chunks/chunk-CXLL2F6O.js";
|
|
17
|
+
import {
|
|
18
|
+
require_dist
|
|
19
|
+
} from "../_node-chunks/chunk-HKQEE62W.js";
|
|
20
|
+
import {
|
|
21
|
+
BananaSlug
|
|
22
|
+
} from "../_node-chunks/chunk-JBCKN6P4.js";
|
|
23
|
+
import {
|
|
24
|
+
debounce
|
|
25
|
+
} from "../_node-chunks/chunk-IJL5JOLL.js";
|
|
26
|
+
import {
|
|
27
|
+
require_lib
|
|
28
|
+
} from "../_node-chunks/chunk-BE6ULVPN.js";
|
|
29
|
+
import {
|
|
30
|
+
Parser,
|
|
31
|
+
init_acorn,
|
|
32
|
+
require_acorn_jsx
|
|
33
|
+
} from "../_node-chunks/chunk-DWE36J35.js";
|
|
34
|
+
import {
|
|
35
|
+
isTelemetryModuleEnabled,
|
|
36
|
+
telemetry,
|
|
37
|
+
withSpan
|
|
38
|
+
} from "../_node-chunks/chunk-5WHA37KG.js";
|
|
39
|
+
import "../_node-chunks/chunk-XCGMRAV5.js";
|
|
40
|
+
import {
|
|
41
|
+
getEffectiveToolAvailability,
|
|
42
|
+
getManifestStatus,
|
|
43
|
+
getToolAvailability,
|
|
44
|
+
isAddonA11yEnabled,
|
|
45
|
+
isAddonVitestEnabled,
|
|
46
|
+
isClaudePreviewLaunch,
|
|
47
|
+
isModuleGraphSupported,
|
|
48
|
+
resolveSkillInputs
|
|
49
|
+
} from "../_node-chunks/chunk-2JSABFAM.js";
|
|
50
|
+
import {
|
|
51
|
+
CLAUDE_PREVIEW_AGENT_NAME
|
|
52
|
+
} from "../_node-chunks/chunk-WQ7PSP6H.js";
|
|
53
|
+
import "../_node-chunks/chunk-5J3O7EDY.js";
|
|
54
|
+
import "../_node-chunks/chunk-SVZ6Q3CS.js";
|
|
55
|
+
import "../_node-chunks/chunk-DUOXRUVQ.js";
|
|
56
|
+
import {
|
|
57
|
+
detectAgent
|
|
58
|
+
} from "../_node-chunks/chunk-M2BRIUUP.js";
|
|
59
|
+
import "../_node-chunks/chunk-NIHZECYO.js";
|
|
60
|
+
import "../_node-chunks/chunk-ASJFOW6O.js";
|
|
61
|
+
import {
|
|
62
|
+
userOrAutoTitleFromSpecifier
|
|
63
|
+
} from "../_node-chunks/chunk-I2ANCID7.js";
|
|
64
|
+
import "../_node-chunks/chunk-JEC2OK5B.js";
|
|
65
|
+
import "../_node-chunks/chunk-7BVUZZIY.js";
|
|
66
|
+
import "../_node-chunks/chunk-5RNOGGO6.js";
|
|
67
|
+
import {
|
|
68
|
+
resolveImport,
|
|
69
|
+
supportedExtensions
|
|
70
|
+
} from "../_node-chunks/chunk-5GN5N22E.js";
|
|
71
|
+
import "../_node-chunks/chunk-XURIZ7IC.js";
|
|
72
|
+
import "../_node-chunks/chunk-RJXEPYEN.js";
|
|
73
|
+
import {
|
|
74
|
+
require_src
|
|
75
|
+
} from "../_node-chunks/chunk-GP5YLBNS.js";
|
|
76
|
+
import "../_node-chunks/chunk-GT5EHMNM.js";
|
|
77
|
+
import "../_node-chunks/chunk-Y2GH4XO7.js";
|
|
78
|
+
import "../_node-chunks/chunk-Y2DEKWVE.js";
|
|
79
|
+
import "../_node-chunks/chunk-5J3BMBMY.js";
|
|
80
|
+
import "../_node-chunks/chunk-AWXGCPW6.js";
|
|
81
|
+
import {
|
|
82
|
+
logger,
|
|
83
|
+
require_pretty_hrtime
|
|
84
|
+
} from "../_node-chunks/chunk-TB6Y6NSL.js";
|
|
85
|
+
import {
|
|
86
|
+
ChangeDetectionFailureError,
|
|
87
|
+
ChangeDetectionUnavailableError,
|
|
88
|
+
GitDiffProvider,
|
|
89
|
+
MDX_SERVICE_ID,
|
|
90
|
+
analyzeTestResults,
|
|
91
|
+
applyServicesPresetOnce,
|
|
92
|
+
createDocsToolset,
|
|
93
|
+
createLocalDocsAccess,
|
|
94
|
+
createManifestDocsAccess,
|
|
95
|
+
createServiceDocsAccess,
|
|
96
|
+
createStoriesToolset,
|
|
97
|
+
defineService,
|
|
98
|
+
emptyManifests,
|
|
99
|
+
findStoryIds,
|
|
100
|
+
fullStatusStore,
|
|
101
|
+
fullTestProviderStore,
|
|
102
|
+
getBuilders,
|
|
103
|
+
getChangeDetectionReadiness,
|
|
104
|
+
getComponentCandidates,
|
|
105
|
+
getErrorLevel,
|
|
106
|
+
getManagerBuilder,
|
|
107
|
+
getPreviewBuilder,
|
|
108
|
+
getRefsFromConfig,
|
|
109
|
+
getStatusStoreByTypeId,
|
|
110
|
+
getStoryIdsByAbsolutePath,
|
|
111
|
+
getTestProviderStoreById,
|
|
112
|
+
getWsToken,
|
|
113
|
+
loadManifests,
|
|
114
|
+
mapStaticDir,
|
|
115
|
+
mdxManifestRef,
|
|
116
|
+
mdxQueryStaticPath,
|
|
117
|
+
mdxStaticStorePath,
|
|
118
|
+
registerManifests,
|
|
119
|
+
resetChangeDetectionReadiness,
|
|
120
|
+
resetServicesPresetOnce,
|
|
121
|
+
resolveChangeDetectionAdapter,
|
|
122
|
+
reviewToolset,
|
|
123
|
+
runStoryTests,
|
|
124
|
+
sendTelemetryError,
|
|
125
|
+
setChangeDetectionHost,
|
|
126
|
+
setChangeDetectionReadiness,
|
|
127
|
+
storyInputArraySchema,
|
|
128
|
+
toStoryTestResult,
|
|
129
|
+
universalStatusStore,
|
|
130
|
+
universalTestProviderStore,
|
|
131
|
+
useStatics,
|
|
132
|
+
withTelemetry,
|
|
133
|
+
writeManifests
|
|
134
|
+
} from "../_node-chunks/chunk-IZISFDKM.js";
|
|
135
|
+
import {
|
|
136
|
+
UniversalStore
|
|
137
|
+
} from "../_node-chunks/chunk-B6SKX4JF.js";
|
|
138
|
+
import {
|
|
139
|
+
init_build,
|
|
140
|
+
parse
|
|
141
|
+
} from "../_node-chunks/chunk-6APBQVEX.js";
|
|
142
|
+
import "../_node-chunks/chunk-ICADUNQM.js";
|
|
143
|
+
import "../_node-chunks/chunk-PBMWZVLD.js";
|
|
144
|
+
import {
|
|
145
|
+
registerToolset
|
|
146
|
+
} from "../_node-chunks/chunk-MDKFZRYG.js";
|
|
147
|
+
import "../_node-chunks/chunk-QMU5ODXZ.js";
|
|
148
|
+
import "../_node-chunks/chunk-XJSYJTBD.js";
|
|
149
|
+
import "../_node-chunks/chunk-X6OWHTYE.js";
|
|
150
|
+
import {
|
|
151
|
+
STORY_FILE_TEST_REGEXP,
|
|
152
|
+
getStoryImportPathFromEntry,
|
|
153
|
+
require_cross_spawn
|
|
154
|
+
} from "../_node-chunks/chunk-ZBAIFZNB.js";
|
|
155
|
+
import "../_node-chunks/chunk-FUYZNTIS.js";
|
|
156
|
+
import "../_node-chunks/chunk-356LV3NX.js";
|
|
157
|
+
import {
|
|
158
|
+
getService,
|
|
159
|
+
registerService,
|
|
160
|
+
writeOpenServiceStaticFiles
|
|
161
|
+
} from "../_node-chunks/chunk-ULW4SLMN.js";
|
|
162
|
+
import {
|
|
163
|
+
Channel,
|
|
164
|
+
describeService,
|
|
165
|
+
getRegisteredServices,
|
|
166
|
+
listServices
|
|
167
|
+
} from "../_node-chunks/chunk-YWMICX2T.js";
|
|
168
|
+
import "../_node-chunks/chunk-G6PUNHCI.js";
|
|
169
|
+
import "../_node-chunks/chunk-SRXCCL2O.js";
|
|
170
|
+
import "../_node-chunks/chunk-XTTAS346.js";
|
|
171
|
+
import "../_node-chunks/chunk-ZMEGPR47.js";
|
|
172
|
+
import "../_node-chunks/chunk-2UG3IYCC.js";
|
|
173
|
+
import {
|
|
174
|
+
Tag
|
|
175
|
+
} from "../_node-chunks/chunk-KGOAOPKR.js";
|
|
176
|
+
import "../_node-chunks/chunk-2XDUXZGI.js";
|
|
177
|
+
import "../_node-chunks/chunk-CWD5A6NI.js";
|
|
178
|
+
import {
|
|
179
|
+
up2 as up
|
|
180
|
+
} from "../_node-chunks/chunk-NZ3GOT7V.js";
|
|
181
|
+
import {
|
|
182
|
+
invariant
|
|
183
|
+
} from "../_node-chunks/chunk-7TSL7D5D.js";
|
|
184
|
+
import {
|
|
185
|
+
resolvePackageDir,
|
|
186
|
+
safeResolveModule
|
|
187
|
+
} from "../_node-chunks/chunk-ILVD64RB.js";
|
|
188
|
+
import "../_node-chunks/chunk-QVMUIU7S.js";
|
|
189
|
+
import {
|
|
190
|
+
StorybookError
|
|
191
|
+
} from "../_node-chunks/chunk-CYPPELO4.js";
|
|
192
|
+
import {
|
|
193
|
+
require_picocolors
|
|
194
|
+
} from "../_node-chunks/chunk-4PK3LUHM.js";
|
|
195
|
+
import {
|
|
196
|
+
storyIndexPathToAbsolutePath
|
|
197
|
+
} from "../_node-chunks/chunk-EWXASIWR.js";
|
|
198
|
+
import "../_node-chunks/chunk-2BJIHWOK.js";
|
|
199
|
+
import {
|
|
200
|
+
slash
|
|
201
|
+
} from "../_node-chunks/chunk-RJUHZH32.js";
|
|
202
|
+
import "../_node-chunks/chunk-VQEQ7ZLS.js";
|
|
203
|
+
import {
|
|
204
|
+
__commonJS,
|
|
205
|
+
__require,
|
|
206
|
+
__toESM
|
|
207
|
+
} from "../_node-chunks/chunk-NKAUZU4C.js";
|
|
208
|
+
|
|
209
|
+
// ../../node_modules/@discoveryjs/json-ext/package.json
|
|
210
|
+
var require_package = __commonJS({
|
|
211
|
+
"../../node_modules/@discoveryjs/json-ext/package.json"(exports, module) {
|
|
212
|
+
module.exports = {
|
|
213
|
+
name: "@discoveryjs/json-ext",
|
|
214
|
+
version: "0.5.7",
|
|
215
|
+
description: "A set of utilities that extend the use of JSON",
|
|
216
|
+
keywords: [
|
|
217
|
+
"json",
|
|
218
|
+
"utils",
|
|
219
|
+
"stream",
|
|
220
|
+
"async",
|
|
221
|
+
"promise",
|
|
222
|
+
"stringify",
|
|
223
|
+
"info"
|
|
224
|
+
],
|
|
225
|
+
author: "Roman Dvornov <rdvornov@gmail.com> (https://github.com/lahmatiy)",
|
|
226
|
+
license: "MIT",
|
|
227
|
+
repository: "discoveryjs/json-ext",
|
|
228
|
+
main: "./src/index",
|
|
229
|
+
browser: {
|
|
230
|
+
"./src/stringify-stream.js": "./src/stringify-stream-browser.js",
|
|
231
|
+
"./src/text-decoder.js": "./src/text-decoder-browser.js",
|
|
232
|
+
"./src/version.js": "./dist/version.js"
|
|
233
|
+
},
|
|
234
|
+
types: "./index.d.ts",
|
|
235
|
+
scripts: {
|
|
236
|
+
test: "mocha --reporter progress",
|
|
237
|
+
lint: "eslint src test",
|
|
238
|
+
"lint-and-test": "npm run lint && npm test",
|
|
239
|
+
build: "rollup --config",
|
|
240
|
+
"test:all": "npm run test:src && npm run test:dist",
|
|
241
|
+
"test:src": "npm test",
|
|
242
|
+
"test:dist": "cross-env MODE=dist npm test && cross-env MODE=dist-min npm test",
|
|
243
|
+
"build-and-test": "npm run build && npm run test:dist",
|
|
244
|
+
coverage: "c8 --reporter=lcovonly npm test",
|
|
245
|
+
prepublishOnly: "npm run lint && npm test && npm run build-and-test"
|
|
246
|
+
},
|
|
247
|
+
devDependencies: {
|
|
248
|
+
"@rollup/plugin-commonjs": "^15.1.0",
|
|
249
|
+
"@rollup/plugin-json": "^4.1.0",
|
|
250
|
+
"@rollup/plugin-node-resolve": "^9.0.0",
|
|
251
|
+
c8: "^7.10.0",
|
|
252
|
+
chalk: "^4.1.0",
|
|
253
|
+
"cross-env": "^7.0.3",
|
|
254
|
+
eslint: "^8.10.0",
|
|
255
|
+
mocha: "^8.4.0",
|
|
256
|
+
rollup: "^2.28.2",
|
|
257
|
+
"rollup-plugin-terser": "^7.0.2"
|
|
258
|
+
},
|
|
259
|
+
engines: {
|
|
260
|
+
node: ">=10.0.0"
|
|
261
|
+
},
|
|
262
|
+
files: [
|
|
263
|
+
"dist",
|
|
264
|
+
"src",
|
|
265
|
+
"index.d.ts"
|
|
266
|
+
]
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
// ../../node_modules/@discoveryjs/json-ext/src/version.js
|
|
272
|
+
var require_version = __commonJS({
|
|
273
|
+
"../../node_modules/@discoveryjs/json-ext/src/version.js"(exports, module) {
|
|
274
|
+
module.exports = require_package().version;
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
// ../../node_modules/@discoveryjs/json-ext/src/utils.js
|
|
279
|
+
var require_utils = __commonJS({
|
|
280
|
+
"../../node_modules/@discoveryjs/json-ext/src/utils.js"(exports, module) {
|
|
281
|
+
var escapableCharCodeSubstitution = {
|
|
282
|
+
// JSON Single Character Escape Sequences
|
|
283
|
+
8: "\\b",
|
|
284
|
+
9: "\\t",
|
|
285
|
+
10: "\\n",
|
|
286
|
+
12: "\\f",
|
|
287
|
+
13: "\\r",
|
|
288
|
+
34: '\\"',
|
|
289
|
+
92: "\\\\"
|
|
290
|
+
};
|
|
291
|
+
function isLeadingSurrogate(code) {
|
|
292
|
+
return code >= 55296 && code <= 56319;
|
|
293
|
+
}
|
|
294
|
+
function isTrailingSurrogate(code) {
|
|
295
|
+
return code >= 56320 && code <= 57343;
|
|
296
|
+
}
|
|
297
|
+
function isReadableStream(value) {
|
|
298
|
+
return typeof value.pipe == "function" && typeof value._read == "function" && typeof value._readableState == "object" && value._readableState !== null;
|
|
299
|
+
}
|
|
300
|
+
function replaceValue(holder, key, value, replacer) {
|
|
301
|
+
switch (value && typeof value.toJSON == "function" && (value = value.toJSON()), replacer !== null && (value = replacer.call(holder, String(key), value)), typeof value) {
|
|
302
|
+
case "function":
|
|
303
|
+
case "symbol":
|
|
304
|
+
value = void 0;
|
|
305
|
+
break;
|
|
306
|
+
case "object":
|
|
307
|
+
if (value !== null) {
|
|
308
|
+
let cls = value.constructor;
|
|
309
|
+
(cls === String || cls === Number || cls === Boolean) && (value = value.valueOf());
|
|
310
|
+
}
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
313
|
+
return value;
|
|
314
|
+
}
|
|
315
|
+
function getTypeNative(value) {
|
|
316
|
+
return value === null || typeof value != "object" ? 1 : Array.isArray(value) ? 3 : 2;
|
|
317
|
+
}
|
|
318
|
+
function getTypeAsync(value) {
|
|
319
|
+
return value === null || typeof value != "object" ? 1 : typeof value.then == "function" ? 4 : isReadableStream(value) ? value._readableState.objectMode ? 6 : 5 : Array.isArray(value) ? 3 : 2;
|
|
320
|
+
}
|
|
321
|
+
function normalizeReplacer(replacer) {
|
|
322
|
+
return typeof replacer == "function" ? replacer : Array.isArray(replacer) ? [...new Set(
|
|
323
|
+
replacer.map((item) => {
|
|
324
|
+
let cls = item && item.constructor;
|
|
325
|
+
return cls === String || cls === Number ? String(item) : null;
|
|
326
|
+
}).filter((item) => typeof item == "string")
|
|
327
|
+
)] : null;
|
|
328
|
+
}
|
|
329
|
+
function normalizeSpace(space) {
|
|
330
|
+
return typeof space == "number" ? !Number.isFinite(space) || space < 1 ? !1 : " ".repeat(Math.min(space, 10)) : typeof space == "string" && space.slice(0, 10) || !1;
|
|
331
|
+
}
|
|
332
|
+
module.exports = {
|
|
333
|
+
escapableCharCodeSubstitution,
|
|
334
|
+
isLeadingSurrogate,
|
|
335
|
+
isTrailingSurrogate,
|
|
336
|
+
type: {
|
|
337
|
+
PRIMITIVE: 1,
|
|
338
|
+
PROMISE: 4,
|
|
339
|
+
ARRAY: 3,
|
|
340
|
+
OBJECT: 2,
|
|
341
|
+
STRING_STREAM: 5,
|
|
342
|
+
OBJECT_STREAM: 6
|
|
343
|
+
},
|
|
344
|
+
isReadableStream,
|
|
345
|
+
replaceValue,
|
|
346
|
+
getTypeNative,
|
|
347
|
+
getTypeAsync,
|
|
348
|
+
normalizeReplacer,
|
|
349
|
+
normalizeSpace
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
// ../../node_modules/@discoveryjs/json-ext/src/stringify-info.js
|
|
355
|
+
var require_stringify_info = __commonJS({
|
|
356
|
+
"../../node_modules/@discoveryjs/json-ext/src/stringify-info.js"(exports, module) {
|
|
357
|
+
var {
|
|
358
|
+
normalizeReplacer,
|
|
359
|
+
normalizeSpace,
|
|
360
|
+
replaceValue,
|
|
361
|
+
getTypeNative,
|
|
362
|
+
getTypeAsync,
|
|
363
|
+
isLeadingSurrogate,
|
|
364
|
+
isTrailingSurrogate,
|
|
365
|
+
escapableCharCodeSubstitution,
|
|
366
|
+
type: {
|
|
367
|
+
PRIMITIVE,
|
|
368
|
+
OBJECT,
|
|
369
|
+
ARRAY,
|
|
370
|
+
PROMISE,
|
|
371
|
+
STRING_STREAM,
|
|
372
|
+
OBJECT_STREAM
|
|
373
|
+
}
|
|
374
|
+
} = require_utils(), charLength2048 = Array.from({ length: 2048 }).map((_, code) => escapableCharCodeSubstitution.hasOwnProperty(code) ? 2 : code < 32 ? 6 : code < 128 ? 1 : 2);
|
|
375
|
+
function stringLength(str) {
|
|
376
|
+
let len = 0, prevLeadingSurrogate = !1;
|
|
377
|
+
for (let i = 0; i < str.length; i++) {
|
|
378
|
+
let code = str.charCodeAt(i);
|
|
379
|
+
if (code < 2048)
|
|
380
|
+
len += charLength2048[code];
|
|
381
|
+
else if (isLeadingSurrogate(code)) {
|
|
382
|
+
len += 6, prevLeadingSurrogate = !0;
|
|
383
|
+
continue;
|
|
384
|
+
} else isTrailingSurrogate(code) ? len = prevLeadingSurrogate ? len - 2 : len + 6 : len += 3;
|
|
385
|
+
prevLeadingSurrogate = !1;
|
|
386
|
+
}
|
|
387
|
+
return len + 2;
|
|
388
|
+
}
|
|
389
|
+
function primitiveLength(value) {
|
|
390
|
+
switch (typeof value) {
|
|
391
|
+
case "string":
|
|
392
|
+
return stringLength(value);
|
|
393
|
+
case "number":
|
|
394
|
+
return Number.isFinite(value) ? String(value).length : 4;
|
|
395
|
+
case "boolean":
|
|
396
|
+
return value ? 4 : 5;
|
|
397
|
+
case "undefined":
|
|
398
|
+
case "object":
|
|
399
|
+
return 4;
|
|
400
|
+
/* null */
|
|
401
|
+
default:
|
|
402
|
+
return 0;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
function spaceLength(space) {
|
|
406
|
+
return space = normalizeSpace(space), typeof space == "string" ? space.length : 0;
|
|
407
|
+
}
|
|
408
|
+
module.exports = function(value, replacer, space, options) {
|
|
409
|
+
function walk(holder, key, value2) {
|
|
410
|
+
if (stop)
|
|
411
|
+
return;
|
|
412
|
+
value2 = replaceValue(holder, key, value2, replacer);
|
|
413
|
+
let type = getType(value2);
|
|
414
|
+
if (type !== PRIMITIVE && stack.has(value2)) {
|
|
415
|
+
circular.add(value2), length += 4, options.continueOnCircular || (stop = !0);
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
switch (type) {
|
|
419
|
+
case PRIMITIVE:
|
|
420
|
+
value2 !== void 0 || Array.isArray(holder) ? length += primitiveLength(value2) : holder === root && (length += 9);
|
|
421
|
+
break;
|
|
422
|
+
case OBJECT: {
|
|
423
|
+
if (visited.has(value2)) {
|
|
424
|
+
duplicate.add(value2), length += visited.get(value2);
|
|
425
|
+
break;
|
|
426
|
+
}
|
|
427
|
+
let valueLength = length, entries = 0;
|
|
428
|
+
length += 2, stack.add(value2);
|
|
429
|
+
for (let key2 in value2)
|
|
430
|
+
if (hasOwnProperty.call(value2, key2) && (allowlist === null || allowlist.has(key2))) {
|
|
431
|
+
let prevLength = length;
|
|
432
|
+
walk(value2, key2, value2[key2]), prevLength !== length && (length += stringLength(key2) + 1, entries++);
|
|
433
|
+
}
|
|
434
|
+
entries > 1 && (length += entries - 1), stack.delete(value2), space > 0 && entries > 0 && (length += (1 + (stack.size + 1) * space + 1) * entries, length += 1 + stack.size * space), visited.set(value2, length - valueLength);
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
case ARRAY: {
|
|
438
|
+
if (visited.has(value2)) {
|
|
439
|
+
duplicate.add(value2), length += visited.get(value2);
|
|
440
|
+
break;
|
|
441
|
+
}
|
|
442
|
+
let valueLength = length;
|
|
443
|
+
length += 2, stack.add(value2);
|
|
444
|
+
for (let i = 0; i < value2.length; i++)
|
|
445
|
+
walk(value2, i, value2[i]);
|
|
446
|
+
value2.length > 1 && (length += value2.length - 1), stack.delete(value2), space > 0 && value2.length > 0 && (length += (1 + (stack.size + 1) * space) * value2.length, length += 1 + stack.size * space), visited.set(value2, length - valueLength);
|
|
447
|
+
break;
|
|
448
|
+
}
|
|
449
|
+
case PROMISE:
|
|
450
|
+
case STRING_STREAM:
|
|
451
|
+
async.add(value2);
|
|
452
|
+
break;
|
|
453
|
+
case OBJECT_STREAM:
|
|
454
|
+
length += 2, async.add(value2);
|
|
455
|
+
break;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
let allowlist = null;
|
|
459
|
+
replacer = normalizeReplacer(replacer), Array.isArray(replacer) && (allowlist = new Set(replacer), replacer = null), space = spaceLength(space), options = options || {};
|
|
460
|
+
let visited = /* @__PURE__ */ new Map(), stack = /* @__PURE__ */ new Set(), duplicate = /* @__PURE__ */ new Set(), circular = /* @__PURE__ */ new Set(), async = /* @__PURE__ */ new Set(), getType = options.async ? getTypeAsync : getTypeNative, root = { "": value }, stop = !1, length = 0;
|
|
461
|
+
return walk(root, "", value), {
|
|
462
|
+
minLength: isNaN(length) ? 1 / 0 : length,
|
|
463
|
+
circular: [...circular],
|
|
464
|
+
duplicate: [...duplicate],
|
|
465
|
+
async: [...async]
|
|
466
|
+
};
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
// ../../node_modules/@discoveryjs/json-ext/src/stringify-stream.js
|
|
472
|
+
var require_stringify_stream = __commonJS({
|
|
473
|
+
"../../node_modules/@discoveryjs/json-ext/src/stringify-stream.js"(exports, module) {
|
|
474
|
+
var { Readable } = __require("stream"), {
|
|
475
|
+
normalizeReplacer,
|
|
476
|
+
normalizeSpace,
|
|
477
|
+
replaceValue,
|
|
478
|
+
getTypeAsync,
|
|
479
|
+
type: {
|
|
480
|
+
PRIMITIVE,
|
|
481
|
+
OBJECT,
|
|
482
|
+
ARRAY,
|
|
483
|
+
PROMISE,
|
|
484
|
+
STRING_STREAM,
|
|
485
|
+
OBJECT_STREAM
|
|
486
|
+
}
|
|
487
|
+
} = require_utils(), noop = () => {
|
|
488
|
+
}, hasOwnProperty2 = Object.prototype.hasOwnProperty, wellformedStringStringify = JSON.stringify("\uD800") === '"\\ud800"' ? JSON.stringify : (s) => JSON.stringify(s).replace(
|
|
489
|
+
new RegExp("\\p{Surrogate}", "gu"),
|
|
490
|
+
(m) => `\\u${m.charCodeAt(0).toString(16)}`
|
|
491
|
+
);
|
|
492
|
+
function push() {
|
|
493
|
+
this.push(this._stack.value), this.popStack();
|
|
494
|
+
}
|
|
495
|
+
function pushPrimitive(value) {
|
|
496
|
+
switch (typeof value) {
|
|
497
|
+
case "string":
|
|
498
|
+
this.push(this.encodeString(value));
|
|
499
|
+
break;
|
|
500
|
+
case "number":
|
|
501
|
+
this.push(Number.isFinite(value) ? this.encodeNumber(value) : "null");
|
|
502
|
+
break;
|
|
503
|
+
case "boolean":
|
|
504
|
+
this.push(value ? "true" : "false");
|
|
505
|
+
break;
|
|
506
|
+
case "undefined":
|
|
507
|
+
case "object":
|
|
508
|
+
this.push("null");
|
|
509
|
+
break;
|
|
510
|
+
default:
|
|
511
|
+
this.destroy(new TypeError(`Do not know how to serialize a ${value.constructor && value.constructor.name || typeof value}`));
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
function processObjectEntry(key) {
|
|
515
|
+
let current = this._stack;
|
|
516
|
+
current.first ? this.push(",") : current.first = !0, this.space ? this.push(`
|
|
517
|
+
${this.space.repeat(this._depth)}${this.encodeString(key)}: `) : this.push(this.encodeString(key) + ":");
|
|
518
|
+
}
|
|
519
|
+
function processObject() {
|
|
520
|
+
let current = this._stack;
|
|
521
|
+
if (current.index === current.keys.length) {
|
|
522
|
+
this.space && current.first ? this.push(`
|
|
523
|
+
${this.space.repeat(this._depth - 1)}}`) : this.push("}"), this.popStack();
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
let key = current.keys[current.index];
|
|
527
|
+
this.processValue(current.value, key, current.value[key], processObjectEntry), current.index++;
|
|
528
|
+
}
|
|
529
|
+
function processArrayItem(index) {
|
|
530
|
+
index !== 0 && this.push(","), this.space && this.push(`
|
|
531
|
+
${this.space.repeat(this._depth)}`);
|
|
532
|
+
}
|
|
533
|
+
function processArray() {
|
|
534
|
+
let current = this._stack;
|
|
535
|
+
if (current.index === current.value.length) {
|
|
536
|
+
this.space && current.index > 0 ? this.push(`
|
|
537
|
+
${this.space.repeat(this._depth - 1)}]`) : this.push("]"), this.popStack();
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
this.processValue(current.value, current.index, current.value[current.index], processArrayItem), current.index++;
|
|
541
|
+
}
|
|
542
|
+
function createStreamReader(fn) {
|
|
543
|
+
return function() {
|
|
544
|
+
let current = this._stack, data = current.value.read(this._readSize);
|
|
545
|
+
data !== null ? (current.first = !1, fn.call(this, data, current)) : current.first && !current.value._readableState.reading || current.ended ? this.popStack() : (current.first = !0, current.awaiting = !0);
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
var processReadableObject = createStreamReader(function(data, current) {
|
|
549
|
+
this.processValue(current.value, current.index, data, processArrayItem), current.index++;
|
|
550
|
+
}), processReadableString = createStreamReader(function(data) {
|
|
551
|
+
this.push(data);
|
|
552
|
+
}), JsonStringifyStream = class extends Readable {
|
|
553
|
+
constructor(value, replacer, space) {
|
|
554
|
+
if (super({
|
|
555
|
+
autoDestroy: !0
|
|
556
|
+
}), this.getKeys = Object.keys, this.replacer = normalizeReplacer(replacer), Array.isArray(this.replacer)) {
|
|
557
|
+
let allowlist = this.replacer;
|
|
558
|
+
this.getKeys = (value2) => allowlist.filter((key) => hasOwnProperty2.call(value2, key)), this.replacer = null;
|
|
559
|
+
}
|
|
560
|
+
this.space = normalizeSpace(space), this._depth = 0, this.error = null, this._processing = !1, this._ended = !1, this._readSize = 0, this._buffer = "", this._stack = null, this._visited = /* @__PURE__ */ new WeakSet(), this.pushStack({
|
|
561
|
+
handler: () => {
|
|
562
|
+
this.popStack(), this.processValue({ "": value }, "", value, noop);
|
|
563
|
+
}
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
encodeString(value) {
|
|
567
|
+
return /[^\x20-\uD799]|[\x22\x5c]/.test(value) ? wellformedStringStringify(value) : '"' + value + '"';
|
|
568
|
+
}
|
|
569
|
+
encodeNumber(value) {
|
|
570
|
+
return value;
|
|
571
|
+
}
|
|
572
|
+
processValue(holder, key, value, callback) {
|
|
573
|
+
value = replaceValue(holder, key, value, this.replacer);
|
|
574
|
+
let type = getTypeAsync(value);
|
|
575
|
+
switch (type) {
|
|
576
|
+
case PRIMITIVE:
|
|
577
|
+
(callback !== processObjectEntry || value !== void 0) && (callback.call(this, key), pushPrimitive.call(this, value));
|
|
578
|
+
break;
|
|
579
|
+
case OBJECT:
|
|
580
|
+
if (callback.call(this, key), this._visited.has(value))
|
|
581
|
+
return this.destroy(new TypeError("Converting circular structure to JSON"));
|
|
582
|
+
this._visited.add(value), this._depth++, this.push("{"), this.pushStack({
|
|
583
|
+
handler: processObject,
|
|
584
|
+
value,
|
|
585
|
+
index: 0,
|
|
586
|
+
first: !1,
|
|
587
|
+
keys: this.getKeys(value)
|
|
588
|
+
});
|
|
589
|
+
break;
|
|
590
|
+
case ARRAY:
|
|
591
|
+
if (callback.call(this, key), this._visited.has(value))
|
|
592
|
+
return this.destroy(new TypeError("Converting circular structure to JSON"));
|
|
593
|
+
this._visited.add(value), this.push("["), this.pushStack({
|
|
594
|
+
handler: processArray,
|
|
595
|
+
value,
|
|
596
|
+
index: 0
|
|
597
|
+
}), this._depth++;
|
|
598
|
+
break;
|
|
599
|
+
case PROMISE:
|
|
600
|
+
this.pushStack({
|
|
601
|
+
handler: noop,
|
|
602
|
+
awaiting: !0
|
|
603
|
+
}), Promise.resolve(value).then((resolved) => {
|
|
604
|
+
this.popStack(), this.processValue(holder, key, resolved, callback), this.processStack();
|
|
605
|
+
}).catch((error) => {
|
|
606
|
+
this.destroy(error);
|
|
607
|
+
});
|
|
608
|
+
break;
|
|
609
|
+
case STRING_STREAM:
|
|
610
|
+
case OBJECT_STREAM:
|
|
611
|
+
if (callback.call(this, key), value.readableEnded || value._readableState.endEmitted)
|
|
612
|
+
return this.destroy(new Error("Readable Stream has ended before it was serialized. All stream data have been lost"));
|
|
613
|
+
if (value.readableFlowing)
|
|
614
|
+
return this.destroy(new Error("Readable Stream is in flowing mode, data may have been lost. Trying to pause stream."));
|
|
615
|
+
type === OBJECT_STREAM && (this.push("["), this.pushStack({
|
|
616
|
+
handler: push,
|
|
617
|
+
value: this.space ? `
|
|
618
|
+
` + this.space.repeat(this._depth) + "]" : "]"
|
|
619
|
+
}), this._depth++);
|
|
620
|
+
let self = this.pushStack({
|
|
621
|
+
handler: type === OBJECT_STREAM ? processReadableObject : processReadableString,
|
|
622
|
+
value,
|
|
623
|
+
index: 0,
|
|
624
|
+
first: !1,
|
|
625
|
+
ended: !1,
|
|
626
|
+
awaiting: !value.readable || value.readableLength === 0
|
|
627
|
+
}), continueProcessing = () => {
|
|
628
|
+
self.awaiting && (self.awaiting = !1, this.processStack());
|
|
629
|
+
};
|
|
630
|
+
value.once("error", (error) => this.destroy(error)), value.once("end", () => {
|
|
631
|
+
self.ended = !0, continueProcessing();
|
|
632
|
+
}), value.on("readable", continueProcessing);
|
|
633
|
+
break;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
pushStack(node) {
|
|
637
|
+
return node.prev = this._stack, this._stack = node;
|
|
638
|
+
}
|
|
639
|
+
popStack() {
|
|
640
|
+
let { handler, value } = this._stack;
|
|
641
|
+
(handler === processObject || handler === processArray || handler === processReadableObject) && (this._visited.delete(value), this._depth--), this._stack = this._stack.prev;
|
|
642
|
+
}
|
|
643
|
+
processStack() {
|
|
644
|
+
if (!(this._processing || this._ended)) {
|
|
645
|
+
try {
|
|
646
|
+
for (this._processing = !0; this._stack !== null && !this._stack.awaiting; )
|
|
647
|
+
if (this._stack.handler.call(this), !this._processing)
|
|
648
|
+
return;
|
|
649
|
+
this._processing = !1;
|
|
650
|
+
} catch (error) {
|
|
651
|
+
this.destroy(error);
|
|
652
|
+
return;
|
|
653
|
+
}
|
|
654
|
+
this._stack === null && !this._ended && (this._finish(), this.push(null));
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
push(data) {
|
|
658
|
+
if (data !== null) {
|
|
659
|
+
if (this._buffer += data, this._buffer.length < this._readSize)
|
|
660
|
+
return;
|
|
661
|
+
data = this._buffer, this._buffer = "", this._processing = !1;
|
|
662
|
+
}
|
|
663
|
+
super.push(data);
|
|
664
|
+
}
|
|
665
|
+
_read(size) {
|
|
666
|
+
this._readSize = size || this.readableHighWaterMark, this.processStack();
|
|
667
|
+
}
|
|
668
|
+
_finish() {
|
|
669
|
+
this._ended = !0, this._processing = !1, this._stack = null, this._visited = null, this._buffer && this._buffer.length && super.push(this._buffer), this._buffer = "";
|
|
670
|
+
}
|
|
671
|
+
_destroy(error, cb) {
|
|
672
|
+
this.error = this.error || error, this._finish(), cb(error);
|
|
673
|
+
}
|
|
674
|
+
};
|
|
675
|
+
module.exports = function(value, replacer, space) {
|
|
676
|
+
return new JsonStringifyStream(value, replacer, space);
|
|
677
|
+
};
|
|
678
|
+
}
|
|
679
|
+
});
|
|
680
|
+
|
|
681
|
+
// ../../node_modules/@discoveryjs/json-ext/src/text-decoder.js
|
|
682
|
+
var require_text_decoder = __commonJS({
|
|
683
|
+
"../../node_modules/@discoveryjs/json-ext/src/text-decoder.js"(exports, module) {
|
|
684
|
+
module.exports = __require("util").TextDecoder;
|
|
685
|
+
}
|
|
686
|
+
});
|
|
687
|
+
|
|
688
|
+
// ../../node_modules/@discoveryjs/json-ext/src/parse-chunked.js
|
|
689
|
+
var require_parse_chunked = __commonJS({
|
|
690
|
+
"../../node_modules/@discoveryjs/json-ext/src/parse-chunked.js"(exports, module) {
|
|
691
|
+
var { isReadableStream } = require_utils(), TextDecoder = require_text_decoder(), STACK_OBJECT = 1, STACK_ARRAY = 2, decoder = new TextDecoder();
|
|
692
|
+
function isObject(value) {
|
|
693
|
+
return value !== null && typeof value == "object";
|
|
694
|
+
}
|
|
695
|
+
function adjustPosition(error, parser) {
|
|
696
|
+
return error.name === "SyntaxError" && parser.jsonParseOffset && (error.message = error.message.replace(
|
|
697
|
+
/at position (\d+)/,
|
|
698
|
+
(_, pos) => "at position " + (Number(pos) + parser.jsonParseOffset)
|
|
699
|
+
)), error;
|
|
700
|
+
}
|
|
701
|
+
function append(array, elements) {
|
|
702
|
+
let initialLength = array.length;
|
|
703
|
+
array.length += elements.length;
|
|
704
|
+
for (let i = 0; i < elements.length; i++)
|
|
705
|
+
array[initialLength + i] = elements[i];
|
|
706
|
+
}
|
|
707
|
+
module.exports = function(chunkEmitter) {
|
|
708
|
+
let parser = new ChunkParser();
|
|
709
|
+
if (isObject(chunkEmitter) && isReadableStream(chunkEmitter))
|
|
710
|
+
return new Promise((resolve9, reject) => {
|
|
711
|
+
chunkEmitter.on("data", (chunk) => {
|
|
712
|
+
try {
|
|
713
|
+
parser.push(chunk);
|
|
714
|
+
} catch (e) {
|
|
715
|
+
reject(adjustPosition(e, parser)), parser = null;
|
|
716
|
+
}
|
|
717
|
+
}).on("error", (e) => {
|
|
718
|
+
parser = null, reject(e);
|
|
719
|
+
}).on("end", () => {
|
|
720
|
+
try {
|
|
721
|
+
resolve9(parser.finish());
|
|
722
|
+
} catch (e) {
|
|
723
|
+
reject(adjustPosition(e, parser));
|
|
724
|
+
} finally {
|
|
725
|
+
parser = null;
|
|
726
|
+
}
|
|
727
|
+
});
|
|
728
|
+
});
|
|
729
|
+
if (typeof chunkEmitter == "function") {
|
|
730
|
+
let iterator = chunkEmitter();
|
|
731
|
+
if (isObject(iterator) && (Symbol.iterator in iterator || Symbol.asyncIterator in iterator))
|
|
732
|
+
return new Promise(async (resolve9, reject) => {
|
|
733
|
+
try {
|
|
734
|
+
for await (let chunk of iterator)
|
|
735
|
+
parser.push(chunk);
|
|
736
|
+
resolve9(parser.finish());
|
|
737
|
+
} catch (e) {
|
|
738
|
+
reject(adjustPosition(e, parser));
|
|
739
|
+
} finally {
|
|
740
|
+
parser = null;
|
|
741
|
+
}
|
|
742
|
+
});
|
|
743
|
+
}
|
|
744
|
+
throw new Error(
|
|
745
|
+
"Chunk emitter should be readable stream, generator, async generator or function returning an iterable object"
|
|
746
|
+
);
|
|
747
|
+
};
|
|
748
|
+
var ChunkParser = class {
|
|
749
|
+
constructor() {
|
|
750
|
+
this.value = void 0, this.valueStack = null, this.stack = new Array(100), this.lastFlushDepth = 0, this.flushDepth = 0, this.stateString = !1, this.stateStringEscape = !1, this.pendingByteSeq = null, this.pendingChunk = null, this.chunkOffset = 0, this.jsonParseOffset = 0;
|
|
751
|
+
}
|
|
752
|
+
parseAndAppend(fragment, wrap) {
|
|
753
|
+
this.stack[this.lastFlushDepth - 1] === STACK_OBJECT ? (wrap && (this.jsonParseOffset--, fragment = "{" + fragment + "}"), Object.assign(this.valueStack.value, JSON.parse(fragment))) : (wrap && (this.jsonParseOffset--, fragment = "[" + fragment + "]"), append(this.valueStack.value, JSON.parse(fragment)));
|
|
754
|
+
}
|
|
755
|
+
prepareAddition(fragment) {
|
|
756
|
+
let { value } = this.valueStack;
|
|
757
|
+
if (Array.isArray(value) ? value.length !== 0 : Object.keys(value).length !== 0) {
|
|
758
|
+
if (fragment[0] === ",")
|
|
759
|
+
return this.jsonParseOffset++, fragment.slice(1);
|
|
760
|
+
if (fragment[0] !== "}" && fragment[0] !== "]")
|
|
761
|
+
return this.jsonParseOffset -= 3, "[[]" + fragment;
|
|
762
|
+
}
|
|
763
|
+
return fragment;
|
|
764
|
+
}
|
|
765
|
+
flush(chunk, start, end) {
|
|
766
|
+
let fragment = chunk.slice(start, end);
|
|
767
|
+
if (this.jsonParseOffset = this.chunkOffset + start, this.pendingChunk !== null && (fragment = this.pendingChunk + fragment, this.jsonParseOffset -= this.pendingChunk.length, this.pendingChunk = null), this.flushDepth === this.lastFlushDepth)
|
|
768
|
+
this.flushDepth > 0 ? this.parseAndAppend(this.prepareAddition(fragment), !0) : (this.value = JSON.parse(fragment), this.valueStack = {
|
|
769
|
+
value: this.value,
|
|
770
|
+
prev: null
|
|
771
|
+
});
|
|
772
|
+
else if (this.flushDepth > this.lastFlushDepth) {
|
|
773
|
+
for (let i = this.flushDepth - 1; i >= this.lastFlushDepth; i--)
|
|
774
|
+
fragment += this.stack[i] === STACK_OBJECT ? "}" : "]";
|
|
775
|
+
this.lastFlushDepth === 0 ? (this.value = JSON.parse(fragment), this.valueStack = {
|
|
776
|
+
value: this.value,
|
|
777
|
+
prev: null
|
|
778
|
+
}) : this.parseAndAppend(this.prepareAddition(fragment), !0);
|
|
779
|
+
for (let i = this.lastFlushDepth || 1; i < this.flushDepth; i++) {
|
|
780
|
+
let value = this.valueStack.value;
|
|
781
|
+
if (this.stack[i - 1] === STACK_OBJECT) {
|
|
782
|
+
let key;
|
|
783
|
+
for (key in value) ;
|
|
784
|
+
value = value[key];
|
|
785
|
+
} else
|
|
786
|
+
value = value[value.length - 1];
|
|
787
|
+
this.valueStack = {
|
|
788
|
+
value,
|
|
789
|
+
prev: this.valueStack
|
|
790
|
+
};
|
|
791
|
+
}
|
|
792
|
+
} else {
|
|
793
|
+
fragment = this.prepareAddition(fragment);
|
|
794
|
+
for (let i = this.lastFlushDepth - 1; i >= this.flushDepth; i--)
|
|
795
|
+
this.jsonParseOffset--, fragment = (this.stack[i] === STACK_OBJECT ? "{" : "[") + fragment;
|
|
796
|
+
this.parseAndAppend(fragment, !1);
|
|
797
|
+
for (let i = this.lastFlushDepth - 1; i >= this.flushDepth; i--)
|
|
798
|
+
this.valueStack = this.valueStack.prev;
|
|
799
|
+
}
|
|
800
|
+
this.lastFlushDepth = this.flushDepth;
|
|
801
|
+
}
|
|
802
|
+
push(chunk) {
|
|
803
|
+
if (typeof chunk != "string") {
|
|
804
|
+
if (this.pendingByteSeq !== null) {
|
|
805
|
+
let origRawChunk = chunk;
|
|
806
|
+
chunk = new Uint8Array(this.pendingByteSeq.length + origRawChunk.length), chunk.set(this.pendingByteSeq), chunk.set(origRawChunk, this.pendingByteSeq.length), this.pendingByteSeq = null;
|
|
807
|
+
}
|
|
808
|
+
if (chunk[chunk.length - 1] > 127)
|
|
809
|
+
for (let seqLength = 0; seqLength < chunk.length; seqLength++) {
|
|
810
|
+
let byte = chunk[chunk.length - 1 - seqLength];
|
|
811
|
+
if (byte >> 6 === 3) {
|
|
812
|
+
seqLength++, (seqLength !== 4 && byte >> 3 === 30 || seqLength !== 3 && byte >> 4 === 14 || seqLength !== 2 && byte >> 5 === 6) && (this.pendingByteSeq = chunk.slice(chunk.length - seqLength), chunk = chunk.slice(0, -seqLength));
|
|
813
|
+
break;
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
chunk = decoder.decode(chunk);
|
|
817
|
+
}
|
|
818
|
+
let chunkLength = chunk.length, lastFlushPoint = 0, flushPoint = 0;
|
|
819
|
+
scan: for (let i = 0; i < chunkLength; i++) {
|
|
820
|
+
if (this.stateString) {
|
|
821
|
+
for (; i < chunkLength; i++)
|
|
822
|
+
if (this.stateStringEscape)
|
|
823
|
+
this.stateStringEscape = !1;
|
|
824
|
+
else
|
|
825
|
+
switch (chunk.charCodeAt(i)) {
|
|
826
|
+
case 34:
|
|
827
|
+
this.stateString = !1;
|
|
828
|
+
continue scan;
|
|
829
|
+
case 92:
|
|
830
|
+
this.stateStringEscape = !0;
|
|
831
|
+
}
|
|
832
|
+
break;
|
|
833
|
+
}
|
|
834
|
+
switch (chunk.charCodeAt(i)) {
|
|
835
|
+
case 34:
|
|
836
|
+
this.stateString = !0, this.stateStringEscape = !1;
|
|
837
|
+
break;
|
|
838
|
+
case 44:
|
|
839
|
+
flushPoint = i;
|
|
840
|
+
break;
|
|
841
|
+
case 123:
|
|
842
|
+
flushPoint = i + 1, this.stack[this.flushDepth++] = STACK_OBJECT;
|
|
843
|
+
break;
|
|
844
|
+
case 91:
|
|
845
|
+
flushPoint = i + 1, this.stack[this.flushDepth++] = STACK_ARRAY;
|
|
846
|
+
break;
|
|
847
|
+
case 93:
|
|
848
|
+
/* ] */
|
|
849
|
+
case 125:
|
|
850
|
+
flushPoint = i + 1, this.flushDepth--, this.flushDepth < this.lastFlushDepth && (this.flush(chunk, lastFlushPoint, flushPoint), lastFlushPoint = flushPoint);
|
|
851
|
+
break;
|
|
852
|
+
case 9:
|
|
853
|
+
/* \t */
|
|
854
|
+
case 10:
|
|
855
|
+
/* \n */
|
|
856
|
+
case 13:
|
|
857
|
+
/* \r */
|
|
858
|
+
case 32:
|
|
859
|
+
lastFlushPoint === i && lastFlushPoint++, flushPoint === i && flushPoint++;
|
|
860
|
+
break;
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
flushPoint > lastFlushPoint && this.flush(chunk, lastFlushPoint, flushPoint), flushPoint < chunkLength && (this.pendingChunk !== null ? this.pendingChunk += chunk : this.pendingChunk = chunk.slice(flushPoint, chunkLength)), this.chunkOffset += chunkLength;
|
|
864
|
+
}
|
|
865
|
+
finish() {
|
|
866
|
+
return this.pendingChunk !== null && (this.flush("", 0, 0), this.pendingChunk = null), this.value;
|
|
867
|
+
}
|
|
868
|
+
};
|
|
869
|
+
}
|
|
870
|
+
});
|
|
871
|
+
|
|
872
|
+
// ../../node_modules/@discoveryjs/json-ext/src/index.js
|
|
873
|
+
var require_src2 = __commonJS({
|
|
874
|
+
"../../node_modules/@discoveryjs/json-ext/src/index.js"(exports, module) {
|
|
875
|
+
module.exports = {
|
|
876
|
+
version: require_version(),
|
|
877
|
+
stringifyInfo: require_stringify_info(),
|
|
878
|
+
stringifyStream: require_stringify_stream(),
|
|
879
|
+
parseChunked: require_parse_chunked()
|
|
880
|
+
};
|
|
881
|
+
}
|
|
882
|
+
});
|
|
883
|
+
|
|
884
|
+
// ../../node_modules/address/lib/address.js
|
|
885
|
+
var require_address = __commonJS({
|
|
886
|
+
"../../node_modules/address/lib/address.js"(exports, module) {
|
|
887
|
+
"use strict";
|
|
888
|
+
var os3 = __require("os"), fs = __require("fs"), child = __require("child_process"), DEFAULT_RESOLV_FILE = "/etc/resolv.conf";
|
|
889
|
+
function getInterfaceName() {
|
|
890
|
+
var val = "eth", platform = os3.platform();
|
|
891
|
+
return platform === "darwin" ? val = "en" : platform === "win32" && (val = null), val;
|
|
892
|
+
}
|
|
893
|
+
function getIfconfigCMD() {
|
|
894
|
+
return os3.platform() === "win32" ? "ipconfig/all" : "/sbin/ifconfig";
|
|
895
|
+
}
|
|
896
|
+
function matchName(actualFamily, expectedFamily) {
|
|
897
|
+
return expectedFamily === "IPv4" ? actualFamily === "IPv4" || actualFamily === 4 : expectedFamily === "IPv6" ? actualFamily === "IPv6" || actualFamily === 6 : actualFamily === expectedFamily;
|
|
898
|
+
}
|
|
899
|
+
function address(interfaceName, callback) {
|
|
900
|
+
typeof interfaceName == "function" && (callback = interfaceName, interfaceName = null);
|
|
901
|
+
var addr = {
|
|
902
|
+
ip: address.ip(interfaceName),
|
|
903
|
+
ipv6: address.ipv6(interfaceName),
|
|
904
|
+
mac: null
|
|
905
|
+
};
|
|
906
|
+
address.mac(interfaceName, function(err, mac) {
|
|
907
|
+
mac && (addr.mac = mac), callback(err, addr);
|
|
908
|
+
});
|
|
909
|
+
}
|
|
910
|
+
address.interface = function(family, name) {
|
|
911
|
+
var interfaces = os3.networkInterfaces(), noName = !name;
|
|
912
|
+
name = name || getInterfaceName(), family = family || "IPv4";
|
|
913
|
+
for (var i = -1; i < 8; i++) {
|
|
914
|
+
var interfaceName = name + (i >= 0 ? i : ""), items = interfaces[interfaceName];
|
|
915
|
+
if (items)
|
|
916
|
+
for (var j = 0; j < items.length; j++) {
|
|
917
|
+
var item = items[j];
|
|
918
|
+
if (matchName(item.family, family))
|
|
919
|
+
return item;
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
if (noName)
|
|
923
|
+
for (var k in interfaces)
|
|
924
|
+
for (var items = interfaces[k], i = 0; i < items.length; i++) {
|
|
925
|
+
var item = items[i];
|
|
926
|
+
if (matchName(item.family, family) && !item.address.startsWith("127."))
|
|
927
|
+
return item;
|
|
928
|
+
}
|
|
929
|
+
};
|
|
930
|
+
address.ip = function(interfaceName) {
|
|
931
|
+
var item = address.interface("IPv4", interfaceName);
|
|
932
|
+
return item && item.address;
|
|
933
|
+
};
|
|
934
|
+
address.ipv6 = function(interfaceName) {
|
|
935
|
+
var item = address.interface("IPv6", interfaceName);
|
|
936
|
+
return item && item.address;
|
|
937
|
+
};
|
|
938
|
+
var MAC_OSX_START_LINE = /^(\w+)\:\s+flags=/, MAC_LINUX_START_LINE = /^(\w+)\s{2,}link encap:\w+/i, MAC_RE = address.MAC_RE = /(?:ether|HWaddr)\s+((?:[a-z0-9]{2}\:){5}[a-z0-9]{2})/i, MAC_IP_RE = address.MAC_IP_RE = /inet\s(?:addr\:)?(\d+\.\d+\.\d+\.\d+)/;
|
|
939
|
+
function getMAC(content, interfaceName, matchIP) {
|
|
940
|
+
for (var lines = content.split(`
|
|
941
|
+
`), i = 0; i < lines.length; i++) {
|
|
942
|
+
var line = lines[i].trimRight(), m = MAC_OSX_START_LINE.exec(line) || MAC_LINUX_START_LINE.exec(line);
|
|
943
|
+
if (m) {
|
|
944
|
+
var name = m[1];
|
|
945
|
+
if (name.indexOf(interfaceName) === 0) {
|
|
946
|
+
var ip = null, mac = null, match = MAC_RE.exec(line);
|
|
947
|
+
for (match && (mac = match[1]), i++; ; ) {
|
|
948
|
+
if (line = lines[i], !line || MAC_OSX_START_LINE.exec(line) || MAC_LINUX_START_LINE.exec(line)) {
|
|
949
|
+
i--;
|
|
950
|
+
break;
|
|
951
|
+
}
|
|
952
|
+
mac || (match = MAC_RE.exec(line), match && (mac = match[1])), ip || (match = MAC_IP_RE.exec(line), match && (ip = match[1])), i++;
|
|
953
|
+
}
|
|
954
|
+
if (ip === matchIP)
|
|
955
|
+
return mac;
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
address.mac = function(interfaceName, callback) {
|
|
961
|
+
typeof interfaceName == "function" && (callback = interfaceName, interfaceName = null), interfaceName = interfaceName || getInterfaceName();
|
|
962
|
+
var item = address.interface("IPv4", interfaceName);
|
|
963
|
+
if (!item)
|
|
964
|
+
return callback();
|
|
965
|
+
if (!process.env.CI && (item.mac === "ff:00:00:00:00:00" || item.mac === "00:00:00:00:00:00") && (item.mac = ""), item.mac)
|
|
966
|
+
return callback(null, item.mac);
|
|
967
|
+
child.exec(getIfconfigCMD(), { timeout: 5e3 }, function(err, stdout, stderr) {
|
|
968
|
+
if (err || !stdout)
|
|
969
|
+
return callback(err);
|
|
970
|
+
var mac = getMAC(stdout || "", interfaceName, item.address);
|
|
971
|
+
callback(null, mac);
|
|
972
|
+
});
|
|
973
|
+
};
|
|
974
|
+
var DNS_SERVER_RE = /^nameserver\s+(\d+\.\d+\.\d+\.\d+)$/i;
|
|
975
|
+
address.dns = function(filepath, callback) {
|
|
976
|
+
typeof filepath == "function" && (callback = filepath, filepath = null), filepath = filepath || DEFAULT_RESOLV_FILE, fs.readFile(filepath, "utf8", function(err, content) {
|
|
977
|
+
if (err)
|
|
978
|
+
return callback(err);
|
|
979
|
+
var servers = [];
|
|
980
|
+
content = content || "";
|
|
981
|
+
for (var lines = content.split(`
|
|
982
|
+
`), i = 0; i < lines.length; i++) {
|
|
983
|
+
var line = lines[i].trim(), m = DNS_SERVER_RE.exec(line);
|
|
984
|
+
m && servers.push(m[1]);
|
|
985
|
+
}
|
|
986
|
+
callback(null, servers);
|
|
987
|
+
});
|
|
988
|
+
};
|
|
989
|
+
module.exports = address;
|
|
990
|
+
}
|
|
991
|
+
});
|
|
992
|
+
|
|
993
|
+
// ../../node_modules/detect-port/lib/detect-port.js
|
|
994
|
+
var require_detect_port = __commonJS({
|
|
995
|
+
"../../node_modules/detect-port/lib/detect-port.js"(exports, module) {
|
|
996
|
+
"use strict";
|
|
997
|
+
var net4 = __require("net"), address = require_address(), debug = require_src()("detect-port");
|
|
998
|
+
module.exports = (port, callback) => {
|
|
999
|
+
let hostname = "";
|
|
1000
|
+
typeof port == "object" && port ? (hostname = port.hostname, callback = port.callback, port = port.port) : typeof port == "function" && (callback = port, port = null), port = parseInt(port) || 0;
|
|
1001
|
+
let maxPort = port + 10;
|
|
1002
|
+
return maxPort > 65535 && (maxPort = 65535), debug("detect free port between [%s, %s)", port, maxPort), typeof callback == "function" ? tryListen(port, maxPort, hostname, callback) : new Promise((resolve9) => {
|
|
1003
|
+
tryListen(port, maxPort, hostname, (_, realPort) => {
|
|
1004
|
+
resolve9(realPort);
|
|
1005
|
+
});
|
|
1006
|
+
});
|
|
1007
|
+
};
|
|
1008
|
+
function tryListen(port, maxPort, hostname, callback) {
|
|
1009
|
+
function handleError() {
|
|
1010
|
+
port++, port >= maxPort && (debug("port: %s >= maxPort: %s, give up and use random port", port, maxPort), port = 0, maxPort = 0), tryListen(port, maxPort, hostname, callback);
|
|
1011
|
+
}
|
|
1012
|
+
hostname ? listen(port, hostname, (err, realPort) => {
|
|
1013
|
+
if (err)
|
|
1014
|
+
return err.code === "EADDRNOTAVAIL" ? callback(new Error("the ip that is not unknown on the machine")) : handleError();
|
|
1015
|
+
callback(null, realPort);
|
|
1016
|
+
}) : listen(port, null, (err, realPort) => {
|
|
1017
|
+
if (port === 0)
|
|
1018
|
+
return callback(err, realPort);
|
|
1019
|
+
if (err)
|
|
1020
|
+
return handleError(err);
|
|
1021
|
+
listen(port, "0.0.0.0", (err2) => {
|
|
1022
|
+
if (err2)
|
|
1023
|
+
return handleError(err2);
|
|
1024
|
+
listen(port, "localhost", (err3) => {
|
|
1025
|
+
if (err3 && err3.code !== "EADDRNOTAVAIL")
|
|
1026
|
+
return handleError(err3);
|
|
1027
|
+
listen(port, address.ip(), (err4, realPort2) => {
|
|
1028
|
+
if (err4)
|
|
1029
|
+
return handleError(err4);
|
|
1030
|
+
callback(null, realPort2);
|
|
1031
|
+
});
|
|
1032
|
+
});
|
|
1033
|
+
});
|
|
1034
|
+
});
|
|
1035
|
+
}
|
|
1036
|
+
function listen(port, hostname, callback) {
|
|
1037
|
+
let server = new net4.Server();
|
|
1038
|
+
server.on("error", (err) => (debug("listen %s:%s error: %s", hostname, port, err), server.close(), err.code === "ENOTFOUND" ? (debug("ignore dns ENOTFOUND error, get free %s:%s", hostname, port), callback(null, port)) : callback(err))), server.listen(port, hostname, () => (port = server.address().port, server.close(), debug("get free %s:%s", hostname, port), callback(null, port)));
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
});
|
|
1042
|
+
|
|
1043
|
+
// ../../node_modules/detect-port/lib/wait-port.js
|
|
1044
|
+
var require_wait_port = __commonJS({
|
|
1045
|
+
"../../node_modules/detect-port/lib/wait-port.js"(exports, module) {
|
|
1046
|
+
"use strict";
|
|
1047
|
+
var debug = require_src()("wait-port"), detect = require_detect_port(), sleep = (ms) => new Promise((resolve9) => setTimeout(resolve9, ms));
|
|
1048
|
+
async function waitPort(port, options = {}) {
|
|
1049
|
+
let { retryInterval = 1e3, retries = 1 / 0 } = options, count = 1;
|
|
1050
|
+
async function loop() {
|
|
1051
|
+
if (debug("retries", retries, "count", count), count > retries) {
|
|
1052
|
+
let err = new Error("retries exceeded");
|
|
1053
|
+
throw err.retries = retries, err.count = count, err;
|
|
1054
|
+
}
|
|
1055
|
+
return count++, await detect(port) === port ? (await sleep(retryInterval), loop()) : !0;
|
|
1056
|
+
}
|
|
1057
|
+
return await loop();
|
|
1058
|
+
}
|
|
1059
|
+
module.exports = waitPort;
|
|
1060
|
+
}
|
|
1061
|
+
});
|
|
1062
|
+
|
|
1063
|
+
// ../../node_modules/detect-port/index.js
|
|
1064
|
+
var require_detect_port2 = __commonJS({
|
|
1065
|
+
"../../node_modules/detect-port/index.js"(exports, module) {
|
|
1066
|
+
"use strict";
|
|
1067
|
+
module.exports = require_detect_port();
|
|
1068
|
+
module.exports.waitPort = require_wait_port();
|
|
1069
|
+
}
|
|
1070
|
+
});
|
|
1071
|
+
|
|
1072
|
+
// src/core-server/index.ts
|
|
1073
|
+
import {
|
|
1074
|
+
getPreviewHeadTemplate,
|
|
1075
|
+
getPreviewBodyTemplate
|
|
1076
|
+
} from "@aussieljk/forkbook/internal/common";
|
|
1077
|
+
|
|
1078
|
+
// src/core-server/build-static.ts
|
|
1079
|
+
var import_picocolors3 = __toESM(require_picocolors(), 1);
|
|
1080
|
+
import { cp as cp2, mkdir } from "node:fs/promises";
|
|
1081
|
+
import { rm } from "node:fs/promises";
|
|
1082
|
+
import { Channel as Channel2 } from "@aussieljk/forkbook/internal/channels";
|
|
1083
|
+
import {
|
|
1084
|
+
loadAllPresets,
|
|
1085
|
+
loadMainConfig,
|
|
1086
|
+
logConfig,
|
|
1087
|
+
resolveAddonName
|
|
1088
|
+
} from "@aussieljk/forkbook/internal/common";
|
|
1089
|
+
import { logger as logger4 } from "@aussieljk/forkbook/internal/node-logger";
|
|
1090
|
+
import { getPrecedingUpgrade, telemetry as telemetry2 } from "@aussieljk/forkbook/internal/telemetry";
|
|
1091
|
+
import { global as global2 } from "@storybook/global";
|
|
1092
|
+
import { join as join4, relative as relative3, resolve as resolve3 } from "pathe";
|
|
1093
|
+
|
|
1094
|
+
// src/core-server/utils/build-or-throw.ts
|
|
1095
|
+
import { NoMatchingExportError } from "@aussieljk/forkbook/internal/server-errors";
|
|
1096
|
+
async function buildOrThrow(callback) {
|
|
1097
|
+
try {
|
|
1098
|
+
return await callback();
|
|
1099
|
+
} catch (err) {
|
|
1100
|
+
let builderErrors = err.errors;
|
|
1101
|
+
throw builderErrors && builderErrors.find(
|
|
1102
|
+
(er) => er.text?.includes("No matching export")
|
|
1103
|
+
) ? new NoMatchingExportError(err) : err;
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
// src/core-server/utils/copy-all-static-files.ts
|
|
1108
|
+
var import_picocolors = __toESM(require_picocolors(), 1);
|
|
1109
|
+
import { cp } from "node:fs/promises";
|
|
1110
|
+
import { join, relative, resolve } from "node:path";
|
|
1111
|
+
import { logger as logger2 } from "@aussieljk/forkbook/internal/node-logger";
|
|
1112
|
+
async function copyAllStaticFilesRelativeToMain(staticDirs, outputDir, configDir) {
|
|
1113
|
+
return staticDirs?.reduce(async (acc, dir) => {
|
|
1114
|
+
await acc;
|
|
1115
|
+
let { staticPath: from, targetEndpoint: to } = mapStaticDir(dir, configDir), targetPath = join(outputDir, to), skipPaths = ["index.html", "iframe.html", "index.json", "project.json"].map(
|
|
1116
|
+
(f) => resolve(outputDir, f)
|
|
1117
|
+
);
|
|
1118
|
+
from.includes("node_modules") || logger2.info(
|
|
1119
|
+
`Copying static files: ${import_picocolors.default.cyan(print(from))} at ${import_picocolors.default.cyan(print(targetPath))}`
|
|
1120
|
+
), await cp(from, targetPath, {
|
|
1121
|
+
dereference: !0,
|
|
1122
|
+
preserveTimestamps: !0,
|
|
1123
|
+
filter: (_, dest) => !skipPaths.includes(resolve(dest)),
|
|
1124
|
+
recursive: !0,
|
|
1125
|
+
force: !0
|
|
1126
|
+
});
|
|
1127
|
+
}, Promise.resolve());
|
|
1128
|
+
}
|
|
1129
|
+
function print(p) {
|
|
1130
|
+
return relative(process.cwd(), p);
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
// src/core-server/utils/index-json.ts
|
|
1134
|
+
import { writeFile } from "node:fs/promises";
|
|
1135
|
+
import { basename as basename2 } from "node:path";
|
|
1136
|
+
import { STORY_INDEX_INVALIDATED } from "@aussieljk/forkbook/internal/core-events";
|
|
1137
|
+
|
|
1138
|
+
// src/core-server/utils/watch-story-specifiers.ts
|
|
1139
|
+
import { lstatSync } from "node:fs";
|
|
1140
|
+
import { basename, join as join2, relative as relative2, resolve as resolve2, sep } from "node:path";
|
|
1141
|
+
import { commonGlobOptions } from "@aussieljk/forkbook/internal/common";
|
|
1142
|
+
import { subscribe } from "@parcel/watcher";
|
|
1143
|
+
var isDirectory = (directory) => {
|
|
1144
|
+
try {
|
|
1145
|
+
return lstatSync(directory).isDirectory();
|
|
1146
|
+
} catch {
|
|
1147
|
+
return !1;
|
|
1148
|
+
}
|
|
1149
|
+
};
|
|
1150
|
+
function watchDirectories(directories, onEvents) {
|
|
1151
|
+
let existing = [...new Set(directories)].filter(isDirectory), roots = existing.filter(
|
|
1152
|
+
(directory) => !existing.some((other) => directory.startsWith(other + sep))
|
|
1153
|
+
), subscriptions = Promise.all(
|
|
1154
|
+
roots.map(
|
|
1155
|
+
(directory) => subscribe(
|
|
1156
|
+
directory,
|
|
1157
|
+
(error, events2) => {
|
|
1158
|
+
error || onEvents(events2);
|
|
1159
|
+
},
|
|
1160
|
+
{ ignore: ["**/.git", "**/node_modules"] }
|
|
1161
|
+
)
|
|
1162
|
+
)
|
|
1163
|
+
);
|
|
1164
|
+
return async () => {
|
|
1165
|
+
await Promise.all((await subscriptions).map((subscription) => subscription.unsubscribe()));
|
|
1166
|
+
};
|
|
1167
|
+
}
|
|
1168
|
+
function watchStorySpecifiers(specifiers, options, onInvalidate) {
|
|
1169
|
+
let toImportPath = (absolutePath) => {
|
|
1170
|
+
let relativePath = relative2(options.workingDir, absolutePath);
|
|
1171
|
+
return slash(relativePath.startsWith(".") ? relativePath : `./${relativePath}`);
|
|
1172
|
+
};
|
|
1173
|
+
async function onChangeOrRemove(absolutePath, removed) {
|
|
1174
|
+
let importPath = toImportPath(absolutePath);
|
|
1175
|
+
if (specifiers.find((ns) => ns.importPathMatcher.exec(importPath))) {
|
|
1176
|
+
onInvalidate(importPath, removed);
|
|
1177
|
+
return;
|
|
1178
|
+
}
|
|
1179
|
+
!removed && isDirectory(absolutePath) && await Promise.all(
|
|
1180
|
+
specifiers.filter((specifier) => importPath.startsWith(specifier.directory)).map(async (specifier) => {
|
|
1181
|
+
let dirGlob = join2(
|
|
1182
|
+
absolutePath,
|
|
1183
|
+
"**",
|
|
1184
|
+
// files can be e.g. '**/foo/*/*.js' so we just want the last bit,
|
|
1185
|
+
// because the directory could already be within the files part (e.g. './x/foo/bar')
|
|
1186
|
+
basename(specifier.files)
|
|
1187
|
+
), { globby } = await import("../_node-chunks/globby-HWZL7XSQ.js");
|
|
1188
|
+
(await globby(slash(dirGlob), commonGlobOptions(dirGlob))).forEach((filePath) => {
|
|
1189
|
+
let fileImportPath = toImportPath(filePath);
|
|
1190
|
+
specifier.importPathMatcher.exec(fileImportPath) && onInvalidate(fileImportPath, removed);
|
|
1191
|
+
});
|
|
1192
|
+
})
|
|
1193
|
+
);
|
|
1194
|
+
}
|
|
1195
|
+
return watchDirectories(
|
|
1196
|
+
specifiers.map((ns) => resolve2(options.workingDir, ns.directory)),
|
|
1197
|
+
async (events2) => {
|
|
1198
|
+
let removedByPath = new Map(events2.map(({ path, type }) => [path, type === "delete"]));
|
|
1199
|
+
await Promise.all(
|
|
1200
|
+
Array.from(removedByPath, ([path, removed]) => onChangeOrRemove(path, removed))
|
|
1201
|
+
);
|
|
1202
|
+
}
|
|
1203
|
+
);
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
// src/core-server/utils/watchConfig.ts
|
|
1207
|
+
function watchConfig(configDir, onInvalidate) {
|
|
1208
|
+
return watchDirectories([configDir], async (events2) => {
|
|
1209
|
+
await Promise.all(events2.map(({ path, type }) => onInvalidate(path, type === "delete")));
|
|
1210
|
+
});
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1213
|
+
// src/core-server/utils/index-json.ts
|
|
1214
|
+
var DEBOUNCE = 100;
|
|
1215
|
+
async function writeIndexJson(outputFile, initializedStoryIndexGenerator) {
|
|
1216
|
+
let storyIndex = await (await initializedStoryIndexGenerator).getIndex();
|
|
1217
|
+
await writeFile(outputFile, JSON.stringify(storyIndex));
|
|
1218
|
+
}
|
|
1219
|
+
function registerIndexJsonRoute({
|
|
1220
|
+
app,
|
|
1221
|
+
storyIndexGeneratorPromise,
|
|
1222
|
+
workingDir = process.cwd(),
|
|
1223
|
+
configDir,
|
|
1224
|
+
channel,
|
|
1225
|
+
normalizedStories
|
|
1226
|
+
}) {
|
|
1227
|
+
let maybeInvalidate = debounce(
|
|
1228
|
+
() => {
|
|
1229
|
+
channel.emit(STORY_INDEX_INVALIDATED);
|
|
1230
|
+
},
|
|
1231
|
+
DEBOUNCE,
|
|
1232
|
+
{ edges: ["leading", "trailing"] }
|
|
1233
|
+
);
|
|
1234
|
+
watchStorySpecifiers(normalizedStories, { workingDir }, async (path, removed) => {
|
|
1235
|
+
(await storyIndexGeneratorPromise).invalidate(path, removed), maybeInvalidate();
|
|
1236
|
+
}), configDir && watchConfig(configDir, async (filePath) => {
|
|
1237
|
+
basename2(filePath).startsWith("preview") && ((await storyIndexGeneratorPromise).invalidateAll(), maybeInvalidate());
|
|
1238
|
+
}), app.use("/index.json", async (_req, res) => {
|
|
1239
|
+
try {
|
|
1240
|
+
let index = await (await storyIndexGeneratorPromise).getIndex();
|
|
1241
|
+
res.setHeader("Content-Type", "application/json"), res.setHeader("Access-Control-Allow-Origin", "*"), res.setHeader(
|
|
1242
|
+
"Access-Control-Allow-Headers",
|
|
1243
|
+
"Origin, X-Requested-With, Content-Type, Accept"
|
|
1244
|
+
), res.end(JSON.stringify(index));
|
|
1245
|
+
} catch (err) {
|
|
1246
|
+
res.statusCode = 500, res.end(err instanceof Error ? err.toString() : String(err));
|
|
1247
|
+
}
|
|
1248
|
+
});
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
// src/core-server/utils/metadata.ts
|
|
1252
|
+
import { writeFile as writeFile2 } from "node:fs/promises";
|
|
1253
|
+
import { getStorybookMetadata } from "@aussieljk/forkbook/internal/telemetry";
|
|
1254
|
+
async function extractStorybookMetadata(outputFile, configDir) {
|
|
1255
|
+
let storybookMetadata = await getStorybookMetadata(configDir);
|
|
1256
|
+
await writeFile2(outputFile, JSON.stringify(storybookMetadata));
|
|
1257
|
+
}
|
|
1258
|
+
function useStorybookMetadata(app, configDir) {
|
|
1259
|
+
app.use("/project.json", async (req, res) => {
|
|
1260
|
+
let storybookMetadata = await getStorybookMetadata(configDir);
|
|
1261
|
+
res.setHeader("Content-Type", "application/json"), res.write(JSON.stringify(storybookMetadata)), res.end();
|
|
1262
|
+
});
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1265
|
+
// src/core-server/utils/output-stats.ts
|
|
1266
|
+
var import_json_ext = __toESM(require_src2(), 1), import_picocolors2 = __toESM(require_picocolors(), 1);
|
|
1267
|
+
import { createWriteStream } from "node:fs";
|
|
1268
|
+
import { join as join3 } from "node:path";
|
|
1269
|
+
import { logger as logger3 } from "@aussieljk/forkbook/internal/node-logger";
|
|
1270
|
+
async function outputStats(directory, previewStats, managerStats) {
|
|
1271
|
+
if (previewStats) {
|
|
1272
|
+
let filePath = await writeStats(directory, "preview", previewStats);
|
|
1273
|
+
logger3.info(`Preview stats written to ${import_picocolors2.default.cyan(filePath)}`);
|
|
1274
|
+
}
|
|
1275
|
+
if (managerStats) {
|
|
1276
|
+
let filePath = await writeStats(directory, "manager", managerStats);
|
|
1277
|
+
logger3.info(`Manager stats written to ${import_picocolors2.default.cyan(filePath)}`);
|
|
1278
|
+
}
|
|
1279
|
+
}
|
|
1280
|
+
var writeStats = async (directory, name, stats) => {
|
|
1281
|
+
let filePath = join3(directory, `${name}-stats.json`), { chunks, ...data } = stats.toJson();
|
|
1282
|
+
return await new Promise((resolve9, reject) => {
|
|
1283
|
+
(0, import_json_ext.stringifyStream)(data, null, 2).on("error", reject).pipe(createWriteStream(filePath)).on("error", reject).on("finish", resolve9);
|
|
1284
|
+
}), filePath;
|
|
1285
|
+
};
|
|
1286
|
+
|
|
1287
|
+
// src/core-server/utils/summarizeIndex.ts
|
|
1288
|
+
import { isExampleStoryId } from "@aussieljk/forkbook/internal/telemetry";
|
|
1289
|
+
|
|
1290
|
+
// src/shared/utils/story-index-filters.ts
|
|
1291
|
+
function isMdxEntry({ tags }) {
|
|
1292
|
+
return tags?.includes(Tag.UNATTACHED_MDX) || tags?.includes(Tag.ATTACHED_MDX);
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1295
|
+
// src/core-server/utils/summarizeIndex.ts
|
|
1296
|
+
var PAGE_REGEX = /(page|screen)/i, isPageStory = (storyId) => PAGE_REGEX.test(storyId), isCLIExampleEntry = (entry) => [
|
|
1297
|
+
"example-introduction--docs",
|
|
1298
|
+
"configure-your-project--docs",
|
|
1299
|
+
"example-button--docs",
|
|
1300
|
+
"example-button--primary",
|
|
1301
|
+
"example-button--secondary",
|
|
1302
|
+
"example-button--large",
|
|
1303
|
+
"example-button--small",
|
|
1304
|
+
"example-header--docs",
|
|
1305
|
+
"example-header--logged-in",
|
|
1306
|
+
"example-header--logged-out",
|
|
1307
|
+
"example-page--logged-in",
|
|
1308
|
+
"example-page--logged-out"
|
|
1309
|
+
].includes(entry.id);
|
|
1310
|
+
function summarizeIndex(storyIndex) {
|
|
1311
|
+
let storyCount = 0, componentTitles = /* @__PURE__ */ new Set(), exampleStoryCount = 0, exampleDocsCount = 0, pageStoryCount = 0, playStoryCount = 0, testStoryCount = 0, autodocsCount = 0, mdxCount = 0, testsPerParentStory = /* @__PURE__ */ new Map();
|
|
1312
|
+
Object.values(storyIndex.entries).forEach((entry) => {
|
|
1313
|
+
isCLIExampleEntry(entry) || isExampleStoryId(entry.id) ? (entry.type === "story" && (exampleStoryCount += 1), entry.type === "docs" && (exampleDocsCount += 1)) : entry.type === "story" ? (storyCount += 1, componentTitles.add(entry.title), isPageStory(entry.title) && (pageStoryCount += 1), entry.tags?.includes(Tag.PLAY_FN) && (playStoryCount += 1), entry.tags?.includes(Tag.TEST_FN) && entry.parent && (testStoryCount += 1, testsPerParentStory.set(entry.parent, (testsPerParentStory.get(entry.parent) ?? 0) + 1))) : entry.type === "docs" && (isMdxEntry(entry) ? mdxCount += 1 : entry.tags?.includes(Tag.AUTODOCS) && (autodocsCount += 1));
|
|
1314
|
+
});
|
|
1315
|
+
let componentCount = componentTitles.size, maxTestsPerStory = 0, singleTestStoryCount = 0;
|
|
1316
|
+
return testsPerParentStory.forEach((count) => {
|
|
1317
|
+
count > maxTestsPerStory && (maxTestsPerStory = count), count === 1 && (singleTestStoryCount += 1);
|
|
1318
|
+
}), {
|
|
1319
|
+
storyCount,
|
|
1320
|
+
componentCount,
|
|
1321
|
+
pageStoryCount,
|
|
1322
|
+
playStoryCount,
|
|
1323
|
+
testStoryCount,
|
|
1324
|
+
maxTestsPerStory,
|
|
1325
|
+
singleTestStoryCount,
|
|
1326
|
+
autodocsCount,
|
|
1327
|
+
mdxCount,
|
|
1328
|
+
exampleStoryCount,
|
|
1329
|
+
exampleDocsCount,
|
|
1330
|
+
version: storyIndex.v
|
|
1331
|
+
};
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
// src/core-server/build-static.ts
|
|
1335
|
+
async function buildStaticStandalone(options) {
|
|
1336
|
+
if (options.configType = "PRODUCTION", options.outputDir === "")
|
|
1337
|
+
throw new Error("Won't remove current directory. Check your outputDir!");
|
|
1338
|
+
if (options.outputDir = resolve3(options.outputDir), options.configDir = resolve3(options.configDir), logger4.step(`Cleaning outputDir: ${import_picocolors3.default.cyan(relative3(process.cwd(), options.outputDir))}`), options.outputDir === "/")
|
|
1339
|
+
throw new Error("Won't remove directory '/'. Check your outputDir!");
|
|
1340
|
+
await rm(options.outputDir, { recursive: !0, force: !0 }).catch(() => {
|
|
1341
|
+
}), await mkdir(options.outputDir, { recursive: !0 });
|
|
1342
|
+
let config = await loadMainConfig(options), { framework } = config, corePresets = [], frameworkName = typeof framework == "string" ? framework : framework?.name;
|
|
1343
|
+
frameworkName ? corePresets.push(join4(frameworkName, "preset")) : logger4.warn(`you have not specified a framework in your ${options.configDir}/main.js`);
|
|
1344
|
+
let commonPreset = join4(
|
|
1345
|
+
resolvePackageDir("@aussieljk/forkbook"),
|
|
1346
|
+
"dist/core-server/presets/common-preset.js"
|
|
1347
|
+
), commonOverridePreset = import.meta.resolve("@aussieljk/forkbook/internal/core-server/presets/common-override-preset");
|
|
1348
|
+
logger4.step("Loading presets");
|
|
1349
|
+
let channel = new Channel2({}), presets = await loadAllPresets({
|
|
1350
|
+
corePresets: [commonPreset, ...corePresets],
|
|
1351
|
+
overridePresets: [commonOverridePreset],
|
|
1352
|
+
isCritical: !0,
|
|
1353
|
+
channel,
|
|
1354
|
+
...options
|
|
1355
|
+
}), { renderer } = await presets.apply("core", {}), build2 = await presets.apply("build", {}), [previewBuilder, managerBuilder] = await getBuilders({
|
|
1356
|
+
...options,
|
|
1357
|
+
presets,
|
|
1358
|
+
build: build2,
|
|
1359
|
+
channel
|
|
1360
|
+
}), resolvedRenderer = renderer ? resolveAddonName(options.configDir, renderer, options) : void 0;
|
|
1361
|
+
presets = await loadAllPresets({
|
|
1362
|
+
corePresets: [
|
|
1363
|
+
commonPreset,
|
|
1364
|
+
...managerBuilder.corePresets || [],
|
|
1365
|
+
...previewBuilder.corePresets || [],
|
|
1366
|
+
...resolvedRenderer ? [resolvedRenderer] : [],
|
|
1367
|
+
...corePresets
|
|
1368
|
+
],
|
|
1369
|
+
overridePresets: [...previewBuilder.overridePresets || [], commonOverridePreset],
|
|
1370
|
+
build: build2,
|
|
1371
|
+
channel,
|
|
1372
|
+
...options
|
|
1373
|
+
});
|
|
1374
|
+
let [features, core, staticDirs] = await Promise.all([
|
|
1375
|
+
presets.apply("features"),
|
|
1376
|
+
presets.apply("core"),
|
|
1377
|
+
presets.apply("staticDirs")
|
|
1378
|
+
]), invokedBy = process.env.FORKBOOK_INVOKED_BY;
|
|
1379
|
+
invokedBy && telemetry2("test-run", { runner: invokedBy, watch: !1 }, { configDir: options.configDir });
|
|
1380
|
+
let fullOptions = {
|
|
1381
|
+
...options,
|
|
1382
|
+
channel,
|
|
1383
|
+
presets,
|
|
1384
|
+
features,
|
|
1385
|
+
build: build2
|
|
1386
|
+
}, effects = [];
|
|
1387
|
+
global2.FEATURES = features, await applyServicesPresetOnce(presets), options.previewOnly || await buildOrThrow(
|
|
1388
|
+
async () => managerBuilder.build({ startTime: process.hrtime(), options: fullOptions })
|
|
1389
|
+
), staticDirs && effects.push(
|
|
1390
|
+
copyAllStaticFilesRelativeToMain(staticDirs, options.outputDir, options.configDir)
|
|
1391
|
+
);
|
|
1392
|
+
let coreServerPublicDir = join4(resolvePackageDir("@aussieljk/forkbook"), "assets/browser");
|
|
1393
|
+
effects.push(cp2(coreServerPublicDir, options.outputDir, { recursive: !0, force: !0 }));
|
|
1394
|
+
let hasRegisteredServices = getRegisteredServices().length > 0, shouldWriteManifests = features?.componentsManifest;
|
|
1395
|
+
(hasRegisteredServices || shouldWriteManifests) && effects.push(
|
|
1396
|
+
(async () => {
|
|
1397
|
+
hasRegisteredServices && (logger4.info("Building open services.."), await writeOpenServiceStaticFiles(options.outputDir)), shouldWriteManifests && await writeManifests(options.outputDir, presets);
|
|
1398
|
+
})()
|
|
1399
|
+
);
|
|
1400
|
+
let storyIndexGeneratorPromise = presets.apply("storyIndexGenerator");
|
|
1401
|
+
effects.push(writeIndexJson(join4(options.outputDir, "index.json"), storyIndexGeneratorPromise)), core?.disableProjectJson || effects.push(
|
|
1402
|
+
extractStorybookMetadata(join4(options.outputDir, "project.json"), options.configDir)
|
|
1403
|
+
), options.debugWebpack && logConfig("Preview webpack config", await previewBuilder.getConfig(fullOptions)), logger4.info("Building preview..");
|
|
1404
|
+
let startTime = process.hrtime();
|
|
1405
|
+
if (await Promise.all([
|
|
1406
|
+
previewBuilder.build({
|
|
1407
|
+
startTime,
|
|
1408
|
+
options: fullOptions
|
|
1409
|
+
}).then(async (previewStats) => {
|
|
1410
|
+
logger4.trace({ message: "Preview built", time: process.hrtime(startTime) });
|
|
1411
|
+
let statsOption = options.statsJson;
|
|
1412
|
+
if (statsOption) {
|
|
1413
|
+
let target = statsOption === !0 ? options.outputDir : statsOption;
|
|
1414
|
+
await outputStats(target, previewStats);
|
|
1415
|
+
}
|
|
1416
|
+
}).catch((error) => {
|
|
1417
|
+
throw logger4.error("Failed to build the preview"), process.exitCode = 1, error;
|
|
1418
|
+
}),
|
|
1419
|
+
...effects
|
|
1420
|
+
]), !options.test)
|
|
1421
|
+
try {
|
|
1422
|
+
let storyIndex = await (await storyIndexGeneratorPromise)?.getIndex(), payload = {
|
|
1423
|
+
precedingUpgrade: await getPrecedingUpgrade()
|
|
1424
|
+
};
|
|
1425
|
+
storyIndex && Object.assign(payload, {
|
|
1426
|
+
storyIndex: summarizeIndex(storyIndex)
|
|
1427
|
+
}), await telemetry2("build", payload, { configDir: options.configDir });
|
|
1428
|
+
} catch (e) {
|
|
1429
|
+
logger4.debug?.(`Build telemetry failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
1430
|
+
}
|
|
1431
|
+
logger4.step(`Output directory: ${options.outputDir}`);
|
|
1432
|
+
}
|
|
1433
|
+
|
|
1434
|
+
// src/core-server/build-dev.ts
|
|
1435
|
+
import { readFile as readFile3 } from "node:fs/promises";
|
|
1436
|
+
import {
|
|
1437
|
+
JsPackageManagerFactory,
|
|
1438
|
+
getInterpretedFile,
|
|
1439
|
+
getProjectRoot,
|
|
1440
|
+
isWebContainer,
|
|
1441
|
+
defaultConfigDir,
|
|
1442
|
+
loadAllPresets as loadAllPresets2,
|
|
1443
|
+
loadMainConfig as loadMainConfig2,
|
|
1444
|
+
resolveAddonName as resolveAddonName2,
|
|
1445
|
+
resolvePathInStorybookCache as resolvePathInStorybookCache2,
|
|
1446
|
+
validateFrameworkName,
|
|
1447
|
+
versions
|
|
1448
|
+
} from "@aussieljk/forkbook/internal/common";
|
|
1449
|
+
import { CLI_COLORS as CLI_COLORS2, deprecate, logger as logger15, prompt as prompt2 } from "@aussieljk/forkbook/internal/node-logger";
|
|
1450
|
+
import {
|
|
1451
|
+
MissingBuilderError as MissingBuilderError2,
|
|
1452
|
+
NoStatsForViteDevError
|
|
1453
|
+
} from "@aussieljk/forkbook/internal/server-errors";
|
|
1454
|
+
import { oneWayHash, telemetry as telemetry4 } from "@aussieljk/forkbook/internal/telemetry";
|
|
1455
|
+
import { global as global3 } from "@storybook/global";
|
|
1456
|
+
import { join as join8, relative as relative4, resolve as resolve6 } from "pathe";
|
|
1457
|
+
import { dedent as dedent5 } from "ts-dedent";
|
|
1458
|
+
|
|
1459
|
+
// src/channels/postmessage/index.ts
|
|
1460
|
+
var import_telejson = __toESM(require_dist(), 1);
|
|
1461
|
+
import { logger as logger6, pretty } from "@aussieljk/forkbook/internal/client-logger";
|
|
1462
|
+
import * as EVENTS from "@aussieljk/forkbook/internal/core-events";
|
|
1463
|
+
|
|
1464
|
+
// src/shared/utils/local-hosts.ts
|
|
1465
|
+
var LOOPBACK_HOSTNAMES = ["localhost", "*.localhost", "127.0.0.1"], matchesHostname = (hostname, patterns) => patterns.some(
|
|
1466
|
+
(pattern) => pattern.startsWith("*.") ? hostname.endsWith(pattern.slice(1)) : hostname === pattern
|
|
1467
|
+
);
|
|
1468
|
+
|
|
1469
|
+
// src/channels/postmessage/getEventSourceUrl.ts
|
|
1470
|
+
import { logger as logger5 } from "@aussieljk/forkbook/internal/client-logger";
|
|
1471
|
+
|
|
1472
|
+
// src/channels/postmessage/index.ts
|
|
1473
|
+
var { document: document2, location } = globalThis;
|
|
1474
|
+
var CHANNEL_OPTIONS = globalThis.CHANNEL_OPTIONS || {};
|
|
1475
|
+
|
|
1476
|
+
// src/channels/index.ts
|
|
1477
|
+
var channels_default = Channel;
|
|
1478
|
+
|
|
1479
|
+
// src/core-server/dev-server.ts
|
|
1480
|
+
import { logConfig as logConfig2, normalizeStories } from "@aussieljk/forkbook/internal/common";
|
|
1481
|
+
import { logger as logger11 } from "@aussieljk/forkbook/internal/node-logger";
|
|
1482
|
+
import { MissingBuilderError } from "@aussieljk/forkbook/internal/server-errors";
|
|
1483
|
+
import { CHANGE_DETECTION_STATUS_TYPE_ID as CHANGE_DETECTION_STATUS_TYPE_ID2 } from "@aussieljk/forkbook/internal/types";
|
|
1484
|
+
|
|
1485
|
+
// ../../node_modules/@polka/compression/build.mjs
|
|
1486
|
+
import zlib from "node:zlib";
|
|
1487
|
+
var NOOP = () => {
|
|
1488
|
+
}, MIMES = /text|javascript|\/json|xml/i;
|
|
1489
|
+
function getChunkSize(chunk, enc) {
|
|
1490
|
+
return chunk ? Buffer.byteLength(chunk, enc) : 0;
|
|
1491
|
+
}
|
|
1492
|
+
function build_default({ threshold = 1024, level = -1, brotli = !1, gzip = !0, mimes = MIMES } = {}) {
|
|
1493
|
+
let brotliOpts = typeof brotli == "object" && brotli || {}, gzipOpts = typeof gzip == "object" && gzip || {};
|
|
1494
|
+
return zlib.createBrotliCompress || (brotli = !1), (req, res, next = NOOP) => {
|
|
1495
|
+
let accept = req.headers["accept-encoding"] + "", encoding = (brotli && /\bbr\b/.exec(accept) || gzip && /\bgzip\b/.exec(accept) || [])[0];
|
|
1496
|
+
if (req.method === "HEAD" || !encoding) return next();
|
|
1497
|
+
let compress, pendingListeners = [], pendingStatus = 0, started = !1, size = 0;
|
|
1498
|
+
function start() {
|
|
1499
|
+
started = !0, size = res.getHeader("Content-Length") | 0 || size;
|
|
1500
|
+
let compressible = mimes.test(
|
|
1501
|
+
String(res.getHeader("Content-Type") || "text/plain")
|
|
1502
|
+
), cleartext = !res.getHeader("Content-Encoding"), listeners = pendingListeners || [];
|
|
1503
|
+
compressible && cleartext && size >= threshold ? (res.setHeader("Content-Encoding", encoding), res.removeHeader("Content-Length"), encoding === "br" ? compress = zlib.createBrotliCompress({
|
|
1504
|
+
params: Object.assign({
|
|
1505
|
+
[zlib.constants.BROTLI_PARAM_QUALITY]: level,
|
|
1506
|
+
[zlib.constants.BROTLI_PARAM_SIZE_HINT]: size
|
|
1507
|
+
}, brotliOpts)
|
|
1508
|
+
}) : compress = zlib.createGzip(
|
|
1509
|
+
Object.assign({ level }, gzipOpts)
|
|
1510
|
+
), compress.on("data", (chunk) => write.call(res, chunk) || compress.pause()), on.call(res, "drain", () => compress.resume()), compress.on("end", () => end.call(res)), listeners.forEach((p) => compress.on.apply(compress, p))) : (pendingListeners = null, listeners.forEach((p) => on.apply(res, p))), writeHead.call(res, pendingStatus || res.statusCode);
|
|
1511
|
+
}
|
|
1512
|
+
let { end, write, on, writeHead } = res;
|
|
1513
|
+
res.writeHead = function(status, reason, headers) {
|
|
1514
|
+
if (typeof reason != "string" && ([headers, reason] = [reason, headers]), headers) for (let k in headers) res.setHeader(k, headers[k]);
|
|
1515
|
+
return pendingStatus = status, this;
|
|
1516
|
+
}, res.write = function(chunk, enc) {
|
|
1517
|
+
return size += getChunkSize(chunk, enc), started || start(), compress ? compress.write.apply(compress, arguments) : write.apply(this, arguments);
|
|
1518
|
+
}, res.end = function(chunk, enc) {
|
|
1519
|
+
return arguments.length > 0 && typeof chunk != "function" && (size += getChunkSize(chunk, enc)), started || start(), compress ? compress.end.apply(compress, arguments) : end.apply(this, arguments);
|
|
1520
|
+
}, res.on = function(type, listener) {
|
|
1521
|
+
return pendingListeners ? compress ? compress.on(type, listener) : pendingListeners.push([type, listener]) : on.call(this, type, listener), this;
|
|
1522
|
+
}, next();
|
|
1523
|
+
};
|
|
1524
|
+
}
|
|
1525
|
+
|
|
1526
|
+
// ../../node_modules/polka/build.mjs
|
|
1527
|
+
import http from "node:http";
|
|
1528
|
+
import { setImmediate } from "node:timers";
|
|
1529
|
+
|
|
1530
|
+
// ../../node_modules/regexparam/dist/index.mjs
|
|
1531
|
+
function parse3(input, loose) {
|
|
1532
|
+
if (input instanceof RegExp) return { keys: !1, pattern: input };
|
|
1533
|
+
var c, o, tmp, ext, keys = [], pattern = "", arr = input.split("/");
|
|
1534
|
+
for (arr[0] || arr.shift(); tmp = arr.shift(); )
|
|
1535
|
+
c = tmp[0], c === "*" ? (keys.push(c), pattern += tmp[1] === "?" ? "(?:/(.*))?" : "/(.*)") : c === ":" ? (o = tmp.indexOf("?", 1), ext = tmp.indexOf(".", 1), keys.push(tmp.substring(1, ~o ? o : ~ext ? ext : tmp.length)), pattern += ~o && !~ext ? "(?:/([^/]+?))?" : "/([^/]+?)", ~ext && (pattern += (~o ? "?" : "") + "\\" + tmp.substring(ext))) : pattern += "/" + tmp;
|
|
1536
|
+
return {
|
|
1537
|
+
keys,
|
|
1538
|
+
pattern: new RegExp("^" + pattern + (loose ? "(?=$|/)" : "/?$"), "i")
|
|
1539
|
+
};
|
|
1540
|
+
}
|
|
1541
|
+
|
|
1542
|
+
// ../../node_modules/trouter/index.mjs
|
|
1543
|
+
var MAP = {
|
|
1544
|
+
"": 0,
|
|
1545
|
+
GET: 1,
|
|
1546
|
+
HEAD: 2,
|
|
1547
|
+
PATCH: 3,
|
|
1548
|
+
OPTIONS: 4,
|
|
1549
|
+
CONNECT: 5,
|
|
1550
|
+
DELETE: 6,
|
|
1551
|
+
TRACE: 7,
|
|
1552
|
+
POST: 8,
|
|
1553
|
+
PUT: 9
|
|
1554
|
+
}, Trouter = class {
|
|
1555
|
+
constructor() {
|
|
1556
|
+
this.routes = [], this.all = this.add.bind(this, ""), this.get = this.add.bind(this, "GET"), this.head = this.add.bind(this, "HEAD"), this.patch = this.add.bind(this, "PATCH"), this.options = this.add.bind(this, "OPTIONS"), this.connect = this.add.bind(this, "CONNECT"), this.delete = this.add.bind(this, "DELETE"), this.trace = this.add.bind(this, "TRACE"), this.post = this.add.bind(this, "POST"), this.put = this.add.bind(this, "PUT");
|
|
1557
|
+
}
|
|
1558
|
+
use(route, ...fns) {
|
|
1559
|
+
let handlers = [].concat.apply([], fns), { keys, pattern } = parse3(route, !0);
|
|
1560
|
+
return this.routes.push({ keys, pattern, method: "", handlers, midx: MAP[""] }), this;
|
|
1561
|
+
}
|
|
1562
|
+
add(method, route, ...fns) {
|
|
1563
|
+
let { keys, pattern } = parse3(route), handlers = [].concat.apply([], fns);
|
|
1564
|
+
return this.routes.push({ keys, pattern, method, handlers, midx: MAP[method] }), this;
|
|
1565
|
+
}
|
|
1566
|
+
find(method, url) {
|
|
1567
|
+
let midx = MAP[method], isHEAD = midx === 2, i = 0, j = 0, k, tmp, arr = this.routes, matches = [], params = {}, handlers = [];
|
|
1568
|
+
for (; i < arr.length; i++)
|
|
1569
|
+
if (tmp = arr[i], tmp.midx === midx || tmp.midx === 0 || isHEAD && tmp.midx === 1)
|
|
1570
|
+
if (tmp.keys === !1) {
|
|
1571
|
+
if (matches = tmp.pattern.exec(url), matches === null) continue;
|
|
1572
|
+
if (matches.groups !== void 0) for (k in matches.groups) params[k] = matches.groups[k];
|
|
1573
|
+
tmp.handlers.length > 1 ? handlers = handlers.concat(tmp.handlers) : handlers.push(tmp.handlers[0]);
|
|
1574
|
+
} else if (tmp.keys.length > 0) {
|
|
1575
|
+
if (matches = tmp.pattern.exec(url), matches === null) continue;
|
|
1576
|
+
for (j = 0; j < tmp.keys.length; ) params[tmp.keys[j]] = matches[++j];
|
|
1577
|
+
tmp.handlers.length > 1 ? handlers = handlers.concat(tmp.handlers) : handlers.push(tmp.handlers[0]);
|
|
1578
|
+
} else tmp.pattern.test(url) && (tmp.handlers.length > 1 ? handlers = handlers.concat(tmp.handlers) : handlers.push(tmp.handlers[0]));
|
|
1579
|
+
return { params, handlers };
|
|
1580
|
+
}
|
|
1581
|
+
};
|
|
1582
|
+
|
|
1583
|
+
// ../../node_modules/polka/build.mjs
|
|
1584
|
+
init_build();
|
|
1585
|
+
function onError(err, req, res) {
|
|
1586
|
+
let code = typeof err.status == "number" && err.status;
|
|
1587
|
+
code = res.statusCode = code && code >= 100 ? code : 500, typeof err == "string" || Buffer.isBuffer(err) ? res.end(err) : res.end(err.message || http.STATUS_CODES[code]);
|
|
1588
|
+
}
|
|
1589
|
+
var mount = (fn) => fn instanceof Polka ? fn.attach : fn, Polka = class _Polka extends Trouter {
|
|
1590
|
+
constructor(opts = {}) {
|
|
1591
|
+
super(), this.parse = parse, this.server = opts.server, this.handler = this.handler.bind(this), this.onError = opts.onError || onError, this.onNoMatch = opts.onNoMatch || this.onError.bind(null, { status: 404 }), this.attach = (req, res) => setImmediate(this.handler, req, res);
|
|
1592
|
+
}
|
|
1593
|
+
use(base, ...fns) {
|
|
1594
|
+
return base === "/" ? super.use(base, fns.map(mount)) : typeof base == "function" || base instanceof _Polka ? super.use("/", [base, ...fns].map(mount)) : super.use(
|
|
1595
|
+
base,
|
|
1596
|
+
(req, _, next) => {
|
|
1597
|
+
if (typeof base == "string") {
|
|
1598
|
+
let len = base.length;
|
|
1599
|
+
base.startsWith("/") || len++, req.url = req.url.substring(len) || "/", req.path = req.path.substring(len) || "/";
|
|
1600
|
+
} else
|
|
1601
|
+
req.url = req.url.replace(base, "") || "/", req.path = req.path.replace(base, "") || "/";
|
|
1602
|
+
req.url.charAt(0) !== "/" && (req.url = "/" + req.url), next();
|
|
1603
|
+
},
|
|
1604
|
+
fns.map(mount),
|
|
1605
|
+
(req, _, next) => {
|
|
1606
|
+
req.path = req._parsedUrl.pathname, req.url = req.path + req._parsedUrl.search, next();
|
|
1607
|
+
}
|
|
1608
|
+
), this;
|
|
1609
|
+
}
|
|
1610
|
+
listen() {
|
|
1611
|
+
return (this.server = this.server || http.createServer()).on("request", this.attach), this.server.listen.apply(this.server, arguments), this;
|
|
1612
|
+
}
|
|
1613
|
+
handler(req, res, next) {
|
|
1614
|
+
let info = this.parse(req), path = info.pathname, obj = this.find(req.method, req.path = path);
|
|
1615
|
+
if (req.url = path + info.search, req.originalUrl = req.originalUrl || req.url, req.query = info.query || {}, req.search = info.search, req.params = obj.params, path.length > 1 && path.indexOf("%", 1) !== -1)
|
|
1616
|
+
for (let k in req.params)
|
|
1617
|
+
try {
|
|
1618
|
+
req.params[k] = decodeURIComponent(req.params[k]);
|
|
1619
|
+
} catch {
|
|
1620
|
+
}
|
|
1621
|
+
let i = 0, arr = obj.handlers.concat(this.onNoMatch), len = arr.length, loop = async () => res.finished || i < len && arr[i++](req, res, next);
|
|
1622
|
+
(next = next || ((err) => err ? this.onError(err, req, res, next) : loop().catch(next)))();
|
|
1623
|
+
}
|
|
1624
|
+
};
|
|
1625
|
+
function build_default2(opts) {
|
|
1626
|
+
return new Polka(opts);
|
|
1627
|
+
}
|
|
1628
|
+
|
|
1629
|
+
// src/core-server/change-detection/change-detection-service.ts
|
|
1630
|
+
import { join as join5, normalize } from "pathe";
|
|
1631
|
+
|
|
1632
|
+
// ../../node_modules/dequal/dist/index.mjs
|
|
1633
|
+
var has = Object.prototype.hasOwnProperty;
|
|
1634
|
+
function find(iter, tar, key) {
|
|
1635
|
+
for (key of iter.keys())
|
|
1636
|
+
if (dequal(key, tar)) return key;
|
|
1637
|
+
}
|
|
1638
|
+
function dequal(foo, bar) {
|
|
1639
|
+
var ctor, len, tmp;
|
|
1640
|
+
if (foo === bar) return !0;
|
|
1641
|
+
if (foo && bar && (ctor = foo.constructor) === bar.constructor) {
|
|
1642
|
+
if (ctor === Date) return foo.getTime() === bar.getTime();
|
|
1643
|
+
if (ctor === RegExp) return foo.toString() === bar.toString();
|
|
1644
|
+
if (ctor === Array) {
|
|
1645
|
+
if ((len = foo.length) === bar.length)
|
|
1646
|
+
for (; len-- && dequal(foo[len], bar[len]); ) ;
|
|
1647
|
+
return len === -1;
|
|
1648
|
+
}
|
|
1649
|
+
if (ctor === Set) {
|
|
1650
|
+
if (foo.size !== bar.size)
|
|
1651
|
+
return !1;
|
|
1652
|
+
for (len of foo)
|
|
1653
|
+
if (tmp = len, tmp && typeof tmp == "object" && (tmp = find(bar, tmp), !tmp) || !bar.has(tmp)) return !1;
|
|
1654
|
+
return !0;
|
|
1655
|
+
}
|
|
1656
|
+
if (ctor === Map) {
|
|
1657
|
+
if (foo.size !== bar.size)
|
|
1658
|
+
return !1;
|
|
1659
|
+
for (len of foo)
|
|
1660
|
+
if (tmp = len[0], tmp && typeof tmp == "object" && (tmp = find(bar, tmp), !tmp) || !dequal(len[1], bar.get(tmp)))
|
|
1661
|
+
return !1;
|
|
1662
|
+
return !0;
|
|
1663
|
+
}
|
|
1664
|
+
if (ctor === ArrayBuffer)
|
|
1665
|
+
foo = new Uint8Array(foo), bar = new Uint8Array(bar);
|
|
1666
|
+
else if (ctor === DataView) {
|
|
1667
|
+
if ((len = foo.byteLength) === bar.byteLength)
|
|
1668
|
+
for (; len-- && foo.getInt8(len) === bar.getInt8(len); ) ;
|
|
1669
|
+
return len === -1;
|
|
1670
|
+
}
|
|
1671
|
+
if (ArrayBuffer.isView(foo)) {
|
|
1672
|
+
if ((len = foo.byteLength) === bar.byteLength)
|
|
1673
|
+
for (; len-- && foo[len] === bar[len]; ) ;
|
|
1674
|
+
return len === -1;
|
|
1675
|
+
}
|
|
1676
|
+
if (!ctor || typeof foo == "object") {
|
|
1677
|
+
len = 0;
|
|
1678
|
+
for (ctor in foo)
|
|
1679
|
+
if (has.call(foo, ctor) && ++len && !has.call(bar, ctor) || !(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return !1;
|
|
1680
|
+
return Object.keys(bar).length === len;
|
|
1681
|
+
}
|
|
1682
|
+
}
|
|
1683
|
+
return foo !== foo && bar !== bar;
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1686
|
+
// src/core-server/change-detection/change-detection-service.ts
|
|
1687
|
+
import { logger as logger7 } from "@aussieljk/forkbook/internal/node-logger";
|
|
1688
|
+
import { CHANGE_DETECTION_STATUS_TYPE_ID } from "@aussieljk/forkbook/internal/types";
|
|
1689
|
+
|
|
1690
|
+
// src/core-server/change-detection/IndexBaselineService.ts
|
|
1691
|
+
import {
|
|
1692
|
+
createFileSystemCache,
|
|
1693
|
+
resolvePathInStorybookCache
|
|
1694
|
+
} from "@aussieljk/forkbook/internal/common";
|
|
1695
|
+
var DEFAULT_CACHE_KEY = "index-baseline";
|
|
1696
|
+
function extractBaselineEntryIds(storyIndex) {
|
|
1697
|
+
let entryIds = /* @__PURE__ */ new Set();
|
|
1698
|
+
return Object.values(storyIndex.entries).forEach((entry) => {
|
|
1699
|
+
(entry.type === "story" || entry.type === "docs") && !entry.importPath.startsWith("virtual:") && entryIds.add(entry.id);
|
|
1700
|
+
}), entryIds;
|
|
1701
|
+
}
|
|
1702
|
+
var IndexBaselineService = class {
|
|
1703
|
+
constructor(options) {
|
|
1704
|
+
this.options = options;
|
|
1705
|
+
this.baselineEntryIds = /* @__PURE__ */ new Set();
|
|
1706
|
+
this.syncInFlight = !1;
|
|
1707
|
+
this.cache = options.cache ?? createFileSystemCache({
|
|
1708
|
+
basePath: resolvePathInStorybookCache(DEFAULT_CACHE_KEY),
|
|
1709
|
+
ns: "storybook"
|
|
1710
|
+
});
|
|
1711
|
+
}
|
|
1712
|
+
start() {
|
|
1713
|
+
return this.initializePromise || (this.initializePromise = this.initialize().catch(() => {
|
|
1714
|
+
this.baselineEntryIds = /* @__PURE__ */ new Set();
|
|
1715
|
+
})), this.initializePromise;
|
|
1716
|
+
}
|
|
1717
|
+
async getBaselineEntryIds() {
|
|
1718
|
+
return await this.start(), new Set(this.baselineEntryIds);
|
|
1719
|
+
}
|
|
1720
|
+
async handleGitStateChange() {
|
|
1721
|
+
if (await this.start(), !this.syncInFlight)
|
|
1722
|
+
try {
|
|
1723
|
+
if (this.syncInFlight = !0, !await this.options.gitDiffProvider.isWorkingTreeClean())
|
|
1724
|
+
return;
|
|
1725
|
+
let headCommit = await this.options.gitDiffProvider.getHeadCommit();
|
|
1726
|
+
await this.refreshBaseline(headCommit), this.options.onBaselineUpdated();
|
|
1727
|
+
} finally {
|
|
1728
|
+
this.syncInFlight = !1;
|
|
1729
|
+
}
|
|
1730
|
+
}
|
|
1731
|
+
async initialize() {
|
|
1732
|
+
if (!await this.options.gitDiffProvider.isWorkingTreeClean()) {
|
|
1733
|
+
await this.refreshBaseline();
|
|
1734
|
+
return;
|
|
1735
|
+
}
|
|
1736
|
+
let headCommit = await this.options.gitDiffProvider.getHeadCommit(), cachedSnapshot = await this.cache.get(headCommit);
|
|
1737
|
+
if (cachedSnapshot?.entryIds?.length) {
|
|
1738
|
+
this.baselineEntryIds = new Set(cachedSnapshot.entryIds);
|
|
1739
|
+
return;
|
|
1740
|
+
}
|
|
1741
|
+
await this.refreshBaseline(headCommit);
|
|
1742
|
+
}
|
|
1743
|
+
async refreshBaseline(persistenceKey) {
|
|
1744
|
+
let storyIndex = await (await this.options.storyIndexGeneratorPromise).getIndex(), entryIds = Array.from(extractBaselineEntryIds(storyIndex)).sort();
|
|
1745
|
+
this.baselineEntryIds = new Set(entryIds), persistenceKey && await this.cache.set(persistenceKey, { entryIds });
|
|
1746
|
+
}
|
|
1747
|
+
};
|
|
1748
|
+
|
|
1749
|
+
// src/core-server/change-detection/change-detection-service.ts
|
|
1750
|
+
var CHANGE_DETECTION_DEBOUNCE_MS = 200;
|
|
1751
|
+
function errorLikeToError(errorLike) {
|
|
1752
|
+
let error = new Error(errorLike.message, {
|
|
1753
|
+
cause: errorLike.cause ? errorLikeToError(errorLike.cause) : void 0
|
|
1754
|
+
});
|
|
1755
|
+
return error.name = errorLike.name ?? error.name, errorLike.stack && (error.stack = errorLike.stack), error;
|
|
1756
|
+
}
|
|
1757
|
+
function isSameStatus(a, b) {
|
|
1758
|
+
return a ? a.storyId === b.storyId && a.typeId === b.typeId && a.value === b.value && a.title === b.title && a.description === b.description && a.sidebarContextMenu === b.sidebarContextMenu && dequal(a.data, b.data) : !1;
|
|
1759
|
+
}
|
|
1760
|
+
function mergeStatusValues(previousValue, nextValue) {
|
|
1761
|
+
return previousValue === "status-value:new" || nextValue === "status-value:new" ? "status-value:new" : previousValue === "status-value:modified" || nextValue === "status-value:modified" ? "status-value:modified" : previousValue === "status-value:affected" || nextValue === "status-value:affected" ? "status-value:affected" : nextValue;
|
|
1762
|
+
}
|
|
1763
|
+
function mergeChangeDetectionStatuses(existing, incoming) {
|
|
1764
|
+
return {
|
|
1765
|
+
...incoming,
|
|
1766
|
+
value: mergeStatusValues(existing?.value, incoming.value),
|
|
1767
|
+
title: incoming.title || existing?.title || "",
|
|
1768
|
+
description: incoming.description || existing?.description || "",
|
|
1769
|
+
sidebarContextMenu: incoming.sidebarContextMenu ?? existing?.sidebarContextMenu ?? !1
|
|
1770
|
+
};
|
|
1771
|
+
}
|
|
1772
|
+
function buildIndexBaselineStatuses(storyIndex, baselineEntryIds) {
|
|
1773
|
+
let statuses = /* @__PURE__ */ new Map();
|
|
1774
|
+
if (baselineEntryIds.size === 0)
|
|
1775
|
+
return statuses;
|
|
1776
|
+
for (let entryId of extractBaselineEntryIds(storyIndex))
|
|
1777
|
+
baselineEntryIds.has(entryId) || statuses.set(entryId, {
|
|
1778
|
+
storyId: entryId,
|
|
1779
|
+
typeId: CHANGE_DETECTION_STATUS_TYPE_ID,
|
|
1780
|
+
value: "status-value:new",
|
|
1781
|
+
title: "",
|
|
1782
|
+
description: "",
|
|
1783
|
+
sidebarContextMenu: !1
|
|
1784
|
+
});
|
|
1785
|
+
return statuses;
|
|
1786
|
+
}
|
|
1787
|
+
var ChangeDetectionService = class {
|
|
1788
|
+
constructor(options) {
|
|
1789
|
+
this.options = options;
|
|
1790
|
+
this.disposed = !1;
|
|
1791
|
+
this.scanInFlight = !1;
|
|
1792
|
+
this.rerunAfterCurrentScan = !1;
|
|
1793
|
+
this.readinessResolved = !1;
|
|
1794
|
+
this.statusPipelineStarted = !1;
|
|
1795
|
+
this.previousStatuses = /* @__PURE__ */ new Map();
|
|
1796
|
+
this.gitDiffProvider = options.gitDiffProvider, this.indexBaselineService = options.indexBaselineService, this.workingDir = options.workingDir ?? process.cwd(), this.debounceMs = options.debounceMs ?? CHANGE_DETECTION_DEBOUNCE_MS, resetChangeDetectionReadiness();
|
|
1797
|
+
}
|
|
1798
|
+
getModuleGraph() {
|
|
1799
|
+
return getService("core/module-graph", { internal: !0 });
|
|
1800
|
+
}
|
|
1801
|
+
getModuleGraphIndex() {
|
|
1802
|
+
return getService("core/module-graph-index", { internal: !0 });
|
|
1803
|
+
}
|
|
1804
|
+
onGraphReady() {
|
|
1805
|
+
this.disposed || this.startStatusPipeline();
|
|
1806
|
+
}
|
|
1807
|
+
onGraphChange() {
|
|
1808
|
+
this.disposed || this.scheduleScan(this.debounceMs);
|
|
1809
|
+
}
|
|
1810
|
+
onGraphError(error) {
|
|
1811
|
+
this.disposed || (this.resolveReadiness({ status: "error", error }), this.dispose().catch(() => {
|
|
1812
|
+
}));
|
|
1813
|
+
}
|
|
1814
|
+
onGraphUnavailable(reason, error) {
|
|
1815
|
+
this.disposed || (logger7.warn(`Change detection unavailable: ${reason}`), this.resolveReadiness({ status: "unavailable", reason, error }), this.dispose());
|
|
1816
|
+
}
|
|
1817
|
+
onModuleGraphStatus(status) {
|
|
1818
|
+
if (!this.disposed) {
|
|
1819
|
+
if (status.value === "ready") {
|
|
1820
|
+
this.onGraphReady();
|
|
1821
|
+
return;
|
|
1822
|
+
}
|
|
1823
|
+
if (status.value === "error") {
|
|
1824
|
+
this.onGraphError(errorLikeToError(status.error));
|
|
1825
|
+
return;
|
|
1826
|
+
}
|
|
1827
|
+
status.value === "unavailable" && this.onGraphUnavailable(
|
|
1828
|
+
status.reason,
|
|
1829
|
+
status.error ? errorLikeToError(status.error) : void 0
|
|
1830
|
+
);
|
|
1831
|
+
}
|
|
1832
|
+
}
|
|
1833
|
+
start() {
|
|
1834
|
+
let moduleGraph = this.getModuleGraph();
|
|
1835
|
+
this.unsubscribeModuleGraphStatus = moduleGraph.queries.status.subscribe(
|
|
1836
|
+
void 0,
|
|
1837
|
+
({ data }) => {
|
|
1838
|
+
data !== void 0 && this.onModuleGraphStatus(data);
|
|
1839
|
+
}
|
|
1840
|
+
), this.unsubscribeFileActivity = moduleGraph.queries.fileActivityRevision.subscribe(
|
|
1841
|
+
void 0,
|
|
1842
|
+
({ data }) => {
|
|
1843
|
+
(data ?? 0) > 0 && this.onGraphChange();
|
|
1844
|
+
}
|
|
1845
|
+
), moduleGraph.queries.status.loaded(void 0).then((status) => {
|
|
1846
|
+
this.onModuleGraphStatus(status);
|
|
1847
|
+
}).catch((error) => {
|
|
1848
|
+
this.onGraphError(error instanceof Error ? error : new Error(String(error)));
|
|
1849
|
+
});
|
|
1850
|
+
}
|
|
1851
|
+
/**
|
|
1852
|
+
* Wires the git-diff-driven status pipeline. Runs once the dependency graph is ready (so the
|
|
1853
|
+
* initial scan and every git-state-change scan read a populated reverse index).
|
|
1854
|
+
*/
|
|
1855
|
+
startStatusPipeline() {
|
|
1856
|
+
this.disposed || this.statusPipelineStarted || (this.statusPipelineStarted = !0, this.getIndexBaselineService().start(), this.getGitDiffProvider().onGitStateChange(() => {
|
|
1857
|
+
this.disposed || (this.scheduleScan(this.debounceMs), this.getIndexBaselineService().handleGitStateChange().catch(() => {
|
|
1858
|
+
}));
|
|
1859
|
+
}), this.scheduleScan(0));
|
|
1860
|
+
}
|
|
1861
|
+
async dispose() {
|
|
1862
|
+
this.disposed || (this.disposed = !0, this.rerunAfterCurrentScan = !1, this.debounceTimer && (clearTimeout(this.debounceTimer), this.debounceTimer = void 0), this.gitDiffProvider?.dispose(), this.unsubscribeModuleGraphStatus?.(), this.unsubscribeModuleGraphStatus = void 0, this.unsubscribeFileActivity?.(), this.unsubscribeFileActivity = void 0);
|
|
1863
|
+
}
|
|
1864
|
+
scheduleScan(delayMs) {
|
|
1865
|
+
this.debounceTimer && clearTimeout(this.debounceTimer), this.debounceTimer = setTimeout(() => {
|
|
1866
|
+
this.debounceTimer = void 0, this.scan();
|
|
1867
|
+
}, delayMs);
|
|
1868
|
+
}
|
|
1869
|
+
async scan() {
|
|
1870
|
+
if (this.disposed)
|
|
1871
|
+
return;
|
|
1872
|
+
let status = await this.getModuleGraph().queries.status.loaded(void 0);
|
|
1873
|
+
if (!(this.disposed || status.value !== "ready")) {
|
|
1874
|
+
if (this.scanInFlight) {
|
|
1875
|
+
this.rerunAfterCurrentScan = !0;
|
|
1876
|
+
return;
|
|
1877
|
+
}
|
|
1878
|
+
this.scanInFlight = !0;
|
|
1879
|
+
try {
|
|
1880
|
+
let nextStatuses = await this.buildStatuses();
|
|
1881
|
+
if (this.disposed)
|
|
1882
|
+
return;
|
|
1883
|
+
this.applyStatusStorePatch(nextStatuses), this.resolveReadiness({ status: "ready" });
|
|
1884
|
+
} catch (error) {
|
|
1885
|
+
if (this.disposed)
|
|
1886
|
+
return;
|
|
1887
|
+
if (error instanceof ChangeDetectionUnavailableError)
|
|
1888
|
+
logger7.warn(`Change detection unavailable: ${error.message}`), this.resolveReadiness({
|
|
1889
|
+
status: "unavailable",
|
|
1890
|
+
reason: error.message,
|
|
1891
|
+
error
|
|
1892
|
+
}), await this.dispose();
|
|
1893
|
+
else if (error instanceof ChangeDetectionFailureError)
|
|
1894
|
+
logger7.error(`Change detection failed: ${error.message}`), this.resolveReadiness({
|
|
1895
|
+
status: "error",
|
|
1896
|
+
error
|
|
1897
|
+
});
|
|
1898
|
+
else {
|
|
1899
|
+
let failure = new ChangeDetectionFailureError(
|
|
1900
|
+
error instanceof Error ? error.message : String(error),
|
|
1901
|
+
{ cause: error instanceof Error ? error : void 0 }
|
|
1902
|
+
);
|
|
1903
|
+
logger7.error(`Change detection failed: ${failure.message}`), this.resolveReadiness({
|
|
1904
|
+
status: "error",
|
|
1905
|
+
error: failure
|
|
1906
|
+
});
|
|
1907
|
+
}
|
|
1908
|
+
} finally {
|
|
1909
|
+
this.scanInFlight = !1, !this.disposed && this.rerunAfterCurrentScan && (this.rerunAfterCurrentScan = !1, this.scan());
|
|
1910
|
+
}
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
async buildStatuses() {
|
|
1914
|
+
let gitDiffProvider = this.getGitDiffProvider(), [changes, repoRoot, storyIndexGenerator, baselineEntryIds] = await Promise.all([
|
|
1915
|
+
gitDiffProvider.getChangedFiles(),
|
|
1916
|
+
gitDiffProvider.getRepoRoot(),
|
|
1917
|
+
this.options.storyIndexGeneratorPromise,
|
|
1918
|
+
this.getIndexBaselineService().getBaselineEntryIds()
|
|
1919
|
+
]), changedFiles = new Set(
|
|
1920
|
+
Array.from(changes.changed).map((path) => normalize(join5(repoRoot, path)))
|
|
1921
|
+
), newFiles = new Set(
|
|
1922
|
+
Array.from(changes.new).map((path) => normalize(join5(repoRoot, path)))
|
|
1923
|
+
), scannedFiles = /* @__PURE__ */ new Set([...changedFiles, ...newFiles]), storyIndex = await storyIndexGenerator.getIndex(), baselineStatuses = buildIndexBaselineStatuses(storyIndex, baselineEntryIds), storyIdsByFile = getStoryIdsByAbsolutePath(storyIndex, this.workingDir), statuses = /* @__PURE__ */ new Map(), scannedFilesArray = [...scannedFiles], lookupResults = await this.getModuleGraphIndex().queries.storiesForFiles.loaded({
|
|
1924
|
+
files: scannedFilesArray
|
|
1925
|
+
});
|
|
1926
|
+
for (let i = 0; i < scannedFilesArray.length; i++) {
|
|
1927
|
+
let changedFile = scannedFilesArray[i], allEntries = /* @__PURE__ */ new Map();
|
|
1928
|
+
for (let { storyFile, depth } of lookupResults[i])
|
|
1929
|
+
allEntries.set(storyIndexPathToAbsolutePath(storyFile, this.workingDir), depth);
|
|
1930
|
+
if (storyIdsByFile.has(changedFile) && allEntries.set(changedFile, 0), allEntries.size === 0)
|
|
1931
|
+
continue;
|
|
1932
|
+
let lowestDistance = Number.POSITIVE_INFINITY;
|
|
1933
|
+
for (let distance of allEntries.values())
|
|
1934
|
+
distance < lowestDistance && (lowestDistance = distance);
|
|
1935
|
+
for (let [storyFile, distance] of allEntries.entries()) {
|
|
1936
|
+
let storyIds = storyIdsByFile.get(storyFile);
|
|
1937
|
+
if (!storyIds)
|
|
1938
|
+
continue;
|
|
1939
|
+
let value = newFiles.has(storyFile) ? "status-value:new" : distance === lowestDistance ? "status-value:modified" : "status-value:affected";
|
|
1940
|
+
storyIds.forEach((storyId) => {
|
|
1941
|
+
let existingStatus = statuses.get(storyId), nextStatus = {
|
|
1942
|
+
storyId,
|
|
1943
|
+
typeId: CHANGE_DETECTION_STATUS_TYPE_ID,
|
|
1944
|
+
value: mergeStatusValues(existingStatus?.value, value),
|
|
1945
|
+
title: "",
|
|
1946
|
+
description: "",
|
|
1947
|
+
sidebarContextMenu: !1
|
|
1948
|
+
};
|
|
1949
|
+
statuses.set(storyId, mergeChangeDetectionStatuses(existingStatus, nextStatus));
|
|
1950
|
+
});
|
|
1951
|
+
}
|
|
1952
|
+
}
|
|
1953
|
+
return baselineStatuses.forEach((status, storyId) => {
|
|
1954
|
+
statuses.set(storyId, mergeChangeDetectionStatuses(statuses.get(storyId), status));
|
|
1955
|
+
}), statuses;
|
|
1956
|
+
}
|
|
1957
|
+
getGitDiffProvider() {
|
|
1958
|
+
return this.gitDiffProvider ??= new GitDiffProvider(this.workingDir), this.gitDiffProvider;
|
|
1959
|
+
}
|
|
1960
|
+
getIndexBaselineService() {
|
|
1961
|
+
return this.indexBaselineService ??= new IndexBaselineService({
|
|
1962
|
+
storyIndexGeneratorPromise: this.options.storyIndexGeneratorPromise,
|
|
1963
|
+
gitDiffProvider: this.getGitDiffProvider(),
|
|
1964
|
+
onBaselineUpdated: () => this.scheduleScan(this.debounceMs)
|
|
1965
|
+
}), this.indexBaselineService;
|
|
1966
|
+
}
|
|
1967
|
+
applyStatusStorePatch(nextStatuses) {
|
|
1968
|
+
let removedStoryIds = Array.from(this.previousStatuses.keys()).filter(
|
|
1969
|
+
(storyId) => !nextStatuses.has(storyId)
|
|
1970
|
+
), changedStatuses = Array.from(nextStatuses.values()).filter(
|
|
1971
|
+
(status) => !isSameStatus(this.previousStatuses.get(status.storyId), status)
|
|
1972
|
+
);
|
|
1973
|
+
removedStoryIds.length === 0 && changedStatuses.length === 0 || (removedStoryIds.length > 0 && this.options.statusStore.unset(removedStoryIds), changedStatuses.length > 0 && this.options.statusStore.set(changedStatuses), this.previousStatuses = new Map(nextStatuses));
|
|
1974
|
+
}
|
|
1975
|
+
resolveReadiness(readiness) {
|
|
1976
|
+
this.readinessResolved || (this.readinessResolved = !0, setChangeDetectionReadiness(readiness));
|
|
1977
|
+
}
|
|
1978
|
+
};
|
|
1979
|
+
|
|
1980
|
+
// src/core-server/utils/doTelemetry.ts
|
|
1981
|
+
import { getPrecedingUpgrade as getPrecedingUpgrade2, telemetry as telemetry3 } from "@aussieljk/forkbook/internal/telemetry";
|
|
1982
|
+
|
|
1983
|
+
// src/core-server/utils/versionStatus.ts
|
|
1984
|
+
var versionStatus = (versionCheck) => versionCheck.error ? "error" : versionCheck.cached ? "cached" : "success";
|
|
1985
|
+
|
|
1986
|
+
// src/core-server/utils/doTelemetry.ts
|
|
1987
|
+
async function doTelemetry(app, core, storyIndexGeneratorPromise, options) {
|
|
1988
|
+
let { versionCheck, versionUpdates } = options;
|
|
1989
|
+
invariant(
|
|
1990
|
+
!versionUpdates || versionUpdates && versionCheck,
|
|
1991
|
+
"versionCheck should be defined when versionUpdates is true"
|
|
1992
|
+
), telemetry3(
|
|
1993
|
+
"dev",
|
|
1994
|
+
async () => {
|
|
1995
|
+
let generator = await storyIndexGeneratorPromise, indexAndStats;
|
|
1996
|
+
try {
|
|
1997
|
+
indexAndStats = await generator?.getIndexAndStats();
|
|
1998
|
+
} catch (err) {
|
|
1999
|
+
return { error: err instanceof Error ? err : new Error("encountered a non-recoverable error") };
|
|
2000
|
+
}
|
|
2001
|
+
let payload = {
|
|
2002
|
+
precedingUpgrade: await getPrecedingUpgrade2()
|
|
2003
|
+
};
|
|
2004
|
+
return indexAndStats && Object.assign(payload, {
|
|
2005
|
+
versionStatus: versionUpdates && versionCheck ? versionStatus(versionCheck) : "disabled",
|
|
2006
|
+
storyIndex: summarizeIndex(indexAndStats.storyIndex),
|
|
2007
|
+
storyStats: indexAndStats.stats
|
|
2008
|
+
}), payload;
|
|
2009
|
+
},
|
|
2010
|
+
{ configDir: options.configDir }
|
|
2011
|
+
);
|
|
2012
|
+
}
|
|
2013
|
+
|
|
2014
|
+
// src/core-server/utils/get-caching-middleware.ts
|
|
2015
|
+
function getCachingMiddleware() {
|
|
2016
|
+
return (req, res, next) => {
|
|
2017
|
+
res.setHeader("Cache-Control", "no-store"), next();
|
|
2018
|
+
};
|
|
2019
|
+
}
|
|
2020
|
+
|
|
2021
|
+
// src/core-server/utils/getAccessControlMiddleware.ts
|
|
2022
|
+
function getAccessControlMiddleware(crossOriginIsolated) {
|
|
2023
|
+
return (req, res, next) => {
|
|
2024
|
+
crossOriginIsolated && (res.setHeader("Cross-Origin-Opener-Policy", "same-origin"), res.setHeader("Cross-Origin-Embedder-Policy", "require-corp")), next();
|
|
2025
|
+
};
|
|
2026
|
+
}
|
|
2027
|
+
|
|
2028
|
+
// src/core-server/utils/getHostValidationMiddleware.ts
|
|
2029
|
+
import net2 from "node:net";
|
|
2030
|
+
import os from "node:os";
|
|
2031
|
+
|
|
2032
|
+
// ../../node_modules/host-validation-middleware/dist/index.js
|
|
2033
|
+
import net from "node:net";
|
|
2034
|
+
function extractHostNameFromHostHeader(hostHeader) {
|
|
2035
|
+
let trimmedHost = hostHeader.trim();
|
|
2036
|
+
if (trimmedHost[0] === "[") {
|
|
2037
|
+
let endIpv6 = trimmedHost.indexOf("]");
|
|
2038
|
+
return endIpv6 < 0 ? { type: "invalid" } : net.isIP(trimmedHost.slice(1, endIpv6)) === 6 ? { type: "ipv6" } : { type: "invalid" };
|
|
2039
|
+
}
|
|
2040
|
+
let colonPos = trimmedHost.indexOf(":"), hostname = colonPos === -1 ? trimmedHost : trimmedHost.slice(0, colonPos);
|
|
2041
|
+
return net.isIP(hostname) === 4 ? { type: "ipv4" } : {
|
|
2042
|
+
type: "hostname",
|
|
2043
|
+
value: hostname
|
|
2044
|
+
};
|
|
2045
|
+
}
|
|
2046
|
+
var isFileOrExtensionProtocolRE = /^(?:file|.+-extension):/i;
|
|
2047
|
+
function isHostAllowedInternal(hostHeader, allowedHosts) {
|
|
2048
|
+
if (isFileOrExtensionProtocolRE.test(hostHeader)) return !0;
|
|
2049
|
+
let extracted = extractHostNameFromHostHeader(hostHeader);
|
|
2050
|
+
if (extracted.type === "invalid") return !1;
|
|
2051
|
+
if (extracted.type === "ipv4" || extracted.type === "ipv6") return !0;
|
|
2052
|
+
let hostname = extracted.value;
|
|
2053
|
+
if (hostname === "localhost" || hostname.endsWith(".localhost")) return !0;
|
|
2054
|
+
for (let allowedHost of allowedHosts)
|
|
2055
|
+
if (allowedHost === hostname || allowedHost[0] === "." && (allowedHost.slice(1) === hostname || hostname.endsWith(allowedHost))) return !0;
|
|
2056
|
+
return !1;
|
|
2057
|
+
}
|
|
2058
|
+
var cache = /* @__PURE__ */ new WeakMap();
|
|
2059
|
+
function isHostAllowed(hostHeader, allowedHosts) {
|
|
2060
|
+
if (hostHeader === void 0) return !0;
|
|
2061
|
+
let cachedAllowedHosts;
|
|
2062
|
+
if (Object.isFrozen(allowedHosts) && (cache.has(allowedHosts) || cache.set(allowedHosts, /* @__PURE__ */ new Set()), cachedAllowedHosts = cache.get(allowedHosts), cachedAllowedHosts.has(hostHeader)))
|
|
2063
|
+
return !0;
|
|
2064
|
+
let result = isHostAllowedInternal(hostHeader, allowedHosts);
|
|
2065
|
+
return cachedAllowedHosts && result && cachedAllowedHosts.add(hostHeader), result;
|
|
2066
|
+
}
|
|
2067
|
+
|
|
2068
|
+
// src/core-server/utils/getHostValidationMiddleware.ts
|
|
2069
|
+
var DEFAULT_ALLOWED_HOSTS = [], stripBrackets = (hostname) => hostname.startsWith("[") && hostname.endsWith("]") ? hostname.slice(1, -1) : hostname, toCanonicalIp = (value) => {
|
|
2070
|
+
let ip = stripBrackets(value), version = net2.isIP(ip);
|
|
2071
|
+
if (version)
|
|
2072
|
+
try {
|
|
2073
|
+
return stripBrackets(new URL(version === 6 ? `http://[${ip}]` : `http://${ip}`).hostname);
|
|
2074
|
+
} catch {
|
|
2075
|
+
return;
|
|
2076
|
+
}
|
|
2077
|
+
}, ifaces = os.networkInterfaces(), ownAddresses, getOwnAddresses = () => {
|
|
2078
|
+
if (!ownAddresses) {
|
|
2079
|
+
ownAddresses = /* @__PURE__ */ new Set();
|
|
2080
|
+
for (let iface of Object.values(ifaces).flat()) {
|
|
2081
|
+
let ip = iface && toCanonicalIp(iface.address);
|
|
2082
|
+
ip && ownAddresses.add(ip);
|
|
2083
|
+
}
|
|
2084
|
+
}
|
|
2085
|
+
return ownAddresses;
|
|
2086
|
+
}, isOwnAddress = (ip) => getOwnAddresses().has(ip), isValidHost = (host, options) => {
|
|
2087
|
+
let allowedHosts = options.allowedHosts ?? DEFAULT_ALLOWED_HOSTS;
|
|
2088
|
+
if (allowedHosts === !0)
|
|
2089
|
+
return !0;
|
|
2090
|
+
if (!host)
|
|
2091
|
+
return !1;
|
|
2092
|
+
try {
|
|
2093
|
+
if (options.host === "0.0.0.0" && allowedHosts.length === 0)
|
|
2094
|
+
return !0;
|
|
2095
|
+
let knownHosts = [
|
|
2096
|
+
...allowedHosts,
|
|
2097
|
+
...options.host ? [options.host] : [],
|
|
2098
|
+
...options.localAddress ? [new URL(options.localAddress).hostname] : [],
|
|
2099
|
+
...options.networkAddress ? [new URL(options.networkAddress).hostname] : []
|
|
2100
|
+
], { hostname } = new URL(`http://${host}`);
|
|
2101
|
+
if (matchesHostname(hostname, LOOPBACK_HOSTNAMES))
|
|
2102
|
+
return !0;
|
|
2103
|
+
let ip = toCanonicalIp(hostname);
|
|
2104
|
+
return ip ? knownHosts.some((known) => toCanonicalIp(known) === ip) || isOwnAddress(ip) : isHostAllowed(host, knownHosts);
|
|
2105
|
+
} catch {
|
|
2106
|
+
return !1;
|
|
2107
|
+
}
|
|
2108
|
+
};
|
|
2109
|
+
function getHostValidationMiddleware(options) {
|
|
2110
|
+
return (req, res, next) => {
|
|
2111
|
+
let host = req.headers.host;
|
|
2112
|
+
if ((options.allowedHosts ?? DEFAULT_ALLOWED_HOSTS) !== !0 && !isValidHost(host, options)) {
|
|
2113
|
+
res.writeHead(403, { "Content-Type": "text/plain" }), res.end("Invalid host");
|
|
2114
|
+
return;
|
|
2115
|
+
}
|
|
2116
|
+
next();
|
|
2117
|
+
};
|
|
2118
|
+
}
|
|
2119
|
+
|
|
2120
|
+
// src/core-server/utils/getSecurityHeadersMiddleware.ts
|
|
2121
|
+
var FRAME_ANCESTORS = [
|
|
2122
|
+
"'self'",
|
|
2123
|
+
...LOOPBACK_HOSTNAMES.map((hostname) => `http://${hostname}:*`)
|
|
2124
|
+
].join(" ");
|
|
2125
|
+
function getSecurityHeadersMiddleware(security) {
|
|
2126
|
+
return security?.insecureRemoteIframeEmbed ? (req, res, next) => next() : (req, res, next) => {
|
|
2127
|
+
res.appendHeader("Content-Security-Policy", `frame-ancestors ${FRAME_ANCESTORS}`), next();
|
|
2128
|
+
};
|
|
2129
|
+
}
|
|
2130
|
+
|
|
2131
|
+
// src/core-server/utils/middleware.ts
|
|
2132
|
+
import { existsSync } from "node:fs";
|
|
2133
|
+
import { resolve as resolve4 } from "pathe";
|
|
2134
|
+
var fileExists = (basename4) => [".js", ".mjs", ".cjs"].reduce((found, ext) => {
|
|
2135
|
+
let filename = `${basename4}${ext}`;
|
|
2136
|
+
return !found && existsSync(filename) ? filename : found;
|
|
2137
|
+
}, "");
|
|
2138
|
+
async function getMiddleware(configDir) {
|
|
2139
|
+
let middlewarePath = fileExists(resolve4(configDir, "middleware"));
|
|
2140
|
+
if (middlewarePath) {
|
|
2141
|
+
let middlewareModule = await import("file://" + middlewarePath);
|
|
2142
|
+
return middlewareModule.default ?? middlewareModule;
|
|
2143
|
+
}
|
|
2144
|
+
return () => {
|
|
2145
|
+
};
|
|
2146
|
+
}
|
|
2147
|
+
|
|
2148
|
+
// src/core-server/utils/open-browser/open-in-browser.ts
|
|
2149
|
+
import { logger as logger9 } from "@aussieljk/forkbook/internal/node-logger";
|
|
2150
|
+
import open2 from "open";
|
|
2151
|
+
import { dedent } from "ts-dedent";
|
|
2152
|
+
|
|
2153
|
+
// src/core-server/utils/open-browser/opener.ts
|
|
2154
|
+
var import_cross_spawn = __toESM(require_cross_spawn(), 1), import_picocolors4 = __toESM(require_picocolors(), 1);
|
|
2155
|
+
import { execSync } from "node:child_process";
|
|
2156
|
+
import { join as join6 } from "node:path";
|
|
2157
|
+
import { logger as logger8 } from "@aussieljk/forkbook/internal/node-logger";
|
|
2158
|
+
import open from "open";
|
|
2159
|
+
var OSX_CHROME = "google chrome";
|
|
2160
|
+
function getBrowserEnv() {
|
|
2161
|
+
let value = process.env.BROWSER, args = process.env.BROWSER_ARGS ? process.env.BROWSER_ARGS.split(" ") : [];
|
|
2162
|
+
return value ? value.toLowerCase() === "none" ? { action: 0 /* NONE */ } : value.toLowerCase().endsWith(".js") || value.toLowerCase().endsWith(".mjs") || value.toLowerCase().endsWith(".cjs") || value.toLowerCase().endsWith(".ts") ? { action: 2 /* SCRIPT */, value, args } : value.toLowerCase().endsWith(".sh") ? { action: 3 /* SHELL_SCRIPT */, value, args } : { action: 1 /* BROWSER */, value, args } : { action: 1 /* BROWSER */, args };
|
|
2163
|
+
}
|
|
2164
|
+
var BrowserEnvError = class extends StorybookError {
|
|
2165
|
+
constructor(message) {
|
|
2166
|
+
super({
|
|
2167
|
+
category: "CORE_SERVER",
|
|
2168
|
+
code: 1,
|
|
2169
|
+
message,
|
|
2170
|
+
name: "BrowserEnvError"
|
|
2171
|
+
});
|
|
2172
|
+
}
|
|
2173
|
+
};
|
|
2174
|
+
function attachEventHandlers(child, scriptPath) {
|
|
2175
|
+
child.on("error", (error) => {
|
|
2176
|
+
logger8.error(
|
|
2177
|
+
`Failed to run script specified in BROWSER.
|
|
2178
|
+
${import_picocolors4.default.cyan(scriptPath)}: ${error.message}`
|
|
2179
|
+
);
|
|
2180
|
+
}), child.on("close", (code) => {
|
|
2181
|
+
if (code !== 0) {
|
|
2182
|
+
logger8.error(
|
|
2183
|
+
`The script specified as BROWSER environment variable failed.
|
|
2184
|
+
${import_picocolors4.default.cyan(scriptPath)} exited with code ${code}.`
|
|
2185
|
+
);
|
|
2186
|
+
return;
|
|
2187
|
+
}
|
|
2188
|
+
});
|
|
2189
|
+
}
|
|
2190
|
+
function executeNodeScript(scriptPath, url) {
|
|
2191
|
+
let extraArgs = process.argv.slice(2), child = (0, import_cross_spawn.default)(process.execPath, [scriptPath, ...extraArgs, url], {
|
|
2192
|
+
stdio: "inherit"
|
|
2193
|
+
});
|
|
2194
|
+
return attachEventHandlers(child, scriptPath), !0;
|
|
2195
|
+
}
|
|
2196
|
+
function executeShellScript(scriptPath, url) {
|
|
2197
|
+
let extraArgs = process.argv.slice(2), child = (0, import_cross_spawn.default)("sh", [scriptPath, ...extraArgs, url], {
|
|
2198
|
+
stdio: "inherit"
|
|
2199
|
+
});
|
|
2200
|
+
return attachEventHandlers(child, scriptPath), !0;
|
|
2201
|
+
}
|
|
2202
|
+
function startBrowserProcess(browser, url, args) {
|
|
2203
|
+
if (process.platform === "darwin" && (typeof browser != "string" || browser === OSX_CHROME)) {
|
|
2204
|
+
let supportedChromiumBrowsers = [
|
|
2205
|
+
"Google Chrome Canary",
|
|
2206
|
+
"Google Chrome Dev",
|
|
2207
|
+
"Google Chrome Beta",
|
|
2208
|
+
"Google Chrome",
|
|
2209
|
+
"Microsoft Edge",
|
|
2210
|
+
"Brave Browser",
|
|
2211
|
+
"Vivaldi",
|
|
2212
|
+
"Chromium"
|
|
2213
|
+
];
|
|
2214
|
+
for (let chromiumBrowser of supportedChromiumBrowsers)
|
|
2215
|
+
try {
|
|
2216
|
+
execSync(`ps cax | grep "${chromiumBrowser}"`);
|
|
2217
|
+
let command = `osascript "${join6(
|
|
2218
|
+
resolvePackageDir("@aussieljk/forkbook"),
|
|
2219
|
+
"assets",
|
|
2220
|
+
"server",
|
|
2221
|
+
"openBrowser.applescript"
|
|
2222
|
+
)}" "`.concat(encodeURI(url), '" "').concat(
|
|
2223
|
+
process.env.OPEN_MATCH_HOST_ONLY === "true" ? encodeURI(new URL(url).origin) : encodeURI(url),
|
|
2224
|
+
'" "'
|
|
2225
|
+
).concat(chromiumBrowser, '"');
|
|
2226
|
+
return execSync(command, {
|
|
2227
|
+
cwd: __dirname
|
|
2228
|
+
}), !0;
|
|
2229
|
+
} catch {
|
|
2230
|
+
}
|
|
2231
|
+
}
|
|
2232
|
+
process.platform === "darwin" && browser === "open" && (browser = void 0);
|
|
2233
|
+
try {
|
|
2234
|
+
return open(url, {
|
|
2235
|
+
app: browser ? { name: browser, arguments: args } : void 0,
|
|
2236
|
+
wait: !1,
|
|
2237
|
+
url: !0
|
|
2238
|
+
}).catch(() => {
|
|
2239
|
+
}), !0;
|
|
2240
|
+
} catch {
|
|
2241
|
+
return !1;
|
|
2242
|
+
}
|
|
2243
|
+
}
|
|
2244
|
+
function openBrowser(url) {
|
|
2245
|
+
let { action, value, args } = getBrowserEnv(), canRunShell = process.platform !== "win32";
|
|
2246
|
+
switch (action) {
|
|
2247
|
+
case 0 /* NONE */:
|
|
2248
|
+
return !1;
|
|
2249
|
+
case 2 /* SCRIPT */:
|
|
2250
|
+
return executeNodeScript(value, url);
|
|
2251
|
+
case 3 /* SHELL_SCRIPT */: {
|
|
2252
|
+
if (canRunShell)
|
|
2253
|
+
return executeShellScript(value, url);
|
|
2254
|
+
throw new BrowserEnvError(
|
|
2255
|
+
"Shell scripts are not supported on Windows PowerShell. Use WSL instead."
|
|
2256
|
+
);
|
|
2257
|
+
}
|
|
2258
|
+
case 1 /* BROWSER */:
|
|
2259
|
+
return startBrowserProcess(value, url, args);
|
|
2260
|
+
default:
|
|
2261
|
+
throw new BrowserEnvError("Not implemented.");
|
|
2262
|
+
}
|
|
2263
|
+
}
|
|
2264
|
+
|
|
2265
|
+
// src/core-server/utils/open-browser/open-in-browser.ts
|
|
2266
|
+
async function openInBrowser(address) {
|
|
2267
|
+
let errorOccurred = !1, openBrowserResult;
|
|
2268
|
+
try {
|
|
2269
|
+
openBrowserResult = await openBrowser(address);
|
|
2270
|
+
} catch {
|
|
2271
|
+
errorOccurred = !0;
|
|
2272
|
+
}
|
|
2273
|
+
if (openBrowserResult !== !1) {
|
|
2274
|
+
try {
|
|
2275
|
+
errorOccurred && (await open2(address), errorOccurred = !1);
|
|
2276
|
+
} catch {
|
|
2277
|
+
errorOccurred = !0;
|
|
2278
|
+
}
|
|
2279
|
+
if (errorOccurred) {
|
|
2280
|
+
let browserEnv = process.env.BROWSER, browserHint = browserEnv ? `
|
|
2281
|
+
|
|
2282
|
+
Note: BROWSER environment variable is set to "${browserEnv}". To disable browser opening, use BROWSER=none or the --ci flag.` : "";
|
|
2283
|
+
logger9.error(dedent`
|
|
2284
|
+
Could not open ${address} inside a browser. If you're running this command inside a
|
|
2285
|
+
docker container or on a CI, you need to pass the '--ci' flag to prevent opening a
|
|
2286
|
+
browser by default.${browserHint}
|
|
2287
|
+
`);
|
|
2288
|
+
}
|
|
2289
|
+
}
|
|
2290
|
+
}
|
|
2291
|
+
|
|
2292
|
+
// src/core-server/utils/server-address.ts
|
|
2293
|
+
var import_detect_port = __toESM(require_detect_port2(), 1);
|
|
2294
|
+
import net3 from "node:net";
|
|
2295
|
+
import os2 from "node:os";
|
|
2296
|
+
import { SERVER_CHANNEL_PATH as SERVER_CHANNEL_PATH2 } from "@aussieljk/forkbook/internal/channels";
|
|
2297
|
+
import { logger as logger10 } from "@aussieljk/forkbook/internal/node-logger";
|
|
2298
|
+
import { NoFreePortError } from "@aussieljk/forkbook/internal/server-errors";
|
|
2299
|
+
var getListenHost = (host) => host || "127.0.0.1", COVERS_LOOPBACK = /* @__PURE__ */ new Set(["127.0.0.1", "0.0.0.0", "::"]), addLoopbackListener = async (server) => {
|
|
2300
|
+
let { address, port } = server.address();
|
|
2301
|
+
if (COVERS_LOOPBACK.has(address))
|
|
2302
|
+
return;
|
|
2303
|
+
let loopback = net3.createServer((socket) => server.emit("connection", socket));
|
|
2304
|
+
return server.once("close", () => loopback.close()), await new Promise((resolve9, reject) => {
|
|
2305
|
+
loopback.once("error", reject), loopback.listen({ port, host: "127.0.0.1" }, resolve9);
|
|
2306
|
+
}), loopback;
|
|
2307
|
+
};
|
|
2308
|
+
function getServerAddresses(port, host, proto, initialPath) {
|
|
2309
|
+
let address = new URL(`${proto}://127.0.0.1:${port}/`), networkAddress = new URL(`${proto}://${host || getLocalIp()}:${port}/`);
|
|
2310
|
+
if (initialPath) {
|
|
2311
|
+
let searchParams = `?path=${decodeURIComponent(
|
|
2312
|
+
initialPath.startsWith("/") ? initialPath : `/${initialPath}`
|
|
2313
|
+
)}`;
|
|
2314
|
+
address.search = searchParams, networkAddress.search = searchParams;
|
|
2315
|
+
}
|
|
2316
|
+
return {
|
|
2317
|
+
address: address.href,
|
|
2318
|
+
networkAddress: networkAddress.href
|
|
2319
|
+
};
|
|
2320
|
+
}
|
|
2321
|
+
var getServerPort = (port, { exactPort } = {}) => (0, import_detect_port.default)(port).catch((error) => {
|
|
2322
|
+
logger10.error(error), process.exit(-1);
|
|
2323
|
+
}).then((freePort) => {
|
|
2324
|
+
if (!freePort)
|
|
2325
|
+
throw new NoFreePortError({ requestedPort: port });
|
|
2326
|
+
return exactPort && port != null && freePort !== port && (logger10.error(`Port ${port} is not available. Exiting because --exact-port was provided.`), process.exit(-1)), freePort;
|
|
2327
|
+
}), getServerChannelUrl = (port, { https: https2 }) => `${https2 ? "wss" : "ws"}://127.0.0.1:${port}${SERVER_CHANNEL_PATH2}`, getExternalIpv4Addresses = () => Object.values(os2.networkInterfaces()).flat().filter((ip) => ip && ip.family === "IPv4" && !ip.internal).map((ip) => ip.address), getLocalIp = () => getExternalIpv4Addresses()[0] ?? "0.0.0.0", getReachableNetworkAddresses = (networkAddress) => {
|
|
2328
|
+
if (new URL(networkAddress).hostname !== "0.0.0.0")
|
|
2329
|
+
return [networkAddress];
|
|
2330
|
+
let addresses = getExternalIpv4Addresses().map((ip) => {
|
|
2331
|
+
let url = new URL(networkAddress);
|
|
2332
|
+
return url.hostname = ip, url.href;
|
|
2333
|
+
});
|
|
2334
|
+
return addresses.length ? addresses : [networkAddress];
|
|
2335
|
+
};
|
|
2336
|
+
|
|
2337
|
+
// src/core-server/dev-server.ts
|
|
2338
|
+
async function storybookDevServer(options, server) {
|
|
2339
|
+
let core = await options.presets.apply("core"), security = await options.presets.apply("security"), app = build_default2({ server }), workingDir = process.cwd(), configDir = options.configDir, features = await options.presets.apply("features"), stories = await options.presets.apply("stories"), normalizedStories = normalizeStories(stories, {
|
|
2340
|
+
configDir,
|
|
2341
|
+
workingDir
|
|
2342
|
+
}), storyIndexGeneratorPromise = withSpan(
|
|
2343
|
+
"forkbook.story-index",
|
|
2344
|
+
{},
|
|
2345
|
+
() => options.presets.apply("storyIndexGenerator")
|
|
2346
|
+
), changeDetectionService = new ChangeDetectionService({
|
|
2347
|
+
storyIndexGeneratorPromise,
|
|
2348
|
+
statusStore: getStatusStoreByTypeId(CHANGE_DETECTION_STATUS_TYPE_ID2),
|
|
2349
|
+
workingDir
|
|
2350
|
+
}), disposeChangeDetectionRuntime = async () => {
|
|
2351
|
+
await changeDetectionService.dispose().catch(() => {
|
|
2352
|
+
});
|
|
2353
|
+
};
|
|
2354
|
+
if (app.use(build_default({ level: 1 })), typeof options.extendServer == "function" && options.extendServer(server), app.use(
|
|
2355
|
+
getHostValidationMiddleware({
|
|
2356
|
+
host: options.host,
|
|
2357
|
+
allowedHosts: core?.allowedHosts,
|
|
2358
|
+
localAddress: options.localAddress,
|
|
2359
|
+
networkAddress: options.networkAddress
|
|
2360
|
+
})
|
|
2361
|
+
), app.use(getAccessControlMiddleware(core?.crossOriginIsolated ?? !1)), app.use(getSecurityHeadersMiddleware(security)), app.use(getCachingMiddleware()), registerIndexJsonRoute({
|
|
2362
|
+
app,
|
|
2363
|
+
storyIndexGeneratorPromise,
|
|
2364
|
+
normalizedStories,
|
|
2365
|
+
channel: options.channel,
|
|
2366
|
+
workingDir,
|
|
2367
|
+
configDir
|
|
2368
|
+
}), (await getMiddleware(options.configDir))(app), await options.presets.apply("experimental_devServer", app), !core?.builder)
|
|
2369
|
+
throw new MissingBuilderError();
|
|
2370
|
+
let resolvedPreviewBuilder = typeof core?.builder == "string" ? core.builder : core?.builder?.name, [previewBuilder, managerBuilder] = await Promise.all([
|
|
2371
|
+
getPreviewBuilder(resolvedPreviewBuilder),
|
|
2372
|
+
getManagerBuilder(),
|
|
2373
|
+
useStatics(app, options)
|
|
2374
|
+
]);
|
|
2375
|
+
options.debugWebpack && logConfig2("Preview webpack config", await previewBuilder.getConfig(options)), core?.disableProjectJson || useStorybookMetadata(app, options.configDir);
|
|
2376
|
+
let managerResult = options.previewOnly ? void 0 : await withSpan(
|
|
2377
|
+
"forkbook.manager-start",
|
|
2378
|
+
{},
|
|
2379
|
+
() => managerBuilder.start({
|
|
2380
|
+
startTime: process.hrtime(),
|
|
2381
|
+
options,
|
|
2382
|
+
router: app,
|
|
2383
|
+
server,
|
|
2384
|
+
channel: options.channel
|
|
2385
|
+
})
|
|
2386
|
+
), previewResult = await Promise.resolve();
|
|
2387
|
+
logger11.debug("Starting preview.."), previewResult = await withSpan(
|
|
2388
|
+
"forkbook.preview-start",
|
|
2389
|
+
{},
|
|
2390
|
+
() => previewBuilder.start({
|
|
2391
|
+
startTime: process.hrtime(),
|
|
2392
|
+
options,
|
|
2393
|
+
router: app,
|
|
2394
|
+
server,
|
|
2395
|
+
channel: options.channel
|
|
2396
|
+
}).catch(async (e) => {
|
|
2397
|
+
throw logger11.error("Failed to build the preview"), process.exitCode = 1, await disposeChangeDetectionRuntime(), await managerBuilder?.bail().catch(() => {
|
|
2398
|
+
}), await previewBuilder?.bail().catch(() => {
|
|
2399
|
+
}), e;
|
|
2400
|
+
})
|
|
2401
|
+
);
|
|
2402
|
+
let adapter;
|
|
2403
|
+
try {
|
|
2404
|
+
adapter = previewBuilder.changeDetectionAdapter?.();
|
|
2405
|
+
} catch (err) {
|
|
2406
|
+
logger11.warn("Change detection: adapter initialisation failed"), logger11.debug(err instanceof Error ? err.stack ?? err.message : String(err));
|
|
2407
|
+
}
|
|
2408
|
+
resolveChangeDetectionAdapter(adapter), changeDetectionService.start();
|
|
2409
|
+
let listening = new Promise((resolve9, reject) => {
|
|
2410
|
+
server.once("error", reject), app.listen({ port: options.port, host: getListenHost(options.host) }, resolve9);
|
|
2411
|
+
}).then(() => addLoopbackListener(server));
|
|
2412
|
+
try {
|
|
2413
|
+
let [indexGenerator] = await Promise.all([storyIndexGeneratorPromise, listening]);
|
|
2414
|
+
if (indexGenerator && !options.ci && !options.smokeTest && options.open) {
|
|
2415
|
+
let url = options.host && options.host !== "0.0.0.0" ? options.networkAddress : options.localAddress;
|
|
2416
|
+
openInBrowser(options.previewOnly ? `${url}iframe.html?navigator=true` : url).catch(() => {
|
|
2417
|
+
});
|
|
2418
|
+
}
|
|
2419
|
+
} catch (e) {
|
|
2420
|
+
throw await disposeChangeDetectionRuntime(), await managerBuilder?.bail().catch(() => {
|
|
2421
|
+
}), await previewBuilder?.bail().catch(() => {
|
|
2422
|
+
}), e;
|
|
2423
|
+
}
|
|
2424
|
+
features?.componentsManifest && registerManifests({ app, presets: options.presets }), doTelemetry(app, core, storyIndexGeneratorPromise, options);
|
|
2425
|
+
async function cancelTelemetry() {
|
|
2426
|
+
try {
|
|
2427
|
+
if (!isTelemetryModuleEnabled())
|
|
2428
|
+
return;
|
|
2429
|
+
let payload = { eventType: "dev" };
|
|
2430
|
+
try {
|
|
2431
|
+
let indexAndStats = await (await storyIndexGeneratorPromise)?.getIndexAndStats();
|
|
2432
|
+
indexAndStats && Object.assign(payload, {
|
|
2433
|
+
storyIndex: summarizeIndex(indexAndStats.storyIndex),
|
|
2434
|
+
storyStats: indexAndStats.stats
|
|
2435
|
+
});
|
|
2436
|
+
} catch {
|
|
2437
|
+
}
|
|
2438
|
+
await telemetry("canceled", payload, { immediate: !0 });
|
|
2439
|
+
} finally {
|
|
2440
|
+
await disposeChangeDetectionRuntime(), process.exit(0);
|
|
2441
|
+
}
|
|
2442
|
+
}
|
|
2443
|
+
return process.on("SIGINT", cancelTelemetry), process.on("SIGTERM", cancelTelemetry), { previewResult, managerResult };
|
|
2444
|
+
}
|
|
2445
|
+
|
|
2446
|
+
// src/core-server/utils/get-server-channel.ts
|
|
2447
|
+
var import_telejson2 = __toESM(require_dist(), 1);
|
|
2448
|
+
import {
|
|
2449
|
+
Channel as Channel3,
|
|
2450
|
+
HEARTBEAT_INTERVAL as HEARTBEAT_INTERVAL2,
|
|
2451
|
+
SERVER_CHANNEL_PATH as SERVER_CHANNEL_PATH3,
|
|
2452
|
+
setChannel as setChannel2
|
|
2453
|
+
} from "@aussieljk/forkbook/internal/channels";
|
|
2454
|
+
import { WebSocket, WebSocketServer } from "ws";
|
|
2455
|
+
|
|
2456
|
+
// src/core-server/utils/event-senders.ts
|
|
2457
|
+
import events from "@aussieljk/forkbook/internal/core-events";
|
|
2458
|
+
var CORE_EVENT_SENDERS = {
|
|
2459
|
+
[events.CHANNEL_WS_DISCONNECT]: "any",
|
|
2460
|
+
[events.CHANNEL_CREATED]: "manager",
|
|
2461
|
+
[events.CONFIG_ERROR]: "preview",
|
|
2462
|
+
[events.STORY_INDEX_INVALIDATED]: "server",
|
|
2463
|
+
[events.STORY_SPECIFIED]: "preview",
|
|
2464
|
+
[events.SET_CONFIG]: "manager",
|
|
2465
|
+
[events.SET_STORIES]: "preview",
|
|
2466
|
+
[events.SET_INDEX]: "preview",
|
|
2467
|
+
[events.SET_CURRENT_STORY]: "manager",
|
|
2468
|
+
[events.CURRENT_STORY_WAS_SET]: "preview",
|
|
2469
|
+
[events.FORCE_RE_RENDER]: "any",
|
|
2470
|
+
[events.FORCE_REMOUNT]: "any",
|
|
2471
|
+
[events.PRELOAD_ENTRIES]: "manager",
|
|
2472
|
+
[events.STORY_PREPARED]: "preview",
|
|
2473
|
+
[events.DOCS_PREPARED]: "preview",
|
|
2474
|
+
[events.STORY_CHANGED]: "preview",
|
|
2475
|
+
[events.STORY_UNCHANGED]: "preview",
|
|
2476
|
+
[events.STORY_RENDERED]: "preview",
|
|
2477
|
+
[events.STORY_FINISHED]: "preview",
|
|
2478
|
+
[events.STORY_MISSING]: "preview",
|
|
2479
|
+
[events.STORY_ERRORED]: "preview",
|
|
2480
|
+
[events.STORY_THREW_EXCEPTION]: "preview",
|
|
2481
|
+
[events.STORY_RENDER_PHASE_CHANGED]: "preview",
|
|
2482
|
+
[events.STORY_HOT_UPDATED]: "any",
|
|
2483
|
+
[events.PLAY_FUNCTION_THREW_EXCEPTION]: "preview",
|
|
2484
|
+
[events.UNHANDLED_ERRORS_WHILE_PLAYING]: "preview",
|
|
2485
|
+
[events.UPDATE_STORY_ARGS]: "any",
|
|
2486
|
+
[events.STORY_ARGS_UPDATED]: "preview",
|
|
2487
|
+
[events.RESET_STORY_ARGS]: "any",
|
|
2488
|
+
[events.SET_FILTER]: "manager",
|
|
2489
|
+
[events.SET_GLOBALS]: "preview",
|
|
2490
|
+
[events.UPDATE_GLOBALS]: "any",
|
|
2491
|
+
[events.GLOBALS_UPDATED]: "preview",
|
|
2492
|
+
[events.REGISTER_SUBSCRIPTION]: "any",
|
|
2493
|
+
[events.PREVIEW_INITIALIZED]: "preview",
|
|
2494
|
+
[events.PREVIEW_KEYDOWN]: "preview",
|
|
2495
|
+
[events.PREVIEW_BUILDER_PROGRESS]: "server",
|
|
2496
|
+
[events.SELECT_STORY]: "preview",
|
|
2497
|
+
[events.STORIES_COLLAPSE_ALL]: "manager",
|
|
2498
|
+
[events.STORIES_EXPAND_ALL]: "manager",
|
|
2499
|
+
[events.DOCS_RENDERED]: "preview",
|
|
2500
|
+
[events.SHARED_STATE_CHANGED]: "any",
|
|
2501
|
+
[events.SHARED_STATE_SET]: "any",
|
|
2502
|
+
[events.NAVIGATE_URL]: "any",
|
|
2503
|
+
[events.UPDATE_QUERY_PARAMS]: "manager",
|
|
2504
|
+
[events.REQUEST_WHATS_NEW_DATA]: "manager",
|
|
2505
|
+
[events.RESULT_WHATS_NEW_DATA]: "server",
|
|
2506
|
+
[events.SET_WHATS_NEW_CACHE]: "manager",
|
|
2507
|
+
[events.TOGGLE_WHATS_NEW_NOTIFICATIONS]: "manager",
|
|
2508
|
+
[events.TELEMETRY_ERROR]: "any",
|
|
2509
|
+
[events.SAVE_STORY_REQUEST]: "manager",
|
|
2510
|
+
[events.SAVE_STORY_RESPONSE]: "server",
|
|
2511
|
+
[events.ARGTYPES_INFO_REQUEST]: "manager",
|
|
2512
|
+
[events.ARGTYPES_INFO_RESPONSE]: "preview",
|
|
2513
|
+
[events.GHOST_STORIES_REQUEST]: "manager",
|
|
2514
|
+
[events.GHOST_STORIES_RESPONSE]: "server",
|
|
2515
|
+
[events.AI_SETUP_ANALYTICS_RESPONSE]: "server",
|
|
2516
|
+
[events.AI_SETUP_ANALYTICS_REQUEST]: "server",
|
|
2517
|
+
[events.OPEN_IN_EDITOR_REQUEST]: "manager",
|
|
2518
|
+
[events.OPEN_IN_EDITOR_RESPONSE]: "server",
|
|
2519
|
+
[events.MANAGER_INERT_ATTRIBUTE_CHANGED]: "manager",
|
|
2520
|
+
[events.SHARE_ISOLATE_MODE]: "manager",
|
|
2521
|
+
[events.AI_PROMPT_NUDGE]: "manager",
|
|
2522
|
+
[events.SIDEBAR_FILTER_CHANGED]: "manager"
|
|
2523
|
+
};
|
|
2524
|
+
|
|
2525
|
+
// src/core-server/utils/validate-token.ts
|
|
2526
|
+
import { timingSafeEqual } from "node:crypto";
|
|
2527
|
+
function isValidToken(requestToken, expectedToken) {
|
|
2528
|
+
if (!requestToken || !expectedToken)
|
|
2529
|
+
return !1;
|
|
2530
|
+
let a = new Uint8Array(Buffer.from(requestToken, "utf8")), b = new Uint8Array(Buffer.from(expectedToken, "utf8"));
|
|
2531
|
+
try {
|
|
2532
|
+
return a.length === b.length && timingSafeEqual(a, b);
|
|
2533
|
+
} catch {
|
|
2534
|
+
return !1;
|
|
2535
|
+
}
|
|
2536
|
+
}
|
|
2537
|
+
|
|
2538
|
+
// src/core-server/utils/get-server-channel.ts
|
|
2539
|
+
var ServerChannelTransport = class {
|
|
2540
|
+
constructor(server, options) {
|
|
2541
|
+
this.closed = !1;
|
|
2542
|
+
this.onSigterm = () => {
|
|
2543
|
+
this.socket.clients.forEach((client) => {
|
|
2544
|
+
client.readyState === WebSocket.OPEN && client.close(1001, "Server is shutting down");
|
|
2545
|
+
}), this.socket.close(() => process.exit(0));
|
|
2546
|
+
};
|
|
2547
|
+
this.rejectedEvents = /* @__PURE__ */ new Set();
|
|
2548
|
+
this.socket = new WebSocketServer({ noServer: !0 }), server.on("upgrade", (request, socket, head) => {
|
|
2549
|
+
try {
|
|
2550
|
+
let url = request.url && new URL(request.url, options.localAddress);
|
|
2551
|
+
if (!url || url.pathname !== SERVER_CHANNEL_PATH3)
|
|
2552
|
+
return;
|
|
2553
|
+
if (!options.skipValidation) {
|
|
2554
|
+
let { origin } = request.headers;
|
|
2555
|
+
if (origin && !isValidHost(new URL(origin).host, options)) {
|
|
2556
|
+
socket.end(`HTTP/1.1 403 Forbidden\r
|
|
2557
|
+
Connection: close\r
|
|
2558
|
+
\r
|
|
2559
|
+
`);
|
|
2560
|
+
return;
|
|
2561
|
+
}
|
|
2562
|
+
let requestToken = url.searchParams.get("token");
|
|
2563
|
+
if (!isValidToken(requestToken, options.token)) {
|
|
2564
|
+
socket.end(`HTTP/1.1 401 Unauthorized\r
|
|
2565
|
+
Connection: close\r
|
|
2566
|
+
\r
|
|
2567
|
+
`);
|
|
2568
|
+
return;
|
|
2569
|
+
}
|
|
2570
|
+
}
|
|
2571
|
+
let page = url.searchParams.get("page");
|
|
2572
|
+
if (page !== null && page !== "manager" && page !== "preview") {
|
|
2573
|
+
socket.end(`HTTP/1.1 400 Bad Request\r
|
|
2574
|
+
Connection: close\r
|
|
2575
|
+
\r
|
|
2576
|
+
`);
|
|
2577
|
+
return;
|
|
2578
|
+
}
|
|
2579
|
+
if (page === null && request.headers.origin !== void 0) {
|
|
2580
|
+
socket.end(`HTTP/1.1 400 Bad Request\r
|
|
2581
|
+
Connection: close\r
|
|
2582
|
+
\r
|
|
2583
|
+
`);
|
|
2584
|
+
return;
|
|
2585
|
+
}
|
|
2586
|
+
let role = page ?? "server";
|
|
2587
|
+
this.socket.handleUpgrade(request, socket, head, (ws) => {
|
|
2588
|
+
this.addClient(ws, role);
|
|
2589
|
+
});
|
|
2590
|
+
} catch (error) {
|
|
2591
|
+
logger.warn(`Rejecting WebSocket connection: ${error}`), socket.end(`HTTP/1.1 403 Forbidden\r
|
|
2592
|
+
Connection: close\r
|
|
2593
|
+
\r
|
|
2594
|
+
`);
|
|
2595
|
+
}
|
|
2596
|
+
});
|
|
2597
|
+
let interval = setInterval(() => {
|
|
2598
|
+
this.send({ type: "ping" });
|
|
2599
|
+
}, HEARTBEAT_INTERVAL2);
|
|
2600
|
+
this.socket.on("close", function() {
|
|
2601
|
+
clearInterval(interval);
|
|
2602
|
+
}), process.on("SIGTERM", this.onSigterm);
|
|
2603
|
+
}
|
|
2604
|
+
close() {
|
|
2605
|
+
this.closed || (this.closed = !0, process.removeListener("SIGTERM", this.onSigterm), this.socket.close());
|
|
2606
|
+
}
|
|
2607
|
+
setHandler(handler) {
|
|
2608
|
+
this.handler = handler;
|
|
2609
|
+
}
|
|
2610
|
+
addClient(ws, role) {
|
|
2611
|
+
ws.on("error", (error) => {
|
|
2612
|
+
logger.warn(`WebSocket error on server channel: ${error}`);
|
|
2613
|
+
}), ws.on("message", (raw) => {
|
|
2614
|
+
let data = raw.toString(), event = typeof data == "string" && (0, import_telejson2.isJSON)(data) ? (0, import_telejson2.parse)(data, {}) : data;
|
|
2615
|
+
this.isEventAllowedFrom(event, role) && this.handler?.(event);
|
|
2616
|
+
});
|
|
2617
|
+
}
|
|
2618
|
+
isEventAllowedFrom(event, role) {
|
|
2619
|
+
let type = typeof event == "object" && event && "type" in event ? event?.type : null;
|
|
2620
|
+
if (typeof type != "string")
|
|
2621
|
+
return !0;
|
|
2622
|
+
let sender = CORE_EVENT_SENDERS[type];
|
|
2623
|
+
if (sender === void 0 || sender === "any" || sender === role)
|
|
2624
|
+
return !0;
|
|
2625
|
+
let key = `${role}:${type}`;
|
|
2626
|
+
return this.rejectedEvents.has(key) || (this.rejectedEvents.add(key), logger.warn(
|
|
2627
|
+
`Ignored "${type}" event from a ${role} connection: only the ${sender} sends this event.`
|
|
2628
|
+
)), !1;
|
|
2629
|
+
}
|
|
2630
|
+
send(event) {
|
|
2631
|
+
let data = (0, import_telejson2.stringify)(event, { maxDepth: 15 });
|
|
2632
|
+
Array.from(this.socket.clients).filter((c) => c.readyState === WebSocket.OPEN).forEach((client) => client.send(data));
|
|
2633
|
+
}
|
|
2634
|
+
};
|
|
2635
|
+
function getServerChannel(server, options) {
|
|
2636
|
+
let transports = [new ServerChannelTransport(server, options)], channel = new Channel3({ transports, async: !0 });
|
|
2637
|
+
return setChannel2(channel), UniversalStore.__prepare(channel, UniversalStore.Environment.SERVER), channel;
|
|
2638
|
+
}
|
|
2639
|
+
function prepareHeadlessUniversalStores() {
|
|
2640
|
+
let channel = new Channel3({});
|
|
2641
|
+
return UniversalStore.__prepare(channel, UniversalStore.Environment.SERVER), channel;
|
|
2642
|
+
}
|
|
2643
|
+
|
|
2644
|
+
// src/core-server/utils/host-validation-warning.ts
|
|
2645
|
+
import { cache as cache2, isCI } from "@aussieljk/forkbook/internal/common";
|
|
2646
|
+
import { logger as logger12, prompt } from "@aussieljk/forkbook/internal/node-logger";
|
|
2647
|
+
import { dedent as dedent2 } from "ts-dedent";
|
|
2648
|
+
var DOCS_URL = "https://storybook.js.org/docs/api/main-config/main-config-core#allowedhosts", getHostValidationWarning = ({
|
|
2649
|
+
host,
|
|
2650
|
+
allowedHosts
|
|
2651
|
+
}) => {
|
|
2652
|
+
if (allowedHosts === !0)
|
|
2653
|
+
return {
|
|
2654
|
+
id: "allowed-hosts",
|
|
2655
|
+
message: dedent2`
|
|
2656
|
+
Host validation is disabled because core.allowedHosts is set to true.
|
|
2657
|
+
Any website open in your browser can send requests to this Forkbook.
|
|
2658
|
+
Such a website can read your stories and source files. It can also write files in your project through the WebSocket channel and the MCP server.
|
|
2659
|
+
|
|
2660
|
+
Set core.allowedHosts to a list of hostnames in .forkbook/main.ts to restrict access.
|
|
2661
|
+
Learn more: ${DOCS_URL}
|
|
2662
|
+
`
|
|
2663
|
+
};
|
|
2664
|
+
if (host === "0.0.0.0" && (!allowedHosts || allowedHosts.length === 0))
|
|
2665
|
+
return {
|
|
2666
|
+
id: "all-interfaces",
|
|
2667
|
+
message: dedent2`
|
|
2668
|
+
Forkbook is listening on all network interfaces because --host is set to 0.0.0.0.
|
|
2669
|
+
Anyone on your network can open this Forkbook. They can read your stories and source files, and they can write files in your project through the WebSocket channel and the MCP server.
|
|
2670
|
+
|
|
2671
|
+
Remove --host 0.0.0.0 to listen on localhost only. Also set core.allowedHosts to a list of hostnames in .forkbook/main.ts to keep host validation enabled.
|
|
2672
|
+
Learn more: ${DOCS_URL}
|
|
2673
|
+
`
|
|
2674
|
+
};
|
|
2675
|
+
}, isInteractiveTerminal = () => !!(process.stdin.isTTY && process.stdout.isTTY) && !isCI();
|
|
2676
|
+
async function warnOnDisabledHostValidation(options) {
|
|
2677
|
+
let warning = getHostValidationWarning(options);
|
|
2678
|
+
if (!warning || (logger12.warn(warning.message), options.ci || options.smokeTest || !isInteractiveTerminal()))
|
|
2679
|
+
return;
|
|
2680
|
+
let skipPromptKey = `host-validation-prompt-skipped-${warning.id}-${options.cacheKey}`;
|
|
2681
|
+
if (await cache2.get(skipPromptKey).catch(() => !1))
|
|
2682
|
+
return;
|
|
2683
|
+
let choice = await prompt.select({
|
|
2684
|
+
message: "How do you want to proceed?",
|
|
2685
|
+
options: [
|
|
2686
|
+
{
|
|
2687
|
+
value: "continue",
|
|
2688
|
+
label: "Continue",
|
|
2689
|
+
hint: "Start Forkbook with host validation disabled"
|
|
2690
|
+
},
|
|
2691
|
+
{
|
|
2692
|
+
value: "dont-ask",
|
|
2693
|
+
label: "Continue and don't ask again",
|
|
2694
|
+
hint: "Start Forkbook and skip this question in the future"
|
|
2695
|
+
},
|
|
2696
|
+
{ value: "abort", label: "Abort" }
|
|
2697
|
+
],
|
|
2698
|
+
initialValue: "continue"
|
|
2699
|
+
});
|
|
2700
|
+
choice === "abort" && process.exit(1), choice === "dont-ask" && await cache2.set(skipPromptKey, !0).catch(() => {
|
|
2701
|
+
});
|
|
2702
|
+
}
|
|
2703
|
+
|
|
2704
|
+
// src/core-server/utils/output-startup-information.ts
|
|
2705
|
+
var import_picocolors6 = __toESM(require_picocolors(), 1), import_pretty_hrtime = __toESM(require_pretty_hrtime(), 1);
|
|
2706
|
+
import { CLI_COLORS, logger as logger13 } from "@aussieljk/forkbook/internal/node-logger";
|
|
2707
|
+
import { dedent as dedent4 } from "ts-dedent";
|
|
2708
|
+
|
|
2709
|
+
// src/core-server/utils/update-check.ts
|
|
2710
|
+
var import_picocolors5 = __toESM(require_picocolors(), 1);
|
|
2711
|
+
import { cache as cache3 } from "@aussieljk/forkbook/internal/common";
|
|
2712
|
+
import { colors } from "@aussieljk/forkbook/internal/node-logger";
|
|
2713
|
+
import semver from "semver";
|
|
2714
|
+
import { dedent as dedent3 } from "ts-dedent";
|
|
2715
|
+
var { FORKBOOK_VERSION_BASE = "https://storybook.js.org", CI } = process.env, updateCheck = async (version) => {
|
|
2716
|
+
let result, time = Date.now();
|
|
2717
|
+
try {
|
|
2718
|
+
let fromCache = await cache3.get("lastUpdateCheck", { success: !1, time: 0 });
|
|
2719
|
+
time - 864e5 > fromCache.time && !CI ? (result = { success: !0, cached: !1, data: await (await Promise.race([
|
|
2720
|
+
fetch(`${FORKBOOK_VERSION_BASE}/versions.json?current=${version}`),
|
|
2721
|
+
// if fetch is too slow, we won't wait for it
|
|
2722
|
+
new Promise((res, rej) => global.setTimeout(rej, 1500))
|
|
2723
|
+
])).json(), time }, await cache3.set("lastUpdateCheck", result)) : result = { ...fromCache, cached: !0 };
|
|
2724
|
+
} catch (error) {
|
|
2725
|
+
result = { success: !1, cached: !1, error, time };
|
|
2726
|
+
}
|
|
2727
|
+
return result;
|
|
2728
|
+
};
|
|
2729
|
+
function createUpdateMessage(updateInfo, version) {
|
|
2730
|
+
let updateMessage;
|
|
2731
|
+
try {
|
|
2732
|
+
let upgradeCommand = `npx storybook@${semver.prerelease(updateInfo.data.latest.version) ? "next" : "latest"} upgrade`;
|
|
2733
|
+
updateMessage = updateInfo.success && semver.lt(version, updateInfo.data.latest.version) ? dedent3`
|
|
2734
|
+
${colors.orange(
|
|
2735
|
+
`A new version (${import_picocolors5.default.bold(updateInfo.data.latest.version)}) is available!`
|
|
2736
|
+
)}
|
|
2737
|
+
|
|
2738
|
+
${import_picocolors5.default.gray("Upgrade now:")} ${colors.green(upgradeCommand)}
|
|
2739
|
+
|
|
2740
|
+
${import_picocolors5.default.gray("Read full changelog:")} ${import_picocolors5.default.gray(
|
|
2741
|
+
import_picocolors5.default.underline("https://github.com/storybookjs/storybook/blob/main/CHANGELOG.md")
|
|
2742
|
+
)}
|
|
2743
|
+
` : "";
|
|
2744
|
+
} catch {
|
|
2745
|
+
updateMessage = "";
|
|
2746
|
+
}
|
|
2747
|
+
return updateMessage;
|
|
2748
|
+
}
|
|
2749
|
+
|
|
2750
|
+
// src/core-server/utils/output-startup-information.ts
|
|
2751
|
+
function outputStartupInformation(options) {
|
|
2752
|
+
let {
|
|
2753
|
+
updateInfo,
|
|
2754
|
+
version,
|
|
2755
|
+
name,
|
|
2756
|
+
address,
|
|
2757
|
+
host,
|
|
2758
|
+
networkAddress,
|
|
2759
|
+
allowedHosts,
|
|
2760
|
+
managerTotalTime,
|
|
2761
|
+
previewTotalTime
|
|
2762
|
+
} = options, otherAllowedHosts = allowedHosts === !0 ? "all (insecure)" : allowedHosts?.length ? allowedHosts.join(", ") : void 0, updateMessage = createUpdateMessage(updateInfo, version), networkLabel = "- On your network: ", serverMessages = [
|
|
2763
|
+
`- Local: ${address}`,
|
|
2764
|
+
host ? networkLabel + getReachableNetworkAddresses(networkAddress).join(`
|
|
2765
|
+
${" ".repeat(networkLabel.length)}`) : `${networkLabel}run with --host <ip> to expose to local network`,
|
|
2766
|
+
otherAllowedHosts && `- Other allowed hosts: ${otherAllowedHosts}`
|
|
2767
|
+
];
|
|
2768
|
+
logger13.logBox(
|
|
2769
|
+
dedent4`
|
|
2770
|
+
Forkbook ready!
|
|
2771
|
+
|
|
2772
|
+
${serverMessages.join(`
|
|
2773
|
+
`)}${updateMessage ? `
|
|
2774
|
+
|
|
2775
|
+
${updateMessage}` : ""}
|
|
2776
|
+
`,
|
|
2777
|
+
{
|
|
2778
|
+
formatBorder: CLI_COLORS.storybook,
|
|
2779
|
+
contentPadding: 3,
|
|
2780
|
+
rounded: !0
|
|
2781
|
+
}
|
|
2782
|
+
);
|
|
2783
|
+
let timeStatement = [
|
|
2784
|
+
managerTotalTime && `${import_picocolors6.default.underline((0, import_pretty_hrtime.default)(managerTotalTime))} for manager`,
|
|
2785
|
+
previewTotalTime && `${import_picocolors6.default.underline((0, import_pretty_hrtime.default)(previewTotalTime))} for preview`
|
|
2786
|
+
].filter(Boolean).join(" and ");
|
|
2787
|
+
logger13.info(timeStatement);
|
|
2788
|
+
}
|
|
2789
|
+
|
|
2790
|
+
// src/core-server/utils/runtime-instance-registry.ts
|
|
2791
|
+
import { execFile } from "node:child_process";
|
|
2792
|
+
import { randomUUID } from "node:crypto";
|
|
2793
|
+
import { existsSync as existsSync2, rmSync } from "node:fs";
|
|
2794
|
+
import { chmod, mkdir as mkdir2, readFile, readdir, rename, rm as rm2, stat, writeFile as writeFile3 } from "node:fs/promises";
|
|
2795
|
+
import { homedir, userInfo } from "node:os";
|
|
2796
|
+
import { findStorybookPackageRoot, normalizeAddonName } from "@aussieljk/forkbook/internal/common";
|
|
2797
|
+
import { join as join7, resolve as resolve5 } from "pathe";
|
|
2798
|
+
var FORKBOOK_MCP_ADDON = "@aussieljk/forkbook/addon-mcp", DEFAULT_MCP_ENDPOINT = "/mcp", ONE_DAY_MS = 1440 * 60 * 1e3, SEVEN_DAYS_MS = 7 * ONE_DAY_MS, REGISTRY_DIR_MODE = 448, RECORD_FILE_MODE = 384;
|
|
2799
|
+
function execFileAsync(file, args) {
|
|
2800
|
+
return new Promise((resolveExec, rejectExec) => {
|
|
2801
|
+
execFile(file, [...args], (error) => {
|
|
2802
|
+
if (error) {
|
|
2803
|
+
rejectExec(error);
|
|
2804
|
+
return;
|
|
2805
|
+
}
|
|
2806
|
+
resolveExec();
|
|
2807
|
+
});
|
|
2808
|
+
});
|
|
2809
|
+
}
|
|
2810
|
+
async function restrictOwnerAccess(targetPath, mode) {
|
|
2811
|
+
if (await chmod(targetPath, mode), process.platform !== "win32")
|
|
2812
|
+
return;
|
|
2813
|
+
let { username } = userInfo();
|
|
2814
|
+
try {
|
|
2815
|
+
await execFileAsync("icacls", [targetPath, "/inheritance:r", "/grant:r", `${username}:(F)`]);
|
|
2816
|
+
} catch (error) {
|
|
2817
|
+
throw new Error(
|
|
2818
|
+
`Could not restrict ${targetPath} to the current Windows user. The instance record would be readable by other accounts.`,
|
|
2819
|
+
{ cause: error }
|
|
2820
|
+
);
|
|
2821
|
+
}
|
|
2822
|
+
}
|
|
2823
|
+
function getDefaultRuntimeInstanceRegistryDir() {
|
|
2824
|
+
return join7(homedir(), ".forkbook", "instances");
|
|
2825
|
+
}
|
|
2826
|
+
function getStorybookBaseUrl(address) {
|
|
2827
|
+
let url = new URL(address);
|
|
2828
|
+
return `${url.origin}${url.pathname.replace(/\/$/, "")}`;
|
|
2829
|
+
}
|
|
2830
|
+
function getMcpMetadataFromMainConfig(mainConfig) {
|
|
2831
|
+
let addon = mainConfig.addons?.find(
|
|
2832
|
+
(entry) => normalizeAddonName(entry) === FORKBOOK_MCP_ADDON
|
|
2833
|
+
);
|
|
2834
|
+
return addon ? { status: "ready", endpoint: typeof addon == "object" && typeof addon.options?.endpoint == "string" ? addon.options.endpoint : DEFAULT_MCP_ENDPOINT } : { status: "not-installed" };
|
|
2835
|
+
}
|
|
2836
|
+
function detectRuntimeInstanceAgent() {
|
|
2837
|
+
return isClaudePreviewLaunch() ? CLAUDE_PREVIEW_AGENT_NAME : detectAgent()?.name;
|
|
2838
|
+
}
|
|
2839
|
+
function createRuntimeInstanceRecord({
|
|
2840
|
+
address,
|
|
2841
|
+
agent,
|
|
2842
|
+
configDir,
|
|
2843
|
+
cwd = process.cwd(),
|
|
2844
|
+
instanceId = randomUUID(),
|
|
2845
|
+
mcp = { status: "not-installed" },
|
|
2846
|
+
now = /* @__PURE__ */ new Date(),
|
|
2847
|
+
pid = process.pid,
|
|
2848
|
+
port,
|
|
2849
|
+
storybookPath = findStorybookPackageRoot(),
|
|
2850
|
+
storybookVersion,
|
|
2851
|
+
token
|
|
2852
|
+
}) {
|
|
2853
|
+
let storybookBaseUrl = getStorybookBaseUrl(address), timestamp = now.toISOString();
|
|
2854
|
+
return {
|
|
2855
|
+
schemaVersion: 1,
|
|
2856
|
+
instanceId,
|
|
2857
|
+
pid,
|
|
2858
|
+
cwd: resolve5(cwd),
|
|
2859
|
+
...configDir ? { configDir: resolve5(cwd, configDir) } : {},
|
|
2860
|
+
url: storybookBaseUrl,
|
|
2861
|
+
port,
|
|
2862
|
+
...token ? { token } : {},
|
|
2863
|
+
...agent ? { agent } : {},
|
|
2864
|
+
storybookVersion,
|
|
2865
|
+
...storybookPath ? { storybookPath } : {},
|
|
2866
|
+
startedAt: timestamp,
|
|
2867
|
+
updatedAt: timestamp,
|
|
2868
|
+
mcp
|
|
2869
|
+
};
|
|
2870
|
+
}
|
|
2871
|
+
async function writeRuntimeInstanceRecord(record, registryDir = getDefaultRuntimeInstanceRegistryDir()) {
|
|
2872
|
+
await mkdir2(registryDir, { recursive: !0, mode: REGISTRY_DIR_MODE }), await restrictOwnerAccess(registryDir, REGISTRY_DIR_MODE), await cleanupRuntimeInstanceRegistry(registryDir);
|
|
2873
|
+
let recordPath = join7(registryDir, `${record.instanceId}.json`), tempPath = join7(
|
|
2874
|
+
registryDir,
|
|
2875
|
+
`${record.instanceId}.${record.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`
|
|
2876
|
+
);
|
|
2877
|
+
try {
|
|
2878
|
+
await writeFile3(tempPath, `${JSON.stringify(record, null, 2)}
|
|
2879
|
+
`, {
|
|
2880
|
+
encoding: "utf-8",
|
|
2881
|
+
mode: RECORD_FILE_MODE
|
|
2882
|
+
}), await restrictOwnerAccess(tempPath, RECORD_FILE_MODE), await rename(tempPath, recordPath);
|
|
2883
|
+
} catch (error) {
|
|
2884
|
+
throw await rm2(tempPath, { force: !0 }).catch(() => {
|
|
2885
|
+
}), error;
|
|
2886
|
+
}
|
|
2887
|
+
return recordPath;
|
|
2888
|
+
}
|
|
2889
|
+
function isRecordObject(value) {
|
|
2890
|
+
return typeof value == "object" && value !== null;
|
|
2891
|
+
}
|
|
2892
|
+
function getTimestampMs(record, key) {
|
|
2893
|
+
let value = record[key];
|
|
2894
|
+
if (typeof value != "string")
|
|
2895
|
+
return;
|
|
2896
|
+
let timestamp = Date.parse(value);
|
|
2897
|
+
return Number.isFinite(timestamp) ? timestamp : void 0;
|
|
2898
|
+
}
|
|
2899
|
+
function getRecordAgeMs(record, fileModifiedAtMs, nowMs) {
|
|
2900
|
+
let recordTimestampMs = isRecordObject(record) ? getTimestampMs(record, "updatedAt") ?? getTimestampMs(record, "startedAt") : void 0;
|
|
2901
|
+
return nowMs - (recordTimestampMs ?? fileModifiedAtMs);
|
|
2902
|
+
}
|
|
2903
|
+
function getRecordPid(record) {
|
|
2904
|
+
if (!(!isRecordObject(record) || typeof record.pid != "number"))
|
|
2905
|
+
return Number.isInteger(record.pid) && record.pid > 0 ? record.pid : void 0;
|
|
2906
|
+
}
|
|
2907
|
+
function isErrnoException(error) {
|
|
2908
|
+
return typeof error == "object" && error !== null && "code" in error;
|
|
2909
|
+
}
|
|
2910
|
+
function getRuntimeInstanceRegistryCleanupDecision(entry) {
|
|
2911
|
+
if (entry.kind === "temp-file")
|
|
2912
|
+
return entry.nowMs - entry.fileModifiedAtMs > ONE_DAY_MS ? { action: "remove" } : { action: "keep" };
|
|
2913
|
+
if (entry.kind === "malformed-json")
|
|
2914
|
+
return entry.nowMs - entry.fileModifiedAtMs > SEVEN_DAYS_MS ? { action: "remove" } : { action: "keep" };
|
|
2915
|
+
let recordAgeMs = getRecordAgeMs(entry.record, entry.fileModifiedAtMs, entry.nowMs);
|
|
2916
|
+
if (recordAgeMs > SEVEN_DAYS_MS)
|
|
2917
|
+
return { action: "remove" };
|
|
2918
|
+
if (recordAgeMs < ONE_DAY_MS)
|
|
2919
|
+
return { action: "keep" };
|
|
2920
|
+
let recordPid = getRecordPid(entry.record);
|
|
2921
|
+
return recordPid === void 0 ? { action: "keep" } : { action: "check-pid", pid: recordPid };
|
|
2922
|
+
}
|
|
2923
|
+
function isPidInactive(pid) {
|
|
2924
|
+
try {
|
|
2925
|
+
return process.kill(pid, 0), !1;
|
|
2926
|
+
} catch (error) {
|
|
2927
|
+
return isErrnoException(error) && error.code === "ESRCH";
|
|
2928
|
+
}
|
|
2929
|
+
}
|
|
2930
|
+
async function applyCleanupDecision(recordPath, decision) {
|
|
2931
|
+
(decision.action === "remove" || decision.action === "check-pid" && isPidInactive(decision.pid)) && await rm2(recordPath, { force: !0 });
|
|
2932
|
+
}
|
|
2933
|
+
async function cleanupRuntimeInstanceRegistry(registryDir) {
|
|
2934
|
+
let nowMs = Date.now(), entries = await readdir(registryDir, { withFileTypes: !0 }).catch(() => []);
|
|
2935
|
+
await Promise.all(
|
|
2936
|
+
entries.map(async (entry) => {
|
|
2937
|
+
if (!entry.isFile())
|
|
2938
|
+
return;
|
|
2939
|
+
let recordPath = join7(registryDir, entry.name);
|
|
2940
|
+
try {
|
|
2941
|
+
let { mtimeMs } = await stat(recordPath);
|
|
2942
|
+
if (entry.name.endsWith(".tmp")) {
|
|
2943
|
+
await applyCleanupDecision(
|
|
2944
|
+
recordPath,
|
|
2945
|
+
getRuntimeInstanceRegistryCleanupDecision({
|
|
2946
|
+
kind: "temp-file",
|
|
2947
|
+
fileModifiedAtMs: mtimeMs,
|
|
2948
|
+
nowMs
|
|
2949
|
+
})
|
|
2950
|
+
);
|
|
2951
|
+
return;
|
|
2952
|
+
}
|
|
2953
|
+
if (!entry.name.endsWith(".json"))
|
|
2954
|
+
return;
|
|
2955
|
+
let content = await readFile(recordPath, "utf-8"), record;
|
|
2956
|
+
try {
|
|
2957
|
+
record = JSON.parse(content);
|
|
2958
|
+
} catch {
|
|
2959
|
+
await applyCleanupDecision(
|
|
2960
|
+
recordPath,
|
|
2961
|
+
getRuntimeInstanceRegistryCleanupDecision({
|
|
2962
|
+
kind: "malformed-json",
|
|
2963
|
+
fileModifiedAtMs: mtimeMs,
|
|
2964
|
+
nowMs
|
|
2965
|
+
})
|
|
2966
|
+
);
|
|
2967
|
+
return;
|
|
2968
|
+
}
|
|
2969
|
+
await applyCleanupDecision(
|
|
2970
|
+
recordPath,
|
|
2971
|
+
getRuntimeInstanceRegistryCleanupDecision({
|
|
2972
|
+
kind: "record",
|
|
2973
|
+
fileModifiedAtMs: mtimeMs,
|
|
2974
|
+
nowMs,
|
|
2975
|
+
record
|
|
2976
|
+
})
|
|
2977
|
+
);
|
|
2978
|
+
} catch {
|
|
2979
|
+
}
|
|
2980
|
+
})
|
|
2981
|
+
);
|
|
2982
|
+
}
|
|
2983
|
+
function registerProcessCleanup(recordPath) {
|
|
2984
|
+
let cleanupSync = () => {
|
|
2985
|
+
existsSync2(recordPath) && rmSync(recordPath, { force: !0 });
|
|
2986
|
+
};
|
|
2987
|
+
return process.once("exit", cleanupSync), process.prependOnceListener("SIGINT", cleanupSync), process.prependOnceListener("SIGTERM", cleanupSync), () => {
|
|
2988
|
+
process.off("exit", cleanupSync), process.off("SIGINT", cleanupSync), process.off("SIGTERM", cleanupSync);
|
|
2989
|
+
};
|
|
2990
|
+
}
|
|
2991
|
+
async function writeStorybookRuntimeInstanceRecord({
|
|
2992
|
+
address,
|
|
2993
|
+
agent = detectRuntimeInstanceAgent(),
|
|
2994
|
+
configDir,
|
|
2995
|
+
cwd,
|
|
2996
|
+
mcp,
|
|
2997
|
+
pid,
|
|
2998
|
+
port,
|
|
2999
|
+
registryDir,
|
|
3000
|
+
registerCleanup = !0,
|
|
3001
|
+
storybookVersion,
|
|
3002
|
+
token
|
|
3003
|
+
}) {
|
|
3004
|
+
let record = createRuntimeInstanceRecord({
|
|
3005
|
+
address,
|
|
3006
|
+
agent,
|
|
3007
|
+
configDir,
|
|
3008
|
+
cwd,
|
|
3009
|
+
mcp,
|
|
3010
|
+
pid,
|
|
3011
|
+
port,
|
|
3012
|
+
storybookVersion,
|
|
3013
|
+
token
|
|
3014
|
+
}), recordPath = await writeRuntimeInstanceRecord(record, registryDir), unregisterProcessCleanup = registerCleanup ? registerProcessCleanup(recordPath) : () => {
|
|
3015
|
+
};
|
|
3016
|
+
return {
|
|
3017
|
+
record,
|
|
3018
|
+
recordPath,
|
|
3019
|
+
unregisterProcessCleanup,
|
|
3020
|
+
cleanup: async () => {
|
|
3021
|
+
unregisterProcessCleanup(), await rm2(recordPath, { force: !0 });
|
|
3022
|
+
}
|
|
3023
|
+
};
|
|
3024
|
+
}
|
|
3025
|
+
|
|
3026
|
+
// src/core-server/utils/server-init.ts
|
|
3027
|
+
import { readFile as readFile2 } from "node:fs/promises";
|
|
3028
|
+
import { logger as logger14 } from "@aussieljk/forkbook/internal/node-logger";
|
|
3029
|
+
import http2 from "http";
|
|
3030
|
+
import https from "https";
|
|
3031
|
+
async function getServer(options) {
|
|
3032
|
+
if (!options.https)
|
|
3033
|
+
return http2.createServer();
|
|
3034
|
+
options.sslCert || (logger14.error("Error: --ssl-cert is required with --https"), process.exit(-1)), options.sslKey || (logger14.error("Error: --ssl-key is required with --https"), process.exit(-1));
|
|
3035
|
+
let sslOptions = {
|
|
3036
|
+
ca: await Promise.all((options.sslCa || []).map((ca) => readFile2(ca, { encoding: "utf8" }))),
|
|
3037
|
+
cert: await readFile2(options.sslCert, { encoding: "utf8" }),
|
|
3038
|
+
key: await readFile2(options.sslKey, { encoding: "utf8" })
|
|
3039
|
+
};
|
|
3040
|
+
return https.createServer(sslOptions);
|
|
3041
|
+
}
|
|
3042
|
+
|
|
3043
|
+
// src/core-server/utils/strip-comments-and-strings.ts
|
|
3044
|
+
function stripCommentsAndStrings(code) {
|
|
3045
|
+
let result = code.replace(/(['"`])(?:\\.|(?!\1)[\s\S])*?\1/g, '""');
|
|
3046
|
+
return result = result.replace(/\/\*[\s\S]*?\*\//g, ""), result = result.split(`
|
|
3047
|
+
`).map((line) => line.split("//")[0]).join(`
|
|
3048
|
+
`), result;
|
|
3049
|
+
}
|
|
3050
|
+
|
|
3051
|
+
// src/core-server/build-dev.ts
|
|
3052
|
+
async function buildDevStandalone(options) {
|
|
3053
|
+
let { packageJson, versionUpdates } = options, { storybookVersion } = options, configDir = resolve6(options.configDir);
|
|
3054
|
+
packageJson ? (invariant(
|
|
3055
|
+
packageJson.version !== void 0,
|
|
3056
|
+
`Expected package.json#version to be defined in the "${packageJson.name}" package}`
|
|
3057
|
+
), storybookVersion = packageJson.version) : storybookVersion || (storybookVersion = versions["@aussieljk/forkbook"]);
|
|
3058
|
+
let [port, versionCheck] = await Promise.all([
|
|
3059
|
+
getServerPort(options.port, { exactPort: options.exactPort }),
|
|
3060
|
+
versionUpdates ? updateCheck(storybookVersion) : Promise.resolve({ success: !1, cached: !1, data: {}, time: Date.now() })
|
|
3061
|
+
]);
|
|
3062
|
+
!options.ci && !options.smokeTest && options.port != null && port !== options.port && (await prompt2.confirm({
|
|
3063
|
+
message: dedent5`
|
|
3064
|
+
Port ${options.port} is not available.
|
|
3065
|
+
Would you like to run Forkbook on port ${port} instead?
|
|
3066
|
+
`,
|
|
3067
|
+
initialValue: !0
|
|
3068
|
+
}) || process.exit(1));
|
|
3069
|
+
let cacheKey = oneWayHash(relative4(getProjectRoot(), configDir));
|
|
3070
|
+
invariant(port, "expected options to have a port");
|
|
3071
|
+
let { address: localAddress, networkAddress } = getServerAddresses(
|
|
3072
|
+
port,
|
|
3073
|
+
options.host,
|
|
3074
|
+
options.https ? "https" : "http",
|
|
3075
|
+
options.initialPath
|
|
3076
|
+
), cacheOutputDir = resolvePathInStorybookCache2("public", cacheKey), outputDir = resolve6(options.outputDir || cacheOutputDir);
|
|
3077
|
+
options.smokeTest && (outputDir = cacheOutputDir), options.port = port, options.versionCheck = versionCheck, options.configType = "DEVELOPMENT", options.configDir = configDir, options.cacheKey = cacheKey, options.outputDir = outputDir, options.serverChannelUrl = getServerChannelUrl(port, options), options.localAddress = localAddress, options.networkAddress = networkAddress;
|
|
3078
|
+
let config = await loadMainConfig2(options), { core, framework } = config, corePresets = [], frameworkName = typeof framework == "string" ? framework : framework?.name;
|
|
3079
|
+
validateFrameworkName(frameworkName), frameworkName && corePresets.push(join8(frameworkName, "preset")), frameworkName = frameworkName || "custom";
|
|
3080
|
+
let packageManager = JsPackageManagerFactory.getPackageManager({
|
|
3081
|
+
configDir: options.configDir
|
|
3082
|
+
}), server = await getServer(options), presets = await loadAllPresets2({
|
|
3083
|
+
corePresets,
|
|
3084
|
+
overridePresets: [
|
|
3085
|
+
import.meta.resolve("@aussieljk/forkbook/internal/core-server/presets/common-override-preset")
|
|
3086
|
+
],
|
|
3087
|
+
...options,
|
|
3088
|
+
isCritical: !0,
|
|
3089
|
+
channel: new channels_default({
|
|
3090
|
+
transports: [
|
|
3091
|
+
{
|
|
3092
|
+
setHandler: () => () => console.error("CHANNEL IS NOT READY YET"),
|
|
3093
|
+
send: () => () => console.error("CHANNEL IS NOT READY YET")
|
|
3094
|
+
}
|
|
3095
|
+
]
|
|
3096
|
+
})
|
|
3097
|
+
}), { allowedHosts, renderer, builder } = await presets.apply("core", {});
|
|
3098
|
+
if (await warnOnDisabledHostValidation({
|
|
3099
|
+
host: options.host,
|
|
3100
|
+
allowedHosts,
|
|
3101
|
+
ci: options.ci,
|
|
3102
|
+
smokeTest: options.smokeTest,
|
|
3103
|
+
cacheKey
|
|
3104
|
+
}), !builder)
|
|
3105
|
+
throw new MissingBuilderError2();
|
|
3106
|
+
versionCheck.success && !versionCheck.cached && telemetry4("version-update");
|
|
3107
|
+
let resolvedPreviewBuilder = typeof builder == "string" ? builder : builder.name, [previewBuilder, managerBuilder] = await Promise.all([
|
|
3108
|
+
getPreviewBuilder(resolvedPreviewBuilder),
|
|
3109
|
+
getManagerBuilder()
|
|
3110
|
+
]);
|
|
3111
|
+
if (resolvedPreviewBuilder.includes("builder-vite")) {
|
|
3112
|
+
let deprecationMessage = dedent5(`Using CommonJS in your main configuration file is deprecated with Vite.
|
|
3113
|
+
- Refer to the migration guide at https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#commonjs-with-vite-is-deprecated`), mainJsPath = getInterpretedFile(
|
|
3114
|
+
resolve6(options.configDir || defaultConfigDir(), "main")
|
|
3115
|
+
);
|
|
3116
|
+
/\.c[jt]s$/.test(mainJsPath) && deprecate(deprecationMessage);
|
|
3117
|
+
let mainJsContent = await readFile3(mainJsPath, { encoding: "utf8" }), CJS_CONTENT_REGEX = /\bmodule\.exports\b|\bexports[.[]|\brequire\s*\(|\bObject\.(?:defineProperty|defineProperties|assign)\s*\(\s*exports\b/, strippedContent = stripCommentsAndStrings(mainJsContent);
|
|
3118
|
+
CJS_CONTENT_REGEX.test(strippedContent) && deprecate(deprecationMessage);
|
|
3119
|
+
}
|
|
3120
|
+
let resolvedRenderer = renderer && resolveAddonName2(options.configDir, renderer, options), channel = getServerChannel(server, {
|
|
3121
|
+
token: getWsToken(),
|
|
3122
|
+
host: options.host,
|
|
3123
|
+
allowedHosts,
|
|
3124
|
+
skipValidation: isWebContainer(),
|
|
3125
|
+
localAddress,
|
|
3126
|
+
networkAddress
|
|
3127
|
+
});
|
|
3128
|
+
presets = await loadAllPresets2({
|
|
3129
|
+
corePresets: [
|
|
3130
|
+
join8(resolvePackageDir("@aussieljk/forkbook"), "dist/core-server/presets/common-preset.js"),
|
|
3131
|
+
...managerBuilder.corePresets || [],
|
|
3132
|
+
...previewBuilder.corePresets || [],
|
|
3133
|
+
...resolvedRenderer ? [resolvedRenderer] : [],
|
|
3134
|
+
...corePresets
|
|
3135
|
+
],
|
|
3136
|
+
overridePresets: [
|
|
3137
|
+
...previewBuilder.overridePresets || [],
|
|
3138
|
+
import.meta.resolve("@aussieljk/forkbook/internal/core-server/presets/common-override-preset")
|
|
3139
|
+
],
|
|
3140
|
+
...options,
|
|
3141
|
+
channel
|
|
3142
|
+
});
|
|
3143
|
+
let features = await presets.apply("features");
|
|
3144
|
+
global3.FEATURES = features, await presets.apply("experimental_serverChannel", channel);
|
|
3145
|
+
let fullOptions = {
|
|
3146
|
+
...options,
|
|
3147
|
+
presets,
|
|
3148
|
+
features,
|
|
3149
|
+
channel
|
|
3150
|
+
}, { managerResult, previewResult } = await buildOrThrow(
|
|
3151
|
+
async () => storybookDevServer(fullOptions, server)
|
|
3152
|
+
), mcp = getMcpMetadataFromMainConfig(config);
|
|
3153
|
+
await writeStorybookRuntimeInstanceRecord({
|
|
3154
|
+
address: localAddress,
|
|
3155
|
+
configDir: options.configDir,
|
|
3156
|
+
mcp,
|
|
3157
|
+
port,
|
|
3158
|
+
storybookVersion,
|
|
3159
|
+
token: getWsToken()
|
|
3160
|
+
}).catch((error) => {
|
|
3161
|
+
logger15.warn("Forkbook failed to write its runtime instance registry record."), logger15.debug(error instanceof Error ? error.stack ?? error.message : String(error));
|
|
3162
|
+
});
|
|
3163
|
+
let previewTotalTime = previewResult?.totalTime, managerTotalTime = managerResult?.totalTime, previewStats = previewResult?.stats, managerStats = managerResult?.stats, statsOption = options.statsJson;
|
|
3164
|
+
if (statsOption) {
|
|
3165
|
+
let target = statsOption === !0 ? options.outputDir : statsOption;
|
|
3166
|
+
await outputStats(target, previewStats);
|
|
3167
|
+
}
|
|
3168
|
+
if (options.smokeTest) {
|
|
3169
|
+
let warnings = [];
|
|
3170
|
+
warnings.push(...managerStats?.toJson()?.warnings || []);
|
|
3171
|
+
try {
|
|
3172
|
+
warnings.push(...previewStats?.toJson()?.warnings || []);
|
|
3173
|
+
} catch (err) {
|
|
3174
|
+
if (!(err instanceof NoStatsForViteDevError))
|
|
3175
|
+
throw err;
|
|
3176
|
+
}
|
|
3177
|
+
let problems = warnings.filter((warning) => !warning.message.includes("export 'useInsertionEffect'")).filter((warning) => !warning.message.includes("compilation but it's unused")).filter(
|
|
3178
|
+
(warning) => !warning.message.includes("Conflicting values for 'process.env.NODE_ENV'")
|
|
3179
|
+
);
|
|
3180
|
+
problems.length > 0 ? (logger15.error("Smoke tests failed."), logger15.log(problems.map((p) => p.stack).join(`
|
|
3181
|
+
`))) : logger15.step(CLI_COLORS2.success("Smoke tests passed, exiting.")), logger15.outro(""), process.exit(problems.length > 0 ? 1 : 0);
|
|
3182
|
+
} else {
|
|
3183
|
+
let name = frameworkName.split("@storybook/").length > 1 ? frameworkName.split("@storybook/")[1] : frameworkName;
|
|
3184
|
+
options.quiet || outputStartupInformation({
|
|
3185
|
+
updateInfo: versionCheck,
|
|
3186
|
+
version: storybookVersion,
|
|
3187
|
+
name,
|
|
3188
|
+
address: localAddress,
|
|
3189
|
+
host: options.host,
|
|
3190
|
+
networkAddress,
|
|
3191
|
+
allowedHosts,
|
|
3192
|
+
managerTotalTime,
|
|
3193
|
+
previewTotalTime
|
|
3194
|
+
});
|
|
3195
|
+
}
|
|
3196
|
+
return { port, address: localAddress, networkAddress };
|
|
3197
|
+
}
|
|
3198
|
+
|
|
3199
|
+
// src/core-server/build-index.ts
|
|
3200
|
+
import { writeFile as writeFile4 } from "node:fs/promises";
|
|
3201
|
+
import { normalizeStories as normalizeStories2 } from "@aussieljk/forkbook/internal/common";
|
|
3202
|
+
import { logger as logger17 } from "@aussieljk/forkbook/internal/node-logger";
|
|
3203
|
+
|
|
3204
|
+
// src/core-server/load.ts
|
|
3205
|
+
import { fileURLToPath } from "node:url";
|
|
3206
|
+
import { Channel as Channel4, setChannel as setChannel3 } from "@aussieljk/forkbook/internal/channels";
|
|
3207
|
+
import {
|
|
3208
|
+
getProjectRoot as getProjectRoot2,
|
|
3209
|
+
loadAllPresets as loadAllPresets3,
|
|
3210
|
+
loadMainConfig as loadMainConfig3,
|
|
3211
|
+
resolveAddonName as resolveAddonName3,
|
|
3212
|
+
validateFrameworkName as validateFrameworkName2
|
|
3213
|
+
} from "@aussieljk/forkbook/internal/common";
|
|
3214
|
+
import { oneWayHash as oneWayHash2 } from "@aussieljk/forkbook/internal/telemetry";
|
|
3215
|
+
import { global as global4 } from "@storybook/global";
|
|
3216
|
+
import { dirname, isAbsolute, join as join9, relative as relative5, resolve as resolve7 } from "pathe";
|
|
3217
|
+
async function loadStorybook(options) {
|
|
3218
|
+
let configDir = resolve7(options.configDir), cacheKey = oneWayHash2(relative5(getProjectRoot2(), configDir));
|
|
3219
|
+
options.configType = "DEVELOPMENT", options.configDir = configDir, options.cacheKey = cacheKey;
|
|
3220
|
+
let channel = options.channel ?? new Channel4({});
|
|
3221
|
+
setChannel3(channel);
|
|
3222
|
+
let config = await loadMainConfig3(options), { framework } = config, corePresets = [], frameworkName = typeof framework == "string" ? framework : framework?.name;
|
|
3223
|
+
validateFrameworkName2(frameworkName), frameworkName && corePresets.push(join9(frameworkName, "preset")), frameworkName = frameworkName || "custom";
|
|
3224
|
+
let presets = await loadAllPresets3({
|
|
3225
|
+
corePresets,
|
|
3226
|
+
overridePresets: [
|
|
3227
|
+
import.meta.resolve("@aussieljk/forkbook/internal/core-server/presets/common-override-preset")
|
|
3228
|
+
],
|
|
3229
|
+
...options,
|
|
3230
|
+
isCritical: !0,
|
|
3231
|
+
channel
|
|
3232
|
+
}), { renderer, builder } = await presets.apply("core", {}), resolvedRenderer = renderer && resolveAddonName3(options.configDir, renderer, options), builderName = typeof builder == "string" ? builder : builder?.name;
|
|
3233
|
+
if (builderName) {
|
|
3234
|
+
let builderEntry = builderName.startsWith("file:") ? fileURLToPath(builderName) : builderName, builderPresetDir = isAbsolute(builderEntry) ? dirname(builderEntry) : resolvePackageDir(builderEntry), builderPreset = safeResolveModule({ specifier: join9(builderPresetDir, "preset.js") });
|
|
3235
|
+
builderPreset && corePresets.push(builderPreset);
|
|
3236
|
+
}
|
|
3237
|
+
presets = await loadAllPresets3({
|
|
3238
|
+
corePresets: [
|
|
3239
|
+
join9(resolvePackageDir("@aussieljk/forkbook"), "dist/core-server/presets/common-preset.js"),
|
|
3240
|
+
...resolvedRenderer ? [resolvedRenderer] : [],
|
|
3241
|
+
...corePresets
|
|
3242
|
+
],
|
|
3243
|
+
overridePresets: [
|
|
3244
|
+
import.meta.resolve("@aussieljk/forkbook/internal/core-server/presets/common-override-preset")
|
|
3245
|
+
],
|
|
3246
|
+
...options,
|
|
3247
|
+
channel
|
|
3248
|
+
});
|
|
3249
|
+
let features = await presets.apply("features");
|
|
3250
|
+
return global4.FEATURES = features, await applyServicesPresetOnce(presets), {
|
|
3251
|
+
...options,
|
|
3252
|
+
// the resolved channel — the one the presets received — never the possibly-absent option
|
|
3253
|
+
channel,
|
|
3254
|
+
presets,
|
|
3255
|
+
features
|
|
3256
|
+
};
|
|
3257
|
+
}
|
|
3258
|
+
|
|
3259
|
+
// src/core-server/utils/StoryIndexGenerator.ts
|
|
3260
|
+
import { existsSync as existsSync3 } from "node:fs";
|
|
3261
|
+
import { readFile as readFile4 } from "node:fs/promises";
|
|
3262
|
+
import { dirname as dirname2, extname, join as join10, normalize as normalize2, relative as relative6, resolve as resolve8, sep as sep2 } from "node:path";
|
|
3263
|
+
import {
|
|
3264
|
+
commonGlobOptions as commonGlobOptions2,
|
|
3265
|
+
getProjectRoot as getProjectRoot3,
|
|
3266
|
+
getTsconfigPathsBaseDir,
|
|
3267
|
+
normalizeStoryPath
|
|
3268
|
+
} from "@aussieljk/forkbook/internal/common";
|
|
3269
|
+
import { combineTags, storyNameFromExport, toId } from "@aussieljk/forkbook/internal/csf/csf-utils";
|
|
3270
|
+
import { loadConfig } from "@aussieljk/forkbook/internal/csf-tools";
|
|
3271
|
+
import { logger as logger16, once } from "@aussieljk/forkbook/internal/node-logger";
|
|
3272
|
+
import { isExampleStoryId as isExampleStoryId2 } from "@aussieljk/forkbook/internal/telemetry";
|
|
3273
|
+
var import_picocolors7 = __toESM(require_picocolors(), 1);
|
|
3274
|
+
var TsconfigPaths = __toESM(require_lib(), 1);
|
|
3275
|
+
import { dedent as dedent7 } from "ts-dedent";
|
|
3276
|
+
|
|
3277
|
+
// src/docs-tools/shared.ts
|
|
3278
|
+
var ADDON_ID = "@aussieljk/forkbook/docs", PANEL_ID = `${ADDON_ID}/panel`;
|
|
3279
|
+
var anchorBlockIdFromId = (storyId) => `anchor--${storyId}`, SNIPPET_RENDERED = `${ADDON_ID}/snippet-rendered`;
|
|
3280
|
+
|
|
3281
|
+
// src/shared/story-index/sortStories.ts
|
|
3282
|
+
import { dedent as dedent6 } from "ts-dedent";
|
|
3283
|
+
|
|
3284
|
+
// src/shared/story-index/storySort.ts
|
|
3285
|
+
var STORY_KIND_PATH_SEPARATOR = /\s*\/\s*/, storySort = (options = {}) => (a, b) => {
|
|
3286
|
+
if (a.title === b.title && !options.includeNames)
|
|
3287
|
+
return 0;
|
|
3288
|
+
let method = options.method || "configure", order = options.order || [], storyTitleA = a.title.trim().split(STORY_KIND_PATH_SEPARATOR), storyTitleB = b.title.trim().split(STORY_KIND_PATH_SEPARATOR);
|
|
3289
|
+
options.includeNames && (storyTitleA.push(a.name), storyTitleB.push(b.name));
|
|
3290
|
+
let depth = 0;
|
|
3291
|
+
for (; storyTitleA[depth] || storyTitleB[depth]; ) {
|
|
3292
|
+
if (!storyTitleA[depth])
|
|
3293
|
+
return -1;
|
|
3294
|
+
if (!storyTitleB[depth])
|
|
3295
|
+
return 1;
|
|
3296
|
+
let nameA = storyTitleA[depth], nameB = storyTitleB[depth];
|
|
3297
|
+
if (nameA !== nameB) {
|
|
3298
|
+
let indexA = order.indexOf(nameA), indexB = order.indexOf(nameB), indexWildcard = order.indexOf("*");
|
|
3299
|
+
return indexA !== -1 || indexB !== -1 ? (indexA === -1 && (indexWildcard !== -1 ? indexA = indexWildcard : indexA = order.length), indexB === -1 && (indexWildcard !== -1 ? indexB = indexWildcard : indexB = order.length), indexA - indexB) : method === "configure" ? 0 : nameA.localeCompare(nameB, options.locales ? options.locales : void 0, {
|
|
3300
|
+
numeric: !0,
|
|
3301
|
+
sensitivity: "accent"
|
|
3302
|
+
});
|
|
3303
|
+
}
|
|
3304
|
+
let index = order.indexOf(nameA);
|
|
3305
|
+
index === -1 && (index = order.indexOf("*"));
|
|
3306
|
+
let nestedOrder = order[index + 1];
|
|
3307
|
+
order = index !== -1 && Array.isArray(nestedOrder) ? nestedOrder : [], depth += 1;
|
|
3308
|
+
}
|
|
3309
|
+
return 0;
|
|
3310
|
+
};
|
|
3311
|
+
|
|
3312
|
+
// src/shared/story-index/sortStories.ts
|
|
3313
|
+
var toComparator = (storySortParameter) => typeof storySortParameter == "function" ? storySortParameter : storySort(
|
|
3314
|
+
Array.isArray(storySortParameter) ? { order: storySortParameter } : storySortParameter
|
|
3315
|
+
), combineStorySorts = (storySorts) => {
|
|
3316
|
+
if (storySorts.length <= 1)
|
|
3317
|
+
return storySorts[0];
|
|
3318
|
+
let comparators = storySorts.map(toComparator);
|
|
3319
|
+
return (a, b) => {
|
|
3320
|
+
for (let comparator of comparators) {
|
|
3321
|
+
let result = Number(comparator(a, b)) || 0;
|
|
3322
|
+
if (result !== 0)
|
|
3323
|
+
return result;
|
|
3324
|
+
}
|
|
3325
|
+
return 0;
|
|
3326
|
+
};
|
|
3327
|
+
}, sortStoriesCommon = (stories, storySortParameter, fileNameOrder) => (storySortParameter ? stories.sort(toComparator(storySortParameter)) : stories.sort(
|
|
3328
|
+
(s1, s2) => fileNameOrder.indexOf(s1.importPath) - fileNameOrder.indexOf(s2.importPath)
|
|
3329
|
+
), stories), sortStoriesV7 = (stories, storySortParameter, fileNameOrder) => {
|
|
3330
|
+
try {
|
|
3331
|
+
return sortStoriesCommon(stories, storySortParameter, fileNameOrder);
|
|
3332
|
+
} catch (err) {
|
|
3333
|
+
throw new Error(dedent6`
|
|
3334
|
+
Error sorting stories with sort parameter ${storySortParameter}:
|
|
3335
|
+
|
|
3336
|
+
> ${err.message}
|
|
3337
|
+
|
|
3338
|
+
Are you using a V6-style sort function in V7 mode?
|
|
3339
|
+
|
|
3340
|
+
More info: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#v7-style-story-sort
|
|
3341
|
+
`);
|
|
3342
|
+
}
|
|
3343
|
+
};
|
|
3344
|
+
|
|
3345
|
+
// src/core-server/utils/IndexingError.ts
|
|
3346
|
+
var IndexingError = class extends Error {
|
|
3347
|
+
constructor(message, importPaths, stack) {
|
|
3348
|
+
super(), this.message = message, this.importPaths = importPaths, stack && (this.stack = stack);
|
|
3349
|
+
}
|
|
3350
|
+
pathsString() {
|
|
3351
|
+
return this.importPaths.length === 1 ? `${slash(this.importPaths[0])}` : `${this.importPaths.map(slash).join(",")}`;
|
|
3352
|
+
}
|
|
3353
|
+
toString() {
|
|
3354
|
+
return `${this.pathsString()}: ${this.message}`;
|
|
3355
|
+
}
|
|
3356
|
+
}, MultipleIndexingError = class extends Error {
|
|
3357
|
+
constructor(indexingErrors) {
|
|
3358
|
+
super();
|
|
3359
|
+
this.indexingErrors = indexingErrors;
|
|
3360
|
+
if (this.indexingErrors.length === 0)
|
|
3361
|
+
throw new Error("Unexpected empty error list");
|
|
3362
|
+
if (this.indexingErrors.length === 1) {
|
|
3363
|
+
let [err] = this.indexingErrors;
|
|
3364
|
+
this.message = `Unable to index ${err.pathsString()}`;
|
|
3365
|
+
} else
|
|
3366
|
+
this.message = `Unable to index files:
|
|
3367
|
+
${this.indexingErrors.map((err) => `- ${err}`).join(`
|
|
3368
|
+
`)}`;
|
|
3369
|
+
}
|
|
3370
|
+
toString() {
|
|
3371
|
+
return this.indexingErrors.length === 1 ? `${this.message}:
|
|
3372
|
+
${this.indexingErrors[0].stack}` : this.message;
|
|
3373
|
+
}
|
|
3374
|
+
};
|
|
3375
|
+
|
|
3376
|
+
// src/core-server/utils/autoName.ts
|
|
3377
|
+
import { basename as basename3 } from "node:path";
|
|
3378
|
+
function autoName(mdxImportPath, csfImportPath, defaultName) {
|
|
3379
|
+
let mdxBasename = basename3(mdxImportPath), csfBasename = basename3(csfImportPath), [mdxFilename] = mdxBasename.split("."), [csfFilename] = csfBasename.split(".");
|
|
3380
|
+
return mdxFilename === csfFilename ? defaultName : mdxFilename;
|
|
3381
|
+
}
|
|
3382
|
+
|
|
3383
|
+
// src/core-server/utils/analyze-mdx.ts
|
|
3384
|
+
init_acorn();
|
|
3385
|
+
var import_acorn_jsx = __toESM(require_acorn_jsx(), 1);
|
|
3386
|
+
var mdxSyntaxOptions = {
|
|
3387
|
+
acorn: Parser.extend((0, import_acorn_jsx.default)()),
|
|
3388
|
+
acornOptions: { ecmaVersion: 2024, sourceType: "module" },
|
|
3389
|
+
addResult: !0
|
|
3390
|
+
}, parseMdx = (code) => fromMarkdown(code, {
|
|
3391
|
+
extensions: [mdxjs(mdxSyntaxOptions)],
|
|
3392
|
+
mdastExtensions: [mdxFromMarkdown()]
|
|
3393
|
+
}), createEmptyMdxMetadata = () => ({
|
|
3394
|
+
title: void 0,
|
|
3395
|
+
of: void 0,
|
|
3396
|
+
name: void 0,
|
|
3397
|
+
id: void 0,
|
|
3398
|
+
summary: void 0,
|
|
3399
|
+
isTemplate: !1,
|
|
3400
|
+
metaTags: void 0
|
|
3401
|
+
}), isMdxJsxAttribute = (node) => node.type === "mdxJsxAttribute", isMetaElement = (node) => node.type === "mdxJsxFlowElement" && node.name === "Meta", isStringLiteral = (value) => value?.type === "Literal" && typeof value.value == "string", getAttribute = (metaElement, attributeName) => metaElement.attributes.find(
|
|
3402
|
+
(node) => isMdxJsxAttribute(node) && node.name === attributeName
|
|
3403
|
+
), getAttributeValue = (metaElement, attributeName) => getAttribute(metaElement, attributeName)?.value, getExpression = (attributeValue) => {
|
|
3404
|
+
let expressionStatement = attributeValue.data?.estree?.body[0];
|
|
3405
|
+
if (expressionStatement?.type === "ExpressionStatement")
|
|
3406
|
+
return expressionStatement.expression;
|
|
3407
|
+
throw new Error("Expected JSX expression, received unknown");
|
|
3408
|
+
}, getStringAttribute = (metaElement, attributeName) => {
|
|
3409
|
+
let attributeValue = getAttributeValue(metaElement, attributeName);
|
|
3410
|
+
if (attributeValue) {
|
|
3411
|
+
if (typeof attributeValue == "string")
|
|
3412
|
+
return attributeValue;
|
|
3413
|
+
throw new Error(`Expected string literal ${attributeName}, received JSXExpressionContainer`);
|
|
3414
|
+
}
|
|
3415
|
+
}, getOfImportPath = (metaElement, importMap) => {
|
|
3416
|
+
let attributeValue = getAttributeValue(metaElement, "of");
|
|
3417
|
+
if (!attributeValue)
|
|
3418
|
+
return;
|
|
3419
|
+
if (typeof attributeValue == "string")
|
|
3420
|
+
throw new Error("Expected JSX expression, received Literal");
|
|
3421
|
+
let expression = getExpression(attributeValue);
|
|
3422
|
+
if (expression.type !== "Identifier")
|
|
3423
|
+
throw new Error(`Expected identifier, received ${expression.type}`);
|
|
3424
|
+
let importPath = importMap[expression.name];
|
|
3425
|
+
if (importPath)
|
|
3426
|
+
return importPath;
|
|
3427
|
+
throw new Error(`Unknown identifier ${expression.name}`);
|
|
3428
|
+
}, getMetaTags = (metaElement) => {
|
|
3429
|
+
let attribute = getAttribute(metaElement, "tags");
|
|
3430
|
+
if (!attribute)
|
|
3431
|
+
return;
|
|
3432
|
+
let attributeValue = attribute.value;
|
|
3433
|
+
if (!attributeValue)
|
|
3434
|
+
throw new Error("Expected JSX expression tags, received null");
|
|
3435
|
+
if (typeof attributeValue == "string")
|
|
3436
|
+
throw new Error("Expected JSX expression tags, received Literal");
|
|
3437
|
+
let expression = getExpression(attributeValue);
|
|
3438
|
+
if (expression.type !== "ArrayExpression")
|
|
3439
|
+
throw new Error(`Expected tags array, received ${expression.type}`);
|
|
3440
|
+
return expression.elements.map((element) => {
|
|
3441
|
+
if (isStringLiteral(element))
|
|
3442
|
+
return element.value;
|
|
3443
|
+
throw new Error(`Expected string literal tag, received ${element?.type ?? "null"}`);
|
|
3444
|
+
});
|
|
3445
|
+
}, getIsTemplate = (metaElement) => {
|
|
3446
|
+
let attribute = getAttribute(metaElement, "isTemplate");
|
|
3447
|
+
if (!attribute)
|
|
3448
|
+
return !1;
|
|
3449
|
+
let attributeValue = attribute.value;
|
|
3450
|
+
if (attributeValue == null)
|
|
3451
|
+
return !0;
|
|
3452
|
+
if (typeof attributeValue == "string")
|
|
3453
|
+
throw new Error("Expected expression isTemplate, received Literal");
|
|
3454
|
+
let expression = getExpression(attributeValue);
|
|
3455
|
+
if (expression.type === "Literal" && typeof expression.value == "boolean")
|
|
3456
|
+
return expression.value;
|
|
3457
|
+
throw new Error(
|
|
3458
|
+
`Expected boolean isTemplate, received ${typeof expression.value}`
|
|
3459
|
+
);
|
|
3460
|
+
}, extractMeta = (metaElement, importMap) => ({
|
|
3461
|
+
title: getStringAttribute(metaElement, "title"),
|
|
3462
|
+
of: getOfImportPath(metaElement, importMap),
|
|
3463
|
+
name: getStringAttribute(metaElement, "name"),
|
|
3464
|
+
id: getStringAttribute(metaElement, "id"),
|
|
3465
|
+
summary: getStringAttribute(metaElement, "summary"),
|
|
3466
|
+
isTemplate: getIsTemplate(metaElement),
|
|
3467
|
+
metaTags: getMetaTags(metaElement)
|
|
3468
|
+
}), getHeadingText = (node) => node.children ? node.children.map((child) => {
|
|
3469
|
+
let c = child;
|
|
3470
|
+
return c.type === "text" ? c.value ?? "" : c.children ? getHeadingText(c) : "";
|
|
3471
|
+
}).join("") : "", getAnchors = (root) => {
|
|
3472
|
+
let anchors = [], slugger = new BananaSlug(), walk = (nodes) => {
|
|
3473
|
+
for (let node of nodes) {
|
|
3474
|
+
let n = node;
|
|
3475
|
+
if (n.type === "heading" && typeof n.depth == "number") {
|
|
3476
|
+
let title = getHeadingText(n);
|
|
3477
|
+
if (title) {
|
|
3478
|
+
let id = slugger.slug(title);
|
|
3479
|
+
n.depth <= 4 && anchors.push({ id, title });
|
|
3480
|
+
}
|
|
3481
|
+
}
|
|
3482
|
+
n.children && walk(n.children);
|
|
3483
|
+
}
|
|
3484
|
+
};
|
|
3485
|
+
return walk(root.children), anchors;
|
|
3486
|
+
}, extractImports = (root) => {
|
|
3487
|
+
let importMap = {};
|
|
3488
|
+
for (let child of root.body) {
|
|
3489
|
+
if (child.type !== "ImportDeclaration")
|
|
3490
|
+
continue;
|
|
3491
|
+
let importPath = child.source.value;
|
|
3492
|
+
if (child.source.type !== "Literal" || typeof importPath != "string")
|
|
3493
|
+
throw new Error("MDX: unexpected import source");
|
|
3494
|
+
for (let specifier of child.specifiers)
|
|
3495
|
+
importMap[specifier.local.name] = importPath;
|
|
3496
|
+
}
|
|
3497
|
+
return importMap;
|
|
3498
|
+
}, analyzeParsedMdx = (root) => {
|
|
3499
|
+
let importMap = {}, metaElement;
|
|
3500
|
+
for (let child of root.children)
|
|
3501
|
+
if (child.type === "mdxjsEsm" && child.data?.estree && Object.assign(importMap, extractImports(child.data.estree)), isMetaElement(child)) {
|
|
3502
|
+
if (metaElement)
|
|
3503
|
+
throw new Error("Meta can only be declared once");
|
|
3504
|
+
metaElement = child;
|
|
3505
|
+
}
|
|
3506
|
+
return {
|
|
3507
|
+
...metaElement ? extractMeta(metaElement, importMap) : createEmptyMdxMetadata(),
|
|
3508
|
+
imports: Array.from(new Set(Object.values(importMap))),
|
|
3509
|
+
anchors: getAnchors(root)
|
|
3510
|
+
};
|
|
3511
|
+
}, analyzeMdx = async (code) => analyzeParsedMdx(parseMdx(code));
|
|
3512
|
+
|
|
3513
|
+
// src/core-server/utils/summarizeStats.ts
|
|
3514
|
+
var addStats = (stat2, acc) => {
|
|
3515
|
+
Object.entries(stat2).forEach(([key, value]) => {
|
|
3516
|
+
let statsKey = key;
|
|
3517
|
+
acc[statsKey] || (acc[statsKey] = 0), acc[statsKey] += value ? 1 : 0;
|
|
3518
|
+
});
|
|
3519
|
+
};
|
|
3520
|
+
|
|
3521
|
+
// src/core-server/utils/StoryIndexGenerator.ts
|
|
3522
|
+
var makeAbsolute = (otherImport, normalizedPath, workingDir) => otherImport.startsWith(".") ? slash(resolve8(workingDir, normalizeStoryPath(join10(dirname2(normalizedPath), otherImport)))) : otherImport, StoryIndexGenerator = class _StoryIndexGenerator {
|
|
3523
|
+
constructor(specifiers, options) {
|
|
3524
|
+
this.specifiers = specifiers;
|
|
3525
|
+
this.options = options;
|
|
3526
|
+
this.invalidationListeners = /* @__PURE__ */ new Set();
|
|
3527
|
+
this.specifierToCache = /* @__PURE__ */ new Map();
|
|
3528
|
+
}
|
|
3529
|
+
static {
|
|
3530
|
+
/** Cache for findMatchingFiles results */
|
|
3531
|
+
this.findMatchingFilesCache = /* @__PURE__ */ new Map();
|
|
3532
|
+
}
|
|
3533
|
+
/** Generate a cache key for findMatchingFiles */
|
|
3534
|
+
static getFindMatchingFilesCacheKey(specifier, workingDir, ignoreWarnings) {
|
|
3535
|
+
return JSON.stringify({
|
|
3536
|
+
directory: specifier.directory,
|
|
3537
|
+
files: specifier.files,
|
|
3538
|
+
workingDir,
|
|
3539
|
+
ignoreWarnings
|
|
3540
|
+
});
|
|
3541
|
+
}
|
|
3542
|
+
/** Clear the findMatchingFiles cache */
|
|
3543
|
+
static clearFindMatchingFilesCache() {
|
|
3544
|
+
this.findMatchingFilesCache.clear();
|
|
3545
|
+
}
|
|
3546
|
+
static async findMatchingFiles(specifier, workingDir, ignoreWarnings = !1) {
|
|
3547
|
+
let cacheKey = this.getFindMatchingFilesCacheKey(specifier, workingDir, ignoreWarnings), cached = this.findMatchingFilesCache.get(cacheKey);
|
|
3548
|
+
if (cached)
|
|
3549
|
+
return cached;
|
|
3550
|
+
let pathToSubIndex = {}, globCwd = slash(resolve8(workingDir, specifier.directory)), globPattern = specifier.files.startsWith("!") ? `./${specifier.files}` : specifier.files, { globby } = await import("../_node-chunks/globby-HWZL7XSQ.js"), files = await globby(globPattern, {
|
|
3551
|
+
absolute: !0,
|
|
3552
|
+
cwd: globCwd,
|
|
3553
|
+
...commonGlobOptions2(globPattern),
|
|
3554
|
+
onlyFiles: !0
|
|
3555
|
+
});
|
|
3556
|
+
return files.length === 0 && !ignoreWarnings && once.warn(
|
|
3557
|
+
`No story files found for the specified pattern: ${import_picocolors7.default.blue(
|
|
3558
|
+
join10(specifier.directory, specifier.files)
|
|
3559
|
+
)}`
|
|
3560
|
+
), files.sort().forEach((absolutePath) => {
|
|
3561
|
+
let ext = extname(absolutePath);
|
|
3562
|
+
if (ext === ".storyshot") {
|
|
3563
|
+
let relativePath = relative6(workingDir, absolutePath);
|
|
3564
|
+
logger16.info(`Skipping ${ext} file ${relativePath}`);
|
|
3565
|
+
return;
|
|
3566
|
+
}
|
|
3567
|
+
pathToSubIndex[absolutePath] = !1;
|
|
3568
|
+
}), this.findMatchingFilesCache.set(cacheKey, pathToSubIndex), pathToSubIndex;
|
|
3569
|
+
}
|
|
3570
|
+
static async findMatchingFilesForSpecifiers(specifiers, workingDir, ignoreWarnings = !1) {
|
|
3571
|
+
return Promise.all(
|
|
3572
|
+
specifiers.map(async (specifier) => {
|
|
3573
|
+
let pathToSubIndex = await _StoryIndexGenerator.findMatchingFiles(
|
|
3574
|
+
specifier,
|
|
3575
|
+
workingDir,
|
|
3576
|
+
ignoreWarnings
|
|
3577
|
+
);
|
|
3578
|
+
return [specifier, pathToSubIndex];
|
|
3579
|
+
})
|
|
3580
|
+
);
|
|
3581
|
+
}
|
|
3582
|
+
async initialize() {
|
|
3583
|
+
(await _StoryIndexGenerator.findMatchingFilesForSpecifiers(
|
|
3584
|
+
this.specifiers,
|
|
3585
|
+
this.options.workingDir
|
|
3586
|
+
)).forEach(
|
|
3587
|
+
([specifier, cache4]) => this.specifierToCache.set(specifier, cache4)
|
|
3588
|
+
);
|
|
3589
|
+
let previewCode = await this.getPreviewCode(), projectTags = this.getProjectTags(previewCode);
|
|
3590
|
+
await this.ensureExtracted({ projectTags });
|
|
3591
|
+
}
|
|
3592
|
+
/** Run the updater function over all the empty cache entries */
|
|
3593
|
+
async updateExtracted(updater, overwrite = !1) {
|
|
3594
|
+
await Promise.all(
|
|
3595
|
+
this.specifiers.map(async (specifier) => {
|
|
3596
|
+
let entry = this.specifierToCache.get(specifier);
|
|
3597
|
+
return invariant(
|
|
3598
|
+
entry,
|
|
3599
|
+
`specifier does not have a matching cache entry in specifierToCache: ${JSON.stringify(
|
|
3600
|
+
specifier
|
|
3601
|
+
)}`
|
|
3602
|
+
), Promise.all(
|
|
3603
|
+
Object.keys(entry).map(async (absolutePath) => {
|
|
3604
|
+
if (!(entry[absolutePath] && !overwrite))
|
|
3605
|
+
try {
|
|
3606
|
+
entry[absolutePath] = await updater(specifier, absolutePath, entry[absolutePath]);
|
|
3607
|
+
} catch (err) {
|
|
3608
|
+
let relativePath = `.${sep2}${relative6(this.options.workingDir, absolutePath)}`;
|
|
3609
|
+
entry[absolutePath] = {
|
|
3610
|
+
type: "error",
|
|
3611
|
+
err: new IndexingError(
|
|
3612
|
+
err instanceof Error ? err.message : String(err),
|
|
3613
|
+
[relativePath],
|
|
3614
|
+
err instanceof Error ? err.stack : void 0
|
|
3615
|
+
)
|
|
3616
|
+
};
|
|
3617
|
+
}
|
|
3618
|
+
})
|
|
3619
|
+
);
|
|
3620
|
+
})
|
|
3621
|
+
);
|
|
3622
|
+
}
|
|
3623
|
+
isDocsMdx(absolutePath) {
|
|
3624
|
+
return /(?<!\.stories)\.mdx$/i.test(absolutePath);
|
|
3625
|
+
}
|
|
3626
|
+
async ensureExtracted({
|
|
3627
|
+
projectTags
|
|
3628
|
+
}) {
|
|
3629
|
+
await this.updateExtracted(
|
|
3630
|
+
async (specifier, absolutePath) => this.isDocsMdx(absolutePath) ? !1 : this.extractStories(specifier, absolutePath, projectTags)
|
|
3631
|
+
), await this.updateExtracted(
|
|
3632
|
+
async (specifier, absolutePath) => this.extractDocs(specifier, absolutePath, projectTags)
|
|
3633
|
+
);
|
|
3634
|
+
let statsSummary = {};
|
|
3635
|
+
return { entries: this.specifiers.flatMap((specifier) => {
|
|
3636
|
+
let cache4 = this.specifierToCache.get(specifier);
|
|
3637
|
+
return invariant(
|
|
3638
|
+
cache4,
|
|
3639
|
+
`specifier does not have a matching cache entry in specifierToCache: ${JSON.stringify(
|
|
3640
|
+
specifier
|
|
3641
|
+
)}`
|
|
3642
|
+
), Object.values(cache4).flatMap((entry) => entry ? entry.type === "docs" ? [entry] : entry.type === "error" ? [entry] : entry.entries.map((item) => {
|
|
3643
|
+
if (item.type === "docs")
|
|
3644
|
+
return item;
|
|
3645
|
+
isExampleStoryId2(item.id) || addStats(item.extra.stats, statsSummary);
|
|
3646
|
+
let { extra, ...existing } = item;
|
|
3647
|
+
return existing;
|
|
3648
|
+
}) : []);
|
|
3649
|
+
}), stats: statsSummary };
|
|
3650
|
+
}
|
|
3651
|
+
findDependencies(absoluteImports) {
|
|
3652
|
+
return [...this.specifierToCache.values()].flatMap(
|
|
3653
|
+
(cache4) => Object.entries(cache4).filter(([fileName, cacheEntry]) => !cacheEntry || cacheEntry.type !== "stories" ? !1 : !!absoluteImports.find(
|
|
3654
|
+
(storyImport) => fileName.match(
|
|
3655
|
+
new RegExp(`^${storyImport.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}(\\.[^.]+)?$`)
|
|
3656
|
+
)
|
|
3657
|
+
)).map(([_, cacheEntry]) => cacheEntry)
|
|
3658
|
+
);
|
|
3659
|
+
}
|
|
3660
|
+
/**
|
|
3661
|
+
* Try to find the component path from a raw import string and return it in the same format as
|
|
3662
|
+
* `importPath`. Respect tsconfig paths if available.
|
|
3663
|
+
*
|
|
3664
|
+
* If no such file exists, assume that the import is from a package and return the raw
|
|
3665
|
+
*/
|
|
3666
|
+
resolveComponentPath(rawComponentPath, absolutePath, matchPath) {
|
|
3667
|
+
let matchedPath = matchPath?.(rawComponentPath, void 0, void 0, supportedExtensions) ?? rawComponentPath, resolved;
|
|
3668
|
+
try {
|
|
3669
|
+
resolved = resolveImport(matchedPath, { basedir: dirname2(absolutePath) });
|
|
3670
|
+
} catch {
|
|
3671
|
+
return matchedPath;
|
|
3672
|
+
}
|
|
3673
|
+
let relativePath = relative6(this.options.workingDir, resolved);
|
|
3674
|
+
return slash(normalizeStoryPath(relativePath));
|
|
3675
|
+
}
|
|
3676
|
+
async extractStories(specifier, absolutePath, projectTags = []) {
|
|
3677
|
+
let relativePath = relative6(this.options.workingDir, absolutePath), importPath = slash(normalizeStoryPath(relativePath)), defaultMakeTitle = (userTitle) => {
|
|
3678
|
+
let title = userOrAutoTitleFromSpecifier(importPath, specifier, userTitle);
|
|
3679
|
+
return invariant(
|
|
3680
|
+
title,
|
|
3681
|
+
"makeTitle created an undefined title. This happens when the fileName doesn't match any specifier from main.js"
|
|
3682
|
+
), title;
|
|
3683
|
+
}, indexer = this.options.indexers.find((ind) => ind.test.exec(absolutePath));
|
|
3684
|
+
invariant(indexer, `No matching indexer found for ${absolutePath}`);
|
|
3685
|
+
let indexInputs = await indexer.createIndex(absolutePath, {
|
|
3686
|
+
makeTitle: defaultMakeTitle
|
|
3687
|
+
}), tsconfigPath = up("tsconfig.json", {
|
|
3688
|
+
cwd: this.options.workingDir,
|
|
3689
|
+
last: getProjectRoot3()
|
|
3690
|
+
}), tsconfig = TsconfigPaths.loadConfig(tsconfigPath), matchPath;
|
|
3691
|
+
tsconfig.resultType === "success" && (matchPath = TsconfigPaths.createMatchPath(
|
|
3692
|
+
getTsconfigPathsBaseDir(tsconfig.configFileAbsolutePath),
|
|
3693
|
+
tsconfig.paths,
|
|
3694
|
+
["browser", "module", "main"]
|
|
3695
|
+
));
|
|
3696
|
+
let toImportPath = (path) => path ? path.startsWith("virtual:") ? path : slash(normalizeStoryPath(relative6(this.options.workingDir, path))) : importPath, storyEntries = indexInputs.map((input) => {
|
|
3697
|
+
let name = input.name ?? storyNameFromExport(input.exportName), componentPath = input.rawComponentPath && this.resolveComponentPath(input.rawComponentPath, absolutePath, matchPath), title = input.title ?? defaultMakeTitle(), id = input.__id ?? toId(input.metaId ?? title, storyNameFromExport(input.exportName)), tags = combineTags(...projectTags, ...input.tags ?? []), subtype = input.subtype ?? "story", entry = {
|
|
3698
|
+
type: "story",
|
|
3699
|
+
subtype,
|
|
3700
|
+
id,
|
|
3701
|
+
extra: {
|
|
3702
|
+
metaId: input.metaId,
|
|
3703
|
+
stats: input.__stats ?? {}
|
|
3704
|
+
},
|
|
3705
|
+
name,
|
|
3706
|
+
title,
|
|
3707
|
+
importPath: toImportPath(input.importPath),
|
|
3708
|
+
componentPath,
|
|
3709
|
+
tags
|
|
3710
|
+
};
|
|
3711
|
+
return subtype === "test" && (entry.parent = input.parent, entry.parentName = input.parentName), input.exportName && (entry.exportName = input.exportName), entry;
|
|
3712
|
+
});
|
|
3713
|
+
if (storyEntries.some((entry) => entry.tags.includes(Tag.AUTODOCS)) && !!this.options.docs && this.options.build?.test?.disableAutoDocs !== !0) {
|
|
3714
|
+
let name = this.options.docs?.defaultName ?? "Docs", { metaId } = indexInputs[0], entry = storyEntries[0], id = toId(metaId ?? entry.title, name), tags = combineTags(...projectTags, ...indexInputs[0].tags ?? []);
|
|
3715
|
+
return {
|
|
3716
|
+
entries: [{
|
|
3717
|
+
id,
|
|
3718
|
+
title: entry.title,
|
|
3719
|
+
name,
|
|
3720
|
+
importPath: entry.importPath,
|
|
3721
|
+
type: "docs",
|
|
3722
|
+
tags,
|
|
3723
|
+
storiesImports: [],
|
|
3724
|
+
...this.options.features?.experimentalSearchDocsHeadings && {
|
|
3725
|
+
// Each story in an autodocs page is wrapped in an `Anchor` block whose DOM id is
|
|
3726
|
+
// derived from the story id, so those are the reliable in-page navigation targets.
|
|
3727
|
+
anchors: storyEntries.map((e) => ({ id: anchorBlockIdFromId(e.id), title: e.name }))
|
|
3728
|
+
}
|
|
3729
|
+
}, ...storyEntries],
|
|
3730
|
+
dependents: [],
|
|
3731
|
+
type: "stories"
|
|
3732
|
+
};
|
|
3733
|
+
}
|
|
3734
|
+
return {
|
|
3735
|
+
entries: storyEntries,
|
|
3736
|
+
dependents: [],
|
|
3737
|
+
type: "stories"
|
|
3738
|
+
};
|
|
3739
|
+
}
|
|
3740
|
+
async extractDocs(specifier, absolutePath, projectTags = []) {
|
|
3741
|
+
let relativePath = relative6(this.options.workingDir, absolutePath);
|
|
3742
|
+
try {
|
|
3743
|
+
let normalizedPath = normalizeStoryPath(relativePath), importPath = slash(normalizedPath), content = await readFile4(absolutePath, { encoding: "utf8" }), result = await analyzeMdx(content);
|
|
3744
|
+
if (result.isTemplate)
|
|
3745
|
+
return !1;
|
|
3746
|
+
let absoluteImports = result.imports.map(
|
|
3747
|
+
(p) => makeAbsolute(p, normalizedPath, this.options.workingDir)
|
|
3748
|
+
), dependencies = this.findDependencies(absoluteImports), sortedDependencies = dependencies, csfEntry;
|
|
3749
|
+
if (result.of) {
|
|
3750
|
+
let absoluteOf = makeAbsolute(result.of, normalizedPath, this.options.workingDir), metaDependency;
|
|
3751
|
+
dependencies.forEach((dep) => {
|
|
3752
|
+
if (dep.entries.length > 0) {
|
|
3753
|
+
let first = dep.entries.find((e) => e.type !== "docs");
|
|
3754
|
+
normalize2(resolve8(this.options.workingDir, first.importPath)).startsWith(
|
|
3755
|
+
normalize2(absoluteOf)
|
|
3756
|
+
) && (csfEntry = first, metaDependency = dep);
|
|
3757
|
+
}
|
|
3758
|
+
}), metaDependency && (sortedDependencies = [
|
|
3759
|
+
metaDependency,
|
|
3760
|
+
...dependencies.filter((d) => d !== metaDependency)
|
|
3761
|
+
]), invariant(
|
|
3762
|
+
csfEntry,
|
|
3763
|
+
dedent7`
|
|
3764
|
+
Could not find or load CSF file at path "${result.of}" referenced by \`of={}\` in docs file "${relativePath}".
|
|
3765
|
+
|
|
3766
|
+
- Does that file exist?
|
|
3767
|
+
- If so, is it a CSF file (\`.stories.*\`)?
|
|
3768
|
+
- If so, is it matched by the \`stories\` glob in \`main.js\`?
|
|
3769
|
+
- If so, has the file successfully loaded in Forkbook and are its stories visible?
|
|
3770
|
+
`
|
|
3771
|
+
);
|
|
3772
|
+
}
|
|
3773
|
+
dependencies.forEach((dep) => {
|
|
3774
|
+
dep.dependents.push(absolutePath);
|
|
3775
|
+
});
|
|
3776
|
+
let title = csfEntry?.title || userOrAutoTitleFromSpecifier(importPath, specifier, result.title);
|
|
3777
|
+
invariant(
|
|
3778
|
+
title,
|
|
3779
|
+
"makeTitle created an undefined title. This happens when a specifier's doesn't have any matches in its fileName"
|
|
3780
|
+
);
|
|
3781
|
+
let defaultName = this.options.docs?.defaultName ?? "Docs", name = result.name || (csfEntry ? autoName(importPath, csfEntry.importPath, defaultName) : defaultName), id = toId(csfEntry?.extra.metaId || result.id || title, name), tags = combineTags(
|
|
3782
|
+
...projectTags,
|
|
3783
|
+
...csfEntry?.tags ?? [],
|
|
3784
|
+
...result.metaTags ?? [],
|
|
3785
|
+
csfEntry ? Tag.ATTACHED_MDX : Tag.UNATTACHED_MDX
|
|
3786
|
+
);
|
|
3787
|
+
return {
|
|
3788
|
+
id,
|
|
3789
|
+
title,
|
|
3790
|
+
name,
|
|
3791
|
+
importPath,
|
|
3792
|
+
storiesImports: sortedDependencies.map((dep) => dep.entries[0].importPath),
|
|
3793
|
+
type: "docs",
|
|
3794
|
+
tags,
|
|
3795
|
+
...this.options.features?.experimentalSearchDocsHeadings && { anchors: result.anchors }
|
|
3796
|
+
};
|
|
3797
|
+
} catch (err) {
|
|
3798
|
+
throw err && err.source?.match(/mdast-util-mdx-jsx/g) && logger16.warn(
|
|
3799
|
+
`\u{1F4A1} This seems to be an MDX2 syntax error. Please refer to the MDX section in the following resource for assistance on how to fix this: ${import_picocolors7.default.yellow(
|
|
3800
|
+
"https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#mdx2-upgrade"
|
|
3801
|
+
)}`
|
|
3802
|
+
), err;
|
|
3803
|
+
}
|
|
3804
|
+
}
|
|
3805
|
+
chooseDuplicate(firstEntry, secondEntry, projectTags) {
|
|
3806
|
+
if (firstEntry.importPath === secondEntry.importPath)
|
|
3807
|
+
return firstEntry;
|
|
3808
|
+
let firstIsBetter = !0;
|
|
3809
|
+
(secondEntry.type === "story" || isMdxEntry(secondEntry) && firstEntry.type === "docs" && !isMdxEntry(firstEntry)) && (firstIsBetter = !1);
|
|
3810
|
+
let betterEntry = firstIsBetter ? firstEntry : secondEntry, worseEntry = firstIsBetter ? secondEntry : firstEntry, changeDocsName = 'Use `<Meta of={} name="Other Name">` to distinguish them.';
|
|
3811
|
+
if (worseEntry.type === "story")
|
|
3812
|
+
throw new IndexingError(`Duplicate stories with id: ${firstEntry.id}`, [
|
|
3813
|
+
firstEntry.importPath,
|
|
3814
|
+
secondEntry.importPath
|
|
3815
|
+
]);
|
|
3816
|
+
if (betterEntry.type === "story") {
|
|
3817
|
+
let worseDescriptor = isMdxEntry(worseEntry) ? "component docs page" : "automatically generated docs page", docsName = this.options.docs?.defaultName ?? "Docs";
|
|
3818
|
+
throw betterEntry.name === docsName ? new IndexingError(
|
|
3819
|
+
`You have a story for ${betterEntry.title} with the same name as your default docs entry name (${betterEntry.name}), so the docs page is being dropped. Consider changing the story name.`,
|
|
3820
|
+
[firstEntry.importPath, secondEntry.importPath]
|
|
3821
|
+
) : new IndexingError(
|
|
3822
|
+
`You have a story for ${betterEntry.title} with the same name as your ${worseDescriptor} (${worseEntry.name}), so the docs page is being dropped. ${changeDocsName}`,
|
|
3823
|
+
[firstEntry.importPath, secondEntry.importPath]
|
|
3824
|
+
);
|
|
3825
|
+
} else if (isMdxEntry(betterEntry)) {
|
|
3826
|
+
if (isMdxEntry(worseEntry))
|
|
3827
|
+
throw new IndexingError(
|
|
3828
|
+
`You have two component docs pages with the same name ${betterEntry.title}:${betterEntry.name}. ${changeDocsName}`,
|
|
3829
|
+
[firstEntry.importPath, secondEntry.importPath]
|
|
3830
|
+
);
|
|
3831
|
+
if (worseEntry.tags?.includes(Tag.AUTODOCS) && !projectTags?.includes(Tag.AUTODOCS))
|
|
3832
|
+
throw new IndexingError(
|
|
3833
|
+
`You created a component docs page for '${worseEntry.title}', but also tagged the CSF file with '${Tag.AUTODOCS}'. This is probably a mistake.`,
|
|
3834
|
+
[betterEntry.importPath, worseEntry.importPath]
|
|
3835
|
+
);
|
|
3836
|
+
} else
|
|
3837
|
+
return {
|
|
3838
|
+
...betterEntry,
|
|
3839
|
+
storiesImports: [
|
|
3840
|
+
...betterEntry.storiesImports,
|
|
3841
|
+
worseEntry.importPath,
|
|
3842
|
+
...worseEntry.storiesImports
|
|
3843
|
+
]
|
|
3844
|
+
};
|
|
3845
|
+
return betterEntry;
|
|
3846
|
+
}
|
|
3847
|
+
async sortStories(entries, storySortParameter) {
|
|
3848
|
+
let sortableStories = Object.values(entries), fileNameOrder = _StoryIndexGenerator.storyFileNames(this.specifierToCache);
|
|
3849
|
+
return sortStoriesV7(sortableStories, storySortParameter, fileNameOrder), sortableStories.reduce(
|
|
3850
|
+
(acc, item) => (acc[item.id] = item, acc),
|
|
3851
|
+
{}
|
|
3852
|
+
);
|
|
3853
|
+
}
|
|
3854
|
+
async getIndex() {
|
|
3855
|
+
return (await this.getIndexAndStats()).storyIndex;
|
|
3856
|
+
}
|
|
3857
|
+
async getIndexAndStats() {
|
|
3858
|
+
if (this.lastIndex && this.lastStats)
|
|
3859
|
+
return { storyIndex: this.lastIndex, stats: this.lastStats };
|
|
3860
|
+
if (this.lastError)
|
|
3861
|
+
throw this.lastError;
|
|
3862
|
+
let previewCode = await this.getPreviewCode(), projectTags = this.getProjectTags(previewCode), { entries: storiesList, stats } = await this.ensureExtracted({ projectTags });
|
|
3863
|
+
try {
|
|
3864
|
+
let errorEntries = storiesList.filter((entry) => entry.type === "error");
|
|
3865
|
+
if (errorEntries.length)
|
|
3866
|
+
throw new MultipleIndexingError(errorEntries.map((entry) => entry.err));
|
|
3867
|
+
let duplicateErrors = [], indexEntries = {};
|
|
3868
|
+
if (storiesList.forEach((entry) => {
|
|
3869
|
+
try {
|
|
3870
|
+
let existing = indexEntries[entry.id];
|
|
3871
|
+
existing ? indexEntries[entry.id] = this.chooseDuplicate(existing, entry, projectTags) : indexEntries[entry.id] = entry;
|
|
3872
|
+
} catch (err) {
|
|
3873
|
+
err instanceof IndexingError && duplicateErrors.push(err);
|
|
3874
|
+
}
|
|
3875
|
+
}), duplicateErrors.length)
|
|
3876
|
+
throw new MultipleIndexingError(duplicateErrors);
|
|
3877
|
+
let sorted = await this.sortStories(
|
|
3878
|
+
indexEntries,
|
|
3879
|
+
combineStorySorts(this.options.storySorts ?? [])
|
|
3880
|
+
);
|
|
3881
|
+
return this.lastStats = stats, this.lastIndex = {
|
|
3882
|
+
v: 5,
|
|
3883
|
+
entries: sorted
|
|
3884
|
+
}, { storyIndex: this.lastIndex, stats: this.lastStats };
|
|
3885
|
+
} catch (err) {
|
|
3886
|
+
throw this.lastError = err == null || err instanceof Error ? err : void 0, invariant(this.lastError), logger16.warn(`\u{1F6A8} ${this.lastError.toString()}`), this.lastError;
|
|
3887
|
+
}
|
|
3888
|
+
}
|
|
3889
|
+
invalidateAll() {
|
|
3890
|
+
this.specifierToCache.forEach((cache4) => {
|
|
3891
|
+
Object.keys(cache4).forEach((key) => {
|
|
3892
|
+
cache4[key] = !1;
|
|
3893
|
+
});
|
|
3894
|
+
}), this.lastIndex = null, this.lastError = null, this.invalidationListeners.forEach((listener) => listener());
|
|
3895
|
+
}
|
|
3896
|
+
invalidate(importPath, removed) {
|
|
3897
|
+
let absolutePath = slash(resolve8(this.options.workingDir, importPath)), specifier = Array.from(this.specifierToCache.keys()).find(
|
|
3898
|
+
(ns) => ns.importPathMatcher.exec(importPath)
|
|
3899
|
+
);
|
|
3900
|
+
if (!specifier)
|
|
3901
|
+
return;
|
|
3902
|
+
let cache4 = this.specifierToCache.get(specifier);
|
|
3903
|
+
invariant(
|
|
3904
|
+
cache4,
|
|
3905
|
+
`specifier does not have a matching cache entry in specifierToCache: ${JSON.stringify(
|
|
3906
|
+
specifier
|
|
3907
|
+
)}`
|
|
3908
|
+
);
|
|
3909
|
+
let cacheEntry = cache4[absolutePath];
|
|
3910
|
+
if (cacheEntry && cacheEntry.type === "stories") {
|
|
3911
|
+
let { dependents } = cacheEntry, invalidated = /* @__PURE__ */ new Set();
|
|
3912
|
+
this.specifierToCache.forEach((otherCache) => {
|
|
3913
|
+
dependents.forEach((dep) => {
|
|
3914
|
+
otherCache[dep] && (invalidated.add(dep), otherCache[dep] = !1);
|
|
3915
|
+
});
|
|
3916
|
+
});
|
|
3917
|
+
}
|
|
3918
|
+
if (removed) {
|
|
3919
|
+
if (cacheEntry && cacheEntry.type === "docs") {
|
|
3920
|
+
let absoluteImports = cacheEntry.storiesImports.map(
|
|
3921
|
+
(p) => resolve8(this.options.workingDir, p)
|
|
3922
|
+
);
|
|
3923
|
+
this.findDependencies(absoluteImports).forEach(
|
|
3924
|
+
(dep) => dep.dependents.splice(dep.dependents.indexOf(absolutePath), 1)
|
|
3925
|
+
);
|
|
3926
|
+
}
|
|
3927
|
+
delete cache4[absolutePath];
|
|
3928
|
+
} else
|
|
3929
|
+
cache4[absolutePath] = !1;
|
|
3930
|
+
this.lastIndex = null, this.lastError = null, this.invalidationListeners.forEach((listener) => listener());
|
|
3931
|
+
}
|
|
3932
|
+
onInvalidated(listener) {
|
|
3933
|
+
return this.invalidationListeners.add(listener), () => {
|
|
3934
|
+
this.invalidationListeners.delete(listener);
|
|
3935
|
+
};
|
|
3936
|
+
}
|
|
3937
|
+
async getPreviewCode() {
|
|
3938
|
+
let previewFile = ["js", "jsx", "ts", "tsx", "mjs", "cjs", "mts"].map((ext) => join10(this.options.configDir, `preview.${ext}`)).find((fname) => existsSync3(fname));
|
|
3939
|
+
return previewFile && (await readFile4(previewFile, { encoding: "utf8" })).toString();
|
|
3940
|
+
}
|
|
3941
|
+
getProjectTags(previewCode) {
|
|
3942
|
+
let projectTags = [], defaultTags = [Tag.DEV, Tag.TEST, Tag.MANIFEST];
|
|
3943
|
+
if (previewCode)
|
|
3944
|
+
try {
|
|
3945
|
+
let projectAnnotations = loadConfig(previewCode).parse(), tags = projectAnnotations.getValue(["tags"]) ?? [];
|
|
3946
|
+
invariant(
|
|
3947
|
+
!projectAnnotations.mutationDiagnostics.some(
|
|
3948
|
+
({ code }) => code === "unsupported-value"
|
|
3949
|
+
) && Array.isArray(tags) && tags.every((tag) => typeof tag == "string"),
|
|
3950
|
+
"Preview tags must be a static array of strings"
|
|
3951
|
+
), projectTags = tags;
|
|
3952
|
+
} catch {
|
|
3953
|
+
once.warn(dedent7`
|
|
3954
|
+
Unable to parse tags from project configuration. If defined, tags should be specified inline, e.g.
|
|
3955
|
+
|
|
3956
|
+
export default {
|
|
3957
|
+
tags: ['foo'],
|
|
3958
|
+
}
|
|
3959
|
+
|
|
3960
|
+
---
|
|
3961
|
+
|
|
3962
|
+
Received:
|
|
3963
|
+
|
|
3964
|
+
${previewCode}
|
|
3965
|
+
`);
|
|
3966
|
+
}
|
|
3967
|
+
return [...defaultTags, ...projectTags];
|
|
3968
|
+
}
|
|
3969
|
+
// Get the story file names in "imported order"
|
|
3970
|
+
static storyFileNames(specifierToCache) {
|
|
3971
|
+
return Array.from(specifierToCache.values()).flatMap((r) => Object.keys(r));
|
|
3972
|
+
}
|
|
3973
|
+
};
|
|
3974
|
+
|
|
3975
|
+
// src/core-server/build-index.ts
|
|
3976
|
+
var buildIndex = async (options) => {
|
|
3977
|
+
let { presets } = await loadStorybook(options), [indexers, stories, docsOptions, features] = await Promise.all([
|
|
3978
|
+
presets.apply("experimental_indexers", []),
|
|
3979
|
+
presets.apply("stories", []),
|
|
3980
|
+
presets.apply("docs"),
|
|
3981
|
+
presets.apply("features")
|
|
3982
|
+
]), { configDir } = options, workingDir = process.cwd(), directories = {
|
|
3983
|
+
configDir,
|
|
3984
|
+
workingDir
|
|
3985
|
+
}, normalizedStories = normalizeStories2(stories, directories), generator = new StoryIndexGenerator(normalizedStories, {
|
|
3986
|
+
...directories,
|
|
3987
|
+
indexers,
|
|
3988
|
+
docs: docsOptions,
|
|
3989
|
+
build: {},
|
|
3990
|
+
features,
|
|
3991
|
+
storySorts: await presets.apply("storySorts", [])
|
|
3992
|
+
});
|
|
3993
|
+
return await generator.initialize(), generator.getIndex();
|
|
3994
|
+
}, buildIndexStandalone = async (options) => {
|
|
3995
|
+
let index = await buildIndex(options);
|
|
3996
|
+
logger17.info(`Writing index to ${options.outputFile}`), await writeFile4(options.outputFile, JSON.stringify(index));
|
|
3997
|
+
};
|
|
3998
|
+
|
|
3999
|
+
// src/core-server/standalone.ts
|
|
4000
|
+
async function build(options = {}, frameworkOptions = {}) {
|
|
4001
|
+
let { mode = "dev" } = options, { default: packageJson } = await import("@aussieljk/forkbook/package.json", { with: { type: "json" } }), commonOptions = {
|
|
4002
|
+
...options,
|
|
4003
|
+
...frameworkOptions,
|
|
4004
|
+
frameworkPresets: [
|
|
4005
|
+
...options.frameworkPresets || [],
|
|
4006
|
+
...frameworkOptions.frameworkPresets || []
|
|
4007
|
+
],
|
|
4008
|
+
packageJson
|
|
4009
|
+
};
|
|
4010
|
+
if (mode === "dev")
|
|
4011
|
+
return buildDevStandalone(commonOptions);
|
|
4012
|
+
if (mode === "static")
|
|
4013
|
+
return buildStaticStandalone(commonOptions);
|
|
4014
|
+
if (mode === "index")
|
|
4015
|
+
return buildIndexStandalone(commonOptions);
|
|
4016
|
+
throw new Error("'mode' parameter should be either 'dev', 'static', or 'index'");
|
|
4017
|
+
}
|
|
4018
|
+
var standalone_default = build;
|
|
4019
|
+
|
|
4020
|
+
// src/core-server/utils/get-stories-paths-from-config.ts
|
|
4021
|
+
import { normalizeStories as normalizeStories3 } from "@aussieljk/forkbook/internal/common";
|
|
4022
|
+
var getStoriesPathsFromConfig = async ({
|
|
4023
|
+
stories,
|
|
4024
|
+
configDir,
|
|
4025
|
+
workingDir
|
|
4026
|
+
}) => {
|
|
4027
|
+
if (stories.length === 0)
|
|
4028
|
+
return [];
|
|
4029
|
+
let normalizedStories = normalizeStories3(stories, { configDir, workingDir });
|
|
4030
|
+
return (await StoryIndexGenerator.findMatchingFilesForSpecifiers(
|
|
4031
|
+
normalizedStories,
|
|
4032
|
+
workingDir,
|
|
4033
|
+
!0
|
|
4034
|
+
)).flatMap(
|
|
4035
|
+
([specifier, cache4]) => StoryIndexGenerator.storyFileNames(/* @__PURE__ */ new Map([[specifier, cache4]]))
|
|
4036
|
+
);
|
|
4037
|
+
};
|
|
4038
|
+
|
|
4039
|
+
// src/shared/open-service/services/story-docs/provider.ts
|
|
4040
|
+
import { logger as logger18 } from "@aussieljk/forkbook/internal/node-logger";
|
|
4041
|
+
function createWorkerGatedStoryDocsProvider({
|
|
4042
|
+
label,
|
|
4043
|
+
docgenWorker,
|
|
4044
|
+
storyFileTest = STORY_FILE_TEST_REGEXP,
|
|
4045
|
+
build: build2
|
|
4046
|
+
}) {
|
|
4047
|
+
return async (nextStoryDocs, options) => (await options.presets.apply(
|
|
4048
|
+
"experimental_docgenProvider",
|
|
4049
|
+
[]
|
|
4050
|
+
)).some((descriptor) => descriptor.moduleSpecifier === docgenWorker) ? async (input) => {
|
|
4051
|
+
let storyImportPath = getStoryImportPathFromEntry(input.entry);
|
|
4052
|
+
if (!storyImportPath || !storyFileTest.test(storyImportPath))
|
|
4053
|
+
return nextStoryDocs(input);
|
|
4054
|
+
let ours;
|
|
4055
|
+
try {
|
|
4056
|
+
ours = await build2(input);
|
|
4057
|
+
} catch (error) {
|
|
4058
|
+
return logger18.debug(
|
|
4059
|
+
`${label} story snippets are unavailable for ${storyImportPath}: ${error instanceof Error ? error.message : String(error)}`
|
|
4060
|
+
), nextStoryDocs(input);
|
|
4061
|
+
}
|
|
4062
|
+
return ours ? { ...await nextStoryDocs(input), ...ours } : nextStoryDocs(input);
|
|
4063
|
+
} : nextStoryDocs;
|
|
4064
|
+
}
|
|
4065
|
+
|
|
4066
|
+
// src/shared/universal-store/mock.ts
|
|
4067
|
+
import { Channel as Channel5 } from "@aussieljk/forkbook/internal/channels";
|
|
4068
|
+
import { dedent as dedent8 } from "ts-dedent";
|
|
4069
|
+
var MockUniversalStore = class _MockUniversalStore extends UniversalStore {
|
|
4070
|
+
constructor(options, testUtils) {
|
|
4071
|
+
UniversalStore.isInternalConstructing = !0, super(
|
|
4072
|
+
{ ...options, leader: !0 },
|
|
4073
|
+
{ channel: new Channel5({}), environment: UniversalStore.Environment.MOCK }
|
|
4074
|
+
), UniversalStore.isInternalConstructing = !1, typeof testUtils?.fn == "function" && (this.testUtils = testUtils, this.getState = testUtils.fn(this.getState), this.setState = testUtils.fn(this.setState), this.subscribe = testUtils.fn(this.subscribe), this.onStateChange = testUtils.fn(this.onStateChange), this.send = testUtils.fn(this.send));
|
|
4075
|
+
}
|
|
4076
|
+
/** Create a mock universal store. This is just an alias for the constructor */
|
|
4077
|
+
static create(options, testUtils) {
|
|
4078
|
+
return new _MockUniversalStore(options, testUtils);
|
|
4079
|
+
}
|
|
4080
|
+
unsubscribeAll() {
|
|
4081
|
+
if (!this.testUtils)
|
|
4082
|
+
throw new Error(
|
|
4083
|
+
dedent8`Cannot call unsubscribeAll on a store that does not have testUtils.
|
|
4084
|
+
Please provide testUtils as the second argument when creating the store.`
|
|
4085
|
+
);
|
|
4086
|
+
let callReturnedUnsubscribeFn = (result) => {
|
|
4087
|
+
try {
|
|
4088
|
+
result.value();
|
|
4089
|
+
} catch {
|
|
4090
|
+
}
|
|
4091
|
+
};
|
|
4092
|
+
this.subscribe.mock?.results.forEach(callReturnedUnsubscribeFn), this.onStateChange.mock?.results.forEach(callReturnedUnsubscribeFn);
|
|
4093
|
+
}
|
|
4094
|
+
};
|
|
4095
|
+
export {
|
|
4096
|
+
ChangeDetectionFailureError,
|
|
4097
|
+
ChangeDetectionService,
|
|
4098
|
+
ChangeDetectionUnavailableError,
|
|
4099
|
+
MDX_SERVICE_ID,
|
|
4100
|
+
StoryIndexGenerator,
|
|
4101
|
+
Tag,
|
|
4102
|
+
analyzeMdx,
|
|
4103
|
+
analyzeTestResults,
|
|
4104
|
+
standalone_default as build,
|
|
4105
|
+
buildDevStandalone,
|
|
4106
|
+
buildIndex,
|
|
4107
|
+
buildIndexStandalone,
|
|
4108
|
+
buildStaticStandalone,
|
|
4109
|
+
createDocsToolset,
|
|
4110
|
+
createLocalDocsAccess,
|
|
4111
|
+
createManifestDocsAccess,
|
|
4112
|
+
createServiceDocsAccess,
|
|
4113
|
+
createStoriesToolset,
|
|
4114
|
+
createWorkerGatedStoryDocsProvider,
|
|
4115
|
+
describeService,
|
|
4116
|
+
emptyManifests,
|
|
4117
|
+
MockUniversalStore as experimental_MockUniversalStore,
|
|
4118
|
+
defineService as experimental_defineService,
|
|
4119
|
+
getChangeDetectionReadiness as experimental_getChangeDetectionReadiness,
|
|
4120
|
+
getStatusStoreByTypeId as experimental_getStatusStore,
|
|
4121
|
+
getTestProviderStoreById as experimental_getTestProviderStore,
|
|
4122
|
+
loadStorybook as experimental_loadStorybook,
|
|
4123
|
+
registerService as experimental_registerService,
|
|
4124
|
+
resetChangeDetectionReadiness as experimental_resetChangeDetectionReadiness,
|
|
4125
|
+
resetServicesPresetOnce as experimental_resetServicesPresetOnce,
|
|
4126
|
+
setChangeDetectionHost as experimental_setChangeDetectionHost,
|
|
4127
|
+
findStoryIds,
|
|
4128
|
+
getBuilders,
|
|
4129
|
+
getComponentCandidates,
|
|
4130
|
+
getEffectiveToolAvailability,
|
|
4131
|
+
getErrorLevel,
|
|
4132
|
+
getManifestStatus,
|
|
4133
|
+
getPreviewBodyTemplate,
|
|
4134
|
+
getPreviewHeadTemplate,
|
|
4135
|
+
getRefsFromConfig,
|
|
4136
|
+
getServerPort,
|
|
4137
|
+
getService,
|
|
4138
|
+
getStoriesPathsFromConfig,
|
|
4139
|
+
getToolAvailability,
|
|
4140
|
+
UniversalStore as internal_UniversalStore,
|
|
4141
|
+
fullStatusStore as internal_fullStatusStore,
|
|
4142
|
+
fullTestProviderStore as internal_fullTestProviderStore,
|
|
4143
|
+
universalStatusStore as internal_universalStatusStore,
|
|
4144
|
+
universalTestProviderStore as internal_universalTestProviderStore,
|
|
4145
|
+
isAddonA11yEnabled,
|
|
4146
|
+
isAddonVitestEnabled,
|
|
4147
|
+
isModuleGraphSupported,
|
|
4148
|
+
isValidHost,
|
|
4149
|
+
listServices,
|
|
4150
|
+
loadManifests,
|
|
4151
|
+
mapStaticDir,
|
|
4152
|
+
mdxManifestRef,
|
|
4153
|
+
mdxQueryStaticPath,
|
|
4154
|
+
mdxStaticStorePath,
|
|
4155
|
+
prepareHeadlessUniversalStores,
|
|
4156
|
+
registerToolset,
|
|
4157
|
+
resolveChangeDetectionAdapter,
|
|
4158
|
+
resolveSkillInputs,
|
|
4159
|
+
reviewToolset,
|
|
4160
|
+
runStoryTests,
|
|
4161
|
+
sendTelemetryError,
|
|
4162
|
+
storyInputArraySchema,
|
|
4163
|
+
toStoryTestResult,
|
|
4164
|
+
withTelemetry
|
|
4165
|
+
};
|