@storybook/svelte-vite 9.0.0-alpha.8 → 9.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.
Files changed (47) hide show
  1. package/dist/preset.js +2 -10
  2. package/package.json +8 -8
  3. package/template/cli/{svelte-5-ts-3-8 → js}/Button.stories.svelte +1 -1
  4. package/template/cli/js/Button.svelte +11 -20
  5. package/template/cli/js/Header.svelte +12 -17
  6. package/template/cli/{svelte-5-js → js}/Page.stories.svelte +1 -1
  7. package/template/cli/js/Page.svelte +4 -4
  8. package/template/cli/{svelte-5-ts-4-9 → ts}/Button.stories.svelte +1 -1
  9. package/template/cli/{svelte-5-ts-3-8 → ts}/Button.svelte +8 -7
  10. package/template/cli/{svelte-5-ts-4-9 → ts}/Header.svelte +3 -3
  11. package/template/cli/{svelte-5-ts-4-9 → ts}/Page.stories.svelte +1 -1
  12. package/template/stories_svelte-vite-default-js/docgen/jsdoc.stories.js +17 -0
  13. package/template/stories_svelte-vite-default-js/docgen/jsdoc.svelte +92 -0
  14. package/template/stories_svelte-vite-default-ts/docgen/jsdoc.stories.js +17 -0
  15. package/template/stories_svelte-vite-default-ts/docgen/jsdoc.svelte +91 -0
  16. package/template/stories_svelte-vite-default-ts/docgen/ts-inline-prop-types.stories.ts +16 -0
  17. package/template/stories_svelte-vite-default-ts/docgen/ts-inline-prop-types.svelte +103 -0
  18. package/template/stories_svelte-vite-default-ts/docgen/ts-legacy.stories.ts +16 -0
  19. package/template/stories_svelte-vite-default-ts/docgen/ts-legacy.svelte +98 -0
  20. package/template/stories_svelte-vite-default-ts/docgen/ts-referenced-prop-types.stories.ts +16 -0
  21. package/template/stories_svelte-vite-default-ts/docgen/ts-referenced-prop-types.svelte +107 -0
  22. package/template/stories_svelte-vite-default-ts/docgen/ts.stories.ts +16 -0
  23. package/template/stories_svelte-vite-default-ts/docgen/ts.svelte +125 -0
  24. package/template/cli/js/Button.stories.js +0 -43
  25. package/template/cli/js/Header.stories.js +0 -22
  26. package/template/cli/js/Page.stories.js +0 -28
  27. package/template/cli/svelte-5-js/Button.stories.svelte +0 -31
  28. package/template/cli/svelte-5-js/Button.svelte +0 -26
  29. package/template/cli/svelte-5-js/Header.svelte +0 -47
  30. package/template/cli/svelte-5-js/Page.svelte +0 -70
  31. package/template/cli/svelte-5-ts-3-8/Header.svelte +0 -45
  32. package/template/cli/svelte-5-ts-3-8/Page.stories.svelte +0 -30
  33. package/template/cli/svelte-5-ts-4-9/Button.svelte +0 -29
  34. package/template/cli/svelte-5-ts-4-9/Header.stories.svelte +0 -26
  35. package/template/cli/svelte-5-ts-4-9/Page.svelte +0 -70
  36. package/template/cli/ts-4-9/Button.stories.ts +0 -48
  37. package/template/cli/ts-4-9/Button.svelte +0 -34
  38. package/template/cli/ts-4-9/Header.stories.ts +0 -27
  39. package/template/cli/ts-4-9/Header.svelte +0 -52
  40. package/template/cli/ts-4-9/Page.stories.ts +0 -33
  41. package/template/cli/ts-4-9/Page.svelte +0 -70
  42. package/template/stories_svelte-vite-default-ts/DocsTS.svelte +0 -97
  43. package/template/stories_svelte-vite-default-ts/docs-ts.stories.js +0 -10
  44. /package/template/cli/{svelte-5-js → js}/Header.stories.svelte +0 -0
  45. /package/template/cli/{svelte-5-ts-3-8 → ts}/Header.stories.svelte +0 -0
  46. /package/template/cli/{svelte-5-ts-3-8 → ts}/Page.svelte +0 -0
  47. /package/template/stories_svelte-vite-default-ts/{types.ts → docgen/types.ts} +0 -0
package/dist/preset.js CHANGED
@@ -1,11 +1,3 @@
1
1
  "use strict";var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__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 __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var preset_exports={};__export(preset_exports,{core:()=>core,viteFinal:()=>viteFinal});module.exports=__toCommonJS(preset_exports);var import_node_path3=require("path");var import_node_fs=require("fs"),import_node_path2=require("path"),import_node_logger=require("storybook/internal/node-logger"),import_magic_string=__toESM(require("magic-string")),import_svelte_preprocess=require("svelte-preprocess"),import_compiler2=require("svelte/compiler"),import_sveltedoc_parser=__toESM(require("sveltedoc-parser"));var import_node_path=__toESM(require("path")),import_svelte2tsx=__toESM(require("svelte2tsx")),import_compiler=require("svelte/compiler"),import_typescript=__toESM(require("typescript"));function convertType(type,checker){if(type.flags&import_typescript.default.TypeFlags.Any)return{type:"any"};if(type.flags&import_typescript.default.TypeFlags.Number)return{type:"number"};if(type.flags&import_typescript.default.TypeFlags.String)return{type:"string"};if(type.flags&import_typescript.default.TypeFlags.Boolean)return{type:"boolean"};if(type.flags&import_typescript.default.TypeFlags.ESSymbol)return{type:"symbol"};if(type.flags&import_typescript.default.TypeFlags.Null)return{type:"null"};if(type.flags&import_typescript.default.TypeFlags.Undefined)return{type:"undefined"};if(type.flags&import_typescript.default.TypeFlags.Void)return{type:"void"};if(type.getCallSignatures().length>0)return{type:"function",text:checker.typeToString(type)};if(type.flags&import_typescript.default.TypeFlags.Object)return checker.getIndexTypeOfType(type,import_typescript.default.IndexKind.Number)?{type:"array",text:checker.typeToString(type)}:{type:"object",text:checker.typeToString(type)};if(type.isNumberLiteral()||type.isStringLiteral())return{type:"literal",value:type.value,text:type.flags&import_typescript.default.TypeFlags.EnumLiteral?checker.typeToString(type):JSON.stringify(type.value)};if(type.flags&import_typescript.default.TypeFlags.BooleanLiteral){let text=checker.typeToString(type);return{type:"literal",value:text==="true",text}}if(type.isUnion()){let types=type.types.map(t=>convertType(t,checker)).filter(t=>t!==void 0&&t.type!=="undefined"),idxTrue=types.findIndex(t=>t.type==="literal"&&t.value===!0),idxFalse=types.findIndex(t=>t.type==="literal"&&t.value===!1);return idxTrue!==-1&&idxFalse!==-1&&(types.splice(Math.max(idxTrue,idxFalse),1),types.splice(Math.min(idxTrue,idxFalse),1,{type:"boolean"})),types.length>1?{type:"union",types}:types[0]}if(type.isIntersection())return{type:"intersection",types:type.types.map(t=>convertType(t,checker)).filter(t=>t!==void 0)}}function initializerToDefaultValue(expr,checker){if(import_typescript.default.isNumericLiteral(expr))return{text:expr.text};if(import_typescript.default.isStringLiteral(expr))return{text:JSON.stringify(expr.text)};if(import_typescript.default.isIdentifier(expr)||import_typescript.default.isPropertyAccessExpression(expr)){let symbol=checker.getSymbolAtLocation(expr);if(symbol&&checker.isUndefinedSymbol(symbol))return;let type=checker.getTypeAtLocation(expr);if(type.flags&import_typescript.default.TypeFlags.EnumLiteral)return{text:checker.typeToString(type)};if(type.isLiteral())return{text:JSON.stringify(type.value)};if(type.flags&import_typescript.default.TypeFlags.Null)return{text:"null"};if(type.flags&import_typescript.default.TypeFlags.BooleanLiteral)return{text:checker.typeToString(type)};if(type.getCallSignatures().length>0)return{text:"function"}}else{if(import_typescript.default.isArrayLiteralExpression(expr)||import_typescript.default.isObjectLiteralExpression(expr)||import_typescript.default.isNewExpression(expr))return{text:expr.getText()};if(import_typescript.default.isArrowFunction(expr))return{text:"function"}}switch(expr.kind){case import_typescript.default.SyntaxKind.TrueKeyword:return{text:"true"};case import_typescript.default.SyntaxKind.FalseKeyword:return{text:"false"};case import_typescript.default.SyntaxKind.NullKeyword:return{text:"null"}}return{text:"..."}}function loadConfig(basepath){let configPath=import_typescript.default.findConfigFile(basepath,import_typescript.default.sys.fileExists)||import_typescript.default.findConfigFile(basepath,import_typescript.default.sys.fileExists,"jsconfig.json"),forcedOptions={sourceMap:!1,noEmit:!0,strict:!0,allowJs:!0,checkJs:!0,skipLibCheck:!0,skipDefaultLibCheck:!0};if(!configPath)return[forcedOptions,new Set];let configFile=import_typescript.default.readConfigFile(configPath,import_typescript.default.sys.readFile),config=import_typescript.default.parseJsonConfigFileContent(configFile.config,import_typescript.default.sys,import_node_path.default.dirname(configPath),void 0,configPath,void 0,[{extension:"svelte",isMixedContent:!0,scriptKind:import_typescript.default.ScriptKind.Deferred}]),fileNames=new Set(config.fileNames.filter(fileName=>fileName.endsWith(".svelte")).map(fileName=>fileName+".tsx"));return[{...config.options,...forcedOptions},fileNames]}function createDocgenCache(){return{filenameToModifiedTime:{},filenameToSourceFile:{},fileCache:{}}}function generateDocgen(targetFileName,cache){targetFileName.endsWith(".svelte")&&(targetFileName=targetFileName+".tsx");let propsRuneUsed=!1;if(cache.options===void 0||!cache.rootNames?.has(targetFileName)){[cache.options,cache.rootNames]=loadConfig(targetFileName);let shimFilename=require.resolve("svelte2tsx/svelte-shims-v4.d.ts");cache.rootNames.add(shimFilename),cache.rootNames.add(targetFileName)}let originalHost=import_typescript.default.createCompilerHost(cache.options),host={...originalHost,readFile(fileName){let isCacheTarget=fileName.endsWith(import_node_path.default.sep+"package.json");if(isCacheTarget&&cache.fileCache[fileName])return cache.fileCache[fileName];let content=originalHost.readFile(fileName);return content&&isCacheTarget&&(cache.fileCache[fileName]=content),content},fileExists(fileName){if(fileName.endsWith(import_node_path.default.sep+"package.json")&&cache.fileCache[fileName])return!0;let exists=originalHost.fileExists(fileName);return exists||(fileName.endsWith(".svelte.tsx")||fileName.endsWith(".svelte.jsx")?(fileName=fileName.slice(0,-4),exists=originalHost.fileExists(fileName),exists):!1)},getSourceFile(fileName,languageVersion,onError){if(fileName.endsWith(".svelte.tsx")||fileName.endsWith(".svelte.jsx")){let realFileName=fileName.slice(0,-4),modifiedTime=import_typescript.default.sys.getModifiedTime?import_typescript.default.sys.getModifiedTime(realFileName):void 0;if(modifiedTime&&cache.filenameToModifiedTime[fileName]?.getTime()===modifiedTime.getTime())return cache.filenameToSourceFile[fileName];let content=originalHost.readFile(realFileName);if(content===void 0)return;let isTsFile=/<script\s+[^>]*?lang=('|")(ts|typescript)('|")/.test(content),tsx=import_svelte2tsx.default.svelte2tsx(content,{version:import_compiler.VERSION,isTsFile,mode:"dts"}),sourceFile2=import_typescript.default.createSourceFile(fileName,tsx.code,languageVersion,!0,isTsFile?import_typescript.default.ScriptKind.TS:import_typescript.default.ScriptKind.JS);return cache.filenameToSourceFile[fileName]=sourceFile2,cache.filenameToModifiedTime[fileName]=modifiedTime,sourceFile2}else{let staticCaching=!1;staticCaching||=fileName.split(import_node_path.default.sep).some(part=>part.toLowerCase()==="node_modules");let cachedSourceFile=cache.filenameToSourceFile[fileName];if(cachedSourceFile&&staticCaching)return cachedSourceFile;let modifiedTime=import_typescript.default.sys.getModifiedTime?import_typescript.default.sys.getModifiedTime(fileName):void 0;if(modifiedTime&&cache.filenameToModifiedTime[fileName]?.getTime()===modifiedTime.getTime())return cache.filenameToSourceFile[fileName];let content=originalHost.readFile(fileName);if(content===void 0)return;let sourceFile2=import_typescript.default.createSourceFile(fileName,content,languageVersion,!0);return cache.filenameToSourceFile[fileName]=sourceFile2,cache.filenameToModifiedTime[fileName]=modifiedTime,sourceFile2}},writeFile(){}},program=import_typescript.default.createProgram({rootNames:Array.from(cache.rootNames),options:cache.options,host,oldProgram:cache.oldProgram});cache.oldProgram=program;let checker=program.getTypeChecker(),sourceFile=program.getSourceFile(targetFileName);if(sourceFile===void 0)return{props:[]};let propMap=new Map,renderFunction=sourceFile.statements.find(statement=>import_typescript.default.isFunctionDeclaration(statement)&&statement.name?.text===import_svelte2tsx.internalHelpers.renderName);if(renderFunction===void 0)return{props:[]};let propsType,signature=checker.getSignatureFromDeclaration(renderFunction);return signature&&signature.declaration&&checker.getReturnTypeOfSignature(signature).getProperties().forEach(retObjProp=>{if(retObjProp.name==="props"){let decl=signature.getDeclaration();propsType=checker.getTypeOfSymbolAtLocation(retObjProp,decl),propsType.getProperties().forEach(prop=>{let name=prop.getName(),description=import_typescript.default.displayPartsToString(prop.getDocumentationComment(checker))||void 0,propType=checker.getTypeOfSymbolAtLocation(prop,decl);if(prop.valueDeclaration){let typeTag=import_typescript.default.getJSDocTypeTag(prop.valueDeclaration);typeTag?.comment&&(description=((description||"")+`
2
- `+typeTag.comment).trim())}if(prop.valueDeclaration?.getSourceFile().fileName.includes("node_modules/svelte/elements.d.ts"))return;let optional=(prop.flags&import_typescript.default.SymbolFlags.Optional)!==0;propMap.set(name,{name,optional,description,type:convertType(propType,checker)})})}}),renderFunction.body?.forEachChild(node=>{import_typescript.default.isVariableStatement(node)&&node.declarationList.declarations.forEach(declaration=>{if(import_typescript.default.isObjectBindingPattern(declaration.name)){let isPropsRune=declaration.initializer&&import_typescript.default.isCallExpression(declaration.initializer)&&import_typescript.default.isIdentifier(declaration.initializer.expression)&&declaration.initializer.expression.text==="$props",isPropsType=declaration.type&&propsType===checker.getTypeFromTypeNode(declaration.type);(isPropsRune||isPropsType)&&(propsRuneUsed=!0,declaration.name.elements.forEach(element=>{let name=element.name.getText(),prop=propMap.get(name);if(prop&&element.initializer){let defaultValue=initializerToDefaultValue(element.initializer,checker);defaultValue&&(prop.defaultValue=defaultValue)}}))}if(import_typescript.default.isVariableDeclaration(declaration)&&import_typescript.default.isIdentifier(declaration.name)&&propMap.has(declaration.name.text)){let prop=propMap.get(declaration.name.text);if(prop&&declaration.initializer){prop.optional=!0;let defaultValue=initializerToDefaultValue(declaration.initializer,checker);defaultValue&&(prop.defaultValue=defaultValue)}}})}),{props:Array.from(propMap.values()),propsRuneUsed}}var svelteDocParserOptions=require("sveltedoc-parser/lib/options.js");svelteDocParserOptions.getAstDefaultOptions=()=>({range:!0,loc:!0,comment:!0,tokens:!0,ecmaVersion:12,sourceType:"module",ecmaFeatures:{}});function getComponentName(ast){let exportDefaultDeclaration=ast.body.find(n=>n.type==="ExportDefaultDeclaration");if(!exportDefaultDeclaration)throw new Error("Unreachable - no default export found");if(exportDefaultDeclaration.declaration.type==="Identifier")return exportDefaultDeclaration.declaration.name;if(exportDefaultDeclaration.declaration.type!=="ClassDeclaration"&&exportDefaultDeclaration.declaration.type!=="FunctionDeclaration")throw new Error("Unreachable - not a class or a function");if(!exportDefaultDeclaration.declaration.id)throw new Error("Unreachable - unnamed class/function");return exportDefaultDeclaration.declaration.id.name}function transformToSvelteDocParserType(type){switch(type.type){case"string":return{kind:"type",type:"string",text:"string"};case"number":return{kind:"type",type:"number",text:"number"};case"boolean":return{kind:"type",type:"boolean",text:"boolean"};case"symbol":return{kind:"type",type:"other",text:"symbol"};case"null":return{kind:"type",type:"other",text:"null"};case"undefined":return{kind:"type",type:"other",text:"undefined"};case"void":return{kind:"type",type:"other",text:"void"};case"any":return{kind:"type",type:"any",text:"any"};case"object":return{kind:"type",type:"object",text:type.text};case"array":return{kind:"type",type:"array",text:type.text};case"function":return{kind:"function",text:type.text};case"literal":return{kind:"const",type:typeof type.value,value:type.value,text:type.text};case"union":{let nonNull=type.types.filter(t=>t.type!=="null"),text=nonNull.map(t=>transformToSvelteDocParserType(t).text).join(" | "),types=nonNull.map(t=>transformToSvelteDocParserType(t));return types.length===1?types[0]:{kind:"union",type:types,text}}case"intersection":return{kind:"type",type:"intersection",text:type.types.map(t=>transformToSvelteDocParserType(t).text).join(" & ")}}}function transformToSvelteDocParserDataItems(docgen){return docgen.props.map(p=>{let required=p.optional===!1&&p.defaultValue===void 0;return{name:p.name,visibility:"public",description:p.description,keywords:required?[{name:"required",description:""}]:[],kind:"let",type:p.type?transformToSvelteDocParserType(p.type):void 0,static:!1,readonly:!1,importPath:void 0,originalName:void 0,localName:void 0,defaultValue:p.defaultValue?p.defaultValue.text:void 0}})}async function svelteDocgen(svelteOptions={}){let cwd=process.cwd(),{preprocess:preprocessOptions,logDocgen=!1}=svelteOptions,include=/\.(svelte)$/,{createFilter}=await import("vite"),filter=createFilter(include),sourceFileCache=createDocgenCache(),docPreprocessOptions;return{name:"storybook:svelte-docgen-plugin",async transform(src,id){if(id.startsWith("\0")||!filter(id))return;let resource=(0,import_node_path2.relative)(cwd,id),docgen=generateDocgen(resource,sourceFileCache),data=transformToSvelteDocParserDataItems(docgen),componentDoc={};if(!docgen.propsRuneUsed){if(preprocessOptions&&!docPreprocessOptions){docPreprocessOptions=[(0,import_svelte_preprocess.replace)([[/<style.+<\/style>/gims,""]])];try{require.resolve("typescript")&&docPreprocessOptions.unshift((0,import_svelte_preprocess.typescript)())}catch{}}let docOptions;if(docPreprocessOptions){let rawSource;try{rawSource=(0,import_node_fs.readFileSync)(resource).toString()}catch{return}let{code:fileContent}=await(0,import_compiler2.preprocess)(rawSource,docPreprocessOptions,{filename:resource});docOptions={fileContent}}else docOptions={filename:resource};let options={...docOptions,version:3};try{componentDoc=await import_sveltedoc_parser.default.parse(options)}catch(error){componentDoc={keywords:[],data:[]},logDocgen&&import_node_logger.logger.error(error)}}componentDoc.data=data;let file=(0,import_node_path2.basename)(resource);componentDoc.name=(0,import_node_path2.basename)(file);let s=new import_magic_string.default(src),outputAst=this.parse(src),componentName=getComponentName(outputAst);return s.append(`
3
- ;${componentName}.__docgen = ${JSON.stringify(componentDoc)}`),{code:s.toString(),map:s.generateMap({hires:!0,source:id})}}}}var import_builder_vite=require("@storybook/builder-vite"),import_ts_dedent=require("ts-dedent");async function handleSvelteKit(plugins,options){let frameworkPreset=await options.presets.apply("framework",{},options),framework=typeof frameworkPreset=="string"?frameworkPreset:frameworkPreset.name;if(await(0,import_builder_vite.hasVitePlugins)(plugins,["vite-plugin-svelte-kit","vite-plugin-sveltekit-setup","vite-plugin-sveltekit-compile"])&&!framework.includes("@storybook/sveltekit"))throw new Error(import_ts_dedent.dedent`
4
- We've detected a SvelteKit project using the @storybook/svelte-vite framework, which is not supported in Storybook 7.0
5
- Please use the @storybook/sveltekit framework instead.
6
- You can migrate automatically by running
7
-
8
- npx storybook@latest automigrate
9
-
10
- See https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#sveltekit-needs-the-storybooksveltekit-framework
11
- `)}var getAbsolutePath=input=>(0,import_node_path3.dirname)(require.resolve((0,import_node_path3.join)(input,"package.json"))),core={builder:getAbsolutePath("@storybook/builder-vite"),renderer:getAbsolutePath("@storybook/svelte")},viteFinal=async(config,options)=>{let{plugins=[]}=config,{loadSvelteConfig}=await import("@sveltejs/vite-plugin-svelte"),svelteConfig=await loadSvelteConfig();return plugins.push(await svelteDocgen(svelteConfig)),await handleSvelteKit(plugins,options),{...config,plugins}};0&&(module.exports={core,viteFinal});
2
+ `+typeTag.comment).trim())}if(prop.valueDeclaration?.getSourceFile().fileName.includes("node_modules/svelte/elements.d.ts"))return;let optional=(prop.flags&import_typescript.default.SymbolFlags.Optional)!==0;propMap.set(name,{name,optional,description,type:convertType(propType,checker)})})}}),renderFunction.body?.forEachChild(node=>{import_typescript.default.isVariableStatement(node)&&node.declarationList.declarations.forEach(declaration=>{if(import_typescript.default.isObjectBindingPattern(declaration.name)){let isPropsRune=declaration.initializer&&import_typescript.default.isCallExpression(declaration.initializer)&&import_typescript.default.isIdentifier(declaration.initializer.expression)&&declaration.initializer.expression.text==="$props",isPropsType=declaration.type&&propsType===checker.getTypeFromTypeNode(declaration.type);(isPropsRune||isPropsType)&&(propsRuneUsed=!0,declaration.name.elements.forEach(element=>{let name=element.name.getText(),prop=propMap.get(name);if(prop&&element.initializer){let defaultValue=initializerToDefaultValue(element.initializer,checker);defaultValue&&(prop.defaultValue=defaultValue)}}))}if(import_typescript.default.isVariableDeclaration(declaration)&&import_typescript.default.isIdentifier(declaration.name)&&propMap.has(declaration.name.text)){let prop=propMap.get(declaration.name.text);if(prop&&declaration.initializer){prop.optional=!0;let defaultValue=initializerToDefaultValue(declaration.initializer,checker);defaultValue&&(prop.defaultValue=defaultValue)}}})}),{props:Array.from(propMap.values()),propsRuneUsed}}var svelteDocParserOptions=require("sveltedoc-parser/lib/options.js");svelteDocParserOptions.getAstDefaultOptions=()=>({range:!0,loc:!0,comment:!0,tokens:!0,ecmaVersion:12,sourceType:"module",ecmaFeatures:{}});function getComponentName(ast){let exportDefaultDeclaration=ast.body.find(n=>n.type==="ExportDefaultDeclaration");if(!exportDefaultDeclaration)throw new Error("Unreachable - no default export found");if(exportDefaultDeclaration.declaration.type==="Identifier")return exportDefaultDeclaration.declaration.name;if(exportDefaultDeclaration.declaration.type!=="ClassDeclaration"&&exportDefaultDeclaration.declaration.type!=="FunctionDeclaration")throw new Error("Unreachable - not a class or a function");if(!exportDefaultDeclaration.declaration.id)throw new Error("Unreachable - unnamed class/function");return exportDefaultDeclaration.declaration.id.name}function transformToSvelteDocParserType(type){switch(type.type){case"string":return{kind:"type",type:"string",text:"string"};case"number":return{kind:"type",type:"number",text:"number"};case"boolean":return{kind:"type",type:"boolean",text:"boolean"};case"symbol":return{kind:"type",type:"other",text:"symbol"};case"null":return{kind:"type",type:"other",text:"null"};case"undefined":return{kind:"type",type:"other",text:"undefined"};case"void":return{kind:"type",type:"other",text:"void"};case"any":return{kind:"type",type:"any",text:"any"};case"object":return{kind:"type",type:"object",text:type.text};case"array":return{kind:"type",type:"array",text:type.text};case"function":return{kind:"function",text:type.text};case"literal":return{kind:"const",type:typeof type.value,value:type.value,text:type.text};case"union":{let nonNull=type.types.filter(t=>t.type!=="null"),text=nonNull.map(t=>transformToSvelteDocParserType(t).text).join(" | "),types=nonNull.map(t=>transformToSvelteDocParserType(t));return types.length===1?types[0]:{kind:"union",type:types,text}}case"intersection":return{kind:"type",type:"intersection",text:type.types.map(t=>transformToSvelteDocParserType(t).text).join(" & ")}}}function transformToSvelteDocParserDataItems(docgen){return docgen.props.map(p=>{let required=p.optional===!1&&p.defaultValue===void 0;return{name:p.name,visibility:"public",description:p.description,keywords:required?[{name:"required",description:""}]:[],kind:"let",type:p.type?transformToSvelteDocParserType(p.type):void 0,static:!1,readonly:!1,importPath:void 0,originalName:void 0,localName:void 0,defaultValue:p.defaultValue?p.defaultValue.text:void 0}})}async function svelteDocgen(svelteOptions={}){let cwd=process.cwd(),{preprocess:preprocessOptions,logDocgen=!1}=svelteOptions,include=/\.svelte$/,exclude=/node_modules\/.*/,{createFilter}=await import("vite"),filter=createFilter(include,exclude),sourceFileCache=createDocgenCache(),docPreprocessOptions;return{name:"storybook:svelte-docgen-plugin",async transform(src,id){if(id.startsWith("\0")||!filter(id))return;let resource=(0,import_node_path2.relative)(cwd,id),docgen=generateDocgen(resource,sourceFileCache),data=transformToSvelteDocParserDataItems(docgen),componentDoc={};if(!docgen.propsRuneUsed){if(preprocessOptions&&!docPreprocessOptions){docPreprocessOptions=[(0,import_svelte_preprocess.replace)([[/<style.+<\/style>/gims,""]])];try{require.resolve("typescript")&&docPreprocessOptions.unshift((0,import_svelte_preprocess.typescript)())}catch{}}let docOptions;if(docPreprocessOptions){let rawSource;try{rawSource=(0,import_node_fs.readFileSync)(resource).toString()}catch{return}let{code:fileContent}=await(0,import_compiler2.preprocess)(rawSource,docPreprocessOptions,{filename:resource});docOptions={fileContent}}else docOptions={filename:resource};let options={...docOptions,version:3};try{componentDoc=await import_sveltedoc_parser.default.parse(options)}catch(error){componentDoc={keywords:[],data:[]},logDocgen&&import_node_logger.logger.error(error)}}componentDoc.data=data;let file=(0,import_node_path2.basename)(resource);componentDoc.name=(0,import_node_path2.basename)(file);let s=new import_magic_string.default(src),outputAst=this.parse(src),componentName=getComponentName(outputAst);return s.append(`
3
+ ;${componentName}.__docgen = ${JSON.stringify(componentDoc)}`),{code:s.toString(),map:s.generateMap({hires:!0,source:id})}}}}var import_server_errors=require("storybook/internal/server-errors"),import_builder_vite=require("@storybook/builder-vite");async function handleSvelteKit(plugins,options){let frameworkPreset=await options.presets.apply("framework",{},options),framework=typeof frameworkPreset=="string"?frameworkPreset:frameworkPreset.name;if(await(0,import_builder_vite.hasVitePlugins)(plugins,["vite-plugin-svelte-kit","vite-plugin-sveltekit-setup","vite-plugin-sveltekit-compile"])&&!framework.includes("@storybook/sveltekit"))throw new import_server_errors.SvelteViteWithSvelteKitError}var getAbsolutePath=input=>(0,import_node_path3.dirname)(require.resolve((0,import_node_path3.join)(input,"package.json"))),core={builder:getAbsolutePath("@storybook/builder-vite"),renderer:getAbsolutePath("@storybook/svelte")},viteFinal=async(config,options)=>{let{plugins=[]}=config,{loadSvelteConfig}=await import("@sveltejs/vite-plugin-svelte"),svelteConfig=await loadSvelteConfig();return plugins.push(await svelteDocgen(svelteConfig)),await handleSvelteKit(plugins,options),{...config,plugins}};0&&(module.exports={core,viteFinal});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@storybook/svelte-vite",
3
- "version": "9.0.0-alpha.8",
3
+ "version": "9.0.0-beta.0",
4
4
  "description": "Storybook for Svelte and Vite: Develop Svelte components in isolation with Hot Reloading.",
5
5
  "keywords": [
6
6
  "storybook"
@@ -54,8 +54,8 @@
54
54
  "prep": "jiti ../../../scripts/prepare/bundle.ts"
55
55
  },
56
56
  "dependencies": {
57
- "@storybook/builder-vite": "9.0.0-alpha.8",
58
- "@storybook/svelte": "9.0.0-alpha.8",
57
+ "@storybook/builder-vite": "9.0.0-beta.0",
58
+ "@storybook/svelte": "9.0.0-beta.0",
59
59
  "magic-string": "^0.30.0",
60
60
  "svelte-preprocess": "^5.1.1",
61
61
  "svelte2tsx": "^0.7.35",
@@ -68,16 +68,16 @@
68
68
  "@types/node": "^22.0.0",
69
69
  "svelte": "^5.0.5",
70
70
  "typescript": "^5.7.3",
71
- "vite": "^4.0.0"
71
+ "vite": "^6.2.5"
72
72
  },
73
73
  "peerDependencies": {
74
74
  "@sveltejs/vite-plugin-svelte": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0",
75
- "storybook": "^9.0.0-alpha.8",
76
- "svelte": "^4.0.0 || ^5.0.0",
77
- "vite": "^4.0.0 || ^5.0.0 || ^6.0.0"
75
+ "storybook": "^9.0.0-beta.0",
76
+ "svelte": "^5.0.0",
77
+ "vite": "^5.0.0 || ^6.0.0"
78
78
  },
79
79
  "engines": {
80
- "node": ">=18.0.0"
80
+ "node": ">=20.0.0"
81
81
  },
82
82
  "publishConfig": {
83
83
  "access": "public"
@@ -16,7 +16,7 @@
16
16
  },
17
17
  },
18
18
  args: {
19
- onClick: fn(),
19
+ onclick: fn(),
20
20
  }
21
21
  });
22
22
  </script>
@@ -2,35 +2,26 @@
2
2
  import './button.css';
3
3
 
4
4
  /**
5
- * Is this the principal call to action on the page?
5
+ * @typedef {Object} Props
6
+ * @property {boolean} [primary] Is this the principal call to action on the page?
7
+ * @property {string} [backgroundColor] What background color to use
8
+ * @property {'small' | 'medium' | 'large'} [size] How large should the button be?
9
+ * @property {string} label Button contents
10
+ * @property {() => void} [onclick] The onclick event handler
6
11
  */
7
- export let primary = false;
8
12
 
9
- /**
10
- * @type {string} What background color to use
11
- */
12
- export let backgroundColor = undefined;
13
-
14
- /**
15
- * @type {'small' | 'medium' | 'large'} How large should the button be?
16
- */
17
- export let size = 'medium';
18
-
19
- /**
20
- * @type {string} Button contents
21
- */
22
- export let label;
23
-
24
- $: mode = primary ? 'storybook-button--primary' : 'storybook-button--secondary';
13
+ /** @type {Props} */
14
+ const { primary = false, backgroundColor, size = 'medium', label, ...props } = $props();
25
15
 
26
- $: style = backgroundColor ? `background-color: ${backgroundColor}` : '';
16
+ let mode = $derived(primary ? 'storybook-button--primary' : 'storybook-button--secondary');
17
+ let style = $derived(backgroundColor ? `background-color: ${backgroundColor}` : '');
27
18
  </script>
28
19
 
29
20
  <button
30
21
  type="button"
31
22
  class={['storybook-button', `storybook-button--${size}`, mode].join(' ')}
32
23
  {style}
33
- on:click
24
+ {...props}
34
25
  >
35
26
  {label}
36
27
  </button>
@@ -2,21 +2,16 @@
2
2
  import './header.css';
3
3
  import Button from './Button.svelte';
4
4
 
5
- import { createEventDispatcher } from 'svelte';
5
+ /**
6
+ * @typedef {Object} Props
7
+ * @property {{name: string}} [user] The user object
8
+ * @property {() => void} [onLogin] The login event handler
9
+ * @property {() => void} [onLogout] The logout event handler
10
+ * @property {() => void} [onCreateAccount] The account creation event handler
11
+ */
6
12
 
7
- export let user = null;
8
-
9
- const dispatch = createEventDispatcher();
10
-
11
- function onLogin(event) {
12
- dispatch('login', event);
13
- }
14
- function onLogout(event) {
15
- dispatch('logout', event);
16
- }
17
- function onCreateAccount(event) {
18
- dispatch('createAccount', event);
19
- }
13
+ /** @type {Props} */
14
+ const { user, onLogin, onLogout, onCreateAccount } = $props();
20
15
  </script>
21
16
 
22
17
  <header>
@@ -42,10 +37,10 @@
42
37
  <span class="welcome">
43
38
  Welcome, <b>{user.name}</b>!
44
39
  </span>
45
- <Button size="small" on:click={onLogout} label="Log out" />
40
+ <Button size="small" onclick={onLogout} label="Log out" />
46
41
  {:else}
47
- <Button size="small" on:click={onLogin} label="Log in" />
48
- <Button primary size="small" on:click={onCreateAccount} label="Sign up" />
42
+ <Button size="small" onclick={onLogin} label="Log in" />
43
+ <Button primary size="small" onclick={onCreateAccount} label="Sign up" />
49
44
  {/if}
50
45
  </div>
51
46
  </div>
@@ -1,6 +1,6 @@
1
1
  <script module>
2
2
  import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import { expect, userEvent, waitFor, within } from '@storybook/test';
3
+ import { expect, userEvent, waitFor, within } from 'storybook/test';
4
4
  import Page from './Page.svelte';
5
5
  import { fn } from 'storybook/test';
6
6
 
@@ -2,15 +2,15 @@
2
2
  import './page.css';
3
3
  import Header from './Header.svelte';
4
4
 
5
- let user = null;
5
+ let user = $state(null);
6
6
  </script>
7
7
 
8
8
  <article>
9
9
  <Header
10
10
  {user}
11
- on:login={() => (user = { name: 'Jane Doe' })}
12
- on:logout={() => (user = null)}
13
- on:createAccount={() => (user = { name: 'Jane Doe' })}
11
+ onLogin={() => (user = { name: 'Jane Doe' })}
12
+ onLogout={() => (user = null)}
13
+ onCreateAccount={() => (user = { name: 'Jane Doe' })}
14
14
  />
15
15
 
16
16
  <section class="storybook-page">
@@ -16,7 +16,7 @@
16
16
  },
17
17
  },
18
18
  args: {
19
- onClick: fn(),
19
+ onclick: fn(),
20
20
  }
21
21
  });
22
22
  </script>
@@ -11,19 +11,20 @@
11
11
  /** Button contents */
12
12
  label: string;
13
13
  /** The onclick event handler */
14
- onClick?: () => void;
14
+ onclick?: () => void;
15
15
  }
16
+
17
+ const { primary = false, backgroundColor, size = 'medium', label, ...props }: Props = $props();
16
18
 
17
- const { primary = false, backgroundColor, size = 'medium', label, onClick }: Props = $props();
19
+ let mode = $derived(primary ? 'storybook-button--primary' : 'storybook-button--secondary');
20
+ let style = $derived(backgroundColor ? `background-color: ${backgroundColor}` : '');
18
21
  </script>
19
22
 
20
23
  <button
21
24
  type="button"
22
- class={['storybook-button', `storybook-button--${size}`].join(' ')}
23
- class:storybook-button--primary={primary}
24
- class:storybook-button--secondary={!primary}
25
- style:background-color={backgroundColor}
26
- onclick={onClick}
25
+ class={['storybook-button', `storybook-button--${size}`, mode].join(' ')}
26
+ {style}
27
+ {...props}
27
28
  >
28
29
  {label}
29
30
  </button>
@@ -35,10 +35,10 @@
35
35
  <span class="welcome">
36
36
  Welcome, <b>{user.name}</b>!
37
37
  </span>
38
- <Button size="small" onClick={onLogout} label="Log out" />
38
+ <Button size="small" onclick={onLogout} label="Log out" />
39
39
  {:else}
40
- <Button size="small" onClick={onLogin} label="Log in" />
41
- <Button primary size="small" onClick={onCreateAccount} label="Sign up" />
40
+ <Button size="small" onclick={onLogin} label="Log in" />
41
+ <Button primary size="small" onclick={onCreateAccount} label="Sign up" />
42
42
  {/if}
43
43
  </div>
44
44
  </div>
@@ -1,6 +1,6 @@
1
1
  <script module>
2
2
  import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import { expect, userEvent, waitFor, within } from '@storybook/test';
3
+ import { expect, userEvent, waitFor, within } from 'storybook/test';
4
4
  import Page from './Page.svelte';
5
5
  import { fn } from 'storybook/test';
6
6
 
@@ -0,0 +1,17 @@
1
+ import JSDoc from './jsdoc.svelte';
2
+
3
+ /** @typedef {import('@storybook/svelte-vite').StoryObj} StoryObj */
4
+
5
+ /** @type {Meta<typeof JSDoc>} */
6
+ const meta = {
7
+ component: JSDoc,
8
+ tags: ['autodocs'],
9
+ render: (args, { argTypes }) => ({
10
+ Component: JSDoc,
11
+ props: { ...args, argTypes },
12
+ }),
13
+ };
14
+
15
+ export default meta;
16
+
17
+ export const Default = {};
@@ -0,0 +1,92 @@
1
+ <script>
2
+ /**
3
+ * @typedef {Object} MyObject
4
+ * @property {string} foo
5
+ * @property {number} bar
6
+ */
7
+
8
+ /**
9
+ * @typedef {Object} MyProps
10
+ * @property {boolean} [boolean] Boolean
11
+ * @property {string} [string] String
12
+ * @property {string} stringRequired String (required)
13
+ * @property {number} [number] Number
14
+ * @property {true} [trueLiteral] True literal
15
+ * @property {symbol} [symbol] Symbol
16
+ * @property {null} [nullValue] Null
17
+ * @property {undefined} [undefinedValue] Undefined
18
+ * @property {any} [any] Any
19
+ * @property {Date} [date] Date
20
+ * @property {import('./types').LiteralStrings} [unionLiteralStrings] Union of literal strings
21
+ * @property {import('./types').LiteralNumbers} [unionLiteralNumbers] Union of literal numbers
22
+ * @property {MyObject} [object] Object
23
+ * @property {{ foo: string; bar: number }} [inlineObject] Inline object
24
+ * @property {Record<string, number>} [record] Record
25
+ * @property {number | string} [unionTypes] Union of types
26
+ * @property {{ a: number } & { b: string }} [intersection] Intersection of types
27
+ * @property {(event: MouseEvent) => number} [func] Event callback function
28
+ * @property {import('svelte').Snippet} children Snippet contents
29
+ * @property {Record<string, any>} [argTypes] Actual arg types inferred from the component
30
+ */
31
+
32
+ /** @type {MyProps} */
33
+ let {
34
+ boolean = true,
35
+ string = 'default',
36
+ stringRequired,
37
+ number = 123,
38
+ trueLiteral = undefined,
39
+ symbol = undefined,
40
+ nullValue = null,
41
+ undefinedValue = undefined,
42
+ any = undefined,
43
+ date = new Date('20 Jan 1983'),
44
+ unionLiteralStrings = 'apple',
45
+ unionLiteralNumbers = 1000,
46
+ object = undefined,
47
+ inlineObject = undefined,
48
+ record = { a: 1, b: 2 },
49
+ unionTypes = 123,
50
+ intersection = undefined,
51
+ func = () => 10,
52
+ children,
53
+ argTypes,
54
+ } = $props();
55
+ </script>
56
+
57
+ <h1>Docgen: JS - JSDoc</h1>
58
+
59
+ <h2>Args</h2>
60
+ <pre>{JSON.stringify(
61
+ {
62
+ boolean,
63
+ string,
64
+ stringRequired,
65
+ number,
66
+ trueLiteral,
67
+ symbol,
68
+ nullValue,
69
+ undefinedValue,
70
+ any,
71
+ date,
72
+ unionLiteralStrings,
73
+ unionLiteralNumbers,
74
+ object,
75
+ inlineObject,
76
+ record,
77
+ unionTypes,
78
+ intersection,
79
+ func,
80
+ argTypes,
81
+ },
82
+ null,
83
+ 2
84
+ )}</pre>
85
+
86
+ <h2>Children</h2>
87
+ {#if children}
88
+ {@render children()}
89
+ {/if}
90
+
91
+ <h2>Arg Types</h2>
92
+ <pre>{JSON.stringify(argTypes, null, 2)}</pre>
@@ -0,0 +1,17 @@
1
+ import JSDoc from './jsdoc.svelte';
2
+
3
+ /** @typedef {import('@storybook/svelte-vite').StoryObj} StoryObj */
4
+
5
+ /** @type {Meta<typeof JSDoc>} */
6
+ const meta = {
7
+ component: JSDoc,
8
+ tags: ['autodocs'],
9
+ render: (args, { argTypes }) => ({
10
+ Component: JSDoc,
11
+ props: { ...args, argTypes },
12
+ }),
13
+ };
14
+
15
+ export default meta;
16
+
17
+ export const Default = {};
@@ -0,0 +1,91 @@
1
+ <script>
2
+ /**
3
+ * @typedef {Object} MyObject
4
+ * @property {string} foo
5
+ * @property {number} bar
6
+ */
7
+
8
+ /**
9
+ * @typedef {Object} MyProps
10
+ * @property {boolean} [boolean] Boolean
11
+ * @property {string} [string] String
12
+ * @property {string} stringRequired String (required)
13
+ * @property {number} [number] Number
14
+ * @property {true} [trueLiteral] True literal
15
+ * @property {symbol} [symbol] Symbol
16
+ * @property {null} [nullValue] Null
17
+ * @property {undefined} [undefinedValue] Undefined
18
+ * @property {any} [any] Any
19
+ * @property {import('./types').LiteralStrings} [unionLiteralStrings] Union of literal strings
20
+ * @property {import('./types').LiteralNumbers} [unionLiteralNumbers] Union of literal numbers
21
+ * @property {MyObject} [object] Object
22
+ * @property {{ foo: string; bar: number }} [inlineObject] Inline object
23
+ * @property {Record<string, number>} [record] Record
24
+ * @property {Date} [date] Date
25
+ * @property {number | string} [unionTypes] Union of types
26
+ * @property {{ a: number } & { b: string }} [intersection] Intersection of types
27
+ * @property {import('svelte').Snippet} children Snippet contents
28
+ * @property {(event: MouseEvent) => number} [func] Event callback function
29
+ * @property {Record<string, any>} [argTypes] Actual arg types inferred from the component
30
+ */
31
+
32
+ /** @type {MyProps} */
33
+ let {
34
+ boolean = true,
35
+ string = 'default',
36
+ stringRequired,
37
+ number = 123,
38
+ trueLiteral = undefined,
39
+ symbol = undefined,
40
+ nullValue = null,
41
+ undefinedValue = undefined,
42
+ any = undefined,
43
+ unionLiteralStrings = 'apple',
44
+ unionLiteralNumbers = 1000,
45
+ object = undefined,
46
+ inlineObject = undefined,
47
+ record = { a: 1, b: 2 },
48
+ date = new Date('20 Jan 1983'),
49
+ unionTypes = 123,
50
+ intersection = undefined,
51
+ children,
52
+ func = () => 10,
53
+ argTypes,
54
+ } = $props();
55
+ </script>
56
+
57
+ <h1>Docgen: JS - JSDoc</h1>
58
+
59
+ <h2>Args</h2>
60
+ <pre>{JSON.stringify(
61
+ {
62
+ boolean,
63
+ string,
64
+ stringRequired,
65
+ number,
66
+ trueLiteral,
67
+ symbol,
68
+ nullValue,
69
+ undefinedValue,
70
+ any,
71
+ date,
72
+ unionLiteralStrings,
73
+ unionLiteralNumbers,
74
+ object,
75
+ inlineObject,
76
+ record,
77
+ unionTypes,
78
+ intersection,
79
+ func,
80
+ },
81
+ null,
82
+ 2
83
+ )}</pre>
84
+
85
+ <h2>Children</h2>
86
+ {#if children}
87
+ {@render children()}
88
+ {/if}
89
+
90
+ <h2>Arg Types</h2>
91
+ <pre>{JSON.stringify(argTypes, null, 2)}</pre>
@@ -0,0 +1,16 @@
1
+ import type { Meta } from '@storybook/svelte-vite';
2
+
3
+ import TSInlinePropTypes from './ts-inline-prop-types.svelte';
4
+
5
+ const meta = {
6
+ component: TSInlinePropTypes,
7
+ tags: ['autodocs'],
8
+ render: (args, { argTypes }) => ({
9
+ Component: TSInlinePropTypes,
10
+ props: { ...args, argTypes },
11
+ }),
12
+ } satisfies Meta<typeof TSInlinePropTypes>;
13
+
14
+ export default meta;
15
+
16
+ export const Default = {};
@@ -0,0 +1,103 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import type { LiteralNumbers, LiteralStrings } from './types';
4
+ import { MyEnum } from './types';
5
+
6
+ type MyObject = {
7
+ foo: string;
8
+ bar: number;
9
+ };
10
+
11
+ let {
12
+ boolean = true,
13
+ string = 'default',
14
+ stringRequired,
15
+ number = 123,
16
+ nullValue = null,
17
+ arrayOfNumbers = [1, 20, 300],
18
+ enumValue = MyEnum.FOO,
19
+ record = { a: 1, b: 2 },
20
+ date = new Date('20 Jan 1983'),
21
+ unionTypes = 123,
22
+ func = () => 10,
23
+ children,
24
+ argTypes,
25
+ }: {
26
+ /** Boolean */
27
+ boolean?: boolean;
28
+ /** String */
29
+ string?: string;
30
+ /** String (required) */
31
+ stringRequired: string;
32
+ /** Number */
33
+ number?: number;
34
+ /** True literal */
35
+ trueLiteral?: true;
36
+ /** Symbol */
37
+ symbol?: symbol;
38
+ /** Null */
39
+ nullValue?: null;
40
+ /** Undefined */
41
+ undefinedValue?: undefined;
42
+ /** Any */
43
+ any?: any;
44
+ /** Date */
45
+ date?: Date;
46
+ /** Array of numbers */
47
+ arrayOfNumbers?: number[];
48
+ /** Enum */
49
+ enumValue?: MyEnum;
50
+ /** Union of literal strings */
51
+ unionLiteralStrings?: LiteralStrings;
52
+ /** Union of literal numbers */
53
+ unionLiteralNumbers?: LiteralNumbers;
54
+ /** Object */
55
+ object?: MyObject;
56
+ /** Inline object */
57
+ inlineObject?: {
58
+ foo: string;
59
+ bar: number;
60
+ };
61
+ /** Record */
62
+ record?: Record<string, number>;
63
+ /** Union of types */
64
+ unionTypes?: number | string;
65
+ /** Intersection of types */
66
+ intersection?: { a: number } & { b: string };
67
+ /** Event callback function */
68
+ func?: (event: MouseEvent) => number;
69
+ /** Snippet contents */
70
+ children: Snippet;
71
+ /** Actual arg types inferred from the component */
72
+ argTypes: Record<string, any>;
73
+ } = $props();
74
+ </script>
75
+
76
+ <h1>Docgen: TS - inline prop types</h1>
77
+
78
+ <h2>Args</h2>
79
+ <pre>{JSON.stringify(
80
+ {
81
+ boolean,
82
+ string,
83
+ stringRequired,
84
+ number,
85
+ nullValue,
86
+ date,
87
+ arrayOfNumbers,
88
+ enumValue,
89
+ record,
90
+ unionTypes,
91
+ func,
92
+ },
93
+ null,
94
+ 2
95
+ )}</pre>
96
+
97
+ <h2>Children</h2>
98
+ {#if children}
99
+ {@render children()}
100
+ {/if}
101
+
102
+ <h2>Arg Types</h2>
103
+ <pre>{JSON.stringify(argTypes, null, 2)}</pre>
@@ -0,0 +1,16 @@
1
+ import type { Meta } from '@storybook/svelte-vite';
2
+
3
+ import TSLegacy from './ts-legacy.svelte';
4
+
5
+ const meta = {
6
+ component: TSLegacy,
7
+ tags: ['autodocs'],
8
+ render: (args, { argTypes }) => ({
9
+ Component: TSLegacy,
10
+ props: { ...args, argTypes } as any,
11
+ }),
12
+ } satisfies Meta<typeof TSLegacy>;
13
+
14
+ export default meta;
15
+
16
+ export const Default = {};