storybook 10.0.0-rc.2 → 10.0.0-rc.4
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/_node-chunks/{builder-manager-ZNPRP22E.js → builder-manager-CMPC7SCH.js} +12 -12
- package/dist/_node-chunks/camelcase-PH4ACE3G.js +18 -0
- package/dist/_node-chunks/{chunk-62KDMWXX.js → chunk-2JIAOYKO.js} +7 -7
- package/dist/_node-chunks/{chunk-DOCRBDQH.js → chunk-4TLOQYBC.js} +7 -7
- package/dist/_node-chunks/{chunk-D5WSRTEX.js → chunk-A3UOLOFM.js} +7 -7
- package/dist/_node-chunks/{chunk-X35XJZ7G.js → chunk-AA6WD3A7.js} +7 -7
- package/dist/_node-chunks/chunk-AHFZBAQF.js +61 -0
- package/dist/_node-chunks/{chunk-VDCU2LFF.js → chunk-AS5N7GY5.js} +7 -7
- package/dist/_node-chunks/{chunk-LUDM5RD2.js → chunk-BEHPCFQ2.js} +8 -8
- package/dist/_node-chunks/{chunk-VHPYGR5X.js → chunk-BSVBH2ZA.js} +7 -7
- package/dist/_node-chunks/{chunk-WD2QJDGV.js → chunk-BZXQJZUK.js} +7 -7
- package/dist/_node-chunks/{chunk-6VEWXDI5.js → chunk-DLIUMR5R.js} +6 -6
- package/dist/_node-chunks/{chunk-K5GJVTVF.js → chunk-E7XUDQ3W.js} +7 -7
- package/dist/_node-chunks/{chunk-H6J6LJQQ.js → chunk-EJGHDAYE.js} +6 -6
- package/dist/_node-chunks/{chunk-VSPERFYF.js → chunk-JGDH6YYG.js} +20 -20
- package/dist/_node-chunks/{chunk-XJRUDTSD.js → chunk-JPPACTL4.js} +7 -7
- package/dist/_node-chunks/{chunk-SSK6CTPD.js → chunk-MC6BOBJJ.js} +12 -12
- package/dist/_node-chunks/{chunk-54MOKOMZ.js → chunk-MQY4ZI62.js} +8 -8
- package/dist/_node-chunks/{chunk-SF4YWMS2.js → chunk-NCKTVDON.js} +37 -35
- package/dist/_node-chunks/{chunk-QD4TA2GK.js → chunk-OJSXOILA.js} +7 -7
- package/dist/_node-chunks/{chunk-BPYW7SFB.js → chunk-OOXEC2LP.js} +7 -7
- package/dist/_node-chunks/{chunk-M2Y5JVSX.js → chunk-P7GFT5HG.js} +8 -8
- package/dist/_node-chunks/{chunk-OCPCEJ7D.js → chunk-PCQGHIXN.js} +7 -7
- package/dist/_node-chunks/{chunk-TR7IYGK4.js → chunk-PJCDP6ZD.js} +7 -7
- package/dist/_node-chunks/{chunk-MTIN3LKM.js → chunk-PW2V2I6I.js} +7 -7
- package/dist/_node-chunks/{chunk-2IEV7XG2.js → chunk-QK5IGJ3H.js} +9 -9
- package/dist/_node-chunks/{chunk-ZZMPRSOL.js → chunk-RZ77GUAF.js} +10 -10
- package/dist/_node-chunks/{chunk-LR47LSEQ.js → chunk-SN3TDU74.js} +8 -8
- package/dist/_node-chunks/{chunk-AFW3U6QG.js → chunk-SX2UZK74.js} +7 -7
- package/dist/_node-chunks/{chunk-FXGD2HHQ.js → chunk-USMWLOGR.js} +7 -7
- package/dist/_node-chunks/chunk-VBFCHLFV.js +1518 -0
- package/dist/_node-chunks/{chunk-6SGQF6CF.js → chunk-VWIHOMFU.js} +8 -8
- package/dist/_node-chunks/chunk-XQN3THEO.js +18 -0
- package/dist/_node-chunks/{chunk-J34Y4L4Q.js → chunk-YW2UKPPH.js} +9 -9
- package/dist/_node-chunks/{chunk-FWBLOTP7.js → chunk-ZW5XA6KG.js} +7 -7
- package/dist/_node-chunks/{dist-47EE2CMC.js → dist-U664B537.js} +9 -9
- package/dist/_node-chunks/{globby-ZEUQ6QPC.js → globby-HQ3ESL52.js} +9 -9
- package/dist/_node-chunks/{lib-LCU5VXJS.js → lib-2IOH44LB.js} +7 -7
- package/dist/_node-chunks/{mdx-N42X6CFJ-7LUZM4HR.js → mdx-N42X6CFJ-M54WITPV.js} +8 -8
- package/dist/_node-chunks/{p-limit-XJGTO6H5.js → p-limit-PBXTEA6N.js} +7 -7
- package/dist/_node-chunks/{plugin-ZN5KCYM2.js → plugin-34QU2FG7.js} +10 -10
- package/dist/_node-chunks/{plugin-YZRPWYO5.js → plugin-RSI6B3JI.js} +10 -10
- package/dist/_node-chunks/{webpack-inject-mocker-runtime-plugin-CRH6N7YZ.js → webpack-inject-mocker-runtime-plugin-UMXHXRC2.js} +10 -10
- package/dist/_node-chunks/{webpack-mock-plugin-NQXGMVTF.js → webpack-mock-plugin-6GKO2XIO.js} +9 -9
- package/dist/babel/index.js +11 -11
- package/dist/bin/core.js +11 -11
- package/dist/bin/dispatcher.js +11 -11
- package/dist/bin/loader.js +9 -9
- package/dist/cli/index.js +136 -1561
- package/dist/common/index.js +20 -20
- package/dist/core-server/index.js +48 -35
- package/dist/core-server/presets/common-manager.js +1 -0
- package/dist/core-server/presets/common-override-preset.js +9 -9
- package/dist/core-server/presets/common-preset.js +38 -26
- package/dist/core-server/presets/webpack/loaders/storybook-mock-transform-loader.js +9 -9
- package/dist/core-server/presets/webpack/loaders/webpack-automock-loader.js +10 -10
- package/dist/csf-tools/index.js +9 -9
- package/dist/instrumenter/index.js +1 -1
- package/dist/manager/globals-runtime.js +9 -6
- package/dist/manager-api/index.d.ts +1 -1
- package/dist/manager-api/index.js +1 -1
- package/dist/node-logger/index.js +14 -14
- package/dist/preview/runtime.js +8 -5
- package/dist/preview-api/index.d.ts +67 -68
- package/dist/server-errors.js +10 -10
- package/dist/telemetry/index.d.ts +21 -1
- package/dist/telemetry/index.js +24 -24
- package/dist/test/index.js +7 -4
- package/dist/types/index.d.ts +3 -1
- package/package.json +1 -1
- package/dist/_node-chunks/camelcase-EY6MYFU4.js +0 -18
- package/dist/_node-chunks/chunk-JT5JXOKC.js +0 -61
- package/dist/_node-chunks/chunk-N4S7XZKB.js +0 -18
|
@@ -0,0 +1,1518 @@
|
|
|
1
|
+
import CJS_COMPAT_NODE_URL_me0y3sd4o2e from 'node:url';
|
|
2
|
+
import CJS_COMPAT_NODE_PATH_me0y3sd4o2e from 'node:path';
|
|
3
|
+
import CJS_COMPAT_NODE_MODULE_me0y3sd4o2e from "node:module";
|
|
4
|
+
|
|
5
|
+
var __filename = CJS_COMPAT_NODE_URL_me0y3sd4o2e.fileURLToPath(import.meta.url);
|
|
6
|
+
var __dirname = CJS_COMPAT_NODE_PATH_me0y3sd4o2e.dirname(__filename);
|
|
7
|
+
var require = CJS_COMPAT_NODE_MODULE_me0y3sd4o2e.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-USMWLOGR.js";
|
|
16
|
+
import {
|
|
17
|
+
invariant
|
|
18
|
+
} from "./chunk-AA6WD3A7.js";
|
|
19
|
+
import {
|
|
20
|
+
resolvePackageDir
|
|
21
|
+
} from "./chunk-VWIHOMFU.js";
|
|
22
|
+
import {
|
|
23
|
+
require_prompts
|
|
24
|
+
} from "./chunk-SX2UZK74.js";
|
|
25
|
+
import {
|
|
26
|
+
require_picocolors
|
|
27
|
+
} from "./chunk-4TLOQYBC.js";
|
|
28
|
+
import {
|
|
29
|
+
__name,
|
|
30
|
+
__toESM
|
|
31
|
+
} from "./chunk-EJGHDAYE.js";
|
|
32
|
+
|
|
33
|
+
// src/cli/project_types.ts
|
|
34
|
+
import { minVersion, validRange } from "semver";
|
|
35
|
+
function eqMajor(versionRange, major) {
|
|
36
|
+
if (validRange(versionRange)) {
|
|
37
|
+
return minVersion(versionRange)?.major === major;
|
|
38
|
+
}
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
__name(eqMajor, "eqMajor");
|
|
42
|
+
var externalFrameworks = [
|
|
43
|
+
{ name: "qwik", packageName: "storybook-framework-qwik" },
|
|
44
|
+
{
|
|
45
|
+
name: "solid",
|
|
46
|
+
packageName: "storybook-solidjs-vite",
|
|
47
|
+
frameworks: ["storybook-solidjs-vite"],
|
|
48
|
+
renderer: "storybook-solidjs-vite"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "nuxt",
|
|
52
|
+
packageName: "@storybook-vue/nuxt",
|
|
53
|
+
frameworks: ["@storybook-vue/nuxt"],
|
|
54
|
+
renderer: "@storybook/vue3"
|
|
55
|
+
}
|
|
56
|
+
];
|
|
57
|
+
var SUPPORTED_RENDERERS = [
|
|
58
|
+
"react",
|
|
59
|
+
"react-native",
|
|
60
|
+
"vue3",
|
|
61
|
+
"angular",
|
|
62
|
+
"ember",
|
|
63
|
+
"preact",
|
|
64
|
+
"svelte",
|
|
65
|
+
"qwik",
|
|
66
|
+
"solid"
|
|
67
|
+
];
|
|
68
|
+
var ProjectType = /* @__PURE__ */ ((ProjectType2) => {
|
|
69
|
+
ProjectType2["UNDETECTED"] = "UNDETECTED";
|
|
70
|
+
ProjectType2["UNSUPPORTED"] = "UNSUPPORTED";
|
|
71
|
+
ProjectType2["REACT"] = "REACT";
|
|
72
|
+
ProjectType2["REACT_SCRIPTS"] = "REACT_SCRIPTS";
|
|
73
|
+
ProjectType2["REACT_NATIVE"] = "REACT_NATIVE";
|
|
74
|
+
ProjectType2["REACT_NATIVE_WEB"] = "REACT_NATIVE_WEB";
|
|
75
|
+
ProjectType2["REACT_NATIVE_AND_RNW"] = "REACT_NATIVE_AND_RNW";
|
|
76
|
+
ProjectType2["REACT_PROJECT"] = "REACT_PROJECT";
|
|
77
|
+
ProjectType2["WEBPACK_REACT"] = "WEBPACK_REACT";
|
|
78
|
+
ProjectType2["NEXTJS"] = "NEXTJS";
|
|
79
|
+
ProjectType2["VUE3"] = "VUE3";
|
|
80
|
+
ProjectType2["NUXT"] = "NUXT";
|
|
81
|
+
ProjectType2["ANGULAR"] = "ANGULAR";
|
|
82
|
+
ProjectType2["EMBER"] = "EMBER";
|
|
83
|
+
ProjectType2["WEB_COMPONENTS"] = "WEB_COMPONENTS";
|
|
84
|
+
ProjectType2["HTML"] = "HTML";
|
|
85
|
+
ProjectType2["QWIK"] = "QWIK";
|
|
86
|
+
ProjectType2["PREACT"] = "PREACT";
|
|
87
|
+
ProjectType2["SVELTE"] = "SVELTE";
|
|
88
|
+
ProjectType2["SVELTEKIT"] = "SVELTEKIT";
|
|
89
|
+
ProjectType2["SERVER"] = "SERVER";
|
|
90
|
+
ProjectType2["NX"] = "NX";
|
|
91
|
+
ProjectType2["SOLID"] = "SOLID";
|
|
92
|
+
return ProjectType2;
|
|
93
|
+
})(ProjectType || {});
|
|
94
|
+
var CoreBuilder = /* @__PURE__ */ ((CoreBuilder2) => {
|
|
95
|
+
CoreBuilder2["Webpack5"] = "webpack5";
|
|
96
|
+
CoreBuilder2["Vite"] = "vite";
|
|
97
|
+
return CoreBuilder2;
|
|
98
|
+
})(CoreBuilder || {});
|
|
99
|
+
var CoreWebpackCompilers = /* @__PURE__ */ ((CoreWebpackCompilers2) => {
|
|
100
|
+
CoreWebpackCompilers2["Babel"] = "babel";
|
|
101
|
+
CoreWebpackCompilers2["SWC"] = "swc";
|
|
102
|
+
return CoreWebpackCompilers2;
|
|
103
|
+
})(CoreWebpackCompilers || {});
|
|
104
|
+
var CommunityBuilder = /* @__PURE__ */ ((CommunityBuilder2) => {
|
|
105
|
+
CommunityBuilder2["Rsbuild"] = "rsbuild";
|
|
106
|
+
return CommunityBuilder2;
|
|
107
|
+
})(CommunityBuilder || {});
|
|
108
|
+
var compilerNameToCoreCompiler = {
|
|
109
|
+
"@storybook/addon-webpack5-compiler-babel": "babel" /* Babel */,
|
|
110
|
+
"@storybook/addon-webpack5-compiler-swc": "swc" /* SWC */
|
|
111
|
+
};
|
|
112
|
+
var builderNameToCoreBuilder = {
|
|
113
|
+
"@storybook/builder-webpack5": "webpack5" /* Webpack5 */,
|
|
114
|
+
"@storybook/builder-vite": "vite" /* Vite */
|
|
115
|
+
};
|
|
116
|
+
var SupportedLanguage = /* @__PURE__ */ ((SupportedLanguage2) => {
|
|
117
|
+
SupportedLanguage2["JAVASCRIPT"] = "javascript";
|
|
118
|
+
SupportedLanguage2["TYPESCRIPT"] = "typescript";
|
|
119
|
+
return SupportedLanguage2;
|
|
120
|
+
})(SupportedLanguage || {});
|
|
121
|
+
var supportedTemplates = [
|
|
122
|
+
{
|
|
123
|
+
preset: "NUXT" /* NUXT */,
|
|
124
|
+
dependencies: ["nuxt"],
|
|
125
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
126
|
+
return dependencies?.every(Boolean) ?? true;
|
|
127
|
+
}, "matcherFunction")
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
preset: "VUE3" /* VUE3 */,
|
|
131
|
+
dependencies: {
|
|
132
|
+
// This Vue template works with Vue 3
|
|
133
|
+
vue: /* @__PURE__ */ __name((versionRange) => versionRange === "next" || eqMajor(versionRange, 3), "vue")
|
|
134
|
+
},
|
|
135
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
136
|
+
return dependencies?.some(Boolean) ?? false;
|
|
137
|
+
}, "matcherFunction")
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
preset: "EMBER" /* EMBER */,
|
|
141
|
+
dependencies: ["ember-cli"],
|
|
142
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
143
|
+
return dependencies?.every(Boolean) ?? true;
|
|
144
|
+
}, "matcherFunction")
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
preset: "NEXTJS" /* NEXTJS */,
|
|
148
|
+
dependencies: ["next"],
|
|
149
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
150
|
+
return dependencies?.every(Boolean) ?? true;
|
|
151
|
+
}, "matcherFunction")
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
preset: "QWIK" /* QWIK */,
|
|
155
|
+
dependencies: ["@builder.io/qwik"],
|
|
156
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
157
|
+
return dependencies?.every(Boolean) ?? true;
|
|
158
|
+
}, "matcherFunction")
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
preset: "REACT_PROJECT" /* REACT_PROJECT */,
|
|
162
|
+
peerDependencies: ["react"],
|
|
163
|
+
matcherFunction: /* @__PURE__ */ __name(({ peerDependencies }) => {
|
|
164
|
+
return peerDependencies?.every(Boolean) ?? true;
|
|
165
|
+
}, "matcherFunction")
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
preset: "REACT_NATIVE" /* REACT_NATIVE */,
|
|
169
|
+
dependencies: ["react-native", "react-native-scripts"],
|
|
170
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
171
|
+
return dependencies?.some(Boolean) ?? false;
|
|
172
|
+
}, "matcherFunction")
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
preset: "REACT_SCRIPTS" /* REACT_SCRIPTS */,
|
|
176
|
+
// For projects using a custom/forked `react-scripts` package.
|
|
177
|
+
files: ["/node_modules/.bin/react-scripts"],
|
|
178
|
+
// For standard CRA projects
|
|
179
|
+
dependencies: ["react-scripts"],
|
|
180
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies, files }) => {
|
|
181
|
+
return (dependencies?.every(Boolean) || files?.every(Boolean)) ?? false;
|
|
182
|
+
}, "matcherFunction")
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
preset: "ANGULAR" /* ANGULAR */,
|
|
186
|
+
dependencies: ["@angular/core"],
|
|
187
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
188
|
+
return dependencies?.every(Boolean) ?? true;
|
|
189
|
+
}, "matcherFunction")
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
preset: "WEB_COMPONENTS" /* WEB_COMPONENTS */,
|
|
193
|
+
dependencies: ["lit-element", "lit-html", "lit"],
|
|
194
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
195
|
+
return dependencies?.some(Boolean) ?? false;
|
|
196
|
+
}, "matcherFunction")
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
preset: "PREACT" /* PREACT */,
|
|
200
|
+
dependencies: ["preact"],
|
|
201
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
202
|
+
return dependencies?.every(Boolean) ?? true;
|
|
203
|
+
}, "matcherFunction")
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
// TODO: This only works because it is before the SVELTE template. could be more explicit
|
|
207
|
+
preset: "SVELTEKIT" /* SVELTEKIT */,
|
|
208
|
+
dependencies: ["@sveltejs/kit"],
|
|
209
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
210
|
+
return dependencies?.every(Boolean) ?? true;
|
|
211
|
+
}, "matcherFunction")
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
preset: "SVELTE" /* SVELTE */,
|
|
215
|
+
dependencies: ["svelte"],
|
|
216
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
217
|
+
return dependencies?.every(Boolean) ?? true;
|
|
218
|
+
}, "matcherFunction")
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
preset: "SOLID" /* SOLID */,
|
|
222
|
+
dependencies: ["solid-js"],
|
|
223
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
224
|
+
return dependencies?.every(Boolean) ?? true;
|
|
225
|
+
}, "matcherFunction")
|
|
226
|
+
},
|
|
227
|
+
// DO NOT MOVE ANY TEMPLATES BELOW THIS LINE
|
|
228
|
+
// React is part of every Template, after Storybook is initialized once
|
|
229
|
+
{
|
|
230
|
+
preset: "WEBPACK_REACT" /* WEBPACK_REACT */,
|
|
231
|
+
dependencies: ["react", "webpack"],
|
|
232
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
233
|
+
return dependencies?.every(Boolean) ?? true;
|
|
234
|
+
}, "matcherFunction")
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
preset: "REACT" /* REACT */,
|
|
238
|
+
dependencies: ["react"],
|
|
239
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
240
|
+
return dependencies?.every(Boolean) ?? true;
|
|
241
|
+
}, "matcherFunction")
|
|
242
|
+
}
|
|
243
|
+
];
|
|
244
|
+
var unsupportedTemplate = {
|
|
245
|
+
preset: "UNSUPPORTED" /* UNSUPPORTED */,
|
|
246
|
+
dependencies: {},
|
|
247
|
+
matcherFunction: /* @__PURE__ */ __name(({ dependencies }) => {
|
|
248
|
+
return dependencies?.some(Boolean) ?? false;
|
|
249
|
+
}, "matcherFunction")
|
|
250
|
+
};
|
|
251
|
+
var notInstallableProjectTypes = [
|
|
252
|
+
"UNDETECTED" /* UNDETECTED */,
|
|
253
|
+
"UNSUPPORTED" /* UNSUPPORTED */,
|
|
254
|
+
"NX" /* NX */
|
|
255
|
+
];
|
|
256
|
+
var installableProjectTypes = Object.values(ProjectType).filter((type) => !notInstallableProjectTypes.includes(type)).map((type) => type.toLowerCase());
|
|
257
|
+
|
|
258
|
+
// src/cli/dirs.ts
|
|
259
|
+
import { join as join2 } from "node:path";
|
|
260
|
+
import { Readable as Readable2 } from "node:stream";
|
|
261
|
+
import { pipeline as pipeline2 } from "node:stream/promises";
|
|
262
|
+
import { createGunzip } from "node:zlib";
|
|
263
|
+
import { temporaryDirectory, versions } from "storybook/internal/common";
|
|
264
|
+
|
|
265
|
+
// ../node_modules/get-npm-tarball-url/lib/index.mjs
|
|
266
|
+
function src_default(pkgName, pkgVersion, opts) {
|
|
267
|
+
let registry;
|
|
268
|
+
if (opts == null ? void 0 : opts.registry) {
|
|
269
|
+
registry = opts.registry.endsWith("/") ? opts.registry : `${opts.registry}/`;
|
|
270
|
+
} else {
|
|
271
|
+
registry = "https://registry.npmjs.org/";
|
|
272
|
+
}
|
|
273
|
+
const scopelessName = getScopelessName(pkgName);
|
|
274
|
+
return `${registry}${pkgName}/-/${scopelessName}-${removeBuildMetadataFromVersion(pkgVersion)}.tgz`;
|
|
275
|
+
}
|
|
276
|
+
__name(src_default, "src_default");
|
|
277
|
+
function removeBuildMetadataFromVersion(version) {
|
|
278
|
+
const plusPos = version.indexOf("+");
|
|
279
|
+
if (plusPos === -1)
|
|
280
|
+
return version;
|
|
281
|
+
return version.substring(0, plusPos);
|
|
282
|
+
}
|
|
283
|
+
__name(removeBuildMetadataFromVersion, "removeBuildMetadataFromVersion");
|
|
284
|
+
function getScopelessName(name) {
|
|
285
|
+
if (name[0] !== "@") {
|
|
286
|
+
return name;
|
|
287
|
+
}
|
|
288
|
+
return name.split("/")[1];
|
|
289
|
+
}
|
|
290
|
+
__name(getScopelessName, "getScopelessName");
|
|
291
|
+
|
|
292
|
+
// ../node_modules/modern-tar/dist/unpacker-BKKRRs7i.js
|
|
293
|
+
var BLOCK_SIZE = 512;
|
|
294
|
+
var BLOCK_SIZE_MASK = 511;
|
|
295
|
+
var USTAR_NAME_OFFSET = 0;
|
|
296
|
+
var USTAR_NAME_SIZE = 100;
|
|
297
|
+
var USTAR_MODE_OFFSET = 100;
|
|
298
|
+
var USTAR_MODE_SIZE = 8;
|
|
299
|
+
var USTAR_UID_OFFSET = 108;
|
|
300
|
+
var USTAR_UID_SIZE = 8;
|
|
301
|
+
var USTAR_GID_OFFSET = 116;
|
|
302
|
+
var USTAR_GID_SIZE = 8;
|
|
303
|
+
var USTAR_SIZE_OFFSET = 124;
|
|
304
|
+
var USTAR_SIZE_SIZE = 12;
|
|
305
|
+
var USTAR_MTIME_OFFSET = 136;
|
|
306
|
+
var USTAR_MTIME_SIZE = 12;
|
|
307
|
+
var USTAR_CHECKSUM_OFFSET = 148;
|
|
308
|
+
var USTAR_CHECKSUM_SIZE = 8;
|
|
309
|
+
var USTAR_TYPEFLAG_OFFSET = 156;
|
|
310
|
+
var USTAR_TYPEFLAG_SIZE = 1;
|
|
311
|
+
var USTAR_LINKNAME_OFFSET = 157;
|
|
312
|
+
var USTAR_LINKNAME_SIZE = 100;
|
|
313
|
+
var USTAR_MAGIC_OFFSET = 257;
|
|
314
|
+
var USTAR_MAGIC_SIZE = 6;
|
|
315
|
+
var USTAR_UNAME_OFFSET = 265;
|
|
316
|
+
var USTAR_UNAME_SIZE = 32;
|
|
317
|
+
var USTAR_GNAME_OFFSET = 297;
|
|
318
|
+
var USTAR_GNAME_SIZE = 32;
|
|
319
|
+
var USTAR_PREFIX_OFFSET = 345;
|
|
320
|
+
var USTAR_PREFIX_SIZE = 155;
|
|
321
|
+
var FLAGTYPE = {
|
|
322
|
+
"0": "file",
|
|
323
|
+
"1": "link",
|
|
324
|
+
"2": "symlink",
|
|
325
|
+
"3": "character-device",
|
|
326
|
+
"4": "block-device",
|
|
327
|
+
"5": "directory",
|
|
328
|
+
"6": "fifo",
|
|
329
|
+
x: "pax-header",
|
|
330
|
+
g: "pax-global-header",
|
|
331
|
+
L: "gnu-long-name",
|
|
332
|
+
K: "gnu-long-link-name"
|
|
333
|
+
};
|
|
334
|
+
var ZERO_BLOCK = new Uint8Array(BLOCK_SIZE);
|
|
335
|
+
var encoder = new TextEncoder();
|
|
336
|
+
var decoder = new TextDecoder();
|
|
337
|
+
function readString(view, offset, size) {
|
|
338
|
+
const end = view.indexOf(0, offset);
|
|
339
|
+
const sliceEnd = end === -1 || end > offset + size ? offset + size : end;
|
|
340
|
+
return decoder.decode(view.subarray(offset, sliceEnd));
|
|
341
|
+
}
|
|
342
|
+
__name(readString, "readString");
|
|
343
|
+
function readOctal(view, offset, size) {
|
|
344
|
+
let value = 0;
|
|
345
|
+
const end = offset + size;
|
|
346
|
+
for (let i = offset; i < end; i++) {
|
|
347
|
+
const charCode = view[i];
|
|
348
|
+
if (charCode === 0) break;
|
|
349
|
+
if (charCode === 32) continue;
|
|
350
|
+
value = (value << 3) + (charCode - 48);
|
|
351
|
+
}
|
|
352
|
+
return value;
|
|
353
|
+
}
|
|
354
|
+
__name(readOctal, "readOctal");
|
|
355
|
+
function readNumeric(view, offset, size) {
|
|
356
|
+
if (view[offset] & 128) {
|
|
357
|
+
let result = 0;
|
|
358
|
+
result = view[offset] & 127;
|
|
359
|
+
for (let i = 1; i < size; i++) result = result * 256 + view[offset + i];
|
|
360
|
+
if (!Number.isSafeInteger(result)) throw new Error("TAR number too large");
|
|
361
|
+
return result;
|
|
362
|
+
}
|
|
363
|
+
return readOctal(view, offset, size);
|
|
364
|
+
}
|
|
365
|
+
__name(readNumeric, "readNumeric");
|
|
366
|
+
var CHECKSUM_SPACE = 32;
|
|
367
|
+
function validateChecksum(block) {
|
|
368
|
+
const stored = readOctal(block, USTAR_CHECKSUM_OFFSET, USTAR_CHECKSUM_SIZE);
|
|
369
|
+
let sum = 0;
|
|
370
|
+
for (let i = 0; i < block.length; i++) if (i >= USTAR_CHECKSUM_OFFSET && i < USTAR_CHECKSUM_OFFSET + USTAR_CHECKSUM_SIZE) sum += CHECKSUM_SPACE;
|
|
371
|
+
else sum += block[i];
|
|
372
|
+
return stored === sum;
|
|
373
|
+
}
|
|
374
|
+
__name(validateChecksum, "validateChecksum");
|
|
375
|
+
function parseUstarHeader(block, strict) {
|
|
376
|
+
if (strict && !validateChecksum(block)) throw new Error("Invalid tar header checksum.");
|
|
377
|
+
const typeflag = readString(block, USTAR_TYPEFLAG_OFFSET, USTAR_TYPEFLAG_SIZE);
|
|
378
|
+
const header = {
|
|
379
|
+
name: readString(block, USTAR_NAME_OFFSET, USTAR_NAME_SIZE),
|
|
380
|
+
mode: readOctal(block, USTAR_MODE_OFFSET, USTAR_MODE_SIZE),
|
|
381
|
+
uid: readNumeric(block, USTAR_UID_OFFSET, USTAR_UID_SIZE),
|
|
382
|
+
gid: readNumeric(block, USTAR_GID_OFFSET, USTAR_GID_SIZE),
|
|
383
|
+
size: readNumeric(block, USTAR_SIZE_OFFSET, USTAR_SIZE_SIZE),
|
|
384
|
+
mtime: new Date(readNumeric(block, USTAR_MTIME_OFFSET, USTAR_MTIME_SIZE) * 1e3),
|
|
385
|
+
type: FLAGTYPE[typeflag] || "file",
|
|
386
|
+
linkname: readString(block, USTAR_LINKNAME_OFFSET, USTAR_LINKNAME_SIZE)
|
|
387
|
+
};
|
|
388
|
+
const magic = readString(block, USTAR_MAGIC_OFFSET, USTAR_MAGIC_SIZE);
|
|
389
|
+
if (magic.trim() === "ustar") {
|
|
390
|
+
header.uname = readString(block, USTAR_UNAME_OFFSET, USTAR_UNAME_SIZE);
|
|
391
|
+
header.gname = readString(block, USTAR_GNAME_OFFSET, USTAR_GNAME_SIZE);
|
|
392
|
+
}
|
|
393
|
+
if (magic === "ustar") header.prefix = readString(block, USTAR_PREFIX_OFFSET, USTAR_PREFIX_SIZE);
|
|
394
|
+
return header;
|
|
395
|
+
}
|
|
396
|
+
__name(parseUstarHeader, "parseUstarHeader");
|
|
397
|
+
var PAX_MAPPING = {
|
|
398
|
+
path: ["name", (v) => v],
|
|
399
|
+
linkpath: ["linkname", (v) => v],
|
|
400
|
+
size: ["size", (v) => parseInt(v, 10)],
|
|
401
|
+
mtime: ["mtime", parseFloat],
|
|
402
|
+
uid: ["uid", (v) => parseInt(v, 10)],
|
|
403
|
+
gid: ["gid", (v) => parseInt(v, 10)],
|
|
404
|
+
uname: ["uname", (v) => v],
|
|
405
|
+
gname: ["gname", (v) => v]
|
|
406
|
+
};
|
|
407
|
+
function parsePax(buffer) {
|
|
408
|
+
const decoder$1 = new TextDecoder("utf-8");
|
|
409
|
+
const overrides = {};
|
|
410
|
+
const pax = {};
|
|
411
|
+
let offset = 0;
|
|
412
|
+
while (offset < buffer.length) {
|
|
413
|
+
const spaceIndex = buffer.indexOf(32, offset);
|
|
414
|
+
if (spaceIndex === -1) break;
|
|
415
|
+
const length = parseInt(decoder$1.decode(buffer.subarray(offset, spaceIndex)), 10);
|
|
416
|
+
if (Number.isNaN(length) || length === 0) break;
|
|
417
|
+
const recordEnd = offset + length;
|
|
418
|
+
const [key, value] = decoder$1.decode(buffer.subarray(spaceIndex + 1, recordEnd - 1)).split("=", 2);
|
|
419
|
+
if (key && value !== void 0) {
|
|
420
|
+
pax[key] = value;
|
|
421
|
+
const mapping = PAX_MAPPING[key];
|
|
422
|
+
if (mapping) {
|
|
423
|
+
const [targetKey, parser] = mapping;
|
|
424
|
+
const parsedValue = parser(value);
|
|
425
|
+
if (typeof parsedValue === "string" || !Number.isNaN(parsedValue)) overrides[targetKey] = parsedValue;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
offset = recordEnd;
|
|
429
|
+
}
|
|
430
|
+
if (Object.keys(pax).length > 0) overrides.pax = pax;
|
|
431
|
+
return overrides;
|
|
432
|
+
}
|
|
433
|
+
__name(parsePax, "parsePax");
|
|
434
|
+
function applyOverrides(header, overrides) {
|
|
435
|
+
if (overrides.name !== void 0) header.name = overrides.name;
|
|
436
|
+
if (overrides.linkname !== void 0) header.linkname = overrides.linkname;
|
|
437
|
+
if (overrides.size !== void 0) header.size = overrides.size;
|
|
438
|
+
if (overrides.mtime !== void 0) header.mtime = new Date(overrides.mtime * 1e3);
|
|
439
|
+
if (overrides.uid !== void 0) header.uid = overrides.uid;
|
|
440
|
+
if (overrides.gid !== void 0) header.gid = overrides.gid;
|
|
441
|
+
if (overrides.uname !== void 0) header.uname = overrides.uname;
|
|
442
|
+
if (overrides.gname !== void 0) header.gname = overrides.gname;
|
|
443
|
+
if (overrides.pax) header.pax = Object.assign({}, header.pax ?? {}, overrides.pax);
|
|
444
|
+
}
|
|
445
|
+
__name(applyOverrides, "applyOverrides");
|
|
446
|
+
function getMetaParser(type) {
|
|
447
|
+
switch (type) {
|
|
448
|
+
case "pax-global-header":
|
|
449
|
+
case "pax-header":
|
|
450
|
+
return parsePax;
|
|
451
|
+
case "gnu-long-name":
|
|
452
|
+
return (data) => ({ name: readString(data, 0, data.length) });
|
|
453
|
+
case "gnu-long-link-name":
|
|
454
|
+
return (data) => ({ linkname: readString(data, 0, data.length) });
|
|
455
|
+
default:
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
__name(getMetaParser, "getMetaParser");
|
|
460
|
+
var EOF_BUFFER = new Uint8Array(BLOCK_SIZE * 2);
|
|
461
|
+
function transformHeader(header, options) {
|
|
462
|
+
const { strip, filter, map } = options;
|
|
463
|
+
if (!strip && !filter && !map) return header;
|
|
464
|
+
const h = { ...header };
|
|
465
|
+
if (strip && strip > 0) {
|
|
466
|
+
const components = h.name.split("/").filter(Boolean);
|
|
467
|
+
if (strip >= components.length) return null;
|
|
468
|
+
const newName = components.slice(strip).join("/");
|
|
469
|
+
h.name = h.type === "directory" && !newName.endsWith("/") ? `${newName}/` : newName;
|
|
470
|
+
if (h.linkname?.startsWith("/")) {
|
|
471
|
+
const linkComponents = h.linkname.split("/").filter(Boolean);
|
|
472
|
+
h.linkname = strip >= linkComponents.length ? "/" : `/${linkComponents.slice(strip).join("/")}`;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
if (filter?.(h) === false) return null;
|
|
476
|
+
const result = map ? map(h) : h;
|
|
477
|
+
if (result && (!result.name || !result.name.trim() || result.name === "." || result.name === "/")) return null;
|
|
478
|
+
return result;
|
|
479
|
+
}
|
|
480
|
+
__name(transformHeader, "transformHeader");
|
|
481
|
+
var STATE_HEADER = 0;
|
|
482
|
+
var STATE_BODY = 1;
|
|
483
|
+
var STATE_PADDING = 2;
|
|
484
|
+
var STATE_AWAIT_EOF = 3;
|
|
485
|
+
function createTarUnpacker(handler, options = {}) {
|
|
486
|
+
const strict = options.strict ?? false;
|
|
487
|
+
const chunkQueue = [];
|
|
488
|
+
let totalAvailable = 0;
|
|
489
|
+
let state = STATE_HEADER;
|
|
490
|
+
let waitingForData = false;
|
|
491
|
+
let currentEntry = null;
|
|
492
|
+
const paxGlobals = {};
|
|
493
|
+
let nextEntryOverrides = {};
|
|
494
|
+
function consume(size, callback) {
|
|
495
|
+
let remaining = Math.min(size, totalAvailable);
|
|
496
|
+
const initialRemaining = remaining;
|
|
497
|
+
while (remaining > 0 && chunkQueue.length > 0) {
|
|
498
|
+
const chunkNode = chunkQueue[0];
|
|
499
|
+
const available = chunkNode.data.length - chunkNode.consumed;
|
|
500
|
+
const toProcess = Math.min(remaining, available);
|
|
501
|
+
if (callback) callback(chunkNode.data.subarray(chunkNode.consumed, chunkNode.consumed + toProcess));
|
|
502
|
+
chunkNode.consumed += toProcess;
|
|
503
|
+
remaining -= toProcess;
|
|
504
|
+
if (chunkNode.consumed >= chunkNode.data.length) chunkQueue.shift();
|
|
505
|
+
}
|
|
506
|
+
totalAvailable -= initialRemaining - remaining;
|
|
507
|
+
return initialRemaining - remaining;
|
|
508
|
+
}
|
|
509
|
+
__name(consume, "consume");
|
|
510
|
+
function read(size) {
|
|
511
|
+
const toRead = Math.min(size, totalAvailable);
|
|
512
|
+
if (toRead === 0) return null;
|
|
513
|
+
const chunk = chunkQueue[0];
|
|
514
|
+
if (chunk) {
|
|
515
|
+
if (chunk.data.length - chunk.consumed >= toRead) {
|
|
516
|
+
const result$1 = chunk.data.subarray(chunk.consumed, chunk.consumed + toRead);
|
|
517
|
+
chunk.consumed += toRead;
|
|
518
|
+
totalAvailable -= toRead;
|
|
519
|
+
if (chunk.consumed >= chunk.data.length) chunkQueue.shift();
|
|
520
|
+
return result$1;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
const result = new Uint8Array(toRead);
|
|
524
|
+
let offset = 0;
|
|
525
|
+
consume(toRead, (data) => {
|
|
526
|
+
result.set(data, offset);
|
|
527
|
+
offset += data.length;
|
|
528
|
+
});
|
|
529
|
+
return result;
|
|
530
|
+
}
|
|
531
|
+
__name(read, "read");
|
|
532
|
+
function process2() {
|
|
533
|
+
while (true) switch (state) {
|
|
534
|
+
case STATE_HEADER: {
|
|
535
|
+
if (totalAvailable < BLOCK_SIZE) {
|
|
536
|
+
waitingForData = true;
|
|
537
|
+
return;
|
|
538
|
+
}
|
|
539
|
+
const headerBlock = read(BLOCK_SIZE);
|
|
540
|
+
if (!headerBlock) {
|
|
541
|
+
waitingForData = true;
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
if (isZeroBlock(headerBlock)) {
|
|
545
|
+
state = STATE_AWAIT_EOF;
|
|
546
|
+
continue;
|
|
547
|
+
}
|
|
548
|
+
waitingForData = false;
|
|
549
|
+
try {
|
|
550
|
+
const internalHeader = parseUstarHeader(headerBlock, strict);
|
|
551
|
+
const header = {
|
|
552
|
+
...internalHeader,
|
|
553
|
+
name: internalHeader.name
|
|
554
|
+
};
|
|
555
|
+
const metaParser = getMetaParser(header.type);
|
|
556
|
+
if (metaParser) {
|
|
557
|
+
const paddedSize = header.size + BLOCK_SIZE_MASK & ~BLOCK_SIZE_MASK;
|
|
558
|
+
if (totalAvailable < paddedSize) {
|
|
559
|
+
waitingForData = true;
|
|
560
|
+
chunkQueue.unshift({
|
|
561
|
+
data: headerBlock,
|
|
562
|
+
consumed: 0
|
|
563
|
+
});
|
|
564
|
+
totalAvailable += BLOCK_SIZE;
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
const metaBlock = read(paddedSize);
|
|
568
|
+
if (!metaBlock) {
|
|
569
|
+
waitingForData = true;
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
const overrides = metaParser(metaBlock.subarray(0, header.size));
|
|
573
|
+
if (header.type === "pax-global-header") Object.assign(paxGlobals, overrides);
|
|
574
|
+
else Object.assign(nextEntryOverrides, overrides);
|
|
575
|
+
continue;
|
|
576
|
+
}
|
|
577
|
+
if (internalHeader.prefix) header.name = `${internalHeader.prefix}/${header.name}`;
|
|
578
|
+
applyOverrides(header, paxGlobals);
|
|
579
|
+
applyOverrides(header, nextEntryOverrides);
|
|
580
|
+
nextEntryOverrides = {};
|
|
581
|
+
handler.onHeader(header);
|
|
582
|
+
if (header.size > 0) {
|
|
583
|
+
currentEntry = {
|
|
584
|
+
remaining: header.size,
|
|
585
|
+
padding: -header.size & BLOCK_SIZE_MASK
|
|
586
|
+
};
|
|
587
|
+
state = STATE_BODY;
|
|
588
|
+
} else handler.onEndEntry();
|
|
589
|
+
} catch (error) {
|
|
590
|
+
handler.onError(error);
|
|
591
|
+
return;
|
|
592
|
+
}
|
|
593
|
+
continue;
|
|
594
|
+
}
|
|
595
|
+
case STATE_BODY: {
|
|
596
|
+
if (!currentEntry) throw new Error("No current entry for body");
|
|
597
|
+
const toForward = Math.min(currentEntry.remaining, totalAvailable);
|
|
598
|
+
if (toForward > 0) {
|
|
599
|
+
const consumed = consume(toForward, handler.onData);
|
|
600
|
+
currentEntry.remaining -= consumed;
|
|
601
|
+
}
|
|
602
|
+
if (currentEntry.remaining === 0) {
|
|
603
|
+
state = currentEntry.padding > 0 ? STATE_PADDING : STATE_HEADER;
|
|
604
|
+
if (state === STATE_HEADER) {
|
|
605
|
+
handler.onEndEntry();
|
|
606
|
+
currentEntry = null;
|
|
607
|
+
}
|
|
608
|
+
} else if (totalAvailable === 0) {
|
|
609
|
+
waitingForData = true;
|
|
610
|
+
return;
|
|
611
|
+
}
|
|
612
|
+
continue;
|
|
613
|
+
}
|
|
614
|
+
case STATE_PADDING:
|
|
615
|
+
if (!currentEntry) throw new Error("No current entry for padding");
|
|
616
|
+
if (totalAvailable < currentEntry.padding) {
|
|
617
|
+
waitingForData = true;
|
|
618
|
+
return;
|
|
619
|
+
}
|
|
620
|
+
if (currentEntry.padding > 0) consume(currentEntry.padding);
|
|
621
|
+
handler.onEndEntry();
|
|
622
|
+
currentEntry = null;
|
|
623
|
+
state = STATE_HEADER;
|
|
624
|
+
continue;
|
|
625
|
+
case STATE_AWAIT_EOF: {
|
|
626
|
+
if (totalAvailable < BLOCK_SIZE) {
|
|
627
|
+
waitingForData = true;
|
|
628
|
+
return;
|
|
629
|
+
}
|
|
630
|
+
const secondBlock = read(BLOCK_SIZE);
|
|
631
|
+
if (!secondBlock) {
|
|
632
|
+
waitingForData = true;
|
|
633
|
+
return;
|
|
634
|
+
}
|
|
635
|
+
if (isZeroBlock(secondBlock)) return;
|
|
636
|
+
if (strict) {
|
|
637
|
+
handler.onError(new Error("Invalid EOF"));
|
|
638
|
+
return;
|
|
639
|
+
}
|
|
640
|
+
chunkQueue.unshift({
|
|
641
|
+
data: secondBlock,
|
|
642
|
+
consumed: 0
|
|
643
|
+
});
|
|
644
|
+
totalAvailable += BLOCK_SIZE;
|
|
645
|
+
state = STATE_HEADER;
|
|
646
|
+
continue;
|
|
647
|
+
}
|
|
648
|
+
default:
|
|
649
|
+
throw new Error("Invalid state in tar unpacker.");
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
__name(process2, "process");
|
|
653
|
+
return {
|
|
654
|
+
write(chunk) {
|
|
655
|
+
if (chunk.length === 0) return;
|
|
656
|
+
chunkQueue.push({
|
|
657
|
+
data: chunk,
|
|
658
|
+
consumed: 0
|
|
659
|
+
});
|
|
660
|
+
totalAvailable += chunk.length;
|
|
661
|
+
if (waitingForData) {
|
|
662
|
+
waitingForData = false;
|
|
663
|
+
try {
|
|
664
|
+
process2();
|
|
665
|
+
} catch (error) {
|
|
666
|
+
handler.onError(error);
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
},
|
|
670
|
+
end() {
|
|
671
|
+
try {
|
|
672
|
+
if (!waitingForData) process2();
|
|
673
|
+
if (strict) {
|
|
674
|
+
if (currentEntry && currentEntry.remaining > 0) {
|
|
675
|
+
const error = new Error("Tar archive is truncated.");
|
|
676
|
+
handler.onError(error);
|
|
677
|
+
throw error;
|
|
678
|
+
}
|
|
679
|
+
if (totalAvailable > 0) {
|
|
680
|
+
if (read(totalAvailable)?.some((b) => b !== 0)) {
|
|
681
|
+
const error = new Error("Invalid EOF.");
|
|
682
|
+
handler.onError(error);
|
|
683
|
+
throw error;
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
if (waitingForData) {
|
|
687
|
+
const error = new Error("Tar archive is truncated.");
|
|
688
|
+
handler.onError(error);
|
|
689
|
+
throw error;
|
|
690
|
+
}
|
|
691
|
+
} else if (currentEntry) {
|
|
692
|
+
handler.onEndEntry();
|
|
693
|
+
currentEntry = null;
|
|
694
|
+
}
|
|
695
|
+
} catch (error) {
|
|
696
|
+
handler.onError(error);
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
__name(createTarUnpacker, "createTarUnpacker");
|
|
702
|
+
function isZeroBlock(block) {
|
|
703
|
+
if (block.byteOffset % 8 === 0) {
|
|
704
|
+
const view = new BigUint64Array(block.buffer, block.byteOffset, block.length / 8);
|
|
705
|
+
for (let i = 0; i < view.length; i++) if (view[i] !== 0n) return false;
|
|
706
|
+
return true;
|
|
707
|
+
}
|
|
708
|
+
for (let i = 0; i < block.length; i++) if (block[i] !== 0) return false;
|
|
709
|
+
return true;
|
|
710
|
+
}
|
|
711
|
+
__name(isZeroBlock, "isZeroBlock");
|
|
712
|
+
|
|
713
|
+
// ../node_modules/modern-tar/dist/fs/index.js
|
|
714
|
+
import * as fs from "node:fs/promises";
|
|
715
|
+
import { cpus } from "node:os";
|
|
716
|
+
import * as path from "node:path";
|
|
717
|
+
import { PassThrough, Readable, Writable } from "node:stream";
|
|
718
|
+
import { createWriteStream } from "node:fs";
|
|
719
|
+
import { pipeline } from "node:stream/promises";
|
|
720
|
+
var unicodeCache = /* @__PURE__ */ new Map();
|
|
721
|
+
var normalizeUnicode = /* @__PURE__ */ __name((s) => {
|
|
722
|
+
let result = unicodeCache.get(s);
|
|
723
|
+
if (result !== void 0) unicodeCache.delete(s);
|
|
724
|
+
result = result ?? s.normalize("NFD");
|
|
725
|
+
unicodeCache.set(s, result);
|
|
726
|
+
if (unicodeCache.size > 1e4) unicodeCache.delete(unicodeCache.keys().next().value);
|
|
727
|
+
return result;
|
|
728
|
+
}, "normalizeUnicode");
|
|
729
|
+
function validateBounds(targetPath, destDir, errorMessage) {
|
|
730
|
+
const target = normalizeUnicode(path.resolve(targetPath));
|
|
731
|
+
const dest = path.resolve(destDir);
|
|
732
|
+
if (target !== dest && !target.startsWith(dest + path.sep)) throw new Error(errorMessage);
|
|
733
|
+
}
|
|
734
|
+
__name(validateBounds, "validateBounds");
|
|
735
|
+
var win32Reserved = {
|
|
736
|
+
":": "\uF03A",
|
|
737
|
+
"<": "\uF03C",
|
|
738
|
+
">": "\uF03E",
|
|
739
|
+
"|": "\uF07C",
|
|
740
|
+
"?": "\uF03F",
|
|
741
|
+
"*": "\uF02A",
|
|
742
|
+
'"': "\uF022"
|
|
743
|
+
};
|
|
744
|
+
function normalizeName(name) {
|
|
745
|
+
const path$1 = name.replace(/\\/g, "/");
|
|
746
|
+
if (path$1.split("/").includes("..") || /^[a-zA-Z]:\.\./.test(path$1)) throw new Error(`${name} points outside extraction directory`);
|
|
747
|
+
let relative = path$1;
|
|
748
|
+
if (/^[a-zA-Z]:/.test(relative)) relative = relative.replace(/^[a-zA-Z]:[/\\]?/, "");
|
|
749
|
+
else if (relative.startsWith("/")) relative = relative.replace(/^\/+/, "");
|
|
750
|
+
if (process.platform === "win32") return relative.replace(/[<>:"|?*]/g, (char) => win32Reserved[char]);
|
|
751
|
+
return relative;
|
|
752
|
+
}
|
|
753
|
+
__name(normalizeName, "normalizeName");
|
|
754
|
+
var normalizeHeaderName = /* @__PURE__ */ __name((s) => normalizeUnicode(normalizeName(s.replace(/\/+$/, ""))), "normalizeHeaderName");
|
|
755
|
+
function unpackTar(directoryPath, options = {}) {
|
|
756
|
+
const { streamTimeout = 5e3, ...fsOptions } = options;
|
|
757
|
+
let timeoutId = null;
|
|
758
|
+
const { handler, signal } = createFSHandler(directoryPath, fsOptions);
|
|
759
|
+
const unpacker = createTarUnpacker(handler, fsOptions);
|
|
760
|
+
let stream;
|
|
761
|
+
function resetTimeout() {
|
|
762
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
763
|
+
if (streamTimeout !== Infinity && streamTimeout > 0) timeoutId = setTimeout(() => {
|
|
764
|
+
const err = new Error(`Stream timed out after ${streamTimeout}ms of inactivity.`);
|
|
765
|
+
stream.destroy(err);
|
|
766
|
+
}, streamTimeout);
|
|
767
|
+
}
|
|
768
|
+
__name(resetTimeout, "resetTimeout");
|
|
769
|
+
stream = new Writable({
|
|
770
|
+
write(chunk, _, callback) {
|
|
771
|
+
resetTimeout();
|
|
772
|
+
if (signal.aborted) return callback(signal.reason);
|
|
773
|
+
try {
|
|
774
|
+
unpacker.write(chunk);
|
|
775
|
+
callback();
|
|
776
|
+
} catch (writeErr) {
|
|
777
|
+
callback(writeErr);
|
|
778
|
+
}
|
|
779
|
+
},
|
|
780
|
+
async final(callback) {
|
|
781
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
782
|
+
try {
|
|
783
|
+
if (signal.aborted) return callback(signal.reason);
|
|
784
|
+
unpacker.end();
|
|
785
|
+
await handler.process();
|
|
786
|
+
callback();
|
|
787
|
+
} catch (finalErr) {
|
|
788
|
+
callback(finalErr);
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
});
|
|
792
|
+
stream.on("close", () => {
|
|
793
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
794
|
+
});
|
|
795
|
+
resetTimeout();
|
|
796
|
+
return stream;
|
|
797
|
+
}
|
|
798
|
+
__name(unpackTar, "unpackTar");
|
|
799
|
+
function createFSHandler(directoryPath, options) {
|
|
800
|
+
const { maxDepth = 1024, dmode, fmode, concurrency = cpus().length || 8 } = options;
|
|
801
|
+
const abortController = new AbortController();
|
|
802
|
+
const { signal } = abortController;
|
|
803
|
+
const opQueue = [];
|
|
804
|
+
let activeOps = 0;
|
|
805
|
+
const pathPromises = /* @__PURE__ */ new Map();
|
|
806
|
+
let activeEntryStream = null;
|
|
807
|
+
let processingEnded = false;
|
|
808
|
+
let resolveDrain;
|
|
809
|
+
const drainPromise = new Promise((resolve4) => {
|
|
810
|
+
resolveDrain = resolve4;
|
|
811
|
+
});
|
|
812
|
+
const processQueue = /* @__PURE__ */ __name(() => {
|
|
813
|
+
if (signal.aborted) opQueue.length = 0;
|
|
814
|
+
while (activeOps < concurrency && opQueue.length > 0) {
|
|
815
|
+
activeOps++;
|
|
816
|
+
const op = opQueue.shift();
|
|
817
|
+
if (!op) break;
|
|
818
|
+
op();
|
|
819
|
+
}
|
|
820
|
+
if (processingEnded && activeOps === 0 && opQueue.length === 0) resolveDrain();
|
|
821
|
+
}, "processQueue");
|
|
822
|
+
const destDirPromise = (async () => {
|
|
823
|
+
const symbolic = normalizeUnicode(path.resolve(directoryPath));
|
|
824
|
+
await fs.mkdir(symbolic, { recursive: true });
|
|
825
|
+
try {
|
|
826
|
+
const real = await fs.realpath(symbolic);
|
|
827
|
+
return {
|
|
828
|
+
symbolic,
|
|
829
|
+
real
|
|
830
|
+
};
|
|
831
|
+
} catch (err) {
|
|
832
|
+
if (signal.aborted) throw signal.reason;
|
|
833
|
+
throw err;
|
|
834
|
+
}
|
|
835
|
+
})();
|
|
836
|
+
destDirPromise.catch((err) => {
|
|
837
|
+
if (!signal.aborted) abortController.abort(err);
|
|
838
|
+
});
|
|
839
|
+
const ensureDirectoryExists = /* @__PURE__ */ __name((dirPath) => {
|
|
840
|
+
let promise = pathPromises.get(dirPath);
|
|
841
|
+
if (promise) return promise;
|
|
842
|
+
promise = (async () => {
|
|
843
|
+
if (signal.aborted) throw signal.reason;
|
|
844
|
+
const destDir = await destDirPromise;
|
|
845
|
+
if (dirPath === destDir.symbolic) return "directory";
|
|
846
|
+
await ensureDirectoryExists(path.dirname(dirPath));
|
|
847
|
+
if (signal.aborted) throw signal.reason;
|
|
848
|
+
try {
|
|
849
|
+
const stat2 = await fs.lstat(dirPath);
|
|
850
|
+
if (stat2.isDirectory()) return "directory";
|
|
851
|
+
if (stat2.isSymbolicLink()) {
|
|
852
|
+
const realPath = await fs.realpath(dirPath);
|
|
853
|
+
validateBounds(realPath, destDir.real, `Symlink "${dirPath}" points outside the extraction directory.`);
|
|
854
|
+
if ((await fs.stat(realPath)).isDirectory()) return "directory";
|
|
855
|
+
}
|
|
856
|
+
throw new Error(`"${dirPath}" is not a valid directory component.`);
|
|
857
|
+
} catch (err) {
|
|
858
|
+
if (err.code === "ENOENT") {
|
|
859
|
+
await fs.mkdir(dirPath, { mode: dmode });
|
|
860
|
+
return "directory";
|
|
861
|
+
}
|
|
862
|
+
throw err;
|
|
863
|
+
}
|
|
864
|
+
})();
|
|
865
|
+
pathPromises.set(dirPath, promise);
|
|
866
|
+
return promise;
|
|
867
|
+
}, "ensureDirectoryExists");
|
|
868
|
+
return {
|
|
869
|
+
handler: {
|
|
870
|
+
onHeader(header) {
|
|
871
|
+
if (signal.aborted) return;
|
|
872
|
+
activeEntryStream = new PassThrough({ highWaterMark: header.size > 1048576 ? 524288 : void 0 });
|
|
873
|
+
const entryStream = activeEntryStream;
|
|
874
|
+
const startOperation = /* @__PURE__ */ __name(() => {
|
|
875
|
+
let opPromise;
|
|
876
|
+
try {
|
|
877
|
+
const transformed = transformHeader(header, options);
|
|
878
|
+
if (!transformed) {
|
|
879
|
+
entryStream.resume();
|
|
880
|
+
activeOps--;
|
|
881
|
+
processQueue();
|
|
882
|
+
return;
|
|
883
|
+
}
|
|
884
|
+
const name = normalizeHeaderName(transformed.name);
|
|
885
|
+
const target = path.join(path.resolve(directoryPath), name);
|
|
886
|
+
opPromise = (pathPromises.get(target) || Promise.resolve(void 0)).then(async (priorOp) => {
|
|
887
|
+
if (signal.aborted) throw signal.reason;
|
|
888
|
+
if (priorOp) {
|
|
889
|
+
if (priorOp === "directory" && transformed.type !== "directory" || priorOp !== "directory" && transformed.type === "directory") throw new Error(`Path conflict ${transformed.type} over existing ${priorOp} at "${transformed.name}"`);
|
|
890
|
+
}
|
|
891
|
+
try {
|
|
892
|
+
const destDir = await destDirPromise;
|
|
893
|
+
if (maxDepth !== Infinity && name.split("/").length > maxDepth) throw new Error("Tar exceeds max specified depth.");
|
|
894
|
+
const outPath = path.join(destDir.symbolic, name);
|
|
895
|
+
validateBounds(outPath, destDir.symbolic, `Entry "${transformed.name}" points outside the extraction directory.`);
|
|
896
|
+
const parentDir = path.dirname(outPath);
|
|
897
|
+
await ensureDirectoryExists(parentDir);
|
|
898
|
+
switch (transformed.type) {
|
|
899
|
+
case "directory":
|
|
900
|
+
await fs.mkdir(outPath, {
|
|
901
|
+
recursive: true,
|
|
902
|
+
mode: dmode ?? transformed.mode
|
|
903
|
+
});
|
|
904
|
+
break;
|
|
905
|
+
case "file": {
|
|
906
|
+
const fileStream = createWriteStream(outPath, {
|
|
907
|
+
mode: fmode ?? transformed.mode,
|
|
908
|
+
highWaterMark: transformed.size > 1048576 ? 524288 : void 0
|
|
909
|
+
});
|
|
910
|
+
await pipeline(entryStream, fileStream);
|
|
911
|
+
break;
|
|
912
|
+
}
|
|
913
|
+
case "symlink": {
|
|
914
|
+
const { linkname } = transformed;
|
|
915
|
+
if (!linkname) return transformed.type;
|
|
916
|
+
const target$1 = path.resolve(parentDir, linkname);
|
|
917
|
+
validateBounds(target$1, destDir.symbolic, `Symlink "${linkname}" points outside the extraction directory.`);
|
|
918
|
+
await fs.symlink(linkname, outPath);
|
|
919
|
+
break;
|
|
920
|
+
}
|
|
921
|
+
case "link": {
|
|
922
|
+
const { linkname } = transformed;
|
|
923
|
+
if (!linkname) return transformed.type;
|
|
924
|
+
const normalizedLink = normalizeUnicode(linkname);
|
|
925
|
+
if (path.isAbsolute(normalizedLink)) throw new Error(`Hardlink "${linkname}" points outside the extraction directory.`);
|
|
926
|
+
const linkTarget = path.join(destDir.symbolic, normalizedLink);
|
|
927
|
+
validateBounds(linkTarget, destDir.symbolic, `Hardlink "${linkname}" points outside the extraction directory.`);
|
|
928
|
+
await ensureDirectoryExists(path.dirname(linkTarget));
|
|
929
|
+
const realTargetParent = await fs.realpath(path.dirname(linkTarget));
|
|
930
|
+
const realLinkTarget = path.join(realTargetParent, path.basename(linkTarget));
|
|
931
|
+
validateBounds(realLinkTarget, destDir.real, `Hardlink "${linkname}" points outside the extraction directory.`);
|
|
932
|
+
if (linkTarget === outPath) return transformed.type;
|
|
933
|
+
const targetPromise = pathPromises.get(linkTarget);
|
|
934
|
+
if (targetPromise) await targetPromise;
|
|
935
|
+
await fs.link(linkTarget, outPath);
|
|
936
|
+
break;
|
|
937
|
+
}
|
|
938
|
+
default:
|
|
939
|
+
return transformed.type;
|
|
940
|
+
}
|
|
941
|
+
if (transformed.mtime) await (transformed.type === "symlink" ? fs.lutimes : fs.utimes)(outPath, transformed.mtime, transformed.mtime).catch(() => {
|
|
942
|
+
});
|
|
943
|
+
return transformed.type;
|
|
944
|
+
} finally {
|
|
945
|
+
if (!entryStream.readableEnded) entryStream.resume();
|
|
946
|
+
}
|
|
947
|
+
});
|
|
948
|
+
pathPromises.set(target, opPromise);
|
|
949
|
+
} catch (err) {
|
|
950
|
+
opPromise = Promise.reject(err);
|
|
951
|
+
abortController.abort(err);
|
|
952
|
+
}
|
|
953
|
+
opPromise.catch((err) => abortController.abort(err)).finally(() => {
|
|
954
|
+
activeOps--;
|
|
955
|
+
processQueue();
|
|
956
|
+
});
|
|
957
|
+
}, "startOperation");
|
|
958
|
+
opQueue.push(startOperation);
|
|
959
|
+
processQueue();
|
|
960
|
+
},
|
|
961
|
+
onData(chunk) {
|
|
962
|
+
if (!signal.aborted) activeEntryStream?.write(chunk);
|
|
963
|
+
},
|
|
964
|
+
onEndEntry() {
|
|
965
|
+
activeEntryStream?.end();
|
|
966
|
+
activeEntryStream = null;
|
|
967
|
+
},
|
|
968
|
+
onError(error) {
|
|
969
|
+
abortController.abort(error);
|
|
970
|
+
},
|
|
971
|
+
async process() {
|
|
972
|
+
processingEnded = true;
|
|
973
|
+
processQueue();
|
|
974
|
+
await drainPromise;
|
|
975
|
+
if (signal.aborted) throw signal.reason;
|
|
976
|
+
}
|
|
977
|
+
},
|
|
978
|
+
signal
|
|
979
|
+
};
|
|
980
|
+
}
|
|
981
|
+
__name(createFSHandler, "createFSHandler");
|
|
982
|
+
|
|
983
|
+
// src/cli/dirs.ts
|
|
984
|
+
var resolveUsingBranchInstall = /* @__PURE__ */ __name(async (packageManager, request) => {
|
|
985
|
+
const tempDirectory = await temporaryDirectory();
|
|
986
|
+
const name = request;
|
|
987
|
+
const version = versions[name] || await packageManager.latestVersion(request);
|
|
988
|
+
const getNpmTarballUrl = src_default.default || src_default;
|
|
989
|
+
const url = getNpmTarballUrl(request, version, {
|
|
990
|
+
registry: await packageManager.getRegistryURL()
|
|
991
|
+
});
|
|
992
|
+
const response = await fetch(url);
|
|
993
|
+
if (!response.ok || !response.body) {
|
|
994
|
+
throw new Error(`Failed to download tarball from ${url}`);
|
|
995
|
+
}
|
|
996
|
+
await pipeline2(
|
|
997
|
+
Readable2.fromWeb(response.body),
|
|
998
|
+
createGunzip(),
|
|
999
|
+
unpackTar(tempDirectory)
|
|
1000
|
+
);
|
|
1001
|
+
return join2(tempDirectory, "package");
|
|
1002
|
+
}, "resolveUsingBranchInstall");
|
|
1003
|
+
async function getRendererDir(packageManager, renderer) {
|
|
1004
|
+
const externalFramework = externalFrameworks.find((framework) => framework.name === renderer);
|
|
1005
|
+
const frameworkPackageName = externalFramework?.packageName || externalFramework?.renderer || `@storybook/${renderer}`;
|
|
1006
|
+
const packageJsonPath = join2(frameworkPackageName, "package.json");
|
|
1007
|
+
const errors = [];
|
|
1008
|
+
try {
|
|
1009
|
+
return resolvePackageDir(frameworkPackageName, process.cwd());
|
|
1010
|
+
} catch (e) {
|
|
1011
|
+
invariant(e instanceof Error);
|
|
1012
|
+
errors.push(e);
|
|
1013
|
+
}
|
|
1014
|
+
try {
|
|
1015
|
+
return await resolveUsingBranchInstall(packageManager, frameworkPackageName);
|
|
1016
|
+
} catch (e) {
|
|
1017
|
+
invariant(e instanceof Error);
|
|
1018
|
+
errors.push(e);
|
|
1019
|
+
}
|
|
1020
|
+
throw new Error(`Cannot find ${packageJsonPath}, ${errors.map((e) => e.stack).join("\n\n")}`);
|
|
1021
|
+
}
|
|
1022
|
+
__name(getRendererDir, "getRendererDir");
|
|
1023
|
+
|
|
1024
|
+
// src/cli/helpers.ts
|
|
1025
|
+
import { cpSync, existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
1026
|
+
import { cp, readFile as readFile2, writeFile } from "node:fs/promises";
|
|
1027
|
+
import { join as join3, resolve as resolve2 } from "node:path";
|
|
1028
|
+
import {
|
|
1029
|
+
frameworkToRenderer,
|
|
1030
|
+
getProjectRoot
|
|
1031
|
+
} from "storybook/internal/common";
|
|
1032
|
+
import { logger } from "storybook/internal/node-logger";
|
|
1033
|
+
var import_picocolors = __toESM(require_picocolors(), 1);
|
|
1034
|
+
import { coerce, satisfies } from "semver";
|
|
1035
|
+
|
|
1036
|
+
// ../node_modules/strip-json-comments/index.js
|
|
1037
|
+
var singleComment = Symbol("singleComment");
|
|
1038
|
+
var multiComment = Symbol("multiComment");
|
|
1039
|
+
var stripWithoutWhitespace = /* @__PURE__ */ __name(() => "", "stripWithoutWhitespace");
|
|
1040
|
+
var stripWithWhitespace = /* @__PURE__ */ __name((string, start, end) => string.slice(start, end).replace(/[^ \t\r\n]/g, " "), "stripWithWhitespace");
|
|
1041
|
+
var isEscaped = /* @__PURE__ */ __name((jsonString, quotePosition) => {
|
|
1042
|
+
let index = quotePosition - 1;
|
|
1043
|
+
let backslashCount = 0;
|
|
1044
|
+
while (jsonString[index] === "\\") {
|
|
1045
|
+
index -= 1;
|
|
1046
|
+
backslashCount += 1;
|
|
1047
|
+
}
|
|
1048
|
+
return Boolean(backslashCount % 2);
|
|
1049
|
+
}, "isEscaped");
|
|
1050
|
+
function stripJsonComments(jsonString, { whitespace = true, trailingCommas = false } = {}) {
|
|
1051
|
+
if (typeof jsonString !== "string") {
|
|
1052
|
+
throw new TypeError(`Expected argument \`jsonString\` to be a \`string\`, got \`${typeof jsonString}\``);
|
|
1053
|
+
}
|
|
1054
|
+
const strip = whitespace ? stripWithWhitespace : stripWithoutWhitespace;
|
|
1055
|
+
let isInsideString = false;
|
|
1056
|
+
let isInsideComment = false;
|
|
1057
|
+
let offset = 0;
|
|
1058
|
+
let buffer = "";
|
|
1059
|
+
let result = "";
|
|
1060
|
+
let commaIndex = -1;
|
|
1061
|
+
for (let index = 0; index < jsonString.length; index++) {
|
|
1062
|
+
const currentCharacter = jsonString[index];
|
|
1063
|
+
const nextCharacter = jsonString[index + 1];
|
|
1064
|
+
if (!isInsideComment && currentCharacter === '"') {
|
|
1065
|
+
const escaped = isEscaped(jsonString, index);
|
|
1066
|
+
if (!escaped) {
|
|
1067
|
+
isInsideString = !isInsideString;
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
if (isInsideString) {
|
|
1071
|
+
continue;
|
|
1072
|
+
}
|
|
1073
|
+
if (!isInsideComment && currentCharacter + nextCharacter === "//") {
|
|
1074
|
+
buffer += jsonString.slice(offset, index);
|
|
1075
|
+
offset = index;
|
|
1076
|
+
isInsideComment = singleComment;
|
|
1077
|
+
index++;
|
|
1078
|
+
} else if (isInsideComment === singleComment && currentCharacter + nextCharacter === "\r\n") {
|
|
1079
|
+
index++;
|
|
1080
|
+
isInsideComment = false;
|
|
1081
|
+
buffer += strip(jsonString, offset, index);
|
|
1082
|
+
offset = index;
|
|
1083
|
+
continue;
|
|
1084
|
+
} else if (isInsideComment === singleComment && currentCharacter === "\n") {
|
|
1085
|
+
isInsideComment = false;
|
|
1086
|
+
buffer += strip(jsonString, offset, index);
|
|
1087
|
+
offset = index;
|
|
1088
|
+
} else if (!isInsideComment && currentCharacter + nextCharacter === "/*") {
|
|
1089
|
+
buffer += jsonString.slice(offset, index);
|
|
1090
|
+
offset = index;
|
|
1091
|
+
isInsideComment = multiComment;
|
|
1092
|
+
index++;
|
|
1093
|
+
continue;
|
|
1094
|
+
} else if (isInsideComment === multiComment && currentCharacter + nextCharacter === "*/") {
|
|
1095
|
+
index++;
|
|
1096
|
+
isInsideComment = false;
|
|
1097
|
+
buffer += strip(jsonString, offset, index + 1);
|
|
1098
|
+
offset = index + 1;
|
|
1099
|
+
continue;
|
|
1100
|
+
} else if (trailingCommas && !isInsideComment) {
|
|
1101
|
+
if (commaIndex !== -1) {
|
|
1102
|
+
if (currentCharacter === "}" || currentCharacter === "]") {
|
|
1103
|
+
buffer += jsonString.slice(offset, index);
|
|
1104
|
+
result += strip(buffer, 0, 1) + buffer.slice(1);
|
|
1105
|
+
buffer = "";
|
|
1106
|
+
offset = index;
|
|
1107
|
+
commaIndex = -1;
|
|
1108
|
+
} else if (currentCharacter !== " " && currentCharacter !== " " && currentCharacter !== "\r" && currentCharacter !== "\n") {
|
|
1109
|
+
buffer += jsonString.slice(offset, index);
|
|
1110
|
+
offset = index;
|
|
1111
|
+
commaIndex = -1;
|
|
1112
|
+
}
|
|
1113
|
+
} else if (currentCharacter === ",") {
|
|
1114
|
+
result += buffer + jsonString.slice(offset, index);
|
|
1115
|
+
buffer = "";
|
|
1116
|
+
offset = index;
|
|
1117
|
+
commaIndex = index;
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
}
|
|
1121
|
+
const remaining = isInsideComment === singleComment ? strip(jsonString, offset) : jsonString.slice(offset);
|
|
1122
|
+
return result + buffer + remaining;
|
|
1123
|
+
}
|
|
1124
|
+
__name(stripJsonComments, "stripJsonComments");
|
|
1125
|
+
|
|
1126
|
+
// src/cli/helpers.ts
|
|
1127
|
+
function readFileAsJson(jsonPath, allowComments) {
|
|
1128
|
+
const filePath = resolve2(jsonPath);
|
|
1129
|
+
if (!existsSync(filePath)) {
|
|
1130
|
+
return false;
|
|
1131
|
+
}
|
|
1132
|
+
const fileContent = readFileSync(filePath, "utf8");
|
|
1133
|
+
const jsonContent = allowComments ? stripJsonComments(fileContent) : fileContent;
|
|
1134
|
+
try {
|
|
1135
|
+
return JSON.parse(jsonContent);
|
|
1136
|
+
} catch (e) {
|
|
1137
|
+
logger.error(import_picocolors.default.red(`Invalid json in file: ${filePath}`));
|
|
1138
|
+
throw e;
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
__name(readFileAsJson, "readFileAsJson");
|
|
1142
|
+
var writeFileAsJson = /* @__PURE__ */ __name((jsonPath, content) => {
|
|
1143
|
+
const filePath = resolve2(jsonPath);
|
|
1144
|
+
if (!existsSync(filePath)) {
|
|
1145
|
+
return false;
|
|
1146
|
+
}
|
|
1147
|
+
writeFileSync(filePath, `${JSON.stringify(content, null, 2)}
|
|
1148
|
+
`);
|
|
1149
|
+
return true;
|
|
1150
|
+
}, "writeFileAsJson");
|
|
1151
|
+
async function getBabelDependencies(packageManager) {
|
|
1152
|
+
const dependenciesToAdd = [];
|
|
1153
|
+
let babelLoaderVersion = "^8.0.0-0";
|
|
1154
|
+
const babelCoreVersion = packageManager.getDependencyVersion("babel-core");
|
|
1155
|
+
if (!babelCoreVersion) {
|
|
1156
|
+
if (!packageManager.getDependencyVersion("@babel/core")) {
|
|
1157
|
+
const babelCoreInstallVersion = await packageManager.getVersion("@babel/core");
|
|
1158
|
+
dependenciesToAdd.push(`@babel/core@${babelCoreInstallVersion}`);
|
|
1159
|
+
}
|
|
1160
|
+
} else {
|
|
1161
|
+
const latestCompatibleBabelVersion = await packageManager.latestVersion(
|
|
1162
|
+
"babel-core",
|
|
1163
|
+
babelCoreVersion
|
|
1164
|
+
);
|
|
1165
|
+
if (latestCompatibleBabelVersion && satisfies(latestCompatibleBabelVersion, "^6.0.0")) {
|
|
1166
|
+
babelLoaderVersion = "^7.0.0";
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
if (!packageManager.getDependencyVersion("babel-loader")) {
|
|
1170
|
+
const babelLoaderInstallVersion = await packageManager.getVersion(
|
|
1171
|
+
"babel-loader",
|
|
1172
|
+
babelLoaderVersion
|
|
1173
|
+
);
|
|
1174
|
+
dependenciesToAdd.push(`babel-loader@${babelLoaderInstallVersion}`);
|
|
1175
|
+
}
|
|
1176
|
+
return dependenciesToAdd;
|
|
1177
|
+
}
|
|
1178
|
+
__name(getBabelDependencies, "getBabelDependencies");
|
|
1179
|
+
function addToDevDependenciesIfNotPresent(packageJson, name, packageVersion) {
|
|
1180
|
+
if (!packageJson.dependencies?.[name] && !packageJson.devDependencies?.[name]) {
|
|
1181
|
+
if (packageJson.devDependencies) {
|
|
1182
|
+
packageJson.devDependencies[name] = packageVersion;
|
|
1183
|
+
} else {
|
|
1184
|
+
packageJson.devDependencies = {
|
|
1185
|
+
[name]: packageVersion
|
|
1186
|
+
};
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
__name(addToDevDependenciesIfNotPresent, "addToDevDependenciesIfNotPresent");
|
|
1191
|
+
function copyTemplate(templateRoot, destination = ".") {
|
|
1192
|
+
const templateDir = resolve2(templateRoot, `template-csf/`);
|
|
1193
|
+
if (!existsSync(templateDir)) {
|
|
1194
|
+
throw new Error(`Couldn't find template dir`);
|
|
1195
|
+
}
|
|
1196
|
+
cpSync(templateDir, destination, { recursive: true });
|
|
1197
|
+
}
|
|
1198
|
+
__name(copyTemplate, "copyTemplate");
|
|
1199
|
+
var frameworkToDefaultBuilder = {
|
|
1200
|
+
angular: "webpack5" /* Webpack5 */,
|
|
1201
|
+
ember: "webpack5" /* Webpack5 */,
|
|
1202
|
+
"html-vite": "vite" /* Vite */,
|
|
1203
|
+
nextjs: "webpack5" /* Webpack5 */,
|
|
1204
|
+
nuxt: "vite" /* Vite */,
|
|
1205
|
+
"nextjs-vite": "vite" /* Vite */,
|
|
1206
|
+
"preact-vite": "vite" /* Vite */,
|
|
1207
|
+
qwik: "vite" /* Vite */,
|
|
1208
|
+
"react-native-web-vite": "vite" /* Vite */,
|
|
1209
|
+
"react-vite": "vite" /* Vite */,
|
|
1210
|
+
"react-webpack5": "webpack5" /* Webpack5 */,
|
|
1211
|
+
"server-webpack5": "webpack5" /* Webpack5 */,
|
|
1212
|
+
solid: "vite" /* Vite */,
|
|
1213
|
+
"svelte-vite": "vite" /* Vite */,
|
|
1214
|
+
sveltekit: "vite" /* Vite */,
|
|
1215
|
+
"vue3-vite": "vite" /* Vite */,
|
|
1216
|
+
"web-components-vite": "vite" /* Vite */,
|
|
1217
|
+
// Only to pass type checking, will never be used
|
|
1218
|
+
"react-rsbuild": "rsbuild" /* Rsbuild */,
|
|
1219
|
+
"vue3-rsbuild": "rsbuild" /* Rsbuild */
|
|
1220
|
+
};
|
|
1221
|
+
async function getVersionSafe(packageManager, packageName) {
|
|
1222
|
+
try {
|
|
1223
|
+
let version = await packageManager.getInstalledVersion(packageName);
|
|
1224
|
+
if (!version) {
|
|
1225
|
+
const deps = packageManager.getAllDependencies();
|
|
1226
|
+
const versionSpecifier = deps[packageName];
|
|
1227
|
+
version = versionSpecifier ?? "";
|
|
1228
|
+
}
|
|
1229
|
+
const coerced = coerce(version, { includePrerelease: true });
|
|
1230
|
+
return coerced?.toString();
|
|
1231
|
+
} catch (err) {
|
|
1232
|
+
}
|
|
1233
|
+
return void 0;
|
|
1234
|
+
}
|
|
1235
|
+
__name(getVersionSafe, "getVersionSafe");
|
|
1236
|
+
var cliStoriesTargetPath = /* @__PURE__ */ __name(async () => {
|
|
1237
|
+
if (existsSync("./src")) {
|
|
1238
|
+
return "./src/stories";
|
|
1239
|
+
}
|
|
1240
|
+
return "./stories";
|
|
1241
|
+
}, "cliStoriesTargetPath");
|
|
1242
|
+
async function copyTemplateFiles({
|
|
1243
|
+
packageManager,
|
|
1244
|
+
templateLocation,
|
|
1245
|
+
language,
|
|
1246
|
+
destination,
|
|
1247
|
+
commonAssetsDir,
|
|
1248
|
+
features
|
|
1249
|
+
}) {
|
|
1250
|
+
const languageFolderMapping = {
|
|
1251
|
+
["javascript" /* JAVASCRIPT */]: "js",
|
|
1252
|
+
["typescript" /* TYPESCRIPT */]: "ts"
|
|
1253
|
+
};
|
|
1254
|
+
const templatePath = /* @__PURE__ */ __name(async () => {
|
|
1255
|
+
const baseDir = await getRendererDir(packageManager, templateLocation);
|
|
1256
|
+
const assetsDir = join3(baseDir, "template", "cli");
|
|
1257
|
+
const assetsLanguage = join3(assetsDir, languageFolderMapping[language]);
|
|
1258
|
+
const assetsJS = join3(assetsDir, languageFolderMapping["javascript" /* JAVASCRIPT */]);
|
|
1259
|
+
const assetsTS = join3(assetsDir, languageFolderMapping.typescript);
|
|
1260
|
+
if (existsSync(assetsLanguage)) {
|
|
1261
|
+
return assetsLanguage;
|
|
1262
|
+
}
|
|
1263
|
+
if (existsSync(assetsTS)) {
|
|
1264
|
+
return assetsTS;
|
|
1265
|
+
}
|
|
1266
|
+
if (existsSync(assetsJS)) {
|
|
1267
|
+
return assetsJS;
|
|
1268
|
+
}
|
|
1269
|
+
if (existsSync(assetsDir)) {
|
|
1270
|
+
return assetsDir;
|
|
1271
|
+
}
|
|
1272
|
+
throw new Error(`Unsupported renderer: ${templateLocation} (${baseDir})`);
|
|
1273
|
+
}, "templatePath");
|
|
1274
|
+
const destinationPath = destination ?? await cliStoriesTargetPath();
|
|
1275
|
+
const filter = /* @__PURE__ */ __name((file) => features.includes("docs") || !file.endsWith(".mdx"), "filter");
|
|
1276
|
+
if (commonAssetsDir) {
|
|
1277
|
+
await cp(commonAssetsDir, destinationPath, { recursive: true, filter });
|
|
1278
|
+
}
|
|
1279
|
+
await cp(await templatePath(), destinationPath, { recursive: true, filter });
|
|
1280
|
+
if (commonAssetsDir && features.includes("docs")) {
|
|
1281
|
+
let rendererType = frameworkToRenderer[templateLocation] || "react";
|
|
1282
|
+
if (rendererType === "vue3") {
|
|
1283
|
+
rendererType = "vue";
|
|
1284
|
+
}
|
|
1285
|
+
await adjustTemplate(join3(destinationPath, "Configure.mdx"), { renderer: rendererType });
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
__name(copyTemplateFiles, "copyTemplateFiles");
|
|
1289
|
+
async function adjustTemplate(templatePath, templateData) {
|
|
1290
|
+
let template = await readFile2(templatePath, { encoding: "utf8" });
|
|
1291
|
+
Object.keys(templateData).forEach((key) => {
|
|
1292
|
+
template = template.replaceAll(`{{${key}}}`, `${templateData[key]}`);
|
|
1293
|
+
});
|
|
1294
|
+
await writeFile(templatePath, template);
|
|
1295
|
+
}
|
|
1296
|
+
__name(adjustTemplate, "adjustTemplate");
|
|
1297
|
+
async function isNxProject() {
|
|
1298
|
+
return up("nx.json", { last: getProjectRoot() });
|
|
1299
|
+
}
|
|
1300
|
+
__name(isNxProject, "isNxProject");
|
|
1301
|
+
function coerceSemver(version) {
|
|
1302
|
+
const coercedSemver = coerce(version);
|
|
1303
|
+
invariant(coercedSemver != null, `Could not coerce ${version} into a semver.`);
|
|
1304
|
+
return coercedSemver;
|
|
1305
|
+
}
|
|
1306
|
+
__name(coerceSemver, "coerceSemver");
|
|
1307
|
+
function hasStorybookDependencies(packageManager) {
|
|
1308
|
+
const currentPackageDeps = packageManager.getAllDependencies();
|
|
1309
|
+
return Object.keys(currentPackageDeps).some((dep) => dep.includes("storybook"));
|
|
1310
|
+
}
|
|
1311
|
+
__name(hasStorybookDependencies, "hasStorybookDependencies");
|
|
1312
|
+
|
|
1313
|
+
// src/cli/detect.ts
|
|
1314
|
+
import { existsSync as existsSync2 } from "node:fs";
|
|
1315
|
+
import { resolve as resolve3 } from "node:path";
|
|
1316
|
+
import { HandledError, commandLog, getProjectRoot as getProjectRoot2 } from "storybook/internal/common";
|
|
1317
|
+
import { logger as logger2 } from "storybook/internal/node-logger";
|
|
1318
|
+
var import_prompts = __toESM(require_prompts(), 1);
|
|
1319
|
+
import semver from "semver";
|
|
1320
|
+
var viteConfigFiles = ["vite.config.ts", "vite.config.js", "vite.config.mjs"];
|
|
1321
|
+
var webpackConfigFiles = ["webpack.config.js"];
|
|
1322
|
+
var hasDependency = /* @__PURE__ */ __name((packageJson, name, matcher) => {
|
|
1323
|
+
const version = packageJson.dependencies?.[name] || packageJson.devDependencies?.[name];
|
|
1324
|
+
if (version && typeof matcher === "function") {
|
|
1325
|
+
return matcher(version);
|
|
1326
|
+
}
|
|
1327
|
+
return !!version;
|
|
1328
|
+
}, "hasDependency");
|
|
1329
|
+
var hasPeerDependency = /* @__PURE__ */ __name((packageJson, name, matcher) => {
|
|
1330
|
+
const version = packageJson.peerDependencies?.[name];
|
|
1331
|
+
if (version && typeof matcher === "function") {
|
|
1332
|
+
return matcher(version);
|
|
1333
|
+
}
|
|
1334
|
+
return !!version;
|
|
1335
|
+
}, "hasPeerDependency");
|
|
1336
|
+
var getFrameworkPreset = /* @__PURE__ */ __name((packageJson, framework) => {
|
|
1337
|
+
const matcher = {
|
|
1338
|
+
dependencies: [false],
|
|
1339
|
+
peerDependencies: [false],
|
|
1340
|
+
files: [false]
|
|
1341
|
+
};
|
|
1342
|
+
const { preset, files, dependencies, peerDependencies, matcherFunction } = framework;
|
|
1343
|
+
let dependencySearches = [];
|
|
1344
|
+
if (Array.isArray(dependencies)) {
|
|
1345
|
+
dependencySearches = dependencies.map((name) => [name, void 0]);
|
|
1346
|
+
} else if (typeof dependencies === "object") {
|
|
1347
|
+
dependencySearches = Object.entries(dependencies);
|
|
1348
|
+
}
|
|
1349
|
+
if (dependencySearches.length > 0) {
|
|
1350
|
+
matcher.dependencies = dependencySearches.map(
|
|
1351
|
+
([name, matchFn]) => hasDependency(packageJson, name, matchFn)
|
|
1352
|
+
);
|
|
1353
|
+
}
|
|
1354
|
+
let peerDependencySearches = [];
|
|
1355
|
+
if (Array.isArray(peerDependencies)) {
|
|
1356
|
+
peerDependencySearches = peerDependencies.map((name) => [name, void 0]);
|
|
1357
|
+
} else if (typeof peerDependencies === "object") {
|
|
1358
|
+
peerDependencySearches = Object.entries(peerDependencies);
|
|
1359
|
+
}
|
|
1360
|
+
if (peerDependencySearches.length > 0) {
|
|
1361
|
+
matcher.peerDependencies = peerDependencySearches.map(
|
|
1362
|
+
([name, matchFn]) => hasPeerDependency(packageJson, name, matchFn)
|
|
1363
|
+
);
|
|
1364
|
+
}
|
|
1365
|
+
if (Array.isArray(files) && files.length > 0) {
|
|
1366
|
+
matcher.files = files.map((name) => existsSync2(name));
|
|
1367
|
+
}
|
|
1368
|
+
return matcherFunction(matcher) ? preset : null;
|
|
1369
|
+
}, "getFrameworkPreset");
|
|
1370
|
+
function detectFrameworkPreset(packageJson = {}) {
|
|
1371
|
+
const result = [...supportedTemplates, unsupportedTemplate].find((framework) => {
|
|
1372
|
+
return getFrameworkPreset(packageJson, framework) !== null;
|
|
1373
|
+
});
|
|
1374
|
+
return result ? result.preset : "UNDETECTED" /* UNDETECTED */;
|
|
1375
|
+
}
|
|
1376
|
+
__name(detectFrameworkPreset, "detectFrameworkPreset");
|
|
1377
|
+
async function detectBuilder(packageManager, projectType) {
|
|
1378
|
+
const viteConfig = any(viteConfigFiles, { last: getProjectRoot2() });
|
|
1379
|
+
const webpackConfig = any(webpackConfigFiles, { last: getProjectRoot2() });
|
|
1380
|
+
const dependencies = packageManager.getAllDependencies();
|
|
1381
|
+
if (viteConfig || dependencies.vite && dependencies.webpack === void 0) {
|
|
1382
|
+
commandLog("Detected Vite project. Setting builder to Vite")();
|
|
1383
|
+
return "vite" /* Vite */;
|
|
1384
|
+
}
|
|
1385
|
+
if (webpackConfig || (dependencies.webpack || dependencies["@nuxt/webpack-builder"]) && dependencies.vite !== void 0) {
|
|
1386
|
+
commandLog("Detected webpack project. Setting builder to webpack")();
|
|
1387
|
+
return "webpack5" /* Webpack5 */;
|
|
1388
|
+
}
|
|
1389
|
+
switch (projectType) {
|
|
1390
|
+
case "REACT_NATIVE_AND_RNW" /* REACT_NATIVE_AND_RNW */:
|
|
1391
|
+
case "REACT_NATIVE_WEB" /* REACT_NATIVE_WEB */:
|
|
1392
|
+
return "vite" /* Vite */;
|
|
1393
|
+
case "REACT_SCRIPTS" /* REACT_SCRIPTS */:
|
|
1394
|
+
case "ANGULAR" /* ANGULAR */:
|
|
1395
|
+
case "REACT_NATIVE" /* REACT_NATIVE */:
|
|
1396
|
+
// technically react native doesn't use webpack, we just want to set something
|
|
1397
|
+
case "NEXTJS" /* NEXTJS */:
|
|
1398
|
+
case "EMBER" /* EMBER */:
|
|
1399
|
+
return "webpack5" /* Webpack5 */;
|
|
1400
|
+
case "NUXT" /* NUXT */:
|
|
1401
|
+
return "vite" /* Vite */;
|
|
1402
|
+
default:
|
|
1403
|
+
const { builder } = await (0, import_prompts.default)(
|
|
1404
|
+
{
|
|
1405
|
+
type: "select",
|
|
1406
|
+
name: "builder",
|
|
1407
|
+
message: "\nWe were not able to detect the right builder for your project. Please select one:",
|
|
1408
|
+
choices: [
|
|
1409
|
+
{ title: "Vite", value: "vite" /* Vite */ },
|
|
1410
|
+
{ title: "Webpack 5", value: "webpack5" /* Webpack5 */ }
|
|
1411
|
+
]
|
|
1412
|
+
},
|
|
1413
|
+
{
|
|
1414
|
+
onCancel: /* @__PURE__ */ __name(() => {
|
|
1415
|
+
throw new HandledError("Canceled by the user");
|
|
1416
|
+
}, "onCancel")
|
|
1417
|
+
}
|
|
1418
|
+
);
|
|
1419
|
+
return builder;
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
__name(detectBuilder, "detectBuilder");
|
|
1423
|
+
function isStorybookInstantiated(configDir = resolve3(process.cwd(), ".storybook")) {
|
|
1424
|
+
return existsSync2(configDir);
|
|
1425
|
+
}
|
|
1426
|
+
__name(isStorybookInstantiated, "isStorybookInstantiated");
|
|
1427
|
+
async function detectPnp() {
|
|
1428
|
+
return !!any([".pnp.js", ".pnp.cjs"]);
|
|
1429
|
+
}
|
|
1430
|
+
__name(detectPnp, "detectPnp");
|
|
1431
|
+
async function detectLanguage(packageManager) {
|
|
1432
|
+
let language = "javascript" /* JAVASCRIPT */;
|
|
1433
|
+
if (existsSync2("jsconfig.json")) {
|
|
1434
|
+
return language;
|
|
1435
|
+
}
|
|
1436
|
+
const isTypescriptDirectDependency = !!packageManager.getAllDependencies().typescript;
|
|
1437
|
+
const getModulePackageJSONVersion = /* @__PURE__ */ __name(async (pkg) => {
|
|
1438
|
+
return (await packageManager.getModulePackageJSON(pkg))?.version ?? null;
|
|
1439
|
+
}, "getModulePackageJSONVersion");
|
|
1440
|
+
const [
|
|
1441
|
+
typescriptVersion,
|
|
1442
|
+
prettierVersion,
|
|
1443
|
+
babelPluginTransformTypescriptVersion,
|
|
1444
|
+
typescriptEslintParserVersion,
|
|
1445
|
+
eslintPluginStorybookVersion
|
|
1446
|
+
] = await Promise.all([
|
|
1447
|
+
getModulePackageJSONVersion("typescript"),
|
|
1448
|
+
getModulePackageJSONVersion("prettier"),
|
|
1449
|
+
getModulePackageJSONVersion("@babel/plugin-transform-typescript"),
|
|
1450
|
+
getModulePackageJSONVersion("@typescript-eslint/parser"),
|
|
1451
|
+
getModulePackageJSONVersion("eslint-plugin-storybook")
|
|
1452
|
+
]);
|
|
1453
|
+
if (isTypescriptDirectDependency && typescriptVersion) {
|
|
1454
|
+
if (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"))) {
|
|
1455
|
+
language = "typescript" /* TYPESCRIPT */;
|
|
1456
|
+
} else {
|
|
1457
|
+
logger2.warn(
|
|
1458
|
+
"Detected TypeScript < 4.9 or incompatible tooling, populating with JavaScript examples"
|
|
1459
|
+
);
|
|
1460
|
+
}
|
|
1461
|
+
} else {
|
|
1462
|
+
if (existsSync2("tsconfig.json")) {
|
|
1463
|
+
language = "typescript" /* TYPESCRIPT */;
|
|
1464
|
+
}
|
|
1465
|
+
}
|
|
1466
|
+
return language;
|
|
1467
|
+
}
|
|
1468
|
+
__name(detectLanguage, "detectLanguage");
|
|
1469
|
+
async function detect(packageManager, options = {}) {
|
|
1470
|
+
try {
|
|
1471
|
+
if (await isNxProject()) {
|
|
1472
|
+
return "NX" /* NX */;
|
|
1473
|
+
}
|
|
1474
|
+
if (options.html) {
|
|
1475
|
+
return "HTML" /* HTML */;
|
|
1476
|
+
}
|
|
1477
|
+
const { packageJson } = packageManager.primaryPackageJson;
|
|
1478
|
+
return detectFrameworkPreset(packageJson);
|
|
1479
|
+
} catch (e) {
|
|
1480
|
+
return "UNDETECTED" /* UNDETECTED */;
|
|
1481
|
+
}
|
|
1482
|
+
}
|
|
1483
|
+
__name(detect, "detect");
|
|
1484
|
+
|
|
1485
|
+
export {
|
|
1486
|
+
externalFrameworks,
|
|
1487
|
+
SUPPORTED_RENDERERS,
|
|
1488
|
+
ProjectType,
|
|
1489
|
+
CoreBuilder,
|
|
1490
|
+
CoreWebpackCompilers,
|
|
1491
|
+
CommunityBuilder,
|
|
1492
|
+
compilerNameToCoreCompiler,
|
|
1493
|
+
builderNameToCoreBuilder,
|
|
1494
|
+
SupportedLanguage,
|
|
1495
|
+
supportedTemplates,
|
|
1496
|
+
unsupportedTemplate,
|
|
1497
|
+
installableProjectTypes,
|
|
1498
|
+
getRendererDir,
|
|
1499
|
+
readFileAsJson,
|
|
1500
|
+
writeFileAsJson,
|
|
1501
|
+
getBabelDependencies,
|
|
1502
|
+
addToDevDependenciesIfNotPresent,
|
|
1503
|
+
copyTemplate,
|
|
1504
|
+
frameworkToDefaultBuilder,
|
|
1505
|
+
getVersionSafe,
|
|
1506
|
+
cliStoriesTargetPath,
|
|
1507
|
+
copyTemplateFiles,
|
|
1508
|
+
adjustTemplate,
|
|
1509
|
+
isNxProject,
|
|
1510
|
+
coerceSemver,
|
|
1511
|
+
hasStorybookDependencies,
|
|
1512
|
+
detectFrameworkPreset,
|
|
1513
|
+
detectBuilder,
|
|
1514
|
+
isStorybookInstantiated,
|
|
1515
|
+
detectPnp,
|
|
1516
|
+
detectLanguage,
|
|
1517
|
+
detect
|
|
1518
|
+
};
|