@storybook/codemod 0.0.0-pr-23611-sha-0c8cd76e → 0.0.0-pr-23691-sha-8f3fbd86
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -50
- package/dist/transforms/add-component-parameters.d.ts +22 -0
- package/dist/transforms/csf-2-to-3.js +2 -2
- package/dist/transforms/csf-hoist-story-annotations.d.ts +26 -0
- package/dist/transforms/move-builtin-addons.d.ts +3 -0
- package/dist/transforms/storiesof-to-csf.d.ts +24 -0
- package/dist/transforms/update-addon-info.d.ts +27 -0
- package/dist/transforms/update-organisation-name.d.ts +25 -0
- package/dist/transforms/upgrade-deprecated-types.js +1 -1
- package/dist/transforms/upgrade-hierarchy-separators.d.ts +3 -0
- package/package.json +4 -4
- package/src/transforms/csf-2-to-3.ts +2 -3
- package/src/transforms/upgrade-deprecated-types.ts +4 -4
package/dist/index.d.ts
CHANGED
@@ -1,54 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
'@kadira/react-storybook-decorator-centered': string;
|
4
|
-
'@kadira/storybook-addons': string;
|
5
|
-
'@kadira/storybook-addon-actions': string;
|
6
|
-
'@kadira/storybook-addon-comments': string;
|
7
|
-
'@kadira/storybook-addon-graphql': string;
|
8
|
-
'@kadira/storybook-addon-info': string;
|
9
|
-
'@kadira/storybook-addon-knobs': string;
|
10
|
-
'@kadira/storybook-addon-links': string;
|
11
|
-
'@kadira/storybook-addon-notes': string;
|
12
|
-
'@kadira/storybook-addon-options': string;
|
13
|
-
'@kadira/storybook-channels': string;
|
14
|
-
'@kadira/storybook-channel-postmsg': string;
|
15
|
-
'@kadira/storybook-channel-websocket': string;
|
16
|
-
'@kadira/storybook-ui': string;
|
17
|
-
'@kadira/react-native-storybook': string;
|
18
|
-
'@kadira/react-storybook': string;
|
19
|
-
'@kadira/getstorybook': string;
|
20
|
-
'@kadira/storybook': string;
|
21
|
-
storyshots: string;
|
22
|
-
getstorybook: string;
|
23
|
-
};
|
24
|
-
|
25
|
-
/**
|
26
|
-
* Takes the deprecated addon-info API, addWithInfo, and
|
27
|
-
* converts to the new withInfo API.
|
28
|
-
*
|
29
|
-
* Example of deprecated addWithInfo API:
|
30
|
-
*
|
31
|
-
* storiesOf('Button')
|
32
|
-
* .addWithInfo(
|
33
|
-
* 'story name',
|
34
|
-
* 'Story description.',
|
35
|
-
* () => (
|
36
|
-
* <Button label="The Button" />
|
37
|
-
* )
|
38
|
-
* )
|
39
|
-
*
|
40
|
-
* Converts to the new withInfo API:
|
41
|
-
*
|
42
|
-
* storiesOf('Button')
|
43
|
-
* .add('story name', withInfo(
|
44
|
-
* 'Story description.'
|
45
|
-
* )(() => (
|
46
|
-
* <Button label="The Button" />
|
47
|
-
* )))
|
48
|
-
*/
|
49
|
-
declare function transformer(file: any, api: any): any;
|
1
|
+
export { packageNames, default as updateOrganisationName } from './transforms/update-organisation-name.js';
|
2
|
+
export { default as updateAddonInfo } from './transforms/update-addon-info.js';
|
50
3
|
|
51
4
|
declare function listCodemods(): string[];
|
52
5
|
declare function runCodemod(codemod: any, { glob, logger, dryRun, rename, parser }: any): Promise<void>;
|
53
6
|
|
54
|
-
export { listCodemods,
|
7
|
+
export { listCodemods, runCodemod };
|
@@ -0,0 +1,22 @@
|
|
1
|
+
/**
|
2
|
+
* Adds a `component` parameter for each storiesOf(...) call.
|
3
|
+
*
|
4
|
+
* For example:
|
5
|
+
*
|
6
|
+
* input { Button } from './Button';
|
7
|
+
* storiesOf('Button', module).add('story', () => <Button label="The Button" />);
|
8
|
+
*
|
9
|
+
* Becomes:
|
10
|
+
*
|
11
|
+
* input { Button } from './Button';
|
12
|
+
* storiesOf('Button', module)
|
13
|
+
* .addParameters({ component: Button })
|
14
|
+
* .add('story', () => <Button label="The Button" />);
|
15
|
+
*
|
16
|
+
* Heuristics:
|
17
|
+
* - The storiesOf "kind" name must be Button
|
18
|
+
* - Button must be imported in the file
|
19
|
+
*/
|
20
|
+
declare function transformer(file: any, api: any): any;
|
21
|
+
|
22
|
+
export { transformer as default };
|
@@ -1,3 +1,3 @@
|
|
1
|
-
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 csf_2_to_3_exports={};__export(csf_2_to_3_exports,{default:()=>transform,parser:()=>parser});module.exports=__toCommonJS(csf_2_to_3_exports);var import_prettier2=__toESM(require("prettier")),t2=__toESM(require("@babel/types")),import_types=require("@babel/types"),import_csf_tools2=require("@storybook/csf-tools"),babel2=__toESM(require("@babel/core"))
|
2
|
-
Rename this local import and try again.`);specifier.remove()}}})}}),file.path.traverse({TSTypeReference:path=>{let typeName=path.get("typeName");if(typeName.isIdentifier())typeReferencesToUpdate.has(typeName.node.name)&&typeName.replaceWith(t.identifier(migrateType(typeName.node.name)));else if(typeName.isTSQualifiedName()){let namespace=typeName.get("left");if(namespace.isIdentifier()&&importedNamespaces.has(namespace.node.name)){let right=typeName.get("right");deprecatedTypes.includes(right.node.name)&&right.replaceWith(t.identifier(migrateType(right.node.name)))}}}})}var logger=console,renameAnnotation=annotation=>annotation==="storyName"?"name":annotation,getTemplateBindVariable=init=>t2.isCallExpression(init)&&t2.isMemberExpression(init.callee)&&t2.isIdentifier(init.callee.object)&&t2.isIdentifier(init.callee.property)&&init.callee.property.name==="bind"&&(init.arguments.length===0||init.arguments.length===1&&t2.isObjectExpression(init.arguments[0])&&init.arguments[0].properties.length===0)?init.callee.object.name:null,isStoryAnnotation=(stmt,objectExports)=>t2.isExpressionStatement(stmt)&&t2.isAssignmentExpression(stmt.expression)&&t2.isMemberExpression(stmt.expression.left)&&t2.isIdentifier(stmt.expression.left.object)&&objectExports[stmt.expression.left.object.name],getNewExport=(stmt,objectExports)=>{if(t2.isExportNamedDeclaration(stmt)&&t2.isVariableDeclaration(stmt.declaration)&&stmt.declaration.declarations.length===1){let decl=stmt.declaration.declarations[0];if(t2.isVariableDeclarator(decl)&&t2.isIdentifier(decl.id))return objectExports[decl.id.name]}return null},isReactGlobalRenderFn=(csf,storyFn)=>{var _a;if((_a=csf._meta)!=null&&_a.component&&t2.isArrowFunctionExpression(storyFn)&&storyFn.params.length===1&&t2.isJSXElement(storyFn.body)){let{openingElement}=storyFn.body;if(openingElement.selfClosing&&t2.isJSXIdentifier(openingElement.name)&&openingElement.attributes.length===1){let attr=openingElement.attributes[0],param=storyFn.params[0];if(t2.isJSXSpreadAttribute(attr)&&t2.isIdentifier(attr.argument)&&t2.isIdentifier(param)&¶m.name===attr.argument.name&&csf._meta.component===openingElement.name.name)return!0}}return!1},isSimpleCSFStory=(init,annotations)=>annotations.length===0&&t2.isArrowFunctionExpression(init)&&init.params.length===0;function removeUnusedTemplates(csf){Object.entries(csf._templates).forEach(([template,templateExpression])=>{let references=[];if(babel2.traverse(csf._ast,{Identifier:path=>{path.node.name===template&&references.push(path)}}),references.length===1){let reference=references[0];reference.parentPath.isVariableDeclarator()&&reference.parentPath.node.init===templateExpression&&reference.parentPath.remove()}})}function transform(info,api,options){let makeTitle=userTitle=>userTitle||"FIXME",csf=(0,import_csf_tools2.loadCsf)(info.source,{makeTitle});try{csf.parse()}catch(err){return logger.log(`Error ${err}, skipping`),info.source}let file=new babel2.File({filename:info.path},{code:info.source,ast:csf._ast}),importHelper=new StorybookImportHelper(file,info),objectExports={};Object.entries(csf._storyExports).forEach(([key,decl])=>{let annotations=Object.entries(csf._storyAnnotations[key]).map(([annotation,val])=>t2.objectProperty(t2.identifier(renameAnnotation(annotation)),val));if(t2.isVariableDeclarator(decl)){let{init,id}=decl,template=getTemplateBindVariable(init);if(!t2.isArrowFunctionExpression(init)&&!template)return;if(isSimpleCSFStory(init,annotations)){objectExports[key]=t2.exportNamedDeclaration(t2.variableDeclaration("const",[t2.variableDeclarator(importHelper.updateTypeTo(id,"StoryFn"),init)]));return}let storyFn=template&&t2.identifier(template);storyFn||(storyFn=init);let renderAnnotation=isReactGlobalRenderFn(csf,template?csf._templates[template]:storyFn)?[]:[t2.objectProperty(t2.identifier("render"),storyFn)];objectExports[key]=t2.exportNamedDeclaration(t2.variableDeclaration("const",[t2.variableDeclarator(importHelper.updateTypeTo(id,"StoryObj"),t2.objectExpression([...renderAnnotation,...annotations]))]))}}),csf._ast.program.body=csf._ast.program.body.reduce((acc,stmt)=>{let statement=stmt;if(isStoryAnnotation(statement,objectExports))return acc;let newExport=getNewExport(statement,objectExports);return newExport?(acc.push(newExport),acc):(acc.push(statement),acc)},[]),upgradeDeprecatedTypes(file),importHelper.removeDeprecatedStoryImport(),removeUnusedTemplates(csf);let output=
|
1
|
+
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 csf_2_to_3_exports={};__export(csf_2_to_3_exports,{default:()=>transform,parser:()=>parser});module.exports=__toCommonJS(csf_2_to_3_exports);var import_prettier2=__toESM(require("prettier")),t2=__toESM(require("@babel/types")),import_types=require("@babel/types"),import_csf_tools2=require("@storybook/csf-tools"),babel2=__toESM(require("@babel/core"));var import_prettier=__toESM(require("prettier")),babel=__toESM(require("@babel/core")),import_csf_tools=require("@storybook/csf-tools"),t=__toESM(require("@babel/types"));var deprecatedTypes=["ComponentStory","ComponentStoryFn","ComponentStoryObj","ComponentMeta","Story"];function migrateType(oldType){return oldType==="Story"||oldType==="ComponentStory"?"StoryFn":oldType.replace("Component","")}function upgradeDeprecatedTypes(file){let importedNamespaces=new Set,typeReferencesToUpdate=new Set,existingImports=[];file.path.traverse({ImportDeclaration:path=>{existingImports.push(...path.get("specifiers").map(specifier=>({name:specifier.node.local.name,isAlias:!(specifier.isImportSpecifier()&&t.isIdentifier(specifier.node.imported)&&specifier.node.local.name===specifier.node.imported.name),path:specifier}))),path.node.source.value.startsWith("@storybook")&&path.get("specifiers").forEach(specifier=>{if(specifier.isImportNamespaceSpecifier()&&importedNamespaces.add(specifier.node.local.name),!specifier.isImportSpecifier())return;let imported=specifier.get("imported");if(imported.isIdentifier()&&deprecatedTypes.includes(imported.node.name)){imported.node.name===specifier.node.local.name&&typeReferencesToUpdate.add(specifier.node.local.name);let newType=migrateType(imported.node.name);if(!existingImports.some(it=>it.name===newType))imported.replaceWith(t.identifier(newType)),existingImports.push({name:newType,isAlias:!1,path:specifier});else{let existingImport=existingImports.find(it=>it.name===newType&&it.isAlias);if(existingImport)throw existingImport.path.buildCodeFrameError(`This codemod does not support local imports that are called the same as a storybook import.
|
2
|
+
Rename this local import and try again.`);specifier.remove()}}})}}),file.path.traverse({TSTypeReference:path=>{let typeName=path.get("typeName");if(typeName.isIdentifier())typeReferencesToUpdate.has(typeName.node.name)&&typeName.replaceWith(t.identifier(migrateType(typeName.node.name)));else if(typeName.isTSQualifiedName()){let namespace=typeName.get("left");if(namespace.isIdentifier()&&importedNamespaces.has(namespace.node.name)){let right=typeName.get("right");deprecatedTypes.includes(right.node.name)&&right.replaceWith(t.identifier(migrateType(right.node.name)))}}}})}var logger=console,renameAnnotation=annotation=>annotation==="storyName"?"name":annotation,getTemplateBindVariable=init=>t2.isCallExpression(init)&&t2.isMemberExpression(init.callee)&&t2.isIdentifier(init.callee.object)&&t2.isIdentifier(init.callee.property)&&init.callee.property.name==="bind"&&(init.arguments.length===0||init.arguments.length===1&&t2.isObjectExpression(init.arguments[0])&&init.arguments[0].properties.length===0)?init.callee.object.name:null,isStoryAnnotation=(stmt,objectExports)=>t2.isExpressionStatement(stmt)&&t2.isAssignmentExpression(stmt.expression)&&t2.isMemberExpression(stmt.expression.left)&&t2.isIdentifier(stmt.expression.left.object)&&objectExports[stmt.expression.left.object.name],getNewExport=(stmt,objectExports)=>{if(t2.isExportNamedDeclaration(stmt)&&t2.isVariableDeclaration(stmt.declaration)&&stmt.declaration.declarations.length===1){let decl=stmt.declaration.declarations[0];if(t2.isVariableDeclarator(decl)&&t2.isIdentifier(decl.id))return objectExports[decl.id.name]}return null},isReactGlobalRenderFn=(csf,storyFn)=>{var _a;if((_a=csf._meta)!=null&&_a.component&&t2.isArrowFunctionExpression(storyFn)&&storyFn.params.length===1&&t2.isJSXElement(storyFn.body)){let{openingElement}=storyFn.body;if(openingElement.selfClosing&&t2.isJSXIdentifier(openingElement.name)&&openingElement.attributes.length===1){let attr=openingElement.attributes[0],param=storyFn.params[0];if(t2.isJSXSpreadAttribute(attr)&&t2.isIdentifier(attr.argument)&&t2.isIdentifier(param)&¶m.name===attr.argument.name&&csf._meta.component===openingElement.name.name)return!0}}return!1},isSimpleCSFStory=(init,annotations)=>annotations.length===0&&t2.isArrowFunctionExpression(init)&&init.params.length===0;function removeUnusedTemplates(csf){Object.entries(csf._templates).forEach(([template,templateExpression])=>{let references=[];if(babel2.traverse(csf._ast,{Identifier:path=>{path.node.name===template&&references.push(path)}}),references.length===1){let reference=references[0];reference.parentPath.isVariableDeclarator()&&reference.parentPath.node.init===templateExpression&&reference.parentPath.remove()}})}function transform(info,api,options){let makeTitle=userTitle=>userTitle||"FIXME",csf=(0,import_csf_tools2.loadCsf)(info.source,{makeTitle});try{csf.parse()}catch(err){return logger.log(`Error ${err}, skipping`),info.source}let file=new babel2.File({filename:info.path},{code:info.source,ast:csf._ast}),importHelper=new StorybookImportHelper(file,info),objectExports={};Object.entries(csf._storyExports).forEach(([key,decl])=>{let annotations=Object.entries(csf._storyAnnotations[key]).map(([annotation,val])=>t2.objectProperty(t2.identifier(renameAnnotation(annotation)),val));if(t2.isVariableDeclarator(decl)){let{init,id}=decl,template=getTemplateBindVariable(init);if(!t2.isArrowFunctionExpression(init)&&!template)return;if(isSimpleCSFStory(init,annotations)){objectExports[key]=t2.exportNamedDeclaration(t2.variableDeclaration("const",[t2.variableDeclarator(importHelper.updateTypeTo(id,"StoryFn"),init)]));return}let storyFn=template&&t2.identifier(template);storyFn||(storyFn=init);let renderAnnotation=isReactGlobalRenderFn(csf,template?csf._templates[template]:storyFn)?[]:[t2.objectProperty(t2.identifier("render"),storyFn)];objectExports[key]=t2.exportNamedDeclaration(t2.variableDeclaration("const",[t2.variableDeclarator(importHelper.updateTypeTo(id,"StoryObj"),t2.objectExpression([...renderAnnotation,...annotations]))]))}}),csf._ast.program.body=csf._ast.program.body.reduce((acc,stmt)=>{let statement=stmt;if(isStoryAnnotation(statement,objectExports))return acc;let newExport=getNewExport(statement,objectExports);return newExport?(acc.push(newExport),acc):(acc.push(statement),acc)},[]),upgradeDeprecatedTypes(file),importHelper.removeDeprecatedStoryImport(),removeUnusedTemplates(csf);let output=(0,import_csf_tools2.printCsf)(csf).code;try{let prettierConfig=import_prettier2.default.resolveConfig.sync(".",{editorconfig:!0})||{printWidth:100,tabWidth:2,bracketSpacing:!0,trailingComma:"es5",singleQuote:!0};output=import_prettier2.default.format(output,{...prettierConfig,filepath:info.path})}catch{logger.log(`Failed applying prettier to ${info.path}.`)}return output}var StorybookImportHelper=class{constructor(file,info){this.getAllSbImportDeclarations=file=>{let found=[];return file.path.traverse({ImportDeclaration:path=>{let source=path.node.source.value;if(source.startsWith("@storybook/csf")||!source.startsWith("@storybook"))return;path.get("specifiers").some(specifier=>{if(specifier.isImportNamespaceSpecifier())throw new Error(`This codemod does not support namespace imports for a ${path.node.source.value} package.
|
3
3
|
Replace the namespace import with named imports and try again.`);if(!specifier.isImportSpecifier())return!1;let imported=specifier.get("imported");return imported.isIdentifier()?["Story","StoryFn","StoryObj","Meta","ComponentStory","ComponentStoryFn","ComponentStoryObj","ComponentMeta"].includes(imported.node.name):!1})&&found.push(path)}}),found};this.getOrAddImport=type=>{let sbImport=this.sbImportDeclarations.find(path=>path.node.importKind==="type")??this.sbImportDeclarations[0];if(sbImport==null)return;let specifiers=sbImport.get("specifiers"),importSpecifier2=specifiers.find(specifier=>{if(!specifier.isImportSpecifier())return!1;let imported=specifier.get("imported");return imported.isIdentifier()?imported.node.name===type:!1});return importSpecifier2?importSpecifier2.node.local.name:(specifiers[0].insertBefore(t2.importSpecifier(t2.identifier(type),t2.identifier(type))),type)};this.removeDeprecatedStoryImport=()=>{this.sbImportDeclarations.flatMap(it=>it.get("specifiers")).filter(specifier=>{if(!specifier.isImportSpecifier())return!1;let imported=specifier.get("imported");return imported.isIdentifier()?imported.node.name==="Story":!1}).forEach(path=>path.remove())};this.getAllLocalImports=()=>this.sbImportDeclarations.flatMap(it=>it.get("specifiers")).map(it=>it.node.local.name);this.updateTypeTo=(id,type)=>{if((0,import_types.isIdentifier)(id)&&(0,import_types.isTSTypeAnnotation)(id.typeAnnotation)&&(0,import_types.isTSTypeReference)(id.typeAnnotation.typeAnnotation)&&(0,import_types.isIdentifier)(id.typeAnnotation.typeAnnotation.typeName)){let{name}=id.typeAnnotation.typeAnnotation.typeName;if(this.getAllLocalImports().includes(name)){let localTypeImport=this.getOrAddImport(type);return{...id,typeAnnotation:t2.tsTypeAnnotation(t2.tsTypeReference(t2.identifier(localTypeImport),id.typeAnnotation.typeAnnotation.typeParameters))}}}return id};this.sbImportDeclarations=this.getAllSbImportDeclarations(file)}},parser="tsx";0&&(module.exports={parser});
|
@@ -0,0 +1,26 @@
|
|
1
|
+
/**
|
2
|
+
* Hoist CSF .story annotations
|
3
|
+
*
|
4
|
+
* For example:
|
5
|
+
*
|
6
|
+
* ```
|
7
|
+
* export const Basic = () => <Button />
|
8
|
+
* Basic.story = {
|
9
|
+
* name: 'foo',
|
10
|
+
* parameters: { ... },
|
11
|
+
* decorators = [ ... ],
|
12
|
+
* };
|
13
|
+
* ```
|
14
|
+
*
|
15
|
+
* Becomes:
|
16
|
+
*
|
17
|
+
* ```
|
18
|
+
* export const Basic = () => <Button />
|
19
|
+
* Basic.storyName = 'foo';
|
20
|
+
* Basic.parameters = { ... };
|
21
|
+
* Basic.decorators = [ ... ];
|
22
|
+
* ```
|
23
|
+
*/
|
24
|
+
declare function transformer(file: any, api: any): any;
|
25
|
+
|
26
|
+
export { transformer as default };
|
@@ -0,0 +1,24 @@
|
|
1
|
+
/**
|
2
|
+
* Convert a legacy story API to component story format
|
3
|
+
*
|
4
|
+
* For example:
|
5
|
+
*
|
6
|
+
* ```
|
7
|
+
* input { Button } from './Button';
|
8
|
+
* storiesOf('Button', module).add('story', () => <Button label="The Button" />);
|
9
|
+
* ```
|
10
|
+
*
|
11
|
+
* Becomes:
|
12
|
+
*
|
13
|
+
* ```
|
14
|
+
* input { Button } from './Button';
|
15
|
+
* export default {
|
16
|
+
* title: 'Button'
|
17
|
+
* }
|
18
|
+
* export const story = () => <Button label="The Button" />;
|
19
|
+
*
|
20
|
+
* NOTES: only support chained storiesOf() calls
|
21
|
+
*/
|
22
|
+
declare function transformer(file: any, api: any, options: any): any;
|
23
|
+
|
24
|
+
export { transformer as default };
|
@@ -0,0 +1,27 @@
|
|
1
|
+
/**
|
2
|
+
* Takes the deprecated addon-info API, addWithInfo, and
|
3
|
+
* converts to the new withInfo API.
|
4
|
+
*
|
5
|
+
* Example of deprecated addWithInfo API:
|
6
|
+
*
|
7
|
+
* storiesOf('Button')
|
8
|
+
* .addWithInfo(
|
9
|
+
* 'story name',
|
10
|
+
* 'Story description.',
|
11
|
+
* () => (
|
12
|
+
* <Button label="The Button" />
|
13
|
+
* )
|
14
|
+
* )
|
15
|
+
*
|
16
|
+
* Converts to the new withInfo API:
|
17
|
+
*
|
18
|
+
* storiesOf('Button')
|
19
|
+
* .add('story name', withInfo(
|
20
|
+
* 'Story description.'
|
21
|
+
* )(() => (
|
22
|
+
* <Button label="The Button" />
|
23
|
+
* )))
|
24
|
+
*/
|
25
|
+
declare function transformer(file: any, api: any): any;
|
26
|
+
|
27
|
+
export { transformer as default };
|
@@ -0,0 +1,25 @@
|
|
1
|
+
declare function transformer(file: any, api: any): any;
|
2
|
+
declare const packageNames: {
|
3
|
+
'@kadira/react-storybook-decorator-centered': string;
|
4
|
+
'@kadira/storybook-addons': string;
|
5
|
+
'@kadira/storybook-addon-actions': string;
|
6
|
+
'@kadira/storybook-addon-comments': string;
|
7
|
+
'@kadira/storybook-addon-graphql': string;
|
8
|
+
'@kadira/storybook-addon-info': string;
|
9
|
+
'@kadira/storybook-addon-knobs': string;
|
10
|
+
'@kadira/storybook-addon-links': string;
|
11
|
+
'@kadira/storybook-addon-notes': string;
|
12
|
+
'@kadira/storybook-addon-options': string;
|
13
|
+
'@kadira/storybook-channels': string;
|
14
|
+
'@kadira/storybook-channel-postmsg': string;
|
15
|
+
'@kadira/storybook-channel-websocket': string;
|
16
|
+
'@kadira/storybook-ui': string;
|
17
|
+
'@kadira/react-native-storybook': string;
|
18
|
+
'@kadira/react-storybook': string;
|
19
|
+
'@kadira/getstorybook': string;
|
20
|
+
'@kadira/storybook': string;
|
21
|
+
storyshots: string;
|
22
|
+
getstorybook: string;
|
23
|
+
};
|
24
|
+
|
25
|
+
export { transformer as default, packageNames };
|
@@ -1,2 +1,2 @@
|
|
1
|
-
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 upgrade_deprecated_types_exports={};__export(upgrade_deprecated_types_exports,{default:()=>transform,parser:()=>parser,upgradeDeprecatedTypes:()=>upgradeDeprecatedTypes});module.exports=__toCommonJS(upgrade_deprecated_types_exports);var import_prettier=__toESM(require("prettier")),babel=__toESM(require("@babel/core")),import_csf_tools=require("@storybook/csf-tools"),
|
1
|
+
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 upgrade_deprecated_types_exports={};__export(upgrade_deprecated_types_exports,{default:()=>transform,parser:()=>parser,upgradeDeprecatedTypes:()=>upgradeDeprecatedTypes});module.exports=__toCommonJS(upgrade_deprecated_types_exports);var import_prettier=__toESM(require("prettier")),babel=__toESM(require("@babel/core")),import_csf_tools=require("@storybook/csf-tools"),t=__toESM(require("@babel/types")),logger=console,deprecatedTypes=["ComponentStory","ComponentStoryFn","ComponentStoryObj","ComponentMeta","Story"];function migrateType(oldType){return oldType==="Story"||oldType==="ComponentStory"?"StoryFn":oldType.replace("Component","")}function transform(info,api,options){let csf=(0,import_csf_tools.loadCsf)(info.source,{makeTitle:title=>title}),fileNode=csf._ast,file=new babel.File({filename:info.path},{code:info.source,ast:fileNode});upgradeDeprecatedTypes(file);let output=(0,import_csf_tools.printCsf)(csf).code;try{let prettierConfig=import_prettier.default.resolveConfig.sync(".",{editorconfig:!0})||{printWidth:100,tabWidth:2,bracketSpacing:!0,trailingComma:"es5",singleQuote:!0};output=import_prettier.default.format(output,{...prettierConfig,filepath:info.path})}catch{logger.log(`Failed applying prettier to ${info.path}.`)}return output}var parser="tsx";function upgradeDeprecatedTypes(file){let importedNamespaces=new Set,typeReferencesToUpdate=new Set,existingImports=[];file.path.traverse({ImportDeclaration:path=>{existingImports.push(...path.get("specifiers").map(specifier=>({name:specifier.node.local.name,isAlias:!(specifier.isImportSpecifier()&&t.isIdentifier(specifier.node.imported)&&specifier.node.local.name===specifier.node.imported.name),path:specifier}))),path.node.source.value.startsWith("@storybook")&&path.get("specifiers").forEach(specifier=>{if(specifier.isImportNamespaceSpecifier()&&importedNamespaces.add(specifier.node.local.name),!specifier.isImportSpecifier())return;let imported=specifier.get("imported");if(imported.isIdentifier()&&deprecatedTypes.includes(imported.node.name)){imported.node.name===specifier.node.local.name&&typeReferencesToUpdate.add(specifier.node.local.name);let newType=migrateType(imported.node.name);if(!existingImports.some(it=>it.name===newType))imported.replaceWith(t.identifier(newType)),existingImports.push({name:newType,isAlias:!1,path:specifier});else{let existingImport=existingImports.find(it=>it.name===newType&&it.isAlias);if(existingImport)throw existingImport.path.buildCodeFrameError(`This codemod does not support local imports that are called the same as a storybook import.
|
2
2
|
Rename this local import and try again.`);specifier.remove()}}})}}),file.path.traverse({TSTypeReference:path=>{let typeName=path.get("typeName");if(typeName.isIdentifier())typeReferencesToUpdate.has(typeName.node.name)&&typeName.replaceWith(t.identifier(migrateType(typeName.node.name)));else if(typeName.isTSQualifiedName()){let namespace=typeName.get("left");if(namespace.isIdentifier()&&importedNamespaces.has(namespace.node.name)){let right=typeName.get("right");deprecatedTypes.includes(right.node.name)&&right.replaceWith(t.identifier(migrateType(right.node.name)))}}}})}0&&(module.exports={parser,upgradeDeprecatedTypes});
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@storybook/codemod",
|
3
|
-
"version": "0.0.0-pr-
|
3
|
+
"version": "0.0.0-pr-23691-sha-8f3fbd86",
|
4
4
|
"description": "A collection of codemod scripts written with JSCodeshift",
|
5
5
|
"keywords": [
|
6
6
|
"storybook"
|
@@ -49,9 +49,9 @@
|
|
49
49
|
"@babel/preset-env": "^7.22.9",
|
50
50
|
"@babel/types": "^7.22.5",
|
51
51
|
"@storybook/csf": "^0.1.0",
|
52
|
-
"@storybook/csf-tools": "0.0.0-pr-
|
53
|
-
"@storybook/node-logger": "0.0.0-pr-
|
54
|
-
"@storybook/types": "0.0.0-pr-
|
52
|
+
"@storybook/csf-tools": "0.0.0-pr-23691-sha-8f3fbd86",
|
53
|
+
"@storybook/node-logger": "0.0.0-pr-23691-sha-8f3fbd86",
|
54
|
+
"@storybook/types": "0.0.0-pr-23691-sha-8f3fbd86",
|
55
55
|
"@types/cross-spawn": "^6.0.2",
|
56
56
|
"cross-spawn": "^7.0.3",
|
57
57
|
"globby": "^11.0.2",
|
@@ -3,11 +3,10 @@ import prettier from 'prettier';
|
|
3
3
|
import * as t from '@babel/types';
|
4
4
|
import { isIdentifier, isTSTypeAnnotation, isTSTypeReference } from '@babel/types';
|
5
5
|
import type { CsfFile } from '@storybook/csf-tools';
|
6
|
-
import { loadCsf } from '@storybook/csf-tools';
|
6
|
+
import { loadCsf, printCsf } from '@storybook/csf-tools';
|
7
7
|
import type { API, FileInfo } from 'jscodeshift';
|
8
8
|
import type { BabelFile, NodePath } from '@babel/core';
|
9
9
|
import * as babel from '@babel/core';
|
10
|
-
import * as recast from 'recast';
|
11
10
|
import { upgradeDeprecatedTypes } from './upgrade-deprecated-types';
|
12
11
|
|
13
12
|
const logger = console;
|
@@ -202,7 +201,7 @@ export default function transform(info: FileInfo, api: API, options: { parser?:
|
|
202
201
|
importHelper.removeDeprecatedStoryImport();
|
203
202
|
removeUnusedTemplates(csf);
|
204
203
|
|
205
|
-
let output =
|
204
|
+
let output = printCsf(csf).code;
|
206
205
|
|
207
206
|
try {
|
208
207
|
const prettierConfig = prettier.resolveConfig.sync('.', { editorconfig: true }) || {
|
@@ -3,8 +3,7 @@ import prettier from 'prettier';
|
|
3
3
|
import type { API, FileInfo } from 'jscodeshift';
|
4
4
|
import type { BabelFile, NodePath } from '@babel/core';
|
5
5
|
import * as babel from '@babel/core';
|
6
|
-
import { loadCsf } from '@storybook/csf-tools';
|
7
|
-
import * as recast from 'recast';
|
6
|
+
import { loadCsf, printCsf } from '@storybook/csf-tools';
|
8
7
|
import * as t from '@babel/types';
|
9
8
|
|
10
9
|
const logger = console;
|
@@ -24,7 +23,8 @@ function migrateType(oldType: string) {
|
|
24
23
|
|
25
24
|
export default function transform(info: FileInfo, api: API, options: { parser?: string }) {
|
26
25
|
// TODO what do I need to with the title?
|
27
|
-
const
|
26
|
+
const csf = loadCsf(info.source, { makeTitle: (title) => title });
|
27
|
+
const fileNode = csf._ast;
|
28
28
|
// @ts-expect-error File is not yet exposed, see https://github.com/babel/babel/issues/11350#issuecomment-644118606
|
29
29
|
const file: BabelFile = new babel.File(
|
30
30
|
{ filename: info.path },
|
@@ -33,7 +33,7 @@ export default function transform(info: FileInfo, api: API, options: { parser?:
|
|
33
33
|
|
34
34
|
upgradeDeprecatedTypes(file);
|
35
35
|
|
36
|
-
let output =
|
36
|
+
let output = printCsf(csf).code;
|
37
37
|
|
38
38
|
try {
|
39
39
|
const prettierConfig = prettier.resolveConfig.sync('.', { editorconfig: true }) || {
|