storybook 10.1.0-alpha.1 → 10.1.0-alpha.11
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/dist/_browser-chunks/Color-FTG7SQDA.js +1097 -0
- package/dist/_browser-chunks/WithTooltip-LMROHDUP.js +1651 -0
- package/dist/_browser-chunks/chunk-2FRVAXCZ.js +7 -0
- package/dist/_browser-chunks/chunk-3IAH5M2U.js +171 -0
- package/dist/_browser-chunks/chunk-3OXGAGBE.js +779 -0
- package/dist/_browser-chunks/{chunk-TMDZCWME.js → chunk-3PJE6VLG.js} +1 -3
- package/dist/_browser-chunks/{chunk-VAMFPZY3.js → chunk-45UGUKRX.js} +2 -7
- package/dist/_browser-chunks/chunk-6XWLIJQL.js +11 -0
- package/dist/_browser-chunks/{chunk-FDWKXLBI.js → chunk-74YHFU5B.js} +44 -109
- package/dist/_browser-chunks/{chunk-MM7DTO55.js → chunk-A242L54C.js} +10 -16
- package/dist/_browser-chunks/chunk-AIOS4NGK.js +252 -0
- package/dist/_browser-chunks/chunk-AS2HQEYC.js +14 -0
- package/dist/_browser-chunks/chunk-AXG2BOBL.js +836 -0
- package/dist/_browser-chunks/chunk-BE2DAXKJ.js +2966 -0
- package/dist/_browser-chunks/{chunk-MH6AXFXB.js → chunk-CHUV5WSW.js} +0 -5
- package/dist/_browser-chunks/chunk-EBHB6RPS.js +61 -0
- package/dist/_browser-chunks/chunk-EUVGDK4H.js +93 -0
- package/dist/_browser-chunks/chunk-EZSQOHRI.js +18 -0
- package/dist/_browser-chunks/{chunk-CADGRH3P.js → chunk-FNXWN6IK.js} +3 -8
- package/dist/_browser-chunks/chunk-GFLS4VP3.js +64 -0
- package/dist/_browser-chunks/{chunk-L2D73C6Z.js → chunk-H6XK3RSC.js} +13 -21
- package/dist/_browser-chunks/chunk-IPA5A322.js +71 -0
- package/dist/_browser-chunks/chunk-JP7NCOJX.js +37 -0
- package/dist/_browser-chunks/chunk-KJHJLCBK.js +11 -0
- package/dist/_browser-chunks/chunk-L4RMQ7D7.js +223 -0
- package/dist/_browser-chunks/{chunk-AB7OOPUX.js → chunk-QKODTO7K.js} +0 -5
- package/dist/_browser-chunks/chunk-RP5RXKFU.js +2491 -0
- package/dist/_browser-chunks/chunk-SL75JR6Y.js +9 -0
- package/dist/_browser-chunks/chunk-UD6FQLAF.js +1481 -0
- package/dist/_browser-chunks/chunk-VYJQ7RU5.js +2853 -0
- package/dist/_browser-chunks/chunk-WJYERY3R.js +136 -0
- package/dist/_browser-chunks/chunk-WXP2XJ3O.js +950 -0
- package/dist/_browser-chunks/chunk-X3DUQ5RA.js +47 -0
- package/dist/_browser-chunks/chunk-XJNX76GA.js +85 -0
- package/dist/_browser-chunks/{chunk-F4Q6SGTB.js → chunk-YKE5S47A.js} +177 -399
- package/dist/_browser-chunks/{chunk-SN4J4IQ3.js → chunk-ZUWEVLDX.js} +1 -7
- package/dist/_browser-chunks/{formatter-OMEEQ6HG.js → formatter-QJ4M4OGQ.js} +4 -9
- package/dist/_browser-chunks/{syntaxhighlighter-DK2ODWXH.js → syntaxhighlighter-WKBQ5RC7.js} +707 -1851
- package/dist/_node-chunks/{builder-manager-6UBDPV7P.js → builder-manager-PMPHOSM2.js} +495 -1013
- package/dist/_node-chunks/camelcase-K3IOOFQW.js +18 -0
- package/dist/_node-chunks/{chunk-QNUGJO6L.js → chunk-32NE3UE3.js} +15 -24
- package/dist/_node-chunks/chunk-4GZCFQFG.js +58 -0
- package/dist/_node-chunks/chunk-5QK5MSOI.js +943 -0
- package/dist/_node-chunks/{chunk-3FPF5Y2F.js → chunk-6ZOLETQK.js} +8 -10
- package/dist/_node-chunks/chunk-7I22Y76Z.js +1047 -0
- package/dist/_node-chunks/chunk-AKTRSR3O.js +72 -0
- package/dist/_node-chunks/chunk-BBOP3XCK.js +119 -0
- package/dist/_node-chunks/chunk-C2GQVDWI.js +34 -0
- package/dist/_node-chunks/{chunk-SCTKVDWR.js → chunk-GG2WQZSG.js} +4619 -7350
- package/dist/_node-chunks/chunk-GQJOWVVR.js +3214 -0
- package/dist/_node-chunks/chunk-JCRM2YVK.js +3009 -0
- package/dist/_node-chunks/chunk-KK4AT5F3.js +1029 -0
- package/dist/_node-chunks/chunk-L7MYXJUM.js +1114 -0
- package/dist/_node-chunks/{chunk-LAU7VVPC.js → chunk-LCZO45L7.js} +469 -983
- package/dist/_node-chunks/chunk-LR3QITDI.js +209 -0
- package/dist/_node-chunks/chunk-LXG4DK35.js +3171 -0
- package/dist/_node-chunks/chunk-MJ3WOS6F.js +37 -0
- package/dist/_node-chunks/chunk-PHOZWZZO.js +61 -0
- package/dist/_node-chunks/chunk-QECOQWRJ.js +936 -0
- package/dist/_node-chunks/chunk-QH4V5YDB.js +20 -0
- package/dist/_node-chunks/chunk-R6HWGZWD.js +26 -0
- package/dist/_node-chunks/chunk-SPQXMU2Q.js +759 -0
- package/dist/_node-chunks/chunk-TXZY6V6O.js +1564 -0
- package/dist/_node-chunks/chunk-UGDPX5LE.js +756 -0
- package/dist/_node-chunks/chunk-UY26MQLT.js +603 -0
- package/dist/_node-chunks/chunk-WK3EMYK6.js +61 -0
- package/dist/_node-chunks/{chunk-CJHAP7SE.js → chunk-WLHMN7AP.js} +292 -688
- package/dist/_node-chunks/chunk-XGVLB4UJ.js +54 -0
- package/dist/_node-chunks/{chunk-J7N7PD5Q.js → chunk-YHRFI6BE.js} +87 -227
- package/dist/_node-chunks/chunk-YK4KVMFW.js +18 -0
- package/dist/_node-chunks/chunk-ZZALGOA6.js +4523 -0
- package/dist/_node-chunks/chunk-ZZPBSYA5.js +301 -0
- package/dist/_node-chunks/chunk-ZZSRFAC6.js +45571 -0
- package/dist/_node-chunks/dist-4DWOCZUD.js +121 -0
- package/dist/_node-chunks/globby-AAARUKEU.js +3452 -0
- package/dist/_node-chunks/lib-HEUKGL62.js +366 -0
- package/dist/_node-chunks/mdx-N42X6CFJ-DCVRPS6N.js +14329 -0
- package/dist/_node-chunks/p-limit-F5ZKJ6WZ.js +116 -0
- package/dist/_node-chunks/plugin-7YY7JXCH.js +123 -0
- package/dist/_node-chunks/{plugin-HJLCLGNT.js → plugin-SZP3CW6W.js} +36 -56
- package/dist/_node-chunks/webpack-inject-mocker-runtime-plugin-TGKNDPO6.js +46623 -0
- package/dist/_node-chunks/webpack-mock-plugin-LNTZZFBE.js +92 -0
- package/dist/actions/decorator.js +21 -42
- package/dist/actions/index.js +3 -3
- package/dist/babel/index.d.ts +671 -335
- package/dist/babel/index.js +11 -11
- package/dist/bin/core.js +592 -1546
- package/dist/bin/dispatcher.js +26 -37
- package/dist/bin/loader.js +23 -34
- package/dist/channels/index.js +98 -234
- package/dist/cli/index.js +1966 -5347
- package/dist/client-logger/index.js +31 -61
- package/dist/common/index.d.ts +210 -3
- package/dist/common/index.js +28 -20
- package/dist/components/index.d.ts +472 -280
- package/dist/components/index.js +15992 -75
- package/dist/core-events/index.js +2 -66
- package/dist/core-server/index.js +3837 -7191
- package/dist/core-server/presets/common-manager.css +2 -2
- package/dist/core-server/presets/common-manager.js +2511 -5219
- package/dist/core-server/presets/common-override-preset.js +31 -60
- package/dist/core-server/presets/common-preset.js +434 -924
- package/dist/core-server/presets/webpack/loaders/storybook-mock-transform-loader.js +15 -19
- package/dist/core-server/presets/webpack/loaders/webpack-automock-loader.js +12 -17
- package/dist/csf/index.js +534 -1172
- package/dist/csf-tools/index.d.ts +15 -4
- package/dist/csf-tools/index.js +9 -9
- package/dist/docs-tools/index.js +6 -6
- package/dist/highlight/index.js +2 -2
- package/dist/instrumenter/index.js +199 -415
- package/dist/manager/globals-runtime.js +47968 -56484
- package/dist/manager/globals.js +2 -3
- package/dist/manager/runtime.js +4901 -10318
- package/dist/manager-api/index.d.ts +11 -3
- package/dist/manager-api/index.js +1250 -2397
- package/dist/manager-errors.d.ts +3 -0
- package/dist/manager-errors.js +3 -3
- package/dist/node-logger/index.d.ts +1 -1
- package/dist/node-logger/index.js +1270 -2593
- package/dist/preview/globals.js +2 -3
- package/dist/preview/runtime.js +10767 -22386
- package/dist/preview-api/index.d.ts +67 -68
- package/dist/preview-api/index.js +15 -15
- package/dist/preview-errors.d.ts +3 -0
- package/dist/preview-errors.js +4 -4
- package/dist/router/index.js +347 -899
- package/dist/server-errors.d.ts +3 -0
- package/dist/server-errors.js +10 -10
- package/dist/telemetry/index.js +24 -24
- package/dist/test/index.js +6129 -11914
- package/dist/theming/create.d.ts +4 -2
- package/dist/theming/create.js +4 -4
- package/dist/theming/index.d.ts +3397 -2628
- package/dist/theming/index.js +502 -1091
- package/dist/types/index.d.ts +50 -5
- package/dist/types/index.js +2 -11
- package/dist/viewport/index.js +3 -3
- package/package.json +17 -9
- package/dist/_browser-chunks/Color-7ZNS6F6B.js +0 -1676
- package/dist/_browser-chunks/WithTooltip-SK46ZJ2J.js +0 -13
- package/dist/_browser-chunks/chunk-6A7OIVEL.js +0 -66
- package/dist/_browser-chunks/chunk-B4A3ADP3.js +0 -3816
- package/dist/_browser-chunks/chunk-BOOOPFZF.js +0 -2335
- package/dist/_browser-chunks/chunk-C4XOKMDU.js +0 -270
- package/dist/_browser-chunks/chunk-FSBVR7H5.js +0 -106
- package/dist/_browser-chunks/chunk-FUOHXXZT.js +0 -23
- package/dist/_browser-chunks/chunk-GTKOCWCT.js +0 -17
- package/dist/_browser-chunks/chunk-HHW4FUMO.js +0 -12
- package/dist/_browser-chunks/chunk-I74EUU5O.js +0 -5809
- package/dist/_browser-chunks/chunk-JVSKG4YS.js +0 -4052
- package/dist/_browser-chunks/chunk-LASUB7TL.js +0 -76
- package/dist/_browser-chunks/chunk-LYCSRYYR.js +0 -101
- package/dist/_browser-chunks/chunk-NVV6MIOE.js +0 -243
- package/dist/_browser-chunks/chunk-OBXWFEPB.js +0 -852
- package/dist/_browser-chunks/chunk-OPCDBBL3.js +0 -48
- package/dist/_browser-chunks/chunk-PB6FZ3WE.js +0 -130
- package/dist/_browser-chunks/chunk-RNE2IUTB.js +0 -1300
- package/dist/_browser-chunks/chunk-SYS437NN.js +0 -122
- package/dist/_browser-chunks/chunk-U46RQHA4.js +0 -12
- package/dist/_browser-chunks/chunk-UTNZYD2N.js +0 -311
- package/dist/_browser-chunks/chunk-VUAFL5XK.js +0 -20
- package/dist/_browser-chunks/chunk-W4QKLQSC.js +0 -4182
- package/dist/_browser-chunks/chunk-XDGMHOV7.js +0 -2197
- package/dist/_browser-chunks/chunk-XW6KSYKF.js +0 -16
- package/dist/_browser-chunks/chunk-Y3M7TW6K.js +0 -1041
- package/dist/_browser-chunks/chunk-ZNRFDIVA.js +0 -233
- package/dist/_node-chunks/camelcase-WKJOVNPM.js +0 -18
- package/dist/_node-chunks/chunk-2RIKHYCS.js +0 -304
- package/dist/_node-chunks/chunk-3JCSHYSU.js +0 -1657
- package/dist/_node-chunks/chunk-4GE6Q4MX.js +0 -1531
- package/dist/_node-chunks/chunk-5SEHHENC.js +0 -64656
- package/dist/_node-chunks/chunk-6GD23U64.js +0 -420
- package/dist/_node-chunks/chunk-6OAXYS5T.js +0 -1544
- package/dist/_node-chunks/chunk-7TNUMFKR.js +0 -4741
- package/dist/_node-chunks/chunk-BCDHUXAJ.js +0 -4272
- package/dist/_node-chunks/chunk-BYVQZ2HU.js +0 -220
- package/dist/_node-chunks/chunk-DAMVKHAC.js +0 -101
- package/dist/_node-chunks/chunk-FEOC7OX2.js +0 -1586
- package/dist/_node-chunks/chunk-FY7XZPLY.js +0 -2248
- package/dist/_node-chunks/chunk-GD2FXWDF.js +0 -697
- package/dist/_node-chunks/chunk-HM6B7FE5.js +0 -18
- package/dist/_node-chunks/chunk-HORWITP7.js +0 -90
- package/dist/_node-chunks/chunk-II4AFH3V.js +0 -28
- package/dist/_node-chunks/chunk-MF2PUEWG.js +0 -5029
- package/dist/_node-chunks/chunk-RVE4UTVQ.js +0 -1518
- package/dist/_node-chunks/chunk-TUFWZUTO.js +0 -69
- package/dist/_node-chunks/chunk-TXHNWNH4.js +0 -79
- package/dist/_node-chunks/chunk-ULWNTI6M.js +0 -1198
- package/dist/_node-chunks/chunk-VYRFXLRO.js +0 -6712
- package/dist/_node-chunks/chunk-WNOSTIYP.js +0 -34
- package/dist/_node-chunks/chunk-X67VGZN4.js +0 -1250
- package/dist/_node-chunks/chunk-XCEBYOA4.js +0 -61
- package/dist/_node-chunks/chunk-XW7YMR7I.js +0 -111
- package/dist/_node-chunks/chunk-ZRFYQ46H.js +0 -61
- package/dist/_node-chunks/dist-APCKHSY3.js +0 -175
- package/dist/_node-chunks/globby-TSGXGDA2.js +0 -5222
- package/dist/_node-chunks/lib-DZ5TVIU5.js +0 -518
- package/dist/_node-chunks/mdx-N42X6CFJ-Z6BYQCPN.js +0 -22017
- package/dist/_node-chunks/p-limit-MLJNGG2K.js +0 -168
- package/dist/_node-chunks/plugin-J3JI3ZKJ.js +0 -159
- package/dist/_node-chunks/webpack-inject-mocker-runtime-plugin-3QHNTM5B.js +0 -69102
- package/dist/_node-chunks/webpack-mock-plugin-4Y3MWPJ6.js +0 -124
|
@@ -0,0 +1,1029 @@
|
|
|
1
|
+
import CJS_COMPAT_NODE_URL_843v2rliy1 from 'node:url';
|
|
2
|
+
import CJS_COMPAT_NODE_PATH_843v2rliy1 from 'node:path';
|
|
3
|
+
import CJS_COMPAT_NODE_MODULE_843v2rliy1 from "node:module";
|
|
4
|
+
|
|
5
|
+
var __filename = CJS_COMPAT_NODE_URL_843v2rliy1.fileURLToPath(import.meta.url);
|
|
6
|
+
var __dirname = CJS_COMPAT_NODE_PATH_843v2rliy1.dirname(__filename);
|
|
7
|
+
var require = CJS_COMPAT_NODE_MODULE_843v2rliy1.createRequire(import.meta.url);
|
|
8
|
+
|
|
9
|
+
// ------------------------------------------------------------
|
|
10
|
+
// end of CJS compatibility banner, injected by Storybook's esbuild configuration
|
|
11
|
+
// ------------------------------------------------------------
|
|
12
|
+
import {
|
|
13
|
+
any,
|
|
14
|
+
up2 as up
|
|
15
|
+
} from "./chunk-4GZCFQFG.js";
|
|
16
|
+
import {
|
|
17
|
+
invariant
|
|
18
|
+
} from "./chunk-R6HWGZWD.js";
|
|
19
|
+
import {
|
|
20
|
+
resolvePackageDir
|
|
21
|
+
} from "./chunk-SPQXMU2Q.js";
|
|
22
|
+
import {
|
|
23
|
+
require_prompts
|
|
24
|
+
} from "./chunk-GQJOWVVR.js";
|
|
25
|
+
import {
|
|
26
|
+
require_picocolors
|
|
27
|
+
} from "./chunk-32NE3UE3.js";
|
|
28
|
+
import {
|
|
29
|
+
__toESM
|
|
30
|
+
} from "./chunk-XGVLB4UJ.js";
|
|
31
|
+
|
|
32
|
+
// src/cli/project_types.ts
|
|
33
|
+
import { minVersion, validRange } from "semver";
|
|
34
|
+
function eqMajor(versionRange, major) {
|
|
35
|
+
return validRange(versionRange) ? minVersion(versionRange)?.major === major : !1;
|
|
36
|
+
}
|
|
37
|
+
var externalFrameworks = [
|
|
38
|
+
{ name: "qwik", packageName: "storybook-framework-qwik" },
|
|
39
|
+
{
|
|
40
|
+
name: "solid",
|
|
41
|
+
packageName: "storybook-solidjs-vite",
|
|
42
|
+
frameworks: ["storybook-solidjs-vite"],
|
|
43
|
+
renderer: "storybook-solidjs-vite"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: "nuxt",
|
|
47
|
+
packageName: "@storybook-vue/nuxt",
|
|
48
|
+
frameworks: ["@storybook-vue/nuxt"],
|
|
49
|
+
renderer: "@storybook/vue3"
|
|
50
|
+
}
|
|
51
|
+
], SUPPORTED_RENDERERS = [
|
|
52
|
+
"react",
|
|
53
|
+
"react-native",
|
|
54
|
+
"vue3",
|
|
55
|
+
"angular",
|
|
56
|
+
"ember",
|
|
57
|
+
"preact",
|
|
58
|
+
"svelte",
|
|
59
|
+
"qwik",
|
|
60
|
+
"solid"
|
|
61
|
+
], ProjectType = /* @__PURE__ */ ((ProjectType2) => (ProjectType2.UNDETECTED = "UNDETECTED", ProjectType2.UNSUPPORTED = "UNSUPPORTED", ProjectType2.REACT = "REACT", ProjectType2.REACT_SCRIPTS = "REACT_SCRIPTS", ProjectType2.REACT_NATIVE = "REACT_NATIVE", ProjectType2.REACT_NATIVE_WEB = "REACT_NATIVE_WEB", ProjectType2.REACT_NATIVE_AND_RNW = "REACT_NATIVE_AND_RNW", ProjectType2.REACT_PROJECT = "REACT_PROJECT", ProjectType2.WEBPACK_REACT = "WEBPACK_REACT", ProjectType2.NEXTJS = "NEXTJS", ProjectType2.VUE3 = "VUE3", ProjectType2.NUXT = "NUXT", ProjectType2.ANGULAR = "ANGULAR", ProjectType2.EMBER = "EMBER", ProjectType2.WEB_COMPONENTS = "WEB_COMPONENTS", ProjectType2.HTML = "HTML", ProjectType2.QWIK = "QWIK", ProjectType2.PREACT = "PREACT", ProjectType2.SVELTE = "SVELTE", ProjectType2.SVELTEKIT = "SVELTEKIT", ProjectType2.SERVER = "SERVER", ProjectType2.NX = "NX", ProjectType2.SOLID = "SOLID", ProjectType2))(ProjectType || {}), CoreBuilder = /* @__PURE__ */ ((CoreBuilder2) => (CoreBuilder2.Webpack5 = "webpack5", CoreBuilder2.Vite = "vite", CoreBuilder2))(CoreBuilder || {}), CoreWebpackCompilers = /* @__PURE__ */ ((CoreWebpackCompilers2) => (CoreWebpackCompilers2.Babel = "babel", CoreWebpackCompilers2.SWC = "swc", CoreWebpackCompilers2))(CoreWebpackCompilers || {}), CommunityBuilder = /* @__PURE__ */ ((CommunityBuilder2) => (CommunityBuilder2.Rsbuild = "rsbuild", CommunityBuilder2))(CommunityBuilder || {}), compilerNameToCoreCompiler = {
|
|
62
|
+
"@storybook/addon-webpack5-compiler-babel": "babel" /* Babel */,
|
|
63
|
+
"@storybook/addon-webpack5-compiler-swc": "swc" /* SWC */
|
|
64
|
+
}, builderNameToCoreBuilder = {
|
|
65
|
+
"@storybook/builder-webpack5": "webpack5" /* Webpack5 */,
|
|
66
|
+
"@storybook/builder-vite": "vite" /* Vite */
|
|
67
|
+
}, SupportedLanguage = /* @__PURE__ */ ((SupportedLanguage2) => (SupportedLanguage2.JAVASCRIPT = "javascript", SupportedLanguage2.TYPESCRIPT = "typescript", SupportedLanguage2))(SupportedLanguage || {}), supportedTemplates = [
|
|
68
|
+
{
|
|
69
|
+
preset: "NUXT" /* NUXT */,
|
|
70
|
+
dependencies: ["nuxt"],
|
|
71
|
+
matcherFunction: ({ dependencies }) => dependencies?.every(Boolean) ?? !0
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
preset: "VUE3" /* VUE3 */,
|
|
75
|
+
dependencies: {
|
|
76
|
+
// This Vue template works with Vue 3
|
|
77
|
+
vue: (versionRange) => versionRange === "next" || eqMajor(versionRange, 3)
|
|
78
|
+
},
|
|
79
|
+
matcherFunction: ({ dependencies }) => dependencies?.some(Boolean) ?? !1
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
preset: "EMBER" /* EMBER */,
|
|
83
|
+
dependencies: ["ember-cli"],
|
|
84
|
+
matcherFunction: ({ dependencies }) => dependencies?.every(Boolean) ?? !0
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
preset: "NEXTJS" /* NEXTJS */,
|
|
88
|
+
dependencies: ["next"],
|
|
89
|
+
matcherFunction: ({ dependencies }) => dependencies?.every(Boolean) ?? !0
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
preset: "QWIK" /* QWIK */,
|
|
93
|
+
dependencies: ["@builder.io/qwik"],
|
|
94
|
+
matcherFunction: ({ dependencies }) => dependencies?.every(Boolean) ?? !0
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
preset: "REACT_PROJECT" /* REACT_PROJECT */,
|
|
98
|
+
peerDependencies: ["react"],
|
|
99
|
+
matcherFunction: ({ peerDependencies }) => peerDependencies?.every(Boolean) ?? !0
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
preset: "REACT_NATIVE" /* REACT_NATIVE */,
|
|
103
|
+
dependencies: ["react-native", "react-native-scripts"],
|
|
104
|
+
matcherFunction: ({ dependencies }) => dependencies?.some(Boolean) ?? !1
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
preset: "REACT_SCRIPTS" /* REACT_SCRIPTS */,
|
|
108
|
+
// For projects using a custom/forked `react-scripts` package.
|
|
109
|
+
files: ["/node_modules/.bin/react-scripts"],
|
|
110
|
+
// For standard CRA projects
|
|
111
|
+
dependencies: ["react-scripts"],
|
|
112
|
+
matcherFunction: ({ dependencies, files }) => (dependencies?.every(Boolean) || files?.every(Boolean)) ?? !1
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
preset: "ANGULAR" /* ANGULAR */,
|
|
116
|
+
dependencies: ["@angular/core"],
|
|
117
|
+
matcherFunction: ({ dependencies }) => dependencies?.every(Boolean) ?? !0
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
preset: "WEB_COMPONENTS" /* WEB_COMPONENTS */,
|
|
121
|
+
dependencies: ["lit-element", "lit-html", "lit"],
|
|
122
|
+
matcherFunction: ({ dependencies }) => dependencies?.some(Boolean) ?? !1
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
preset: "PREACT" /* PREACT */,
|
|
126
|
+
dependencies: ["preact"],
|
|
127
|
+
matcherFunction: ({ dependencies }) => dependencies?.every(Boolean) ?? !0
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
// TODO: This only works because it is before the SVELTE template. could be more explicit
|
|
131
|
+
preset: "SVELTEKIT" /* SVELTEKIT */,
|
|
132
|
+
dependencies: ["@sveltejs/kit"],
|
|
133
|
+
matcherFunction: ({ dependencies }) => dependencies?.every(Boolean) ?? !0
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
preset: "SVELTE" /* SVELTE */,
|
|
137
|
+
dependencies: ["svelte"],
|
|
138
|
+
matcherFunction: ({ dependencies }) => dependencies?.every(Boolean) ?? !0
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
preset: "SOLID" /* SOLID */,
|
|
142
|
+
dependencies: ["solid-js"],
|
|
143
|
+
matcherFunction: ({ dependencies }) => dependencies?.every(Boolean) ?? !0
|
|
144
|
+
},
|
|
145
|
+
// DO NOT MOVE ANY TEMPLATES BELOW THIS LINE
|
|
146
|
+
// React is part of every Template, after Storybook is initialized once
|
|
147
|
+
{
|
|
148
|
+
preset: "WEBPACK_REACT" /* WEBPACK_REACT */,
|
|
149
|
+
dependencies: ["react", "webpack"],
|
|
150
|
+
matcherFunction: ({ dependencies }) => dependencies?.every(Boolean) ?? !0
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
preset: "REACT" /* REACT */,
|
|
154
|
+
dependencies: ["react"],
|
|
155
|
+
matcherFunction: ({ dependencies }) => dependencies?.every(Boolean) ?? !0
|
|
156
|
+
}
|
|
157
|
+
], unsupportedTemplate = {
|
|
158
|
+
preset: "UNSUPPORTED" /* UNSUPPORTED */,
|
|
159
|
+
dependencies: {},
|
|
160
|
+
matcherFunction: ({ dependencies }) => dependencies?.some(Boolean) ?? !1
|
|
161
|
+
}, notInstallableProjectTypes = [
|
|
162
|
+
"UNDETECTED" /* UNDETECTED */,
|
|
163
|
+
"UNSUPPORTED" /* UNSUPPORTED */,
|
|
164
|
+
"NX" /* NX */
|
|
165
|
+
], installableProjectTypes = Object.values(ProjectType).filter((type) => !notInstallableProjectTypes.includes(type)).map((type) => type.toLowerCase());
|
|
166
|
+
|
|
167
|
+
// src/cli/dirs.ts
|
|
168
|
+
import { join as join2 } from "node:path";
|
|
169
|
+
import { Readable as Readable2 } from "node:stream";
|
|
170
|
+
import { pipeline as pipeline2 } from "node:stream/promises";
|
|
171
|
+
import { createGunzip } from "node:zlib";
|
|
172
|
+
import { temporaryDirectory, versions } from "storybook/internal/common";
|
|
173
|
+
|
|
174
|
+
// ../node_modules/get-npm-tarball-url/lib/index.mjs
|
|
175
|
+
function src_default(pkgName, pkgVersion, opts) {
|
|
176
|
+
let registry;
|
|
177
|
+
opts?.registry ? registry = opts.registry.endsWith("/") ? opts.registry : `${opts.registry}/` : registry = "https://registry.npmjs.org/";
|
|
178
|
+
let scopelessName = getScopelessName(pkgName);
|
|
179
|
+
return `${registry}${pkgName}/-/${scopelessName}-${removeBuildMetadataFromVersion(pkgVersion)}.tgz`;
|
|
180
|
+
}
|
|
181
|
+
function removeBuildMetadataFromVersion(version) {
|
|
182
|
+
let plusPos = version.indexOf("+");
|
|
183
|
+
return plusPos === -1 ? version : version.substring(0, plusPos);
|
|
184
|
+
}
|
|
185
|
+
function getScopelessName(name) {
|
|
186
|
+
return name[0] !== "@" ? name : name.split("/")[1];
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// ../node_modules/modern-tar/dist/unpacker-BKKRRs7i.js
|
|
190
|
+
var FLAGTYPE = {
|
|
191
|
+
0: "file",
|
|
192
|
+
1: "link",
|
|
193
|
+
2: "symlink",
|
|
194
|
+
3: "character-device",
|
|
195
|
+
4: "block-device",
|
|
196
|
+
5: "directory",
|
|
197
|
+
6: "fifo",
|
|
198
|
+
x: "pax-header",
|
|
199
|
+
g: "pax-global-header",
|
|
200
|
+
L: "gnu-long-name",
|
|
201
|
+
K: "gnu-long-link-name"
|
|
202
|
+
}, ZERO_BLOCK = new Uint8Array(512), encoder = new TextEncoder(), decoder = new TextDecoder();
|
|
203
|
+
function readString(view, offset, size) {
|
|
204
|
+
let end = view.indexOf(0, offset), sliceEnd = end === -1 || end > offset + size ? offset + size : end;
|
|
205
|
+
return decoder.decode(view.subarray(offset, sliceEnd));
|
|
206
|
+
}
|
|
207
|
+
function readOctal(view, offset, size) {
|
|
208
|
+
let value = 0, end = offset + size;
|
|
209
|
+
for (let i = offset; i < end; i++) {
|
|
210
|
+
let charCode = view[i];
|
|
211
|
+
if (charCode === 0) break;
|
|
212
|
+
charCode !== 32 && (value = (value << 3) + (charCode - 48));
|
|
213
|
+
}
|
|
214
|
+
return value;
|
|
215
|
+
}
|
|
216
|
+
function readNumeric(view, offset, size) {
|
|
217
|
+
if (view[offset] & 128) {
|
|
218
|
+
let result = 0;
|
|
219
|
+
result = view[offset] & 127;
|
|
220
|
+
for (let i = 1; i < size; i++) result = result * 256 + view[offset + i];
|
|
221
|
+
if (!Number.isSafeInteger(result)) throw new Error("TAR number too large");
|
|
222
|
+
return result;
|
|
223
|
+
}
|
|
224
|
+
return readOctal(view, offset, size);
|
|
225
|
+
}
|
|
226
|
+
var CHECKSUM_SPACE = 32;
|
|
227
|
+
function validateChecksum(block) {
|
|
228
|
+
let stored = readOctal(block, 148, 8), sum = 0;
|
|
229
|
+
for (let i = 0; i < block.length; i++) i >= 148 && i < 156 ? sum += CHECKSUM_SPACE : sum += block[i];
|
|
230
|
+
return stored === sum;
|
|
231
|
+
}
|
|
232
|
+
function parseUstarHeader(block, strict) {
|
|
233
|
+
if (strict && !validateChecksum(block)) throw new Error("Invalid tar header checksum.");
|
|
234
|
+
let typeflag = readString(block, 156, 1), header = {
|
|
235
|
+
name: readString(block, 0, 100),
|
|
236
|
+
mode: readOctal(block, 100, 8),
|
|
237
|
+
uid: readNumeric(block, 108, 8),
|
|
238
|
+
gid: readNumeric(block, 116, 8),
|
|
239
|
+
size: readNumeric(block, 124, 12),
|
|
240
|
+
mtime: new Date(readNumeric(block, 136, 12) * 1e3),
|
|
241
|
+
type: FLAGTYPE[typeflag] || "file",
|
|
242
|
+
linkname: readString(block, 157, 100)
|
|
243
|
+
}, magic = readString(block, 257, 6);
|
|
244
|
+
return magic.trim() === "ustar" && (header.uname = readString(block, 265, 32), header.gname = readString(block, 297, 32)), magic === "ustar" && (header.prefix = readString(block, 345, 155)), header;
|
|
245
|
+
}
|
|
246
|
+
var PAX_MAPPING = {
|
|
247
|
+
path: ["name", (v) => v],
|
|
248
|
+
linkpath: ["linkname", (v) => v],
|
|
249
|
+
size: ["size", (v) => parseInt(v, 10)],
|
|
250
|
+
mtime: ["mtime", parseFloat],
|
|
251
|
+
uid: ["uid", (v) => parseInt(v, 10)],
|
|
252
|
+
gid: ["gid", (v) => parseInt(v, 10)],
|
|
253
|
+
uname: ["uname", (v) => v],
|
|
254
|
+
gname: ["gname", (v) => v]
|
|
255
|
+
};
|
|
256
|
+
function parsePax(buffer) {
|
|
257
|
+
let decoder$1 = new TextDecoder("utf-8"), overrides = {}, pax = {}, offset = 0;
|
|
258
|
+
for (; offset < buffer.length; ) {
|
|
259
|
+
let spaceIndex = buffer.indexOf(32, offset);
|
|
260
|
+
if (spaceIndex === -1) break;
|
|
261
|
+
let length = parseInt(decoder$1.decode(buffer.subarray(offset, spaceIndex)), 10);
|
|
262
|
+
if (Number.isNaN(length) || length === 0) break;
|
|
263
|
+
let recordEnd = offset + length, [key, value] = decoder$1.decode(buffer.subarray(spaceIndex + 1, recordEnd - 1)).split("=", 2);
|
|
264
|
+
if (key && value !== void 0) {
|
|
265
|
+
pax[key] = value;
|
|
266
|
+
let mapping = PAX_MAPPING[key];
|
|
267
|
+
if (mapping) {
|
|
268
|
+
let [targetKey, parser] = mapping, parsedValue = parser(value);
|
|
269
|
+
(typeof parsedValue == "string" || !Number.isNaN(parsedValue)) && (overrides[targetKey] = parsedValue);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
offset = recordEnd;
|
|
273
|
+
}
|
|
274
|
+
return Object.keys(pax).length > 0 && (overrides.pax = pax), overrides;
|
|
275
|
+
}
|
|
276
|
+
function applyOverrides(header, overrides) {
|
|
277
|
+
overrides.name !== void 0 && (header.name = overrides.name), overrides.linkname !== void 0 && (header.linkname = overrides.linkname), overrides.size !== void 0 && (header.size = overrides.size), overrides.mtime !== void 0 && (header.mtime = new Date(overrides.mtime * 1e3)), overrides.uid !== void 0 && (header.uid = overrides.uid), overrides.gid !== void 0 && (header.gid = overrides.gid), overrides.uname !== void 0 && (header.uname = overrides.uname), overrides.gname !== void 0 && (header.gname = overrides.gname), overrides.pax && (header.pax = Object.assign({}, header.pax ?? {}, overrides.pax));
|
|
278
|
+
}
|
|
279
|
+
function getMetaParser(type) {
|
|
280
|
+
switch (type) {
|
|
281
|
+
case "pax-global-header":
|
|
282
|
+
case "pax-header":
|
|
283
|
+
return parsePax;
|
|
284
|
+
case "gnu-long-name":
|
|
285
|
+
return (data) => ({ name: readString(data, 0, data.length) });
|
|
286
|
+
case "gnu-long-link-name":
|
|
287
|
+
return (data) => ({ linkname: readString(data, 0, data.length) });
|
|
288
|
+
default:
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
var EOF_BUFFER = new Uint8Array(512 * 2);
|
|
293
|
+
function transformHeader(header, options) {
|
|
294
|
+
let { strip, filter, map } = options;
|
|
295
|
+
if (!strip && !filter && !map) return header;
|
|
296
|
+
let h = { ...header };
|
|
297
|
+
if (strip && strip > 0) {
|
|
298
|
+
let components = h.name.split("/").filter(Boolean);
|
|
299
|
+
if (strip >= components.length) return null;
|
|
300
|
+
let newName = components.slice(strip).join("/");
|
|
301
|
+
if (h.name = h.type === "directory" && !newName.endsWith("/") ? `${newName}/` : newName, h.linkname?.startsWith("/")) {
|
|
302
|
+
let linkComponents = h.linkname.split("/").filter(Boolean);
|
|
303
|
+
h.linkname = strip >= linkComponents.length ? "/" : `/${linkComponents.slice(strip).join("/")}`;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (filter?.(h) === !1) return null;
|
|
307
|
+
let result = map ? map(h) : h;
|
|
308
|
+
return result && (!result.name || !result.name.trim() || result.name === "." || result.name === "/") ? null : result;
|
|
309
|
+
}
|
|
310
|
+
var STATE_HEADER = 0, STATE_BODY = 1, STATE_PADDING = 2, STATE_AWAIT_EOF = 3;
|
|
311
|
+
function createTarUnpacker(handler, options = {}) {
|
|
312
|
+
let strict = options.strict ?? !1, chunkQueue = [], totalAvailable = 0, state = STATE_HEADER, waitingForData = !1, currentEntry = null, paxGlobals = {}, nextEntryOverrides = {};
|
|
313
|
+
function consume(size, callback) {
|
|
314
|
+
let remaining = Math.min(size, totalAvailable), initialRemaining = remaining;
|
|
315
|
+
for (; remaining > 0 && chunkQueue.length > 0; ) {
|
|
316
|
+
let chunkNode = chunkQueue[0], available = chunkNode.data.length - chunkNode.consumed, toProcess = Math.min(remaining, available);
|
|
317
|
+
callback && callback(chunkNode.data.subarray(chunkNode.consumed, chunkNode.consumed + toProcess)), chunkNode.consumed += toProcess, remaining -= toProcess, chunkNode.consumed >= chunkNode.data.length && chunkQueue.shift();
|
|
318
|
+
}
|
|
319
|
+
return totalAvailable -= initialRemaining - remaining, initialRemaining - remaining;
|
|
320
|
+
}
|
|
321
|
+
function read(size) {
|
|
322
|
+
let toRead = Math.min(size, totalAvailable);
|
|
323
|
+
if (toRead === 0) return null;
|
|
324
|
+
let chunk = chunkQueue[0];
|
|
325
|
+
if (chunk && chunk.data.length - chunk.consumed >= toRead) {
|
|
326
|
+
let result$1 = chunk.data.subarray(chunk.consumed, chunk.consumed + toRead);
|
|
327
|
+
return chunk.consumed += toRead, totalAvailable -= toRead, chunk.consumed >= chunk.data.length && chunkQueue.shift(), result$1;
|
|
328
|
+
}
|
|
329
|
+
let result = new Uint8Array(toRead), offset = 0;
|
|
330
|
+
return consume(toRead, (data) => {
|
|
331
|
+
result.set(data, offset), offset += data.length;
|
|
332
|
+
}), result;
|
|
333
|
+
}
|
|
334
|
+
function process2() {
|
|
335
|
+
for (; ; ) switch (state) {
|
|
336
|
+
case STATE_HEADER: {
|
|
337
|
+
if (totalAvailable < 512) {
|
|
338
|
+
waitingForData = !0;
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
let headerBlock = read(512);
|
|
342
|
+
if (!headerBlock) {
|
|
343
|
+
waitingForData = !0;
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
if (isZeroBlock(headerBlock)) {
|
|
347
|
+
state = STATE_AWAIT_EOF;
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
waitingForData = !1;
|
|
351
|
+
try {
|
|
352
|
+
let internalHeader = parseUstarHeader(headerBlock, strict), header = {
|
|
353
|
+
...internalHeader,
|
|
354
|
+
name: internalHeader.name
|
|
355
|
+
}, metaParser = getMetaParser(header.type);
|
|
356
|
+
if (metaParser) {
|
|
357
|
+
let paddedSize = header.size + 511 & -512;
|
|
358
|
+
if (totalAvailable < paddedSize) {
|
|
359
|
+
waitingForData = !0, chunkQueue.unshift({
|
|
360
|
+
data: headerBlock,
|
|
361
|
+
consumed: 0
|
|
362
|
+
}), totalAvailable += 512;
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
let metaBlock = read(paddedSize);
|
|
366
|
+
if (!metaBlock) {
|
|
367
|
+
waitingForData = !0;
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
let overrides = metaParser(metaBlock.subarray(0, header.size));
|
|
371
|
+
header.type === "pax-global-header" ? Object.assign(paxGlobals, overrides) : Object.assign(nextEntryOverrides, overrides);
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
internalHeader.prefix && (header.name = `${internalHeader.prefix}/${header.name}`), applyOverrides(header, paxGlobals), applyOverrides(header, nextEntryOverrides), nextEntryOverrides = {}, handler.onHeader(header), header.size > 0 ? (currentEntry = {
|
|
375
|
+
remaining: header.size,
|
|
376
|
+
padding: -header.size & 511
|
|
377
|
+
}, state = STATE_BODY) : handler.onEndEntry();
|
|
378
|
+
} catch (error) {
|
|
379
|
+
handler.onError(error);
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
case STATE_BODY: {
|
|
385
|
+
if (!currentEntry) throw new Error("No current entry for body");
|
|
386
|
+
let toForward = Math.min(currentEntry.remaining, totalAvailable);
|
|
387
|
+
if (toForward > 0) {
|
|
388
|
+
let consumed = consume(toForward, handler.onData);
|
|
389
|
+
currentEntry.remaining -= consumed;
|
|
390
|
+
}
|
|
391
|
+
if (currentEntry.remaining === 0)
|
|
392
|
+
state = currentEntry.padding > 0 ? STATE_PADDING : STATE_HEADER, state === STATE_HEADER && (handler.onEndEntry(), currentEntry = null);
|
|
393
|
+
else if (totalAvailable === 0) {
|
|
394
|
+
waitingForData = !0;
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
case STATE_PADDING:
|
|
400
|
+
if (!currentEntry) throw new Error("No current entry for padding");
|
|
401
|
+
if (totalAvailable < currentEntry.padding) {
|
|
402
|
+
waitingForData = !0;
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
currentEntry.padding > 0 && consume(currentEntry.padding), handler.onEndEntry(), currentEntry = null, state = STATE_HEADER;
|
|
406
|
+
continue;
|
|
407
|
+
case STATE_AWAIT_EOF: {
|
|
408
|
+
if (totalAvailable < 512) {
|
|
409
|
+
waitingForData = !0;
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
let secondBlock = read(512);
|
|
413
|
+
if (!secondBlock) {
|
|
414
|
+
waitingForData = !0;
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
if (isZeroBlock(secondBlock)) return;
|
|
418
|
+
if (strict) {
|
|
419
|
+
handler.onError(new Error("Invalid EOF"));
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
422
|
+
chunkQueue.unshift({
|
|
423
|
+
data: secondBlock,
|
|
424
|
+
consumed: 0
|
|
425
|
+
}), totalAvailable += 512, state = STATE_HEADER;
|
|
426
|
+
continue;
|
|
427
|
+
}
|
|
428
|
+
default:
|
|
429
|
+
throw new Error("Invalid state in tar unpacker.");
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
return {
|
|
433
|
+
write(chunk) {
|
|
434
|
+
if (chunk.length !== 0 && (chunkQueue.push({
|
|
435
|
+
data: chunk,
|
|
436
|
+
consumed: 0
|
|
437
|
+
}), totalAvailable += chunk.length, waitingForData)) {
|
|
438
|
+
waitingForData = !1;
|
|
439
|
+
try {
|
|
440
|
+
process2();
|
|
441
|
+
} catch (error) {
|
|
442
|
+
handler.onError(error);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
},
|
|
446
|
+
end() {
|
|
447
|
+
try {
|
|
448
|
+
if (waitingForData || process2(), strict) {
|
|
449
|
+
if (currentEntry && currentEntry.remaining > 0) {
|
|
450
|
+
let error = new Error("Tar archive is truncated.");
|
|
451
|
+
throw handler.onError(error), error;
|
|
452
|
+
}
|
|
453
|
+
if (totalAvailable > 0 && read(totalAvailable)?.some((b) => b !== 0)) {
|
|
454
|
+
let error = new Error("Invalid EOF.");
|
|
455
|
+
throw handler.onError(error), error;
|
|
456
|
+
}
|
|
457
|
+
if (waitingForData) {
|
|
458
|
+
let error = new Error("Tar archive is truncated.");
|
|
459
|
+
throw handler.onError(error), error;
|
|
460
|
+
}
|
|
461
|
+
} else currentEntry && (handler.onEndEntry(), currentEntry = null);
|
|
462
|
+
} catch (error) {
|
|
463
|
+
handler.onError(error);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
function isZeroBlock(block) {
|
|
469
|
+
if (block.byteOffset % 8 === 0) {
|
|
470
|
+
let view = new BigUint64Array(block.buffer, block.byteOffset, block.length / 8);
|
|
471
|
+
for (let i = 0; i < view.length; i++) if (view[i] !== 0n) return !1;
|
|
472
|
+
return !0;
|
|
473
|
+
}
|
|
474
|
+
for (let i = 0; i < block.length; i++) if (block[i] !== 0) return !1;
|
|
475
|
+
return !0;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// ../node_modules/modern-tar/dist/fs/index.js
|
|
479
|
+
import * as fs from "node:fs/promises";
|
|
480
|
+
import { cpus } from "node:os";
|
|
481
|
+
import * as path from "node:path";
|
|
482
|
+
import { PassThrough, Readable, Writable } from "node:stream";
|
|
483
|
+
import { createWriteStream } from "node:fs";
|
|
484
|
+
import { pipeline } from "node:stream/promises";
|
|
485
|
+
var unicodeCache = /* @__PURE__ */ new Map(), normalizeUnicode = (s) => {
|
|
486
|
+
let result = unicodeCache.get(s);
|
|
487
|
+
return result !== void 0 && unicodeCache.delete(s), result = result ?? s.normalize("NFD"), unicodeCache.set(s, result), unicodeCache.size > 1e4 && unicodeCache.delete(unicodeCache.keys().next().value), result;
|
|
488
|
+
};
|
|
489
|
+
function validateBounds(targetPath, destDir, errorMessage) {
|
|
490
|
+
let target = normalizeUnicode(path.resolve(targetPath)), dest = path.resolve(destDir);
|
|
491
|
+
if (target !== dest && !target.startsWith(dest + path.sep)) throw new Error(errorMessage);
|
|
492
|
+
}
|
|
493
|
+
var win32Reserved = {
|
|
494
|
+
":": "\uF03A",
|
|
495
|
+
"<": "\uF03C",
|
|
496
|
+
">": "\uF03E",
|
|
497
|
+
"|": "\uF07C",
|
|
498
|
+
"?": "\uF03F",
|
|
499
|
+
"*": "\uF02A",
|
|
500
|
+
'"': "\uF022"
|
|
501
|
+
};
|
|
502
|
+
function normalizeName(name) {
|
|
503
|
+
let path$1 = name.replace(/\\/g, "/");
|
|
504
|
+
if (path$1.split("/").includes("..") || /^[a-zA-Z]:\.\./.test(path$1)) throw new Error(`${name} points outside extraction directory`);
|
|
505
|
+
let relative = path$1;
|
|
506
|
+
return /^[a-zA-Z]:/.test(relative) ? relative = relative.replace(/^[a-zA-Z]:[/\\]?/, "") : relative.startsWith("/") && (relative = relative.replace(/^\/+/, "")), process.platform === "win32" ? relative.replace(/[<>:"|?*]/g, (char) => win32Reserved[char]) : relative;
|
|
507
|
+
}
|
|
508
|
+
var normalizeHeaderName = (s) => normalizeUnicode(normalizeName(s.replace(/\/+$/, "")));
|
|
509
|
+
function unpackTar(directoryPath, options = {}) {
|
|
510
|
+
let { streamTimeout = 5e3, ...fsOptions } = options, timeoutId = null, { handler, signal } = createFSHandler(directoryPath, fsOptions), unpacker = createTarUnpacker(handler, fsOptions), stream;
|
|
511
|
+
function resetTimeout() {
|
|
512
|
+
timeoutId && clearTimeout(timeoutId), streamTimeout !== 1 / 0 && streamTimeout > 0 && (timeoutId = setTimeout(() => {
|
|
513
|
+
let err = new Error(`Stream timed out after ${streamTimeout}ms of inactivity.`);
|
|
514
|
+
stream.destroy(err);
|
|
515
|
+
}, streamTimeout));
|
|
516
|
+
}
|
|
517
|
+
return stream = new Writable({
|
|
518
|
+
write(chunk, _, callback) {
|
|
519
|
+
if (resetTimeout(), signal.aborted) return callback(signal.reason);
|
|
520
|
+
try {
|
|
521
|
+
unpacker.write(chunk), callback();
|
|
522
|
+
} catch (writeErr) {
|
|
523
|
+
callback(writeErr);
|
|
524
|
+
}
|
|
525
|
+
},
|
|
526
|
+
async final(callback) {
|
|
527
|
+
timeoutId && clearTimeout(timeoutId);
|
|
528
|
+
try {
|
|
529
|
+
if (signal.aborted) return callback(signal.reason);
|
|
530
|
+
unpacker.end(), await handler.process(), callback();
|
|
531
|
+
} catch (finalErr) {
|
|
532
|
+
callback(finalErr);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}), stream.on("close", () => {
|
|
536
|
+
timeoutId && clearTimeout(timeoutId);
|
|
537
|
+
}), resetTimeout(), stream;
|
|
538
|
+
}
|
|
539
|
+
function createFSHandler(directoryPath, options) {
|
|
540
|
+
let { maxDepth = 1024, dmode, fmode, concurrency = cpus().length || 8 } = options, abortController = new AbortController(), { signal } = abortController, opQueue = [], activeOps = 0, pathPromises = /* @__PURE__ */ new Map(), activeEntryStream = null, processingEnded = !1, resolveDrain, drainPromise = new Promise((resolve4) => {
|
|
541
|
+
resolveDrain = resolve4;
|
|
542
|
+
}), processQueue = () => {
|
|
543
|
+
for (signal.aborted && (opQueue.length = 0); activeOps < concurrency && opQueue.length > 0; ) {
|
|
544
|
+
activeOps++;
|
|
545
|
+
let op = opQueue.shift();
|
|
546
|
+
if (!op) break;
|
|
547
|
+
op();
|
|
548
|
+
}
|
|
549
|
+
processingEnded && activeOps === 0 && opQueue.length === 0 && resolveDrain();
|
|
550
|
+
}, destDirPromise = (async () => {
|
|
551
|
+
let symbolic = normalizeUnicode(path.resolve(directoryPath));
|
|
552
|
+
await fs.mkdir(symbolic, { recursive: !0 });
|
|
553
|
+
try {
|
|
554
|
+
let real = await fs.realpath(symbolic);
|
|
555
|
+
return {
|
|
556
|
+
symbolic,
|
|
557
|
+
real
|
|
558
|
+
};
|
|
559
|
+
} catch (err) {
|
|
560
|
+
throw signal.aborted ? signal.reason : err;
|
|
561
|
+
}
|
|
562
|
+
})();
|
|
563
|
+
destDirPromise.catch((err) => {
|
|
564
|
+
signal.aborted || abortController.abort(err);
|
|
565
|
+
});
|
|
566
|
+
let ensureDirectoryExists = (dirPath) => {
|
|
567
|
+
let promise = pathPromises.get(dirPath);
|
|
568
|
+
return promise || (promise = (async () => {
|
|
569
|
+
if (signal.aborted) throw signal.reason;
|
|
570
|
+
let destDir = await destDirPromise;
|
|
571
|
+
if (dirPath === destDir.symbolic) return "directory";
|
|
572
|
+
if (await ensureDirectoryExists(path.dirname(dirPath)), signal.aborted) throw signal.reason;
|
|
573
|
+
try {
|
|
574
|
+
let stat2 = await fs.lstat(dirPath);
|
|
575
|
+
if (stat2.isDirectory()) return "directory";
|
|
576
|
+
if (stat2.isSymbolicLink()) {
|
|
577
|
+
let realPath = await fs.realpath(dirPath);
|
|
578
|
+
if (validateBounds(realPath, destDir.real, `Symlink "${dirPath}" points outside the extraction directory.`), (await fs.stat(realPath)).isDirectory()) return "directory";
|
|
579
|
+
}
|
|
580
|
+
throw new Error(`"${dirPath}" is not a valid directory component.`);
|
|
581
|
+
} catch (err) {
|
|
582
|
+
if (err.code === "ENOENT")
|
|
583
|
+
return await fs.mkdir(dirPath, { mode: dmode }), "directory";
|
|
584
|
+
throw err;
|
|
585
|
+
}
|
|
586
|
+
})(), pathPromises.set(dirPath, promise), promise);
|
|
587
|
+
};
|
|
588
|
+
return {
|
|
589
|
+
handler: {
|
|
590
|
+
onHeader(header) {
|
|
591
|
+
if (signal.aborted) return;
|
|
592
|
+
activeEntryStream = new PassThrough({ highWaterMark: header.size > 1048576 ? 524288 : void 0 });
|
|
593
|
+
let entryStream = activeEntryStream, startOperation = () => {
|
|
594
|
+
let opPromise;
|
|
595
|
+
try {
|
|
596
|
+
let transformed = transformHeader(header, options);
|
|
597
|
+
if (!transformed) {
|
|
598
|
+
entryStream.resume(), activeOps--, processQueue();
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
let name = normalizeHeaderName(transformed.name), target = path.join(path.resolve(directoryPath), name);
|
|
602
|
+
opPromise = (pathPromises.get(target) || Promise.resolve(void 0)).then(async (priorOp) => {
|
|
603
|
+
if (signal.aborted) throw signal.reason;
|
|
604
|
+
if (priorOp && (priorOp === "directory" && transformed.type !== "directory" || priorOp !== "directory" && transformed.type === "directory"))
|
|
605
|
+
throw new Error(`Path conflict ${transformed.type} over existing ${priorOp} at "${transformed.name}"`);
|
|
606
|
+
try {
|
|
607
|
+
let destDir = await destDirPromise;
|
|
608
|
+
if (maxDepth !== 1 / 0 && name.split("/").length > maxDepth) throw new Error("Tar exceeds max specified depth.");
|
|
609
|
+
let outPath = path.join(destDir.symbolic, name);
|
|
610
|
+
validateBounds(outPath, destDir.symbolic, `Entry "${transformed.name}" points outside the extraction directory.`);
|
|
611
|
+
let parentDir = path.dirname(outPath);
|
|
612
|
+
switch (await ensureDirectoryExists(parentDir), transformed.type) {
|
|
613
|
+
case "directory":
|
|
614
|
+
await fs.mkdir(outPath, {
|
|
615
|
+
recursive: !0,
|
|
616
|
+
mode: dmode ?? transformed.mode
|
|
617
|
+
});
|
|
618
|
+
break;
|
|
619
|
+
case "file": {
|
|
620
|
+
let fileStream = createWriteStream(outPath, {
|
|
621
|
+
mode: fmode ?? transformed.mode,
|
|
622
|
+
highWaterMark: transformed.size > 1048576 ? 524288 : void 0
|
|
623
|
+
});
|
|
624
|
+
await pipeline(entryStream, fileStream);
|
|
625
|
+
break;
|
|
626
|
+
}
|
|
627
|
+
case "symlink": {
|
|
628
|
+
let { linkname } = transformed;
|
|
629
|
+
if (!linkname) return transformed.type;
|
|
630
|
+
let target$1 = path.resolve(parentDir, linkname);
|
|
631
|
+
validateBounds(target$1, destDir.symbolic, `Symlink "${linkname}" points outside the extraction directory.`), await fs.symlink(linkname, outPath);
|
|
632
|
+
break;
|
|
633
|
+
}
|
|
634
|
+
case "link": {
|
|
635
|
+
let { linkname } = transformed;
|
|
636
|
+
if (!linkname) return transformed.type;
|
|
637
|
+
let normalizedLink = normalizeUnicode(linkname);
|
|
638
|
+
if (path.isAbsolute(normalizedLink)) throw new Error(`Hardlink "${linkname}" points outside the extraction directory.`);
|
|
639
|
+
let linkTarget = path.join(destDir.symbolic, normalizedLink);
|
|
640
|
+
validateBounds(linkTarget, destDir.symbolic, `Hardlink "${linkname}" points outside the extraction directory.`), await ensureDirectoryExists(path.dirname(linkTarget));
|
|
641
|
+
let realTargetParent = await fs.realpath(path.dirname(linkTarget)), realLinkTarget = path.join(realTargetParent, path.basename(linkTarget));
|
|
642
|
+
if (validateBounds(realLinkTarget, destDir.real, `Hardlink "${linkname}" points outside the extraction directory.`), linkTarget === outPath) return transformed.type;
|
|
643
|
+
let targetPromise = pathPromises.get(linkTarget);
|
|
644
|
+
targetPromise && await targetPromise, await fs.link(linkTarget, outPath);
|
|
645
|
+
break;
|
|
646
|
+
}
|
|
647
|
+
default:
|
|
648
|
+
return transformed.type;
|
|
649
|
+
}
|
|
650
|
+
return transformed.mtime && await (transformed.type === "symlink" ? fs.lutimes : fs.utimes)(outPath, transformed.mtime, transformed.mtime).catch(() => {
|
|
651
|
+
}), transformed.type;
|
|
652
|
+
} finally {
|
|
653
|
+
entryStream.readableEnded || entryStream.resume();
|
|
654
|
+
}
|
|
655
|
+
}), pathPromises.set(target, opPromise);
|
|
656
|
+
} catch (err) {
|
|
657
|
+
opPromise = Promise.reject(err), abortController.abort(err);
|
|
658
|
+
}
|
|
659
|
+
opPromise.catch((err) => abortController.abort(err)).finally(() => {
|
|
660
|
+
activeOps--, processQueue();
|
|
661
|
+
});
|
|
662
|
+
};
|
|
663
|
+
opQueue.push(startOperation), processQueue();
|
|
664
|
+
},
|
|
665
|
+
onData(chunk) {
|
|
666
|
+
signal.aborted || activeEntryStream?.write(chunk);
|
|
667
|
+
},
|
|
668
|
+
onEndEntry() {
|
|
669
|
+
activeEntryStream?.end(), activeEntryStream = null;
|
|
670
|
+
},
|
|
671
|
+
onError(error) {
|
|
672
|
+
abortController.abort(error);
|
|
673
|
+
},
|
|
674
|
+
async process() {
|
|
675
|
+
if (processingEnded = !0, processQueue(), await drainPromise, signal.aborted) throw signal.reason;
|
|
676
|
+
}
|
|
677
|
+
},
|
|
678
|
+
signal
|
|
679
|
+
};
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// src/cli/dirs.ts
|
|
683
|
+
var resolveUsingBranchInstall = async (packageManager, request) => {
|
|
684
|
+
let tempDirectory = await temporaryDirectory(), version = versions[request] || await packageManager.latestVersion(request), url = (src_default.default || src_default)(request, version, {
|
|
685
|
+
registry: await packageManager.getRegistryURL()
|
|
686
|
+
}), response = await fetch(url);
|
|
687
|
+
if (!response.ok || !response.body)
|
|
688
|
+
throw new Error(`Failed to download tarball from ${url}`);
|
|
689
|
+
return await pipeline2(
|
|
690
|
+
Readable2.fromWeb(response.body),
|
|
691
|
+
createGunzip(),
|
|
692
|
+
unpackTar(tempDirectory)
|
|
693
|
+
), join2(tempDirectory, "package");
|
|
694
|
+
};
|
|
695
|
+
async function getRendererDir(packageManager, renderer) {
|
|
696
|
+
let externalFramework = externalFrameworks.find((framework) => framework.name === renderer), frameworkPackageName = externalFramework?.packageName || externalFramework?.renderer || `@storybook/${renderer}`, packageJsonPath = join2(frameworkPackageName, "package.json"), errors = [];
|
|
697
|
+
try {
|
|
698
|
+
return resolvePackageDir(frameworkPackageName, process.cwd());
|
|
699
|
+
} catch (e) {
|
|
700
|
+
invariant(e instanceof Error), errors.push(e);
|
|
701
|
+
}
|
|
702
|
+
try {
|
|
703
|
+
return await resolveUsingBranchInstall(packageManager, frameworkPackageName);
|
|
704
|
+
} catch (e) {
|
|
705
|
+
invariant(e instanceof Error), errors.push(e);
|
|
706
|
+
}
|
|
707
|
+
throw new Error(`Cannot find ${packageJsonPath}, ${errors.map((e) => e.stack).join(`
|
|
708
|
+
|
|
709
|
+
`)}`);
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
// src/cli/helpers.ts
|
|
713
|
+
import { cpSync, existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
714
|
+
import { cp, readFile as readFile2, writeFile } from "node:fs/promises";
|
|
715
|
+
import { join as join3, resolve as resolve2 } from "node:path";
|
|
716
|
+
import {
|
|
717
|
+
frameworkToRenderer,
|
|
718
|
+
getProjectRoot
|
|
719
|
+
} from "storybook/internal/common";
|
|
720
|
+
import { logger } from "storybook/internal/node-logger";
|
|
721
|
+
var import_picocolors = __toESM(require_picocolors(), 1);
|
|
722
|
+
import { coerce, satisfies } from "semver";
|
|
723
|
+
|
|
724
|
+
// ../node_modules/strip-json-comments/index.js
|
|
725
|
+
var singleComment = Symbol("singleComment"), multiComment = Symbol("multiComment"), stripWithoutWhitespace = () => "", stripWithWhitespace = (string, start, end) => string.slice(start, end).replace(/[^ \t\r\n]/g, " "), isEscaped = (jsonString, quotePosition) => {
|
|
726
|
+
let index = quotePosition - 1, backslashCount = 0;
|
|
727
|
+
for (; jsonString[index] === "\\"; )
|
|
728
|
+
index -= 1, backslashCount += 1;
|
|
729
|
+
return !!(backslashCount % 2);
|
|
730
|
+
};
|
|
731
|
+
function stripJsonComments(jsonString, { whitespace = !0, trailingCommas = !1 } = {}) {
|
|
732
|
+
if (typeof jsonString != "string")
|
|
733
|
+
throw new TypeError(`Expected argument \`jsonString\` to be a \`string\`, got \`${typeof jsonString}\``);
|
|
734
|
+
let strip = whitespace ? stripWithWhitespace : stripWithoutWhitespace, isInsideString = !1, isInsideComment = !1, offset = 0, buffer = "", result = "", commaIndex = -1;
|
|
735
|
+
for (let index = 0; index < jsonString.length; index++) {
|
|
736
|
+
let currentCharacter = jsonString[index], nextCharacter = jsonString[index + 1];
|
|
737
|
+
if (!isInsideComment && currentCharacter === '"' && (isEscaped(jsonString, index) || (isInsideString = !isInsideString)), !isInsideString)
|
|
738
|
+
if (!isInsideComment && currentCharacter + nextCharacter === "//")
|
|
739
|
+
buffer += jsonString.slice(offset, index), offset = index, isInsideComment = singleComment, index++;
|
|
740
|
+
else if (isInsideComment === singleComment && currentCharacter + nextCharacter === `\r
|
|
741
|
+
`) {
|
|
742
|
+
index++, isInsideComment = !1, buffer += strip(jsonString, offset, index), offset = index;
|
|
743
|
+
continue;
|
|
744
|
+
} else if (isInsideComment === singleComment && currentCharacter === `
|
|
745
|
+
`)
|
|
746
|
+
isInsideComment = !1, buffer += strip(jsonString, offset, index), offset = index;
|
|
747
|
+
else if (!isInsideComment && currentCharacter + nextCharacter === "/*") {
|
|
748
|
+
buffer += jsonString.slice(offset, index), offset = index, isInsideComment = multiComment, index++;
|
|
749
|
+
continue;
|
|
750
|
+
} else if (isInsideComment === multiComment && currentCharacter + nextCharacter === "*/") {
|
|
751
|
+
index++, isInsideComment = !1, buffer += strip(jsonString, offset, index + 1), offset = index + 1;
|
|
752
|
+
continue;
|
|
753
|
+
} else trailingCommas && !isInsideComment && (commaIndex !== -1 ? currentCharacter === "}" || currentCharacter === "]" ? (buffer += jsonString.slice(offset, index), result += strip(buffer, 0, 1) + buffer.slice(1), buffer = "", offset = index, commaIndex = -1) : currentCharacter !== " " && currentCharacter !== " " && currentCharacter !== "\r" && currentCharacter !== `
|
|
754
|
+
` && (buffer += jsonString.slice(offset, index), offset = index, commaIndex = -1) : currentCharacter === "," && (result += buffer + jsonString.slice(offset, index), buffer = "", offset = index, commaIndex = index));
|
|
755
|
+
}
|
|
756
|
+
let remaining = isInsideComment === singleComment ? strip(jsonString, offset) : jsonString.slice(offset);
|
|
757
|
+
return result + buffer + remaining;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
// src/cli/helpers.ts
|
|
761
|
+
function readFileAsJson(jsonPath, allowComments) {
|
|
762
|
+
let filePath = resolve2(jsonPath);
|
|
763
|
+
if (!existsSync(filePath))
|
|
764
|
+
return !1;
|
|
765
|
+
let fileContent = readFileSync(filePath, "utf8"), jsonContent = allowComments ? stripJsonComments(fileContent) : fileContent;
|
|
766
|
+
try {
|
|
767
|
+
return JSON.parse(jsonContent);
|
|
768
|
+
} catch (e) {
|
|
769
|
+
throw logger.error(import_picocolors.default.red(`Invalid json in file: ${filePath}`)), e;
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
var writeFileAsJson = (jsonPath, content) => {
|
|
773
|
+
let filePath = resolve2(jsonPath);
|
|
774
|
+
return existsSync(filePath) ? (writeFileSync(filePath, `${JSON.stringify(content, null, 2)}
|
|
775
|
+
`), !0) : !1;
|
|
776
|
+
};
|
|
777
|
+
async function getBabelDependencies(packageManager) {
|
|
778
|
+
let dependenciesToAdd = [], babelLoaderVersion = "^8.0.0-0", babelCoreVersion = packageManager.getDependencyVersion("babel-core");
|
|
779
|
+
if (babelCoreVersion) {
|
|
780
|
+
let latestCompatibleBabelVersion = await packageManager.latestVersion(
|
|
781
|
+
"babel-core",
|
|
782
|
+
babelCoreVersion
|
|
783
|
+
);
|
|
784
|
+
latestCompatibleBabelVersion && satisfies(latestCompatibleBabelVersion, "^6.0.0") && (babelLoaderVersion = "^7.0.0");
|
|
785
|
+
} else if (!packageManager.getDependencyVersion("@babel/core")) {
|
|
786
|
+
let babelCoreInstallVersion = await packageManager.getVersion("@babel/core");
|
|
787
|
+
dependenciesToAdd.push(`@babel/core@${babelCoreInstallVersion}`);
|
|
788
|
+
}
|
|
789
|
+
if (!packageManager.getDependencyVersion("babel-loader")) {
|
|
790
|
+
let babelLoaderInstallVersion = await packageManager.getVersion(
|
|
791
|
+
"babel-loader",
|
|
792
|
+
babelLoaderVersion
|
|
793
|
+
);
|
|
794
|
+
dependenciesToAdd.push(`babel-loader@${babelLoaderInstallVersion}`);
|
|
795
|
+
}
|
|
796
|
+
return dependenciesToAdd;
|
|
797
|
+
}
|
|
798
|
+
function addToDevDependenciesIfNotPresent(packageJson, name, packageVersion) {
|
|
799
|
+
!packageJson.dependencies?.[name] && !packageJson.devDependencies?.[name] && (packageJson.devDependencies ? packageJson.devDependencies[name] = packageVersion : packageJson.devDependencies = {
|
|
800
|
+
[name]: packageVersion
|
|
801
|
+
});
|
|
802
|
+
}
|
|
803
|
+
function copyTemplate(templateRoot, destination = ".") {
|
|
804
|
+
let templateDir = resolve2(templateRoot, "template-csf/");
|
|
805
|
+
if (!existsSync(templateDir))
|
|
806
|
+
throw new Error("Couldn't find template dir");
|
|
807
|
+
cpSync(templateDir, destination, { recursive: !0 });
|
|
808
|
+
}
|
|
809
|
+
var frameworkToDefaultBuilder = {
|
|
810
|
+
angular: "webpack5" /* Webpack5 */,
|
|
811
|
+
ember: "webpack5" /* Webpack5 */,
|
|
812
|
+
"html-vite": "vite" /* Vite */,
|
|
813
|
+
nextjs: "webpack5" /* Webpack5 */,
|
|
814
|
+
nuxt: "vite" /* Vite */,
|
|
815
|
+
"nextjs-vite": "vite" /* Vite */,
|
|
816
|
+
"preact-vite": "vite" /* Vite */,
|
|
817
|
+
qwik: "vite" /* Vite */,
|
|
818
|
+
"react-native-web-vite": "vite" /* Vite */,
|
|
819
|
+
"react-vite": "vite" /* Vite */,
|
|
820
|
+
"react-webpack5": "webpack5" /* Webpack5 */,
|
|
821
|
+
"server-webpack5": "webpack5" /* Webpack5 */,
|
|
822
|
+
solid: "vite" /* Vite */,
|
|
823
|
+
"svelte-vite": "vite" /* Vite */,
|
|
824
|
+
sveltekit: "vite" /* Vite */,
|
|
825
|
+
"vue3-vite": "vite" /* Vite */,
|
|
826
|
+
"web-components-vite": "vite" /* Vite */,
|
|
827
|
+
// Only to pass type checking, will never be used
|
|
828
|
+
"react-rsbuild": "rsbuild" /* Rsbuild */,
|
|
829
|
+
"vue3-rsbuild": "rsbuild" /* Rsbuild */
|
|
830
|
+
};
|
|
831
|
+
async function getVersionSafe(packageManager, packageName) {
|
|
832
|
+
try {
|
|
833
|
+
let version = await packageManager.getInstalledVersion(packageName);
|
|
834
|
+
return version || (version = packageManager.getAllDependencies()[packageName] ?? ""), coerce(version, { includePrerelease: !0 })?.toString();
|
|
835
|
+
} catch {
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
var cliStoriesTargetPath = async () => existsSync("./src") ? "./src/stories" : "./stories";
|
|
839
|
+
async function copyTemplateFiles({
|
|
840
|
+
packageManager,
|
|
841
|
+
templateLocation,
|
|
842
|
+
language,
|
|
843
|
+
destination,
|
|
844
|
+
commonAssetsDir,
|
|
845
|
+
features
|
|
846
|
+
}) {
|
|
847
|
+
let languageFolderMapping = {
|
|
848
|
+
javascript: "js",
|
|
849
|
+
typescript: "ts"
|
|
850
|
+
}, templatePath = async () => {
|
|
851
|
+
let baseDir = await getRendererDir(packageManager, templateLocation), assetsDir = join3(baseDir, "template", "cli"), assetsLanguage = join3(assetsDir, languageFolderMapping[language]), assetsJS = join3(assetsDir, languageFolderMapping.javascript), assetsTS = join3(assetsDir, languageFolderMapping.typescript);
|
|
852
|
+
if (existsSync(assetsLanguage))
|
|
853
|
+
return assetsLanguage;
|
|
854
|
+
if (existsSync(assetsTS))
|
|
855
|
+
return assetsTS;
|
|
856
|
+
if (existsSync(assetsJS))
|
|
857
|
+
return assetsJS;
|
|
858
|
+
if (existsSync(assetsDir))
|
|
859
|
+
return assetsDir;
|
|
860
|
+
throw new Error(`Unsupported renderer: ${templateLocation} (${baseDir})`);
|
|
861
|
+
}, destinationPath = destination ?? await cliStoriesTargetPath(), filter = (file) => features.includes("docs") || !file.endsWith(".mdx");
|
|
862
|
+
if (commonAssetsDir && await cp(commonAssetsDir, destinationPath, { recursive: !0, filter }), await cp(await templatePath(), destinationPath, { recursive: !0, filter }), commonAssetsDir && features.includes("docs")) {
|
|
863
|
+
let rendererType = frameworkToRenderer[templateLocation] || "react";
|
|
864
|
+
rendererType === "vue3" && (rendererType = "vue"), await adjustTemplate(join3(destinationPath, "Configure.mdx"), { renderer: rendererType });
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
async function adjustTemplate(templatePath, templateData) {
|
|
868
|
+
let template = await readFile2(templatePath, { encoding: "utf8" });
|
|
869
|
+
Object.keys(templateData).forEach((key) => {
|
|
870
|
+
template = template.replaceAll(`{{${key}}}`, `${templateData[key]}`);
|
|
871
|
+
}), await writeFile(templatePath, template);
|
|
872
|
+
}
|
|
873
|
+
async function isNxProject() {
|
|
874
|
+
return up("nx.json", { last: getProjectRoot() });
|
|
875
|
+
}
|
|
876
|
+
function coerceSemver(version) {
|
|
877
|
+
let coercedSemver = coerce(version);
|
|
878
|
+
return invariant(coercedSemver != null, `Could not coerce ${version} into a semver.`), coercedSemver;
|
|
879
|
+
}
|
|
880
|
+
function hasStorybookDependencies(packageManager) {
|
|
881
|
+
let currentPackageDeps = packageManager.getAllDependencies();
|
|
882
|
+
return Object.keys(currentPackageDeps).some((dep) => dep.includes("storybook"));
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
// src/cli/detect.ts
|
|
886
|
+
import { existsSync as existsSync2 } from "node:fs";
|
|
887
|
+
import { resolve as resolve3 } from "node:path";
|
|
888
|
+
import { HandledError, commandLog, getProjectRoot as getProjectRoot2 } from "storybook/internal/common";
|
|
889
|
+
import { logger as logger2 } from "storybook/internal/node-logger";
|
|
890
|
+
var import_prompts = __toESM(require_prompts(), 1);
|
|
891
|
+
import semver from "semver";
|
|
892
|
+
var viteConfigFiles = ["vite.config.ts", "vite.config.js", "vite.config.mjs"], webpackConfigFiles = ["webpack.config.js"], hasDependency = (packageJson, name, matcher) => {
|
|
893
|
+
let version = packageJson.dependencies?.[name] || packageJson.devDependencies?.[name];
|
|
894
|
+
return version && typeof matcher == "function" ? matcher(version) : !!version;
|
|
895
|
+
}, hasPeerDependency = (packageJson, name, matcher) => {
|
|
896
|
+
let version = packageJson.peerDependencies?.[name];
|
|
897
|
+
return version && typeof matcher == "function" ? matcher(version) : !!version;
|
|
898
|
+
}, getFrameworkPreset = (packageJson, framework) => {
|
|
899
|
+
let matcher = {
|
|
900
|
+
dependencies: [!1],
|
|
901
|
+
peerDependencies: [!1],
|
|
902
|
+
files: [!1]
|
|
903
|
+
}, { preset, files, dependencies, peerDependencies, matcherFunction } = framework, dependencySearches = [];
|
|
904
|
+
Array.isArray(dependencies) ? dependencySearches = dependencies.map((name) => [name, void 0]) : typeof dependencies == "object" && (dependencySearches = Object.entries(dependencies)), dependencySearches.length > 0 && (matcher.dependencies = dependencySearches.map(
|
|
905
|
+
([name, matchFn]) => hasDependency(packageJson, name, matchFn)
|
|
906
|
+
));
|
|
907
|
+
let peerDependencySearches = [];
|
|
908
|
+
return Array.isArray(peerDependencies) ? peerDependencySearches = peerDependencies.map((name) => [name, void 0]) : typeof peerDependencies == "object" && (peerDependencySearches = Object.entries(peerDependencies)), peerDependencySearches.length > 0 && (matcher.peerDependencies = peerDependencySearches.map(
|
|
909
|
+
([name, matchFn]) => hasPeerDependency(packageJson, name, matchFn)
|
|
910
|
+
)), Array.isArray(files) && files.length > 0 && (matcher.files = files.map((name) => existsSync2(name))), matcherFunction(matcher) ? preset : null;
|
|
911
|
+
};
|
|
912
|
+
function detectFrameworkPreset(packageJson = {}) {
|
|
913
|
+
let result = [...supportedTemplates, unsupportedTemplate].find((framework) => getFrameworkPreset(packageJson, framework) !== null);
|
|
914
|
+
return result ? result.preset : "UNDETECTED" /* UNDETECTED */;
|
|
915
|
+
}
|
|
916
|
+
async function detectBuilder(packageManager, projectType) {
|
|
917
|
+
let viteConfig = any(viteConfigFiles, { last: getProjectRoot2() }), webpackConfig = any(webpackConfigFiles, { last: getProjectRoot2() }), dependencies = packageManager.getAllDependencies();
|
|
918
|
+
if (viteConfig || dependencies.vite && dependencies.webpack === void 0)
|
|
919
|
+
return commandLog("Detected Vite project. Setting builder to Vite")(), "vite" /* Vite */;
|
|
920
|
+
if (webpackConfig || (dependencies.webpack || dependencies["@nuxt/webpack-builder"]) && dependencies.vite !== void 0)
|
|
921
|
+
return commandLog("Detected webpack project. Setting builder to webpack")(), "webpack5" /* Webpack5 */;
|
|
922
|
+
switch (projectType) {
|
|
923
|
+
case "REACT_NATIVE_AND_RNW" /* REACT_NATIVE_AND_RNW */:
|
|
924
|
+
case "REACT_NATIVE_WEB" /* REACT_NATIVE_WEB */:
|
|
925
|
+
return "vite" /* Vite */;
|
|
926
|
+
case "REACT_SCRIPTS" /* REACT_SCRIPTS */:
|
|
927
|
+
case "ANGULAR" /* ANGULAR */:
|
|
928
|
+
case "REACT_NATIVE" /* REACT_NATIVE */:
|
|
929
|
+
// technically react native doesn't use webpack, we just want to set something
|
|
930
|
+
case "NEXTJS" /* NEXTJS */:
|
|
931
|
+
case "EMBER" /* EMBER */:
|
|
932
|
+
return "webpack5" /* Webpack5 */;
|
|
933
|
+
case "NUXT" /* NUXT */:
|
|
934
|
+
return "vite" /* Vite */;
|
|
935
|
+
default:
|
|
936
|
+
let { builder } = await (0, import_prompts.default)(
|
|
937
|
+
{
|
|
938
|
+
type: "select",
|
|
939
|
+
name: "builder",
|
|
940
|
+
message: `
|
|
941
|
+
We were not able to detect the right builder for your project. Please select one:`,
|
|
942
|
+
choices: [
|
|
943
|
+
{ title: "Vite", value: "vite" /* Vite */ },
|
|
944
|
+
{ title: "Webpack 5", value: "webpack5" /* Webpack5 */ }
|
|
945
|
+
]
|
|
946
|
+
},
|
|
947
|
+
{
|
|
948
|
+
onCancel: () => {
|
|
949
|
+
throw new HandledError("Canceled by the user");
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
);
|
|
953
|
+
return builder;
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
function isStorybookInstantiated(configDir = resolve3(process.cwd(), ".storybook")) {
|
|
957
|
+
return existsSync2(configDir);
|
|
958
|
+
}
|
|
959
|
+
async function detectPnp() {
|
|
960
|
+
return !!any([".pnp.js", ".pnp.cjs"]);
|
|
961
|
+
}
|
|
962
|
+
async function detectLanguage(packageManager) {
|
|
963
|
+
let language = "javascript" /* JAVASCRIPT */;
|
|
964
|
+
if (existsSync2("jsconfig.json"))
|
|
965
|
+
return language;
|
|
966
|
+
let isTypescriptDirectDependency = !!packageManager.getAllDependencies().typescript, getModulePackageJSONVersion = async (pkg) => (await packageManager.getModulePackageJSON(pkg))?.version ?? null, [
|
|
967
|
+
typescriptVersion,
|
|
968
|
+
prettierVersion,
|
|
969
|
+
babelPluginTransformTypescriptVersion,
|
|
970
|
+
typescriptEslintParserVersion,
|
|
971
|
+
eslintPluginStorybookVersion
|
|
972
|
+
] = await Promise.all([
|
|
973
|
+
getModulePackageJSONVersion("typescript"),
|
|
974
|
+
getModulePackageJSONVersion("prettier"),
|
|
975
|
+
getModulePackageJSONVersion("@babel/plugin-transform-typescript"),
|
|
976
|
+
getModulePackageJSONVersion("@typescript-eslint/parser"),
|
|
977
|
+
getModulePackageJSONVersion("eslint-plugin-storybook")
|
|
978
|
+
]);
|
|
979
|
+
return isTypescriptDirectDependency && typescriptVersion ? semver.gte(typescriptVersion, "4.9.0") && (!prettierVersion || semver.gte(prettierVersion, "2.8.0")) && (!babelPluginTransformTypescriptVersion || semver.gte(babelPluginTransformTypescriptVersion, "7.20.0")) && (!typescriptEslintParserVersion || semver.gte(typescriptEslintParserVersion, "5.44.0")) && (!eslintPluginStorybookVersion || semver.gte(eslintPluginStorybookVersion, "0.6.8")) ? language = "typescript" /* TYPESCRIPT */ : logger2.warn(
|
|
980
|
+
"Detected TypeScript < 4.9 or incompatible tooling, populating with JavaScript examples"
|
|
981
|
+
) : existsSync2("tsconfig.json") && (language = "typescript" /* TYPESCRIPT */), language;
|
|
982
|
+
}
|
|
983
|
+
async function detect(packageManager, options = {}) {
|
|
984
|
+
try {
|
|
985
|
+
if (await isNxProject())
|
|
986
|
+
return "NX" /* NX */;
|
|
987
|
+
if (options.html)
|
|
988
|
+
return "HTML" /* HTML */;
|
|
989
|
+
let { packageJson } = packageManager.primaryPackageJson;
|
|
990
|
+
return detectFrameworkPreset(packageJson);
|
|
991
|
+
} catch {
|
|
992
|
+
return "UNDETECTED" /* UNDETECTED */;
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
export {
|
|
997
|
+
externalFrameworks,
|
|
998
|
+
SUPPORTED_RENDERERS,
|
|
999
|
+
ProjectType,
|
|
1000
|
+
CoreBuilder,
|
|
1001
|
+
CoreWebpackCompilers,
|
|
1002
|
+
CommunityBuilder,
|
|
1003
|
+
compilerNameToCoreCompiler,
|
|
1004
|
+
builderNameToCoreBuilder,
|
|
1005
|
+
SupportedLanguage,
|
|
1006
|
+
supportedTemplates,
|
|
1007
|
+
unsupportedTemplate,
|
|
1008
|
+
installableProjectTypes,
|
|
1009
|
+
getRendererDir,
|
|
1010
|
+
readFileAsJson,
|
|
1011
|
+
writeFileAsJson,
|
|
1012
|
+
getBabelDependencies,
|
|
1013
|
+
addToDevDependenciesIfNotPresent,
|
|
1014
|
+
copyTemplate,
|
|
1015
|
+
frameworkToDefaultBuilder,
|
|
1016
|
+
getVersionSafe,
|
|
1017
|
+
cliStoriesTargetPath,
|
|
1018
|
+
copyTemplateFiles,
|
|
1019
|
+
adjustTemplate,
|
|
1020
|
+
isNxProject,
|
|
1021
|
+
coerceSemver,
|
|
1022
|
+
hasStorybookDependencies,
|
|
1023
|
+
detectFrameworkPreset,
|
|
1024
|
+
detectBuilder,
|
|
1025
|
+
isStorybookInstantiated,
|
|
1026
|
+
detectPnp,
|
|
1027
|
+
detectLanguage,
|
|
1028
|
+
detect
|
|
1029
|
+
};
|