UNPKG

create-expo-cljs-app

Version:

Create a react native application with Expo and Shadow-CLJS!

98 lines (82 loc) 2.73 kB
/** * 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. * * * @format */ 'use strict'; // File path -> contents 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. * * ${'@'}generated by codegen project: GenerateShadowNodeH.js */ #pragma once ::_IMPORTS_::#include <react/renderer/components/::_LIBRARY_::/Props.h> #include <react/renderer/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, schema, moduleSpecName, packageName) { const fileName = 'ShadowNodes.h'; let hasAnyEvents = false; const moduleResults = Object.keys(schema.modules) .map(moduleName => { const module = schema.modules[moduleName]; if (module.type !== 'Component') { return; } const components = module.components; // No components in this module if (components == null) { return null; } return Object.keys(components) .map(componentName => { const component = components[componentName]; if (component.interfaceOnly === true) { return; } 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/renderer/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]]); }, };