@@ -9,6 +9,7 @@ function _interopDefault(ex) {
99var deindent = _interopDefault ( require ( "de-indent" ) ) ;
1010var he = require ( "he" ) ;
1111var changeCase = _interopDefault ( require ( "change-case" ) ) ;
12+ var _ = require ( 'lodash' ) ;
1213
1314/* */
1415
@@ -2001,6 +2002,7 @@ function processAttrs(el, options, customSlot = false) {
20012002 //
20022003 var renderer = new ReactNativeRenderGenerator ( el , options ) ;
20032004 let customRenderer = renderer . generateRender ( ) ;
2005+ let customImport = renderer . generateImport ( ) ;
20042006 customRenderer = customRenderer . replace ( / r e n d e r \( v m \) / , 'render (slotProps)' )
20052007
20062008 if ( name === 'render-prop' ) {
@@ -2022,6 +2024,15 @@ function processAttrs(el, options, customSlot = false) {
20222024 }
20232025 }
20242026 addAttr ( el . parent , value , `${ customRenderer } ` ) ;
2027+ let vueNativeCoreImport = customImport . split ( splitRE ) ;
2028+ if ( vueNativeCoreImport && vueNativeCoreImport [ 0 ] ) {
2029+ let imports = vueNativeCoreImport [ 0 ] ;
2030+ imports = imports . replace ( / i m p o r t \{ / g, '' )
2031+ imports = imports . replace ( / \} f r o m ' v u e - n a t i v e - h e l p e r ' / g, '' ) ;
2032+ return imports . split ( ',' ) . map ( function ( item ) {
2033+ return item . trim ( ) ;
2034+ } ) ;
2035+ }
20252036 } else {
20262037 addAttr ( el , name , JSON . stringify ( value ) ) ;
20272038 }
@@ -5320,12 +5331,25 @@ function nativeCompiler(template, options) {
53205331 template = template . trim ( ) ;
53215332 if ( template ) {
53225333 ast = parse ( template , options ) ;
5323- traverse ( ast , options ) ;
5334+ let importObj = { imports : [ ] } ;
5335+ traverse ( ast , options , importObj ) ;
5336+ let imports = importObj . imports ;
53245337 var renderer = new ReactNativeRenderGenerator ( ast , options ) ;
53255338 importCode = renderer . generateImport ( ) ;
53265339 renderCode = renderer . generateRender ( ) ;
53275340 // Remove extra commas
53285341 renderCode = renderCode . replace ( / \} , { 2 , } / g, "}" ) ;
5342+ // Add imports of the render props missing from main import
5343+ let requiredImports = [ ] ;
5344+ imports . forEach ( ( customImport ) => {
5345+ if ( importCode . indexOf ( customImport ) === - 1 ) {
5346+ requiredImports . push ( customImport )
5347+ }
5348+ } )
5349+ let requiredImportsString = requiredImports . join ( ',' )
5350+ if ( requiredImportsString ) {
5351+ importCode = importCode . replace ( / \} f r o m ' v u e - n a t i v e - h e l p e r ' / g, `, ${ requiredImportsString } } from 'vue-native-helper'` )
5352+ }
53295353 }
53305354 return {
53315355 ast : ast ,
@@ -5334,7 +5358,7 @@ function nativeCompiler(template, options) {
53345358 } ;
53355359}
53365360
5337- function traverse ( ast , options , parent = null , childIndex ) {
5361+ function traverse ( ast , options , importObj , parent = null , childIndex ) {
53385362 // Check for render-prop and render-prop-fn within child, if yes then add that as a prop
53395363 //
53405364 if ( ast . attrsMap && ( ast . attrsMap [ 'render-prop' ] || ast . attrsMap [ 'render-prop-fn' ] ) && ast . parent ) {
@@ -5343,15 +5367,17 @@ function traverse(ast, options, parent = null, childIndex) {
53435367 slotname &&
53445368 ast . parent
53455369 ) {
5346- processAttrs ( ast , options , true ) ;
5370+ // Get modules imported for slots
5371+ let importModules = processAttrs ( ast , options , true ) ;
5372+ importObj . imports = _ . union ( importObj . imports , importModules )
53475373 if ( parent ) {
53485374 delete parent . children [ childIndex ]
53495375 }
53505376 }
53515377 }
53525378 if ( ast . children ) {
53535379 ast . children . forEach ( ( child , index ) => {
5354- traverse ( child , options , ast , index ) ;
5380+ traverse ( child , options , importObj , ast , index ) ;
53555381 } ) ;
53565382 }
53575383}
0 commit comments