Skip to content

Commit d1e03f5

Browse files
dmytrorykunfacebook-github-bot
authored andcommitted
Refactor generate-artifacts-executor.js: return libraries array instead of using an inout argument (#41531)
Summary: Pull Request resolved: #41531 This diff converts in-out `libraries` argument of codegen library lookup functions to a normal return value. This makes these functions simpler to reason about, and simplifies subsequent refactors. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D51111416 fbshipit-source-id: 12b5dda4d326e3f1c866c16f7bcd17080be54b58
1 parent a1b67f9 commit d1e03f5

File tree

2 files changed

+80
-112
lines changed

2 files changed

+80
-112
lines changed

packages/react-native/scripts/codegen/__tests__/generate-artifacts-executor-test.js

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -83,24 +83,16 @@ describe('generateCode', () => {
8383

8484
describe('extractLibrariesFromJSON', () => {
8585
it('throws if in react-native and no dependencies found', () => {
86-
let libraries = [];
8786
let configFile = {};
8887
expect(() => {
89-
underTest._extractLibrariesFromJSON(
90-
configFile,
91-
libraries,
92-
codegenConfigKey,
93-
);
88+
underTest._extractLibrariesFromJSON(configFile, codegenConfigKey);
9489
}).toThrow();
9590
});
9691

9792
it('it skips if not into react-native and no dependencies found', () => {
98-
let libraries = [];
9993
let configFile = {};
100-
101-
underTest._extractLibrariesFromJSON(
94+
let libraries = underTest._extractLibrariesFromJSON(
10295
configFile,
103-
libraries,
10496
codegenConfigKey,
10597
'some-node-module',
10698
'node_modules/some',
@@ -109,11 +101,9 @@ describe('extractLibrariesFromJSON', () => {
109101
});
110102

111103
it('extracts a single dependency when config has no libraries', () => {
112-
let libraries = [];
113104
let configFile = fixtures.noLibrariesConfigFile;
114-
underTest._extractLibrariesFromJSON(
105+
let libraries = underTest._extractLibrariesFromJSON(
115106
configFile,
116-
libraries,
117107
codegenConfigKey,
118108
'my-app',
119109
'.',
@@ -131,11 +121,9 @@ describe('extractLibrariesFromJSON', () => {
131121

132122
it("extract codegenConfig when it's empty", () => {
133123
const configFile = {codegenConfig: {libraries: []}};
134-
let libraries = [];
135-
underTest._extractLibrariesFromJSON(
124+
let libraries = underTest._extractLibrariesFromJSON(
136125
configFile,
137126
codegenConfigKey,
138-
libraries,
139127
reactNativeDependencyName,
140128
rootPath,
141129
);
@@ -144,10 +132,8 @@ describe('extractLibrariesFromJSON', () => {
144132

145133
it('extract codegenConfig when dependency is one', () => {
146134
const configFile = fixtures.singleLibraryCodegenConfig;
147-
let libraries = [];
148-
underTest._extractLibrariesFromJSON(
135+
let libraries = underTest._extractLibrariesFromJSON(
149136
configFile,
150-
libraries,
151137
codegenConfigKey,
152138
reactNativeDependencyName,
153139
rootPath,
@@ -167,10 +153,8 @@ describe('extractLibrariesFromJSON', () => {
167153
const configFile = fixtures.multipleLibrariesCodegenConfig;
168154
const myDependency = 'my-dependency';
169155
const myDependencyPath = path.join(__dirname, myDependency);
170-
let libraries = [];
171-
underTest._extractLibrariesFromJSON(
156+
let libraries = underTest._extractLibrariesFromJSON(
172157
configFile,
173-
libraries,
174158
codegenConfigKey,
175159
myDependency,
176160
myDependencyPath,

packages/react-native/scripts/codegen/generate-artifacts-executor.js

Lines changed: 74 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -104,21 +104,18 @@ function printDeprecationWarningIfNeeded(dependency) {
104104
function extractLibrariesFromConfigurationArray(
105105
configFile,
106106
codegenConfigKey,
107-
libraries,
108107
dependencyPath,
109108
) {
110-
configFile[codegenConfigKey].libraries.forEach(config => {
111-
const libraryConfig = {
109+
return configFile[codegenConfigKey].libraries.map(config => {
110+
return {
112111
config,
113112
libraryPath: dependencyPath,
114113
};
115-
libraries.push(libraryConfig);
116114
});
117115
}
118116

119117
function extractLibrariesFromJSON(
120118
configFile,
121-
libraries,
122119
codegenConfigKey,
123120
dependency,
124121
dependencyPath,
@@ -136,29 +133,29 @@ function extractLibrariesFromJSON(
136133
if (isBlocking) {
137134
throw `[Codegen] Error: Could not find codegen config for ${dependency} .`;
138135
}
139-
return;
136+
return [];
140137
}
141138

142139
console.log(`[Codegen] Found ${dependency}`);
143140
if (configFile[codegenConfigKey].libraries == null) {
144141
var config = configFile[codegenConfigKey];
145-
libraries.push({
146-
config,
147-
libraryPath: dependencyPath,
148-
});
142+
return [
143+
{
144+
config,
145+
libraryPath: dependencyPath,
146+
},
147+
];
149148
} else {
150149
printDeprecationWarningIfNeeded(dependency);
151-
extractLibrariesFromConfigurationArray(
150+
return extractLibrariesFromConfigurationArray(
152151
configFile,
153152
codegenConfigKey,
154-
libraries,
155153
dependencyPath,
156154
);
157155
}
158156
}
159157

160158
function handleReactNativeCoreLibraries(
161-
libraries,
162159
codegenConfigFilename,
163160
codegenConfigKey,
164161
) {
@@ -173,11 +170,10 @@ function handleReactNativeCoreLibraries(
173170
throw '[Codegen] Error: Could not find config file for react-native.';
174171
}
175172
const reactNativeConfigFile = JSON.parse(fs.readFileSync(reactNativePkgJson));
176-
extractLibrariesFromJSON(reactNativeConfigFile, libraries, codegenConfigKey);
173+
return extractLibrariesFromJSON(reactNativeConfigFile, codegenConfigKey);
177174
}
178175

179176
function handleThirdPartyLibraries(
180-
libraries,
181177
baseCodegenConfigFileDir,
182178
dependencies,
183179
codegenConfigFilename,
@@ -192,31 +188,30 @@ function handleThirdPartyLibraries(
192188
);
193189

194190
// Handle third-party libraries
195-
Object.keys(dependencies).forEach(dependency => {
191+
return Object.keys(dependencies).flatMap(dependency => {
196192
if (dependency === REACT_NATIVE_DEPENDENCY_NAME) {
197193
// react-native should already be added.
198-
return;
194+
return [];
199195
}
200196
const codegenConfigFileDir = path.join(configDir, dependency);
201197
const configFilePath = path.join(
202198
codegenConfigFileDir,
203199
codegenConfigFilename,
204200
);
205-
if (fs.existsSync(configFilePath)) {
206-
const configFile = JSON.parse(fs.readFileSync(configFilePath));
207-
extractLibrariesFromJSON(
208-
configFile,
209-
libraries,
210-
codegenConfigKey,
211-
dependency,
212-
codegenConfigFileDir,
213-
);
201+
if (!fs.existsSync(configFilePath)) {
202+
return [];
214203
}
204+
const configFile = JSON.parse(fs.readFileSync(configFilePath));
205+
return extractLibrariesFromJSON(
206+
configFile,
207+
codegenConfigKey,
208+
dependency,
209+
codegenConfigFileDir,
210+
);
215211
});
216212
}
217213

218214
function handleLibrariesFromReactNativeConfig(
219-
libraries,
220215
codegenConfigKey,
221216
codegenConfigFilename,
222217
appRootDir,
@@ -229,54 +224,51 @@ function handleLibrariesFromReactNativeConfig(
229224

230225
const rnConfigFilePath = path.resolve(appRootDir, rnConfigFileName);
231226

232-
if (fs.existsSync(rnConfigFilePath)) {
233-
const rnConfig = require(rnConfigFilePath);
234-
235-
if (rnConfig.dependencies != null) {
236-
Object.keys(rnConfig.dependencies).forEach(name => {
237-
const dependencyConfig = rnConfig.dependencies[name];
238-
239-
if (dependencyConfig.root) {
240-
const codegenConfigFileDir = path.resolve(
241-
appRootDir,
242-
dependencyConfig.root,
243-
);
244-
const configFilePath = path.join(
245-
codegenConfigFileDir,
246-
codegenConfigFilename,
247-
);
248-
const pkgJsonPath = path.join(codegenConfigFileDir, 'package.json');
249-
250-
if (fs.existsSync(configFilePath)) {
251-
const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath));
252-
const configFile = JSON.parse(fs.readFileSync(configFilePath));
253-
extractLibrariesFromJSON(
254-
configFile,
255-
libraries,
256-
codegenConfigKey,
257-
pkgJson.name,
258-
codegenConfigFileDir,
259-
);
260-
}
261-
}
262-
});
263-
}
227+
if (!fs.existsSync(rnConfigFilePath)) {
228+
return [];
264229
}
230+
const rnConfig = require(rnConfigFilePath);
231+
232+
if (rnConfig.dependencies == null) {
233+
return [];
234+
}
235+
return Object.keys(rnConfig.dependencies).flatMap(name => {
236+
const dependencyConfig = rnConfig.dependencies[name];
237+
238+
if (!dependencyConfig.root) {
239+
return [];
240+
}
241+
const codegenConfigFileDir = path.resolve(
242+
appRootDir,
243+
dependencyConfig.root,
244+
);
245+
const configFilePath = path.join(
246+
codegenConfigFileDir,
247+
codegenConfigFilename,
248+
);
249+
if (!fs.existsSync(configFilePath)) {
250+
return [];
251+
}
252+
const pkgJsonPath = path.join(codegenConfigFileDir, 'package.json');
253+
const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath));
254+
const configFile = JSON.parse(fs.readFileSync(configFilePath));
255+
256+
return extractLibrariesFromJSON(
257+
configFile,
258+
codegenConfigKey,
259+
pkgJson.name,
260+
codegenConfigFileDir,
261+
);
262+
});
265263
}
266264

267-
function handleInAppLibraries(
268-
libraries,
269-
pkgJson,
270-
codegenConfigKey,
271-
appRootDir,
272-
) {
265+
function handleInAppLibraries(pkgJson, codegenConfigKey, appRootDir) {
273266
console.log(
274267
'\n\n[Codegen] >>>>> Searching for codegen-enabled libraries in the app',
275268
);
276269

277-
extractLibrariesFromJSON(
270+
return extractLibrariesFromJSON(
278271
pkgJson,
279-
libraries,
280272
codegenConfigKey,
281273
pkgJson.name,
282274
appRootDir,
@@ -433,29 +425,21 @@ function findCodegenEnabledLibraries(
433425
) {
434426
const pkgJson = readPackageJSON(appRootDir);
435427
const dependencies = {...pkgJson.dependencies, ...pkgJson.devDependencies};
436-
const libraries = [];
437-
438-
handleReactNativeCoreLibraries(
439-
libraries,
440-
codegenConfigFilename,
441-
codegenConfigKey,
442-
);
443-
handleThirdPartyLibraries(
444-
libraries,
445-
baseCodegenConfigFileDir,
446-
dependencies,
447-
codegenConfigFilename,
448-
codegenConfigKey,
449-
);
450-
handleLibrariesFromReactNativeConfig(
451-
libraries,
452-
codegenConfigKey,
453-
codegenConfigFilename,
454-
appRootDir,
455-
);
456-
handleInAppLibraries(libraries, pkgJson, codegenConfigKey, appRootDir);
457-
458-
return libraries;
428+
return [
429+
...handleReactNativeCoreLibraries(codegenConfigFilename, codegenConfigKey),
430+
...handleThirdPartyLibraries(
431+
baseCodegenConfigFileDir,
432+
dependencies,
433+
codegenConfigFilename,
434+
codegenConfigKey,
435+
),
436+
...handleLibrariesFromReactNativeConfig(
437+
codegenConfigKey,
438+
codegenConfigFilename,
439+
appRootDir,
440+
),
441+
...handleInAppLibraries(pkgJson, codegenConfigKey, appRootDir),
442+
];
459443
}
460444

461445
// It removes all the empty files and empty folders

0 commit comments

Comments
 (0)