From 6de5740cee0d3c21e001f84ca15f906eda1efb33 Mon Sep 17 00:00:00 2001 From: MaeIg Date: Fri, 25 Nov 2022 21:51:57 +0100 Subject: [PATCH] refactor: move buildSchema into its own file At least I tried... There were still circular dependencies... (node:58076) Warning: Accessing non-existent property 'getTypes' of module exports inside circular dependency (node:58076) Warning: Accessing non-existent property 'getValueFromTypes' of module exports inside circular dependency (node:58076) Warning: Accessing non-existent property 'getValueFromTypes' of module exports inside circular dependency (node:58076) Warning: Accessing non-existent property 'buildModuleSchema' of module exports inside circular dependency --- .../src/parsers/flow/buildSchema.js | 78 ++++++++++++++++ .../src/parsers/flow/index.js | 2 +- .../src/parsers/flow/parser.js | 2 +- .../src/parsers/flow/utils.js | 63 ------------- .../src/parsers/typescript/buildSchema.js | 88 +++++++++++++++++++ .../src/parsers/typescript/index.js | 2 +- .../src/parsers/typescript/parser.js | 2 +- .../src/parsers/typescript/utils.js | 72 --------------- 8 files changed, 170 insertions(+), 139 deletions(-) create mode 100644 packages/react-native-codegen/src/parsers/flow/buildSchema.js create mode 100644 packages/react-native-codegen/src/parsers/typescript/buildSchema.js diff --git a/packages/react-native-codegen/src/parsers/flow/buildSchema.js b/packages/react-native-codegen/src/parsers/flow/buildSchema.js new file mode 100644 index 00000000000000..db8657da3725a7 --- /dev/null +++ b/packages/react-native-codegen/src/parsers/flow/buildSchema.js @@ -0,0 +1,78 @@ +/** + * Copyright (c) Meta Platforms, Inc. and 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 {SchemaType} from '../../CodegenSchema'; +import type {Parser} from '../parser'; + +// $FlowFixMe[untyped-import] there's no flowtype flow-parser +const flowParser = require('flow-parser'); +const { + getConfigType, + buildSchemaFromConfigType, + isModuleRegistryCall, +} = require('../utils'); +const {buildComponentSchema} = require('./components'); +const {wrapComponentSchema} = require('./components/schema'); +const {buildModuleSchema} = require('./modules'); + +function Visitor(infoMap: {isComponent: boolean, isModule: boolean}) { + return { + CallExpression(node: $FlowFixMe) { + if ( + node.callee.type === 'Identifier' && + node.callee.name === 'codegenNativeComponent' + ) { + infoMap.isComponent = true; + } + + if (isModuleRegistryCall(node)) { + infoMap.isModule = true; + } + }, + InterfaceExtends(node: $FlowFixMe) { + if (node.id.name === 'TurboModule') { + infoMap.isModule = true; + } + }, + }; +} + +function buildSchema( + contents: string, + filename: ?string, + parser: Parser, +): SchemaType { + // Early return for non-Spec JavaScript files + if ( + !contents.includes('codegenNativeComponent') && + !contents.includes('TurboModule') + ) { + return {modules: {}}; + } + + const ast = flowParser.parse(contents, {enums: true}); + const configType = getConfigType(ast, Visitor); + + return buildSchemaFromConfigType( + configType, + filename, + ast, + wrapComponentSchema, + buildComponentSchema, + buildModuleSchema, + parser, + ); +} + +module.exports = { + buildSchema, +}; diff --git a/packages/react-native-codegen/src/parsers/flow/index.js b/packages/react-native-codegen/src/parsers/flow/index.js index 60b3fb5ad575f3..9e2e66a6d99981 100644 --- a/packages/react-native-codegen/src/parsers/flow/index.js +++ b/packages/react-native-codegen/src/parsers/flow/index.js @@ -13,7 +13,7 @@ import type {SchemaType} from '../../CodegenSchema.js'; const fs = require('fs'); -const {buildSchema} = require('./utils'); +const {buildSchema} = require('./buildSchema'); const {FlowParser} = require('./parser'); const parser = new FlowParser(); diff --git a/packages/react-native-codegen/src/parsers/flow/parser.js b/packages/react-native-codegen/src/parsers/flow/parser.js index bdbce6508c5224..835ae8b111d30e 100644 --- a/packages/react-native-codegen/src/parsers/flow/parser.js +++ b/packages/react-native-codegen/src/parsers/flow/parser.js @@ -17,7 +17,7 @@ import type { import type {ParserType} from '../errors'; import type {Parser} from '../parser'; -const {buildSchema} = require('./utils'); +const {buildSchema} = require('./buildSchema'); const fs = require('fs'); diff --git a/packages/react-native-codegen/src/parsers/flow/utils.js b/packages/react-native-codegen/src/parsers/flow/utils.js index b32dfae104751a..f172d8ec4c8283 100644 --- a/packages/react-native-codegen/src/parsers/flow/utils.js +++ b/packages/react-native-codegen/src/parsers/flow/utils.js @@ -10,69 +10,7 @@ 'use strict'; -import type {SchemaType} from '../../CodegenSchema'; -import type {Parser} from '../parser'; import type {TypeAliasResolutionStatus, TypeDeclarationMap} from '../utils'; -const {buildComponentSchema} = require('./components'); -const {wrapComponentSchema} = require('./components/schema'); -const {buildModuleSchema} = require('./modules'); - -// $FlowFixMe[untyped-import] there's no flowtype flow-parser -const flowParser = require('flow-parser'); -const { - getConfigType, - buildSchemaFromConfigType, - isModuleRegistryCall, -} = require('../utils'); - -function Visitor(infoMap: {isComponent: boolean, isModule: boolean}) { - return { - CallExpression(node: $FlowFixMe) { - if ( - node.callee.type === 'Identifier' && - node.callee.name === 'codegenNativeComponent' - ) { - infoMap.isComponent = true; - } - - if (isModuleRegistryCall(node)) { - infoMap.isModule = true; - } - }, - InterfaceExtends(node: $FlowFixMe) { - if (node.id.name === 'TurboModule') { - infoMap.isModule = true; - } - }, - }; -} - -function buildSchema( - contents: string, - filename: ?string, - parser: Parser, -): SchemaType { - // Early return for non-Spec JavaScript files - if ( - !contents.includes('codegenNativeComponent') && - !contents.includes('TurboModule') - ) { - return {modules: {}}; - } - - const ast = flowParser.parse(contents, {enums: true}); - const configType = getConfigType(ast, Visitor); - - return buildSchemaFromConfigType( - configType, - filename, - ast, - wrapComponentSchema, - buildComponentSchema, - buildModuleSchema, - parser, - ); -} /** * This FlowFixMe is supposed to refer to an InterfaceDeclaration or TypeAlias @@ -179,7 +117,6 @@ function getValueFromTypes(value: ASTNode, types: TypeDeclarationMap): ASTNode { } module.exports = { - buildSchema, getValueFromTypes, resolveTypeAnnotation, getTypes, diff --git a/packages/react-native-codegen/src/parsers/typescript/buildSchema.js b/packages/react-native-codegen/src/parsers/typescript/buildSchema.js new file mode 100644 index 00000000000000..c3b56c3e535e77 --- /dev/null +++ b/packages/react-native-codegen/src/parsers/typescript/buildSchema.js @@ -0,0 +1,88 @@ +/** + * Copyright (c) Meta Platforms, Inc. and 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 {SchemaType} from '../../CodegenSchema'; +import type {Parser} from '../parser'; + +// $FlowFixMe[untyped-import] Use flow-types for @babel/parser +const babelParser = require('@babel/parser'); +const { + buildSchemaFromConfigType, + getConfigType, + isModuleRegistryCall, +} = require('../utils'); +const {buildComponentSchema} = require('./components'); +const {wrapComponentSchema} = require('./components/schema'); +const {buildModuleSchema} = require('./modules'); + +function Visitor(infoMap: {isComponent: boolean, isModule: boolean}) { + return { + CallExpression(node: $FlowFixMe) { + if ( + node.callee.type === 'Identifier' && + node.callee.name === 'codegenNativeComponent' + ) { + infoMap.isComponent = true; + } + + if (isModuleRegistryCall(node)) { + infoMap.isModule = true; + } + }, + + TSInterfaceDeclaration(node: $FlowFixMe) { + if ( + Array.isArray(node.extends) && + node.extends.some( + extension => extension.expression.name === 'TurboModule', + ) + ) { + infoMap.isModule = true; + } + }, + }; +} + +function buildSchema( + contents: string, + filename: ?string, + parser: Parser, +): SchemaType { + // Early return for non-Spec JavaScript files + if ( + !contents.includes('codegenNativeComponent') && + !contents.includes('TurboModule') + ) { + return {modules: {}}; + } + + const ast = babelParser.parse(contents, { + sourceType: 'module', + plugins: ['typescript'], + }).program; + + const configType = getConfigType(ast, Visitor); + + return buildSchemaFromConfigType( + configType, + filename, + ast, + wrapComponentSchema, + buildComponentSchema, + buildModuleSchema, + parser, + ); +} + +module.exports = { + buildSchema, +}; diff --git a/packages/react-native-codegen/src/parsers/typescript/index.js b/packages/react-native-codegen/src/parsers/typescript/index.js index 194d132e98bb99..d790980331c75a 100644 --- a/packages/react-native-codegen/src/parsers/typescript/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/index.js @@ -13,7 +13,7 @@ import type {SchemaType} from '../../CodegenSchema.js'; const fs = require('fs'); -const {buildSchema} = require('./utils'); +const {buildSchema} = require('./buildSchema'); const {TypeScriptParser} = require('./parser'); const parser = new TypeScriptParser(); diff --git a/packages/react-native-codegen/src/parsers/typescript/parser.js b/packages/react-native-codegen/src/parsers/typescript/parser.js index 2ac74e968fa35d..0c077093ba0e1d 100644 --- a/packages/react-native-codegen/src/parsers/typescript/parser.js +++ b/packages/react-native-codegen/src/parsers/typescript/parser.js @@ -17,7 +17,7 @@ import type { import type {ParserType} from '../errors'; import type {Parser} from '../parser'; -const {buildSchema} = require('./utils'); +const {buildSchema} = require('./buildSchema'); const fs = require('fs'); diff --git a/packages/react-native-codegen/src/parsers/typescript/utils.js b/packages/react-native-codegen/src/parsers/typescript/utils.js index 1283afa1925487..83e2f8bd2def75 100644 --- a/packages/react-native-codegen/src/parsers/typescript/utils.js +++ b/packages/react-native-codegen/src/parsers/typescript/utils.js @@ -11,79 +11,8 @@ 'use strict'; import type {TypeAliasResolutionStatus, TypeDeclarationMap} from '../utils'; -import type {Parser} from '../parser'; -// $FlowFixMe[untyped-import] Use flow-types for @babel/parser -const babelParser = require('@babel/parser'); -const { - buildSchemaFromConfigType, - getConfigType, - isModuleRegistryCall, -} = require('../utils'); -const {buildComponentSchema} = require('./components'); -const {wrapComponentSchema} = require('./components/schema'); -const {buildModuleSchema} = require('./modules'); const {parseTopLevelType} = require('./parseTopLevelType'); -import type {SchemaType} from '../../CodegenSchema'; - -function Visitor(infoMap: {isComponent: boolean, isModule: boolean}) { - return { - CallExpression(node: $FlowFixMe) { - if ( - node.callee.type === 'Identifier' && - node.callee.name === 'codegenNativeComponent' - ) { - infoMap.isComponent = true; - } - - if (isModuleRegistryCall(node)) { - infoMap.isModule = true; - } - }, - - TSInterfaceDeclaration(node: $FlowFixMe) { - if ( - Array.isArray(node.extends) && - node.extends.some( - extension => extension.expression.name === 'TurboModule', - ) - ) { - infoMap.isModule = true; - } - }, - }; -} - -function buildSchema( - contents: string, - filename: ?string, - parser: Parser, -): SchemaType { - // Early return for non-Spec JavaScript files - if ( - !contents.includes('codegenNativeComponent') && - !contents.includes('TurboModule') - ) { - return {modules: {}}; - } - - const ast = babelParser.parse(contents, { - sourceType: 'module', - plugins: ['typescript'], - }).program; - - const configType = getConfigType(ast, Visitor); - - return buildSchemaFromConfigType( - configType, - filename, - ast, - wrapComponentSchema, - buildComponentSchema, - buildModuleSchema, - parser, - ); -} /** * TODO(T108222691): Use flow-types for @babel/parser @@ -180,7 +109,6 @@ function resolveTypeAnnotation( } module.exports = { - buildSchema, resolveTypeAnnotation, getTypes, };