Files
react-native/codegen/src/generators/GenerateShadowNodeH.js
T
Eli White a3c6e1da10 Open source the Codegen!
Summary:
This is very much a work in progress. Moving it into the open source repo to be able to hook it up to generate some Fabric files.

Will continue to iterate on it in the open.

Reviewed By: hramos, mdvacca

Differential Revision: D13500969

fbshipit-source-id: 79082447dc52b5834f24eb72bc6e07200b324238
2018-12-20 11:58:11 -08:00

99 lines
2.5 KiB
JavaScript

/**
* 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]]);
},
};