@rock-js/plugin-brownfield-ios 0.8.13

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/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # @rock-js/plugin-brownfield-ios
2
+
3
+ iOS brownfield integration plugin for Rock (Rock). This package is part of the Rock ecosystem and provides tools for integrating React Native into existing iOS applications.
4
+
5
+ ## Documentation
6
+
7
+ For detailed documentation about Rock and its tools, visit [Rock Documentation](https://rockjs.dev)
@@ -0,0 +1 @@
1
+ export * from './lib/pluginBrownfieldIos.js';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './lib/pluginBrownfieldIos.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function copyHermesXcframework({ sourceDir, destinationDir, }: {
2
+ sourceDir: string;
3
+ destinationDir: string;
4
+ }): void;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copyHermesXcframework.d.ts","sourceRoot":"","sources":["../../../src/lib/copyHermesXcframework.ts"],"names":[],"mappings":"AAIA,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,cAAc,GACf,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB,QAqBA"}
@@ -0,0 +1,15 @@
1
+ import fs, { existsSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { color, logger, spinner } from '@rock-js/tools';
4
+ export function copyHermesXcframework({ sourceDir, destinationDir, }) {
5
+ const loader = spinner();
6
+ loader.start(`Copying ${color.bold('hermes.xcframework')}`);
7
+ const hermesDestination = path.join(destinationDir, 'hermes.xcframework');
8
+ if (existsSync(hermesDestination)) {
9
+ logger.debug(`Removing old hermes copy`);
10
+ fs.rmSync(hermesDestination, { recursive: true, force: true });
11
+ }
12
+ fs.cpSync(path.join(sourceDir, 'Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework'), hermesDestination, { recursive: true, force: true });
13
+ loader.stop(`Copied ${color.bold('hermes.xcframework')}`);
14
+ }
15
+ //# sourceMappingURL=copyHermesXcframework.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copyHermesXcframework.js","sourceRoot":"","sources":["../../../src/lib/copyHermesXcframework.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,UAAU,qBAAqB,CAAC,EACpC,SAAS,EACT,cAAc,GAIf;IACC,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;IAEzB,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC5D,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC;IAE1E,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACzC,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,EAAE,CAAC,MAAM,CACP,IAAI,CAAC,IAAI,CACP,SAAS,EACT,6EAA6E,CAC9E,EACD,iBAAiB,EACjB,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CACjC,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Xcode emits different `.framework` file based on the destination (simulator arm64/x86_64, iphone arm64 etc.)
3
+ * This takes those `.frameworks` files and merges them to a single `.xcframework` file for easier distribution.
4
+ */
5
+ export declare function mergeFrameworks({ frameworkPaths, outputPath, sourceDir, }: {
6
+ frameworkPaths: string[];
7
+ outputPath: string;
8
+ sourceDir: string;
9
+ }): Promise<void>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeFrameworks.d.ts","sourceRoot":"","sources":["../../../src/lib/mergeFrameworks.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAsB,eAAe,CAAC,EACpC,cAAc,EACd,UAAU,EACV,SAAS,GACV,EAAE;IACD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,iBA4BA"}
@@ -0,0 +1,33 @@
1
+ import fs, { existsSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { color, logger, spawn, spinner } from '@rock-js/tools';
4
+ /**
5
+ * Xcode emits different `.framework` file based on the destination (simulator arm64/x86_64, iphone arm64 etc.)
6
+ * This takes those `.frameworks` files and merges them to a single `.xcframework` file for easier distribution.
7
+ */
8
+ export async function mergeFrameworks({ frameworkPaths, outputPath, sourceDir, }) {
9
+ const loader = spinner();
10
+ const xcframeworkName = path.basename(outputPath);
11
+ if (existsSync(outputPath)) {
12
+ logger.debug(`Removing `);
13
+ fs.rmSync(outputPath, { recursive: true, force: true });
14
+ }
15
+ loader.start(`Creating ${color.bold(xcframeworkName)}`);
16
+ const xcodebuildArgs = [
17
+ '-create-xcframework',
18
+ ...frameworkPaths.flatMap((frameworkPath) => ['-framework', frameworkPath]),
19
+ '-output',
20
+ outputPath,
21
+ ];
22
+ try {
23
+ await spawn('xcodebuild', xcodebuildArgs, { cwd: sourceDir });
24
+ loader.stop(`Created ${color.bold(xcframeworkName)}`);
25
+ }
26
+ catch (error) {
27
+ loader.stop(`Couldn't create ${color.bold(xcframeworkName)}.`, 1);
28
+ throw new Error('Running xcodebuild failed', {
29
+ cause: error.stderr,
30
+ });
31
+ }
32
+ }
33
+ //# sourceMappingURL=mergeFrameworks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeFrameworks.js","sourceRoot":"","sources":["../../../src/lib/mergeFrameworks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE/D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,cAAc,EACd,UAAU,EACV,SAAS,GAKV;IACC,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;IACzB,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAElD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1B,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAExD,MAAM,cAAc,GAAG;QACrB,qBAAqB;QACrB,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAC3E,SAAS;QACT,UAAU;KACX,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,YAAY,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;QAE9D,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,2BAA2B,EAAE;YAC3C,KAAK,EAAG,KAAyB,CAAC,MAAM;SACzC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { IOSProjectConfig } from '@react-native-community/cli-types';
2
+ import type { PluginApi, PluginOutput } from '@rock-js/config';
3
+ export declare const pluginBrownfieldIos: (pluginConfig?: IOSProjectConfig) => (api: PluginApi) => PluginOutput;
4
+ export default pluginBrownfieldIos;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginBrownfieldIos.d.ts","sourceRoot":"","sources":["../../../src/lib/pluginBrownfieldIos.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAc5D,eAAO,MAAM,mBAAmB,kBACd,gBAAgB,WAC1B,SAAS,KAAG,YA0GjB,CAAC;AAEJ,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,71 @@
1
+ import path from 'node:path';
2
+ import { createBuild, genericDestinations, getBuildOptions, getBuildPaths, getValidProjectConfig, } from '@rock-js/platform-apple-helpers';
3
+ import { colorLink, intro, logger, outro, relativeToCwd } from '@rock-js/tools';
4
+ import { copyHermesXcframework } from './copyHermesXcframework.js';
5
+ import { mergeFrameworks } from './mergeFrameworks.js';
6
+ const buildOptions = getBuildOptions({ platformName: 'ios' });
7
+ export const pluginBrownfieldIos = (pluginConfig) => (api) => {
8
+ api.registerCommand({
9
+ name: 'package:ios',
10
+ description: 'Emit a .xcframework file from React Native code.',
11
+ action: async (args) => {
12
+ intro('Packaging iOS project');
13
+ // 1) Build the project
14
+ const projectRoot = api.getProjectRoot();
15
+ const iosConfig = getValidProjectConfig('ios', projectRoot, pluginConfig);
16
+ const { derivedDataDir } = getBuildPaths('ios');
17
+ const destination = args.destination ?? [
18
+ genericDestinations.ios.device,
19
+ genericDestinations.ios.simulator,
20
+ ];
21
+ const buildFolder = args.buildFolder ?? derivedDataDir;
22
+ const configuration = args.configuration ?? 'Debug';
23
+ const { sourceDir } = iosConfig;
24
+ const { scheme } = await createBuild({
25
+ platformName: 'ios',
26
+ projectConfig: iosConfig,
27
+ args: { ...args, destination, buildFolder },
28
+ projectRoot,
29
+ reactNativePath: api.getReactNativePath(),
30
+ fingerprintOptions: api.getFingerprintOptions(),
31
+ brownfield: true,
32
+ remoteCacheProvider: await api.getRemoteCacheProvider(),
33
+ });
34
+ // 2) Merge the .framework outputs of the framework target
35
+ const productsPath = path.join(buildFolder, 'Build', 'Products');
36
+ const { packageDir: frameworkTargetOutputDir } = getBuildPaths('ios');
37
+ await mergeFrameworks({
38
+ sourceDir,
39
+ frameworkPaths: [
40
+ path.join(productsPath, `${configuration}-iphoneos`, `${scheme}.framework`),
41
+ path.join(productsPath, `${configuration}-iphonesimulator`, `${scheme}.framework`),
42
+ ],
43
+ outputPath: path.join(frameworkTargetOutputDir, `${scheme}.xcframework`),
44
+ });
45
+ // 3) Merge React Native Brownfield paths
46
+ await mergeFrameworks({
47
+ sourceDir,
48
+ frameworkPaths: [
49
+ path.join(productsPath, `${configuration}-iphoneos`, 'ReactBrownfield', 'ReactBrownfield.framework'),
50
+ path.join(productsPath, `${configuration}-iphonesimulator`, 'ReactBrownfield', 'ReactBrownfield.framework'),
51
+ ],
52
+ outputPath: path.join(frameworkTargetOutputDir, 'ReactBrownfield.xcframework'),
53
+ });
54
+ // 4) Copy hermes xcframework to the output path
55
+ copyHermesXcframework({
56
+ sourceDir,
57
+ destinationDir: frameworkTargetOutputDir,
58
+ });
59
+ // 5) Inform the user
60
+ logger.log(`XCFrameworks are available at: ${colorLink(relativeToCwd(frameworkTargetOutputDir))}`);
61
+ outro('Success 🎉.');
62
+ },
63
+ options: buildOptions,
64
+ });
65
+ return {
66
+ name: 'plugin-brownfield-ios',
67
+ description: 'Rock plugin for brownfield iOS.',
68
+ };
69
+ };
70
+ export default pluginBrownfieldIos;
71
+ //# sourceMappingURL=pluginBrownfieldIos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginBrownfieldIos.js","sourceRoot":"","sources":["../../../src/lib/pluginBrownfieldIos.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@rock-js/plugin-brownfield-ios",
3
+ "version": "0.8.13",
4
+ "type": "module",
5
+ "types": "./dist/src/index.d.ts",
6
+ "exports": {
7
+ "types": "./dist/src/index.d.ts",
8
+ "default": "./dist/src/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "src",
13
+ "template"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc -p tsconfig.lib.json",
17
+ "dev": "tsc -p tsconfig.lib.json --watch",
18
+ "publish:npm": "npm publish --access public",
19
+ "publish:verdaccio": "npm publish --registry http://localhost:4873 --userconfig ../../.npmrc"
20
+ },
21
+ "dependencies": {
22
+ "@react-native-community/cli-config-apple": "^19.1.0",
23
+ "@react-native-community/cli-types": "^19.1.0",
24
+ "@rock-js/tools": "^0.8.13",
25
+ "@rock-js/platform-apple-helpers": "^0.8.13",
26
+ "tslib": "^2.3.0"
27
+ },
28
+ "devDependencies": {
29
+ "@rock-js/config": "^0.8.13"
30
+ },
31
+ "publishConfig": {
32
+ "access": "restricted"
33
+ }
34
+ }
@@ -0,0 +1,19 @@
1
+ import { expect, test } from 'vitest';
2
+ import { pluginBrownfieldIos } from '../lib/pluginBrownfieldIos.js';
3
+
4
+ const pluginApi = {
5
+ registerCommand: vi.fn(),
6
+ getProjectRoot: vi.fn(),
7
+ getReactNativePath: vi.fn(),
8
+ getReactNativeVersion: vi.fn(),
9
+ getPlatforms: vi.fn(),
10
+ };
11
+
12
+ test('plugin is called with correct arguments and returns its name and description', () => {
13
+ const plugin = pluginBrownfieldIos()(pluginApi);
14
+
15
+ expect(plugin).toMatchObject({
16
+ name: 'plugin-brownfield-ios',
17
+ description: 'Rock plugin for brownfield iOS.',
18
+ });
19
+ });
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './lib/pluginBrownfieldIos.js';
@@ -0,0 +1,32 @@
1
+ import fs, { existsSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { color, logger, spinner } from '@rock-js/tools';
4
+
5
+ export function copyHermesXcframework({
6
+ sourceDir,
7
+ destinationDir,
8
+ }: {
9
+ sourceDir: string;
10
+ destinationDir: string;
11
+ }) {
12
+ const loader = spinner();
13
+
14
+ loader.start(`Copying ${color.bold('hermes.xcframework')}`);
15
+ const hermesDestination = path.join(destinationDir, 'hermes.xcframework');
16
+
17
+ if (existsSync(hermesDestination)) {
18
+ logger.debug(`Removing old hermes copy`);
19
+ fs.rmSync(hermesDestination, { recursive: true, force: true });
20
+ }
21
+
22
+ fs.cpSync(
23
+ path.join(
24
+ sourceDir,
25
+ 'Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework',
26
+ ),
27
+ hermesDestination,
28
+ { recursive: true, force: true },
29
+ );
30
+
31
+ loader.stop(`Copied ${color.bold('hermes.xcframework')}`);
32
+ }
@@ -0,0 +1,46 @@
1
+ import fs, { existsSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import type { SubprocessError } from '@rock-js/tools';
4
+ import { color, logger, spawn, spinner } from '@rock-js/tools';
5
+
6
+ /**
7
+ * Xcode emits different `.framework` file based on the destination (simulator arm64/x86_64, iphone arm64 etc.)
8
+ * This takes those `.frameworks` files and merges them to a single `.xcframework` file for easier distribution.
9
+ */
10
+ export async function mergeFrameworks({
11
+ frameworkPaths,
12
+ outputPath,
13
+ sourceDir,
14
+ }: {
15
+ frameworkPaths: string[];
16
+ outputPath: string;
17
+ sourceDir: string;
18
+ }) {
19
+ const loader = spinner();
20
+ const xcframeworkName = path.basename(outputPath);
21
+
22
+ if (existsSync(outputPath)) {
23
+ logger.debug(`Removing `);
24
+ fs.rmSync(outputPath, { recursive: true, force: true });
25
+ }
26
+
27
+ loader.start(`Creating ${color.bold(xcframeworkName)}`);
28
+
29
+ const xcodebuildArgs = [
30
+ '-create-xcframework',
31
+ ...frameworkPaths.flatMap((frameworkPath) => ['-framework', frameworkPath]),
32
+ '-output',
33
+ outputPath,
34
+ ];
35
+
36
+ try {
37
+ await spawn('xcodebuild', xcodebuildArgs, { cwd: sourceDir });
38
+
39
+ loader.stop(`Created ${color.bold(xcframeworkName)}`);
40
+ } catch (error) {
41
+ loader.stop(`Couldn't create ${color.bold(xcframeworkName)}.`, 1);
42
+ throw new Error('Running xcodebuild failed', {
43
+ cause: (error as SubprocessError).stderr,
44
+ });
45
+ }
46
+ }
@@ -0,0 +1,127 @@
1
+ import path from 'node:path';
2
+ import type { IOSProjectConfig } from '@react-native-community/cli-types';
3
+ import type { PluginApi, PluginOutput } from '@rock-js/config';
4
+ import {
5
+ type BuildFlags,
6
+ createBuild,
7
+ genericDestinations,
8
+ getBuildOptions,
9
+ getBuildPaths,
10
+ getValidProjectConfig,
11
+ } from '@rock-js/platform-apple-helpers';
12
+ import { colorLink, intro, logger, outro, relativeToCwd } from '@rock-js/tools';
13
+ import { copyHermesXcframework } from './copyHermesXcframework.js';
14
+ import { mergeFrameworks } from './mergeFrameworks.js';
15
+ const buildOptions = getBuildOptions({ platformName: 'ios' });
16
+
17
+ export const pluginBrownfieldIos =
18
+ (pluginConfig?: IOSProjectConfig) =>
19
+ (api: PluginApi): PluginOutput => {
20
+ api.registerCommand({
21
+ name: 'package:ios',
22
+ description: 'Emit a .xcframework file from React Native code.',
23
+ action: async (args: BuildFlags) => {
24
+ intro('Packaging iOS project');
25
+
26
+ // 1) Build the project
27
+ const projectRoot = api.getProjectRoot();
28
+ const iosConfig = getValidProjectConfig(
29
+ 'ios',
30
+ projectRoot,
31
+ pluginConfig,
32
+ );
33
+ const { derivedDataDir } = getBuildPaths('ios');
34
+
35
+ const destination = args.destination ?? [
36
+ genericDestinations.ios.device,
37
+ genericDestinations.ios.simulator,
38
+ ];
39
+
40
+ const buildFolder = args.buildFolder ?? derivedDataDir;
41
+ const configuration = args.configuration ?? 'Debug';
42
+
43
+ const { sourceDir } = iosConfig;
44
+
45
+ const { scheme } = await createBuild({
46
+ platformName: 'ios',
47
+ projectConfig: iosConfig,
48
+ args: { ...args, destination, buildFolder },
49
+ projectRoot,
50
+ reactNativePath: api.getReactNativePath(),
51
+ fingerprintOptions: api.getFingerprintOptions(),
52
+ brownfield: true,
53
+ remoteCacheProvider: await api.getRemoteCacheProvider(),
54
+ });
55
+
56
+ // 2) Merge the .framework outputs of the framework target
57
+ const productsPath = path.join(buildFolder, 'Build', 'Products');
58
+ const { packageDir: frameworkTargetOutputDir } = getBuildPaths('ios');
59
+
60
+ await mergeFrameworks({
61
+ sourceDir,
62
+ frameworkPaths: [
63
+ path.join(
64
+ productsPath,
65
+ `${configuration}-iphoneos`,
66
+ `${scheme}.framework`,
67
+ ),
68
+ path.join(
69
+ productsPath,
70
+ `${configuration}-iphonesimulator`,
71
+ `${scheme}.framework`,
72
+ ),
73
+ ],
74
+ outputPath: path.join(
75
+ frameworkTargetOutputDir,
76
+ `${scheme}.xcframework`,
77
+ ),
78
+ });
79
+
80
+ // 3) Merge React Native Brownfield paths
81
+ await mergeFrameworks({
82
+ sourceDir,
83
+ frameworkPaths: [
84
+ path.join(
85
+ productsPath,
86
+ `${configuration}-iphoneos`,
87
+ 'ReactBrownfield',
88
+ 'ReactBrownfield.framework',
89
+ ),
90
+ path.join(
91
+ productsPath,
92
+ `${configuration}-iphonesimulator`,
93
+ 'ReactBrownfield',
94
+ 'ReactBrownfield.framework',
95
+ ),
96
+ ],
97
+ outputPath: path.join(
98
+ frameworkTargetOutputDir,
99
+ 'ReactBrownfield.xcframework',
100
+ ),
101
+ });
102
+
103
+ // 4) Copy hermes xcframework to the output path
104
+ copyHermesXcframework({
105
+ sourceDir,
106
+ destinationDir: frameworkTargetOutputDir,
107
+ });
108
+
109
+ // 5) Inform the user
110
+ logger.log(
111
+ `XCFrameworks are available at: ${colorLink(
112
+ relativeToCwd(frameworkTargetOutputDir),
113
+ )}`,
114
+ );
115
+
116
+ outro('Success 🎉.');
117
+ },
118
+ options: buildOptions,
119
+ });
120
+
121
+ return {
122
+ name: 'plugin-brownfield-ios',
123
+ description: 'Rock plugin for brownfield iOS.',
124
+ };
125
+ };
126
+
127
+ export default pluginBrownfieldIos;
@@ -0,0 +1,734 @@
1
+ // !$*UTF8*$!
2
+ {
3
+ archiveVersion = 1;
4
+ classes = {
5
+ };
6
+ objectVersion = 54;
7
+ objects = {
8
+
9
+ /* Begin PBXBuildFile section */
10
+ 0C80B921A6F3F58F76C31292 /* libPods-HelloWorld.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-HelloWorld.a */; };
11
+ 13B07FBC1A68108700A75B9A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.swift */; };
12
+ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13
+ 20D164A02D4D80800039A91E /* HelloWorldReact.h in Headers */ = {isa = PBXBuildFile; fileRef = 20D1649E2D4D80800039A91E /* HelloWorldReact.h */; settings = {ATTRIBUTES = (Public, ); }; };
14
+ 20D164A22D4D80990039A91E /* HelloWorldReact.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20D164A12D4D80950039A91E /* HelloWorldReact.swift */; };
15
+ 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
16
+ B16C603D25A2E5456D38112F /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; };
17
+ EDA002E0DFA8527FF5D5842C /* libPods-HelloWorld-HelloWorldReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D06AE30BEEBAE62C7FEE7CE3 /* libPods-HelloWorld-HelloWorldReact.a */; };
18
+ /* End PBXBuildFile section */
19
+
20
+ /* Begin PBXFileReference section */
21
+ 13B07F961A680F5B00A75B9A /* HelloWorld.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HelloWorld.app; sourceTree = BUILT_PRODUCTS_DIR; };
22
+ 13B07FB01A68108700A75B9A /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = HelloWorld/AppDelegate.swift; sourceTree = "<group>"; };
23
+ 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = HelloWorld/Images.xcassets; sourceTree = "<group>"; };
24
+ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = HelloWorld/Info.plist; sourceTree = "<group>"; };
25
+ 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = HelloWorld/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
26
+ 20D1648D2D4D7FAF0039A91E /* HelloWorldReact.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = HelloWorldReact.framework; sourceTree = BUILT_PRODUCTS_DIR; };
27
+ 20D1649E2D4D80800039A91E /* HelloWorldReact.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HelloWorldReact.h; sourceTree = "<group>"; };
28
+ 20D164A12D4D80950039A91E /* HelloWorldReact.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HelloWorldReact.swift; sourceTree = "<group>"; };
29
+ 25056119C0BDA4CDB86B24D9 /* Pods-HelloWorld-HelloWorldReact.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloWorld-HelloWorldReact.release.xcconfig"; path = "Target Support Files/Pods-HelloWorld-HelloWorldReact/Pods-HelloWorld-HelloWorldReact.release.xcconfig"; sourceTree = "<group>"; };
30
+ 3B4392A12AC88292D35C810B /* Pods-HelloWorld.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloWorld.debug.xcconfig"; path = "Target Support Files/Pods-HelloWorld/Pods-HelloWorld.debug.xcconfig"; sourceTree = "<group>"; };
31
+ 4D838915DF00B87281042637 /* Pods-HelloWorld-HelloWorldReact.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloWorld-HelloWorldReact.debug.xcconfig"; path = "Target Support Files/Pods-HelloWorld-HelloWorldReact/Pods-HelloWorld-HelloWorldReact.debug.xcconfig"; sourceTree = "<group>"; };
32
+ 5709B34CF0A7D63546082F79 /* Pods-HelloWorld.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloWorld.release.xcconfig"; path = "Target Support Files/Pods-HelloWorld/Pods-HelloWorld.release.xcconfig"; sourceTree = "<group>"; };
33
+ 5DCACB8F33CDC322A6C60F78 /* libPods-HelloWorld.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HelloWorld.a"; sourceTree = BUILT_PRODUCTS_DIR; };
34
+ 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = HelloWorld/LaunchScreen.storyboard; sourceTree = "<group>"; };
35
+ D06AE30BEEBAE62C7FEE7CE3 /* libPods-HelloWorld-HelloWorldReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HelloWorld-HelloWorldReact.a"; sourceTree = BUILT_PRODUCTS_DIR; };
36
+ ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
37
+ /* End PBXFileReference section */
38
+
39
+ /* Begin PBXFrameworksBuildPhase section */
40
+ 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
41
+ isa = PBXFrameworksBuildPhase;
42
+ buildActionMask = 2147483647;
43
+ files = (
44
+ 0C80B921A6F3F58F76C31292 /* libPods-HelloWorld.a in Frameworks */,
45
+ );
46
+ runOnlyForDeploymentPostprocessing = 0;
47
+ };
48
+ 20D1648A2D4D7FAF0039A91E /* Frameworks */ = {
49
+ isa = PBXFrameworksBuildPhase;
50
+ buildActionMask = 2147483647;
51
+ files = (
52
+ EDA002E0DFA8527FF5D5842C /* libPods-HelloWorld-HelloWorldReact.a in Frameworks */,
53
+ );
54
+ runOnlyForDeploymentPostprocessing = 0;
55
+ };
56
+ /* End PBXFrameworksBuildPhase section */
57
+
58
+ /* Begin PBXGroup section */
59
+ 13B07FAE1A68108700A75B9A /* HelloWorld */ = {
60
+ isa = PBXGroup;
61
+ children = (
62
+ 13B07FB01A68108700A75B9A /* AppDelegate.swift */,
63
+ 13B07FB51A68108700A75B9A /* Images.xcassets */,
64
+ 13B07FB61A68108700A75B9A /* Info.plist */,
65
+ 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */,
66
+ 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */,
67
+ );
68
+ name = HelloWorld;
69
+ sourceTree = "<group>";
70
+ };
71
+ 20D1649F2D4D80800039A91E /* HelloWorldReact */ = {
72
+ isa = PBXGroup;
73
+ children = (
74
+ 20D1649E2D4D80800039A91E /* HelloWorldReact.h */,
75
+ 20D164A12D4D80950039A91E /* HelloWorldReact.swift */,
76
+ );
77
+ path = HelloWorldReact;
78
+ sourceTree = "<group>";
79
+ };
80
+ 2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
81
+ isa = PBXGroup;
82
+ children = (
83
+ ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
84
+ 5DCACB8F33CDC322A6C60F78 /* libPods-HelloWorld.a */,
85
+ D06AE30BEEBAE62C7FEE7CE3 /* libPods-HelloWorld-HelloWorldReact.a */,
86
+ );
87
+ name = Frameworks;
88
+ sourceTree = "<group>";
89
+ };
90
+ 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
91
+ isa = PBXGroup;
92
+ children = (
93
+ );
94
+ name = Libraries;
95
+ sourceTree = "<group>";
96
+ };
97
+ 83CBB9F61A601CBA00E9B192 = {
98
+ isa = PBXGroup;
99
+ children = (
100
+ 13B07FAE1A68108700A75B9A /* HelloWorld */,
101
+ 832341AE1AAA6A7D00B99B32 /* Libraries */,
102
+ 20D1649F2D4D80800039A91E /* HelloWorldReact */,
103
+ 83CBBA001A601CBA00E9B192 /* Products */,
104
+ 2D16E6871FA4F8E400B85C8A /* Frameworks */,
105
+ BBD78D7AC51CEA395F1C20DB /* Pods */,
106
+ );
107
+ indentWidth = 2;
108
+ sourceTree = "<group>";
109
+ tabWidth = 2;
110
+ usesTabs = 0;
111
+ };
112
+ 83CBBA001A601CBA00E9B192 /* Products */ = {
113
+ isa = PBXGroup;
114
+ children = (
115
+ 13B07F961A680F5B00A75B9A /* HelloWorld.app */,
116
+ 20D1648D2D4D7FAF0039A91E /* HelloWorldReact.framework */,
117
+ );
118
+ name = Products;
119
+ sourceTree = "<group>";
120
+ };
121
+ BBD78D7AC51CEA395F1C20DB /* Pods */ = {
122
+ isa = PBXGroup;
123
+ children = (
124
+ 3B4392A12AC88292D35C810B /* Pods-HelloWorld.debug.xcconfig */,
125
+ 5709B34CF0A7D63546082F79 /* Pods-HelloWorld.release.xcconfig */,
126
+ 4D838915DF00B87281042637 /* Pods-HelloWorld-HelloWorldReact.debug.xcconfig */,
127
+ 25056119C0BDA4CDB86B24D9 /* Pods-HelloWorld-HelloWorldReact.release.xcconfig */,
128
+ );
129
+ path = Pods;
130
+ sourceTree = "<group>";
131
+ };
132
+ /* End PBXGroup section */
133
+
134
+ /* Begin PBXHeadersBuildPhase section */
135
+ 20D164882D4D7FAF0039A91E /* Headers */ = {
136
+ isa = PBXHeadersBuildPhase;
137
+ buildActionMask = 2147483647;
138
+ files = (
139
+ 20D164A02D4D80800039A91E /* HelloWorldReact.h in Headers */,
140
+ );
141
+ runOnlyForDeploymentPostprocessing = 0;
142
+ };
143
+ /* End PBXHeadersBuildPhase section */
144
+
145
+ /* Begin PBXNativeTarget section */
146
+ 13B07F861A680F5B00A75B9A /* HelloWorld */ = {
147
+ isa = PBXNativeTarget;
148
+ buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "HelloWorld" */;
149
+ buildPhases = (
150
+ C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */,
151
+ 13B07F871A680F5B00A75B9A /* Sources */,
152
+ 13B07F8C1A680F5B00A75B9A /* Frameworks */,
153
+ 13B07F8E1A680F5B00A75B9A /* Resources */,
154
+ 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
155
+ 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */,
156
+ E235C05ADACE081382539298 /* [CP] Copy Pods Resources */,
157
+ );
158
+ buildRules = (
159
+ );
160
+ dependencies = (
161
+ );
162
+ name = HelloWorld;
163
+ productName = HelloWorld;
164
+ productReference = 13B07F961A680F5B00A75B9A /* HelloWorld.app */;
165
+ productType = "com.apple.product-type.application";
166
+ };
167
+ 20D1648C2D4D7FAF0039A91E /* HelloWorldReact */ = {
168
+ isa = PBXNativeTarget;
169
+ buildConfigurationList = 20D164992D4D7FB00039A91E /* Build configuration list for PBXNativeTarget "HelloWorldReact" */;
170
+ buildPhases = (
171
+ F59A31FD70D7E14811933F49 /* [CP] Check Pods Manifest.lock */,
172
+ 20D164882D4D7FAF0039A91E /* Headers */,
173
+ 20D164892D4D7FAF0039A91E /* Sources */,
174
+ 20D1648A2D4D7FAF0039A91E /* Frameworks */,
175
+ 20D1648B2D4D7FAF0039A91E /* Resources */,
176
+ 20D164A32D4D82600039A91E /* Bundle React Native code and images */,
177
+ 719E89ABC518E1BDB658B808 /* [CP] Copy Pods Resources */,
178
+ );
179
+ buildRules = (
180
+ );
181
+ dependencies = (
182
+ );
183
+ name = HelloWorldReact;
184
+ productName = HelloWorldReact;
185
+ productReference = 20D1648D2D4D7FAF0039A91E /* HelloWorldReact.framework */;
186
+ productType = "com.apple.product-type.framework";
187
+ };
188
+ /* End PBXNativeTarget section */
189
+
190
+ /* Begin PBXProject section */
191
+ 83CBB9F71A601CBA00E9B192 /* Project object */ = {
192
+ isa = PBXProject;
193
+ attributes = {
194
+ LastUpgradeCheck = 1210;
195
+ TargetAttributes = {
196
+ 13B07F861A680F5B00A75B9A = {
197
+ LastSwiftMigration = 1120;
198
+ };
199
+ 20D1648C2D4D7FAF0039A91E = {
200
+ CreatedOnToolsVersion = 16.0;
201
+ LastSwiftMigration = 1600;
202
+ };
203
+ };
204
+ };
205
+ buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "HelloWorld" */;
206
+ compatibilityVersion = "Xcode 12.0";
207
+ developmentRegion = en;
208
+ hasScannedForEncodings = 0;
209
+ knownRegions = (
210
+ en,
211
+ Base,
212
+ );
213
+ mainGroup = 83CBB9F61A601CBA00E9B192;
214
+ productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
215
+ projectDirPath = "";
216
+ projectRoot = "";
217
+ targets = (
218
+ 13B07F861A680F5B00A75B9A /* HelloWorld */,
219
+ 20D1648C2D4D7FAF0039A91E /* HelloWorldReact */,
220
+ );
221
+ };
222
+ /* End PBXProject section */
223
+
224
+ /* Begin PBXResourcesBuildPhase section */
225
+ 13B07F8E1A680F5B00A75B9A /* Resources */ = {
226
+ isa = PBXResourcesBuildPhase;
227
+ buildActionMask = 2147483647;
228
+ files = (
229
+ 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */,
230
+ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
231
+ B16C603D25A2E5456D38112F /* PrivacyInfo.xcprivacy in Resources */,
232
+ );
233
+ runOnlyForDeploymentPostprocessing = 0;
234
+ };
235
+ 20D1648B2D4D7FAF0039A91E /* Resources */ = {
236
+ isa = PBXResourcesBuildPhase;
237
+ buildActionMask = 2147483647;
238
+ files = (
239
+ );
240
+ runOnlyForDeploymentPostprocessing = 0;
241
+ };
242
+ /* End PBXResourcesBuildPhase section */
243
+
244
+ /* Begin PBXShellScriptBuildPhase section */
245
+ 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
246
+ isa = PBXShellScriptBuildPhase;
247
+ buildActionMask = 2147483647;
248
+ files = (
249
+ );
250
+ inputPaths = (
251
+ "$(SRCROOT)/.xcode.env.local",
252
+ "$(SRCROOT)/.xcode.env",
253
+ );
254
+ name = "Bundle React Native code and images";
255
+ outputPaths = (
256
+ );
257
+ runOnlyForDeploymentPostprocessing = 0;
258
+ shellPath = /bin/sh;
259
+ shellScript = "set -e\nif [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env.local\"\nfi\nexport CONFIG_CMD=\"dummy-workaround-value\"\nexport CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('rock/package.json')) + '/dist/src/bin.js'\")\"\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n";
260
+ };
261
+ 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = {
262
+ isa = PBXShellScriptBuildPhase;
263
+ buildActionMask = 2147483647;
264
+ files = (
265
+ );
266
+ inputFileListPaths = (
267
+ "${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-frameworks-${CONFIGURATION}-input-files.xcfilelist",
268
+ );
269
+ name = "[CP] Embed Pods Frameworks";
270
+ outputFileListPaths = (
271
+ "${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-frameworks-${CONFIGURATION}-output-files.xcfilelist",
272
+ );
273
+ runOnlyForDeploymentPostprocessing = 0;
274
+ shellPath = /bin/sh;
275
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-frameworks.sh\"\n";
276
+ showEnvVarsInLog = 0;
277
+ };
278
+ 20D164A32D4D82600039A91E /* Bundle React Native code and images */ = {
279
+ isa = PBXShellScriptBuildPhase;
280
+ buildActionMask = 2147483647;
281
+ files = (
282
+ );
283
+ inputFileListPaths = (
284
+ );
285
+ inputPaths = (
286
+ "$(SRCROOT)/.xcode.env.local",
287
+ "$(SRCROOT)/.xcode.env",
288
+ );
289
+ name = "Bundle React Native code and images";
290
+ outputFileListPaths = (
291
+ );
292
+ outputPaths = (
293
+ );
294
+ runOnlyForDeploymentPostprocessing = 0;
295
+ shellPath = /bin/sh;
296
+ shellScript = "set -e\nif [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env.local\"\nfi\nexport CONFIG_CMD=\"dummy-workaround-value\"\nexport CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('rock/package.json')) + '/dist/src/bin.js'\")\"\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n";
297
+ };
298
+ 719E89ABC518E1BDB658B808 /* [CP] Copy Pods Resources */ = {
299
+ isa = PBXShellScriptBuildPhase;
300
+ buildActionMask = 2147483647;
301
+ files = (
302
+ );
303
+ inputFileListPaths = (
304
+ "${PODS_ROOT}/Target Support Files/Pods-HelloWorld-HelloWorldReact/Pods-HelloWorld-HelloWorldReact-resources-${CONFIGURATION}-input-files.xcfilelist",
305
+ );
306
+ name = "[CP] Copy Pods Resources";
307
+ outputFileListPaths = (
308
+ "${PODS_ROOT}/Target Support Files/Pods-HelloWorld-HelloWorldReact/Pods-HelloWorld-HelloWorldReact-resources-${CONFIGURATION}-output-files.xcfilelist",
309
+ );
310
+ runOnlyForDeploymentPostprocessing = 0;
311
+ shellPath = /bin/sh;
312
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HelloWorld-HelloWorldReact/Pods-HelloWorld-HelloWorldReact-resources.sh\"\n";
313
+ showEnvVarsInLog = 0;
314
+ };
315
+ C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = {
316
+ isa = PBXShellScriptBuildPhase;
317
+ buildActionMask = 2147483647;
318
+ files = (
319
+ );
320
+ inputFileListPaths = (
321
+ );
322
+ inputPaths = (
323
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
324
+ "${PODS_ROOT}/Manifest.lock",
325
+ );
326
+ name = "[CP] Check Pods Manifest.lock";
327
+ outputFileListPaths = (
328
+ );
329
+ outputPaths = (
330
+ "$(DERIVED_FILE_DIR)/Pods-HelloWorld-checkManifestLockResult.txt",
331
+ );
332
+ runOnlyForDeploymentPostprocessing = 0;
333
+ shellPath = /bin/sh;
334
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
335
+ showEnvVarsInLog = 0;
336
+ };
337
+ E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = {
338
+ isa = PBXShellScriptBuildPhase;
339
+ buildActionMask = 2147483647;
340
+ files = (
341
+ );
342
+ inputFileListPaths = (
343
+ "${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-resources-${CONFIGURATION}-input-files.xcfilelist",
344
+ );
345
+ name = "[CP] Copy Pods Resources";
346
+ outputFileListPaths = (
347
+ "${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-resources-${CONFIGURATION}-output-files.xcfilelist",
348
+ );
349
+ runOnlyForDeploymentPostprocessing = 0;
350
+ shellPath = /bin/sh;
351
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HelloWorld/Pods-HelloWorld-resources.sh\"\n";
352
+ showEnvVarsInLog = 0;
353
+ };
354
+ F59A31FD70D7E14811933F49 /* [CP] Check Pods Manifest.lock */ = {
355
+ isa = PBXShellScriptBuildPhase;
356
+ buildActionMask = 2147483647;
357
+ files = (
358
+ );
359
+ inputFileListPaths = (
360
+ );
361
+ inputPaths = (
362
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
363
+ "${PODS_ROOT}/Manifest.lock",
364
+ );
365
+ name = "[CP] Check Pods Manifest.lock";
366
+ outputFileListPaths = (
367
+ );
368
+ outputPaths = (
369
+ "$(DERIVED_FILE_DIR)/Pods-HelloWorld-HelloWorldReact-checkManifestLockResult.txt",
370
+ );
371
+ runOnlyForDeploymentPostprocessing = 0;
372
+ shellPath = /bin/sh;
373
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
374
+ showEnvVarsInLog = 0;
375
+ };
376
+ /* End PBXShellScriptBuildPhase section */
377
+
378
+ /* Begin PBXSourcesBuildPhase section */
379
+ 13B07F871A680F5B00A75B9A /* Sources */ = {
380
+ isa = PBXSourcesBuildPhase;
381
+ buildActionMask = 2147483647;
382
+ files = (
383
+ 13B07FBC1A68108700A75B9A /* AppDelegate.swift in Sources */,
384
+ );
385
+ runOnlyForDeploymentPostprocessing = 0;
386
+ };
387
+ 20D164892D4D7FAF0039A91E /* Sources */ = {
388
+ isa = PBXSourcesBuildPhase;
389
+ buildActionMask = 2147483647;
390
+ files = (
391
+ 20D164A22D4D80990039A91E /* HelloWorldReact.swift in Sources */,
392
+ );
393
+ runOnlyForDeploymentPostprocessing = 0;
394
+ };
395
+ /* End PBXSourcesBuildPhase section */
396
+
397
+ /* Begin XCBuildConfiguration section */
398
+ 13B07F941A680F5B00A75B9A /* Debug */ = {
399
+ isa = XCBuildConfiguration;
400
+ baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-HelloWorld.debug.xcconfig */;
401
+ buildSettings = {
402
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
403
+ CLANG_ENABLE_MODULES = YES;
404
+ CURRENT_PROJECT_VERSION = 1;
405
+ ENABLE_BITCODE = NO;
406
+ INFOPLIST_FILE = HelloWorld/Info.plist;
407
+ IPHONEOS_DEPLOYMENT_TARGET = 15.1;
408
+ LD_RUNPATH_SEARCH_PATHS = (
409
+ "$(inherited)",
410
+ "@executable_path/Frameworks",
411
+ );
412
+ MARKETING_VERSION = 1.0;
413
+ OTHER_LDFLAGS = (
414
+ "$(inherited)",
415
+ "-ObjC",
416
+ "-lc++",
417
+ );
418
+ PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
419
+ PRODUCT_NAME = HelloWorld;
420
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
421
+ SWIFT_VERSION = 5.0;
422
+ VERSIONING_SYSTEM = "apple-generic";
423
+ };
424
+ name = Debug;
425
+ };
426
+ 13B07F951A680F5B00A75B9A /* Release */ = {
427
+ isa = XCBuildConfiguration;
428
+ baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-HelloWorld.release.xcconfig */;
429
+ buildSettings = {
430
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
431
+ CLANG_ENABLE_MODULES = YES;
432
+ CURRENT_PROJECT_VERSION = 1;
433
+ INFOPLIST_FILE = HelloWorld/Info.plist;
434
+ IPHONEOS_DEPLOYMENT_TARGET = 15.1;
435
+ LD_RUNPATH_SEARCH_PATHS = (
436
+ "$(inherited)",
437
+ "@executable_path/Frameworks",
438
+ );
439
+ MARKETING_VERSION = 1.0;
440
+ OTHER_LDFLAGS = (
441
+ "$(inherited)",
442
+ "-ObjC",
443
+ "-lc++",
444
+ );
445
+ PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
446
+ PRODUCT_NAME = HelloWorld;
447
+ SWIFT_VERSION = 5.0;
448
+ VERSIONING_SYSTEM = "apple-generic";
449
+ };
450
+ name = Release;
451
+ };
452
+ 20D164962D4D7FB00039A91E /* Debug */ = {
453
+ isa = XCBuildConfiguration;
454
+ baseConfigurationReference = 4D838915DF00B87281042637 /* Pods-HelloWorld-HelloWorldReact.debug.xcconfig */;
455
+ buildSettings = {
456
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
457
+ BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
458
+ CLANG_ANALYZER_NONNULL = YES;
459
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
460
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
461
+ CLANG_ENABLE_MODULES = YES;
462
+ CLANG_ENABLE_OBJC_WEAK = YES;
463
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
464
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
465
+ CODE_SIGN_STYLE = Automatic;
466
+ CURRENT_PROJECT_VERSION = 1;
467
+ DEBUG_INFORMATION_FORMAT = dwarf;
468
+ DEFINES_MODULE = YES;
469
+ DYLIB_COMPATIBILITY_VERSION = 1;
470
+ DYLIB_CURRENT_VERSION = 1;
471
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
472
+ ENABLE_MODULE_VERIFIER = NO;
473
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
474
+ GCC_C_LANGUAGE_STANDARD = gnu17;
475
+ GENERATE_INFOPLIST_FILE = YES;
476
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
477
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
478
+ IPHONEOS_DEPLOYMENT_TARGET = 18.0;
479
+ LD_RUNPATH_SEARCH_PATHS = (
480
+ "$(inherited)",
481
+ "@executable_path/Frameworks",
482
+ "@loader_path/Frameworks",
483
+ );
484
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
485
+ MARKETING_VERSION = 1.0;
486
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
487
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
488
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
489
+ MTL_FAST_MATH = YES;
490
+ PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)React";
491
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
492
+ SKIP_INSTALL = NO;
493
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
494
+ SWIFT_EMIT_LOC_STRINGS = YES;
495
+ SWIFT_INSTALL_OBJC_HEADER = NO;
496
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
497
+ SWIFT_VERSION = 5.0;
498
+ TARGETED_DEVICE_FAMILY = "1,2";
499
+ VERSIONING_SYSTEM = "apple-generic";
500
+ VERSION_INFO_PREFIX = "";
501
+ };
502
+ name = Debug;
503
+ };
504
+ 20D164972D4D7FB00039A91E /* Release */ = {
505
+ isa = XCBuildConfiguration;
506
+ baseConfigurationReference = 25056119C0BDA4CDB86B24D9 /* Pods-HelloWorld-HelloWorldReact.release.xcconfig */;
507
+ buildSettings = {
508
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
509
+ BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
510
+ CLANG_ANALYZER_NONNULL = YES;
511
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
512
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
513
+ CLANG_ENABLE_MODULES = YES;
514
+ CLANG_ENABLE_OBJC_WEAK = YES;
515
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
516
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
517
+ CODE_SIGN_STYLE = Automatic;
518
+ COPY_PHASE_STRIP = NO;
519
+ CURRENT_PROJECT_VERSION = 1;
520
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
521
+ DEFINES_MODULE = YES;
522
+ DYLIB_COMPATIBILITY_VERSION = 1;
523
+ DYLIB_CURRENT_VERSION = 1;
524
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
525
+ ENABLE_MODULE_VERIFIER = NO;
526
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
527
+ GCC_C_LANGUAGE_STANDARD = gnu17;
528
+ GENERATE_INFOPLIST_FILE = YES;
529
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
530
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
531
+ IPHONEOS_DEPLOYMENT_TARGET = 18.0;
532
+ LD_RUNPATH_SEARCH_PATHS = (
533
+ "$(inherited)",
534
+ "@executable_path/Frameworks",
535
+ "@loader_path/Frameworks",
536
+ );
537
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
538
+ MARKETING_VERSION = 1.0;
539
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
540
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
541
+ MTL_FAST_MATH = YES;
542
+ PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)React";
543
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
544
+ SKIP_INSTALL = NO;
545
+ SWIFT_COMPILATION_MODE = wholemodule;
546
+ SWIFT_EMIT_LOC_STRINGS = YES;
547
+ SWIFT_INSTALL_OBJC_HEADER = NO;
548
+ SWIFT_VERSION = 5.0;
549
+ TARGETED_DEVICE_FAMILY = "1,2";
550
+ VERSIONING_SYSTEM = "apple-generic";
551
+ VERSION_INFO_PREFIX = "";
552
+ };
553
+ name = Release;
554
+ };
555
+ 83CBBA201A601CBA00E9B192 /* Debug */ = {
556
+ isa = XCBuildConfiguration;
557
+ buildSettings = {
558
+ ALWAYS_SEARCH_USER_PATHS = NO;
559
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
560
+ CLANG_CXX_LANGUAGE_STANDARD = "c++20";
561
+ CLANG_CXX_LIBRARY = "libc++";
562
+ CLANG_ENABLE_MODULES = YES;
563
+ CLANG_ENABLE_OBJC_ARC = YES;
564
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
565
+ CLANG_WARN_BOOL_CONVERSION = YES;
566
+ CLANG_WARN_COMMA = YES;
567
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
568
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
569
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
570
+ CLANG_WARN_EMPTY_BODY = YES;
571
+ CLANG_WARN_ENUM_CONVERSION = YES;
572
+ CLANG_WARN_INFINITE_RECURSION = YES;
573
+ CLANG_WARN_INT_CONVERSION = YES;
574
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
575
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
576
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
577
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
578
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
579
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
580
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
581
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
582
+ CLANG_WARN_UNREACHABLE_CODE = YES;
583
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
584
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
585
+ COPY_PHASE_STRIP = NO;
586
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
587
+ ENABLE_TESTABILITY = YES;
588
+ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
589
+ GCC_C_LANGUAGE_STANDARD = gnu99;
590
+ GCC_DYNAMIC_NO_PIC = NO;
591
+ GCC_NO_COMMON_BLOCKS = YES;
592
+ GCC_OPTIMIZATION_LEVEL = 0;
593
+ GCC_PREPROCESSOR_DEFINITIONS = (
594
+ "DEBUG=1",
595
+ "$(inherited)",
596
+ );
597
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
598
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
599
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
600
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
601
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
602
+ GCC_WARN_UNUSED_FUNCTION = YES;
603
+ GCC_WARN_UNUSED_VARIABLE = YES;
604
+ IPHONEOS_DEPLOYMENT_TARGET = 15.1;
605
+ LD_RUNPATH_SEARCH_PATHS = (
606
+ /usr/lib/swift,
607
+ "$(inherited)",
608
+ );
609
+ LIBRARY_SEARCH_PATHS = (
610
+ "\"$(SDKROOT)/usr/lib/swift\"",
611
+ "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
612
+ "\"$(inherited)\"",
613
+ );
614
+ MTL_ENABLE_DEBUG_INFO = YES;
615
+ ONLY_ACTIVE_ARCH = YES;
616
+ OTHER_CPLUSPLUSFLAGS = (
617
+ "$(OTHER_CFLAGS)",
618
+ "-DFOLLY_NO_CONFIG",
619
+ "-DFOLLY_MOBILE=1",
620
+ "-DFOLLY_USE_LIBCPP=1",
621
+ "-DFOLLY_CFG_NO_COROUTINES=1",
622
+ "-DFOLLY_HAVE_CLOCK_GETTIME=1",
623
+ );
624
+ OTHER_LDFLAGS = "$(inherited) ";
625
+ REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
626
+ SDKROOT = iphoneos;
627
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
628
+ USE_HERMES = true;
629
+ };
630
+ name = Debug;
631
+ };
632
+ 83CBBA211A601CBA00E9B192 /* Release */ = {
633
+ isa = XCBuildConfiguration;
634
+ buildSettings = {
635
+ ALWAYS_SEARCH_USER_PATHS = NO;
636
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
637
+ CLANG_CXX_LANGUAGE_STANDARD = "c++20";
638
+ CLANG_CXX_LIBRARY = "libc++";
639
+ CLANG_ENABLE_MODULES = YES;
640
+ CLANG_ENABLE_OBJC_ARC = YES;
641
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
642
+ CLANG_WARN_BOOL_CONVERSION = YES;
643
+ CLANG_WARN_COMMA = YES;
644
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
645
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
646
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
647
+ CLANG_WARN_EMPTY_BODY = YES;
648
+ CLANG_WARN_ENUM_CONVERSION = YES;
649
+ CLANG_WARN_INFINITE_RECURSION = YES;
650
+ CLANG_WARN_INT_CONVERSION = YES;
651
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
652
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
653
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
654
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
655
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
656
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
657
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
658
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
659
+ CLANG_WARN_UNREACHABLE_CODE = YES;
660
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
661
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
662
+ COPY_PHASE_STRIP = YES;
663
+ ENABLE_NS_ASSERTIONS = NO;
664
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
665
+ "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
666
+ GCC_C_LANGUAGE_STANDARD = gnu99;
667
+ GCC_NO_COMMON_BLOCKS = YES;
668
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
669
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
670
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
671
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
672
+ GCC_WARN_UNUSED_FUNCTION = YES;
673
+ GCC_WARN_UNUSED_VARIABLE = YES;
674
+ IPHONEOS_DEPLOYMENT_TARGET = 15.1;
675
+ LD_RUNPATH_SEARCH_PATHS = (
676
+ /usr/lib/swift,
677
+ "$(inherited)",
678
+ );
679
+ LIBRARY_SEARCH_PATHS = (
680
+ "\"$(SDKROOT)/usr/lib/swift\"",
681
+ "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
682
+ "\"$(inherited)\"",
683
+ );
684
+ MTL_ENABLE_DEBUG_INFO = NO;
685
+ OTHER_CPLUSPLUSFLAGS = (
686
+ "$(OTHER_CFLAGS)",
687
+ "-DFOLLY_NO_CONFIG",
688
+ "-DFOLLY_MOBILE=1",
689
+ "-DFOLLY_USE_LIBCPP=1",
690
+ "-DFOLLY_CFG_NO_COROUTINES=1",
691
+ "-DFOLLY_HAVE_CLOCK_GETTIME=1",
692
+ );
693
+ OTHER_LDFLAGS = "$(inherited) ";
694
+ REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
695
+ SDKROOT = iphoneos;
696
+ USE_HERMES = true;
697
+ VALIDATE_PRODUCT = YES;
698
+ };
699
+ name = Release;
700
+ };
701
+ /* End XCBuildConfiguration section */
702
+
703
+ /* Begin XCConfigurationList section */
704
+ 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "HelloWorld" */ = {
705
+ isa = XCConfigurationList;
706
+ buildConfigurations = (
707
+ 13B07F941A680F5B00A75B9A /* Debug */,
708
+ 13B07F951A680F5B00A75B9A /* Release */,
709
+ );
710
+ defaultConfigurationIsVisible = 0;
711
+ defaultConfigurationName = Release;
712
+ };
713
+ 20D164992D4D7FB00039A91E /* Build configuration list for PBXNativeTarget "HelloWorldReact" */ = {
714
+ isa = XCConfigurationList;
715
+ buildConfigurations = (
716
+ 20D164962D4D7FB00039A91E /* Debug */,
717
+ 20D164972D4D7FB00039A91E /* Release */,
718
+ );
719
+ defaultConfigurationIsVisible = 0;
720
+ defaultConfigurationName = Release;
721
+ };
722
+ 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "HelloWorld" */ = {
723
+ isa = XCConfigurationList;
724
+ buildConfigurations = (
725
+ 83CBBA201A601CBA00E9B192 /* Debug */,
726
+ 83CBBA211A601CBA00E9B192 /* Release */,
727
+ );
728
+ defaultConfigurationIsVisible = 0;
729
+ defaultConfigurationName = Release;
730
+ };
731
+ /* End XCConfigurationList section */
732
+ };
733
+ rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
734
+ }
@@ -0,0 +1,9 @@
1
+ #import <Foundation/Foundation.h>
2
+
3
+ //! Project version number for HelloWorldReact.
4
+ FOUNDATION_EXPORT double HelloWorldReactVersionNumber;
5
+
6
+ //! Project version string for HelloWorldReact.
7
+ FOUNDATION_EXPORT const unsigned char HelloWorldReactVersionString[];
8
+
9
+ // In this header, you should import all the public headers of your framework using statements like #import <HelloWorldReact/PublicHeader.h>
@@ -0,0 +1,5 @@
1
+ @_exported import ReactBrownfield
2
+
3
+ public let ReactNativeBundle = Bundle(for: DummyClass.self)
4
+
5
+ class DummyClass {}
@@ -0,0 +1,39 @@
1
+ # Resolve react_native_pods.rb with node to allow for hoisting
2
+ require Pod::Executable.execute_command('node', ['-p',
3
+ 'require.resolve(
4
+ "react-native/scripts/react_native_pods.rb",
5
+ {paths: [process.argv[1]]},
6
+ )', __dir__]).strip
7
+
8
+ platform :ios, min_ios_version_supported
9
+ prepare_react_native_project!
10
+
11
+ linkage = ENV['USE_FRAMEWORKS']
12
+ if linkage != nil
13
+ Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green
14
+ use_frameworks! :linkage => linkage.to_sym
15
+ end
16
+
17
+ target 'HelloWorld' do
18
+ config = use_native_modules!(['npx', 'rock', 'config', '-p', 'ios'])
19
+
20
+ use_react_native!(
21
+ :path => config[:reactNativePath],
22
+ # An absolute path to your application root.
23
+ :app_path => "#{Pod::Config.instance.installation_root}/.."
24
+ )
25
+
26
+ target 'HelloWorldReact' do
27
+ inherit! :complete
28
+ end
29
+
30
+ post_install do |installer|
31
+ # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202
32
+ react_native_post_install(
33
+ installer,
34
+ config[:reactNativePath],
35
+ :mac_catalyst_enabled => false,
36
+ # :ccache_enabled => true
37
+ )
38
+ end
39
+ end
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "rock-plugin-brownfield-ios-template",
3
+ "scripts": {
4
+ "package:ios": "rock package:ios --scheme HelloWorldReact --configuration Release"
5
+ },
6
+ "dependencies": {
7
+ "@callstack/react-native-brownfield": "^1.2.0"
8
+ },
9
+ "devDependencies": {
10
+ "@rock-js/plugin-brownfield-ios": "^0.8.13"
11
+ }
12
+ }