Spaces:
Sleeping
Sleeping
; | |
exports.__esModule = true; | |
exports.getExport = exports.getImport = exports.getInterface = exports.getProps = void 0; | |
function typeAnnotation(typeAnnotation) { | |
return { | |
type: 'TypeAnnotation', | |
typeAnnotation | |
}; | |
} | |
function genericTypeAnnotation(id, typeParameters = null) { | |
return { | |
type: 'GenericTypeAnnotation', | |
id, | |
typeParameters | |
}; | |
} | |
function typeParameters(params) { | |
return { | |
type: 'TypeParameterInstantiation', | |
params | |
}; | |
} | |
function qualifiedTypeIdentifier(qualification, id) { | |
return { | |
type: 'QualifiedTypeIdentifier', | |
qualification, | |
id | |
}; | |
} | |
function intersectionTypeAnnotation(types) { | |
return { | |
type: 'IntersectionTypeAnnotation', | |
types | |
}; | |
} | |
function interfaceDeclaration(id, body) { | |
return { | |
type: 'InterfaceDeclaration', | |
id, | |
typeParameters: null, | |
extends: [], | |
implements: [], | |
mixins: [], | |
body | |
}; | |
} | |
function objectTypeAnnotation(properties) { | |
return { | |
type: 'ObjectTypeAnnotation', | |
properties | |
}; | |
} | |
function objectTypeProperty(key, value, optional = false) { | |
return { | |
type: 'ObjectTypeProperty', | |
key, | |
static: false, | |
proto: false, | |
kind: 'init', | |
method: false, | |
value, | |
variance: null, | |
optional | |
}; | |
} | |
function addTypeAnotation(obj, typeAnnotation, opts) { | |
if (!opts.typescript) return obj; | |
return { ...obj, | |
typeAnnotation | |
}; | |
} | |
function getSvgPropsTypeAnnotation(t, opts) { | |
if (opts.native) { | |
return t.genericTypeAnnotation(t.identifier('SvgProps')); | |
} | |
return genericTypeAnnotation(qualifiedTypeIdentifier(t.identifier('React'), t.identifier('SVGProps')), typeParameters([genericTypeAnnotation(t.identifier('SVGSVGElement'))])); | |
} | |
const getProps = ({ | |
types: t | |
}, opts) => { | |
const props = []; | |
if (opts.titleProp) { | |
props.push(t.objectProperty(t.identifier('title'), t.identifier('title'), false, true)); | |
props.push(t.objectProperty(t.identifier('titleId'), t.identifier('titleId'), false, true)); | |
} | |
if (opts.expandProps && props.length > 0) { | |
props.push(t.restElement(t.identifier('props'))); | |
} | |
const propsArgument = props.length > 0 ? t.objectPattern(props) : t.identifier('props'); | |
let propsTypeAnnotation; | |
if (props.length > 0) { | |
propsTypeAnnotation = genericTypeAnnotation(t.identifier('SVGRProps')); | |
if (opts.expandProps) { | |
propsTypeAnnotation = intersectionTypeAnnotation([getSvgPropsTypeAnnotation(t, opts), propsTypeAnnotation]); | |
} | |
} else { | |
propsTypeAnnotation = opts.expandProps ? getSvgPropsTypeAnnotation(t, opts) : t.objectPattern([]); | |
} | |
const typedPropsArgument = addTypeAnotation(propsArgument, typeAnnotation(propsTypeAnnotation), opts); | |
const args = []; | |
if (opts.expandProps || props.length > 0 || opts.ref) args.push(typedPropsArgument); | |
if (opts.ref) { | |
const refArgument = t.identifier(opts.typescript ? 'svgRef?' : 'svgRef'); | |
const typedRefArgument = addTypeAnotation(refArgument, typeAnnotation(genericTypeAnnotation(qualifiedTypeIdentifier(t.identifier('React'), t.identifier('Ref')), typeParameters([opts.native ? genericTypeAnnotation(qualifiedTypeIdentifier(t.identifier('React'), t.identifier('Component')), typeParameters([genericTypeAnnotation(t.identifier('SvgProps'))])) : genericTypeAnnotation(t.identifier('SVGSVGElement'))]))), opts); | |
args.push(typedRefArgument); | |
} | |
return args; | |
}; | |
exports.getProps = getProps; | |
const getInterface = ({ | |
types: t | |
}, opts) => { | |
if (!opts.typescript) return null; | |
const properties = []; | |
if (opts.titleProp) { | |
properties.push(objectTypeProperty(t.identifier('title'), t.identifier('string'), true)); | |
properties.push(objectTypeProperty(t.identifier('titleId'), t.identifier('string'), true)); | |
} | |
if (properties.length === 0) return null; | |
return interfaceDeclaration(t.identifier('SVGRProps'), objectTypeAnnotation(properties)); | |
}; | |
exports.getInterface = getInterface; | |
const getImport = ({ | |
types: t | |
}, opts) => { | |
const importDeclarations = [t.importDeclaration([t.importNamespaceSpecifier(t.identifier('React'))], t.stringLiteral('react'))]; | |
if (opts.native) { | |
if (opts.native.expo) { | |
importDeclarations.push(t.importDeclaration([], t.stringLiteral('expo'))); | |
} else { | |
const imports = [t.importDefaultSpecifier(t.identifier('Svg'))]; | |
if (opts.typescript && opts.expandProps) { | |
imports.push(t.importSpecifier(t.identifier('SvgProps'), t.identifier('SvgProps'))); | |
} | |
importDeclarations.push(t.importDeclaration(imports, t.stringLiteral('react-native-svg'))); | |
} | |
} | |
return importDeclarations; | |
}; | |
exports.getImport = getImport; | |
const getExport = ({ | |
template | |
}, opts) => { | |
let result = ''; | |
let exportName = opts.state.componentName; | |
const plugins = ['jsx']; | |
if (opts.typescript) { | |
plugins.push('typescript'); | |
} | |
if (opts.ref) { | |
const nextExportName = `ForwardRef`; | |
result += `const ${nextExportName} = React.forwardRef(${exportName})\n\n`; | |
exportName = nextExportName; | |
} | |
if (opts.memo) { | |
const nextExportName = `Memo${exportName}`; | |
result += `const ${nextExportName} = React.memo(${exportName})\n\n`; | |
exportName = nextExportName; | |
} | |
if (opts.state.caller && opts.state.caller.previousExport) { | |
result += `${opts.state.caller.previousExport}\n`; | |
result += `export { ${exportName} as ${opts.namedExport} }`; | |
return template.ast(result, { | |
plugins | |
}); | |
} | |
result += `export default ${exportName}`; | |
return template.ast(result, { | |
plugins | |
}); | |
}; | |
exports.getExport = getExport; |