@react-native-harness/babel-preset 1.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Callstack
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # babel
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Building
6
+
7
+ Run `nx build babel` to build the library.
@@ -0,0 +1,4 @@
1
+ import type { PluginObj } from '@babel/core';
2
+ declare const globalRnHarnessPlugin: ({ types: t, }: typeof import("@babel/core")) => PluginObj;
3
+ export default globalRnHarnessPlugin;
4
+ //# sourceMappingURL=global-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-plugin.d.ts","sourceRoot":"","sources":["../src/global-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiC,MAAM,aAAa,CAAC;AAE5E,QAAA,MAAM,qBAAqB,GAAI,eAE5B,cAAc,aAAa,CAAC,KAAG,SAyCjC,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const globalRnHarnessPlugin = ({ types: t, }) => {
4
+ return {
5
+ name: 'react-native-harness-global-plugin',
6
+ visitor: {
7
+ // Replace global.RN_HARNESS with the configured value (only reads, not assignments)
8
+ MemberExpression(path) {
9
+ const { node } = path;
10
+ // Check if this is global.RN_HARNESS
11
+ if (t.isIdentifier(node.object, { name: 'global' }) &&
12
+ t.isIdentifier(node.property, { name: 'RN_HARNESS' })) {
13
+ // Only transform reads, not assignments
14
+ // Check if this member expression is the left side of an assignment
15
+ const parent = path.parent;
16
+ if (t.isAssignmentExpression(parent) && parent.left === node) {
17
+ // This is an assignment like: global.RN_HARNESS = value
18
+ // Skip transformation
19
+ return;
20
+ }
21
+ const rnHarnessValue = !!process.env.RN_HARNESS;
22
+ path.replaceWith(t.booleanLiteral(rnHarnessValue));
23
+ }
24
+ },
25
+ // Optimize conditional expressions (ternary operators) - run after member expressions
26
+ ConditionalExpression: {
27
+ exit(path) {
28
+ const { node } = path;
29
+ // If the test is a boolean literal, we can eliminate the dead branch
30
+ if (t.isBooleanLiteral(node.test)) {
31
+ const result = node.test.value ? node.consequent : node.alternate;
32
+ path.replaceWith(result);
33
+ }
34
+ },
35
+ },
36
+ },
37
+ };
38
+ };
39
+ exports.default = globalRnHarnessPlugin;
@@ -0,0 +1,3 @@
1
+ import { rnHarnessPreset } from './preset';
2
+ export default rnHarnessPreset;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,eAAe,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const preset_1 = require("./preset");
4
+ exports.default = preset_1.rnHarnessPreset;
@@ -0,0 +1,4 @@
1
+ export declare const rnHarnessPreset: () => {
2
+ plugins: (string | (({ types: t, }: typeof import("@babel/core")) => import("@babel/core").PluginObj))[];
3
+ };
4
+ //# sourceMappingURL=preset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.d.ts","sourceRoot":"","sources":["../src/preset.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe;;CAQ3B,CAAC"}
package/dist/preset.js ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rnHarnessPreset = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const global_plugin_1 = tslib_1.__importDefault(require("./global-plugin"));
6
+ const resolve_weak_plugin_1 = tslib_1.__importDefault(require("./resolve-weak-plugin"));
7
+ const rnHarnessPreset = () => {
8
+ return {
9
+ plugins: [
10
+ '@babel/plugin-transform-class-static-block',
11
+ global_plugin_1.default,
12
+ resolve_weak_plugin_1.default,
13
+ ],
14
+ };
15
+ };
16
+ exports.rnHarnessPreset = rnHarnessPreset;
@@ -0,0 +1,4 @@
1
+ import type { PluginObj } from '@babel/core';
2
+ declare const resolveWeakPlugin: ({ types: t, }: typeof import("@babel/core")) => PluginObj;
3
+ export default resolveWeakPlugin;
4
+ //# sourceMappingURL=resolve-weak-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-weak-plugin.d.ts","sourceRoot":"","sources":["../src/resolve-weak-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiC,MAAM,aAAa,CAAC;AAE5E,QAAA,MAAM,iBAAiB,GAAI,eAExB,cAAc,aAAa,CAAC,KAAG,SAoEjC,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const resolveWeakPlugin = ({ types: t, }) => {
4
+ // Track imports from @react-native-harness/runtime for require.resolveWeak transformation
5
+ const importedNames = new Set();
6
+ return {
7
+ name: 'react-native-harness-resolve-weak-plugin',
8
+ visitor: {
9
+ // Track imports from @react-native-harness/runtime
10
+ ImportDeclaration(path) {
11
+ const { node } = path;
12
+ if (node.source.value === '@react-native-harness/runtime') {
13
+ // Track all imported names
14
+ node.specifiers.forEach((spec) => {
15
+ if (t.isImportSpecifier(spec) && t.isIdentifier(spec.imported)) {
16
+ importedNames.add(spec.imported.name);
17
+ }
18
+ });
19
+ }
20
+ },
21
+ // Transform requireActual and mock calls to use require.resolveWeak
22
+ CallExpression(path) {
23
+ const { node } = path;
24
+ // Check if this is a call to requireActual or mock
25
+ if (t.isIdentifier(node.callee)) {
26
+ const functionName = node.callee.name;
27
+ // Only transform if the function was imported from @react-native-harness/runtime
28
+ if (importedNames.has(functionName) &&
29
+ (functionName === 'requireActual' || functionName === 'mock')) {
30
+ const firstArg = node.arguments[0];
31
+ // Only transform if the first argument is a string literal
32
+ if (t.isStringLiteral(firstArg)) {
33
+ const modulePath = firstArg.value;
34
+ // Create require.resolveWeak call
35
+ const requireWeakCall = t.callExpression(t.memberExpression(t.identifier('require'), t.identifier('resolveWeak')), [t.stringLiteral(modulePath)]);
36
+ // Replace the first argument with require.resolveWeak call
37
+ const newArguments = [
38
+ requireWeakCall,
39
+ ...node.arguments.slice(1),
40
+ ];
41
+ // Create new call expression
42
+ const newCallExpression = t.callExpression(node.callee, newArguments);
43
+ path.replaceWith(newCallExpression);
44
+ }
45
+ }
46
+ }
47
+ },
48
+ },
49
+ };
50
+ };
51
+ exports.default = resolveWeakPlugin;
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/tslib/tslib.d.ts","../../../node_modules/@babel/types/lib/index.d.ts","../../../node_modules/@types/babel__generator/index.d.ts","../../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../../node_modules/@types/babel__template/index.d.ts","../../../node_modules/@types/babel__traverse/index.d.ts","../../../node_modules/@types/babel__core/index.d.ts","../src/global-plugin.ts","../src/resolve-weak-plugin.ts","../src/preset.ts","../src/index.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/dom-events.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/globals.global.d.ts","../../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[60,116],[116],[60,61,62,63,64,116],[60,62,116],[70,116],[73,116],[74,79,107,116],[75,86,87,94,104,115,116],[75,76,86,94,116],[77,116],[78,79,87,95,116],[79,104,112,116],[80,82,86,94,116],[81,116],[82,83,116],[86,116],[84,86,116],[86,87,88,104,115,116],[86,87,88,101,104,107,116],[116,120],[82,86,89,94,104,115,116],[86,87,89,90,94,104,112,115,116],[89,91,104,112,115,116],[70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122],[86,92,116],[93,115,116],[82,86,94,104,116],[95,116],[96,116],[73,97,116],[98,114,116,120],[99,116],[100,116],[86,101,102,116],[101,103,116,118],[74,86,104,105,106,107,116],[74,104,106,116],[104,105,116],[107,116],[108,116],[86,110,111,116],[110,111,116],[79,94,104,112,116],[113,116],[94,114,116],[74,89,100,115,116],[79,116],[104,116,117],[116,118],[116,119],[74,79,86,88,97,104,115,116,118,120],[104,116,121],[59,65,116],[59,68,116],[59,66,67,116]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"33afddf2bc87d221f9d5a917aa3c8d8d56141a81087399f5f36dc2474d92e505","signature":"490eb8beeb82539e049c234dd72d97ebc39997d2043ba98af5ec2867bc5afdd7","impliedFormat":1},{"version":"b21c0bf6e2ae0d63f620d64ff90662929f0742df9f8e008d9454ac2dee60b4f9","signature":"4266b7020b88524aa8f4326ee6981ab950abf46519e77f735fe85f4ea6558d05","impliedFormat":1},{"version":"8a22032741cc93d98e832a4e8839d4b9ec59dff421a00d93ca84bad42aa8c8ab","signature":"0247e01a12416d8a65238a9944ebdacb9bac10894b9d55bdbb5ff2fb5fa08722","impliedFormat":1},{"version":"7f24094ea3ec899f149be38be8131f51b0bfa09190cc1d43cfdbea34af4cc0de","impliedFormat":1},{"version":"7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"f749812878fecfa53cfc13b36e5d35086fb6377983a9df44175da83ccc23af1f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7d2e3fea24c712c99c03ad8f556abedbfe105f87f1be10b95dbd409d24bc05a3","impliedFormat":1},{"version":"211e3f15fbced4ab4be19f49ffa990b9ff20d749d33b65ff753be691e7616239","affectsGlobalScope":true,"impliedFormat":1},{"version":"3719525a8f6ab731e3dfd585d9f87df55ec7d50d461df84f74eb4d68bb165244","impliedFormat":1},{"version":"5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713","impliedFormat":1},{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"e596c9bb2f29a2699fdd4ae89139612652245192f67f45617c5a4b20832aaae9","impliedFormat":1},{"version":"bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","impliedFormat":1},{"version":"1cdcfc1f624d6c08aa12c73935f6e13f095919cd99edf95752951796eb225729","impliedFormat":1},{"version":"4eaff3d8e10676fd7913d8c108890e71c688e1e7d52f6d1d55c39514f493dc47","impliedFormat":1},{"version":"14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","impliedFormat":1},{"version":"5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"00dee7cdca8b8420c47ea4a31a34b8e8294013ebc4f463fd941e867e7bf05029","affectsGlobalScope":true,"impliedFormat":1},{"version":"3256f3cccd578f9e7fe3a28096c505634bebcee8afb738ffa99368e536ca3a0b","impliedFormat":1},{"version":"1c84b46267610a34028edfd0d035509341751262bac1062857f3c8df7aff7153","impliedFormat":1},{"version":"7f138842074d0a40681775af008c8452093b68c383c94de31759e853c6d06b5c","impliedFormat":1},{"version":"a3d541d303ee505053f5dcbf9fafb65cac3d5631037501cd616195863a6c5740","impliedFormat":1},{"version":"8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","impliedFormat":1},{"version":"2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58","impliedFormat":1},{"version":"e630e5528e899219ae319e83bef54bf3bcb91b01d76861ecf881e8e614b167f0","affectsGlobalScope":true,"impliedFormat":1},{"version":"bcebb922784739bdb34c18ee51095d25a92b560c78ccd2eaacd6bd00f7443d83","impliedFormat":1},{"version":"7ee6ed878c4528215c82b664fe0cfe80e8b4da6c0d4cc80869367868774db8b1","impliedFormat":1},{"version":"b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30","impliedFormat":1},{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true,"impliedFormat":1},{"version":"0715e4cd28ad471b2a93f3e552ff51a3ae423417a01a10aa1d3bc7c6b95059d6","affectsGlobalScope":true,"impliedFormat":1},{"version":"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","impliedFormat":1},{"version":"210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","impliedFormat":1},{"version":"36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","impliedFormat":1},{"version":"0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","impliedFormat":1},{"version":"25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","impliedFormat":1},{"version":"4f3fdeba4e28e21aa719c081b8dc8f91d47e12e773389b9d35679c08151c9d37","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","impliedFormat":1},{"version":"f69ff39996a61a0dd10f4bce73272b52e8024a4d58b13ab32bf4712909d0a2b7","impliedFormat":1},{"version":"3c4ba1dd9b12ffa284b565063108f2f031d150ea15b8fafbdc17f5d2a07251f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","impliedFormat":1},{"version":"1422cd9e705adcc09088fda85a900c2b70e3ad36ea85846f68bd1a884cdf4e2b","impliedFormat":1},{"version":"3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","impliedFormat":1},{"version":"5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2","impliedFormat":1},{"version":"a73ae8c0e62103bb9e21bb6538700881bf135b9a8b125b857ec68edfa0da4ed3","affectsGlobalScope":true,"impliedFormat":1},{"version":"e1c1b2fbe236bf7ee3e342eeae7e20efb8988a0ac7da1cbbfa2c1f66b76c3423","affectsGlobalScope":true,"impliedFormat":1},{"version":"868831cab82b65dfe1d68180e898af1f2101e89ba9b754d1db6fb8cc2fac1921","impliedFormat":1},{"version":"0fe8985a28f82c450a04a6edf1279d7181c0893f37da7d2a27f8efd4fd5edb03","impliedFormat":1},{"version":"e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa","impliedFormat":1},{"version":"52120bb7e4583612225bdf08e7c12559548170f11e660d33a33623bae9bbdbba","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6dd3dba8e665ac43d279e0fdf5219edda0eed69b5e9a5061f46cd6a65c4f7a1","impliedFormat":1}],"root":[[66,69]],"options":{"composite":true,"declarationMap":true,"emitDeclarationOnly":false,"importHelpers":true,"module":199,"noEmitOnError":true,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUnusedLocals":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":true,"target":9,"tsBuildInfoFile":"./tsconfig.lib.tsbuildinfo"},"referencedMap":[[62,1],[60,2],[65,3],[61,1],[63,4],[64,1],[70,5],[71,5],[73,6],[74,7],[75,8],[76,9],[77,10],[78,11],[79,12],[80,13],[81,14],[82,15],[83,15],[85,16],[84,17],[86,16],[87,18],[88,19],[72,20],[122,2],[89,21],[90,22],[91,23],[123,24],[92,25],[93,26],[94,27],[95,28],[96,29],[97,30],[98,31],[99,32],[100,33],[101,34],[102,34],[103,35],[104,36],[106,37],[105,38],[107,39],[108,40],[109,2],[110,41],[111,42],[112,43],[113,44],[114,45],[115,46],[116,47],[117,48],[118,49],[119,50],[120,51],[121,52],[59,2],[57,2],[58,2],[11,2],[10,2],[2,2],[12,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[3,2],[20,2],[21,2],[4,2],[22,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[8,2],[49,2],[46,2],[47,2],[48,2],[50,2],[9,2],[51,2],[52,2],[53,2],[55,2],[54,2],[1,2],[56,2],[66,53],[69,54],[68,55],[67,53]],"latestChangedDtsFile":"./index.d.ts","version":"5.8.3"}
@@ -0,0 +1,15 @@
1
+ import nx from '@nx/eslint-plugin';
2
+ import baseConfig from '../../eslint.config.mjs';
3
+
4
+ export default [
5
+ ...baseConfig,
6
+ ...nx.configs['flat/react'],
7
+ {
8
+ files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],
9
+ // Override or add rules here
10
+ rules: {},
11
+ },
12
+ {
13
+ ignores: ['public', '.cache', 'node_modules'],
14
+ },
15
+ ];
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@react-native-harness/babel-preset",
3
+ "version": "1.0.0-alpha.1",
4
+ "type": "commonjs",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ "./package.json": "./package.json",
10
+ ".": {
11
+ "development": "./src/index.ts",
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "default": "./dist/index.js"
15
+ }
16
+ },
17
+ "peerDependencies": {
18
+ "@babel/core": "^7.22.0",
19
+ "@babel/plugin-transform-class-static-block": "^7.22.0"
20
+ },
21
+ "devDependencies": {
22
+ "@babel/core": "^7.22.0",
23
+ "@babel/plugin-transform-class-static-block": "^7.22.0",
24
+ "@types/babel__core": "^7.20.5"
25
+ }
26
+ }
@@ -0,0 +1,48 @@
1
+ import type { PluginObj, types as BabelTypes, NodePath } from '@babel/core';
2
+
3
+ const globalRnHarnessPlugin = ({
4
+ types: t,
5
+ }: typeof import('@babel/core')): PluginObj => {
6
+ return {
7
+ name: 'react-native-harness-global-plugin',
8
+ visitor: {
9
+ // Replace global.RN_HARNESS with the configured value (only reads, not assignments)
10
+ MemberExpression(path: NodePath<BabelTypes.MemberExpression>) {
11
+ const { node } = path;
12
+
13
+ // Check if this is global.RN_HARNESS
14
+ if (
15
+ t.isIdentifier(node.object, { name: 'global' }) &&
16
+ t.isIdentifier(node.property, { name: 'RN_HARNESS' })
17
+ ) {
18
+ // Only transform reads, not assignments
19
+ // Check if this member expression is the left side of an assignment
20
+ const parent = path.parent;
21
+ if (t.isAssignmentExpression(parent) && parent.left === node) {
22
+ // This is an assignment like: global.RN_HARNESS = value
23
+ // Skip transformation
24
+ return;
25
+ }
26
+
27
+ const rnHarnessValue = !!process.env.RN_HARNESS;
28
+ path.replaceWith(t.booleanLiteral(rnHarnessValue));
29
+ }
30
+ },
31
+
32
+ // Optimize conditional expressions (ternary operators) - run after member expressions
33
+ ConditionalExpression: {
34
+ exit(path: NodePath<BabelTypes.ConditionalExpression>) {
35
+ const { node } = path;
36
+
37
+ // If the test is a boolean literal, we can eliminate the dead branch
38
+ if (t.isBooleanLiteral(node.test)) {
39
+ const result = node.test.value ? node.consequent : node.alternate;
40
+ path.replaceWith(result);
41
+ }
42
+ },
43
+ },
44
+ },
45
+ };
46
+ };
47
+
48
+ export default globalRnHarnessPlugin;
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ import { rnHarnessPreset } from './preset';
2
+ export default rnHarnessPreset;
package/src/preset.ts ADDED
@@ -0,0 +1,12 @@
1
+ import globalRnHarnessPlugin from './global-plugin';
2
+ import resolveWeakPlugin from './resolve-weak-plugin';
3
+
4
+ export const rnHarnessPreset = () => {
5
+ return {
6
+ plugins: [
7
+ '@babel/plugin-transform-class-static-block',
8
+ globalRnHarnessPlugin,
9
+ resolveWeakPlugin,
10
+ ],
11
+ };
12
+ };
@@ -0,0 +1,75 @@
1
+ import type { PluginObj, types as BabelTypes, NodePath } from '@babel/core';
2
+
3
+ const resolveWeakPlugin = ({
4
+ types: t,
5
+ }: typeof import('@babel/core')): PluginObj => {
6
+ // Track imports from @react-native-harness/runtime for require.resolveWeak transformation
7
+ const importedNames = new Set<string>();
8
+
9
+ return {
10
+ name: 'react-native-harness-resolve-weak-plugin',
11
+ visitor: {
12
+ // Track imports from @react-native-harness/runtime
13
+ ImportDeclaration(path: NodePath<BabelTypes.ImportDeclaration>) {
14
+ const { node } = path;
15
+
16
+ if (node.source.value === '@react-native-harness/runtime') {
17
+ // Track all imported names
18
+ node.specifiers.forEach((spec) => {
19
+ if (t.isImportSpecifier(spec) && t.isIdentifier(spec.imported)) {
20
+ importedNames.add(spec.imported.name);
21
+ }
22
+ });
23
+ }
24
+ },
25
+
26
+ // Transform requireActual and mock calls to use require.resolveWeak
27
+ CallExpression(path: NodePath<BabelTypes.CallExpression>) {
28
+ const { node } = path;
29
+
30
+ // Check if this is a call to requireActual or mock
31
+ if (t.isIdentifier(node.callee)) {
32
+ const functionName = node.callee.name;
33
+
34
+ // Only transform if the function was imported from @react-native-harness/runtime
35
+ if (
36
+ importedNames.has(functionName) &&
37
+ (functionName === 'requireActual' || functionName === 'mock')
38
+ ) {
39
+ const firstArg = node.arguments[0];
40
+
41
+ // Only transform if the first argument is a string literal
42
+ if (t.isStringLiteral(firstArg)) {
43
+ const modulePath = firstArg.value;
44
+
45
+ // Create require.resolveWeak call
46
+ const requireWeakCall = t.callExpression(
47
+ t.memberExpression(
48
+ t.identifier('require'),
49
+ t.identifier('resolveWeak')
50
+ ),
51
+ [t.stringLiteral(modulePath)]
52
+ );
53
+
54
+ // Replace the first argument with require.resolveWeak call
55
+ const newArguments = [
56
+ requireWeakCall,
57
+ ...node.arguments.slice(1),
58
+ ];
59
+
60
+ // Create new call expression
61
+ const newCallExpression = t.callExpression(
62
+ node.callee,
63
+ newArguments
64
+ );
65
+
66
+ path.replaceWith(newCallExpression);
67
+ }
68
+ }
69
+ }
70
+ },
71
+ },
72
+ };
73
+ };
74
+
75
+ export default resolveWeakPlugin;
package/tsconfig.json ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "files": [],
4
+ "include": [],
5
+ "references": [
6
+ {
7
+ "path": "./tsconfig.lib.json"
8
+ }
9
+ ]
10
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "baseUrl": ".",
5
+ "rootDir": "src",
6
+ "outDir": "dist",
7
+ "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
8
+ "emitDeclarationOnly": false,
9
+ "forceConsistentCasingInFileNames": true,
10
+ "types": ["node"]
11
+ },
12
+ "include": ["src/**/*.ts"]
13
+ }