Skip to content

Commit c1e9aa9

Browse files
motiz88facebook-github-bot
authored andcommitted
Deprecate jest/preprocessor.js
Summary: Changelog: [General][Deprecated] Deprecate the use of `react-native/jest/preprocessor.js` by external projects The supported method of using Jest in React Native projects is using the [Jest preset](https://jestjs.io/docs/tutorial-react-native) shipped as part of the `react-native` package. Some projects are directly using `preprocessor.js` which is part of the testing setup for the React Native repo itself. In a future release of React Native, we will stop publishing this file to npm and require projects to switch to the supported preset (or a custom Jest config if necessary). Reviewed By: GijsWeterings Differential Revision: D34820086 fbshipit-source-id: 197c33726639e66c6916a244117252e6af11f2f6
1 parent 5ea50fd commit c1e9aa9

File tree

3 files changed

+147
-107
lines changed

3 files changed

+147
-107
lines changed

jest.config.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ module.exports = {
1313
transform: {
1414
'^.+\\.(bmp|gif|jpg|jpeg|mp4|png|psd|svg|webp)$':
1515
'<rootDir>/jest/assetFileTransformer.js',
16-
'.*': './jest/preprocessor.js',
16+
'.*': './jest/preprocessor_DO_NOT_USE.js',
1717
},
1818
setupFiles: ['./jest/setup.js'],
1919
timers: 'fake',

jest/preprocessor.js

+24-106
Original file line numberDiff line numberDiff line change
@@ -12,111 +12,29 @@
1212

1313
'use strict';
1414

15-
const babelRegisterOnly = require('metro-babel-register');
16-
const createCacheKeyFunction =
17-
require('@jest/create-cache-key-function').default;
18-
19-
const {transformSync: babelTransformSync} = require('@babel/core');
20-
const generate = require('@babel/generator').default;
21-
22-
const nodeFiles = new RegExp(
23-
[
24-
'/metro(?:-[^/]*)?/', // metro, metro-core, metro-source-map, metro-etc.
25-
].join('|'),
15+
// NOTE: Avoiding using a package like 'chalk' here, for simplicity
16+
const YELLOW = process.stderr.isTTY ? '\u001b[33m' : '';
17+
const BOLD = process.stderr.isTTY ? '\u001b[1m' : '';
18+
const RESET = process.stderr.isTTY ? '\u001b[0m' : '';
19+
const UNDERLINE = process.stderr.isTTY ? '\u001b[4m' : '';
20+
21+
console.warn(
22+
'\n' +
23+
YELLOW +
24+
BOLD +
25+
'react-native/jest/preprocessor.js' +
26+
RESET +
27+
YELLOW +
28+
' is deprecated and will be removed.\n' +
29+
'Use "preset": "react-native" in your Jest config instead.\n' +
30+
'See ' +
31+
UNDERLINE +
32+
'https://jestjs.io/docs/tutorial-react-native' +
33+
RESET +
34+
YELLOW +
35+
' for more setup instructions.' +
36+
RESET +
37+
'\n',
2638
);
27-
const nodeOptions = babelRegisterOnly.config([nodeFiles]);
28-
29-
babelRegisterOnly([]);
30-
31-
const transformer = require('metro-react-native-babel-transformer');
32-
module.exports = {
33-
process(src /*: string */, file /*: string */) /*: string */ {
34-
if (nodeFiles.test(file)) {
35-
// node specific transforms only
36-
return babelTransformSync(src, {
37-
filename: file,
38-
sourceType: 'script',
39-
...nodeOptions,
40-
ast: false,
41-
}).code;
42-
}
43-
44-
const {ast} = transformer.transform({
45-
filename: file,
46-
options: {
47-
ast: true, // needed for open source (?) https://github.com/facebook/react-native/commit/f8d6b97140cffe8d18b2558f94570c8d1b410d5c#r28647044
48-
dev: true,
49-
enableBabelRuntime: false,
50-
experimentalImportSupport: false,
51-
globalPrefix: '',
52-
hot: false,
53-
inlineRequires: true,
54-
minify: false,
55-
platform: '',
56-
projectRoot: '',
57-
publicPath: '/assets',
58-
retainLines: true,
59-
sourceType: 'unambiguous', // b7 required. detects module vs script mode
60-
},
61-
src,
62-
plugins: [
63-
[require('@babel/plugin-transform-block-scoping')],
64-
// the flow strip types plugin must go BEFORE class properties!
65-
// there'll be a test case that fails if you don't.
66-
[require('@babel/plugin-transform-flow-strip-types')],
67-
[
68-
require('@babel/plugin-proposal-class-properties'),
69-
// use `this.foo = bar` instead of `this.defineProperty('foo', ...)`
70-
{loose: true},
71-
],
72-
[require('@babel/plugin-transform-computed-properties')],
73-
[require('@babel/plugin-transform-destructuring')],
74-
[require('@babel/plugin-transform-function-name')],
75-
[require('@babel/plugin-transform-literals')],
76-
[require('@babel/plugin-transform-parameters')],
77-
[require('@babel/plugin-transform-shorthand-properties')],
78-
[require('@babel/plugin-transform-react-jsx')],
79-
[require('@babel/plugin-transform-regenerator')],
80-
[require('@babel/plugin-transform-sticky-regex')],
81-
[require('@babel/plugin-transform-unicode-regex')],
82-
[
83-
require('@babel/plugin-transform-modules-commonjs'),
84-
{strict: false, allowTopLevelThis: true},
85-
],
86-
[require('@babel/plugin-transform-classes')],
87-
[require('@babel/plugin-transform-arrow-functions')],
88-
[require('@babel/plugin-transform-spread')],
89-
[require('@babel/plugin-proposal-object-rest-spread')],
90-
[
91-
require('@babel/plugin-transform-template-literals'),
92-
{loose: true}, // dont 'a'.concat('b'), just use 'a'+'b'
93-
],
94-
[require('@babel/plugin-transform-exponentiation-operator')],
95-
[require('@babel/plugin-transform-for-of'), {loose: true}],
96-
[require('@babel/plugin-transform-react-display-name')],
97-
[require('@babel/plugin-transform-react-jsx-source')],
98-
],
99-
});
100-
101-
return generate(
102-
ast,
103-
// $FlowFixMe[prop-missing] Error found when improving flow typing for libs
104-
{
105-
code: true,
106-
comments: false,
107-
compact: false,
108-
filename: file,
109-
retainLines: true,
110-
sourceFileName: file,
111-
sourceMaps: true,
112-
},
113-
src,
114-
).code;
115-
},
11639

117-
getCacheKey: (createCacheKeyFunction([
118-
__filename,
119-
require.resolve('metro-react-native-babel-transformer'),
120-
require.resolve('@babel/core/package.json'),
121-
]) /*: any */),
122-
};
40+
module.exports = require('./preprocessor_DO_NOT_USE');

jest/preprocessor_DO_NOT_USE.js

+122
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @format
8+
* @flow
9+
*/
10+
11+
/* eslint-env node */
12+
13+
'use strict';
14+
15+
const babelRegisterOnly = require('metro-babel-register');
16+
const createCacheKeyFunction =
17+
require('@jest/create-cache-key-function').default;
18+
19+
const {transformSync: babelTransformSync} = require('@babel/core');
20+
const generate = require('@babel/generator').default;
21+
22+
const nodeFiles = new RegExp(
23+
[
24+
'/metro(?:-[^/]*)?/', // metro, metro-core, metro-source-map, metro-etc.
25+
].join('|'),
26+
);
27+
const nodeOptions = babelRegisterOnly.config([nodeFiles]);
28+
29+
babelRegisterOnly([]);
30+
31+
const transformer = require('metro-react-native-babel-transformer');
32+
module.exports = {
33+
process(src /*: string */, file /*: string */) /*: string */ {
34+
if (nodeFiles.test(file)) {
35+
// node specific transforms only
36+
return babelTransformSync(src, {
37+
filename: file,
38+
sourceType: 'script',
39+
...nodeOptions,
40+
ast: false,
41+
}).code;
42+
}
43+
44+
const {ast} = transformer.transform({
45+
filename: file,
46+
options: {
47+
ast: true, // needed for open source (?) https://github.com/facebook/react-native/commit/f8d6b97140cffe8d18b2558f94570c8d1b410d5c#r28647044
48+
dev: true,
49+
enableBabelRuntime: false,
50+
experimentalImportSupport: false,
51+
globalPrefix: '',
52+
hot: false,
53+
inlineRequires: true,
54+
minify: false,
55+
platform: '',
56+
projectRoot: '',
57+
publicPath: '/assets',
58+
retainLines: true,
59+
sourceType: 'unambiguous', // b7 required. detects module vs script mode
60+
},
61+
src,
62+
plugins: [
63+
[require('@babel/plugin-transform-block-scoping')],
64+
// the flow strip types plugin must go BEFORE class properties!
65+
// there'll be a test case that fails if you don't.
66+
[require('@babel/plugin-transform-flow-strip-types')],
67+
[
68+
require('@babel/plugin-proposal-class-properties'),
69+
// use `this.foo = bar` instead of `this.defineProperty('foo', ...)`
70+
{loose: true},
71+
],
72+
[require('@babel/plugin-transform-computed-properties')],
73+
[require('@babel/plugin-transform-destructuring')],
74+
[require('@babel/plugin-transform-function-name')],
75+
[require('@babel/plugin-transform-literals')],
76+
[require('@babel/plugin-transform-parameters')],
77+
[require('@babel/plugin-transform-shorthand-properties')],
78+
[require('@babel/plugin-transform-react-jsx')],
79+
[require('@babel/plugin-transform-regenerator')],
80+
[require('@babel/plugin-transform-sticky-regex')],
81+
[require('@babel/plugin-transform-unicode-regex')],
82+
[
83+
require('@babel/plugin-transform-modules-commonjs'),
84+
{strict: false, allowTopLevelThis: true},
85+
],
86+
[require('@babel/plugin-transform-classes')],
87+
[require('@babel/plugin-transform-arrow-functions')],
88+
[require('@babel/plugin-transform-spread')],
89+
[require('@babel/plugin-proposal-object-rest-spread')],
90+
[
91+
require('@babel/plugin-transform-template-literals'),
92+
{loose: true}, // dont 'a'.concat('b'), just use 'a'+'b'
93+
],
94+
[require('@babel/plugin-transform-exponentiation-operator')],
95+
[require('@babel/plugin-transform-for-of'), {loose: true}],
96+
[require('@babel/plugin-transform-react-display-name')],
97+
[require('@babel/plugin-transform-react-jsx-source')],
98+
],
99+
});
100+
101+
return generate(
102+
ast,
103+
// $FlowFixMe[prop-missing] Error found when improving flow typing for libs
104+
{
105+
code: true,
106+
comments: false,
107+
compact: false,
108+
filename: file,
109+
retainLines: true,
110+
sourceFileName: file,
111+
sourceMaps: true,
112+
},
113+
src,
114+
).code;
115+
},
116+
117+
getCacheKey: (createCacheKeyFunction([
118+
__filename,
119+
require.resolve('metro-react-native-babel-transformer'),
120+
require.resolve('@babel/core/package.json'),
121+
]) /*: any */),
122+
};

0 commit comments

Comments
 (0)