@storybook/vue3 0.0.0-pr-23609-sha-f47ef339

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +1 -0
  2. package/dist/chunk-SRVBJOBI.mjs +6 -0
  3. package/dist/config.d.ts +13 -0
  4. package/dist/config.js +5 -0
  5. package/dist/config.mjs +14 -0
  6. package/dist/index.d.ts +65 -0
  7. package/dist/index.js +1 -0
  8. package/dist/index.mjs +8 -0
  9. package/dist/render-32b7dd3f.d.ts +148 -0
  10. package/jest.config.js +11 -0
  11. package/package.json +88 -0
  12. package/preview.js +1 -0
  13. package/src/typings.d.ts +1 -0
  14. package/template/cli/js/Button.stories.js +48 -0
  15. package/template/cli/js/Button.vue +52 -0
  16. package/template/cli/js/Header.stories.js +41 -0
  17. package/template/cli/js/Header.vue +59 -0
  18. package/template/cli/js/Page.stories.js +30 -0
  19. package/template/cli/js/Page.vue +83 -0
  20. package/template/cli/ts-3-8/Button.stories.ts +52 -0
  21. package/template/cli/ts-3-8/Button.vue +48 -0
  22. package/template/cli/ts-3-8/Header.stories.ts +42 -0
  23. package/template/cli/ts-3-8/Header.vue +37 -0
  24. package/template/cli/ts-3-8/Page.stories.ts +34 -0
  25. package/template/cli/ts-3-8/Page.vue +73 -0
  26. package/template/cli/ts-4-9/Button.stories.ts +52 -0
  27. package/template/cli/ts-4-9/Button.vue +48 -0
  28. package/template/cli/ts-4-9/Header.stories.ts +42 -0
  29. package/template/cli/ts-4-9/Header.vue +37 -0
  30. package/template/cli/ts-4-9/Page.stories.ts +34 -0
  31. package/template/cli/ts-4-9/Page.vue +73 -0
  32. package/template/components/Button.vue +52 -0
  33. package/template/components/Form.vue +41 -0
  34. package/template/components/Html.vue +18 -0
  35. package/template/components/Pre.vue +34 -0
  36. package/template/components/button.css +30 -0
  37. package/template/components/index.js +9 -0
  38. package/template/stories/preview.js +38 -0
  39. package/template/stories/vue3-mdx.stories.mdx +46 -0
  40. package/template/stories_vue3-vite-default-ts/BaseLayout.vue +18 -0
  41. package/template/stories_vue3-vite-default-ts/CustomRenderFunctionalComponent.stories.ts +32 -0
  42. package/template/stories_vue3-vite-default-ts/CustomRenderOptionsArgsFromData.stories.ts +45 -0
  43. package/template/stories_vue3-vite-default-ts/GlobalSetup.stories.ts +55 -0
  44. package/template/stories_vue3-vite-default-ts/GlobalSetup.vue +6 -0
  45. package/template/stories_vue3-vite-default-ts/GlobalUsage.stories.ts +29 -0
  46. package/template/stories_vue3-vite-default-ts/GlobalUsage.vue +3 -0
  47. package/template/stories_vue3-vite-default-ts/MySlotComponent.vue +12 -0
  48. package/template/stories_vue3-vite-default-ts/OverrideArgs.stories.js +44 -0
  49. package/template/stories_vue3-vite-default-ts/OverrideArgs.vue +40 -0
  50. package/template/stories_vue3-vite-default-ts/ReactiveArgs.stories.ts +137 -0
  51. package/template/stories_vue3-vite-default-ts/ReactiveArgs.vue +40 -0
  52. package/template/stories_vue3-vite-default-ts/ReactiveDecorators.stories.ts +88 -0
  53. package/template/stories_vue3-vite-default-ts/ReactiveSlots.stories.ts +127 -0
  54. package/template/stories_vue3-vite-default-ts/Reactivity.vue +44 -0
  55. package/template/stories_vue3-vite-default-ts/ScopedSlots.stories.ts +81 -0
  56. package/template/stories_vue3-vite-default-ts/SourceDecorator.stories.ts +46 -0
  57. package/template/stories_vue3-vite-default-ts/decorators.stories.ts +84 -0
  58. package/template/stories_vue3-vite-default-ts/preview.ts +12 -0
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # Storybook Vue3 renderer
@@ -0,0 +1,6 @@
1
+ import { h, createApp, reactive, isVNode, isReactive } from 'vue';
2
+ import { sanitizeStoryContextUpdate } from '@storybook/preview-api';
3
+
4
+ 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 h(story)}}}function decorateStory(storyFn,decorators){return decorators.reduce((decorated,decorator)=>context=>{let story,decoratedStory=decorator(update=>{let sanitizedUpdate=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,()=>h(story))},context=>prepare(storyFn(context)))}var 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 ()=>h(Component,props,generateSlots(context))},setupFunctions=new Set,setup=fn=>{setupFunctions.add(fn);},runSetupFunctions=(app,storyContext)=>{setupFunctions.forEach(fn=>fn(app,storyContext));},map=new Map;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=createApp({setup(){storyContext.args=reactive(storyContext.args);let rootElement=storyFn(),args=getArgs(rootElement,storyContext),appState={vueApp,reactiveArgs:reactive(args)};return map.set(canvasElement,appState),()=>h(rootElement)}});return vueApp.config.errorHandler=e=>showException(e),runSetupFunctions(vueApp,storyContext),vueApp.mount(canvasElement),showMain(),()=>{teardown(vueApp,canvasElement);}}function generateSlots(context){let{argTypes}=context,slots=Object.entries(argTypes).filter(([key,value])=>argTypes[key]?.table?.category==="slots").map(([key,value])=>{let slotValue=context.args[key];return [key,typeof slotValue=="function"?slotValue:()=>slotValue]});return reactive(Object.fromEntries(slots))}function getArgs(element,storyContext){return element.props&&isVNode(element)?element.props:storyContext.args}function updateArgs(reactiveArgs,nextArgs){if(Object.keys(nextArgs).length===0)return;let currentArgs=isReactive(reactiveArgs)?reactiveArgs: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);}
5
+
6
+ export { decorateStory, render, renderToCanvas, setup };
@@ -0,0 +1,13 @@
1
+ import { Addon_DecoratorFunction, ArgTypesEnhancer, LegacyStoryFn, DecoratorFunction } from '@storybook/types';
2
+ import { V as VueRenderer } from './render-32b7dd3f.js';
3
+ export { r as render, a as renderToCanvas } from './render-32b7dd3f.js';
4
+ import 'vue';
5
+
6
+ declare const decorators: Addon_DecoratorFunction<unknown>[];
7
+ declare const argTypesEnhancers: ArgTypesEnhancer[];
8
+
9
+ declare function decorateStory(storyFn: LegacyStoryFn<VueRenderer>, decorators: DecoratorFunction<VueRenderer>[]): LegacyStoryFn<VueRenderer>;
10
+
11
+ declare const parameters: {};
12
+
13
+ export { decorateStory as applyDecorators, argTypesEnhancers, decorators, parameters };
package/dist/config.js ADDED
@@ -0,0 +1,5 @@
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 config_exports={};__export(config_exports,{applyDecorators:()=>decorateStory,argTypesEnhancers:()=>argTypesEnhancers,decorators:()=>decorators,parameters:()=>parameters2,render:()=>render,renderToCanvas:()=>renderToCanvas});module.exports=__toCommonJS(config_exports);var import_docs_tools3=require("@storybook/docs-tools");var import_docs_tools=require("@storybook/docs-tools"),SECTIONS=["props","events","slots","methods"],extractArgTypes=component=>{if(!(0,import_docs_tools.hasDocgen)(component))return null;let results={};return SECTIONS.forEach(section=>{(0,import_docs_tools.extractComponentProps)(component,section).forEach(({propDef,docgenInfo,jsDocTags})=>{let{name,type,description,defaultValue:defaultSummary,required}=propDef,sbType=section==="props"?(0,import_docs_tools.convert)(docgenInfo):{name:"void"};results[name]={name,description,type:{required,...sbType},table:{type,jsDocTags,defaultValue:defaultSummary,category:section}}})}),results};var import_preview_api=require("@storybook/preview-api"),import_docs_tools2=require("@storybook/docs-tools"),import_compiler_core=require("@vue/compiler-core"),import_vue=require("vue"),import_lodash=require("lodash");var omitEvent=args2=>args2?Object.fromEntries(Object.entries(args2).filter(([key,value])=>!key.startsWith("on"))):{},displayObject=obj=>obj&&typeof obj=="object"?`{${Object.keys(obj).map(key=>`${key}:${displayObject(obj[key])}`).join(",")}}`:typeof obj=="string"?`'${obj}'`:obj==null?void 0:obj.toString(),htmlEventAttributeToVueEventAttribute=key=>/^on[A-Za-z]/.test(key)?key.replace(/^on/,"v-on:").toLowerCase():key,directiveSource=(key,value)=>key.includes("on")?`${htmlEventAttributeToVueEventAttribute(key)}='()=>({})'`:`${key}="${value}"`,attributeSource=(key,value,dynamic)=>["boolean","number","object"].includes(typeof value)||dynamic&&["style","class"].includes(key)?`:${key}="${displayObject(value)}"`:directiveSource(key,value),evalExp=(argExpValue,args2)=>{let evalVal=argExpValue;return evalVal&&/v-bind="(\w+)"/.test(evalVal)?evalVal.replace(/"(\w+)"/g,`"${displayObject(args2)}"`):(Object.keys(args2).forEach(akey=>{let regexMatch=new RegExp(`(\\w+)\\.${akey}`,"g"),regexTarget=new RegExp(`(\\w+)\\.${akey}`,"g");regexMatch.test(evalVal)&&(evalVal=evalVal.replace(regexTarget,displayObject(args2[akey])))}),evalVal)},replaceValueWithRef=(source2,args2,ref)=>{let value=ref?args2[ref]:"args",bindValue=()=>{let argsRef=Object.fromEntries(Object.entries(args2).map(([key])=>[key,key]));return displayObject(argsRef).replace(/'/g,"")},regexMatch=new RegExp(`="${value}"`,"g");return source2.replace(regexMatch,`="${ref??bindValue()}"`)};function generateExpression(slot){let body=slot.toString().split("=>")[1].trim().replace("return","").trim();return body.startsWith("{")&&body.endsWith("}")&&(body=body.substring(1,body.length-1).trim()),`{{${body}}}`}var skipSourceRender=context=>{var _a;let sourceParams=(_a=context==null?void 0:context.parameters.docs)==null?void 0:_a.source,isArgsStory=context==null?void 0:context.parameters.__isArgsStory,isDocsViewMode=(context==null?void 0:context.viewMode)==="docs";return(sourceParams==null?void 0:sourceParams.type)===import_docs_tools2.SourceType.DYNAMIC?!1:!isDocsViewMode||!isArgsStory||(sourceParams==null?void 0:sourceParams.code)||(sourceParams==null?void 0:sourceParams.type)===import_docs_tools2.SourceType.CODE};function generateAttributesSource(tempArgs,args2,argTypes2,byRef2){return Object.keys(tempArgs).map(key=>{var _a;let source2=tempArgs[key].loc.source.replace(/\$props/g,"args"),argKey=(_a=tempArgs[key].arg)==null?void 0:_a.loc.source;return byRef2&&argKey?replaceValueWithRef(source2,args2,argKey):evalExp(source2,omitEvent(args2))}).join(" ")}function mapAttributesAndDirectives(props){let tranformKey=key=>key.startsWith("on")?key:(0,import_lodash.kebabCase)(key);return Object.keys(props).map(key=>({name:"bind",type:["v-","@","v-on"].includes(key)?7:6,arg:{content:tranformKey(key),loc:{source:tranformKey(key)}},loc:{source:attributeSource(tranformKey(key),props[key])},exp:{isStatic:!1,loc:{source:props[key]}},modifiers:[""]}))}function mapSlots(slotsArgs,generateComponentSource2,slots){return Object.keys(slotsArgs).map(key=>{var _a,_b;let slot=slotsArgs[key],slotContent="",scropedArgs=(_b=(_a=slots.find(s=>s.name===key&&s.scoped))==null?void 0:_a.bindings)==null?void 0:_b.map(b=>b.name).join(",");typeof slot=="function"&&(slotContent=generateExpression(slot)),(0,import_vue.isVNode)(slot)&&(slotContent=generateComponentSource2(slot)),typeof slot=="object"&&!(0,import_vue.isVNode)(slot)&&(slotContent=JSON.stringify(slot));let bindingsString=scropedArgs?`="{${scropedArgs}}"`:"";return slotContent=slot?`<template #${key}${bindingsString}>${slotContent}</template>`:"",{type:2,content:slotContent,loc:{source:slotContent,start:{offset:0,line:1,column:0},end:{offset:0,line:1,column:0}}}})}function generateScriptSetup(args2,argTypes2,components){let scriptLines=Object.keys(args2).map(key=>`const ${key} = ${typeof args2[key]=="function"?"()=>{}":`ref(${JSON.stringify(args2[key])});`}`);return scriptLines.unshift('import { ref } from "vue";'),`<script lang='ts' setup>${scriptLines.join(`
2
+ `)}</script>`}function getTemplateComponents(renderFn,context){try{let originalStoryFn=renderFn,storyFn=originalStoryFn?originalStoryFn(context==null?void 0:context.args,context):context==null?void 0:context.component,story=typeof storyFn=="function"?storyFn():storyFn,{template}=story;return template?getComponents(template):[(0,import_vue.h)(story,context==null?void 0:context.args)]}catch(e){return console.log("error",e),[]}}function getComponents(template){let ast=(0,import_compiler_core.baseParse)(template),components=ast==null?void 0:ast.children;return components||[]}function generateTemplateSource(componentOrNodes,{args,argTypes},byRef=!1){let isElementNode=node=>node&&node.type===1,isInterpolationNode=node=>node&&node.type===5,isTextNode=node=>node&&node.type===2,generateComponentSource=componentOrNode=>{var _a,_b;if(isElementNode(componentOrNode)){let{tag:name,props:attributes,children}=componentOrNode,childSources=typeof children=="string"?children:children.map(child=>generateComponentSource(child)).join(""),props=generateAttributesSource(attributes,args,argTypes,byRef);return childSources===""?`<${name} ${props} />`:`<${name} ${props}>${childSources}</${name}>`}if(isTextNode(componentOrNode)){let{content:content2}=componentOrNode;return content2}if(isInterpolationNode(componentOrNode)){let{content}=componentOrNode,expValue=evalExp(content.loc.source,args);return expValue===content.loc.source?`{{${expValue}}}`:eval(expValue)}if((0,import_vue.isVNode)(componentOrNode)){let vnode=componentOrNode,{props,type,children}=vnode,slotsProps=typeof children=="string"?void 0:children,componentSlots=(_a=type==null?void 0:type.__docgenInfo)==null?void 0:_a.slots,attrsProps=slotsProps?Object.fromEntries(Object.entries(props??{}).filter(([key,value])=>!slotsProps[key]&&!["class","style"].includes(key)).map(([key,value])=>[key,value])):props,attributes=mapAttributesAndDirectives(attrsProps??{}),slotArgs=Object.fromEntries(Object.entries(props??{}).filter(([key,value])=>slotsProps==null?void 0:slotsProps[key])),childSources=children?typeof children=="string"?children:mapSlots(slotArgs,generateComponentSource,componentSlots??[]).map(child=>child.content).join(""):"";console.log(" vnode ",vnode," childSources ",childSources," attributes ",attributes);let name=typeof type=="string"?type:type.name||type.__name||((_b=type.__docgenInfo)==null?void 0:_b.displayName),propsSource=generateAttributesSource(attributes,args,argTypes,byRef);return childSources.trim()===""?`<${name} ${propsSource}/>`:`<${name} ${propsSource}>${childSources}</${name}>`}return null},componentsOrNodes=Array.isArray(componentOrNodes)?componentOrNodes:[componentOrNodes],source=componentsOrNodes.map(componentOrNode2=>generateComponentSource(componentOrNode2)).join(" ");return source||null}var sourceDecorator=(storyFn,context)=>{let skip=skipSourceRender(context),story=storyFn();return(0,import_vue.watch)(()=>context.args,()=>{skip||generateSource(context)},{immediate:!0,deep:!0}),story};function generateSource(context){var _a,_b,_c;let channel=import_preview_api.addons.getChannel(),{args:args2={},argTypes:argTypes2={},id}=context||{},storyComponents=getTemplateComponents(context==null?void 0:context.originalStoryFn,context),withScript=((_c=(_b=(_a=context==null?void 0:context.parameters)==null?void 0:_a.docs)==null?void 0:_b.source)==null?void 0:_c.withScriptSetup)||!1,generatedScript=withScript?generateScriptSetup(args2,argTypes2,storyComponents):"",generatedTemplate=generateTemplateSource(storyComponents,context,withScript);if(generatedTemplate){let source2=`${generatedScript}
3
+ <template>
4
+ ${generatedTemplate}
5
+ </template>`;return channel.emit(import_docs_tools2.SNIPPET_RENDERED,{id,args:args2,source:source2,format:"vue"}),source2}return null}var parameters={docs:{story:{inline:!0},extractArgTypes,extractComponentDescription:import_docs_tools3.extractComponentDescription}},decorators=[sourceDecorator],argTypesEnhancers=[import_docs_tools3.enhanceArgTypes];var import_vue2=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_vue2.h)(Component,props,generateSlots(context))},setupFunctions=new Set;var runSetupFunctions=(app,storyContext)=>{setupFunctions.forEach(fn=>fn(app,storyContext))},map=new Map;function renderToCanvas({storyFn,forceRemount,showMain,showException,storyContext,id},canvasElement){let existingApp=map.get(canvasElement);if(existingApp&&!forceRemount){let element=storyFn(),args2=getArgs(element,storyContext);return updateArgs(existingApp.reactiveArgs,args2),()=>{teardown(existingApp.vueApp,canvasElement)}}existingApp&&forceRemount&&teardown(existingApp.vueApp,canvasElement);let vueApp=(0,import_vue2.createApp)({setup(){storyContext.args=(0,import_vue2.reactive)(storyContext.args);let rootElement=storyFn(),args2=getArgs(rootElement,storyContext),appState={vueApp,reactiveArgs:(0,import_vue2.reactive)(args2)};return map.set(canvasElement,appState),()=>(0,import_vue2.h)(rootElement)}});return vueApp.config.errorHandler=e=>showException(e),runSetupFunctions(vueApp,storyContext),vueApp.mount(canvasElement),showMain(),()=>{teardown(vueApp,canvasElement)}}function generateSlots(context){let{argTypes:argTypes2}=context,slots=Object.entries(argTypes2).filter(([key,value])=>{var _a,_b;return((_b=(_a=argTypes2[key])==null?void 0:_a.table)==null?void 0:_b.category)==="slots"}).map(([key,value])=>{let slotValue=context.args[key];return[key,typeof slotValue=="function"?slotValue:()=>slotValue]});return(0,import_vue2.reactive)(Object.fromEntries(slots))}function getArgs(element,storyContext){return element.props&&(0,import_vue2.isVNode)(element)?element.props:storyContext.args}function updateArgs(reactiveArgs,nextArgs){if(Object.keys(nextArgs).length===0)return;let currentArgs=(0,import_vue2.isReactive)(reactiveArgs)?reactiveArgs:(0,import_vue2.reactive)(reactiveArgs);Object.keys(currentArgs).forEach(key=>{key in nextArgs||delete currentArgs[key]}),Object.assign(currentArgs,nextArgs)}function teardown(storybookApp,canvasElement){storybookApp==null||storybookApp.unmount(),map.has(canvasElement)&&map.delete(canvasElement)}var import_vue3=require("vue"),import_preview_api2=require("@storybook/preview-api");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_vue3.h)(story)}}}function decorateStory(storyFn,decorators2){return decorators2.reduce((decorated,decorator)=>context=>{let story,decoratedStory=decorator(update=>{let sanitizedUpdate=(0,import_preview_api2.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_vue3.h)(story))},context=>prepare(storyFn(context)))}var parameters2={renderer:"vue3",...parameters};0&&(module.exports={applyDecorators,argTypesEnhancers,decorators,parameters,render,renderToCanvas});
@@ -0,0 +1,14 @@
1
+ export { decorateStory as applyDecorators, render, renderToCanvas } from './chunk-SRVBJOBI.mjs';
2
+ import { enhanceArgTypes, SNIPPET_RENDERED, extractComponentDescription, hasDocgen, extractComponentProps, convert, SourceType } from '@storybook/docs-tools';
3
+ import { addons } from '@storybook/preview-api';
4
+ import { baseParse } from '@vue/compiler-core';
5
+ import { watch, h, isVNode } from 'vue';
6
+ import { kebabCase } from 'lodash';
7
+
8
+ var SECTIONS=["props","events","slots","methods"],extractArgTypes=component=>{if(!hasDocgen(component))return null;let results={};return SECTIONS.forEach(section=>{extractComponentProps(component,section).forEach(({propDef,docgenInfo,jsDocTags})=>{let{name,type,description,defaultValue:defaultSummary,required}=propDef,sbType=section==="props"?convert(docgenInfo):{name:"void"};results[name]={name,description,type:{required,...sbType},table:{type,jsDocTags,defaultValue:defaultSummary,category:section}};});}),results};var omitEvent=args2=>args2?Object.fromEntries(Object.entries(args2).filter(([key,value])=>!key.startsWith("on"))):{},displayObject=obj=>obj&&typeof obj=="object"?`{${Object.keys(obj).map(key=>`${key}:${displayObject(obj[key])}`).join(",")}}`:typeof obj=="string"?`'${obj}'`:obj?.toString(),htmlEventAttributeToVueEventAttribute=key=>/^on[A-Za-z]/.test(key)?key.replace(/^on/,"v-on:").toLowerCase():key,directiveSource=(key,value)=>key.includes("on")?`${htmlEventAttributeToVueEventAttribute(key)}='()=>({})'`:`${key}="${value}"`,attributeSource=(key,value,dynamic)=>["boolean","number","object"].includes(typeof value)||dynamic&&["style","class"].includes(key)?`:${key}="${displayObject(value)}"`:directiveSource(key,value),evalExp=(argExpValue,args2)=>{let evalVal=argExpValue;return evalVal&&/v-bind="(\w+)"/.test(evalVal)?evalVal.replace(/"(\w+)"/g,`"${displayObject(args2)}"`):(Object.keys(args2).forEach(akey=>{let regexMatch=new RegExp(`(\\w+)\\.${akey}`,"g"),regexTarget=new RegExp(`(\\w+)\\.${akey}`,"g");regexMatch.test(evalVal)&&(evalVal=evalVal.replace(regexTarget,displayObject(args2[akey])));}),evalVal)},replaceValueWithRef=(source2,args2,ref)=>{let value=ref?args2[ref]:"args",bindValue=()=>{let argsRef=Object.fromEntries(Object.entries(args2).map(([key])=>[key,key]));return displayObject(argsRef).replace(/'/g,"")},regexMatch=new RegExp(`="${value}"`,"g");return source2.replace(regexMatch,`="${ref??bindValue()}"`)};function generateExpression(slot){let body=slot.toString().split("=>")[1].trim().replace("return","").trim();return body.startsWith("{")&&body.endsWith("}")&&(body=body.substring(1,body.length-1).trim()),`{{${body}}}`}var skipSourceRender=context=>{let sourceParams=context?.parameters.docs?.source,isArgsStory=context?.parameters.__isArgsStory,isDocsViewMode=context?.viewMode==="docs";return sourceParams?.type===SourceType.DYNAMIC?!1:!isDocsViewMode||!isArgsStory||sourceParams?.code||sourceParams?.type===SourceType.CODE};function generateAttributesSource(tempArgs,args2,argTypes2,byRef2){return Object.keys(tempArgs).map(key=>{let source2=tempArgs[key].loc.source.replace(/\$props/g,"args"),argKey=tempArgs[key].arg?.loc.source;return byRef2&&argKey?replaceValueWithRef(source2,args2,argKey):evalExp(source2,omitEvent(args2))}).join(" ")}function mapAttributesAndDirectives(props){let tranformKey=key=>key.startsWith("on")?key:kebabCase(key);return Object.keys(props).map(key=>({name:"bind",type:["v-","@","v-on"].includes(key)?7:6,arg:{content:tranformKey(key),loc:{source:tranformKey(key)}},loc:{source:attributeSource(tranformKey(key),props[key])},exp:{isStatic:!1,loc:{source:props[key]}},modifiers:[""]}))}function mapSlots(slotsArgs,generateComponentSource2,slots){return Object.keys(slotsArgs).map(key=>{let slot=slotsArgs[key],slotContent="",scropedArgs=slots.find(s=>s.name===key&&s.scoped)?.bindings?.map(b=>b.name).join(",");typeof slot=="function"&&(slotContent=generateExpression(slot)),isVNode(slot)&&(slotContent=generateComponentSource2(slot)),typeof slot=="object"&&!isVNode(slot)&&(slotContent=JSON.stringify(slot));let bindingsString=scropedArgs?`="{${scropedArgs}}"`:"";return slotContent=slot?`<template #${key}${bindingsString}>${slotContent}</template>`:"",{type:2,content:slotContent,loc:{source:slotContent,start:{offset:0,line:1,column:0},end:{offset:0,line:1,column:0}}}})}function generateScriptSetup(args2,argTypes2,components){let scriptLines=Object.keys(args2).map(key=>`const ${key} = ${typeof args2[key]=="function"?"()=>{}":`ref(${JSON.stringify(args2[key])});`}`);return scriptLines.unshift('import { ref } from "vue";'),`<script lang='ts' setup>${scriptLines.join(`
9
+ `)}<\/script>`}function getTemplateComponents(renderFn,context){try{let originalStoryFn=renderFn,storyFn=originalStoryFn?originalStoryFn(context?.args,context):context?.component,story=typeof storyFn=="function"?storyFn():storyFn,{template}=story;return template?getComponents(template):[h(story,context?.args)]}catch(e){return console.log("error",e),[]}}function getComponents(template){let components=baseParse(template)?.children;return components||[]}function generateTemplateSource(componentOrNodes,{args,argTypes},byRef=!1){let isElementNode=node=>node&&node.type===1,isInterpolationNode=node=>node&&node.type===5,isTextNode=node=>node&&node.type===2,generateComponentSource=componentOrNode=>{if(isElementNode(componentOrNode)){let{tag:name,props:attributes,children}=componentOrNode,childSources=typeof children=="string"?children:children.map(child=>generateComponentSource(child)).join(""),props=generateAttributesSource(attributes,args,argTypes,byRef);return childSources===""?`<${name} ${props} />`:`<${name} ${props}>${childSources}</${name}>`}if(isTextNode(componentOrNode)){let{content:content2}=componentOrNode;return content2}if(isInterpolationNode(componentOrNode)){let{content}=componentOrNode,expValue=evalExp(content.loc.source,args);return expValue===content.loc.source?`{{${expValue}}}`:eval(expValue)}if(isVNode(componentOrNode)){let vnode=componentOrNode,{props,type,children}=vnode,slotsProps=typeof children=="string"?void 0:children,componentSlots=type?.__docgenInfo?.slots,attrsProps=slotsProps?Object.fromEntries(Object.entries(props??{}).filter(([key,value])=>!slotsProps[key]&&!["class","style"].includes(key)).map(([key,value])=>[key,value])):props,attributes=mapAttributesAndDirectives(attrsProps??{}),slotArgs=Object.fromEntries(Object.entries(props??{}).filter(([key,value])=>slotsProps?.[key])),childSources=children?typeof children=="string"?children:mapSlots(slotArgs,generateComponentSource,componentSlots??[]).map(child=>child.content).join(""):"";console.log(" vnode ",vnode," childSources ",childSources," attributes ",attributes);let name=typeof type=="string"?type:type.name||type.__name||type.__docgenInfo?.displayName,propsSource=generateAttributesSource(attributes,args,argTypes,byRef);return childSources.trim()===""?`<${name} ${propsSource}/>`:`<${name} ${propsSource}>${childSources}</${name}>`}return null},componentsOrNodes=Array.isArray(componentOrNodes)?componentOrNodes:[componentOrNodes],source=componentsOrNodes.map(componentOrNode2=>generateComponentSource(componentOrNode2)).join(" ");return source||null}var sourceDecorator=(storyFn,context)=>{let skip=skipSourceRender(context),story=storyFn();return watch(()=>context.args,()=>{skip||generateSource(context);},{immediate:!0,deep:!0}),story};function generateSource(context){let channel=addons.getChannel(),{args:args2={},argTypes:argTypes2={},id}=context||{},storyComponents=getTemplateComponents(context?.originalStoryFn,context),withScript=context?.parameters?.docs?.source?.withScriptSetup||!1,generatedScript=withScript?generateScriptSetup(args2):"",generatedTemplate=generateTemplateSource(storyComponents,context,withScript);if(generatedTemplate){let source2=`${generatedScript}
10
+ <template>
11
+ ${generatedTemplate}
12
+ </template>`;return channel.emit(SNIPPET_RENDERED,{id,args:args2,source:source2,format:"vue"}),source2}return null}var parameters={docs:{story:{inline:!0},extractArgTypes,extractComponentDescription}},decorators=[sourceDecorator],argTypesEnhancers=[enhanceArgTypes];var parameters2={renderer:"vue3",...parameters};
13
+
14
+ export { argTypesEnhancers, decorators, parameters2 as parameters };
@@ -0,0 +1,65 @@
1
+ import * as _storybook_types from '@storybook/types';
2
+ import { Addon_ClientStoryApi, Addon_Loadable, Args, ComponentAnnotations, AnnotatedStoryFn, ArgsStoryFn, ArgsFromMeta, StoryAnnotations, StrictArgs, DecoratorFunction, LoaderFunction, StoryContext as StoryContext$1, ProjectAnnotations } from '@storybook/types';
3
+ export { ArgTypes, Args, Parameters, StrictArgs } from '@storybook/types';
4
+ import { App, FunctionalComponent, VNodeChild } from 'vue';
5
+ import { V as VueRenderer } from './render-32b7dd3f.js';
6
+ export { s as setup } from './render-32b7dd3f.js';
7
+ import { Simplify, SetOptional, Constructor, RemoveIndexSignature } from 'type-fest';
8
+ import { ComponentProps, ComponentSlots } from 'vue-component-type-helpers';
9
+
10
+ interface ClientApi extends Addon_ClientStoryApi<VueRenderer['storyResult']> {
11
+ configure(loader: Addon_Loadable, module: NodeModule): void;
12
+ forceReRender(): void;
13
+ raw: () => any;
14
+ load: (...args: any[]) => void;
15
+ app: App;
16
+ }
17
+ declare const storiesOf: ClientApi['storiesOf'];
18
+ declare const configure: ClientApi['configure'];
19
+ declare const forceReRender: () => void;
20
+ declare const raw: ((...args: any[]) => never) | (() => _storybook_types.BoundStory<VueRenderer>[] | undefined);
21
+
22
+ /**
23
+ * Metadata to configure the stories for a component.
24
+ *
25
+ * @see [Default export](https://storybook.js.org/docs/formats/component-story-format/#default-export)
26
+ */
27
+ type Meta<TCmpOrArgs = Args> = ComponentAnnotations<VueRenderer, ComponentPropsOrProps<TCmpOrArgs>>;
28
+ /**
29
+ * Story function that represents a CSFv2 component example.
30
+ *
31
+ * @see [Named Story exports](https://storybook.js.org/docs/formats/component-story-format/#named-story-exports)
32
+ */
33
+ type StoryFn<TCmpOrArgs = Args> = AnnotatedStoryFn<VueRenderer, ComponentPropsOrProps<TCmpOrArgs>>;
34
+ /**
35
+ * Story function that represents a CSFv3 component example.
36
+ *
37
+ * @see [Named Story exports](https://storybook.js.org/docs/formats/component-story-format/#named-story-exports)
38
+ */
39
+ type StoryObj<TMetaOrCmpOrArgs = Args> = TMetaOrCmpOrArgs extends {
40
+ render?: ArgsStoryFn<VueRenderer, any>;
41
+ component?: infer Component;
42
+ args?: infer DefaultArgs;
43
+ } ? Simplify<ComponentPropsAndSlots<Component> & ArgsFromMeta<VueRenderer, TMetaOrCmpOrArgs>> extends infer TArgs ? StoryAnnotations<VueRenderer, TArgs, SetOptional<TArgs, Extract<keyof TArgs, keyof DefaultArgs>>> : never : StoryAnnotations<VueRenderer, ComponentPropsOrProps<TMetaOrCmpOrArgs>>;
44
+ type ExtractSlots<C> = AllowNonFunctionSlots<Partial<RemoveIndexSignature<ComponentSlots<C>>>>;
45
+ type AllowNonFunctionSlots<Slots> = {
46
+ [K in keyof Slots]: Slots[K] | VNodeChild;
47
+ };
48
+ type ComponentPropsAndSlots<C> = ComponentProps<C> & ExtractSlots<C>;
49
+ type ComponentPropsOrProps<TCmpOrArgs> = TCmpOrArgs extends Constructor<any> ? ComponentPropsAndSlots<TCmpOrArgs> : TCmpOrArgs extends FunctionalComponent<any> ? ComponentPropsAndSlots<TCmpOrArgs> : TCmpOrArgs;
50
+ /**
51
+ * @deprecated Use `StoryFn` instead.
52
+ * Use `StoryObj` if you want to migrate to CSF3, which uses objects instead of functions to represent stories.
53
+ * You can read more about the CSF3 format here: https://storybook.js.org/blog/component-story-format-3-0/
54
+ *
55
+ * Story function that represents a CSFv2 component example.
56
+ *
57
+ * @see [Named Story exports](https://storybook.js.org/docs/formats/component-story-format/#named-story-exports)
58
+ */
59
+ type Story<TArgs = Args> = StoryFn<TArgs>;
60
+ type Decorator<TArgs = StrictArgs> = DecoratorFunction<VueRenderer, TArgs>;
61
+ type Loader<TArgs = StrictArgs> = LoaderFunction<VueRenderer, TArgs>;
62
+ type StoryContext<TArgs = StrictArgs> = StoryContext$1<VueRenderer, TArgs>;
63
+ type Preview = ProjectAnnotations<VueRenderer>;
64
+
65
+ export { ComponentPropsAndSlots, Decorator, Loader, Meta, Preview, Story, StoryContext, StoryFn, StoryObj, VueRenderer, configure, forceReRender, raw, storiesOf };
package/dist/index.js ADDED
@@ -0,0 +1 @@
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 src_exports={};__export(src_exports,{configure:()=>configure,forceReRender:()=>forceReRender,raw:()=>raw,setup:()=>setup,storiesOf:()=>storiesOf});module.exports=__toCommonJS(src_exports);var import_global=require("@storybook/global"),{window:globalWindow}=import_global.global;globalWindow.STORYBOOK_ENV="vue3";var import_preview_api2=require("@storybook/preview-api");var import_vue=require("vue"),import_preview_api=require("@storybook/preview-api");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_vue.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_vue.h)(story))},context=>prepare(storyFn(context)))}var import_vue2=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_vue2.h)(Component,props,generateSlots(context))},setupFunctions=new Set,setup=fn=>{setupFunctions.add(fn)},runSetupFunctions=(app,storyContext)=>{setupFunctions.forEach(fn=>fn(app,storyContext))},map=new Map;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_vue2.createApp)({setup(){storyContext.args=(0,import_vue2.reactive)(storyContext.args);let rootElement=storyFn(),args=getArgs(rootElement,storyContext),appState={vueApp,reactiveArgs:(0,import_vue2.reactive)(args)};return map.set(canvasElement,appState),()=>(0,import_vue2.h)(rootElement)}});return vueApp.config.errorHandler=e=>showException(e),runSetupFunctions(vueApp,storyContext),vueApp.mount(canvasElement),showMain(),()=>{teardown(vueApp,canvasElement)}}function generateSlots(context){let{argTypes}=context,slots=Object.entries(argTypes).filter(([key,value])=>{var _a2,_b;return((_b=(_a2=argTypes[key])==null?void 0:_a2.table)==null?void 0:_b.category)==="slots"}).map(([key,value])=>{let slotValue=context.args[key];return[key,typeof slotValue=="function"?slotValue:()=>slotValue]});return(0,import_vue2.reactive)(Object.fromEntries(slots))}function getArgs(element,storyContext){return element.props&&(0,import_vue2.isVNode)(element)?element.props:storyContext.args}function updateArgs(reactiveArgs,nextArgs){if(Object.keys(nextArgs).length===0)return;let currentArgs=(0,import_vue2.isReactive)(reactiveArgs)?reactiveArgs:(0,import_vue2.reactive)(reactiveArgs);Object.keys(currentArgs).forEach(key=>{key in nextArgs||delete currentArgs[key]}),Object.assign(currentArgs,nextArgs)}function teardown(storybookApp,canvasElement){storybookApp==null||storybookApp.unmount(),map.has(canvasElement)&&map.delete(canvasElement)}var RENDERER="vue3",api=(0,import_preview_api2.start)(renderToCanvas,{decorateStory,render}),storiesOf=(kind,m)=>api.clientApi.storiesOf(kind,m).addParameters({renderer:RENDERER}),configure=(...args)=>api.configure(RENDERER,...args),{forceReRender}=api,{raw}=api.clientApi;var _a;typeof module<"u"&&((_a=module==null?void 0:module.hot)==null||_a.decline());0&&(module.exports={configure,forceReRender,raw,setup,storiesOf});
package/dist/index.mjs ADDED
@@ -0,0 +1,8 @@
1
+ import { renderToCanvas, decorateStory, render } from './chunk-SRVBJOBI.mjs';
2
+ export { setup } from './chunk-SRVBJOBI.mjs';
3
+ import { global } from '@storybook/global';
4
+ import { start } from '@storybook/preview-api';
5
+
6
+ var{window:globalWindow}=global;globalWindow.STORYBOOK_ENV="vue3";var RENDERER="vue3",api=start(renderToCanvas,{decorateStory,render}),storiesOf=(kind,m)=>api.clientApi.storiesOf(kind,m).addParameters({renderer:RENDERER}),configure=(...args)=>api.configure(RENDERER,...args),{forceReRender}=api,{raw}=api.clientApi;typeof module<"u"&&module?.hot?.decline();
7
+
8
+ export { configure, forceReRender, raw, storiesOf };
@@ -0,0 +1,148 @@
1
+ import { ConcreteComponent, App } from 'vue';
2
+ import { WebRenderer, ArgsStoryFn as ArgsStoryFn$1, RenderContext } from '@storybook/types';
3
+
4
+ type StoryFnVueReturnType = ConcreteComponent<any>;
5
+ interface VueRenderer extends WebRenderer {
6
+ component: Omit<ConcreteComponent<this['T']>, 'props'>;
7
+ storyResult: StoryFnVueReturnType;
8
+ }
9
+
10
+ interface SBBaseType {
11
+ required?: boolean;
12
+ raw?: string;
13
+ }
14
+ type SBScalarType = SBBaseType & {
15
+ name: 'boolean' | 'string' | 'number' | 'function' | 'symbol';
16
+ };
17
+ type SBArrayType = SBBaseType & {
18
+ name: 'array';
19
+ value: SBType;
20
+ };
21
+ type SBObjectType = SBBaseType & {
22
+ name: 'object';
23
+ value: Record<string, SBType>;
24
+ };
25
+ type SBEnumType = SBBaseType & {
26
+ name: 'enum';
27
+ value: (string | number)[];
28
+ };
29
+ type SBIntersectionType = SBBaseType & {
30
+ name: 'intersection';
31
+ value: SBType[];
32
+ };
33
+ type SBUnionType = SBBaseType & {
34
+ name: 'union';
35
+ value: SBType[];
36
+ };
37
+ type SBOtherType = SBBaseType & {
38
+ name: 'other';
39
+ value: string;
40
+ };
41
+ type SBType = SBScalarType | SBEnumType | SBArrayType | SBObjectType | SBIntersectionType | SBUnionType | SBOtherType;
42
+
43
+ type StoryId = string;
44
+ type ComponentId = string;
45
+ type ComponentTitle = string;
46
+ type StoryName = string;
47
+ type Tag = string;
48
+ interface StoryIdentifier {
49
+ componentId: ComponentId;
50
+ title: ComponentTitle;
51
+ /** @deprecated */
52
+ kind: ComponentTitle;
53
+ id: StoryId;
54
+ name: StoryName;
55
+ /** @deprecated */
56
+ story: StoryName;
57
+ tags: Tag[];
58
+ }
59
+ interface Parameters {
60
+ [name: string]: any;
61
+ }
62
+ type ConditionalTest = {
63
+ truthy?: boolean;
64
+ } | {
65
+ exists: boolean;
66
+ } | {
67
+ eq: any;
68
+ } | {
69
+ neq: any;
70
+ };
71
+ type ConditionalValue = {
72
+ arg: string;
73
+ } | {
74
+ global: string;
75
+ };
76
+ type Conditional = ConditionalValue & ConditionalTest;
77
+ interface InputType {
78
+ name?: string;
79
+ description?: string;
80
+ defaultValue?: any;
81
+ type?: SBType | SBScalarType['name'];
82
+ if?: Conditional;
83
+ [key: string]: any;
84
+ }
85
+ interface StrictInputType extends InputType {
86
+ name: string;
87
+ type?: SBType;
88
+ }
89
+ interface Args {
90
+ [name: string]: any;
91
+ }
92
+ type StrictArgTypes<TArgs = Args> = {
93
+ [name in keyof TArgs]: StrictInputType;
94
+ };
95
+ type Globals = {
96
+ [name: string]: any;
97
+ };
98
+ type Renderer = {
99
+ /** What is the type of the `component` annotation in this renderer? */
100
+ component: unknown;
101
+ /** What does the story function return in this renderer? */
102
+ storyResult: unknown;
103
+ /** What type of element does this renderer render to? */
104
+ canvasElement: unknown;
105
+ T?: unknown;
106
+ };
107
+ type StoryContextForEnhancers<TRenderer extends Renderer = Renderer, TArgs = Args> = StoryIdentifier & {
108
+ component?: (TRenderer & {
109
+ T: any;
110
+ })['component'];
111
+ subcomponents?: Record<string, (TRenderer & {
112
+ T: any;
113
+ })['component']>;
114
+ parameters: Parameters;
115
+ initialArgs: TArgs;
116
+ argTypes: StrictArgTypes<TArgs>;
117
+ };
118
+ type StoryContextUpdate<TArgs = Args> = {
119
+ args?: TArgs;
120
+ globals?: Globals;
121
+ [key: string]: any;
122
+ };
123
+ type ViewMode = 'story' | 'docs';
124
+ type StoryContextForLoaders<TRenderer extends Renderer = Renderer, TArgs = Args> = StoryContextForEnhancers<TRenderer, TArgs> & Required<StoryContextUpdate<TArgs>> & {
125
+ hooks: unknown;
126
+ viewMode: ViewMode;
127
+ originalStoryFn: StoryFn<TRenderer>;
128
+ };
129
+ type StoryContext<TRenderer extends Renderer = Renderer, TArgs = Args> = StoryContextForLoaders<TRenderer, TArgs> & {
130
+ loaded: Record<string, any>;
131
+ abortSignal: AbortSignal;
132
+ canvasElement: TRenderer['canvasElement'];
133
+ };
134
+ type LegacyStoryFn<TRenderer extends Renderer = Renderer, TArgs = Args> = (context: StoryContext<TRenderer, TArgs>) => TRenderer['storyResult'];
135
+ type ArgsStoryFn<TRenderer extends Renderer = Renderer, TArgs = Args> = (args: TArgs, context: StoryContext<TRenderer, TArgs>) => (TRenderer & {
136
+ T: TArgs;
137
+ })['storyResult'];
138
+ type StoryFn<TRenderer extends Renderer = Renderer, TArgs = Args> = LegacyStoryFn<TRenderer, TArgs> | ArgsStoryFn<TRenderer, TArgs>;
139
+
140
+ declare const render: ArgsStoryFn$1<VueRenderer>;
141
+ /** add a setup function to set that will be call when story is created a d
142
+ *
143
+ * @param fn
144
+ */
145
+ declare const setup: (fn: (app: App, storyContext?: StoryContext<VueRenderer>) => void) => void;
146
+ declare function renderToCanvas({ storyFn, forceRemount, showMain, showException, storyContext, id }: RenderContext<VueRenderer>, canvasElement: VueRenderer['canvasElement']): () => void;
147
+
148
+ export { VueRenderer as V, renderToCanvas as a, render as r, setup as s };
package/jest.config.js ADDED
@@ -0,0 +1,11 @@
1
+ const path = require('path');
2
+ const baseConfig = require('../../jest.config.browser');
3
+
4
+ module.exports = {
5
+ ...baseConfig,
6
+ displayName: __dirname.split(path.sep).slice(-2).join(path.posix.sep),
7
+ transform: {
8
+ ...baseConfig.transform,
9
+ '^.+\\.vue$': '@vue/vue3-jest',
10
+ },
11
+ };
package/package.json ADDED
@@ -0,0 +1,88 @@
1
+ {
2
+ "name": "@storybook/vue3",
3
+ "version": "0.0.0-pr-23609-sha-f47ef339",
4
+ "description": "Storybook Vue 3 renderer",
5
+ "keywords": [
6
+ "storybook"
7
+ ],
8
+ "homepage": "https://github.com/storybookjs/storybook/tree/next/code/renderers/vue3",
9
+ "bugs": {
10
+ "url": "https://github.com/storybookjs/storybook/issues"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/storybookjs/storybook.git",
15
+ "directory": "code/renderers/vue3"
16
+ },
17
+ "funding": {
18
+ "type": "opencollective",
19
+ "url": "https://opencollective.com/storybook"
20
+ },
21
+ "license": "MIT",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "node": "./dist/index.js",
26
+ "require": "./dist/index.js",
27
+ "import": "./dist/index.mjs"
28
+ },
29
+ "./preview": {
30
+ "types": "./dist/config.d.ts",
31
+ "require": "./dist/config.js",
32
+ "import": "./dist/config.mjs"
33
+ },
34
+ "./package.json": "./package.json"
35
+ },
36
+ "main": "dist/index.js",
37
+ "module": "dist/index.mjs",
38
+ "types": "dist/index.d.ts",
39
+ "files": [
40
+ "dist/**/*",
41
+ "template/**/*",
42
+ "README.md",
43
+ "*.js",
44
+ "*.d.ts"
45
+ ],
46
+ "scripts": {
47
+ "check": "vue-tsc --noEmit",
48
+ "prep": "../../../scripts/prepare/bundle.ts"
49
+ },
50
+ "dependencies": {
51
+ "@storybook/core-client": "0.0.0-pr-23609-sha-f47ef339",
52
+ "@storybook/docs-tools": "0.0.0-pr-23609-sha-f47ef339",
53
+ "@storybook/global": "^5.0.0",
54
+ "@storybook/preview-api": "0.0.0-pr-23609-sha-f47ef339",
55
+ "@storybook/types": "0.0.0-pr-23609-sha-f47ef339",
56
+ "lodash": "^4.17.21",
57
+ "ts-dedent": "^2.0.0",
58
+ "type-fest": "~2.19",
59
+ "vue-component-type-helpers": "latest"
60
+ },
61
+ "devDependencies": {
62
+ "@digitak/esrun": "^3.2.2",
63
+ "@types/prettier": "2.7.2",
64
+ "@vue/compiler-core": "^3.3.4",
65
+ "@vue/vue3-jest": "29",
66
+ "typescript": "~4.9.3",
67
+ "vue": "^3.2.47",
68
+ "vue-tsc": "latest"
69
+ },
70
+ "peerDependencies": {
71
+ "@vue/compiler-core": "^3.0.0",
72
+ "vue": "^3.0.0"
73
+ },
74
+ "engines": {
75
+ "node": ">=16.0.0"
76
+ },
77
+ "publishConfig": {
78
+ "access": "public"
79
+ },
80
+ "bundler": {
81
+ "entries": [
82
+ "./src/index.ts",
83
+ "./src/config.ts"
84
+ ],
85
+ "platform": "browser"
86
+ },
87
+ "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae17"
88
+ }
package/preview.js ADDED
@@ -0,0 +1 @@
1
+ export * from './dist/config.mjs';
@@ -0,0 +1 @@
1
+ declare var STORYBOOK_ENV: 'vue3';
@@ -0,0 +1,48 @@
1
+ import MyButton from './Button.vue';
2
+
3
+ // More on how to set up stories at: https://storybook.js.org/docs/vue/writing-stories/introduction
4
+ export default {
5
+ title: 'Example/Button',
6
+ component: MyButton,
7
+ tags: ['autodocs'],
8
+ argTypes: {
9
+ backgroundColor: {
10
+ control: 'color',
11
+ },
12
+ onClick: {},
13
+ size: {
14
+ control: {
15
+ type: 'select',
16
+ },
17
+ options: ['small', 'medium', 'large'],
18
+ },
19
+ },
20
+ };
21
+
22
+ // More on writing stories with args: https://storybook.js.org/docs/vue/writing-stories/args
23
+ export const Primary = {
24
+ args: {
25
+ primary: true,
26
+ label: 'Button',
27
+ },
28
+ };
29
+
30
+ export const Secondary = {
31
+ args: {
32
+ label: 'Button',
33
+ },
34
+ };
35
+
36
+ export const Large = {
37
+ args: {
38
+ size: 'large',
39
+ label: 'Button',
40
+ },
41
+ };
42
+
43
+ export const Small = {
44
+ args: {
45
+ size: 'small',
46
+ label: 'Button',
47
+ },
48
+ };
@@ -0,0 +1,52 @@
1
+ <template>
2
+ <button type="button" :class="classes" @click="onClick" :style="style">{{ label }}</button>
3
+ </template>
4
+
5
+ <script>
6
+ import './button.css';
7
+ import { reactive, computed } from 'vue';
8
+
9
+ export default {
10
+ name: 'my-button',
11
+
12
+ props: {
13
+ label: {
14
+ type: String,
15
+ required: true,
16
+ },
17
+ primary: {
18
+ type: Boolean,
19
+ default: false,
20
+ },
21
+ size: {
22
+ type: String,
23
+ validator: function (value) {
24
+ return ['small', 'medium', 'large'].indexOf(value) !== -1;
25
+ },
26
+ },
27
+ backgroundColor: {
28
+ type: String,
29
+ },
30
+ },
31
+
32
+ emits: ['click'],
33
+
34
+ setup(props, { emit }) {
35
+ props = reactive(props);
36
+ return {
37
+ classes: computed(() => ({
38
+ 'storybook-button': true,
39
+ 'storybook-button--primary': props.primary,
40
+ 'storybook-button--secondary': !props.primary,
41
+ [`storybook-button--${props.size || 'medium'}`]: true,
42
+ })),
43
+ style: computed(() => ({
44
+ backgroundColor: props.backgroundColor,
45
+ })),
46
+ onClick() {
47
+ emit('click');
48
+ },
49
+ };
50
+ },
51
+ };
52
+ </script>
@@ -0,0 +1,41 @@
1
+ import MyHeader from './Header.vue';
2
+
3
+ export default {
4
+ title: 'Example/Header',
5
+ component: MyHeader,
6
+ // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/vue/writing-docs/autodocs
7
+ tags: ['autodocs'],
8
+ render: (args) => ({
9
+ // Components used in your story `template` are defined in the `components` object
10
+ components: {
11
+ MyHeader,
12
+ },
13
+ // The story's `args` need to be mapped into the template through the `setup()` method
14
+ setup() {
15
+ // Story args can be spread into the returned object
16
+ return {
17
+ ...args,
18
+ };
19
+ },
20
+ // Then, the spread values can be accessed directly in the template
21
+ template: '<my-header :user="user" />',
22
+ }),
23
+ parameters: {
24
+ // More on how to position stories at: https://storybook.js.org/docs/vue/configure/story-layout
25
+ layout: 'fullscreen',
26
+ },
27
+ };
28
+
29
+ export const LoggedIn = {
30
+ args: {
31
+ user: {
32
+ name: 'Jane Doe',
33
+ },
34
+ },
35
+ };
36
+
37
+ export const LoggedOut = {
38
+ args: {
39
+ user: null,
40
+ },
41
+ };
@@ -0,0 +1,59 @@
1
+ <template>
2
+ <header>
3
+ <div class="storybook-header">
4
+ <div>
5
+ <svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
6
+ <g fill="none" fill-rule="evenodd">
7
+ <path
8
+ d="M10 0h12a10 10 0 0110 10v12a10 10 0 01-10 10H10A10 10 0 010 22V10A10 10 0 0110 0z"
9
+ fill="#FFF"
10
+ />
11
+ <path
12
+ d="M5.3 10.6l10.4 6v11.1l-10.4-6v-11zm11.4-6.2l9.7 5.5-9.7 5.6V4.4z"
13
+ fill="#555AB9"
14
+ />
15
+ <path
16
+ d="M27.2 10.6v11.2l-10.5 6V16.5l10.5-6zM15.7 4.4v11L6 10l9.7-5.5z"
17
+ fill="#91BAF8"
18
+ />
19
+ </g>
20
+ </svg>
21
+ <h1>Acme</h1>
22
+ </div>
23
+ <div>
24
+ <span class="welcome" v-if="user"
25
+ >Welcome, <b>{{ user.name }}</b
26
+ >!</span
27
+ >
28
+ <my-button size="small" @click="$emit('logout')" label="Log out" v-if="user" />
29
+ <my-button size="small" @click="$emit('login')" label="Log in" v-if="!user" />
30
+ <my-button
31
+ primary
32
+ size="small"
33
+ @click="$emit('createAccount')"
34
+ label="Sign up"
35
+ v-if="!user"
36
+ />
37
+ </div>
38
+ </div>
39
+ </header>
40
+ </template>
41
+
42
+ <script>
43
+ import './header.css';
44
+ import MyButton from './Button.vue';
45
+
46
+ export default {
47
+ name: 'my-header',
48
+
49
+ components: { MyButton },
50
+
51
+ props: {
52
+ user: {
53
+ type: Object,
54
+ },
55
+ },
56
+
57
+ emits: ['login', 'logout', 'createAccount'],
58
+ };
59
+ </script>