Skip to content

Commit 3e8c4de

Browse files
committed
refactor(codegen): extract buildModuleSchema to parsers-commons
1 parent 05454fa commit 3e8c4de

File tree

7 files changed

+192
-249
lines changed

7 files changed

+192
-249
lines changed

packages/eslint-plugin-specs/react-native-modules.js

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,17 @@ const ERRORS = {
2424
let RNModuleParser;
2525
let RNParserUtils;
2626
let RNFlowParser;
27+
let RNParserCommons;
28+
let RNFlowParserUtils;
2729

2830
function requireModuleParser() {
29-
if (RNModuleParser == null || RNParserUtils == null || RNFlowParser == null) {
31+
if (
32+
RNModuleParser == null ||
33+
RNParserUtils == null ||
34+
RNFlowParser == null ||
35+
RNParserCommons == null ||
36+
RNFlowParserUtils == null
37+
) {
3038
// If using this externally, we leverage @react-native/codegen as published form
3139
if (!PACKAGE_USAGE) {
3240
const config = {
@@ -38,6 +46,8 @@ function requireModuleParser() {
3846
RNModuleParser = require('@react-native/codegen/src/parsers/flow/modules');
3947
RNParserUtils = require('@react-native/codegen/src/parsers/utils');
4048
RNFlowParser = require('@react-native/codegen/src/parsers/flow/parser');
49+
RNParserCommons = require('@react-native/codegen/src/parsers/parsers-commons');
50+
RNFlowParserUtils = require('@react-native/codegen/src/parsers/flow/utils');
4151
});
4252
} else {
4353
const config = {
@@ -47,16 +57,20 @@ function requireModuleParser() {
4757

4858
withBabelRegister(config, () => {
4959
RNModuleParser = require('@react-native/codegen/lib/parsers/flow/modules');
50-
RNParserUtils = require('@react-native/codegen/lib/parsers/flow/utils');
60+
RNParserUtils = require('@react-native/codegen/lib/parsers/utils');
5161
RNFlowParser = require('@react-native/codegen/lib/parsers/flow/parser');
62+
RNParserCommons = require('@react-native/codegen/lib/parsers/parsers-commons');
63+
RNFlowParserUtils = require('@react-native/codegen/lib/parsers/flow/utils');
5264
});
5365
}
5466
}
5567

5668
return {
57-
buildModuleSchema: RNModuleParser.buildModuleSchema,
69+
buildModuleSchema: RNParserCommons.buildModuleSchema,
5870
createParserErrorCapturer: RNParserUtils.createParserErrorCapturer,
5971
parser: new RNFlowParser.FlowParser(),
72+
resolveTypeAnnotation: RNFlowParserUtils.resolveTypeAnnotation,
73+
translateTypeAnnotation: RNModuleParser.flowTranslateTypeAnnotation,
6074
};
6175
}
6276

@@ -131,16 +145,28 @@ function rule(context) {
131145
});
132146
}
133147

134-
const {buildModuleSchema, createParserErrorCapturer, parser} =
135-
requireModuleParser();
148+
const {
149+
buildModuleSchema,
150+
createParserErrorCapturer,
151+
parser,
152+
resolveTypeAnnotation,
153+
translateTypeAnnotation,
154+
} = requireModuleParser();
136155

137156
const [parsingErrors, tryParse] = createParserErrorCapturer();
138157

139158
const sourceCode = context.getSourceCode().getText();
140159
const ast = parser.getAst(sourceCode);
141160

142161
tryParse(() => {
143-
buildModuleSchema(hasteModuleName, ast, tryParse, parser);
162+
buildModuleSchema(
163+
hasteModuleName,
164+
ast,
165+
tryParse,
166+
parser,
167+
resolveTypeAnnotation,
168+
translateTypeAnnotation,
169+
);
144170
});
145171

146172
parsingErrors.forEach(error => {

packages/react-native-codegen/src/parsers/__tests__/parsers-commons-test.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import type {ParserType} from '../errors';
2626
const {Visitor} = require('../flow/Visitor');
2727
const {wrapComponentSchema} = require('../schema.js');
2828
const {buildComponentSchema} = require('../flow/components');
29-
const {buildModuleSchema} = require('../flow/modules');
29+
const {buildModuleSchema} = require('../parsers-commons.js');
3030
const {isModuleRegistryCall} = require('../utils.js');
3131
const {
3232
ParserError,
@@ -45,8 +45,9 @@ const parser = new MockedParser();
4545

4646
const flowParser = new FlowParser();
4747

48-
const flowTranslateTypeAnnotation = require('../flow/modules/index');
48+
const {flowTranslateTypeAnnotation} = require('../flow/modules/index');
4949
const typeScriptTranslateTypeAnnotation = require('../typescript/modules/index');
50+
const {resolveTypeAnnotation} = require('../flow/utils');
5051

5152
beforeEach(() => {
5253
jest.clearAllMocks();
@@ -396,7 +397,9 @@ describe('buildSchemaFromConfigType', () => {
396397
const buildComponentSchemaMock = jest.fn(
397398
(_ast, _parser) => componentSchemaMock,
398399
);
399-
const buildModuleSchemaMock = jest.fn((_0, _1, _2, _3) => moduleSchemaMock);
400+
const buildModuleSchemaMock = jest.fn(
401+
(_0, _1, _2, _3, _4, _5) => moduleSchemaMock,
402+
);
400403

401404
const buildSchemaFromConfigTypeHelper = (
402405
configType: 'module' | 'component' | 'none',
@@ -410,6 +413,8 @@ describe('buildSchemaFromConfigType', () => {
410413
buildComponentSchemaMock,
411414
buildModuleSchemaMock,
412415
parser,
416+
resolveTypeAnnotation,
417+
flowTranslateTypeAnnotation,
413418
);
414419

415420
describe('when configType is none', () => {
@@ -491,6 +496,8 @@ describe('buildSchemaFromConfigType', () => {
491496
astMock,
492497
expect.any(Function),
493498
parser,
499+
resolveTypeAnnotation,
500+
flowTranslateTypeAnnotation,
494501
);
495502

496503
expect(buildComponentSchemaMock).not.toHaveBeenCalled();
@@ -661,6 +668,8 @@ describe('buildSchema', () => {
661668
buildModuleSchema,
662669
Visitor,
663670
parser,
671+
resolveTypeAnnotation,
672+
flowTranslateTypeAnnotation,
664673
);
665674

666675
expect(getConfigTypeSpy).not.toHaveBeenCalled();
@@ -693,6 +702,8 @@ describe('buildSchema', () => {
693702
buildModuleSchema,
694703
Visitor,
695704
flowParser,
705+
resolveTypeAnnotation,
706+
flowTranslateTypeAnnotation,
696707
);
697708

698709
expect(getConfigTypeSpy).toHaveBeenCalledTimes(1);
@@ -746,6 +757,8 @@ describe('buildSchema', () => {
746757
buildModuleSchema,
747758
Visitor,
748759
flowParser,
760+
resolveTypeAnnotation,
761+
flowTranslateTypeAnnotation,
749762
);
750763

751764
expect(getConfigTypeSpy).toHaveBeenCalledTimes(1);

packages/react-native-codegen/src/parsers/flow/modules/index.js

Lines changed: 0 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,18 @@ import type {
1616
NativeModuleEnumMap,
1717
NativeModuleBaseTypeAnnotation,
1818
NativeModuleTypeAnnotation,
19-
NativeModulePropertyShape,
20-
NativeModuleSchema,
2119
Nullable,
2220
} from '../../../CodegenSchema';
2321

2422
import type {Parser} from '../../parser';
2523
import type {ParserErrorCapturer, TypeDeclarationMap} from '../../utils';
2624

27-
const {verifyPlatforms} = require('../../utils');
2825
const {resolveTypeAnnotation} = require('../utils');
2926
const {
3027
unwrapNullable,
3128
wrapNullable,
3229
assertGenericTypeAnnotationHasExactlyOneTypeParameter,
3330
parseObjectProperty,
34-
buildPropertySchema,
35-
parseModuleName,
3631
} = require('../../parsers-commons');
3732
const {
3833
emitArrayType,
@@ -61,9 +56,6 @@ const {
6156
} = require('../../errors');
6257

6358
const {
64-
throwIfModuleInterfaceNotFound,
65-
throwIfModuleInterfaceIsMisnamed,
66-
throwIfMoreThanOneModuleInterfaceParserError,
6759
throwIfPartialNotAnnotatingTypeParameter,
6860
throwIfPartialWithMoreParameter,
6961
} = require('../../error-utils');
@@ -325,111 +317,6 @@ function translateTypeAnnotation(
325317
}
326318
}
327319

328-
function buildModuleSchema(
329-
hasteModuleName: string,
330-
/**
331-
* TODO(T71778680): Flow-type this node.
332-
*/
333-
ast: $FlowFixMe,
334-
tryParse: ParserErrorCapturer,
335-
parser: Parser,
336-
): NativeModuleSchema {
337-
const types = parser.getTypes(ast);
338-
const moduleSpecs = (Object.values(types): $ReadOnlyArray<$FlowFixMe>).filter(
339-
t => parser.isModuleInterface(t),
340-
);
341-
342-
throwIfModuleInterfaceNotFound(
343-
moduleSpecs.length,
344-
hasteModuleName,
345-
ast,
346-
language,
347-
);
348-
349-
throwIfMoreThanOneModuleInterfaceParserError(
350-
hasteModuleName,
351-
moduleSpecs,
352-
language,
353-
);
354-
355-
const [moduleSpec] = moduleSpecs;
356-
357-
throwIfModuleInterfaceIsMisnamed(hasteModuleName, moduleSpec.id, language);
358-
359-
// Parse Module Name
360-
// Also checks and throws error if:
361-
// - Module Interface is Unused
362-
// - More than 1 Module Registry Calls
363-
// - Wrong number of Call Expression Args
364-
// - Module Registry Call Args are Incorrect
365-
// - Module is Untyped
366-
// - Module Registry Call Type Parameter is Icorrect
367-
const moduleName = parseModuleName(hasteModuleName, moduleSpec, ast, parser);
368-
369-
// Some module names use platform suffix to indicate platform-exclusive modules.
370-
// Eventually this should be made explicit in the Flow type itself.
371-
// Also check the hasteModuleName for platform suffix.
372-
// Note: this shape is consistent with ComponentSchema.
373-
const {cxxOnly, excludedPlatforms} = verifyPlatforms(
374-
hasteModuleName,
375-
moduleName,
376-
);
377-
378-
// $FlowFixMe[missing-type-arg]
379-
return (moduleSpec.body.properties: $ReadOnlyArray<$FlowFixMe>)
380-
.filter(property => property.type === 'ObjectTypeProperty')
381-
.map<?{
382-
aliasMap: NativeModuleAliasMap,
383-
enumMap: NativeModuleEnumMap,
384-
propertyShape: NativeModulePropertyShape,
385-
}>(property => {
386-
const aliasMap: {...NativeModuleAliasMap} = {};
387-
const enumMap: {...NativeModuleEnumMap} = {};
388-
return tryParse(() => ({
389-
aliasMap: aliasMap,
390-
enumMap: enumMap,
391-
propertyShape: buildPropertySchema(
392-
hasteModuleName,
393-
property,
394-
types,
395-
aliasMap,
396-
enumMap,
397-
tryParse,
398-
cxxOnly,
399-
resolveTypeAnnotation,
400-
translateTypeAnnotation,
401-
parser,
402-
),
403-
}));
404-
})
405-
.filter(Boolean)
406-
.reduce(
407-
(
408-
moduleSchema: NativeModuleSchema,
409-
{aliasMap, enumMap, propertyShape},
410-
) => ({
411-
type: 'NativeModule',
412-
aliasMap: {...moduleSchema.aliasMap, ...aliasMap},
413-
enumMap: {...moduleSchema.enumMap, ...enumMap},
414-
spec: {
415-
properties: [...moduleSchema.spec.properties, propertyShape],
416-
},
417-
moduleName: moduleSchema.moduleName,
418-
excludedPlatforms: moduleSchema.excludedPlatforms,
419-
}),
420-
{
421-
type: 'NativeModule',
422-
aliasMap: {},
423-
enumMap: {},
424-
spec: {properties: []},
425-
moduleName,
426-
excludedPlatforms:
427-
excludedPlatforms.length !== 0 ? [...excludedPlatforms] : undefined,
428-
},
429-
);
430-
}
431-
432320
module.exports = {
433-
buildModuleSchema,
434321
flowTranslateTypeAnnotation: translateTypeAnnotation,
435322
};

packages/react-native-codegen/src/parsers/flow/parser.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ const {buildSchema} = require('../parsers-commons');
3030
const {Visitor} = require('./Visitor');
3131
const {buildComponentSchema} = require('./components');
3232
const {wrapComponentSchema} = require('../schema.js');
33-
const {buildModuleSchema} = require('./modules');
33+
const {buildModuleSchema} = require('../parsers-commons.js');
34+
const {resolveTypeAnnotation} = require('./utils');
35+
const {flowTranslateTypeAnnotation} = require('./modules');
3436

3537
const fs = require('fs');
3638

@@ -101,6 +103,8 @@ class FlowParser implements Parser {
101103
buildModuleSchema,
102104
Visitor,
103105
this,
106+
resolveTypeAnnotation,
107+
flowTranslateTypeAnnotation,
104108
);
105109
}
106110

0 commit comments

Comments
 (0)