import { namedTypes } from "ast-types"; import { API, ASTPath, Collection, FileInfo, JSCodeshift, Options, } from "jscodeshift"; export const parser = "tsx"; const transformRefineOptions = ( j: JSCodeshift, root: Collection, projectId: string, ) => { const refineElements: Array> = []; root.findJSXElements("Refine").forEach((path) => { refineElements.push(path); }); for (const path of refineElements) { const props = path.node.openingElement.attributes; const optionsProp: any = props?.find( (attribute) => attribute.type === "JSXAttribute" && attribute.name.name === "options", ); if (!optionsProp) { path.node.openingElement.attributes?.push( j.jsxAttribute( j.jsxIdentifier("options"), j.jsxExpressionContainer( j.objectExpression([ j.objectProperty( j.identifier("projectId"), j.stringLiteral(projectId), ), ]), ), ), ); break; } // for options={optionsProp} if (!optionsProp?.value.expression.properties) { break; } // for options has already projectId const hasProjectId = optionsProp?.value.expression.properties.find( (p: any) => { if (p.type === "ObjectProperty") { return p.key.name === "projectId"; } return false; }, ); if (hasProjectId) break; optionsProp?.value.expression.properties.push( j.objectProperty( j.identifier("projectId"), j.stringLiteral(projectId), ), ); break; } return root; }; export default function transformer( file: FileInfo, api: API, options: Options, ) { const j = api.jscodeshift; const source = j(file.source); transformRefineOptions(j, source, options.__projectId); return source.toSource(); }