UNPKG

2.29 kBJavaScriptView Raw
1import * as visitor from './react-native/block.js'
2import getStyleForProperty from './react-native/get-style-for-property.js'
3import getStyles from './react-native/get-styles.js'
4import getValueForProperty from './react-native/get-value-for-property.js'
5import maybeUsesTextInput from './react-native/maybe-uses-text-input.js'
6import maybeUsesRouter from './react-native/maybe-uses-router.js'
7import maybeUsesStyleSheet from './react-native/maybe-uses-style-sheet.js'
8import parse from '../parse/index.js'
9import restrictedNames from './react-native/restricted-names.js'
10import toComponent from './react/to-component.js'
11import walk from './walk.js'
12
13const imports = {
14 DismissKeyboard: `import dismissKeyboard from 'dismissKeyboard'`,
15 Link: "import { Link } from 'react-router-native'",
16 Route: "import { Route } from 'react-router-native'",
17 Router: "import { NativeRouter as Router } from 'react-router-native'",
18}
19
20export default ({ file, getImport, name, track = true, view }) => {
21 const finalName = restrictedNames.includes(name) ? `${name}1` : name
22 if (name !== finalName) {
23 console.warn(
24 `// "${name}" is a Views reserved name.
25 We've renamed it to "${finalName}", so your view should work but this isn't ideal.
26 To fix this, change its file name to something else.`
27 )
28 }
29
30 const state = {
31 captures: [],
32 defaultProps: false,
33 images: [],
34 getStyleForProperty,
35 getValueForProperty,
36 isReactNative: true,
37 name: finalName,
38 remap: {},
39 render: [],
40 styles: {},
41 svgs: [],
42 testIdKey: 'testID',
43 testIds: {},
44 track,
45 uses: [],
46 use(block) {
47 if (
48 state.uses.includes(block) ||
49 /props/.test(block) ||
50 block === finalName
51 )
52 return
53
54 state.uses.push(block)
55 },
56 withRouter: false,
57 }
58
59 const parsed = parse(view)
60 state.fonts = parsed.fonts
61
62 walk(parsed.views[0], visitor, state)
63
64 maybeUsesTextInput(state)
65 maybeUsesRouter(state)
66 maybeUsesStyleSheet(state)
67
68 const finalGetImport = name => imports[name] || getImport(name)
69
70 return {
71 code: toComponent({
72 getImport: finalGetImport,
73 getStyles,
74 name: finalName,
75 state,
76 }),
77 fonts: parsed.fonts,
78 props: parsed.props,
79 svgs: state.svgs,
80 }
81}