Files
react-native/codegen/src/SchemaValidator.js
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

76 lines
1.7 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-local
* @format
*/
'use strict';
const nullthrows = require('nullthrows');
import type {SchemaType} from './CodegenSchema';
function getErrors(schema: SchemaType): $ReadOnlyArray<string> {
const errors = new Set();
// Map of component name -> Array of module names
const componentModules: Map<string, Array<string>> = new Map();
Object.keys(schema.modules).forEach(moduleName => {
const module = schema.modules[moduleName];
if (module.components == null) {
return;
}
Object.keys(module.components).forEach(componentName => {
if (module.components == null) {
return;
}
const component = module.components[componentName];
if (!componentModules.has(componentName)) {
componentModules.set(componentName, []);
}
nullthrows(componentModules.get(componentName)).push(moduleName);
if (component.props.length === 0) {
errors.add(
`${componentName} in module ${moduleName} must define props`,
);
}
});
});
componentModules.forEach((modules, componentName) => {
if (modules.length > 1) {
errors.add(
`Duplicate components found with name ${componentName}. Found in modules ${modules.join(
', ',
)}`,
);
}
});
return Array.from(errors).sort();
}
function validate(schema: SchemaType) {
const errors = getErrors(schema);
if (errors.length !== 0) {
throw new Error('Errors found validating schema:\n' + errors.join('\n'));
}
}
module.exports = {
getErrors,
validate,
};