@storybook/vue3 9.2.0-alpha.3 → 10.0.0-beta.0
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/README.md +4 -0
- package/dist/_browser-chunks/chunk-GZHEVVQL.js +427 -0
- package/dist/_browser-chunks/chunk-JFJ5UJ7Q.js +11 -0
- package/dist/entry-preview-docs.js +367 -11
- package/dist/entry-preview.js +17 -1
- package/dist/index.d.ts +50 -9
- package/dist/index.js +70 -1
- package/dist/playwright.js +7 -1
- package/dist/preset.js +26 -1
- package/package.json +17 -40
- package/preset.js +1 -1
- package/dist/chunk-CEH6MNVV.mjs +0 -3
- package/dist/chunk-DYBVISFM.mjs +0 -8
- package/dist/entry-preview-docs.d.ts +0 -10
- package/dist/entry-preview-docs.mjs +0 -23
- package/dist/entry-preview.d.ts +0 -24
- package/dist/entry-preview.mjs +0 -2
- package/dist/index.mjs +0 -10
- package/dist/playwright.mjs +0 -2
- package/dist/preset.d.ts +0 -5
- package/dist/public-types-e4ebb831.d.ts +0 -40
- package/dist/render-0377a2e9.d.ts +0 -9
- package/dist/types-1ede6954.d.ts +0 -14
@@ -1,16 +1,372 @@
|
|
1
|
-
|
1
|
+
import {
|
2
|
+
__name
|
3
|
+
} from "./_browser-chunks/chunk-JFJ5UJ7Q.js";
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
+
// src/docs/sourceDecorator.ts
|
6
|
+
import { SourceType } from "storybook/internal/docs-tools";
|
7
|
+
import { emitTransformCode, useEffect } from "storybook/preview-api";
|
8
|
+
import { isVNode } from "vue";
|
9
|
+
var TRACKING_SYMBOL = Symbol("DEEP_ACCESS_SYMBOL");
|
10
|
+
var isProxy = /* @__PURE__ */ __name((obj) => !!(obj && typeof obj === "object" && TRACKING_SYMBOL in obj), "isProxy");
|
11
|
+
var sourceDecorator = /* @__PURE__ */ __name((storyFn, ctx) => {
|
12
|
+
const story = storyFn();
|
13
|
+
useEffect(() => {
|
14
|
+
const sourceCode = generateSourceCode(ctx);
|
15
|
+
if (shouldSkipSourceCodeGeneration(ctx)) {
|
16
|
+
return;
|
17
|
+
}
|
18
|
+
emitTransformCode(sourceCode, ctx);
|
19
|
+
});
|
20
|
+
return story;
|
21
|
+
}, "sourceDecorator");
|
22
|
+
var generateSourceCode = /* @__PURE__ */ __name((ctx) => {
|
23
|
+
const sourceCodeContext = {
|
24
|
+
imports: {},
|
25
|
+
scriptVariables: {}
|
26
|
+
};
|
27
|
+
const { displayName, slotNames, eventNames } = parseDocgenInfo(ctx.component);
|
28
|
+
const props = generatePropsSourceCode(ctx.args, slotNames, eventNames, sourceCodeContext);
|
29
|
+
const slotSourceCode = generateSlotSourceCode(ctx.args, slotNames, sourceCodeContext);
|
30
|
+
const componentName = displayName || ctx.title.split("/").at(-1);
|
31
|
+
const templateCode = slotSourceCode ? `<${componentName} ${props}> ${slotSourceCode} </${componentName}>` : `<${componentName} ${props} />`;
|
32
|
+
const variablesCode = Object.entries(sourceCodeContext.scriptVariables).map(([name, value]) => `const ${name} = ${value};`).join("\n\n");
|
33
|
+
const importsCode = Object.entries(sourceCodeContext.imports).map(([packageName, imports]) => {
|
34
|
+
return `import { ${Array.from(imports.values()).sort().join(", ")} } from "${packageName}";`;
|
35
|
+
}).join("\n");
|
36
|
+
const template = `<template>
|
5
37
|
${templateCode}
|
6
|
-
</template>`;
|
7
|
-
|
38
|
+
</template>`;
|
39
|
+
if (!importsCode && !variablesCode) {
|
40
|
+
return template;
|
41
|
+
}
|
42
|
+
return `<script lang="ts" setup>
|
43
|
+
${importsCode ? `${importsCode}
|
8
44
|
|
9
|
-
${variablesCode}
|
10
|
-
|
45
|
+
${variablesCode}` : variablesCode}
|
46
|
+
<\/script>
|
11
47
|
|
12
|
-
${template}
|
48
|
+
${template}`;
|
49
|
+
}, "generateSourceCode");
|
50
|
+
var shouldSkipSourceCodeGeneration = /* @__PURE__ */ __name((context) => {
|
51
|
+
const sourceParams = context?.parameters.docs?.source;
|
52
|
+
if (sourceParams?.type === SourceType.DYNAMIC) {
|
53
|
+
return false;
|
54
|
+
}
|
55
|
+
const isArgsStory = context?.parameters.__isArgsStory;
|
56
|
+
return !isArgsStory || sourceParams?.code || sourceParams?.type === SourceType.CODE;
|
57
|
+
}, "shouldSkipSourceCodeGeneration");
|
58
|
+
var parseDocgenInfo = /* @__PURE__ */ __name((component) => {
|
59
|
+
if (!component || !("__docgenInfo" in component) || !component.__docgenInfo || typeof component.__docgenInfo !== "object") {
|
60
|
+
return {
|
61
|
+
displayName: component?.__name,
|
62
|
+
eventNames: [],
|
63
|
+
slotNames: []
|
64
|
+
};
|
65
|
+
}
|
66
|
+
const docgenInfo = component.__docgenInfo;
|
67
|
+
const displayName = "displayName" in docgenInfo && typeof docgenInfo.displayName === "string" ? docgenInfo.displayName : void 0;
|
68
|
+
const parseNames = /* @__PURE__ */ __name((key) => {
|
69
|
+
if (!(key in docgenInfo) || !Array.isArray(docgenInfo[key])) {
|
70
|
+
return [];
|
71
|
+
}
|
72
|
+
const values = docgenInfo[key];
|
73
|
+
return values.map((i) => i && typeof i === "object" && "name" in i ? i.name : void 0).filter((i) => typeof i === "string");
|
74
|
+
}, "parseNames");
|
75
|
+
return {
|
76
|
+
displayName: displayName || component.__name,
|
77
|
+
slotNames: parseNames("slots").sort((a, b) => {
|
78
|
+
if (a === "default") {
|
79
|
+
return -1;
|
80
|
+
}
|
81
|
+
if (b === "default") {
|
82
|
+
return 1;
|
83
|
+
}
|
84
|
+
return a.localeCompare(b);
|
85
|
+
}),
|
86
|
+
eventNames: parseNames("events")
|
87
|
+
};
|
88
|
+
}, "parseDocgenInfo");
|
89
|
+
var generatePropsSourceCode = /* @__PURE__ */ __name((args, slotNames, eventNames, ctx) => {
|
90
|
+
const properties = [];
|
91
|
+
Object.entries(args).forEach(([propName, value]) => {
|
92
|
+
if (slotNames.includes(propName)) {
|
93
|
+
return;
|
94
|
+
}
|
95
|
+
if (value == void 0) {
|
96
|
+
return;
|
97
|
+
}
|
98
|
+
if (isProxy(value)) {
|
99
|
+
value = value.toString();
|
100
|
+
}
|
101
|
+
switch (typeof value) {
|
102
|
+
case "string":
|
103
|
+
if (value === "") {
|
104
|
+
return;
|
105
|
+
}
|
106
|
+
properties.push({
|
107
|
+
name: propName,
|
108
|
+
value: value.includes('"') ? `'${value}'` : `"${value}"`,
|
109
|
+
templateFn: /* @__PURE__ */ __name((name, propValue) => `${name}=${propValue}`, "templateFn")
|
110
|
+
});
|
111
|
+
break;
|
112
|
+
case "number":
|
113
|
+
properties.push({
|
114
|
+
name: propName,
|
115
|
+
value: value.toString(),
|
116
|
+
templateFn: /* @__PURE__ */ __name((name, propValue) => `:${name}="${propValue}"`, "templateFn")
|
117
|
+
});
|
118
|
+
break;
|
119
|
+
case "bigint":
|
120
|
+
properties.push({
|
121
|
+
name: propName,
|
122
|
+
value: `BigInt(${value.toString()})`,
|
123
|
+
templateFn: /* @__PURE__ */ __name((name, propValue) => `:${name}="${propValue}"`, "templateFn")
|
124
|
+
});
|
125
|
+
break;
|
126
|
+
case "boolean":
|
127
|
+
properties.push({
|
128
|
+
name: propName,
|
129
|
+
value: value ? "true" : "false",
|
130
|
+
templateFn: /* @__PURE__ */ __name((name, propValue) => propValue === "true" ? name : `:${name}="false"`, "templateFn")
|
131
|
+
});
|
132
|
+
break;
|
133
|
+
case "symbol":
|
134
|
+
properties.push({
|
135
|
+
name: propName,
|
136
|
+
value: `Symbol(${value.description ? `'${value.description}'` : ""})`,
|
137
|
+
templateFn: /* @__PURE__ */ __name((name, propValue) => `:${name}="${propValue}"`, "templateFn")
|
138
|
+
});
|
139
|
+
break;
|
140
|
+
case "object": {
|
141
|
+
properties.push({
|
142
|
+
name: propName,
|
143
|
+
value: formatObject(value ?? {}),
|
144
|
+
// to follow Vue best practices, complex values like object and arrays are
|
145
|
+
// usually placed inside the <script setup> block instead of inlining them in the <template>
|
146
|
+
templateFn: void 0
|
147
|
+
});
|
148
|
+
break;
|
149
|
+
}
|
150
|
+
case "function":
|
151
|
+
break;
|
152
|
+
}
|
153
|
+
});
|
154
|
+
properties.sort((a, b) => a.name.localeCompare(b.name));
|
155
|
+
const props = [];
|
156
|
+
properties.forEach((prop) => {
|
157
|
+
const isVModel = eventNames.includes(`update:${prop.name}`);
|
158
|
+
if (!isVModel && prop.templateFn) {
|
159
|
+
props.push(prop.templateFn(prop.name, prop.value));
|
160
|
+
return;
|
161
|
+
}
|
162
|
+
let variableName = prop.name;
|
163
|
+
if (variableName in ctx.scriptVariables) {
|
164
|
+
let index = 1;
|
165
|
+
do {
|
166
|
+
variableName = `${prop.name}${index}`;
|
167
|
+
index++;
|
168
|
+
} while (variableName in ctx.scriptVariables);
|
169
|
+
}
|
170
|
+
if (!isVModel) {
|
171
|
+
ctx.scriptVariables[variableName] = prop.value;
|
172
|
+
props.push(`:${prop.name}="${variableName}"`);
|
173
|
+
return;
|
174
|
+
}
|
175
|
+
ctx.scriptVariables[variableName] = `ref(${prop.value})`;
|
176
|
+
if (!ctx.imports.vue) {
|
177
|
+
ctx.imports.vue = /* @__PURE__ */ new Set();
|
178
|
+
}
|
179
|
+
ctx.imports.vue.add("ref");
|
180
|
+
if (prop.name === "modelValue") {
|
181
|
+
props.push(`v-model="${variableName}"`);
|
182
|
+
} else {
|
183
|
+
props.push(`v-model:${prop.name}="${variableName}"`);
|
184
|
+
}
|
185
|
+
});
|
186
|
+
return props.join(" ");
|
187
|
+
}, "generatePropsSourceCode");
|
188
|
+
var generateSlotSourceCode = /* @__PURE__ */ __name((args, slotNames, ctx) => {
|
189
|
+
const slotSourceCodes = [];
|
190
|
+
slotNames.forEach((slotName) => {
|
191
|
+
const arg = args[slotName];
|
192
|
+
if (!arg) {
|
193
|
+
return;
|
194
|
+
}
|
195
|
+
const slotContent = generateSlotChildrenSourceCode([arg], ctx);
|
196
|
+
if (!slotContent) {
|
197
|
+
return;
|
198
|
+
}
|
199
|
+
const slotBindings = typeof arg === "function" ? getFunctionParamNames(arg) : [];
|
200
|
+
if (slotName === "default" && !slotBindings.length) {
|
201
|
+
slotSourceCodes.push(slotContent);
|
202
|
+
} else {
|
203
|
+
slotSourceCodes.push(
|
204
|
+
`<template ${slotBindingsToString(slotName, slotBindings)}>${slotContent}</template>`
|
205
|
+
);
|
206
|
+
}
|
207
|
+
});
|
208
|
+
return slotSourceCodes.join("\n\n");
|
209
|
+
}, "generateSlotSourceCode");
|
210
|
+
var generateSlotChildrenSourceCode = /* @__PURE__ */ __name((children, ctx) => {
|
211
|
+
const slotChildrenSourceCodes = [];
|
212
|
+
const generateSingleChildSourceCode = /* @__PURE__ */ __name((child) => {
|
213
|
+
if (isVNode(child)) {
|
214
|
+
return generateVNodeSourceCode(child, ctx);
|
215
|
+
}
|
216
|
+
switch (typeof child) {
|
217
|
+
case "string":
|
218
|
+
case "number":
|
219
|
+
case "boolean":
|
220
|
+
return child.toString();
|
221
|
+
case "object":
|
222
|
+
if (child === null) {
|
223
|
+
return "";
|
224
|
+
}
|
225
|
+
if (Array.isArray(child)) {
|
226
|
+
return child.map(generateSingleChildSourceCode).filter((code) => code !== "").join("\n");
|
227
|
+
}
|
228
|
+
return JSON.stringify(child);
|
229
|
+
case "function": {
|
230
|
+
const paramNames = getFunctionParamNames(child).filter(
|
231
|
+
(param) => !["{", "}"].includes(param)
|
232
|
+
);
|
233
|
+
const parameters = {};
|
234
|
+
const proxied = {};
|
235
|
+
paramNames.forEach((param) => {
|
236
|
+
parameters[param] = `{{ ${param} }}`;
|
237
|
+
proxied[param] = new Proxy(
|
238
|
+
{
|
239
|
+
// we use the symbol to identify the proxy
|
240
|
+
[TRACKING_SYMBOL]: true
|
241
|
+
},
|
242
|
+
{
|
243
|
+
// getter is called when any prop of the parameter is read
|
244
|
+
get: /* @__PURE__ */ __name((t, key) => {
|
245
|
+
if (key === TRACKING_SYMBOL) {
|
246
|
+
return t[TRACKING_SYMBOL];
|
247
|
+
}
|
248
|
+
if ([Symbol.toPrimitive, Symbol.toStringTag, "toString"].includes(key)) {
|
249
|
+
return () => `{{ ${param} }}`;
|
250
|
+
}
|
251
|
+
if (key === "v-bind") {
|
252
|
+
return `${param}`;
|
253
|
+
}
|
254
|
+
return `{{ ${param}.${key.toString()} }}`;
|
255
|
+
}, "get"),
|
256
|
+
// ownKeys is called, among other uses, when an object is destructured
|
257
|
+
// in this case we assume the parameter is supposed to be bound using "v-bind"
|
258
|
+
// Therefore we only return one special key "v-bind" and the getter will be called afterwards with it
|
259
|
+
ownKeys: /* @__PURE__ */ __name(() => {
|
260
|
+
return [`v-bind`];
|
261
|
+
}, "ownKeys"),
|
262
|
+
/** Called when destructured */
|
263
|
+
getOwnPropertyDescriptor: /* @__PURE__ */ __name(() => ({
|
264
|
+
configurable: true,
|
265
|
+
enumerable: true,
|
266
|
+
value: param,
|
267
|
+
writable: true
|
268
|
+
}), "getOwnPropertyDescriptor")
|
269
|
+
}
|
270
|
+
);
|
271
|
+
});
|
272
|
+
const returnValue = child(proxied);
|
273
|
+
const slotSourceCode = generateSlotChildrenSourceCode([returnValue], ctx);
|
274
|
+
return slotSourceCode.replaceAll(/ (\S+)="{{ (\S+) }}"/g, ` :$1="$2"`);
|
275
|
+
}
|
276
|
+
case "bigint":
|
277
|
+
return `{{ BigInt(${child.toString()}) }}`;
|
278
|
+
// the only missing case here is "symbol"
|
279
|
+
// because rendering a symbol as slot / HTML does not make sense and is not supported by Vue
|
280
|
+
default:
|
281
|
+
return "";
|
282
|
+
}
|
283
|
+
}, "generateSingleChildSourceCode");
|
284
|
+
children.forEach((child) => {
|
285
|
+
const sourceCode = generateSingleChildSourceCode(child);
|
286
|
+
if (sourceCode !== "") {
|
287
|
+
slotChildrenSourceCodes.push(sourceCode);
|
288
|
+
}
|
289
|
+
});
|
290
|
+
return slotChildrenSourceCodes.join("\n");
|
291
|
+
}, "generateSlotChildrenSourceCode");
|
292
|
+
var generateVNodeSourceCode = /* @__PURE__ */ __name((vnode, ctx) => {
|
293
|
+
const componentName = getVNodeName(vnode);
|
294
|
+
let childrenCode = "";
|
295
|
+
if (typeof vnode.children === "string") {
|
296
|
+
childrenCode = vnode.children;
|
297
|
+
} else if (Array.isArray(vnode.children)) {
|
298
|
+
childrenCode = generateSlotChildrenSourceCode(vnode.children, ctx);
|
299
|
+
} else if (vnode.children) {
|
300
|
+
childrenCode = generateSlotSourceCode(
|
301
|
+
vnode.children,
|
302
|
+
// $stable is a default property in vnode.children so we need to filter it out
|
303
|
+
// to not generate source code for it
|
304
|
+
Object.keys(vnode.children).filter((i) => i !== "$stable"),
|
305
|
+
ctx
|
306
|
+
);
|
307
|
+
}
|
308
|
+
const props = vnode.props ? generatePropsSourceCode(vnode.props, [], [], ctx) : "";
|
309
|
+
if (childrenCode) {
|
310
|
+
return `<${componentName}${props ? ` ${props}` : ""}>${childrenCode}</${componentName}>`;
|
311
|
+
}
|
312
|
+
return `<${componentName}${props ? ` ${props}` : ""} />`;
|
313
|
+
}, "generateVNodeSourceCode");
|
314
|
+
var getVNodeName = /* @__PURE__ */ __name((vnode) => {
|
315
|
+
if (typeof vnode.type === "string") {
|
316
|
+
return vnode.type;
|
317
|
+
}
|
318
|
+
if (typeof vnode.type === "object") {
|
319
|
+
if ("name" in vnode.type && vnode.type.name) {
|
320
|
+
return vnode.type.name;
|
321
|
+
} else if ("__name" in vnode.type && vnode.type.__name) {
|
322
|
+
return vnode.type.__name;
|
323
|
+
}
|
324
|
+
}
|
325
|
+
return "component";
|
326
|
+
}, "getVNodeName");
|
327
|
+
var getFunctionParamNames = /* @__PURE__ */ __name((func) => {
|
328
|
+
const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;
|
329
|
+
const ARGUMENT_NAMES = /([^\s,]+)/g;
|
330
|
+
const fnStr = func.toString().replace(STRIP_COMMENTS, "");
|
331
|
+
const result = fnStr.slice(fnStr.indexOf("(") + 1, fnStr.indexOf(")")).match(ARGUMENT_NAMES);
|
332
|
+
if (!result) {
|
333
|
+
return [];
|
334
|
+
}
|
335
|
+
return result.flatMap((param) => {
|
336
|
+
if (["{", "}"].includes(param)) {
|
337
|
+
return param;
|
338
|
+
}
|
339
|
+
const nonMinifiedName = param.split(":")[0].trim();
|
340
|
+
if (nonMinifiedName.startsWith("{")) {
|
341
|
+
return ["{", nonMinifiedName.substring(1)];
|
342
|
+
}
|
343
|
+
if (param.endsWith("}") && !nonMinifiedName.endsWith("}")) {
|
344
|
+
return [nonMinifiedName, "}"];
|
345
|
+
}
|
346
|
+
return nonMinifiedName;
|
347
|
+
});
|
348
|
+
}, "getFunctionParamNames");
|
349
|
+
var slotBindingsToString = /* @__PURE__ */ __name((slotName, params) => {
|
350
|
+
if (!params.length) {
|
351
|
+
return `#${slotName}`;
|
352
|
+
}
|
353
|
+
if (params.length === 1) {
|
354
|
+
return `#${slotName}="${params[0]}"`;
|
355
|
+
}
|
356
|
+
return `#${slotName}="{ ${params.filter((i) => !["{", "}"].includes(i)).join(", ")} }"`;
|
357
|
+
}, "slotBindingsToString");
|
358
|
+
var formatObject = /* @__PURE__ */ __name((obj) => {
|
359
|
+
const isPrimitive = Object.values(obj).every(
|
360
|
+
(value) => value == null || typeof value !== "object"
|
361
|
+
);
|
362
|
+
if (isPrimitive) {
|
363
|
+
return JSON.stringify(obj);
|
364
|
+
}
|
365
|
+
return JSON.stringify(obj, null, 2);
|
366
|
+
}, "formatObject");
|
13
367
|
|
14
|
-
|
15
|
-
|
16
|
-
|
368
|
+
// src/entry-preview-docs.ts
|
369
|
+
var decorators = [sourceDecorator];
|
370
|
+
export {
|
371
|
+
decorators
|
372
|
+
};
|
package/dist/entry-preview.js
CHANGED
@@ -1 +1,17 @@
|
|
1
|
-
|
1
|
+
import {
|
2
|
+
argTypesEnhancers,
|
3
|
+
decorateStory,
|
4
|
+
mount,
|
5
|
+
parameters,
|
6
|
+
render,
|
7
|
+
renderToCanvas
|
8
|
+
} from "./_browser-chunks/chunk-GZHEVVQL.js";
|
9
|
+
import "./_browser-chunks/chunk-JFJ5UJ7Q.js";
|
10
|
+
export {
|
11
|
+
decorateStory as applyDecorators,
|
12
|
+
argTypesEnhancers,
|
13
|
+
mount,
|
14
|
+
parameters,
|
15
|
+
render,
|
16
|
+
renderToCanvas
|
17
|
+
};
|
package/dist/index.d.ts
CHANGED
@@ -1,12 +1,53 @@
|
|
1
|
-
|
2
|
-
import { M as Meta } from './public-types-e4ebb831.js';
|
3
|
-
export { C as ComponentPropsAndSlots, D as Decorator, L as Loader, P as Preview, b as StoryContext, S as StoryFn, a as StoryObj } from './public-types-e4ebb831.js';
|
4
|
-
import { NamedOrDefaultProjectAnnotations, NormalizedProjectAnnotations, ProjectAnnotations, Args, StoryAnnotationsOrFn, ComposedStoryFn, Store_CSFExports, StoriesWithPartialProps } from 'storybook/internal/types';
|
1
|
+
import { WebRenderer, Canvas, StoryContext as StoryContext$1, Args, ComponentAnnotations, AnnotatedStoryFn, ArgsStoryFn, ArgsFromMeta, StoryAnnotations, StrictArgs, DecoratorFunction, LoaderFunction, ProjectAnnotations, NamedOrDefaultProjectAnnotations, NormalizedProjectAnnotations, StoryAnnotationsOrFn, ComposedStoryFn, Store_CSFExports, StoriesWithPartialProps } from 'storybook/internal/types';
|
5
2
|
export { ArgTypes, Args, Parameters, StrictArgs } from 'storybook/internal/types';
|
6
|
-
import {
|
7
|
-
import '
|
8
|
-
import 'type-
|
9
|
-
|
3
|
+
import { ConcreteComponent, App, VNodeChild, FunctionalComponent } from 'vue';
|
4
|
+
import { Constructor, RemoveIndexSignature, Simplify, SetOptional } from 'type-fest';
|
5
|
+
import { ComponentProps, ComponentSlots } from 'vue-component-type-helpers';
|
6
|
+
|
7
|
+
type StoryFnVueReturnType = ConcreteComponent<any>;
|
8
|
+
interface VueRenderer extends WebRenderer {
|
9
|
+
component: Omit<ConcreteComponent<this['T']>, 'props'>;
|
10
|
+
storyResult: StoryFnVueReturnType;
|
11
|
+
mount: (Component?: StoryFnVueReturnType, options?: {
|
12
|
+
props?: Record<string, any>;
|
13
|
+
slots?: Record<string, any>;
|
14
|
+
}) => Promise<Canvas>;
|
15
|
+
}
|
16
|
+
|
17
|
+
declare const setup: (fn: (app: App, storyContext?: StoryContext$1<VueRenderer>) => unknown) => void;
|
18
|
+
|
19
|
+
/**
|
20
|
+
* Metadata to configure the stories for a component.
|
21
|
+
*
|
22
|
+
* @see [Default export](https://storybook.js.org/docs/api/csf#default-export)
|
23
|
+
*/
|
24
|
+
type Meta<TCmpOrArgs = Args> = ComponentAnnotations<VueRenderer, ComponentPropsOrProps<TCmpOrArgs>>;
|
25
|
+
/**
|
26
|
+
* Story function that represents a CSFv2 component example.
|
27
|
+
*
|
28
|
+
* @see [Named Story exports](https://storybook.js.org/docs/api/csf#named-story-exports)
|
29
|
+
*/
|
30
|
+
type StoryFn<TCmpOrArgs = Args> = AnnotatedStoryFn<VueRenderer, ComponentPropsOrProps<TCmpOrArgs>>;
|
31
|
+
/**
|
32
|
+
* Story object that represents a CSFv3 component example.
|
33
|
+
*
|
34
|
+
* @see [Named Story exports](https://storybook.js.org/docs/api/csf#named-story-exports)
|
35
|
+
*/
|
36
|
+
type StoryObj<TMetaOrCmpOrArgs = Args> = TMetaOrCmpOrArgs extends {
|
37
|
+
render?: ArgsStoryFn<VueRenderer, any>;
|
38
|
+
component?: infer Component;
|
39
|
+
args?: infer DefaultArgs;
|
40
|
+
} ? Simplify<ComponentPropsAndSlots<Component> & ArgsFromMeta<VueRenderer, TMetaOrCmpOrArgs>> extends infer TArgs ? StoryAnnotations<VueRenderer, TArgs, SetOptional<TArgs, Extract<keyof TArgs, keyof DefaultArgs>>> : never : StoryAnnotations<VueRenderer, ComponentPropsOrProps<TMetaOrCmpOrArgs>>;
|
41
|
+
type ExtractSlots<C> = AllowNonFunctionSlots<Partial<RemoveIndexSignature<ComponentSlots<C>>>>;
|
42
|
+
type AllowNonFunctionSlots<Slots> = {
|
43
|
+
[K in keyof Slots]: Slots[K] | VNodeChild;
|
44
|
+
};
|
45
|
+
type ComponentPropsAndSlots<C> = ComponentProps<C> & ExtractSlots<C>;
|
46
|
+
type ComponentPropsOrProps<TCmpOrArgs> = TCmpOrArgs extends Constructor<any> ? ComponentPropsAndSlots<TCmpOrArgs> : TCmpOrArgs extends FunctionalComponent<any> ? ComponentPropsAndSlots<TCmpOrArgs> : TCmpOrArgs;
|
47
|
+
type Decorator<TArgs = StrictArgs> = DecoratorFunction<VueRenderer, TArgs>;
|
48
|
+
type Loader<TArgs = StrictArgs> = LoaderFunction<VueRenderer, TArgs>;
|
49
|
+
type StoryContext<TArgs = StrictArgs> = StoryContext$1<VueRenderer, TArgs>;
|
50
|
+
type Preview = ProjectAnnotations<VueRenderer>;
|
10
51
|
|
11
52
|
type JSXAble<TElement> = TElement & {
|
12
53
|
new (...args: any[]): any;
|
@@ -94,4 +135,4 @@ declare function composeStory<TArgs extends Args = Args>(story: StoryAnnotations
|
|
94
135
|
*/
|
95
136
|
declare function composeStories<TModule extends Store_CSFExports<VueRenderer, any>>(csfExports: TModule, projectAnnotations?: ProjectAnnotations<VueRenderer>): MapToJSXAble<Omit<StoriesWithPartialProps<VueRenderer, TModule>, keyof Store_CSFExports>>;
|
96
137
|
|
97
|
-
export { Meta, VueRenderer, composeStories, composeStory, setProjectAnnotations, vueProjectAnnotations };
|
138
|
+
export { type ComponentPropsAndSlots, type Decorator, type Loader, type Meta, type Preview, type StoryContext, type StoryFn, type StoryObj, type VueRenderer, composeStories, composeStory, setProjectAnnotations, setup, vueProjectAnnotations };
|
package/dist/index.js
CHANGED
@@ -1 +1,70 @@
|
|
1
|
-
"use strict";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var index_exports={};__export(index_exports,{composeStories:()=>composeStories,composeStory:()=>composeStory,setProjectAnnotations:()=>setProjectAnnotations,setup:()=>setup,vueProjectAnnotations:()=>vueProjectAnnotations});module.exports=__toCommonJS(index_exports);var import_global=require("@storybook/global"),{window:globalWindow}=import_global.global;globalWindow.STORYBOOK_ENV="vue3";globalWindow.PLUGINS_SETUP_FUNCTIONS||=new Set;var import_vue=require("vue"),render=(props,context)=>{let{id,component:Component}=context;if(!Component)throw new Error(`Unable to render story ${id} as the component annotation is missing from the default export`);return()=>(0,import_vue.h)(Component,props,getSlots(props,context))},setup=fn=>{globalThis.PLUGINS_SETUP_FUNCTIONS??=new Set,globalThis.PLUGINS_SETUP_FUNCTIONS.add(fn)},runSetupFunctions=async(app,storyContext)=>{globalThis&&globalThis.PLUGINS_SETUP_FUNCTIONS&&await Promise.all([...globalThis.PLUGINS_SETUP_FUNCTIONS].map(fn=>fn(app,storyContext)))},map=new Map;async function renderToCanvas({storyFn,forceRemount,showMain,showException,storyContext,id},canvasElement){let existingApp=map.get(canvasElement);if(existingApp&&!forceRemount){let element=storyFn(),args=getArgs(element,storyContext);return updateArgs(existingApp.reactiveArgs,args),()=>{teardown(existingApp.vueApp,canvasElement)}}existingApp&&forceRemount&&teardown(existingApp.vueApp,canvasElement);let vueApp=(0,import_vue.createApp)({setup(){storyContext.args=(0,import_vue.reactive)(storyContext.args);let rootElement=storyFn(),args=getArgs(rootElement,storyContext),appState={vueApp,reactiveArgs:(0,import_vue.reactive)(args)};return map.set(canvasElement,appState),()=>(0,import_vue.h)(rootElement)}});return vueApp.config.errorHandler=(e,instance,info)=>{window.__STORYBOOK_PREVIEW__?.storyRenders.some(renderer=>renderer.id===id&&renderer.phase==="playing")?setTimeout(()=>{throw e},0):showException(e)},await runSetupFunctions(vueApp,storyContext),vueApp.mount(canvasElement),showMain(),()=>{teardown(vueApp,canvasElement)}}function getSlots(props,context){let{argTypes}=context,slots=Object.entries(props).filter(([key])=>argTypes[key]?.table?.category==="slots").map(([key,value])=>[key,typeof value=="function"?value:()=>value]);return Object.fromEntries(slots)}function getArgs(element,storyContext){return element.props&&(0,import_vue.isVNode)(element)?element.props:storyContext.args}function updateArgs(reactiveArgs,nextArgs){if(Object.keys(nextArgs).length===0)return;let currentArgs=(0,import_vue.isReactive)(reactiveArgs)?reactiveArgs:(0,import_vue.reactive)(reactiveArgs);Object.keys(currentArgs).forEach(key=>{key in nextArgs||delete currentArgs[key]}),Object.assign(currentArgs,nextArgs)}function teardown(storybookApp,canvasElement){storybookApp?.unmount(),map.has(canvasElement)&&map.delete(canvasElement)}var import_preview_api2=require("storybook/preview-api"),import_vue4=require("vue");var entry_preview_exports={};__export(entry_preview_exports,{applyDecorators:()=>decorateStory,argTypesEnhancers:()=>argTypesEnhancers,mount:()=>mount,parameters:()=>parameters,render:()=>render,renderToCanvas:()=>renderToCanvas});var import_docs_tools2=require("storybook/internal/docs-tools");var import_docs_tools=require("storybook/internal/docs-tools"),ARG_TYPE_SECTIONS=["props","events","slots","exposed","expose"],extractArgTypes=component=>{if(!(0,import_docs_tools.hasDocgen)(component))return null;let usedDocgenPlugin="exposed"in component.__docgenInfo?"vue-component-meta":"vue-docgen-api",argTypes={};return ARG_TYPE_SECTIONS.forEach(section=>{(0,import_docs_tools.extractComponentProps)(component,section).forEach(extractedProp=>{let argType;if(usedDocgenPlugin==="vue-docgen-api"){let docgenInfo=extractedProp.docgenInfo;argType=extractFromVueDocgenApi(docgenInfo,section,extractedProp)}else{let docgenInfo=extractedProp.docgenInfo;argType=extractFromVueComponentMeta(docgenInfo,section)}if(!argType||argTypes[argType.name])return;["events","expose","exposed"].includes(section)&&(argType.control={disable:!0}),argTypes[argType.name]=argType})}),argTypes},extractFromVueDocgenApi=(docgenInfo,section,extractedProp)=>{let type,sbType;if(section==="events"&&(type=docgenInfo.type?.names.join(),sbType={name:"other",value:type??"",required:!1}),section==="slots"){let slotBindings=docgenInfo.bindings?.filter(binding=>!!binding.name).map(binding=>`${binding.name}: ${binding.type?.name??"unknown"}`).join("; ");type=slotBindings?`{ ${slotBindings} }`:void 0,sbType={name:"other",value:type??"",required:!1}}if(section==="props"){let propInfo=docgenInfo;if(type=propInfo.type?.name,sbType=extractedProp?(0,import_docs_tools.convert)(extractedProp.docgenInfo):{name:"other",value:type},propInfo.type&&"elements"in propInfo.type&&Array.isArray(propInfo.type.elements)&&propInfo.type.elements.length>0){let elements=propInfo.type.elements.map(i=>i.name);type==="Array"&&(type=`${elements.length===1?elements[0]:`(${elements.join(" | ")})`}[]`),type==="union"?type=elements.join(" | "):type==="intersection"&&(type=elements.join(" & "))}}let required="required"in docgenInfo?docgenInfo.required??!1:!1;return{name:docgenInfo.name,description:docgenInfo.description,type:sbType?{...sbType,required}:{name:"other",value:type??""},table:{type:type?{summary:type}:void 0,defaultValue:extractedProp?.propDef.defaultValue??void 0,jsDocTags:extractedProp?.propDef.jsDocTags,category:section}}},extractFromVueComponentMeta=(docgenInfo,section)=>{if("global"in docgenInfo&&docgenInfo.global)return;let tableType={summary:docgenInfo.type.replace(" | undefined","")};if(section==="props"){let propInfo=docgenInfo,defaultValue=propInfo.default?{summary:propInfo.default}:void 0;return{name:propInfo.name,description:formatDescriptionWithTags(propInfo.description,propInfo.tags),defaultValue,type:convertVueComponentMetaProp(propInfo),table:{type:tableType,defaultValue,category:section}}}else return{name:docgenInfo.name,description:"description"in docgenInfo?docgenInfo.description:"",type:{name:"other",value:docgenInfo.type},table:{type:tableType,category:section}}},convertVueComponentMetaProp=propInfo=>{let schema=propInfo.schema,required=propInfo.required,fallbackSbType={name:"other",value:propInfo.type,required},KNOWN_SCHEMAS=["string","number","function","boolean","symbol"];if(typeof schema=="string")return KNOWN_SCHEMAS.includes(schema)?{name:schema,required}:fallbackSbType;switch(schema.kind){case"enum":{let definedSchemas=schema.schema?.filter(item=>item!=="undefined")??[];return isBooleanSchema(definedSchemas)?{name:"boolean",required}:isLiteralUnionSchema(definedSchemas)||isEnumSchema(definedSchemas)?{name:"enum",value:definedSchemas.map(literal=>literal.replace(/"/g,"")),required}:definedSchemas.length===1?convertVueComponentMetaProp({schema:definedSchemas[0],type:propInfo.type,required}):(definedSchemas.length>2&&definedSchemas.includes("true")&&definedSchemas.includes("false")&&(definedSchemas=definedSchemas.filter(i=>i!=="true"&&i!=="false"),definedSchemas.push("boolean")),{name:"union",value:definedSchemas.map(i=>convertVueComponentMetaProp(typeof i=="object"?{schema:i,type:i.type,required:!1}:{schema:i,type:i,required:!1})),required})}case"array":{let definedSchemas=schema.schema?.filter(item=>item!=="undefined")??[];return definedSchemas.length===0?fallbackSbType:definedSchemas.length===1?{name:"array",value:convertVueComponentMetaProp({schema:definedSchemas[0],type:propInfo.type,required:!1}),required}:{name:"union",value:definedSchemas.map(i=>convertVueComponentMetaProp(typeof i=="object"?{schema:i,type:i.type,required:!1}:{schema:i,type:i,required:!1})),required}}case"object":return{name:"object",value:{},required};default:return fallbackSbType}},formatDescriptionWithTags=(description,tags)=>!tags?.length||!description?description??"":`${tags.map(tag=>`@${tag.name}: ${tag.text}`).join("<br>")}<br><br>${description}`,isLiteralUnionSchema=schemas=>schemas.every(schema=>typeof schema=="string"&&schema.startsWith('"')&&schema.endsWith('"')),isEnumSchema=schemas=>schemas.every(schema=>typeof schema=="string"&&schema.includes(".")),isBooleanSchema=schemas=>schemas.length===2&&schemas.includes("true")&&schemas.includes("false");var import_preview_api=require("storybook/preview-api"),import_vue2=require("vue");function normalizeFunctionalComponent(options){return typeof options=="function"?{render:options,name:options.name}:options}function prepare(rawStory,innerStory){let story=rawStory;return story===null?null:typeof story=="function"?story:innerStory?{...normalizeFunctionalComponent(story),components:{...story.components||{},story:innerStory}}:{render(){return(0,import_vue2.h)(story)}}}function decorateStory(storyFn,decorators){return decorators.reduce((decorated,decorator)=>context=>{let story,decoratedStory=decorator(update=>{let sanitizedUpdate=(0,import_preview_api.sanitizeStoryContextUpdate)(update);return update&&(sanitizedUpdate.args=Object.assign(context.args,sanitizedUpdate.args)),story=decorated({...context,...sanitizedUpdate}),story},context);return story||(story=decorated(context)),decoratedStory===story?story:prepare(decoratedStory,()=>(0,import_vue2.h)(story))},context=>prepare(storyFn(context)))}var import_vue3=require("vue"),mount=context=>async(Component,options)=>(Component&&(context.originalStoryFn=()=>()=>(0,import_vue3.h)(Component,options?.props,options?.slots)),await context.renderToCanvas(),context.canvas);var parameters={renderer:"vue3",docs:{story:{inline:!0},extractArgTypes,extractComponentDescription:import_docs_tools2.extractComponentDescription}},argTypesEnhancers=[import_docs_tools2.enhanceArgTypes];function setProjectAnnotations(projectAnnotations){return(0,import_preview_api2.setDefaultProjectAnnotations)(vueProjectAnnotations),(0,import_preview_api2.setProjectAnnotations)(projectAnnotations)}var vueProjectAnnotations={...entry_preview_exports,renderToCanvas:(renderContext,canvasElement)=>{if(renderContext.storyContext.testingLibraryRender==null)return renderToCanvas(renderContext,canvasElement);let{storyFn,storyContext:{testingLibraryRender:render2}}=renderContext,{unmount}=render2(storyFn(),{container:canvasElement});return unmount}};function composeStory(story,componentAnnotations,projectAnnotations,exportsName){let composedStory=(0,import_preview_api2.composeStory)(story,componentAnnotations,projectAnnotations,globalThis.globalProjectAnnotations??vueProjectAnnotations,exportsName),renderable=(...args)=>(0,import_vue4.h)(composedStory(...args));return Object.assign(renderable,composedStory),renderable}function composeStories(csfExports,projectAnnotations){return(0,import_preview_api2.composeStories)(csfExports,projectAnnotations,composeStory)}0&&(module.exports={composeStories,composeStory,setProjectAnnotations,setup,vueProjectAnnotations});
|
1
|
+
import {
|
2
|
+
entry_preview_exports,
|
3
|
+
renderToCanvas,
|
4
|
+
setup
|
5
|
+
} from "./_browser-chunks/chunk-GZHEVVQL.js";
|
6
|
+
import {
|
7
|
+
__name
|
8
|
+
} from "./_browser-chunks/chunk-JFJ5UJ7Q.js";
|
9
|
+
|
10
|
+
// src/globals.ts
|
11
|
+
import { global } from "@storybook/global";
|
12
|
+
var { window: globalWindow } = global;
|
13
|
+
globalWindow.STORYBOOK_ENV = "vue3";
|
14
|
+
globalWindow.PLUGINS_SETUP_FUNCTIONS ||= /* @__PURE__ */ new Set();
|
15
|
+
|
16
|
+
// src/portable-stories.ts
|
17
|
+
import {
|
18
|
+
composeStories as originalComposeStories,
|
19
|
+
composeStory as originalComposeStory,
|
20
|
+
setProjectAnnotations as originalSetProjectAnnotations,
|
21
|
+
setDefaultProjectAnnotations
|
22
|
+
} from "storybook/preview-api";
|
23
|
+
import { h } from "vue";
|
24
|
+
function setProjectAnnotations(projectAnnotations) {
|
25
|
+
setDefaultProjectAnnotations(vueProjectAnnotations);
|
26
|
+
return originalSetProjectAnnotations(
|
27
|
+
projectAnnotations
|
28
|
+
);
|
29
|
+
}
|
30
|
+
__name(setProjectAnnotations, "setProjectAnnotations");
|
31
|
+
var vueProjectAnnotations = {
|
32
|
+
...entry_preview_exports,
|
33
|
+
/** @deprecated */
|
34
|
+
renderToCanvas: /* @__PURE__ */ __name((renderContext, canvasElement) => {
|
35
|
+
if (renderContext.storyContext.testingLibraryRender == null) {
|
36
|
+
return renderToCanvas(renderContext, canvasElement);
|
37
|
+
}
|
38
|
+
const {
|
39
|
+
storyFn,
|
40
|
+
storyContext: { testingLibraryRender: render }
|
41
|
+
} = renderContext;
|
42
|
+
const { unmount } = render(storyFn(), { container: canvasElement });
|
43
|
+
return unmount;
|
44
|
+
}, "renderToCanvas")
|
45
|
+
};
|
46
|
+
function composeStory(story, componentAnnotations, projectAnnotations, exportsName) {
|
47
|
+
const composedStory = originalComposeStory(
|
48
|
+
story,
|
49
|
+
componentAnnotations,
|
50
|
+
projectAnnotations,
|
51
|
+
globalThis.globalProjectAnnotations ?? vueProjectAnnotations,
|
52
|
+
exportsName
|
53
|
+
);
|
54
|
+
const renderable = /* @__PURE__ */ __name((...args) => h(composedStory(...args)), "renderable");
|
55
|
+
Object.assign(renderable, composedStory);
|
56
|
+
return renderable;
|
57
|
+
}
|
58
|
+
__name(composeStory, "composeStory");
|
59
|
+
function composeStories(csfExports, projectAnnotations) {
|
60
|
+
const composedStories = originalComposeStories(csfExports, projectAnnotations, composeStory);
|
61
|
+
return composedStories;
|
62
|
+
}
|
63
|
+
__name(composeStories, "composeStories");
|
64
|
+
export {
|
65
|
+
composeStories,
|
66
|
+
composeStory,
|
67
|
+
setProjectAnnotations,
|
68
|
+
setup,
|
69
|
+
vueProjectAnnotations
|
70
|
+
};
|
package/dist/playwright.js
CHANGED
@@ -1 +1,7 @@
|
|
1
|
-
|
1
|
+
import "./_browser-chunks/chunk-JFJ5UJ7Q.js";
|
2
|
+
|
3
|
+
// src/playwright.ts
|
4
|
+
import { createPlaywrightTest } from "storybook/preview-api";
|
5
|
+
export {
|
6
|
+
createPlaywrightTest as createTest
|
7
|
+
};
|
package/dist/preset.js
CHANGED
@@ -1 +1,26 @@
|
|
1
|
-
|
1
|
+
import CJS_COMPAT_NODE_URL_z42gz96vhsj from 'node:url';
|
2
|
+
import CJS_COMPAT_NODE_PATH_z42gz96vhsj from 'node:path';
|
3
|
+
import CJS_COMPAT_NODE_MODULE_z42gz96vhsj from "node:module";
|
4
|
+
|
5
|
+
var __filename = CJS_COMPAT_NODE_URL_z42gz96vhsj.fileURLToPath(import.meta.url);
|
6
|
+
var __dirname = CJS_COMPAT_NODE_PATH_z42gz96vhsj.dirname(__filename);
|
7
|
+
var require = CJS_COMPAT_NODE_MODULE_z42gz96vhsj.createRequire(import.meta.url);
|
8
|
+
|
9
|
+
// ------------------------------------------------------------
|
10
|
+
// end of CJS compatibility banner, injected by Storybook's esbuild configuration
|
11
|
+
// ------------------------------------------------------------
|
12
|
+
var __defProp = Object.defineProperty;
|
13
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
14
|
+
|
15
|
+
// src/preset.ts
|
16
|
+
import { fileURLToPath } from "node:url";
|
17
|
+
var previewAnnotations = /* @__PURE__ */ __name(async (input = [], options) => {
|
18
|
+
const docsEnabled = Object.keys(await options.presets.apply("docs", {}, options)).length > 0;
|
19
|
+
const result = [];
|
20
|
+
return result.concat(input).concat([fileURLToPath(import.meta.resolve("@storybook/vue3/entry-preview"))]).concat(
|
21
|
+
docsEnabled ? [fileURLToPath(import.meta.resolve("@storybook/vue3/entry-preview-docs"))] : []
|
22
|
+
);
|
23
|
+
}, "previewAnnotations");
|
24
|
+
export {
|
25
|
+
previewAnnotations
|
26
|
+
};
|