forked from facebook/react-native
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGenerateShadowNodeH.js
More file actions
98 lines (76 loc) · 2.52 KB
/
GenerateShadowNodeH.js
File metadata and controls
98 lines (76 loc) · 2.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict
* @format
*/
'use strict';
import type {PropTypeShape, SchemaType} from '../CodegenSchema';
// File path -> contents
type FilesOutput = Map<string, string>;
const template = `
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
::_IMPORTS_::#include <react/components/::_LIBRARY_::/Props.h>
#include <react/components/view/ConcreteViewShadowNode.h>
namespace facebook {
namespace react {
::_COMPONENT_CLASSES_::
} // namespace react
} // namespace facebook
`;
const componentTemplate = `
extern const char ::_CLASSNAME_::ComponentName[];
/*
* \`ShadowNode\` for <::_CLASSNAME_::> component.
*/
using ::_CLASSNAME_::ShadowNode = ConcreteViewShadowNode<
::_CLASSNAME_::ComponentName,
::_CLASSNAME_::Props::_EVENT_EMITTER_::>;
`.trim();
module.exports = {
generate(libraryName: string, schema: SchemaType): FilesOutput {
const fileName = 'ShadowNodes.h';
let hasAnyEvents = false;
const moduleResults = Object.keys(schema.modules)
.map(moduleName => {
const components = schema.modules[moduleName].components;
// No components in this module
if (components == null) {
return null;
}
return Object.keys(components)
.map(componentName => {
const component = components[componentName];
const hasEvents = component.events.length > 0;
if (hasEvents) {
hasAnyEvents = true;
}
const eventEmitter = hasEvents
? `,\n${componentName}EventEmitter`
: '';
const replacedTemplate = componentTemplate
.replace(/::_CLASSNAME_::/g, componentName)
.replace('::_EVENT_EMITTER_::', eventEmitter);
return replacedTemplate;
})
.join('\n\n');
})
.filter(Boolean)
.join('\n\n');
const eventEmitterImport = `#include <react/components/${libraryName}/EventEmitters.h>\n`;
const replacedTemplate = template
.replace(/::_COMPONENT_CLASSES_::/g, moduleResults)
.replace('::_LIBRARY_::', libraryName)
.replace('::_IMPORTS_::', hasAnyEvents ? eventEmitterImport : '');
return new Map([[fileName, replacedTemplate]]);
},
};