@storybook/codemod 8.0.0-beta.5 → 8.0.0-beta.6

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.d.ts CHANGED
@@ -2,6 +2,12 @@ export { packageNames, default as updateOrganisationName } from './transforms/up
2
2
  export { default as updateAddonInfo } from './transforms/update-addon-info.js';
3
3
 
4
4
  declare function listCodemods(): string[];
5
- declare function runCodemod(codemod: any, { glob, logger, dryRun, rename, parser }: any): Promise<void>;
5
+ declare function runCodemod(codemod: any, { glob, logger, dryRun, rename, parser, }: {
6
+ glob: any;
7
+ logger: any;
8
+ dryRun?: any;
9
+ rename?: any;
10
+ parser?: any;
11
+ }): Promise<void>;
6
12
 
7
13
  export { listCodemods, runCodemod };
package/dist/index.js CHANGED
@@ -1 +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 src_exports={};__export(src_exports,{listCodemods:()=>listCodemods,packageNames:()=>packageNames,runCodemod:()=>runCodemod,updateAddonInfo:()=>transformer2,updateOrganisationName:()=>transformer});module.exports=__toCommonJS(src_exports);var import_fs=__toESM(require("fs")),import_path=__toESM(require("path")),import_util=require("util"),import_globby=__toESM(require("globby")),import_cross_spawn=require("cross-spawn");var import_camelCase=__toESM(require("lodash/camelCase.js")),import_upperFirst=__toESM(require("lodash/upperFirst.js"));function jscodeshiftToPrettierParser(parser){let parserMap={babylon:"babel",flow:"flow",ts:"typescript",tsx:"typescript"};return parser&&parserMap[parser]||"babel"}var packageNames={"@kadira/react-storybook-decorator-centered":"@storybook/addon-centered","@kadira/storybook-addons":"@storybook/preview-api","@kadira/storybook-addon-actions":"@storybook/addon-actions","@kadira/storybook-addon-comments":"@storybook/addon-comments","@kadira/storybook-addon-graphql":"@storybook/addon-graphql","@kadira/storybook-addon-info":"@storybook/addon-info","@kadira/storybook-addon-knobs":"@storybook/addon-knobs","@kadira/storybook-addon-links":"@storybook/addon-links","@kadira/storybook-addon-notes":"@storybook/addon-notes","@kadira/storybook-addon-options":"@storybook/addon-options","@kadira/storybook-channels":"@storybook/channels","@kadira/storybook-channel-postmsg":"@storybook/channel-postmessage","@kadira/storybook-channel-websocket":"@storybook/channel-websocket","@kadira/storybook-ui":"@storybook/manager","@kadira/react-native-storybook":"@storybook/react-native","@kadira/react-storybook":"@storybook/react","@kadira/getstorybook":"@storybook/cli","@kadira/storybook":"@storybook/react",storyshots:"@storybook/addon-storyshots",getstorybook:"@storybook/cli"};function transformer(file,api){let j=api.jscodeshift,packageNamesKeys=Object.keys(packageNames),getMatch=oldpart=>packageNamesKeys.find(newpart=>oldpart.match(newpart)),getNewPackageName=oldPackageName=>{let match=getMatch(oldPackageName);if(match){let replacement=packageNames[match];return oldPackageName.replace(match,replacement)}return oldPackageName},updatePackageName=declaration=>(declaration.node.source.value=getNewPackageName(declaration.node.source.value),declaration.node);return j(file.source).find(j.ImportDeclaration).replaceWith(updatePackageName).toSource({quote:"single"})}function transformer2(file,api){let j=api.jscodeshift,root=j(file.source),getOptions=args=>args[3]===void 0?args[2]===void 0?[args[0]]:[args[1]]:[j.objectExpression([j.property("init",j.identifier("text"),args[1]),...args[3].properties])],withInfo=addWithInfoExpression=>{let{node}=addWithInfoExpression,args=node.arguments,storyComponent=args[2]?args[2]:args[1];return node.callee.property.name="add",node.arguments=[args[0],j.callExpression(j.callExpression(j.identifier("withInfo"),getOptions(args)),[storyComponent])],node},checkWithInfoImport=()=>{root.find(j.ImportDeclaration).filter(imp=>imp.node.source.value==="@storybook/addon-info").size()||root.find(j.ImportDeclaration).at(-1).insertAfter(j.importDeclaration([j.importSpecifier(j.identifier("withInfo"))],j.literal("@storybook/addon-info")))},addWithInfoExpressions=root.find(j.CallExpression,{callee:{property:{name:"addWithInfo"}}});return addWithInfoExpressions.size()&&(checkWithInfoImport(),addWithInfoExpressions.replaceWith(withInfo)),root.toSource()}var TRANSFORM_DIR=`${__dirname}/transforms`;function listCodemods(){return import_fs.default.readdirSync(TRANSFORM_DIR).filter(fname=>fname.endsWith(".js")).map(fname=>fname.slice(0,-3))}var renameAsync=(0,import_util.promisify)(import_fs.default.rename);async function renameFile(file,from,to,{logger}){let newFile=file.replace(from,to);return logger.log(`Rename: ${file} ${newFile}`),renameAsync(file,newFile)}async function runCodemod(codemod,{glob,logger,dryRun,rename,parser}){if(!listCodemods().includes(codemod))throw new Error(`Unknown codemod ${codemod}. Run --list for options.`);let renameParts=null;if(rename&&(renameParts=rename.split(":"),renameParts.length!==2))throw new Error(`Codemod rename: expected format "from:to", got "${rename}"`);let inferredParser=parser;if(!parser){let extension=import_path.default.extname(glob).slice(1);jscodeshiftToPrettierParser(extension)!=="babel"&&(inferredParser=extension)}let files=await(0,import_globby.default)([glob,"!**/node_modules","!**/dist"]),extensions=new Set(files.map(file=>import_path.default.extname(file).slice(1))),commaSeparatedExtensions=Array.from(extensions).join(",");if(logger.log(`=> Applying ${codemod}: ${files.length} files`),files.length===0){logger.log(`=> No matching files for glob: ${glob}`);return}if(!dryRun&&files.length>0){let parserArgs=inferredParser?["--parser",inferredParser]:[];if((0,import_cross_spawn.sync)("node",[require.resolve("jscodeshift/bin/jscodeshift"),"--no-babel",`--extensions=${commaSeparatedExtensions}`,"--fail-on-error","-t",`${TRANSFORM_DIR}/${codemod}.js`,...parserArgs,...files],{stdio:"inherit",shell:!0}).status===1){logger.log("Skipped renaming because of errors.");return}}if(!renameParts&&codemod==="mdx-to-csf"&&(renameParts=[".stories.mdx",".mdx"],rename=".stories.mdx:.mdx;"),renameParts){let[from,to]=renameParts;logger.log(`=> Renaming ${rename}: ${files.length} files`),await Promise.all(files.map(file=>renameFile(file,new RegExp(`${from}$`),to,{logger})))}}0&&(module.exports={listCodemods,packageNames,runCodemod,updateAddonInfo,updateOrganisationName});
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 src_exports={};__export(src_exports,{listCodemods:()=>listCodemods,packageNames:()=>packageNames,runCodemod:()=>runCodemod,updateAddonInfo:()=>transformer2,updateOrganisationName:()=>transformer});module.exports=__toCommonJS(src_exports);var import_fs=__toESM(require("fs")),import_path=__toESM(require("path")),import_util=require("util"),import_globby=__toESM(require("globby")),import_cross_spawn=require("cross-spawn");var import_camelCase=__toESM(require("lodash/camelCase.js")),import_upperFirst=__toESM(require("lodash/upperFirst.js"));function jscodeshiftToPrettierParser(parser){let parserMap={babylon:"babel",flow:"flow",ts:"typescript",tsx:"typescript"};return parser&&parserMap[parser]||"babel"}var packageNames={"@kadira/react-storybook-decorator-centered":"@storybook/addon-centered","@kadira/storybook-addons":"@storybook/preview-api","@kadira/storybook-addon-actions":"@storybook/addon-actions","@kadira/storybook-addon-comments":"@storybook/addon-comments","@kadira/storybook-addon-graphql":"@storybook/addon-graphql","@kadira/storybook-addon-info":"@storybook/addon-info","@kadira/storybook-addon-knobs":"@storybook/addon-knobs","@kadira/storybook-addon-links":"@storybook/addon-links","@kadira/storybook-addon-notes":"@storybook/addon-notes","@kadira/storybook-addon-options":"@storybook/addon-options","@kadira/storybook-channels":"@storybook/channels","@kadira/storybook-channel-postmsg":"@storybook/channel-postmessage","@kadira/storybook-channel-websocket":"@storybook/channel-websocket","@kadira/storybook-ui":"@storybook/manager","@kadira/react-native-storybook":"@storybook/react-native","@kadira/react-storybook":"@storybook/react","@kadira/getstorybook":"@storybook/cli","@kadira/storybook":"@storybook/react",storyshots:"@storybook/addon-storyshots",getstorybook:"@storybook/cli"};function transformer(file,api){let j=api.jscodeshift,packageNamesKeys=Object.keys(packageNames),getMatch=oldpart=>packageNamesKeys.find(newpart=>oldpart.match(newpart)),getNewPackageName=oldPackageName=>{let match=getMatch(oldPackageName);if(match){let replacement=packageNames[match];return oldPackageName.replace(match,replacement)}return oldPackageName},updatePackageName=declaration=>(declaration.node.source.value=getNewPackageName(declaration.node.source.value),declaration.node);return j(file.source).find(j.ImportDeclaration).replaceWith(updatePackageName).toSource({quote:"single"})}function transformer2(file,api){let j=api.jscodeshift,root=j(file.source),getOptions=args=>args[3]===void 0?args[2]===void 0?[args[0]]:[args[1]]:[j.objectExpression([j.property("init",j.identifier("text"),args[1]),...args[3].properties])],withInfo=addWithInfoExpression=>{let{node}=addWithInfoExpression,args=node.arguments,storyComponent=args[2]?args[2]:args[1];return node.callee.property.name="add",node.arguments=[args[0],j.callExpression(j.callExpression(j.identifier("withInfo"),getOptions(args)),[storyComponent])],node},checkWithInfoImport=()=>{root.find(j.ImportDeclaration).filter(imp=>imp.node.source.value==="@storybook/addon-info").size()||root.find(j.ImportDeclaration).at(-1).insertAfter(j.importDeclaration([j.importSpecifier(j.identifier("withInfo"))],j.literal("@storybook/addon-info")))},addWithInfoExpressions=root.find(j.CallExpression,{callee:{property:{name:"addWithInfo"}}});return addWithInfoExpressions.size()&&(checkWithInfoImport(),addWithInfoExpressions.replaceWith(withInfo)),root.toSource()}var TRANSFORM_DIR=`${__dirname}/transforms`;function listCodemods(){return import_fs.default.readdirSync(TRANSFORM_DIR).filter(fname=>fname.endsWith(".js")).map(fname=>fname.slice(0,-3))}var renameAsync=(0,import_util.promisify)(import_fs.default.rename);async function renameFile(file,from,to,{logger}){let newFile=file.replace(from,to);return logger.log(`Rename: ${file} ${newFile}`),renameAsync(file,newFile)}async function runCodemod(codemod,{glob,logger,dryRun,rename,parser}){if(!listCodemods().includes(codemod))throw new Error(`Unknown codemod ${codemod}. Run --list for options.`);let renameParts=null;if(rename&&(renameParts=rename.split(":"),renameParts.length!==2))throw new Error(`Codemod rename: expected format "from:to", got "${rename}"`);let inferredParser=parser;if(!parser){let extension=import_path.default.extname(glob).slice(1);jscodeshiftToPrettierParser(extension)!=="babel"&&(inferredParser=extension)}let files=await(0,import_globby.default)([glob,"!**/node_modules","!**/dist"]),extensions=new Set(files.map(file=>import_path.default.extname(file).slice(1))),commaSeparatedExtensions=Array.from(extensions).join(",");if(logger.log(`=> Applying ${codemod}: ${files.length} files`),files.length===0){logger.log(`=> No matching files for glob: ${glob}`);return}if(!dryRun&&files.length>0){let parserArgs=inferredParser?["--parser",inferredParser]:[],result=(0,import_cross_spawn.sync)("node",[require.resolve("jscodeshift/bin/jscodeshift"),"--no-babel",`--extensions=${commaSeparatedExtensions}`,"--fail-on-error","-t",`${TRANSFORM_DIR}/${codemod}.js`,...parserArgs,...files],{stdio:"inherit",shell:!0});if(codemod==="mdx-to-csf"&&result.status===1)logger.log("The codemod was not able to transform the files mentioned above. We have renamed the files to .mdx.broken. Please check the files and rename them back to .mdx after you have either manually transformed them to mdx + csf or fixed the issues so that the codemod can transform them.");else if(result.status===1){logger.log("Skipped renaming because of errors.");return}}if(renameParts){let[from,to]=renameParts;logger.log(`=> Renaming ${rename}: ${files.length} files`),await Promise.all(files.map(file=>renameFile(file,new RegExp(`${from}$`),to,{logger})))}}0&&(module.exports={listCodemods,packageNames,runCodemod,updateAddonInfo,updateOrganisationName});
@@ -1,7 +1,10 @@
1
1
  import { FileInfo } from 'jscodeshift';
2
2
 
3
3
  declare function jscodeshift(info: FileInfo): Promise<string>;
4
- declare function transform(info: FileInfo, baseName: string): Promise<[string, string]>;
4
+ declare function transform(info: FileInfo, baseName: string): Promise<{
5
+ mdx: string;
6
+ csf: string | null;
7
+ }>;
5
8
  declare function nameToValidExport(name: string): string;
6
9
 
7
10
  export { jscodeshift as default, nameToValidExport, transform };
@@ -55,7 +55,7 @@ Defaulting to 2020, but this will stop working in the future.`)),options.ecmaVer
55
55
  `;case 114:return"\r";case 120:return String.fromCharCode(this.readHexChar(2));case 117:return codePointToString(this.readCodePoint());case 116:return" ";case 98:return"\b";case 118:return"\v";case 102:return"\f";case 13:this.input.charCodeAt(this.pos)===10&&++this.pos;case 10:return this.options.locations&&(this.lineStart=this.pos,++this.curLine),"";case 56:case 57:if(this.strict&&this.invalidStringToken(this.pos-1,"Invalid escape sequence"),inTemplate){var codePos=this.pos-1;this.invalidStringToken(codePos,"Invalid escape sequence in template string")}default:if(ch>=48&&ch<=55){var octalStr=this.input.substr(this.pos-1,3).match(/^[0-7]+/)[0],octal=parseInt(octalStr,8);return octal>255&&(octalStr=octalStr.slice(0,-1),octal=parseInt(octalStr,8)),this.pos+=octalStr.length-1,ch=this.input.charCodeAt(this.pos),(octalStr!=="0"||ch===56||ch===57)&&(this.strict||inTemplate)&&this.invalidStringToken(this.pos-1-octalStr.length,inTemplate?"Octal literal in template string":"Octal literal in strict mode"),String.fromCharCode(octal)}return isNewLine(ch)?"":String.fromCharCode(ch)}};pp.readHexChar=function(len){var codePos=this.pos,n=this.readInt(16,len);return n===null&&this.invalidStringToken(codePos,"Bad character escape sequence"),n};pp.readWord1=function(){this.containsEsc=!1;for(var word="",first=!0,chunkStart=this.pos,astral=this.options.ecmaVersion>=6;this.pos<this.input.length;){var ch=this.fullCharCodeAtPos();if(isIdentifierChar(ch,astral))this.pos+=ch<=65535?1:2;else if(ch===92){this.containsEsc=!0,word+=this.input.slice(chunkStart,this.pos);var escStart=this.pos;this.input.charCodeAt(++this.pos)!==117&&this.invalidStringToken(this.pos,"Expecting Unicode escape sequence \\uXXXX"),++this.pos;var esc=this.readCodePoint();(first?isIdentifierStart:isIdentifierChar)(esc,astral)||this.invalidStringToken(escStart,"Invalid Unicode escape"),word+=codePointToString(esc),chunkStart=this.pos}else break;first=!1}return word+this.input.slice(chunkStart,this.pos)};pp.readWord=function(){var word=this.readWord1(),type=types$1.name;return this.keywords.test(word)&&(type=keywords[word]),this.finishToken(type,word)};var version="8.11.2";Parser.acorn={Parser,version,defaultOptions,Position,SourceLocation,getLineInfo,Node,TokenType,tokTypes:types$1,keywordTypes:keywords,TokContext,tokContexts:types,isIdentifierChar,isIdentifierStart,Token,isNewLine,lineBreak,lineBreakG,nonASCIIwhitespace};var import_acorn_jsx=__toESM(require_acorn_jsx(),1);function color2(d){return"\x1B[33m"+d+"\x1B[39m"}var own6={}.hasOwnProperty,CONTINUE2=Symbol("continue"),EXIT2=Symbol("exit"),SKIP2=Symbol("skip");function visit2(tree,visitor){let enter,leave;typeof visitor=="function"?enter=visitor:visitor&&typeof visitor=="object"&&(visitor.enter&&(enter=visitor.enter),visitor.leave&&(leave=visitor.leave)),build(tree,void 0,void 0,[])();function build(node3,key,index2,parents){return nodelike(node3)&&(visit3.displayName="node ("+color2(node3.type)+")"),visit3;function visit3(){let result=enter?toResult2(enter(node3,key,index2,parents)):[];if(result[0]===EXIT2)return result;if(result[0]!==SKIP2){let cKey;for(cKey in node3)if(own6.call(node3,cKey)&&node3[cKey]&&typeof node3[cKey]=="object"&&cKey!=="data"&&cKey!=="position"){let grandparents=parents.concat(node3),value=node3[cKey];if(Array.isArray(value)){let nodes=value,cIndex=0;for(;cIndex>-1&&cIndex<nodes.length;){let subvalue=nodes[cIndex];if(nodelike(subvalue)){let subresult=build(subvalue,cKey,cIndex,grandparents)();if(subresult[0]===EXIT2)return subresult;cIndex=typeof subresult[1]=="number"?subresult[1]:cIndex+1}else cIndex++}}else if(nodelike(value)){let subresult=build(value,cKey,void 0,grandparents)();if(subresult[0]===EXIT2)return subresult}}}return leave?toResult2(leave(node3,key,index2,parents)):result}}}function toResult2(value){return Array.isArray(value)?value:typeof value=="number"?[CONTINUE2,value]:[value]}function nodelike(value){return!!(value&&typeof value=="object"&&"type"in value&&typeof value.type=="string"&&value.type.length>0)}function eventsToAcorn(events,options){let prefix=options.prefix||"",suffix=options.suffix||"",acornOptions=Object.assign({},options.acornOptions),comments=[],tokens=[],onComment=acornOptions.onComment,onToken=acornOptions.onToken,swallow=!1,estree,exception,acornConfig=Object.assign({},acornOptions,{onComment:comments,preserveParens:!0});onToken&&(acornConfig.onToken=tokens);let collection=collect(events,options.tokenTypes),source=collection.value,value=prefix+source+suffix,isEmptyExpression=options.expression&&empty3(source);if(isEmptyExpression&&!options.allowEmpty)throw new VFileMessage("Unexpected empty expression",{place:parseOffsetToUnistPoint(0),ruleId:"unexpected-empty-expression",source:"micromark-extension-mdx-expression"});try{estree=options.expression&&!isEmptyExpression?options.acorn.parseExpressionAt(value,0,acornConfig):options.acorn.parse(value,acornConfig)}catch(error_){let error=error_,point3=parseOffsetToUnistPoint(error.pos);error.message=String(error.message).replace(/ \(\d+:\d+\)$/,""),error.pos=point3.offset,error.loc={line:point3.line,column:point3.column-1},exception=error,swallow=error.raisedAt>=prefix.length+source.length||error.message==="Unterminated comment"}if(estree&&options.expression&&!isEmptyExpression)if(empty3(value.slice(estree.end,value.length-suffix.length)))estree={type:"Program",start:0,end:prefix.length+source.length,body:[{type:"ExpressionStatement",expression:estree,start:0,end:prefix.length+source.length}],sourceType:"module",comments:[]};else{let point3=parseOffsetToUnistPoint(estree.end),error=new Error("Unexpected content after expression");error.pos=point3.offset,error.loc={line:point3.line,column:point3.column-1},exception=error,estree=void 0}if(estree){if(estree.comments=comments,visit2(estree,function(esnode,field,index2,parents){let context=parents[parents.length-1],prop=field;esnode.type==="ParenthesizedExpression"&&context&&prop&&(typeof index2=="number"&&(context=context[prop],prop=index2),context[prop]=esnode.expression),fixPosition(esnode)}),Array.isArray(onComment))onComment.push(...comments);else if(typeof onComment=="function")for(let comment of comments)onComment(comment.type==="Block",comment.value,comment.start,comment.end,comment.loc.start,comment.loc.end);for(let token of tokens)token.end<=prefix.length||token.start-prefix.length>=source.length||(fixPosition(token),Array.isArray(onToken)?onToken.push(token):onToken(token))}return{estree,error:exception,swallow};function fixPosition(nodeOrToken){let pointStart=parseOffsetToUnistPoint(nodeOrToken.start),pointEnd=parseOffsetToUnistPoint(nodeOrToken.end);nodeOrToken.start=pointStart.offset,nodeOrToken.end=pointEnd.offset,nodeOrToken.loc={start:{line:pointStart.line,column:pointStart.column-1,offset:pointStart.offset},end:{line:pointEnd.line,column:pointEnd.column-1,offset:pointEnd.offset}},nodeOrToken.range=[nodeOrToken.start,nodeOrToken.end]}function parseOffsetToUnistPoint(acornOffset){let sourceOffset=acornOffset-prefix.length;sourceOffset<0?sourceOffset=0:sourceOffset>source.length&&(sourceOffset=source.length);let point3=relativeToPoint(collection.stops,sourceOffset);return point3||(point3={line:options.start.line,column:options.start.column,offset:options.start.offset}),point3}}function empty3(value){return/^\s*$/.test(value.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\/\/[^\r\n]*(\r\n|\n|\r)/g,""))}function collect(events,tokenTypes){let result={value:"",stops:[]},index2=-1;for(;++index2<events.length;){let event=events[index2];if(event[0]==="enter"){let type=event[1].type;if(type==="lineEnding"||tokenTypes.includes(type)){let chunks=event[2].sliceStream(event[1]);for(;chunks.length>0&&chunks[0]===-1;)chunks.shift();let value=serializeChunks2(chunks);result.stops.push([result.value.length,event[1].start]),result.value+=value,result.stops.push([result.value.length,event[1].end])}}}return result}function relativeToPoint(stops,relative){let index2=0;for(;index2<stops.length&&stops[index2][0]<=relative;)index2+=1;if(index2===0)return;let[stopRelative,stopAbsolute]=stops[index2-1],rest=relative-stopRelative;return{line:stopAbsolute.line,column:stopAbsolute.column+rest,offset:stopAbsolute.offset+rest}}function serializeChunks2(chunks){let index2=-1,result=[],atTab;for(;++index2<chunks.length;){let chunk=chunks[index2],value;if(typeof chunk=="string")value=chunk;else switch(chunk){case-5:{value="\r";break}case-4:{value=`
56
56
  `;break}case-3:{value=`\r
57
57
  `;break}case-2:{value=" ";break}case-1:{if(atTab)continue;value=" ";break}default:value=String.fromCharCode(chunk)}atTab=chunk===-2,result.push(value)}return result.join("")}function positionFromEstree(node3){let nodeLike=node3||{},loc=nodeLike.loc||{},range=nodeLike.range||[void 0,void 0],start2=pointOrUndefined(loc.start,range[0]||nodeLike.start),end=pointOrUndefined(loc.end,range[1]||nodeLike.end);if(start2&&end)return{start:start2,end}}function pointOrUndefined(estreePoint,estreeOffset){if(estreePoint&&typeof estreePoint=="object"){let line="line"in estreePoint?numberOrUndefined(estreePoint.line):void 0,column="column"in estreePoint?numberOrUndefined(estreePoint.column):void 0;if(line&&column!==void 0)return{line,column:column+1,offset:numberOrUndefined(estreeOffset)}}}function numberOrUndefined(value){return typeof value=="number"&&value>-1?value:void 0}var trouble="https://github.com/micromark/micromark-extension-mdx-expression/tree/main/packages/micromark-extension-mdx-expression",unexpectedEofHash="#unexpected-end-of-file-in-expression-expected-a-corresponding-closing-brace-for-",unexpectedLazyHash="#unexpected-lazy-line-in-expression-in-container-expected-line-to-be-prefixed",nonSpreadHash="#unexpected-type-in-code-expected-an-object-spread-spread",spreadExtraHash="#unexpected-extra-content-in-spread-only-a-single-spread-is-supported",acornHash="#could-not-parse-expression-with-acorn";function factoryMdxExpression(effects,ok2,type,markerType,chunkType,acorn,acornOptions,addResult,spread,allowEmpty,allowLazy){let self2=this,eventStart=this.events.length+3,size=0,pointStart,lastCrash;return start2;function start2(code2){return effects.enter(type),effects.enter(markerType),effects.consume(code2),effects.exit(markerType),pointStart=self2.now(),before}function before(code2){if(code2===null){if(lastCrash)throw lastCrash;let error=new VFileMessage("Unexpected end of file in expression, expected a corresponding closing brace for `{`",{place:self2.now(),ruleId:"unexpected-eof",source:"micromark-extension-mdx-expression"});throw error.url=trouble+unexpectedEofHash,error}if(markdownLineEnding(code2))return effects.enter("lineEnding"),effects.consume(code2),effects.exit("lineEnding"),eolAfter;if(code2===125&&size===0){let next=acorn?mdxExpressionParse.call(self2,acorn,acornOptions,chunkType,eventStart,pointStart,allowEmpty||!1,spread||!1):{type:"ok",estree:void 0};if(next.type==="ok"){effects.enter(markerType),effects.consume(code2),effects.exit(markerType);let token=effects.exit(type);return addResult&&next.estree&&Object.assign(token,{estree:next.estree}),ok2}return lastCrash=next.message,effects.enter(chunkType),effects.consume(code2),inside}return effects.enter(chunkType),inside(code2)}function inside(code2){return code2===125&&size===0||code2===null||markdownLineEnding(code2)?(effects.exit(chunkType),before(code2)):(code2===123&&!acorn?size+=1:code2===125&&(size-=1),effects.consume(code2),inside)}function eolAfter(code2){let now=self2.now();if(now.line!==pointStart.line&&!allowLazy&&self2.parser.lazy[now.line]){let error=new VFileMessage("Unexpected lazy line in expression in container, expected line to be prefixed with `>` when in a block quote, whitespace when in a list, etc",{place:self2.now(),ruleId:"unexpected-lazy",source:"micromark-extension-mdx-expression"});throw error.url=trouble+unexpectedLazyHash,error}return before(code2)}}function mdxExpressionParse(acorn,acornOptions,chunkType,eventStart,pointStart,allowEmpty,spread){let result=eventsToAcorn(this.events.slice(eventStart),{acorn,tokenTypes:[chunkType],acornOptions,start:pointStart,expression:!0,allowEmpty,prefix:spread?"({":"",suffix:spread?"})":""}),estree=result.estree;if(spread&&estree){let head=estree.body[0];if(head.type!=="ExpressionStatement"||head.expression.type!=="ObjectExpression"){let place=positionFromEstree(head),error=new VFileMessage("Unexpected `"+head.type+"` in code: expected an object spread (`{...spread}`)",{place:place.start,ruleId:"non-spread",source:"micromark-extension-mdx-expression"});throw error.url=trouble+nonSpreadHash,error}if(head.expression.properties[1]){let place=positionFromEstree(head.expression.properties[1]),error=new VFileMessage("Unexpected extra content in spread: only a single spread is supported",{place:place.start,ruleId:"spread-extra",source:"micromark-extension-mdx-expression"});throw error.url=trouble+spreadExtraHash,error}if(head.expression.properties[0]&&head.expression.properties[0].type!=="SpreadElement"){let place=positionFromEstree(head.expression.properties[0]),error=new VFileMessage("Unexpected `"+head.expression.properties[0].type+"` in code: only spread elements are supported",{place:place.start,ruleId:"non-spread",source:"micromark-extension-mdx-expression"});throw error.url=trouble+nonSpreadHash,error}}if(result.error){let error=new VFileMessage("Could not parse expression with acorn",{cause:result.error,place:{line:result.error.loc.line,column:result.error.loc.column+1,offset:result.error.pos},ruleId:"acorn",source:"micromark-extension-mdx-expression"});return error.url=trouble+acornHash,{type:"nok",message:error}}return{type:"ok",estree}}function mdxExpression(options){let options_=options||{},addResult=options_.addResult,acorn=options_.acorn,spread=options_.spread,allowEmpty=options_.allowEmpty,acornOptions;if(allowEmpty==null&&(allowEmpty=!0),acorn){if(!acorn.parseExpressionAt)throw new Error("Expected a proper `acorn` instance passed in as `options.acorn`");acornOptions=Object.assign({ecmaVersion:2024,sourceType:"module"},options_.acornOptions)}else if(options_.acornOptions||options_.addResult)throw new Error("Expected an `acorn` instance passed in as `options.acorn`");return{flow:{123:{name:"mdxFlowExpression",tokenize:tokenizeFlowExpression,concrete:!0}},text:{123:{name:"mdxTextExpression",tokenize:tokenizeTextExpression}}};function tokenizeFlowExpression(effects,ok2,nok){let self2=this;return start2;function start2(code2){return before(code2)}function before(code2){return factoryMdxExpression.call(self2,effects,after,"mdxFlowExpression","mdxFlowExpressionMarker","mdxFlowExpressionChunk",acorn,acornOptions,addResult,spread,allowEmpty)(code2)}function after(code2){return markdownSpace(code2)?factorySpace(effects,end,"whitespace")(code2):end(code2)}function end(code2){let lessThanValue=self2.parser.constructs.flow[60],jsxTag=(Array.isArray(lessThanValue)?lessThanValue:lessThanValue?[lessThanValue]:[]).find(function(d){return d.name==="mdxJsxFlowTag"});return code2===60&&jsxTag?effects.attempt(jsxTag,end,nok)(code2):code2===null||markdownLineEnding(code2)?ok2(code2):nok(code2)}}function tokenizeTextExpression(effects,ok2){let self2=this;return start2;function start2(code2){return factoryMdxExpression.call(self2,effects,ok2,"mdxTextExpression","mdxTextExpressionMarker","mdxTextExpressionChunk",acorn,acornOptions,addResult,spread,allowEmpty,!0)(code2)}}}var startRe=/[$_\p{ID_Start}]/u,contRe=/[$_\u{200C}\u{200D}\p{ID_Continue}]/u,contReJsx=/[-$_\u{200C}\u{200D}\p{ID_Continue}]/u;var emptyOptions3={};function start(code2){return code2?startRe.test(String.fromCodePoint(code2)):!1}function cont(code2,options){let re=(options||emptyOptions3).jsx?contReJsx:contRe;return code2?re.test(String.fromCodePoint(code2)):!1}var trouble2="https://github.com/micromark/micromark-extension-mdx-jsx";function factoryTag(effects,ok2,nok,acorn,acornOptions,addResult,allowLazy,tagType,tagMarkerType,tagClosingMarkerType,tagSelfClosingMarker,tagNameType,tagNamePrimaryType,tagNameMemberMarkerType,tagNameMemberType,tagNamePrefixMarkerType,tagNameLocalType,tagExpressionAttributeType,tagExpressionAttributeMarkerType,tagExpressionAttributeValueType,tagAttributeType,tagAttributeNameType,tagAttributeNamePrimaryType,tagAttributeNamePrefixMarkerType,tagAttributeNameLocalType,tagAttributeInitializerMarkerType,tagAttributeValueLiteralType,tagAttributeValueLiteralMarkerType,tagAttributeValueLiteralValueType,tagAttributeValueExpressionType,tagAttributeValueExpressionMarkerType,tagAttributeValueExpressionValueType){let self2=this,returnState,marker;return start2;function start2(code2){return effects.enter(tagType),effects.enter(tagMarkerType),effects.consume(code2),effects.exit(tagMarkerType),startAfter}function startAfter(code2){return markdownLineEndingOrSpace(code2)?nok(code2):(returnState=nameBefore,esWhitespaceStart(code2))}function nameBefore(code2){if(code2===47)return effects.enter(tagClosingMarkerType),effects.consume(code2),effects.exit(tagClosingMarkerType),returnState=closingTagNameBefore,esWhitespaceStart;if(code2===62)return tagEnd(code2);if(code2!==null&&code2>=0&&start(code2))return effects.enter(tagNameType),effects.enter(tagNamePrimaryType),effects.consume(code2),primaryName;crash(code2,"before name","a character that can start a name, such as a letter, `$`, or `_`"+(code2===33?" (note: to create a comment in MDX, use `{/* text */}`)":""))}function closingTagNameBefore(code2){if(code2===62)return tagEnd(code2);if(code2!==null&&code2>=0&&start(code2))return effects.enter(tagNameType),effects.enter(tagNamePrimaryType),effects.consume(code2),primaryName;crash(code2,"before name","a character that can start a name, such as a letter, `$`, or `_`"+(code2===42||code2===47?" (note: JS comments in JSX tags are not supported in MDX)":""))}function primaryName(code2){if(code2!==null&&code2>=0&&cont(code2,{jsx:!0}))return effects.consume(code2),primaryName;if(code2===46||code2===47||code2===58||code2===62||code2===123||markdownLineEndingOrSpace(code2)||unicodeWhitespace(code2))return effects.exit(tagNamePrimaryType),returnState=primaryNameAfter,esWhitespaceStart(code2);crash(code2,"in name","a name character such as letters, digits, `$`, or `_`; whitespace before attributes; or the end of the tag"+(code2===64?" (note: to create a link in MDX, use `[text](url)`)":""))}function primaryNameAfter(code2){if(code2===46)return effects.enter(tagNameMemberMarkerType),effects.consume(code2),effects.exit(tagNameMemberMarkerType),returnState=memberNameBefore,esWhitespaceStart;if(code2===58)return effects.enter(tagNamePrefixMarkerType),effects.consume(code2),effects.exit(tagNamePrefixMarkerType),returnState=localNameBefore,esWhitespaceStart;if(code2===47||code2===62||code2===123||code2!==null&&code2>=0&&start(code2))return effects.exit(tagNameType),attributeBefore(code2);crash(code2,"after name","a character that can start an attribute name, such as a letter, `$`, or `_`; whitespace before attributes; or the end of the tag")}function memberNameBefore(code2){if(code2!==null&&code2>=0&&start(code2))return effects.enter(tagNameMemberType),effects.consume(code2),memberName;crash(code2,"before member name","a character that can start an attribute name, such as a letter, `$`, or `_`; whitespace before attributes; or the end of the tag")}function memberName(code2){if(code2!==null&&code2>=0&&cont(code2,{jsx:!0}))return effects.consume(code2),memberName;if(code2===46||code2===47||code2===62||code2===123||markdownLineEndingOrSpace(code2)||unicodeWhitespace(code2))return effects.exit(tagNameMemberType),returnState=memberNameAfter,esWhitespaceStart(code2);crash(code2,"in member name","a name character such as letters, digits, `$`, or `_`; whitespace before attributes; or the end of the tag"+(code2===64?" (note: to create a link in MDX, use `[text](url)`)":""))}function memberNameAfter(code2){if(code2===46)return effects.enter(tagNameMemberMarkerType),effects.consume(code2),effects.exit(tagNameMemberMarkerType),returnState=memberNameBefore,esWhitespaceStart;if(code2===47||code2===62||code2===123||code2!==null&&code2>=0&&start(code2))return effects.exit(tagNameType),attributeBefore(code2);crash(code2,"after member name","a character that can start an attribute name, such as a letter, `$`, or `_`; whitespace before attributes; or the end of the tag")}function localNameBefore(code2){if(code2!==null&&code2>=0&&start(code2))return effects.enter(tagNameLocalType),effects.consume(code2),localName;crash(code2,"before local name","a character that can start a name, such as a letter, `$`, or `_`"+(code2===43||code2!==null&&code2>46&&code2<58?" (note: to create a link in MDX, use `[text](url)`)":""))}function localName(code2){if(code2!==null&&code2>=0&&cont(code2,{jsx:!0}))return effects.consume(code2),localName;if(code2===47||code2===62||code2===123||markdownLineEndingOrSpace(code2)||unicodeWhitespace(code2))return effects.exit(tagNameLocalType),returnState=localNameAfter,esWhitespaceStart(code2);crash(code2,"in local name","a name character such as letters, digits, `$`, or `_`; whitespace before attributes; or the end of the tag")}function localNameAfter(code2){if(code2===47||code2===62||code2===123||code2!==null&&code2>=0&&start(code2))return effects.exit(tagNameType),attributeBefore(code2);crash(code2,"after local name","a character that can start an attribute name, such as a letter, `$`, or `_`; whitespace before attributes; or the end of the tag")}function attributeBefore(code2){if(code2===47)return effects.enter(tagSelfClosingMarker),effects.consume(code2),effects.exit(tagSelfClosingMarker),returnState=selfClosing,esWhitespaceStart;if(code2===62)return tagEnd(code2);if(code2===123)return factoryMdxExpression.call(self2,effects,attributeExpressionAfter,tagExpressionAttributeType,tagExpressionAttributeMarkerType,tagExpressionAttributeValueType,acorn,acornOptions,addResult,!0,!1,allowLazy)(code2);if(code2!==null&&code2>=0&&start(code2))return effects.enter(tagAttributeType),effects.enter(tagAttributeNameType),effects.enter(tagAttributeNamePrimaryType),effects.consume(code2),attributePrimaryName;crash(code2,"before attribute name","a character that can start an attribute name, such as a letter, `$`, or `_`; whitespace before attributes; or the end of the tag")}function attributeExpressionAfter(code2){return returnState=attributeBefore,esWhitespaceStart(code2)}function attributePrimaryName(code2){if(code2!==null&&code2>=0&&cont(code2,{jsx:!0}))return effects.consume(code2),attributePrimaryName;if(code2===47||code2===58||code2===61||code2===62||code2===123||markdownLineEndingOrSpace(code2)||unicodeWhitespace(code2))return effects.exit(tagAttributeNamePrimaryType),returnState=attributePrimaryNameAfter,esWhitespaceStart(code2);crash(code2,"in attribute name","an attribute name character such as letters, digits, `$`, or `_`; `=` to initialize a value; whitespace before attributes; or the end of the tag")}function attributePrimaryNameAfter(code2){if(code2===58)return effects.enter(tagAttributeNamePrefixMarkerType),effects.consume(code2),effects.exit(tagAttributeNamePrefixMarkerType),returnState=attributeLocalNameBefore,esWhitespaceStart;if(code2===61)return effects.exit(tagAttributeNameType),effects.enter(tagAttributeInitializerMarkerType),effects.consume(code2),effects.exit(tagAttributeInitializerMarkerType),returnState=attributeValueBefore,esWhitespaceStart;if(code2===47||code2===62||code2===123||markdownLineEndingOrSpace(code2)||unicodeWhitespace(code2)||code2!==null&&code2>=0&&start(code2))return effects.exit(tagAttributeNameType),effects.exit(tagAttributeType),returnState=attributeBefore,esWhitespaceStart(code2);crash(code2,"after attribute name","a character that can start an attribute name, such as a letter, `$`, or `_`; `=` to initialize a value; or the end of the tag")}function attributeLocalNameBefore(code2){if(code2!==null&&code2>=0&&start(code2))return effects.enter(tagAttributeNameLocalType),effects.consume(code2),attributeLocalName;crash(code2,"before local attribute name","a character that can start an attribute name, such as a letter, `$`, or `_`; `=` to initialize a value; or the end of the tag")}function attributeLocalName(code2){if(code2!==null&&code2>=0&&cont(code2,{jsx:!0}))return effects.consume(code2),attributeLocalName;if(code2===47||code2===61||code2===62||code2===123||markdownLineEndingOrSpace(code2)||unicodeWhitespace(code2))return effects.exit(tagAttributeNameLocalType),effects.exit(tagAttributeNameType),returnState=attributeLocalNameAfter,esWhitespaceStart(code2);crash(code2,"in local attribute name","an attribute name character such as letters, digits, `$`, or `_`; `=` to initialize a value; whitespace before attributes; or the end of the tag")}function attributeLocalNameAfter(code2){if(code2===61)return effects.enter(tagAttributeInitializerMarkerType),effects.consume(code2),effects.exit(tagAttributeInitializerMarkerType),returnState=attributeValueBefore,esWhitespaceStart;if(code2===47||code2===62||code2===123||code2!==null&&code2>=0&&start(code2))return effects.exit(tagAttributeType),attributeBefore(code2);crash(code2,"after local attribute name","a character that can start an attribute name, such as a letter, `$`, or `_`; `=` to initialize a value; or the end of the tag")}function attributeValueBefore(code2){if(code2===34||code2===39)return effects.enter(tagAttributeValueLiteralType),effects.enter(tagAttributeValueLiteralMarkerType),effects.consume(code2),effects.exit(tagAttributeValueLiteralMarkerType),marker=code2,attributeValueQuotedStart;if(code2===123)return factoryMdxExpression.call(self2,effects,attributeValueExpressionAfter,tagAttributeValueExpressionType,tagAttributeValueExpressionMarkerType,tagAttributeValueExpressionValueType,acorn,acornOptions,addResult,!1,!1,allowLazy)(code2);crash(code2,"before attribute value","a character that can start an attribute value, such as `\"`, `'`, or `{`"+(code2===60?" (note: to use an element or fragment as a prop value in MDX, use `{<element />}`)":""))}function attributeValueExpressionAfter(code2){return effects.exit(tagAttributeType),returnState=attributeBefore,esWhitespaceStart(code2)}function attributeValueQuotedStart(code2){return code2===null&&crash(code2,"in attribute value","a corresponding closing quote `"+String.fromCodePoint(marker)+"`"),code2===marker?(effects.enter(tagAttributeValueLiteralMarkerType),effects.consume(code2),effects.exit(tagAttributeValueLiteralMarkerType),effects.exit(tagAttributeValueLiteralType),effects.exit(tagAttributeType),marker=void 0,returnState=attributeBefore,esWhitespaceStart):markdownLineEnding(code2)?(returnState=attributeValueQuotedStart,esWhitespaceStart(code2)):(effects.enter(tagAttributeValueLiteralValueType),attributeValueQuoted(code2))}function attributeValueQuoted(code2){return code2===null||code2===marker||markdownLineEnding(code2)?(effects.exit(tagAttributeValueLiteralValueType),attributeValueQuotedStart(code2)):(effects.consume(code2),attributeValueQuoted)}function selfClosing(code2){if(code2===62)return tagEnd(code2);crash(code2,"after self-closing slash","`>` to end the tag"+(code2===42||code2===47?" (note: JS comments in JSX tags are not supported in MDX)":""))}function tagEnd(code2){return effects.enter(tagMarkerType),effects.consume(code2),effects.exit(tagMarkerType),effects.exit(tagType),ok2}function esWhitespaceStart(code2){return markdownLineEnding(code2)?(effects.enter("lineEnding"),effects.consume(code2),effects.exit("lineEnding"),esWhitespaceEolAfter):markdownSpace(code2)||unicodeWhitespace(code2)?(effects.enter("esWhitespace"),esWhitespaceInside(code2)):returnState(code2)}function esWhitespaceInside(code2){return markdownLineEnding(code2)?(effects.exit("esWhitespace"),esWhitespaceStart(code2)):markdownSpace(code2)||unicodeWhitespace(code2)?(effects.consume(code2),esWhitespaceInside):(effects.exit("esWhitespace"),returnState(code2))}function esWhitespaceEolAfter(code2){if(!allowLazy&&self2.parser.lazy[self2.now().line]){let error=new VFileMessage("Unexpected lazy line in container, expected line to be prefixed with `>` when in a block quote, whitespace when in a list, etc",self2.now(),"micromark-extension-mdx-jsx:unexpected-lazy");throw error.url=trouble2+"#unexpected-lazy-line-in-container-expected-line-to-be",error}return esWhitespaceStart(code2)}function crash(code2,at2,expect){let error=new VFileMessage("Unexpected "+(code2===null?"end of file":"character `"+(code2===96?"` ` `":String.fromCodePoint(code2))+"` ("+serializeCharCode(code2)+")")+" "+at2+", expected "+expect,self2.now(),"micromark-extension-mdx-jsx:unexpected-"+(code2===null?"eof":"character"));throw error.url=trouble2+(code2===null?"#unexpected-end-of-file-at-expected-expect":"#unexpected-character-at-expected-expect"),error}}function serializeCharCode(code2){return"U+"+code2.toString(16).toUpperCase().padStart(4,"0")}function jsxText(acorn,options){return{name:"mdxJsxTextTag",tokenize:tokenizeJsxText};function tokenizeJsxText(effects,ok2,nok){return factoryTag.call(this,effects,ok2,nok,acorn,options.acornOptions,options.addResult,!0,"mdxJsxTextTag","mdxJsxTextTagMarker","mdxJsxTextTagClosingMarker","mdxJsxTextTagSelfClosingMarker","mdxJsxTextTagName","mdxJsxTextTagNamePrimary","mdxJsxTextTagNameMemberMarker","mdxJsxTextTagNameMember","mdxJsxTextTagNamePrefixMarker","mdxJsxTextTagNameLocal","mdxJsxTextTagExpressionAttribute","mdxJsxTextTagExpressionAttributeMarker","mdxJsxTextTagExpressionAttributeValue","mdxJsxTextTagAttribute","mdxJsxTextTagAttributeName","mdxJsxTextTagAttributeNamePrimary","mdxJsxTextTagAttributeNamePrefixMarker","mdxJsxTextTagAttributeNameLocal","mdxJsxTextTagAttributeInitializerMarker","mdxJsxTextTagAttributeValueLiteral","mdxJsxTextTagAttributeValueLiteralMarker","mdxJsxTextTagAttributeValueLiteralValue","mdxJsxTextTagAttributeValueExpression","mdxJsxTextTagAttributeValueExpressionMarker","mdxJsxTextTagAttributeValueExpressionValue")}}function jsxFlow(acorn,options){return{name:"mdxJsxFlowTag",tokenize:tokenizeJsxFlow,concrete:!0};function tokenizeJsxFlow(effects,ok2,nok){let self2=this;return start2;function start2(code2){return before(code2)}function before(code2){return factoryTag.call(self2,effects,after,nok,acorn,options.acornOptions,options.addResult,!1,"mdxJsxFlowTag","mdxJsxFlowTagMarker","mdxJsxFlowTagClosingMarker","mdxJsxFlowTagSelfClosingMarker","mdxJsxFlowTagName","mdxJsxFlowTagNamePrimary","mdxJsxFlowTagNameMemberMarker","mdxJsxFlowTagNameMember","mdxJsxFlowTagNamePrefixMarker","mdxJsxFlowTagNameLocal","mdxJsxFlowTagExpressionAttribute","mdxJsxFlowTagExpressionAttributeMarker","mdxJsxFlowTagExpressionAttributeValue","mdxJsxFlowTagAttribute","mdxJsxFlowTagAttributeName","mdxJsxFlowTagAttributeNamePrimary","mdxJsxFlowTagAttributeNamePrefixMarker","mdxJsxFlowTagAttributeNameLocal","mdxJsxFlowTagAttributeInitializerMarker","mdxJsxFlowTagAttributeValueLiteral","mdxJsxFlowTagAttributeValueLiteralMarker","mdxJsxFlowTagAttributeValueLiteralValue","mdxJsxFlowTagAttributeValueExpression","mdxJsxFlowTagAttributeValueExpressionMarker","mdxJsxFlowTagAttributeValueExpressionValue")(code2)}function after(code2){return markdownSpace(code2)?factorySpace(effects,end,"whitespace")(code2):end(code2)}function end(code2){let leftBraceValue=self2.parser.constructs.flow[123],expression=(Array.isArray(leftBraceValue)?leftBraceValue:leftBraceValue?[leftBraceValue]:[]).find(d=>d.name==="mdxFlowExpression");return code2===60?start2(code2):code2===123&&expression?effects.attempt(expression,end,nok)(code2):code2===null||markdownLineEnding(code2)?ok2(code2):nok(code2)}}}function mdxJsx(options){let settings=options||{},acorn=settings.acorn,acornOptions;if(acorn){if(!acorn.parse||!acorn.parseExpressionAt)throw new Error("Expected a proper `acorn` instance passed in as `options.acorn`");acornOptions=Object.assign({ecmaVersion:2024,sourceType:"module"},settings.acornOptions,{locations:!0})}else if(settings.acornOptions||settings.addResult)throw new Error("Expected an `acorn` instance passed in as `options.acorn`");return{flow:{60:jsxFlow(acorn||void 0,{acornOptions,addResult:settings.addResult||void 0})},text:{60:jsxText(acorn||void 0,{acornOptions,addResult:settings.addResult||void 0})}}}function mdxMd(){return{disable:{null:["autolink","codeIndented","htmlFlow","htmlText"]}}}var blankLineBefore2={tokenize:tokenizeNextBlank,partial:!0},trouble3="https://github.com/micromark/micromark-extension-mdxjs-esm",allowedAcornTypes=new Set(["ExportAllDeclaration","ExportDefaultDeclaration","ExportNamedDeclaration","ImportDeclaration"]);function mdxjsEsm(options){let exportImportConstruct={tokenize:tokenizeExportImport,concrete:!0};if(!options||!options.acorn||!options.acorn.parse)throw new Error("Expected an `acorn` instance passed in as `options.acorn`");let acorn=options.acorn,acornOptions=Object.assign({ecmaVersion:2024,sourceType:"module"},options.acornOptions,{locations:!0});return{flow:{101:exportImportConstruct,105:exportImportConstruct}};function tokenizeExportImport(effects,ok2,nok){let self2=this,definedModuleSpecifiers=self2.parser.definedModuleSpecifiers||(self2.parser.definedModuleSpecifiers=[]),eventStart=this.events.length+1,buffer="";return self2.interrupt?nok:start2;function start2(code2){return self2.now().column>1?nok(code2):(effects.enter("mdxjsEsm"),effects.enter("mdxjsEsmData"),effects.consume(code2),buffer+=String.fromCharCode(code2),word)}function word(code2){return asciiAlpha(code2)?(effects.consume(code2),buffer+=String.fromCharCode(code2),word):(buffer==="import"||buffer==="export")&&code2===32?(effects.consume(code2),inside):nok(code2)}function inside(code2){return code2===null||markdownLineEnding(code2)?(effects.exit("mdxjsEsmData"),lineStart(code2)):(effects.consume(code2),inside)}function lineStart(code2){return code2===null?atEnd(code2):markdownLineEnding(code2)?effects.check(blankLineBefore2,atEnd,continuationStart)(code2):(effects.enter("mdxjsEsmData"),inside(code2))}function continuationStart(code2){return effects.enter("lineEnding"),effects.consume(code2),effects.exit("lineEnding"),lineStart}function atEnd(code2){let result=eventsToAcorn(self2.events.slice(eventStart),{acorn,acornOptions,tokenTypes:["mdxjsEsmData"],prefix:definedModuleSpecifiers.length>0?"var "+definedModuleSpecifiers.join(",")+`
58
- `:""});if(result.error){if(code2!==null&&result.swallow)return continuationStart(code2);let error=new VFileMessage("Could not parse import/exports with acorn",{cause:result.error,place:{line:result.error.loc.line,column:result.error.loc.column+1,offset:result.error.pos},ruleId:"acorn",source:"micromark-extension-mdxjs-esm"});throw error.url=trouble3+"#could-not-parse-importexports-with-acorn",error}if(definedModuleSpecifiers.length>0){let declaration=result.estree.body.shift()}let index2=-1;for(;++index2<result.estree.body.length;){let node3=result.estree.body[index2];if(!allowedAcornTypes.has(node3.type)){let error=new VFileMessage("Unexpected `"+node3.type+"` in code: only import/exports are supported",{place:positionFromEstree(node3),ruleId:"non-esm",source:"micromark-extension-mdxjs-esm"});throw error.url=trouble3+"#unexpected-type-in-code-only-importexports-are-supported",error}if(node3.type==="ImportDeclaration"&&!self2.interrupt){let index3=-1;for(;++index3<node3.specifiers.length;){let specifier=node3.specifiers[index3];definedModuleSpecifiers.push(specifier.local.name)}}}return Object.assign(effects.exit("mdxjsEsm"),options.addResult?{estree:result.estree}:void 0),ok2(code2)}}}function tokenizeNextBlank(effects,ok2,nok){return start2;function start2(code2){return effects.enter("lineEndingBlank"),effects.consume(code2),effects.exit("lineEndingBlank"),effects.attempt(blankLine,ok2,nok)}}function mdxjs(options){let settings=Object.assign({acorn:Parser.extend((0,import_acorn_jsx.default)()),acornOptions:{ecmaVersion:2024,sourceType:"module"},addResult:!0},options);return combineExtensions([mdxjsEsm(settings),mdxExpression(settings),mdxJsx(settings),mdxMd()])}var emptyOptions4={};function remarkMdx(options){let self2=this,settings=options||emptyOptions4,data2=self2.data(),micromarkExtensions=data2.micromarkExtensions||(data2.micromarkExtensions=[]),fromMarkdownExtensions=data2.fromMarkdownExtensions||(data2.fromMarkdownExtensions=[]),toMarkdownExtensions=data2.toMarkdownExtensions||(data2.toMarkdownExtensions=[]);micromarkExtensions.push(mdxjs(settings)),fromMarkdownExtensions.push(mdxFromMarkdown()),toMarkdownExtensions.push(mdxToMarkdown(settings))}var t=__toESM(require("@babel/types")),babel=__toESM(require("@babel/core")),recast=__toESM(require("recast")),path=__toESM(require("path")),import_prettier=__toESM(require("prettier")),fs=__toESM(require("fs")),import_camelCase=__toESM(require("lodash/camelCase")),mdxProcessor=remark().use(remarkMdx);async function jscodeshift(info){let parsed=path.parse(info.path),baseName=path.join(parsed.dir,parsed.name.replace(".mdx","").replace(".stories","").replace(".story",""));for(;fs.existsSync(`${baseName}.stories.js`);)baseName+="_";let result=await transform(info,path.basename(baseName)),[mdx,csf]=result;return csf!=null&&fs.writeFileSync(`${baseName}.stories.js`,csf),mdx}async function transform(info,baseName){let root2=mdxProcessor.parse(info.source),storyNamespaceName=nameToValidExport(`${baseName}Stories`),metaAttributes=[],storiesMap=new Map;visit(root2,["mdxjsEsm"],node3=>{node3.value=node3.value.replaceAll("@storybook/addon-docs/blocks","@storybook/blocks").replaceAll("@storybook/addon-docs","@storybook/blocks")});let file=getEsmAst(root2);visit(root2,["mdxJsxFlowElement","mdxJsxTextElement"],(node3,index2,parent)=>{if((node3.type==="mdxJsxFlowElement"||node3.type==="mdxJsxTextElement")&&(is(node3,{name:"Meta"})&&(metaAttributes.push(...node3.attributes),node3.attributes=[{type:"mdxJsxAttribute",name:"of",value:{type:"mdxJsxAttributeValueExpression",value:storyNamespaceName}}]),is(node3,{name:"Story"}))){let nameAttribute=node3.attributes.find(it=>it.type==="mdxJsxAttribute"&&it.name==="name"),idAttribute=node3.attributes.find(it=>it.type==="mdxJsxAttribute"&&it.name==="id"),storyAttribute=node3.attributes.find(it=>it.type==="mdxJsxAttribute"&&it.name==="story");if(typeof nameAttribute?.value=="string"){let name2=nameToValidExport(nameAttribute.value);for(;variableNameExists(name2);)name2+="_";storiesMap.set(name2,{type:"value",attributes:node3.attributes,children:node3.children}),node3.attributes=[{type:"mdxJsxAttribute",name:"of",value:{type:"mdxJsxAttributeValueExpression",value:`${storyNamespaceName}.${name2}`}}],node3.children=[]}else if(idAttribute?.value){let newNode={type:"mdxFlowExpression",value:`/* ${mdxProcessor.stringify({type:"root",children:[node3]}).trim()} is deprecated, please migrate it to <Story of={referenceToStory} /> see: https://storybook.js.org/migration-guides/7.0 */`};return storiesMap.set(idAttribute.value,{type:"id"}),parent?.children.splice(index2,0,newNode),[SKIP,index2+2]}else if(storyAttribute?.type==="mdxJsxAttribute"&&typeof storyAttribute.value=="object"&&storyAttribute.value?.type==="mdxJsxAttributeValueExpression"){let name2=storyAttribute.value?.value;node3.attributes=[{type:"mdxJsxAttribute",name:"of",value:{type:"mdxJsxAttributeValueExpression",value:`${storyNamespaceName}.${name2}`}}],node3.children=[],storiesMap.set(name2??"",{type:"reference"})}else return parent?.children.splice(index2,1),[SKIP,index2]}});let metaProperties=metaAttributes.flatMap(attribute=>attribute.type==="mdxJsxAttribute"?typeof attribute.value=="string"?[t.objectProperty(t.identifier(attribute.name),t.stringLiteral(attribute.value))]:[t.objectProperty(t.identifier(attribute.name),(0,import_csf_tools.babelParseExpression)(attribute.value?.value??""))]:[]);if(file.path.traverse({ImportDeclaration(path3){path3.node.source.value==="@storybook/blocks"&&path3.remove()},ExportNamedDeclaration(path3){path3.replaceWith(path3.node.declaration)}}),storiesMap.size===0&&metaAttributes.length===0)return[mdxProcessor.stringify(root2),""];addStoriesImport(root2,baseName,storyNamespaceName);let newStatements=[t.exportDefaultDeclaration(t.objectExpression(metaProperties))];function mapChildrenToRender(children){let child=children[0];if(!child)return;if(child.type==="text")return t.arrowFunctionExpression([],t.stringLiteral(child.value));if(child.type==="mdxFlowExpression"||child.type==="mdxTextExpression"){let expression2=(0,import_csf_tools.babelParseExpression)(child.value);return/\.bind\(.*\)/.test(child.value)||t.isIdentifier(expression2)||t.isArrowFunctionExpression(expression2)?expression2:t.arrowFunctionExpression([],expression2)}let expression=(0,import_csf_tools.babelParseExpression)(mdxProcessor.stringify({type:"root",children:[child]}));return t.arrowFunctionExpression([],expression)}function variableNameExists(name2){let found=!1;return file.path.traverse({VariableDeclarator:path3=>{let lVal=path3.node.id;t.isIdentifier(lVal)&&lVal.name===name2&&(found=!0)}}),found}newStatements.push(...[...storiesMap].flatMap(([key,value])=>{if(value.type==="id")return[];if(value.type==="reference")return[t.exportNamedDeclaration(null,[t.exportSpecifier(t.identifier(key),t.identifier(key))])];let renderProperty=mapChildrenToRender(value.children),newObject=t.objectExpression([...renderProperty?[t.objectProperty(t.identifier("render"),renderProperty)]:[],...value.attributes.flatMap(attribute=>attribute.type==="mdxJsxAttribute"?typeof attribute.value=="string"?[t.objectProperty(t.identifier(attribute.name),t.stringLiteral(attribute.value))]:[t.objectProperty(t.identifier(attribute.name),(0,import_csf_tools.babelParseExpression)(attribute.value?.value??""))]:[])]);return[t.exportNamedDeclaration(t.variableDeclaration("const",[t.variableDeclarator(t.identifier(key),newObject)]))]})),file.path.node.body=[...file.path.node.body,...newStatements];let newMdx=mdxProcessor.stringify(root2),output=recast.print(file.path.node).code,path2=`${info.path}.jsx`;return output=await import_prettier.default.format(output.trim(),{...await import_prettier.default.resolveConfig(path2),filepath:path2}),[newMdx,output]}function getEsmAst(root2){let esm=[];visit(root2,"mdxjsEsm",node3=>{esm.push(node3.value)});let esmSource=`${esm.join(`
58
+ `:""});if(result.error){if(code2!==null&&result.swallow)return continuationStart(code2);let error=new VFileMessage("Could not parse import/exports with acorn",{cause:result.error,place:{line:result.error.loc.line,column:result.error.loc.column+1,offset:result.error.pos},ruleId:"acorn",source:"micromark-extension-mdxjs-esm"});throw error.url=trouble3+"#could-not-parse-importexports-with-acorn",error}if(definedModuleSpecifiers.length>0){let declaration=result.estree.body.shift()}let index2=-1;for(;++index2<result.estree.body.length;){let node3=result.estree.body[index2];if(!allowedAcornTypes.has(node3.type)){let error=new VFileMessage("Unexpected `"+node3.type+"` in code: only import/exports are supported",{place:positionFromEstree(node3),ruleId:"non-esm",source:"micromark-extension-mdxjs-esm"});throw error.url=trouble3+"#unexpected-type-in-code-only-importexports-are-supported",error}if(node3.type==="ImportDeclaration"&&!self2.interrupt){let index3=-1;for(;++index3<node3.specifiers.length;){let specifier=node3.specifiers[index3];definedModuleSpecifiers.push(specifier.local.name)}}}return Object.assign(effects.exit("mdxjsEsm"),options.addResult?{estree:result.estree}:void 0),ok2(code2)}}}function tokenizeNextBlank(effects,ok2,nok){return start2;function start2(code2){return effects.enter("lineEndingBlank"),effects.consume(code2),effects.exit("lineEndingBlank"),effects.attempt(blankLine,ok2,nok)}}function mdxjs(options){let settings=Object.assign({acorn:Parser.extend((0,import_acorn_jsx.default)()),acornOptions:{ecmaVersion:2024,sourceType:"module"},addResult:!0},options);return combineExtensions([mdxjsEsm(settings),mdxExpression(settings),mdxJsx(settings),mdxMd()])}var emptyOptions4={};function remarkMdx(options){let self2=this,settings=options||emptyOptions4,data2=self2.data(),micromarkExtensions=data2.micromarkExtensions||(data2.micromarkExtensions=[]),fromMarkdownExtensions=data2.fromMarkdownExtensions||(data2.fromMarkdownExtensions=[]),toMarkdownExtensions=data2.toMarkdownExtensions||(data2.toMarkdownExtensions=[]);micromarkExtensions.push(mdxjs(settings)),fromMarkdownExtensions.push(mdxFromMarkdown()),toMarkdownExtensions.push(mdxToMarkdown(settings))}var t=__toESM(require("@babel/types")),babel=__toESM(require("@babel/core")),recast=__toESM(require("recast")),path=__toESM(require("path")),import_prettier=__toESM(require("prettier")),fs=__toESM(require("fs")),import_camelCase=__toESM(require("lodash/camelCase")),mdxProcessor=remark().use(remarkMdx),renameList=[],brokenList=[];async function jscodeshift(info){let parsed=path.parse(info.path),baseName=path.join(parsed.dir,parsed.name.replace(".mdx","").replace(".stories","").replace(".story",""));for(;fs.existsSync(`${baseName}.stories.js`);)baseName+="_";try{let{csf,mdx}=await transform(info,path.basename(baseName));return csf!=null&&fs.writeFileSync(`${baseName}.stories.js`,csf),renameList.push({original:info.path,baseName}),mdx}catch(e){throw brokenList.push({original:info.path,baseName}),e}}process.on("exit",()=>{renameList.forEach(file=>{fs.renameSync(file.original,`${file.baseName}.mdx`)}),brokenList.forEach(file=>{fs.renameSync(file.original,`${file.original}.broken`)})});async function transform(info,baseName){let root2=mdxProcessor.parse(info.source),storyNamespaceName=nameToValidExport(`${baseName}Stories`),metaAttributes=[],storiesMap=new Map;visit(root2,["mdxjsEsm"],node3=>{if(node3.value=node3.value.replaceAll("@storybook/addon-docs/blocks","@storybook/blocks").replaceAll("@storybook/addon-docs","@storybook/blocks"),node3.value.includes("@storybook/blocks")){let file2=new babel.File({filename:"info.path"},{code:node3.value,ast:(0,import_csf_tools.babelParse)(node3.value)});file2.path.traverse({ImportDeclaration(path3){path3.node.source.value==="@storybook/blocks"&&path3.get("specifiers").forEach(specifier=>{if(specifier.isImportSpecifier()){let imported=specifier.get("imported");imported.isIdentifier()&&imported.node.name==="ArgsTable"&&(imported.node.name="Controls")}})}}),node3.value=recast.print(file2.ast).code}});let file=getEsmAst(root2);if(visit(root2,["mdxJsxFlowElement","mdxJsxTextElement"],(node3,index2,parent)=>{if((node3.type==="mdxJsxFlowElement"||node3.type==="mdxJsxTextElement")&&(is(node3,{name:"ArgsTable"})&&(node3.name="Controls",node3.attributes=[]),is(node3,{name:"Story"}))){let nameAttribute=node3.attributes.find(it=>it.type==="mdxJsxAttribute"&&it.name==="name"),idAttribute=node3.attributes.find(it=>it.type==="mdxJsxAttribute"&&it.name==="id"),storyAttribute=node3.attributes.find(it=>it.type==="mdxJsxAttribute"&&it.name==="story");if(typeof nameAttribute?.value=="string"){let name2=nameToValidExport(nameAttribute.value);for(;variableNameExists(name2);)name2+="_";storiesMap.set(name2,{type:"value",attributes:node3.attributes,children:node3.children}),node3.attributes=[{type:"mdxJsxAttribute",name:"of",value:{type:"mdxJsxAttributeValueExpression",value:`${storyNamespaceName}.${name2}`}}],node3.children=[]}else if(idAttribute?.value){let newNode={type:"mdxFlowExpression",value:`/* ${mdxProcessor.stringify({type:"root",children:[node3]}).trim()} is deprecated, please migrate it to <Story of={referenceToStory} /> see: https://storybook.js.org/migration-guides/7.0 */`};return storiesMap.set(idAttribute.value,{type:"id"}),parent?.children.splice(index2,0,newNode),[SKIP,index2+2]}else if(storyAttribute?.type==="mdxJsxAttribute"&&typeof storyAttribute.value=="object"&&storyAttribute.value?.type==="mdxJsxAttributeValueExpression"){let name2=storyAttribute.value?.value;node3.attributes=[{type:"mdxJsxAttribute",name:"of",value:{type:"mdxJsxAttributeValueExpression",value:`${storyNamespaceName}.${name2}`}}],node3.children=[],storiesMap.set(name2??"",{type:"reference"})}else return parent?.children.splice(index2,1),[SKIP,index2]}}),file.path.traverse({ImportDeclaration(path3){path3.node.source.value==="@storybook/blocks"&&path3.remove()},ExportNamedDeclaration(path3){path3.replaceWith(path3.node.declaration)}}),storiesMap.size===0)return{csf:null,mdx:mdxProcessor.stringify(root2)};visit(root2,["mdxJsxFlowElement","mdxJsxTextElement"],(node3,index2,parent)=>{(node3.type==="mdxJsxFlowElement"||node3.type==="mdxJsxTextElement")&&is(node3,{name:"Meta"})&&(metaAttributes.push(...node3.attributes),node3.attributes=[{type:"mdxJsxAttribute",name:"of",value:{type:"mdxJsxAttributeValueExpression",value:storyNamespaceName}}])});let metaProperties=metaAttributes.flatMap(attribute=>attribute.type==="mdxJsxAttribute"?typeof attribute.value=="string"?[t.objectProperty(t.identifier(attribute.name),t.stringLiteral(attribute.value))]:[t.objectProperty(t.identifier(attribute.name),(0,import_csf_tools.babelParseExpression)(attribute.value?.value??""))]:[]);addStoriesImport(root2,baseName,storyNamespaceName);let newStatements=[t.exportDefaultDeclaration(t.objectExpression(metaProperties))];function mapChildrenToRender(children){let child=children[0];if(!child)return;if(child.type==="text")return t.arrowFunctionExpression([],t.stringLiteral(child.value));if(child.type==="mdxFlowExpression"||child.type==="mdxTextExpression"){let expression2=(0,import_csf_tools.babelParseExpression)(child.value);return/\.bind\(.*\)/.test(child.value)||t.isIdentifier(expression2)||t.isArrowFunctionExpression(expression2)?expression2:t.arrowFunctionExpression([],expression2)}let expression=(0,import_csf_tools.babelParseExpression)(mdxProcessor.stringify({type:"root",children:[child]}));return t.arrowFunctionExpression([],expression)}function variableNameExists(name2){let found=!1;return file.path.traverse({VariableDeclarator:path3=>{let lVal=path3.node.id;t.isIdentifier(lVal)&&lVal.name===name2&&(found=!0)}}),found}newStatements.push(...[...storiesMap].flatMap(([key,value])=>{if(value.type==="id")return[];if(value.type==="reference")return[t.exportNamedDeclaration(null,[t.exportSpecifier(t.identifier(key),t.identifier(key))])];let renderProperty=mapChildrenToRender(value.children),newObject=t.objectExpression([...renderProperty?[t.objectProperty(t.identifier("render"),renderProperty)]:[],...value.attributes.flatMap(attribute=>attribute.type==="mdxJsxAttribute"?typeof attribute.value=="string"?[t.objectProperty(t.identifier(attribute.name),t.stringLiteral(attribute.value))]:[t.objectProperty(t.identifier(attribute.name),(0,import_csf_tools.babelParseExpression)(attribute.value?.value??""))]:[])]);return[t.exportNamedDeclaration(t.variableDeclaration("const",[t.variableDeclarator(t.identifier(key),newObject)]))]})),file.path.node.body=[...file.path.node.body,...newStatements];let newMdx=mdxProcessor.stringify(root2),output=recast.print(file.path.node).code,path2=`${info.path}.jsx`;return output=await import_prettier.default.format(output.trim(),{...await import_prettier.default.resolveConfig(path2),filepath:path2}),{csf:output,mdx:newMdx}}function getEsmAst(root2){let esm=[];visit(root2,"mdxjsEsm",node3=>{esm.push(node3.value)});let esmSource=`${esm.join(`
59
59
 
60
60
  `)}`;return new babel.File({filename:"info.path"},{code:esmSource,ast:(0,import_csf_tools.babelParse)(esmSource)})}function addStoriesImport(root2,baseName,storyNamespaceName){let found=!1;visit(root2,"mdxjsEsm",node3=>{found||(node3.value+=`
61
61
  import * as ${storyNamespaceName} from './${baseName}.stories';`,found=!0)})}function nameToValidExport(name2){let[first,...rest]=Array.from((0,import_camelCase.default)(name2));return`${first.match(/[a-zA-Z_$]/)?first.toUpperCase():`$${first}`}${rest.join("")}`}0&&(module.exports={nameToValidExport,transform});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@storybook/codemod",
3
- "version": "8.0.0-beta.5",
3
+ "version": "8.0.0-beta.6",
4
4
  "description": "A collection of codemod scripts written with JSCodeshift",
5
5
  "keywords": [
6
6
  "storybook"
@@ -58,9 +58,9 @@
58
58
  "@babel/preset-env": "^7.23.2",
59
59
  "@babel/types": "^7.23.0",
60
60
  "@storybook/csf": "^0.1.2",
61
- "@storybook/csf-tools": "8.0.0-beta.5",
62
- "@storybook/node-logger": "8.0.0-beta.5",
63
- "@storybook/types": "8.0.0-beta.5",
61
+ "@storybook/csf-tools": "8.0.0-beta.6",
62
+ "@storybook/node-logger": "8.0.0-beta.6",
63
+ "@storybook/types": "8.0.0-beta.6",
64
64
  "@types/cross-spawn": "^6.0.2",
65
65
  "cross-spawn": "^7.0.3",
66
66
  "globby": "^11.0.2",