Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import type {TransformVisitor} from 'hermes-transform';

const {
visitors: stripPrivateProperties,
} = require('../../../../scripts/build-types/transforms/stripPrivateProperties');
} = require('../../../../scripts/build-types/transforms/flow/stripPrivateProperties');
const translate = require('flow-api-translator');
const {existsSync, promises: fs} = require('fs');
const glob = require('glob');
Expand Down
29 changes: 9 additions & 20 deletions scripts/build-types/BuildApiSnapshot.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ const {PACKAGES_DIR, REACT_NATIVE_PACKAGE_DIR} = require('../consts');
const {isGitRepo} = require('../scm-utils');
const {API_EXTRACTOR_CONFIG_FILE, TYPES_OUTPUT_DIR} = require('./config');
const apiSnapshotTemplate = require('./templates/ReactNativeApi.d.ts-template.js');
const resolveCyclicImportsInDefinition = require('./transforms/resolveCyclicImportsInDefinition');
const babel = require('@babel/core');
const applyBabelTransformsSeq = require('./utils/applyBabelTransformsSeq');
const resolveCyclicImportsInDefinition = require('./utils/resolveCyclicImportsInDefinition');
const {
Extractor,
ExtractorConfig,
Expand All @@ -31,14 +31,14 @@ const osTempDir = require('temp-dir');
const {styleText} = require('util');

const inputFilesPostTransforms: $ReadOnlyArray<PluginObj<mixed>> = [
require('./transforms/renameDefaultExportedIdentifiers'),
require('./transforms/typescript/renameDefaultExportedIdentifiers'),
];

const postTransforms: $ReadOnlyArray<PluginObj<mixed>> = [
require('./transforms/stripUnstableApis'),
require('./transforms/sortTypeDefinitions'),
require('./transforms/sortProperties'),
require('./transforms/sortUnions'),
require('./transforms/typescript/stripUnstableApis'),
require('./transforms/typescript/sortTypeDefinitions'),
require('./transforms/typescript/sortProperties'),
require('./transforms/typescript/sortUnions'),
require('./transforms/removeUndefinedFromOptionalMembers'),
];

Expand Down Expand Up @@ -193,7 +193,7 @@ async function preparePackagesInTempDir(
await Promise.all(
typeDefs.map(async file => {
const source = await fs.readFile(file, 'utf-8');
const transformed = await applyPostTransforms(
const transformed = await applyBabelTransformsSeq(
source,
inputFilesPostTransforms,
);
Expand Down Expand Up @@ -241,7 +241,7 @@ async function getCleanedUpRollup(tempDirectory: string) {
.replace(/^\s+$/gm, '') // Clear whitespace-only lines
.replace(/\n+/gm, '\n'); // Collapse empty lines

const transformedRollup = await applyPostTransforms(
const transformedRollup = await applyBabelTransformsSeq(
cleanedRollup,
postTransforms,
);
Expand All @@ -255,17 +255,6 @@ async function getCleanedUpRollup(tempDirectory: string) {
return formattedRollup;
}

async function applyPostTransforms(
inSrc: string,
transforms: $ReadOnlyArray<PluginObj<mixed>>,
): Promise<string> {
const result = await babel.transformAsync(inSrc, {
plugins: ['@babel/plugin-syntax-typescript', ...transforms],
});

return result.code;
}

async function generateConfigFiles(tempDirectory: string) {
// generate tsconfig
const tsConfig = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const ensureNoUnprefixedProps = require('../ensureNoUnprefixedProps.js');
const ensureNoUnprefixedProps = require('../ensureNoUnprefixedProps');
const {parse, print} = require('hermes-transform');

const prettierOptions = {parser: 'babel'};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const reattachDocComments = require('../reattachDocComments.js');
const reattachDocComments = require('../reattachDocComments');
const {parse, print} = require('hermes-transform');

const prettierOptions = {parser: 'babel'};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const replaceEmptyWithNever = require('../replaceEmptyWithNever.js');
const replaceEmptyWithNever = require('../replaceEmptyWithNever');
const {parse, print} = require('hermes-transform');

const prettierOptions = {parser: 'babel'};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const replaceNullablePropertiesWithUndefined = require('../replaceNullablePropertiesWithUndefined.js');
const replaceNullablePropertiesWithUndefined = require('../replaceNullablePropertiesWithUndefined');
const {parse, print} = require('hermes-transform');

const prettierOptions = {parser: 'babel'};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const replaceRequiresWithImports = require('../replaceRequiresWithImports.js');
const replaceRequiresWithImports = require('../replaceRequiresWithImports');
const {parse, print} = require('hermes-transform');

const prettierOptions = {parser: 'babel'};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const replaceStringishWithString = require('../replaceStringishWithString.js');
const replaceStringishWithString = require('../replaceStringishWithString');
const {parse, print} = require('hermes-transform');

const prettierOptions = {parser: 'babel'};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const stripPrivateProperties = require('../stripPrivateProperties.js');
const stripPrivateProperties = require('../stripPrivateProperties');
const {parse, print} = require('hermes-transform');

const prettierOptions = {parser: 'babel'};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const renameDefaultExportedIdentifiersVisitor = require('../renameDefaultExportedIdentifiers.js');
const renameDefaultExportedIdentifiersVisitor = require('../renameDefaultExportedIdentifiers');
const babel = require('@babel/core');

async function translate(code: string): Promise<string> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const createReplaceDefaultExportName = require('../replaceDefaultExportName.js');
const createReplaceDefaultExportName = require('../replaceDefaultExportName');
const babel = require('@babel/core');
const flowApiTranslator = require('flow-api-translator');

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const sortPropertiesVisitor = require('../sortProperties.js');
const sortPropertiesVisitor = require('../sortProperties');
const babel = require('@babel/core');
const {promises: fs} = require('fs');
const path = require('path');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const sortTypeDefinitionsVisitor = require('../sortTypeDefinitions.js');
const sortTypeDefinitionsVisitor = require('../sortTypeDefinitions');
const babel = require('@babel/core');
const {promises: fs} = require('fs');
const path = require('path');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const sortUnionsVisitor = require('../sortUnions.js');
const sortUnionsVisitor = require('../sortUnions');
const babel = require('@babel/core');
const {promises: fs} = require('fs');
const path = require('path');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const stripUnstableApisVisitor = require('../stripUnstableApis.js');
const stripUnstableApisVisitor = require('../stripUnstableApis');
const babel = require('@babel/core');

async function translate(code: string): Promise<string> {
Expand Down
45 changes: 15 additions & 30 deletions scripts/build-types/translateSourceFile.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,24 @@ import type {ParseResult} from 'hermes-transform/dist/transform/parse';
import type {TransformASTResult} from 'hermes-transform/dist/transform/transformAST';

const getDependencies = require('./resolution/getDependencies');
const createReplaceDefaultExportName = require('./transforms/replaceDefaultExportName');
const babel = require('@babel/core');
const applyBabelTransformsSeq = require('./utils/applyBabelTransformsSeq');
const translate = require('flow-api-translator');
const {parse, print} = require('hermes-transform');

type PreTransformFn = ParseResult => Promise<TransformASTResult>;

const preTransforms: Array<PreTransformFn> = [
require('./transforms/stripPrivateProperties'),
require('./transforms/replaceRequiresWithImports'),
require('./transforms/replaceEmptyWithNever'),
require('./transforms/replaceStringishWithString'),
require('./transforms/replaceNullablePropertiesWithUndefined'),
require('./transforms/reattachDocComments'),
require('./transforms/ensureNoUnprefixedProps'),
require('./transforms/flow/stripPrivateProperties'),
require('./transforms/flow/replaceRequiresWithImports'),
require('./transforms/flow/replaceEmptyWithNever'),
require('./transforms/flow/replaceStringishWithString'),
require('./transforms/flow/replaceNullablePropertiesWithUndefined'),
require('./transforms/flow/reattachDocComments'),
require('./transforms/flow/ensureNoUnprefixedProps'),
];
const postTransforms = (filePath: string): Array<PluginObj<mixed>> => [
require('./transforms/typescript/replaceDefaultExportName')(filePath),
];
const postTransforms: Array<PluginObj<mixed>> = [];
const prettierOptions = {parser: 'babel'};
const unsupportedFeatureRegex =
/Unsupported feature: Translating ".*" is currently not supported/;
Expand Down Expand Up @@ -79,7 +80,10 @@ async function translateSourceFile(
}

// Apply post-transforms
const result = await applyPostTransforms(tsDefResult, filePath);
const result = await applyBabelTransformsSeq(
tsDefResult,
postTransforms(filePath),
);

return {
result,
Expand All @@ -94,28 +98,9 @@ async function applyPreTransforms(source: ParseResult): Promise<ParseResult> {
const code = transformed.astWasMutated
? await print(transformed.ast, transformed.mutatedCode, prettierOptions)
: transformed.mutatedCode;

return parse(code);
});
}, Promise.resolve(source));
}

/**
* Apply post-transforms to .d.ts source code containing @build-types directives.
*/
async function applyPostTransforms(
source: string,
filePath: string,
): Promise<string> {
const result = await babel.transformAsync(source, {
plugins: [
'@babel/plugin-syntax-typescript',
...postTransforms,
createReplaceDefaultExportName(filePath),
],
});

return result.code;
}

module.exports = translateSourceFile;
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* @format
*/

const resolveCyclicImportsInDefinition = require('../resolveCyclicImportsInDefinition.js');
const resolveCyclicImportsInDefinition = require('../resolveCyclicImportsInDefinition');
const path = require('path');

const packagesPath = '/path/to/package/definition/files';
Expand Down
49 changes: 49 additions & 0 deletions scripts/build-types/utils/applyBabelTransformsSeq.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/**
* 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-local
* @format
*/

import type {PluginObj} from '@babel/core';

import * as babel from '@babel/core';

/**
* Apply an array of Babel transforms to a TypeScript source in order.
*/
async function applyBabelTransformsSeq(
source: string,
transforms: $ReadOnlyArray<PluginObj<mixed>>,
): Promise<string> {
const parsed = await babel.parseAsync(source, {
plugins: ['@babel/plugin-syntax-typescript'],
});

const finalAST = await transforms.reduce((input, transform) => {
return input.then(async ast => {
const result = await babel.transformFromAstAsync(ast, source, {
plugins: [transform],
ast: true,
code: false,
});
if (result == null) {
throw new Error('Unexpected null result from Babel transform');
}
// $FlowIgnore[incompatible-cast]
return result.ast as BabelNodeFile;
});
}, Promise.resolve(parsed));

const result = await babel.transformFromAstAsync(finalAST, source, {
code: true,
ast: false,
});

return result.code;
}

module.exports = applyBabelTransformsSeq;
Loading