@rnx-kit/cli 0.12.1 → 0.12.4

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.
Files changed (60) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +21 -21
  3. package/coverage/clover.xml +158 -131
  4. package/coverage/coverage-final.json +2 -2
  5. package/coverage/lcov-report/index.html +20 -20
  6. package/coverage/lcov-report/src/bundle/index.html +1 -1
  7. package/coverage/lcov-report/src/bundle/kit-config.ts.html +13 -13
  8. package/coverage/lcov-report/src/bundle/metro.ts.html +2 -2
  9. package/coverage/lcov-report/src/bundle/overrides.ts.html +4 -4
  10. package/coverage/lcov-report/src/copy-assets.ts.html +480 -111
  11. package/coverage/lcov-report/src/index.html +21 -21
  12. package/coverage/lcov-report/src/metro-config.ts.html +4 -4
  13. package/coverage/lcov-report/src/typescript/index.html +1 -1
  14. package/coverage/lcov-report/src/typescript/project-cache.ts.html +1 -1
  15. package/coverage/lcov.info +289 -242
  16. package/lib/bundle/metro.js +1 -1
  17. package/lib/bundle/metro.js.map +1 -1
  18. package/lib/bundle/overrides.d.ts +1 -1
  19. package/lib/bundle/overrides.d.ts.map +1 -1
  20. package/lib/bundle/overrides.js +2 -2
  21. package/lib/bundle/overrides.js.map +1 -1
  22. package/lib/bundle.d.ts +1 -0
  23. package/lib/bundle.d.ts.map +1 -1
  24. package/lib/bundle.js +8 -0
  25. package/lib/bundle.js.map +1 -1
  26. package/lib/clean.d.ts.map +1 -1
  27. package/lib/clean.js +40 -18
  28. package/lib/clean.js.map +1 -1
  29. package/lib/copy-assets.d.ts +10 -1
  30. package/lib/copy-assets.d.ts.map +1 -1
  31. package/lib/copy-assets.js +111 -32
  32. package/lib/copy-assets.js.map +1 -1
  33. package/lib/metro-config.d.ts +2 -2
  34. package/lib/metro-config.d.ts.map +1 -1
  35. package/lib/metro-config.js +3 -3
  36. package/lib/metro-config.js.map +1 -1
  37. package/lib/start.d.ts.map +1 -1
  38. package/lib/start.js +28 -9
  39. package/lib/start.js.map +1 -1
  40. package/lib/test.js +3 -6
  41. package/lib/test.js.map +1 -1
  42. package/package.json +1 -1
  43. package/react-native.config.js +6 -1
  44. package/src/bundle/metro.ts +1 -1
  45. package/src/bundle/overrides.ts +3 -3
  46. package/src/bundle.ts +13 -1
  47. package/src/clean.ts +6 -7
  48. package/src/copy-assets.ts +169 -46
  49. package/src/metro-config.ts +3 -3
  50. package/src/start.ts +49 -9
  51. package/src/test.ts +3 -3
  52. package/test/__mocks__/child_process.js +5 -0
  53. package/test/__mocks__/fs-extra.js +2 -0
  54. package/test/__mocks__/fs.js +19 -0
  55. package/test/bundle/kit-config.test.ts +23 -1
  56. package/test/bundle/metro.test.ts +1 -1
  57. package/test/bundle/overrides.test.ts +3 -13
  58. package/test/copy-assets/assembleAarBundle.test.ts +306 -0
  59. package/test/{copy-assets.test.ts → copy-assets/copyAssets.test.ts} +3 -13
  60. package/test/copy-assets/helpers.ts +13 -0
package/lib/start.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"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"}
package/lib/test.js CHANGED
@@ -1,12 +1,9 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.rnxTestCommand = exports.rnxTest = void 0;
4
+ const tools_node_1 = require("@rnx-kit/tools-node");
7
5
  const platform_1 = require("@rnx-kit/tools-react-native/platform");
8
6
  const jest_cli_1 = require("jest-cli");
9
- const path_1 = __importDefault(require("path"));
10
7
  const COMMAND_NAME = "rnx-test";
11
8
  function rnxTest(_argv, _config, { platform }) {
12
9
  const commandIndex = process.argv.indexOf(COMMAND_NAME);
@@ -34,8 +31,8 @@ function jestOptions() {
34
31
  //
35
32
  // To work around this, resolve `jest-cli` first, then use the resolved path
36
33
  // to import `./build/cli/args`.
37
- const jestPath = require.resolve("jest-cli/package.json");
38
- const { options } = require(`${path_1.default.dirname(jestPath)}/build/cli/args`);
34
+ const jestPath = (0, tools_node_1.findPackageDependencyDir)("jest-cli") || "jest-cli";
35
+ const { options } = require(`${jestPath}/build/cli/args`);
39
36
  return Object.keys(options).map((option) => {
40
37
  const { default: defaultValue, description, type } = options[option];
41
38
  return {
package/lib/test.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":";;;;;;AACA,mEAAqE;AACrE,uCAA0C;AAC1C,gDAAwB;AAiBxB,MAAM,YAAY,GAAG,UAAU,CAAC;AAEhC,SAAgB,OAAO,CACrB,KAAe,EACf,OAAkB,EAClB,EAAE,QAAQ,EAAQ;IAElB,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACxD,IAAI,YAAY,GAAG,CAAC,EAAE;QACpB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;KACtD;IAED,4EAA4E;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IAElD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACjD,IAAI,aAAa,GAAG,CAAC,EAAE;QACrB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;KACxD;IAED,yEAAyE;IACzE,qEAAqE;IACrE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAE9B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,QAAQ,CAAC;IAC7C,IAAA,cAAO,EAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAxBD,0BAwBC;AAED,SAAS,WAAW;IAClB,oDAAoD;IACpD,EAAE;IACF,oEAAoE;IACpE,wCAAwC;IACxC,EAAE;IACF,4EAA4E;IAC5E,gCAAgC;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC1D,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAExE,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACzC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QACrE,OAAO;YACL,IAAI,EAAE,KAAK,MAAM,KAAK,IAAI,GAAG;YAC7B,WAAW;YACX,OAAO,EAAE,YAAY;SACtB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAEY,QAAA,cAAc,GAAG;IAC5B,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,mCAAmC;IAChD,IAAI,EAAE,OAAO;IACb,OAAO,EAAE;QACP;YACE,IAAI,EAAE,8CAA8C;YACpD,WAAW,EAAE,oBAAoB;YACjC,KAAK,EAAE,wBAAa;SACrB;QACD,GAAG,WAAW,EAAE;KACjB;CACF,CAAC"}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":";;;AACA,oDAA+D;AAC/D,mEAAqE;AACrE,uCAA0C;AAiB1C,MAAM,YAAY,GAAG,UAAU,CAAC;AAEhC,SAAgB,OAAO,CACrB,KAAe,EACf,OAAkB,EAClB,EAAE,QAAQ,EAAQ;IAElB,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACxD,IAAI,YAAY,GAAG,CAAC,EAAE;QACpB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;KACtD;IAED,4EAA4E;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IAElD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACjD,IAAI,aAAa,GAAG,CAAC,EAAE;QACrB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;KACxD;IAED,yEAAyE;IACzE,qEAAqE;IACrE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAE9B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,QAAQ,CAAC;IAC7C,IAAA,cAAO,EAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAxBD,0BAwBC;AAED,SAAS,WAAW;IAClB,oDAAoD;IACpD,EAAE;IACF,oEAAoE;IACpE,wCAAwC;IACxC,EAAE;IACF,4EAA4E;IAC5E,gCAAgC;IAChC,MAAM,QAAQ,GAAG,IAAA,qCAAwB,EAAC,UAAU,CAAC,IAAI,UAAU,CAAC;IACpE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,QAAQ,iBAAiB,CAAC,CAAC;IAE1D,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACzC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QACrE,OAAO;YACL,IAAI,EAAE,KAAK,MAAM,KAAK,IAAI,GAAG;YAC7B,WAAW;YACX,OAAO,EAAE,YAAY;SACtB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAEY,QAAA,cAAc,GAAG;IAC5B,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,mCAAmC;IAChD,IAAI,EAAE,OAAO;IACb,OAAO,EAAE;QACP;YACE,IAAI,EAAE,8CAA8C;YACpD,WAAW,EAAE,oBAAoB;YACjC,KAAK,EAAE,wBAAa;SACrB;QACD,GAAG,WAAW,EAAE;KACjB;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rnx-kit/cli",
3
- "version": "0.12.1",
3
+ "version": "0.12.4",
4
4
  "description": "Command-line interface for working with kit packages in your repo",
5
5
  "homepage": "https://github.com/microsoft/rnx-kit/tree/main/packages/cli",
6
6
  "license": "MIT",
@@ -69,7 +69,12 @@ module.exports = {
69
69
  },
70
70
  {
71
71
  name: "--experimental-tree-shake [boolean]",
72
- description: "Experimental: Enable tree shaking.",
72
+ description: "Deprecated. Use --tree-shake [boolean] instead.",
73
+ parse: parseBoolean,
74
+ },
75
+ {
76
+ name: "--tree-shake [boolean]",
77
+ description: "Enable tree shaking.",
73
78
  parse: parseBoolean,
74
79
  },
75
80
  {
@@ -75,7 +75,7 @@ export async function metroBundle(
75
75
  bundleConfig.detectCyclicDependencies,
76
76
  bundleConfig.detectDuplicateDependencies,
77
77
  bundleConfig.typescriptValidation ? typescriptValidationOptions : false,
78
- bundleConfig.experimental_treeShake
78
+ bundleConfig.treeShake
79
79
  );
80
80
 
81
81
  const metroBundleArgs = createMetroBundleArgs(bundleConfig);
@@ -10,7 +10,7 @@ export type KitBundleConfigOverrides = {
10
10
  bundleEncoding?: BundleArgs["bundleEncoding"];
11
11
  sourcemapOutput?: string;
12
12
  sourcemapSourcesRoot?: string;
13
- experimentalTreeShake?: boolean;
13
+ treeShake?: boolean;
14
14
  };
15
15
 
16
16
  /**
@@ -33,7 +33,7 @@ export function applyKitBundleConfigOverrides(
33
33
  "bundleEncoding",
34
34
  "sourcemapOutput",
35
35
  "sourcemapSourcesRoot",
36
- "experimentalTreeShake",
36
+ "treeShake",
37
37
  ],
38
38
  [
39
39
  "entryPath",
@@ -43,7 +43,7 @@ export function applyKitBundleConfigOverrides(
43
43
  "bundleEncoding",
44
44
  "sourcemapOutput",
45
45
  "sourcemapSourcesRoot",
46
- "experimental_treeShake",
46
+ "treeShake",
47
47
  ]
48
48
  );
49
49
  if (overridesToApply) {
package/src/bundle.ts CHANGED
@@ -17,7 +17,8 @@ export type CLIBundleOptions = {
17
17
  bundleEncoding?: BundleArgs["bundleEncoding"];
18
18
  dev: boolean;
19
19
  minify?: boolean;
20
- experimentalTreeShake?: boolean;
20
+ experimentalTreeShake?: boolean; // Deprecated
21
+ treeShake?: boolean;
21
22
  maxWorkers?: number;
22
23
  sourcemapOutput?: string;
23
24
  sourcemapSourcesRoot?: string;
@@ -30,6 +31,17 @@ export async function rnxBundle(
30
31
  cliConfig: CLIConfig,
31
32
  cliOptions: CLIBundleOptions
32
33
  ): Promise<void> {
34
+ // experimentalTreeShake is deprecated. Only use it when treeShake is not specified.
35
+ if (cliOptions.experimentalTreeShake !== undefined) {
36
+ console.warn(
37
+ "Warning: The command-line parameter '--experimental-tree-shake' is deprecated. Use `--tree-shake` instead."
38
+ );
39
+ if (cliOptions.treeShake === undefined) {
40
+ cliOptions.treeShake = cliOptions.experimentalTreeShake;
41
+ }
42
+ delete cliOptions.experimentalTreeShake;
43
+ }
44
+
33
45
  const metroConfig = await loadMetroConfig(cliConfig, cliOptions);
34
46
 
35
47
  const kitBundleConfigs = getKitBundleConfigs(
package/src/clean.ts CHANGED
@@ -1,10 +1,9 @@
1
1
  import type { Config as CLIConfig } from "@react-native-community/cli-types";
2
2
  import { spawn } from "child_process";
3
- import { existsSync as fileExists } from "fs";
4
- import fs from "fs/promises";
3
+ import * as fs from "fs-extra";
5
4
  import ora from "ora";
6
- import os from "os";
7
- import path from "path";
5
+ import * as os from "os";
6
+ import * as path from "path";
8
7
 
9
8
  type Args = {
10
9
  include?: string;
@@ -27,7 +26,7 @@ export async function rnxClean(
27
26
  cliOptions: Args
28
27
  ): Promise<void> {
29
28
  const projectRoot = cliOptions.projectRoot ?? process.cwd();
30
- if (!fileExists(projectRoot)) {
29
+ if (!fs.existsSync(projectRoot)) {
31
30
  throw new Error(`Invalid path provided! ${projectRoot}`);
32
31
  }
33
32
 
@@ -152,7 +151,7 @@ export async function rnxClean(
152
151
  }
153
152
 
154
153
  function cleanDir(path: string): Promise<void> {
155
- if (!fileExists(path)) {
154
+ if (!fs.existsSync(path)) {
156
155
  return Promise.resolve();
157
156
  }
158
157
 
@@ -163,7 +162,7 @@ function findPath(startPath: string, files: string[]): string | undefined {
163
162
  // TODO: Find project files via `@react-native-community/cli`
164
163
  for (const file of files) {
165
164
  const filename = path.resolve(startPath, file);
166
- if (fileExists(filename)) {
165
+ if (fs.existsSync(filename)) {
167
166
  return filename;
168
167
  }
169
168
  }
@@ -2,7 +2,11 @@ import type { Config as CLIConfig } from "@react-native-community/cli-types";
2
2
  import { error, info, warn } from "@rnx-kit/console";
3
3
  import { isNonEmptyArray } from "@rnx-kit/tools-language/array";
4
4
  import type { PackageManifest } from "@rnx-kit/tools-node/package";
5
- import { findPackageDir, readPackage } from "@rnx-kit/tools-node/package";
5
+ import {
6
+ findPackageDependencyDir,
7
+ findPackageDir,
8
+ readPackage,
9
+ } from "@rnx-kit/tools-node/package";
6
10
  import type { AllPlatforms } from "@rnx-kit/tools-react-native";
7
11
  import { parsePlatform } from "@rnx-kit/tools-react-native";
8
12
  import { spawnSync } from "child_process";
@@ -11,9 +15,17 @@ import * as os from "os";
11
15
  import * as path from "path";
12
16
 
13
17
  export type AndroidArchive = {
14
- targetName: string;
18
+ targetName?: string;
15
19
  version?: string;
16
20
  output?: string;
21
+ android?: {
22
+ androidPluginVersion?: string;
23
+ compileSdkVersion?: number;
24
+ defaultConfig?: {
25
+ minSdkVersion?: number;
26
+ targetSdkVersion?: number;
27
+ };
28
+ };
17
29
  };
18
30
 
19
31
  export type NativeAssets = {
@@ -44,6 +56,15 @@ export type AssetsConfig = {
44
56
  getAssets?: (context: Context) => Promise<NativeAssets>;
45
57
  };
46
58
 
59
+ const defaultAndroidConfig: Required<Required<AndroidArchive>["android"]> = {
60
+ androidPluginVersion: "7.1.3",
61
+ compileSdkVersion: 31,
62
+ defaultConfig: {
63
+ minSdkVersion: 23,
64
+ targetSdkVersion: 29,
65
+ },
66
+ };
67
+
47
68
  function ensureOption(options: Options, opt: string, flag = opt) {
48
69
  if (options[opt] == null) {
49
70
  error(`Missing required option: --${flag}`);
@@ -61,6 +82,12 @@ function findGradleProject(projectRoot: string): string | undefined {
61
82
  return undefined;
62
83
  }
63
84
 
85
+ function gradleTargetName(packageName: string): string {
86
+ return (
87
+ packageName.startsWith("@") ? packageName.slice(1) : packageName
88
+ ).replace(/[^\w\-.]+/g, "_");
89
+ }
90
+
64
91
  function isAssetsConfig(config: unknown): config is AssetsConfig {
65
92
  return typeof config === "object" && config !== null && "getAssets" in config;
66
93
  }
@@ -70,7 +97,12 @@ function keysOf(record: Record<string, unknown> | undefined): string[] {
70
97
  }
71
98
 
72
99
  export function versionOf(pkgName: string): string {
73
- const { version } = readPackage(require.resolve(`${pkgName}/package.json`));
100
+ const packageDir = findPackageDependencyDir(pkgName);
101
+ if (!packageDir) {
102
+ throw new Error(`Could not find module '${pkgName}'`);
103
+ }
104
+
105
+ const { version } = readPackage(packageDir);
74
106
  return version;
75
107
  }
76
108
 
@@ -79,13 +111,19 @@ function getAndroidPaths(
79
111
  packageName: string,
80
112
  { targetName, version, output }: AndroidArchive
81
113
  ) {
82
- const projectRoot = path.dirname(
83
- require.resolve(`${packageName}/package.json`)
84
- );
114
+ const projectRoot = findPackageDependencyDir(packageName);
115
+ if (!projectRoot) {
116
+ throw new Error(`Could not find module '${packageName}'`);
117
+ }
118
+
119
+ const gradleFriendlyName = targetName || gradleTargetName(packageName);
120
+ const aarVersion = version || versionOf(packageName);
85
121
 
86
122
  switch (packageName) {
87
123
  case "hermes-engine":
88
124
  return {
125
+ targetName: gradleFriendlyName,
126
+ version: aarVersion,
89
127
  projectRoot,
90
128
  output: path.join(projectRoot, "android", "hermes-release.aar"),
91
129
  destination: path.join(
@@ -97,6 +135,8 @@ function getAndroidPaths(
97
135
 
98
136
  case "react-native":
99
137
  return {
138
+ targetName: gradleFriendlyName,
139
+ version: aarVersion,
100
140
  projectRoot,
101
141
  output: path.join(projectRoot, "android"),
102
142
  destination: path.join(
@@ -109,6 +149,8 @@ function getAndroidPaths(
109
149
  default: {
110
150
  const androidProject = findGradleProject(projectRoot);
111
151
  return {
152
+ targetName: gradleFriendlyName,
153
+ version: aarVersion,
112
154
  projectRoot,
113
155
  androidProject,
114
156
  output:
@@ -119,19 +161,19 @@ function getAndroidPaths(
119
161
  "build",
120
162
  "outputs",
121
163
  "aar",
122
- `${targetName}-release.aar`
164
+ `${gradleFriendlyName}-release.aar`
123
165
  )),
124
166
  destination: path.join(
125
167
  context.options.assetsDest,
126
168
  "aar",
127
- `${targetName}-${version || versionOf(packageName)}.aar`
169
+ `${gradleFriendlyName}-${aarVersion}.aar`
128
170
  ),
129
171
  };
130
172
  }
131
173
  }
132
174
  }
133
175
 
134
- async function assembleAarBundle(
176
+ export async function assembleAarBundle(
135
177
  context: Context,
136
178
  packageName: string,
137
179
  { aar }: NativeAssets
@@ -149,55 +191,136 @@ async function assembleAarBundle(
149
191
  return;
150
192
  }
151
193
 
152
- const { androidProject, output } = getAndroidPaths(context, packageName, aar);
194
+ const { targetName, version, androidProject, output } = getAndroidPaths(
195
+ context,
196
+ packageName,
197
+ aar
198
+ );
153
199
  if (!androidProject || !output) {
154
200
  warn(`Skipped \`${packageName}\`: cannot find \`build.gradle\``);
155
201
  return;
156
202
  }
157
203
 
158
- const { targetName, version, env, dependencies } = aar;
204
+ const { env: customEnv, dependencies, android } = aar;
205
+ const env = {
206
+ NODE_MODULES_PATH: path.join(process.cwd(), "node_modules"),
207
+ REACT_NATIVE_VERSION: versionOf("react-native"),
208
+ ...process.env,
209
+ ...customEnv,
210
+ };
211
+
212
+ const outputDir = path.join(context.options.assetsDest, "aar");
213
+ await fs.ensureDir(outputDir);
214
+
215
+ const dest = path.join(outputDir, `${targetName}-${version}.aar`);
216
+
159
217
  const targets = [`:${targetName}:assembleRelease`];
160
- const targetsToCopy: [string, string][] = [];
161
- if (dependencies) {
162
- for (const [dependencyName, aar] of Object.entries(dependencies)) {
163
- const { output, destination } = getAndroidPaths(
164
- context,
165
- dependencyName,
166
- aar
167
- );
168
- if (output) {
169
- if (!fs.existsSync(output)) {
170
- targets.push(`:${aar.targetName}:assembleRelease`);
171
- targetsToCopy.push([output, destination]);
172
- } else if (!fs.existsSync(destination)) {
173
- targetsToCopy.push([output, destination]);
218
+ const targetsToCopy: [string, string][] = [[output, dest]];
219
+
220
+ const settings = path.join(androidProject, "settings.gradle");
221
+ if (fs.existsSync(settings)) {
222
+ if (dependencies) {
223
+ for (const [dependencyName, aar] of Object.entries(dependencies)) {
224
+ const { targetName, output, destination } = getAndroidPaths(
225
+ context,
226
+ dependencyName,
227
+ aar
228
+ );
229
+ if (output) {
230
+ if (!fs.existsSync(output)) {
231
+ targets.push(`:${targetName}:assembleRelease`);
232
+ targetsToCopy.push([output, destination]);
233
+ } else if (!fs.existsSync(destination)) {
234
+ targetsToCopy.push([output, destination]);
235
+ }
174
236
  }
175
237
  }
176
238
  }
177
- }
178
239
 
179
- // Run only one Gradle task at a time
180
- spawnSync(gradlew, targets, {
181
- cwd: androidProject,
182
- stdio: "inherit",
183
- env: {
184
- ENABLE_HERMES: "true",
185
- NODE_MODULES_PATH: path.join(process.cwd(), "node_modules"),
186
- REACT_NATIVE_VERSION: versionOf("react-native"),
187
- ...process.env,
188
- ...env,
189
- },
190
- });
240
+ // Run only one Gradle task at a time
241
+ spawnSync(gradlew, targets, { cwd: androidProject, stdio: "inherit", env });
242
+ } else {
243
+ const reactNativePath = findPackageDependencyDir("react-native");
244
+ if (!reactNativePath) {
245
+ throw new Error("Could not find 'react-native'");
246
+ }
191
247
 
192
- const destination = path.join(context.options.assetsDest, "aar");
193
- await fs.ensureDir(destination);
248
+ const buildDir = path.join(
249
+ process.cwd(),
250
+ "node_modules",
251
+ ".rnx-gradle-build",
252
+ targetName
253
+ );
254
+
255
+ const compileSdkVersion =
256
+ android?.compileSdkVersion ?? defaultAndroidConfig.compileSdkVersion;
257
+ const minSdkVersion =
258
+ android?.defaultConfig?.minSdkVersion ??
259
+ defaultAndroidConfig.defaultConfig.minSdkVersion;
260
+ const targetSdkVersion =
261
+ android?.defaultConfig?.targetSdkVersion ??
262
+ defaultAndroidConfig.defaultConfig.targetSdkVersion;
263
+ const androidPluginVersion =
264
+ android?.androidPluginVersion ??
265
+ defaultAndroidConfig.androidPluginVersion;
266
+ const buildRelativeReactNativePath = path.relative(
267
+ buildDir,
268
+ reactNativePath
269
+ );
270
+
271
+ const buildGradle = [
272
+ "buildscript {",
273
+ " ext {",
274
+ ` compileSdkVersion = ${compileSdkVersion}`,
275
+ ` minSdkVersion = ${minSdkVersion}`,
276
+ ` targetSdkVersion = ${targetSdkVersion}`,
277
+ ` androidPluginVersion = "${androidPluginVersion}"`,
278
+ " }",
279
+ "",
280
+ " repositories {",
281
+ " mavenCentral()",
282
+ " google()",
283
+ " }",
284
+ "",
285
+ " dependencies {",
286
+ ' classpath("com.android.tools.build:gradle:${project.ext.androidPluginVersion}")',
287
+ " }",
288
+ "}",
289
+ "",
290
+ "allprojects {",
291
+ " repositories {",
292
+ " maven {",
293
+ " // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm",
294
+ ` url("\${rootDir}/${buildRelativeReactNativePath}/android")`,
295
+ " }",
296
+ " mavenCentral()",
297
+ " google()",
298
+ " }",
299
+ "}",
300
+ "",
301
+ ].join("\n");
302
+
303
+ const gradleProperties = "android.useAndroidX=true\n";
304
+
305
+ const settingsGradle = [
306
+ `include(":${targetName}")`,
307
+ `project(":${targetName}").projectDir = file("${androidProject}")`,
308
+ "",
309
+ ].join("\n");
310
+
311
+ await fs.ensureDir(buildDir);
312
+ await fs.writeFile(path.join(buildDir, "build.gradle"), buildGradle);
313
+ await fs.writeFile(
314
+ path.join(buildDir, "gradle.properties"),
315
+ gradleProperties
316
+ );
317
+ await fs.writeFile(path.join(buildDir, "settings.gradle"), settingsGradle);
318
+
319
+ // Run only one Gradle task at a time
320
+ spawnSync(gradlew, targets, { cwd: buildDir, stdio: "inherit", env });
321
+ }
194
322
 
195
- const aarVersion = version || versionOf(packageName);
196
- const dest = path.join(destination, `${targetName}-${aarVersion}.aar`);
197
- await Promise.all([
198
- fs.copy(output, dest),
199
- ...targetsToCopy.map(([src, dest]) => fs.copy(src, dest)),
200
- ]);
323
+ await Promise.all(targetsToCopy.map(([src, dest]) => fs.copy(src, dest)));
201
324
  }
202
325
 
203
326
  async function copyFiles(files: unknown, destination: string): Promise<void> {
@@ -109,14 +109,14 @@ const emptySerializerHook = (_graph: Graph, _delta: DeltaResult): void => {
109
109
  * @param detectCyclicDependencies When true, cyclic dependency checking is enabled with a default set of options. Otherwise the object allows for fine-grained control over the detection process.
110
110
  * @param detectDuplicateDependencies When true, duplicate dependency checking is enabled with a default set of options. Otherwise, the object allows for fine-grained control over the detection process.
111
111
  * @param typescriptValidation When true, TypeScript type-checking is enabled with a default set of options. Otherwise, the object allows for fine-grained control over the type-checking process.
112
- * @param experimental_treeShake When true, experimental tree shaking is enabled.
112
+ * @param treeShake When true, tree shaking is enabled.
113
113
  */
114
114
  export function customizeMetroConfig(
115
115
  metroConfigReadonly: InputConfigT,
116
116
  detectCyclicDependencies: boolean | CyclicDetectorOptions,
117
117
  detectDuplicateDependencies: boolean | DuplicateDetectorOptions,
118
118
  typescriptValidation: boolean | TypeScriptValidationOptions,
119
- experimental_treeShake: boolean
119
+ treeShake: boolean
120
120
  ): void {
121
121
  // We will be making changes to the Metro configuration. Coerce from a
122
122
  // type with readonly props to a type where the props are writeable.
@@ -134,7 +134,7 @@ export function customizeMetroConfig(
134
134
  plugins.push(CyclicDependencies());
135
135
  }
136
136
 
137
- if (experimental_treeShake) {
137
+ if (treeShake) {
138
138
  metroConfig.serializer.customSerializer = MetroSerializerEsbuild(plugins);
139
139
  Object.assign(metroConfig.transformer, esbuildTransformerConfig);
140
140
  } else if (plugins.length > 0) {
package/src/start.ts CHANGED
@@ -17,6 +17,19 @@ import { customizeMetroConfig } from "./metro-config";
17
17
  import { getKitServerConfig } from "./serve/kit-config";
18
18
  import type { TypeScriptValidationOptions } from "./types";
19
19
 
20
+ type DevServerMiddleware = ReturnType<
21
+ typeof CliServerApi["createDevServerMiddleware"]
22
+ >;
23
+
24
+ type DevServer = ReturnType<DevServerMiddleware["attachToServer"]>;
25
+
26
+ type DevServerMiddleware7 = Pick<DevServerMiddleware, "middleware"> & {
27
+ websocketEndpoints: unknown;
28
+ debuggerProxyEndpoint: DevServer["debuggerProxy"];
29
+ messageSocketEndpoint: DevServer["messageSocket"];
30
+ eventsSocketEndpoint: DevServer["eventsSocket"];
31
+ };
32
+
20
33
  export type CLIStartOptions = {
21
34
  host: string;
22
35
  port: number;
@@ -44,6 +57,12 @@ function friendlyRequire<T>(module: string): T {
44
57
  }
45
58
  }
46
59
 
60
+ function hasWebsocketEndpoints(
61
+ devServer: DevServerMiddleware | DevServerMiddleware7
62
+ ): devServer is DevServerMiddleware7 {
63
+ return !("attachToServer" in devServer);
64
+ }
65
+
47
66
  export async function rnxStart(
48
67
  _argv: Array<string>,
49
68
  cliConfig: CLIConfig,
@@ -131,16 +150,17 @@ export async function rnxStart(
131
150
  serverConfig.detectCyclicDependencies,
132
151
  serverConfig.detectDuplicateDependencies,
133
152
  serverConfig.typescriptValidation ? typescriptValidationOptions : false,
134
- serverConfig.experimental_treeShake
153
+ serverConfig.treeShake
135
154
  );
136
155
 
137
156
  // create middleware -- a collection of plugins which handle incoming
138
157
  // http(s) requests, routing them to static pages or JS functions.
139
- const { middleware, attachToServer } = createDevServerMiddleware({
158
+ const devServer = createDevServerMiddleware({
140
159
  host: cliOptions.host,
141
160
  port: metroConfig.server.port,
142
161
  watchFolders: metroConfig.watchFolders,
143
162
  });
163
+ const middleware = devServer.middleware;
144
164
  middleware.use(indexPageMiddleware);
145
165
 
146
166
  // merge the Metro config middleware with our middleware
@@ -158,17 +178,37 @@ export async function rnxStart(
158
178
  );
159
179
  };
160
180
 
181
+ // `createDevServerMiddleware` changed its return type in
182
+ // https://github.com/react-native-community/cli/pull/1560
183
+ let websocketEndpoints: unknown = undefined;
184
+ let messageSocketEndpoint: DevServer["messageSocket"];
185
+
186
+ if (hasWebsocketEndpoints(devServer)) {
187
+ websocketEndpoints = devServer.websocketEndpoints;
188
+ messageSocketEndpoint = devServer.messageSocketEndpoint;
189
+
190
+ // bind our `reportEvent` delegate to the Metro server
191
+ reportEventDelegate = devServer.eventsSocketEndpoint.reportEvent;
192
+ }
193
+
161
194
  // start the Metro server
162
- const serverInstance = await startServer(metroConfig, {
195
+ const serverOptions = {
163
196
  host: cliOptions.host,
164
197
  secure: cliOptions.https,
165
198
  secureCert: cliOptions.cert,
166
199
  secureKey: cliOptions.key,
167
- });
168
- const { messageSocket, eventsSocket } = attachToServer(serverInstance);
200
+ websocketEndpoints,
201
+ };
202
+ const serverInstance = await startServer(metroConfig, serverOptions);
203
+
204
+ if (!hasWebsocketEndpoints(devServer)) {
205
+ const { messageSocket, eventsSocket } =
206
+ devServer.attachToServer(serverInstance);
207
+ messageSocketEndpoint = messageSocket;
169
208
 
170
- // bind our `reportEvent` delegate to the Metro server
171
- reportEventDelegate = eventsSocket.reportEvent;
209
+ // bind our `reportEvent` delegate to the Metro server
210
+ reportEventDelegate = eventsSocket.reportEvent;
211
+ }
172
212
 
173
213
  // In Node 8, the default keep-alive for an HTTP connection is 5 seconds. In
174
214
  // early versions of Node 8, this was implemented in a buggy way which caused
@@ -217,12 +257,12 @@ export async function rnxStart(
217
257
 
218
258
  case "d":
219
259
  terminal.log(chalk.green("Opening developer menu..."));
220
- messageSocket.broadcast("devMenu", undefined);
260
+ messageSocketEndpoint.broadcast("devMenu", undefined);
221
261
  break;
222
262
 
223
263
  case "r":
224
264
  terminal.log(chalk.green("Reloading app..."));
225
- messageSocket.broadcast("reload", undefined);
265
+ messageSocketEndpoint.broadcast("reload", undefined);
226
266
  break;
227
267
  }
228
268
  }
package/src/test.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { Config as CLIConfig } from "@react-native-community/cli-types";
2
+ import { findPackageDependencyDir } from "@rnx-kit/tools-node";
2
3
  import { parsePlatform } from "@rnx-kit/tools-react-native/platform";
3
4
  import { run as runJest } from "jest-cli";
4
- import path from "path";
5
5
 
6
6
  type Args = {
7
7
  platform: "android" | "ios" | "macos" | "windows" | "win32";
@@ -54,8 +54,8 @@ function jestOptions(): Options[] {
54
54
  //
55
55
  // To work around this, resolve `jest-cli` first, then use the resolved path
56
56
  // to import `./build/cli/args`.
57
- const jestPath = require.resolve("jest-cli/package.json");
58
- const { options } = require(`${path.dirname(jestPath)}/build/cli/args`);
57
+ const jestPath = findPackageDependencyDir("jest-cli") || "jest-cli";
58
+ const { options } = require(`${jestPath}/build/cli/args`);
59
59
 
60
60
  return Object.keys(options).map((option) => {
61
61
  const { default: defaultValue, description, type } = options[option];
@@ -0,0 +1,5 @@
1
+ const child_process = jest.createMockFromModule("child_process");
2
+
3
+ child_process.spawnSync(() => undefined);
4
+
5
+ module.exports = child_process;