From c9d9f8cc2a15168a6705ea71ec389d8fa32747ca Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Thu, 16 May 2019 10:45:54 -0700 Subject: [PATCH] Add js1 build viewconfigs Summary: This diff adds a new `js1` script `js1 build viewconfigs` which will generate the view configs for generated components in xplat/js Note that the view configs are not currently valid so I'm not checking them in or adding them to a test, that work will follow Reviewed By: TheSavior Differential Revision: D15239656 fbshipit-source-id: d15776f36a7d7684f50beafd783bccb02352afc0 --- .../buck_tests/combine-js-to-schema.js | 11 +---- .../buck_tests/generate-tests.js | 9 ++-- .../buck_tests/generate-view-configs-cli.js | 18 +++++++ .../buck_tests/generate-view-configs.js | 34 +++++++++++++ .../buck_tests/generate-view-configs.sh | 15 ++++++ .../src/generators/GenerateViewConfigJs.js | 2 +- .../src/generators/RNCodegen.js | 49 ++++++++++++++----- .../src/generators/RNParser.js | 26 ++++++++++ .../GenerateViewConfigJs-test.js.snap | 30 ++++++------ 9 files changed, 151 insertions(+), 43 deletions(-) create mode 100644 packages/react-native-codegen/buck_tests/generate-view-configs-cli.js create mode 100644 packages/react-native-codegen/buck_tests/generate-view-configs.js create mode 100755 packages/react-native-codegen/buck_tests/generate-view-configs.sh create mode 100644 packages/react-native-codegen/src/generators/RNParser.js diff --git a/packages/react-native-codegen/buck_tests/combine-js-to-schema.js b/packages/react-native-codegen/buck_tests/combine-js-to-schema.js index 2b48486ef9e..5855fd520de 100644 --- a/packages/react-native-codegen/buck_tests/combine-js-to-schema.js +++ b/packages/react-native-codegen/buck_tests/combine-js-to-schema.js @@ -11,19 +11,12 @@ 'use strict'; import type {SchemaType} from '../src/CodegenSchema.js'; -function parse(filename: string): ?SchemaType { - try { - // $FlowFixMe Can't require dynamic variables - return require(filename); - } catch (err) { - // ignore - } -} +const RNParser = require('../src/generators/RNParser.js'); function combineSchemas(files: Array): SchemaType { return files.reduce( (merged, filename) => { - const schema = parse(filename); + const schema = RNParser.parse(filename); if (schema && schema.modules) { merged.modules = {...merged.modules, ...schema.modules}; } diff --git a/packages/react-native-codegen/buck_tests/generate-tests.js b/packages/react-native-codegen/buck_tests/generate-tests.js index 4e09af92cb3..99af8d1c762 100644 --- a/packages/react-native-codegen/buck_tests/generate-tests.js +++ b/packages/react-native-codegen/buck_tests/generate-tests.js @@ -42,8 +42,7 @@ try { throw new Error(`Can't parse schema to JSON. ${schemaPath}`); } -RNCodegen.generate({ - libraryName, - schema, - outputDirectory, -}); +RNCodegen.generate( + {libraryName, schema, outputDirectory}, + {generators: ['descriptors', 'events', 'props', 'tests', 'shadow-nodes']}, +); diff --git a/packages/react-native-codegen/buck_tests/generate-view-configs-cli.js b/packages/react-native-codegen/buck_tests/generate-view-configs-cli.js new file mode 100644 index 00000000000..05c85a14ea6 --- /dev/null +++ b/packages/react-native-codegen/buck_tests/generate-view-configs-cli.js @@ -0,0 +1,18 @@ +/** + * 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. + * + * @emails oncall+react_native + * @flow + * @format + */ + +'use strict'; + +const generate = require('./generate-view-configs'); + +const [fileList] = process.argv.slice(2); + +generate(fileList.split('\n')); diff --git a/packages/react-native-codegen/buck_tests/generate-view-configs.js b/packages/react-native-codegen/buck_tests/generate-view-configs.js new file mode 100644 index 00000000000..fe67e0d38f2 --- /dev/null +++ b/packages/react-native-codegen/buck_tests/generate-view-configs.js @@ -0,0 +1,34 @@ +/** + * 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 + * @format + */ + +'use strict'; + +const RNCodegen = require('../src/generators/RNCodegen.js'); +const RNParser = require('../src/generators/RNParser.js'); + +const path = require('path'); + +function generate(files: Array): void { + files.forEach(filename => { + const schema = RNParser.parse(filename); + if (schema && schema.modules) { + RNCodegen.generate( + { + schema, + outputDirectory: path.dirname(filename), + libraryName: path.basename(filename).replace('Schema.js', ''), + }, + {generators: ['view-configs']}, + ); + } + }); +} + +module.exports = generate; diff --git a/packages/react-native-codegen/buck_tests/generate-view-configs.sh b/packages/react-native-codegen/buck_tests/generate-view-configs.sh new file mode 100755 index 00000000000..7b0809f5926 --- /dev/null +++ b/packages/react-native-codegen/buck_tests/generate-view-configs.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# set -euo pipefail + +set -e +set -u + +THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd) + +FILES=$(find "$JS_DIR/" -name "*Schema.js" -print -type f) + +# shellcheck source=xplat/js/env-utils/setup_env_vars.sh +source "$THIS_DIR/../../../../env-utils/setup_env_vars.sh" + +exec "$FLOW_NODE_BINARY" "$THIS_DIR/generate-view-configs-cli.js" "$@" "$FILES" diff --git a/packages/react-native-codegen/src/generators/GenerateViewConfigJs.js b/packages/react-native-codegen/src/generators/GenerateViewConfigJs.js index 071c21cee47..739a8966bc7 100644 --- a/packages/react-native-codegen/src/generators/GenerateViewConfigJs.js +++ b/packages/react-native-codegen/src/generators/GenerateViewConfigJs.js @@ -198,7 +198,7 @@ function buildViewConfig( module.exports = { generate(libraryName: string, schema: SchemaType): FilesOutput { - const fileName = 'ViewConfigs.js'; + const fileName = `${libraryName}NativeViewConfig.js`; const imports: Set = new Set(); imports.add( diff --git a/packages/react-native-codegen/src/generators/RNCodegen.js b/packages/react-native-codegen/src/generators/RNCodegen.js index b1cd1953070..cfa70c33b19 100644 --- a/packages/react-native-codegen/src/generators/RNCodegen.js +++ b/packages/react-native-codegen/src/generators/RNCodegen.js @@ -37,6 +37,30 @@ type Options = $ReadOnly<{| outputDirectory: string, |}>; +type Generators = + | 'descriptors' + | 'events' + | 'props' + | 'tests' + | 'shadow-nodes' + | 'view-configs'; + +type Config = $ReadOnly<{| + generators: Array, +|}>; + +const GENERATORS = { + descriptors: [generateComponentDescriptorH.generate], + events: [generateEventEmitterCpp.generate, generateEventEmitterH.generate], + props: [generatePropsCpp.generate, generatePropsH.generate], + tests: [generateTests.generate], + 'shadow-nodes': [ + generateShadowNodeCpp.generate, + generateShadowNodeH.generate, + ], + 'view-configs': [generateViewConfigJs.generate], +}; + function writeMapToFiles(map: Map, outputDirectory: string) { map.forEach((contents: string, fileName: string) => { const location = path.join(outputDirectory, fileName); @@ -45,20 +69,19 @@ function writeMapToFiles(map: Map, outputDirectory: string) { } module.exports = { - generate({libraryName, schema, outputDirectory}: Options) { + generate( + {libraryName, schema, outputDirectory}: Options, + {generators}: Config, + ) { schemaValidator.validate(schema); - const generatedFiles: Map = new Map([ - ...generateComponentDescriptorH.generate(libraryName, schema), - ...generateEventEmitterCpp.generate(libraryName, schema), - ...generateEventEmitterH.generate(libraryName, schema), - ...generatePropsCpp.generate(libraryName, schema), - ...generatePropsH.generate(libraryName, schema), - ...generateTests.generate(libraryName, schema), - ...generateShadowNodeCpp.generate(libraryName, schema), - ...generateShadowNodeH.generate(libraryName, schema), - ...generateViewConfigJs.generate(libraryName, schema), - ]); - writeMapToFiles(generatedFiles, outputDirectory); + const generatedFiles = []; + for (const name of generators) { + for (const generator of GENERATORS[name]) { + generatedFiles.push(...generator(libraryName, schema)); + } + } + + writeMapToFiles(new Map([...generatedFiles]), outputDirectory); }, }; diff --git a/packages/react-native-codegen/src/generators/RNParser.js b/packages/react-native-codegen/src/generators/RNParser.js new file mode 100644 index 00000000000..7d8cef5be3f --- /dev/null +++ b/packages/react-native-codegen/src/generators/RNParser.js @@ -0,0 +1,26 @@ +/** + * 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-local + * @format + */ + +'use strict'; + +import type {SchemaType} from '../CodegenSchema.js'; + +function parse(filename: string): ?SchemaType { + try { + // $FlowFixMe Can't require dynamic variables + return require(filename); + } catch (err) { + // Ignore + } +} + +module.exports = { + parse, +}; diff --git a/packages/react-native-codegen/src/generators/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap b/packages/react-native-codegen/src/generators/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap index da4bebc2e70..36045bc6df7 100644 --- a/packages/react-native-codegen/src/generators/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap +++ b/packages/react-native-codegen/src/generators/__tests__/__snapshots__/GenerateViewConfigJs-test.js.snap @@ -2,7 +2,7 @@ exports[`GenerateViewConfigJs can generate fixture ARRAY_PROPS 1`] = ` Map { - "ViewConfigs.js" => " + "ARRAY_PROPSNativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. * @@ -43,7 +43,7 @@ ReactNativeViewConfigRegistry.register( exports[`GenerateViewConfigJs can generate fixture BOOLEAN_PROP 1`] = ` Map { - "ViewConfigs.js" => " + "BOOLEAN_PROPNativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. * @@ -78,7 +78,7 @@ ReactNativeViewConfigRegistry.register( exports[`GenerateViewConfigJs can generate fixture COLOR_PROP 1`] = ` Map { - "ViewConfigs.js" => " + "COLOR_PROPNativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. * @@ -113,7 +113,7 @@ ReactNativeViewConfigRegistry.register( exports[`GenerateViewConfigJs can generate fixture ENUM_PROP 1`] = ` Map { - "ViewConfigs.js" => " + "ENUM_PROPNativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. * @@ -148,7 +148,7 @@ ReactNativeViewConfigRegistry.register( exports[`GenerateViewConfigJs can generate fixture EVENT_NESTED_OBJECT_PROPS 1`] = ` Map { - "ViewConfigs.js" => " + "EVENT_NESTED_OBJECT_PROPSNativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. * @@ -192,7 +192,7 @@ ReactNativeViewConfigRegistry.register( exports[`GenerateViewConfigJs can generate fixture EVENT_PROPS 1`] = ` Map { - "ViewConfigs.js" => " + "EVENT_PROPSNativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. * @@ -242,7 +242,7 @@ ReactNativeViewConfigRegistry.register( exports[`GenerateViewConfigJs can generate fixture FLOAT_PROPS 1`] = ` Map { - "ViewConfigs.js" => " + "FLOAT_PROPSNativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. * @@ -282,7 +282,7 @@ ReactNativeViewConfigRegistry.register( exports[`GenerateViewConfigJs can generate fixture IMAGE_PROP 1`] = ` Map { - "ViewConfigs.js" => " + "IMAGE_PROPNativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. * @@ -317,7 +317,7 @@ ReactNativeViewConfigRegistry.register( exports[`GenerateViewConfigJs can generate fixture INTEGER_PROPS 1`] = ` Map { - "ViewConfigs.js" => " + "INTEGER_PROPSNativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. * @@ -354,7 +354,7 @@ ReactNativeViewConfigRegistry.register( exports[`GenerateViewConfigJs can generate fixture INTERFACE_ONLY 1`] = ` Map { - "ViewConfigs.js" => " + "INTERFACE_ONLYNativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. * @@ -398,7 +398,7 @@ ReactNativeViewConfigRegistry.register( exports[`GenerateViewConfigJs can generate fixture MULTI_NATIVE_PROP 1`] = ` Map { - "ViewConfigs.js" => " + "MULTI_NATIVE_PROPNativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. * @@ -436,7 +436,7 @@ ReactNativeViewConfigRegistry.register( exports[`GenerateViewConfigJs can generate fixture POINT_PROP 1`] = ` Map { - "ViewConfigs.js" => " + "POINT_PROPNativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. * @@ -471,7 +471,7 @@ ReactNativeViewConfigRegistry.register( exports[`GenerateViewConfigJs can generate fixture STRING_PROP 1`] = ` Map { - "ViewConfigs.js" => " + "STRING_PROPNativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. * @@ -506,7 +506,7 @@ ReactNativeViewConfigRegistry.register( exports[`GenerateViewConfigJs can generate fixture TWO_COMPONENTS_DIFFERENT_FILES 1`] = ` Map { - "ViewConfigs.js" => " + "TWO_COMPONENTS_DIFFERENT_FILESNativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. * @@ -555,7 +555,7 @@ ReactNativeViewConfigRegistry.register( exports[`GenerateViewConfigJs can generate fixture TWO_COMPONENTS_SAME_FILE 1`] = ` Map { - "ViewConfigs.js" => " + "TWO_COMPONENTS_SAME_FILENativeViewConfig.js" => " /** * Copyright (c) Facebook, Inc. and its affiliates. *