@akylas/nativescript-cli 8.7.2 → 8.8.3
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/config/test-deps-versions-generated.json +1 -1
- package/docs/man_pages/project/configuration/native/native-add-java.md +32 -0
- package/docs/man_pages/project/configuration/native/native-add-kotlin.md +34 -0
- package/docs/man_pages/project/configuration/native/native-add-objective-c.md +34 -0
- package/docs/man_pages/project/configuration/native/native-add-swift.md +32 -0
- package/docs/man_pages/project/configuration/native/native-add.md +31 -0
- package/docs/man_pages/project/configuration/native/native.md +31 -0
- package/lib/.d.ts +2 -0
- package/lib/android-tools-info.js +9 -20
- package/lib/base-package-manager.js +47 -64
- package/lib/bootstrap.js +8 -0
- package/lib/bun-package-manager.js +65 -88
- package/lib/color.js +2 -2
- package/lib/commands/add-platform.js +14 -30
- package/lib/commands/apple-login.js +18 -29
- package/lib/commands/appstore-list.js +34 -45
- package/lib/commands/appstore-upload.js +55 -68
- package/lib/commands/build.js +57 -86
- package/lib/commands/clean.js +161 -176
- package/lib/commands/command-base.js +14 -27
- package/lib/commands/config.js +51 -70
- package/lib/commands/create-project.js +210 -229
- package/lib/commands/debug.js +66 -88
- package/lib/commands/deploy.js +28 -44
- package/lib/commands/embedding/embed.js +72 -0
- package/lib/commands/extensibility/install-extension.js +5 -16
- package/lib/commands/extensibility/list-extensions.js +13 -24
- package/lib/commands/extensibility/uninstall-extension.js +4 -15
- package/lib/commands/fonts.js +30 -41
- package/lib/commands/generate-assets.js +13 -28
- package/lib/commands/generate-help.js +2 -13
- package/lib/commands/generate.js +17 -26
- package/lib/commands/info.js +2 -13
- package/lib/commands/install.js +34 -49
- package/lib/commands/list-platforms.js +14 -25
- package/lib/commands/migrate.js +15 -26
- package/lib/commands/native-add.js +277 -0
- package/lib/commands/platform-clean.js +19 -32
- package/lib/commands/plugin/add-plugin.js +12 -25
- package/lib/commands/plugin/build-plugin.js +34 -45
- package/lib/commands/plugin/create-plugin.js +110 -133
- package/lib/commands/plugin/list-plugins.js +22 -33
- package/lib/commands/plugin/remove-plugin.js +20 -33
- package/lib/commands/plugin/update-plugin.js +20 -33
- package/lib/commands/post-install.js +20 -33
- package/lib/commands/prepare.js +28 -35
- package/lib/commands/preview.js +49 -62
- package/lib/commands/remove-platform.js +7 -18
- package/lib/commands/resources/resources-update.js +13 -26
- package/lib/commands/run.js +55 -76
- package/lib/commands/start.js +6 -19
- package/lib/commands/test-init.js +123 -134
- package/lib/commands/test.js +66 -89
- package/lib/commands/typings.js +126 -142
- package/lib/commands/update-platform.js +22 -35
- package/lib/commands/update.js +30 -43
- package/lib/common/child-process.js +53 -72
- package/lib/common/codeGeneration/code-entity.js +1 -1
- package/lib/common/codeGeneration/code-printer.js +1 -1
- package/lib/common/command-params.js +7 -18
- package/lib/common/commands/analytics.js +27 -40
- package/lib/common/commands/autocompletion.js +39 -56
- package/lib/common/commands/device/device-log-stream.js +12 -23
- package/lib/common/commands/device/get-file.js +22 -33
- package/lib/common/commands/device/list-applications.js +12 -23
- package/lib/common/commands/device/list-devices.js +72 -87
- package/lib/common/commands/device/list-files.js +23 -34
- package/lib/common/commands/device/put-file.js +22 -33
- package/lib/common/commands/device/run-application.js +12 -25
- package/lib/common/commands/device/stop-application.js +11 -22
- package/lib/common/commands/device/uninstall-application.js +6 -17
- package/lib/common/commands/generate-messages.js +17 -28
- package/lib/common/commands/help.js +20 -33
- package/lib/common/commands/package-manager-get.js +6 -17
- package/lib/common/commands/package-manager-set.js +9 -20
- package/lib/common/commands/post-install.js +2 -13
- package/lib/common/commands/preuninstall.js +23 -38
- package/lib/common/commands/proxy/proxy-base.js +8 -19
- package/lib/common/commands/proxy/proxy-clear.js +4 -15
- package/lib/common/commands/proxy/proxy-get.js +3 -14
- package/lib/common/commands/proxy/proxy-set.js +87 -100
- package/lib/common/constants.js +11 -11
- package/lib/common/decorators.js +10 -22
- package/lib/common/dispatchers.js +79 -96
- package/lib/common/errors.js +89 -104
- package/lib/common/file-system.js +106 -127
- package/lib/common/header.js +1 -2
- package/lib/common/helpers.js +149 -178
- package/lib/common/host-info.js +37 -50
- package/lib/common/http-client.js +93 -108
- package/lib/common/logger/appenders/cli-appender.js +1 -2
- package/lib/common/logger/appenders/emit-appender.js +1 -2
- package/lib/common/logger/layouts/cli-layout.js +1 -2
- package/lib/common/logger/logger.js +1 -1
- package/lib/common/mobile/android/android-application-manager.js +121 -142
- package/lib/common/mobile/android/android-debug-bridge-result-handler.js +1 -1
- package/lib/common/mobile/android/android-debug-bridge.js +87 -112
- package/lib/common/mobile/android/android-device-file-system.js +98 -131
- package/lib/common/mobile/android/android-device-hash-service.js +50 -75
- package/lib/common/mobile/android/android-device.js +74 -91
- package/lib/common/mobile/android/android-emulator-services.js +105 -130
- package/lib/common/mobile/android/android-log-filter.js +1 -1
- package/lib/common/mobile/android/android-virtual-device-service.js +76 -94
- package/lib/common/mobile/android/device-android-debug-bridge.js +13 -29
- package/lib/common/mobile/android/genymotion/genymotion-service.js +91 -118
- package/lib/common/mobile/android/genymotion/virtualbox-service.js +64 -81
- package/lib/common/mobile/android/logcat-helper.js +108 -118
- package/lib/common/mobile/application-manager-base.js +84 -107
- package/lib/common/mobile/device-log-provider-base.js +7 -18
- package/lib/common/mobile/emulator-helper.js +1 -0
- package/lib/common/mobile/ios/device/ios-application-manager.js +79 -108
- package/lib/common/mobile/ios/device/ios-device-file-system.js +78 -105
- package/lib/common/mobile/ios/device/ios-device-operations.js +105 -142
- package/lib/common/mobile/ios/device/ios-device.js +20 -36
- package/lib/common/mobile/ios/ios-device-base.js +58 -81
- package/lib/common/mobile/ios/simulator/ios-emulator-services.js +63 -92
- package/lib/common/mobile/ios/simulator/ios-sim-resolver.js +1 -1
- package/lib/common/mobile/ios/simulator/ios-simulator-application-manager.js +60 -89
- package/lib/common/mobile/ios/simulator/ios-simulator-device.js +27 -43
- package/lib/common/mobile/ios/simulator/ios-simulator-file-system.js +37 -62
- package/lib/common/mobile/ios/simulator/ios-simulator-log-provider.js +24 -35
- package/lib/common/mobile/mobile-core/android-device-discovery.js +43 -62
- package/lib/common/mobile/mobile-core/android-emulator-discovery.js +21 -32
- package/lib/common/mobile/mobile-core/android-process-service.js +143 -182
- package/lib/common/mobile/mobile-core/device-discovery.js +2 -13
- package/lib/common/mobile/mobile-core/devices-service.js +385 -436
- package/lib/common/mobile/mobile-core/ios-device-discovery.js +24 -35
- package/lib/common/mobile/mobile-core/ios-simulator-discovery.js +47 -62
- package/lib/common/mobile/mobile-helper.js +15 -26
- package/lib/common/mobile/wp8/wp8-emulator-services.js +25 -52
- package/lib/common/opener.js +2 -2
- package/lib/common/plist-parser.js +2 -2
- package/lib/common/prompter.js +90 -105
- package/lib/common/queue.js +9 -20
- package/lib/common/services/auto-completion-service.js +39 -52
- package/lib/common/services/cancellation.js +17 -28
- package/lib/common/services/commands-service.js +146 -169
- package/lib/common/services/help-service.js +132 -157
- package/lib/common/services/hooks-service.js +93 -108
- package/lib/common/services/ios-notification-service.js +21 -34
- package/lib/common/services/json-file-settings-service.js +52 -71
- package/lib/common/services/lock-service.js +35 -52
- package/lib/common/services/message-contract-generator.js +35 -46
- package/lib/common/services/micro-templating-service.js +4 -15
- package/lib/common/services/net-service.js +90 -107
- package/lib/common/services/project-files-manager.js +10 -23
- package/lib/common/services/proxy-service.js +13 -24
- package/lib/common/services/qr.js +13 -24
- package/lib/common/services/settings-service.js +1 -1
- package/lib/common/services/xcode-select-service.js +20 -35
- package/lib/common/utils.js +7 -0
- package/lib/common/validators/project-name-validator.js +1 -1
- package/lib/common/validators/validation-result.js +1 -1
- package/lib/common/verify-node-version.js +2 -3
- package/lib/common/yok.js +23 -36
- package/lib/config.js +7 -58
- package/lib/constants.js +24 -24
- package/lib/controllers/build-controller.js +82 -99
- package/lib/controllers/debug-controller.js +107 -128
- package/lib/controllers/deploy-controller.js +17 -22
- package/lib/controllers/migrate-controller.js +727 -800
- package/lib/controllers/platform-controller.js +72 -83
- package/lib/controllers/prepare-controller.js +264 -250
- package/lib/controllers/run-controller.js +392 -406
- package/lib/controllers/update-controller-base.js +16 -29
- package/lib/controllers/update-controller.js +94 -119
- package/lib/data/build-data.js +2 -0
- package/lib/data/prepare-data.js +5 -1
- package/lib/declarations.d.ts +14 -3
- package/lib/definitions/android-plugin-migrator.d.ts +1 -0
- package/lib/definitions/ios-debugger-port-service.d.ts +1 -1
- package/lib/definitions/livesync.d.ts +1 -1
- package/lib/definitions/platform.d.ts +1 -0
- package/lib/definitions/prepare.d.ts +3 -0
- package/lib/definitions/project.d.ts +5 -0
- package/lib/detached-processes/cleanup-js-subprocess.js +3 -12
- package/lib/detached-processes/cleanup-process.js +16 -25
- package/lib/device-path-provider.js +23 -34
- package/lib/device-sockets/ios/app-debug-socket-proxy-factory.js +149 -164
- package/lib/device-sockets/ios/notification.js +1 -1
- package/lib/device-sockets/ios/socket-request-executor.js +24 -39
- package/lib/helpers/android-bundle-validator-helper.js +1 -1
- package/lib/helpers/deploy-command-helper.js +45 -49
- package/lib/helpers/key-command-helper.js +4 -13
- package/lib/helpers/livesync-command-helper.js +137 -152
- package/lib/helpers/network-connectivity-validator.js +6 -17
- package/lib/helpers/options-track-helper.js +6 -17
- package/lib/helpers/platform-command-helper.js +102 -114
- package/lib/key-commands/index.js +161 -211
- package/lib/nativescript-cli.js +5 -14
- package/lib/node-package-manager.js +81 -104
- package/lib/options.js +12 -14
- package/lib/package-installation-manager.js +130 -165
- package/lib/package-manager.js +63 -86
- package/lib/platform-command-param.js +4 -15
- package/lib/pnpm-package-manager.js +59 -78
- package/lib/project-data.js +5 -2
- package/lib/providers/project-files-provider.js +2 -2
- package/lib/services/analytics/analytics-broker-process.js +13 -22
- package/lib/services/analytics/analytics-broker.js +17 -30
- package/lib/services/analytics/analytics-service.js +161 -198
- package/lib/services/analytics/google-analytics-provider.js +41 -56
- package/lib/services/analytics-settings-service.js +15 -32
- package/lib/services/android/android-bundle-tool-service.js +43 -60
- package/lib/services/android/gradle-build-args-service.js +13 -23
- package/lib/services/android/gradle-build-service.js +34 -47
- package/lib/services/android/gradle-command-service.js +23 -32
- package/lib/services/android-device-debug-service.js +90 -117
- package/lib/services/android-plugin-build-service.js +233 -247
- package/lib/services/android-project-service.js +180 -219
- package/lib/services/android-resources-migration-service.js +51 -64
- package/lib/services/apple-portal/apple-portal-application-service.js +46 -63
- package/lib/services/apple-portal/apple-portal-session-service.js +171 -188
- package/lib/services/assets-generation/assets-generation-service.js +100 -113
- package/lib/services/build-artifacts-service.js +9 -20
- package/lib/services/build-info-file-service.js +20 -35
- package/lib/services/cleanup-service.js +47 -76
- package/lib/services/cocoapods-service.js +118 -133
- package/lib/services/device/device-install-app-service.js +73 -90
- package/lib/services/doctor-service.js +99 -118
- package/lib/services/extensibility-service.js +81 -100
- package/lib/services/files-hash-service.js +28 -44
- package/lib/services/hmr-status-service.js +1 -1
- package/lib/services/initialize-service.js +37 -50
- package/lib/services/ios/export-options-plist-service.js +38 -51
- package/lib/services/ios/ios-signing-service.js +161 -180
- package/lib/services/ios/spm-service.js +40 -53
- package/lib/services/ios/xcodebuild-args-service.js +77 -94
- package/lib/services/ios/xcodebuild-command-service.js +14 -25
- package/lib/services/ios/xcodebuild-service.js +50 -69
- package/lib/services/ios-debugger-port-service.js +23 -36
- package/lib/services/ios-device-debug-service.js +75 -102
- package/lib/services/ios-entitlements-service.js +31 -42
- package/lib/services/ios-extensions-service.js +18 -29
- package/lib/services/ios-project-service.js +418 -440
- package/lib/services/ios-provision-service.js +108 -129
- package/lib/services/ios-watch-app-service.js +21 -32
- package/lib/services/ip-service.js +38 -53
- package/lib/services/itmstransporter-service.js +129 -152
- package/lib/services/livesync/android-device-livesync-service-base.js +31 -48
- package/lib/services/livesync/android-device-livesync-service.js +120 -149
- package/lib/services/livesync/android-device-livesync-sockets-service.js +123 -155
- package/lib/services/livesync/android-livesync-service.js +16 -37
- package/lib/services/livesync/android-livesync-tool.js +89 -112
- package/lib/services/livesync/device-livesync-service-base.js +15 -28
- package/lib/services/livesync/ios-device-livesync-service.js +114 -143
- package/lib/services/livesync/ios-livesync-service.js +44 -60
- package/lib/services/livesync/platform-livesync-service-base.js +96 -120
- package/lib/services/log-parser-service.js +1 -1
- package/lib/services/log-source-map-service.js +33 -43
- package/lib/services/marking-mode-service.js +15 -28
- package/lib/services/npm-config-service.js +1 -1
- package/lib/services/pacote-service.js +49 -64
- package/lib/services/performance-service.js +1 -1
- package/lib/services/platform/add-platform-service.js +53 -69
- package/lib/services/platform/platform-validation-service.js +22 -33
- package/lib/services/platform/prepare-native-platform-service.js +50 -60
- package/lib/services/platform-environment-requirements.js +29 -38
- package/lib/services/plugins-service.js +128 -147
- package/lib/services/project-backup-service.js +1 -1
- package/lib/services/project-changes-service.js +129 -139
- package/lib/services/project-cleanup-service.js +64 -77
- package/lib/services/project-config-service.js +71 -80
- package/lib/services/project-data-service.js +116 -139
- package/lib/services/project-name-service.js +28 -43
- package/lib/services/project-service.js +84 -103
- package/lib/services/project-templates-service.js +52 -67
- package/lib/services/start-service.js +41 -59
- package/lib/services/temp-service.js +8 -21
- package/lib/services/terminal-spinner-service.js +13 -24
- package/lib/services/test-execution-service.js +59 -72
- package/lib/services/test-initialization-service.js +2 -2
- package/lib/services/timeline-profiler-service.js +1 -1
- package/lib/services/versions-service.js +119 -138
- package/lib/services/webpack/webpack-compiler-service.js +212 -224
- package/lib/services/xcconfig-service.js +8 -19
- package/lib/services/xcproj-service.js +12 -0
- package/lib/sys-info.js +45 -62
- package/lib/tools/node-modules/node-modules-builder.js +16 -27
- package/lib/yarn-package-manager.js +59 -78
- package/lib/yarn2-package-manager.js +60 -79
- package/package.json +59 -57
- package/vendor/aab-tool/README.txt +1 -1
- package/vendor/aab-tool/bundletool.jar +0 -0
- package/vendor/gradle-app/app/build.gradle +12 -4
- package/vendor/gradle-plugin/build.gradle +12 -4
- package/lib/common/resources/platform-tools/android/darwin/NOTICE.txt +0 -3407
- package/lib/common/resources/platform-tools/android/darwin/adb +0 -0
- package/lib/common/resources/platform-tools/android/linux/NOTICE.txt +0 -4451
- package/lib/common/resources/platform-tools/android/linux/adb +0 -0
- package/lib/common/resources/platform-tools/android/win32/AdbWinApi.dll +0 -0
- package/lib/common/resources/platform-tools/android/win32/AdbWinUsbApi.dll +0 -0
- package/lib/common/resources/platform-tools/android/win32/NOTICE.txt +0 -4451
- package/lib/common/resources/platform-tools/android/win32/adb.exe +0 -0
- package/lib/common/resources/platform-tools/android/win32/fastboot.exe +0 -0
|
@@ -5,15 +5,6 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
7
|
};
|
|
8
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
-
});
|
|
16
|
-
};
|
|
17
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
9
|
exports.IOSProjectService = exports.VisionSimulatorPlatformSdkName = exports.VisionDevicePlatformSdkName = exports.SimulatorPlatformSdkName = exports.DevicePlatformSdkName = void 0;
|
|
19
10
|
const path = require("path");
|
|
@@ -90,7 +81,9 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
90
81
|
projectData.platformsDir &&
|
|
91
82
|
this._platformsDirCache !== projectData.platformsDir) {
|
|
92
83
|
const platform = this.$mobileHelper.normalizePlatformName((_a = this.$options.platformOverride) !== null && _a !== void 0 ? _a : this.$devicePlatformsConstants.iOS);
|
|
93
|
-
const projectRoot =
|
|
84
|
+
const projectRoot = this.$options.hostProjectPath
|
|
85
|
+
? this.$options.hostProjectPath
|
|
86
|
+
: path.join(projectData.platformsDir, platform.toLowerCase());
|
|
94
87
|
const runtimePackage = this.$projectDataService.getRuntimePackage(projectData.projectDir, platform.toLowerCase());
|
|
95
88
|
this._platformData = {
|
|
96
89
|
frameworkPackageName: runtimePackage.name,
|
|
@@ -148,119 +141,107 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
148
141
|
}
|
|
149
142
|
return this._platformData;
|
|
150
143
|
}
|
|
151
|
-
validateOptions(projectId, provision, teamId) {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
return true;
|
|
165
|
-
});
|
|
144
|
+
async validateOptions(projectId, provision, teamId) {
|
|
145
|
+
if (provision && teamId) {
|
|
146
|
+
this.$errors.fail("The options --provision and --teamId are mutually exclusive.");
|
|
147
|
+
}
|
|
148
|
+
if (provision === true) {
|
|
149
|
+
await this.$iOSProvisionService.listProvisions(projectId);
|
|
150
|
+
this.$errors.fail("Please provide provisioning profile uuid or name with the --provision option.");
|
|
151
|
+
}
|
|
152
|
+
if (teamId === true) {
|
|
153
|
+
await this.$iOSProvisionService.listTeams();
|
|
154
|
+
this.$errors.fail("Please provide team id or team name with the --teamId options.");
|
|
155
|
+
}
|
|
156
|
+
return true;
|
|
166
157
|
}
|
|
167
158
|
getAppResourcesDestinationDirectoryPath(projectData) {
|
|
168
159
|
return path.join(this.getPlatformData(projectData).projectRoot, projectData.projectName, "Resources");
|
|
169
160
|
}
|
|
170
|
-
validate(projectData, options, notConfiguredEnvOptions) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
notConfiguredEnvOptions,
|
|
180
|
-
});
|
|
181
|
-
if (checkEnvironmentRequirementsOutput &&
|
|
182
|
-
checkEnvironmentRequirementsOutput.canExecute) {
|
|
183
|
-
const xcodeWarning = yield this.$sysInfo.getXcodeWarning();
|
|
184
|
-
if (xcodeWarning) {
|
|
185
|
-
this.$logger.warn(xcodeWarning);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
return {
|
|
189
|
-
checkEnvironmentRequirementsOutput,
|
|
190
|
-
};
|
|
161
|
+
async validate(projectData, options, notConfiguredEnvOptions) {
|
|
162
|
+
if (!this.$hostInfo.isDarwin) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const checkEnvironmentRequirementsOutput = await this.$platformEnvironmentRequirements.checkEnvironmentRequirements({
|
|
166
|
+
platform: this.getPlatformData(projectData).normalizedPlatformName,
|
|
167
|
+
projectDir: projectData.projectDir,
|
|
168
|
+
options,
|
|
169
|
+
notConfiguredEnvOptions,
|
|
191
170
|
});
|
|
171
|
+
if (checkEnvironmentRequirementsOutput &&
|
|
172
|
+
checkEnvironmentRequirementsOutput.canExecute) {
|
|
173
|
+
const xcodeWarning = await this.$sysInfo.getXcodeWarning();
|
|
174
|
+
if (xcodeWarning) {
|
|
175
|
+
this.$logger.warn(xcodeWarning);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
checkEnvironmentRequirementsOutput,
|
|
180
|
+
};
|
|
192
181
|
}
|
|
193
|
-
createProject(frameworkDir, frameworkVersion, projectData) {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
shell.cp("-R", path.join(frameworkDir, "*"), this.getPlatformData(projectData).projectRoot);
|
|
197
|
-
});
|
|
182
|
+
async createProject(frameworkDir, frameworkVersion, projectData) {
|
|
183
|
+
this.$fs.ensureDirectoryExists(path.join(this.getPlatformData(projectData).projectRoot, IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER));
|
|
184
|
+
shell.cp("-R", path.join(frameworkDir, "*"), this.getPlatformData(projectData).projectRoot);
|
|
198
185
|
}
|
|
199
|
-
interpolateData(projectData) {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
}
|
|
233
|
-
});
|
|
186
|
+
async interpolateData(projectData) {
|
|
187
|
+
const projectRootFilePath = path.join(this.getPlatformData(projectData).projectRoot, IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER);
|
|
188
|
+
if (this.$fs.exists(path.join(projectRootFilePath, IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER + "-Info.plist"))) {
|
|
189
|
+
this.replaceFileName("-Info.plist", projectRootFilePath, projectData);
|
|
190
|
+
}
|
|
191
|
+
this.replaceFileName("-Prefix.pch", projectRootFilePath, projectData);
|
|
192
|
+
if (this.$fs.exists(path.join(projectRootFilePath, IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER + ".entitlements"))) {
|
|
193
|
+
this.replaceFileName(".entitlements", projectRootFilePath, projectData);
|
|
194
|
+
}
|
|
195
|
+
const xcschemeDirPath = path.join(this.getPlatformData(projectData).projectRoot, IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER +
|
|
196
|
+
constants_2.IosProjectConstants.XcodeProjExtName, "xcshareddata/xcschemes");
|
|
197
|
+
const xcschemeFilePath = path.join(xcschemeDirPath, IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER +
|
|
198
|
+
constants_2.IosProjectConstants.XcodeSchemeExtName);
|
|
199
|
+
if (this.$fs.exists(xcschemeFilePath)) {
|
|
200
|
+
this.$logger.trace("Found shared scheme at xcschemeFilePath, renaming to match project name.");
|
|
201
|
+
this.$logger.trace("Checkpoint 0");
|
|
202
|
+
this.replaceFileContent(xcschemeFilePath, projectData);
|
|
203
|
+
this.$logger.trace("Checkpoint 1");
|
|
204
|
+
this.replaceFileName(constants_2.IosProjectConstants.XcodeSchemeExtName, xcschemeDirPath, projectData);
|
|
205
|
+
this.$logger.trace("Checkpoint 2");
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
this.$logger.trace("Copying xcscheme from template not found at " + xcschemeFilePath);
|
|
209
|
+
}
|
|
210
|
+
this.replaceFileName(constants_2.IosProjectConstants.XcodeProjExtName, this.getPlatformData(projectData).projectRoot, projectData);
|
|
211
|
+
const pbxprojFilePath = this.getPbxProjPath(projectData);
|
|
212
|
+
this.replaceFileContent(pbxprojFilePath, projectData);
|
|
213
|
+
const internalDirPath = path.join(projectRootFilePath, "..", "internal");
|
|
214
|
+
const xcframeworksFilePath = path.join(internalDirPath, "XCFrameworks.zip");
|
|
215
|
+
if (this.$fs.exists(xcframeworksFilePath)) {
|
|
216
|
+
await this.$fs.unzip(xcframeworksFilePath, internalDirPath);
|
|
217
|
+
this.$fs.deleteFile(xcframeworksFilePath);
|
|
218
|
+
}
|
|
234
219
|
}
|
|
235
220
|
interpolateConfigurationFile(projectData) {
|
|
236
221
|
return undefined;
|
|
237
222
|
}
|
|
238
|
-
cleanProject(projectRoot, projectData) {
|
|
239
|
-
return
|
|
240
|
-
return null;
|
|
241
|
-
});
|
|
223
|
+
async cleanProject(projectRoot, projectData) {
|
|
224
|
+
return null;
|
|
242
225
|
}
|
|
243
226
|
afterCreateProject(projectRoot, projectData) {
|
|
244
227
|
this.$fs.rename(path.join(projectRoot, IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER), path.join(projectRoot, projectData.projectName));
|
|
245
228
|
}
|
|
246
|
-
buildProject(projectRoot, projectData, buildData) {
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
this.validateApplicationIdentifier(projectData);
|
|
263
|
-
});
|
|
229
|
+
async buildProject(projectRoot, projectData, buildData) {
|
|
230
|
+
const platformData = this.getPlatformData(projectData);
|
|
231
|
+
const handler = (data) => {
|
|
232
|
+
this.emit(constants.BUILD_OUTPUT_EVENT_NAME, data);
|
|
233
|
+
};
|
|
234
|
+
if (buildData.buildForDevice) {
|
|
235
|
+
await this.$iOSSigningService.setupSigningForDevice(projectRoot, projectData, buildData);
|
|
236
|
+
await (0, helpers_1.attachAwaitDetach)(constants.BUILD_OUTPUT_EVENT_NAME, this.$childProcess, handler, this.$xcodebuildService.buildForDevice(platformData, projectData, buildData));
|
|
237
|
+
}
|
|
238
|
+
else if (buildData.buildForAppStore) {
|
|
239
|
+
await (0, helpers_1.attachAwaitDetach)(constants.BUILD_OUTPUT_EVENT_NAME, this.$childProcess, handler, this.$xcodebuildService.buildForAppStore(platformData, projectData, buildData));
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
await (0, helpers_1.attachAwaitDetach)(constants.BUILD_OUTPUT_EVENT_NAME, this.$childProcess, handler, this.$xcodebuildService.buildForSimulator(platformData, projectData, buildData));
|
|
243
|
+
}
|
|
244
|
+
this.validateApplicationIdentifier(projectData);
|
|
264
245
|
}
|
|
265
246
|
isPlatformPrepared(projectRoot, projectData) {
|
|
266
247
|
return this.$fs.exists(path.join(projectRoot, projectData.projectName, constants.APP_FOLDER_NAME));
|
|
@@ -268,115 +249,130 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
268
249
|
cleanDeviceTempFolder(deviceIdentifier) {
|
|
269
250
|
return Promise.resolve();
|
|
270
251
|
}
|
|
271
|
-
isDynamicFramework(frameworkPath) {
|
|
272
|
-
|
|
273
|
-
const
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
break;
|
|
288
|
-
}
|
|
252
|
+
async isDynamicFramework(frameworkPath) {
|
|
253
|
+
const isDynamicFrameworkBundle = async (bundlePath, frameworkName) => {
|
|
254
|
+
const frameworkBinaryPath = path.join(bundlePath, frameworkName);
|
|
255
|
+
const fileResult = (await this.$childProcess.spawnFromEvent("file", [frameworkBinaryPath], "close")).stdout;
|
|
256
|
+
const isDynamicallyLinked = _.includes(fileResult, "dynamically linked");
|
|
257
|
+
return isDynamicallyLinked;
|
|
258
|
+
};
|
|
259
|
+
if (path.extname(frameworkPath) === ".xcframework") {
|
|
260
|
+
let isDynamic = true;
|
|
261
|
+
const plistJson = this.$plistParser.parseFileSync(path.join(frameworkPath, "Info.plist"));
|
|
262
|
+
for (const library of plistJson.AvailableLibraries) {
|
|
263
|
+
const singlePlatformFramework = path.join(frameworkPath, library.LibraryIdentifier, library.LibraryPath);
|
|
264
|
+
if (this.$fs.exists(singlePlatformFramework)) {
|
|
265
|
+
const frameworkName = path.basename(singlePlatformFramework, path.extname(singlePlatformFramework));
|
|
266
|
+
isDynamic = await isDynamicFrameworkBundle(singlePlatformFramework, frameworkName);
|
|
267
|
+
break;
|
|
289
268
|
}
|
|
290
|
-
return isDynamic;
|
|
291
269
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
270
|
+
return isDynamic;
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
const frameworkName = path.basename(frameworkPath, path.extname(frameworkPath));
|
|
274
|
+
return await isDynamicFrameworkBundle(frameworkPath, frameworkName);
|
|
275
|
+
}
|
|
297
276
|
}
|
|
298
|
-
addFramework(frameworkPath, projectData) {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
277
|
+
async addFramework(frameworkPath, projectData) {
|
|
278
|
+
if (this.$hostInfo.isWindows) {
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
this.validateFramework(frameworkPath);
|
|
282
|
+
const project = this.createPbxProj(projectData);
|
|
283
|
+
const frameworkAddOptions = { customFramework: true };
|
|
284
|
+
const dynamic = await this.isDynamicFramework(frameworkPath);
|
|
285
|
+
if (dynamic) {
|
|
286
|
+
frameworkAddOptions["embed"] = true;
|
|
287
|
+
frameworkAddOptions["sign"] = true;
|
|
288
|
+
}
|
|
289
|
+
if (this.$options.hostProjectPath) {
|
|
290
|
+
frameworkAddOptions["embed"] = true;
|
|
291
|
+
frameworkAddOptions["sign"] = false;
|
|
292
|
+
}
|
|
293
|
+
const frameworkRelativePath = this.getLibSubpathRelativeToProjectPath(frameworkPath, projectData);
|
|
294
|
+
project.addFramework(frameworkRelativePath, frameworkAddOptions);
|
|
295
|
+
this.savePbxProj(project, projectData);
|
|
315
296
|
}
|
|
316
|
-
addStaticLibrary(staticLibPath, projectData) {
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
this.savePbxProj(project, projectData);
|
|
327
|
-
});
|
|
297
|
+
async addStaticLibrary(staticLibPath, projectData) {
|
|
298
|
+
const libraryName = path.basename(staticLibPath, ".a");
|
|
299
|
+
const headersSubpath = path.join(path.dirname(staticLibPath), "include", libraryName);
|
|
300
|
+
const project = this.createPbxProj(projectData);
|
|
301
|
+
const relativeStaticLibPath = this.getLibSubpathRelativeToProjectPath(staticLibPath, projectData);
|
|
302
|
+
project.addFramework(relativeStaticLibPath);
|
|
303
|
+
const relativeHeaderSearchPath = path.join(this.getLibSubpathRelativeToProjectPath(headersSubpath, projectData));
|
|
304
|
+
project.addToHeaderSearchPaths({ relativePath: relativeHeaderSearchPath });
|
|
305
|
+
this.generateModulemap(headersSubpath, libraryName);
|
|
306
|
+
this.savePbxProj(project, projectData);
|
|
328
307
|
}
|
|
329
|
-
prepareProject(projectData, prepareData) {
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
this.$
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
const imagesToRemove = _.difference(xcodeProjectImages, appResourcesImages);
|
|
360
|
-
this.$logger.trace(`Images to remove from xcode project: ${imagesToRemove.join(", ")}`);
|
|
361
|
-
_.each(imagesToRemove, (image) => project.removeResourceFile(path.join(this.getAppResourcesDestinationDirectoryPath(projectData), image)));
|
|
308
|
+
async prepareProject(projectData, prepareData) {
|
|
309
|
+
const projectRoot = this.$options.hostProjectPath
|
|
310
|
+
? this.$options.hostProjectPath
|
|
311
|
+
: path.join(projectData.platformsDir, this.$devicePlatformsConstants.iOS.toLowerCase());
|
|
312
|
+
const platformData = this.getPlatformData(projectData);
|
|
313
|
+
const pluginsData = this.getAllProductionPlugins(projectData);
|
|
314
|
+
const pbxProjPath = this.getPbxProjPath(projectData);
|
|
315
|
+
this.$iOSExtensionsService.removeExtensions({ pbxProjPath });
|
|
316
|
+
await this.addExtensions(projectData, pluginsData);
|
|
317
|
+
const resourcesDirectoryPath = projectData.getAppResourcesDirectoryPath();
|
|
318
|
+
const provision = prepareData && prepareData.provision;
|
|
319
|
+
const teamId = prepareData && prepareData.teamId;
|
|
320
|
+
if (provision) {
|
|
321
|
+
await this.$iOSSigningService.setupSigningFromProvision(projectRoot, projectData, provision, prepareData.mobileProvisionData);
|
|
322
|
+
}
|
|
323
|
+
if (teamId) {
|
|
324
|
+
await this.$iOSSigningService.setupSigningFromTeam(projectRoot, projectData, teamId);
|
|
325
|
+
}
|
|
326
|
+
const project = this.createPbxProj(projectData);
|
|
327
|
+
if (this.$options.hostProjectPath) {
|
|
328
|
+
try {
|
|
329
|
+
project.addPbxGroup([], "NativeScript", "NativeScript", null, {
|
|
330
|
+
isMain: true,
|
|
331
|
+
filesRelativeToProject: true,
|
|
332
|
+
uuid: "NATIVESCRIPTNATIVESCRIPT",
|
|
333
|
+
});
|
|
334
|
+
const buildFolderPath = path.join(this.$options.hostProjectPath, projectData.projectName);
|
|
335
|
+
project.addResourceFile(buildFolderPath, {}, "NATIVESCRIPTNATIVESCRIPT");
|
|
336
|
+
const metadataPath = path.relative(this.$options.hostProjectPath, buildFolderPath);
|
|
337
|
+
project.addToOtherLinkerFlags(JSON.stringify(`-sectcreate __DATA __TNSMetadata "${metadataPath}/metadata-arm64.bin"`));
|
|
362
338
|
this.savePbxProj(project, projectData);
|
|
363
|
-
let resourcesNativeCodePath = path.join(resourcesDirectoryPath, platformData.normalizedPlatformName, constants.NATIVE_SOURCE_FOLDER);
|
|
364
|
-
if (!this.$fs.exists(resourcesNativeCodePath)) {
|
|
365
|
-
resourcesNativeCodePath = path.join(resourcesDirectoryPath, this.$devicePlatformsConstants.iOS, constants.NATIVE_SOURCE_FOLDER);
|
|
366
|
-
}
|
|
367
|
-
yield this.prepareNativeSourceCode(constants.TNS_NATIVE_SOURCE_GROUP_NAME, resourcesNativeCodePath, projectData);
|
|
368
339
|
}
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
watchAppFolderPath: path.join(resourcesDirectoryPath, platformData.normalizedPlatformName),
|
|
372
|
-
projectData,
|
|
373
|
-
platformData,
|
|
374
|
-
pbxProjPath,
|
|
375
|
-
});
|
|
376
|
-
if (addedWatchApp) {
|
|
377
|
-
this.$logger.warn("The support for Apple Watch App is currently in Beta. For more information about the current development state and any known issues, please check the relevant GitHub issue: https://github.com/NativeScript/nativescript-cli/issues/4589");
|
|
340
|
+
catch (err) {
|
|
341
|
+
this.$logger.trace("Error adding NativeScript group to host project", err);
|
|
378
342
|
}
|
|
343
|
+
}
|
|
344
|
+
const resources = project.pbxGroupByName("Resources");
|
|
345
|
+
if (resources && !this.$options.hostProjectPath) {
|
|
346
|
+
const references = project.pbxFileReferenceSection();
|
|
347
|
+
const xcodeProjectImages = _.map(resources.children, (resource) => this.replace(references[resource.value].name));
|
|
348
|
+
this.$logger.trace("Images from Xcode project");
|
|
349
|
+
this.$logger.trace(xcodeProjectImages);
|
|
350
|
+
const appResourcesImages = this.$fs.readDirectory(this.getAppResourcesDestinationDirectoryPath(projectData));
|
|
351
|
+
this.$logger.trace("Current images from App_Resources");
|
|
352
|
+
this.$logger.trace(appResourcesImages);
|
|
353
|
+
const imagesToAdd = _.difference(appResourcesImages, xcodeProjectImages);
|
|
354
|
+
this.$logger.trace(`New images to add into xcode project: ${imagesToAdd.join(", ")}`);
|
|
355
|
+
_.each(imagesToAdd, (image) => project.addResourceFile(path.relative(this.getPlatformData(projectData).projectRoot, path.join(this.getAppResourcesDestinationDirectoryPath(projectData), image))));
|
|
356
|
+
const imagesToRemove = _.difference(xcodeProjectImages, appResourcesImages);
|
|
357
|
+
this.$logger.trace(`Images to remove from xcode project: ${imagesToRemove.join(", ")}`);
|
|
358
|
+
_.each(imagesToRemove, (image) => project.removeResourceFile(path.join(this.getAppResourcesDestinationDirectoryPath(projectData), image)));
|
|
359
|
+
this.savePbxProj(project, projectData);
|
|
360
|
+
let resourcesNativeCodePath = path.join(resourcesDirectoryPath, platformData.normalizedPlatformName, constants.NATIVE_SOURCE_FOLDER);
|
|
361
|
+
if (!this.$fs.exists(resourcesNativeCodePath)) {
|
|
362
|
+
resourcesNativeCodePath = path.join(resourcesDirectoryPath, this.$devicePlatformsConstants.iOS, constants.NATIVE_SOURCE_FOLDER);
|
|
363
|
+
}
|
|
364
|
+
await this.prepareNativeSourceCode(constants.TNS_NATIVE_SOURCE_GROUP_NAME, resourcesNativeCodePath, projectData);
|
|
365
|
+
}
|
|
366
|
+
this.$iOSWatchAppService.removeWatchApp({ pbxProjPath });
|
|
367
|
+
const addedWatchApp = await this.$iOSWatchAppService.addWatchAppFromPath({
|
|
368
|
+
watchAppFolderPath: path.join(resourcesDirectoryPath, platformData.normalizedPlatformName),
|
|
369
|
+
projectData,
|
|
370
|
+
platformData,
|
|
371
|
+
pbxProjPath,
|
|
379
372
|
});
|
|
373
|
+
if (addedWatchApp) {
|
|
374
|
+
this.$logger.warn("The support for Apple Watch App is currently in Beta. For more information about the current development state and any known issues, please check the relevant GitHub issue: https://github.com/NativeScript/nativescript-cli/issues/4589");
|
|
375
|
+
}
|
|
380
376
|
}
|
|
381
377
|
prepareAppResources(projectData) {
|
|
382
378
|
const platformData = this.getPlatformData(projectData);
|
|
@@ -398,48 +394,45 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
398
394
|
this.$fs.deleteDirectory(path.join(platformsAppResourcesPath, "watchapp"));
|
|
399
395
|
this.$fs.deleteDirectory(path.join(platformsAppResourcesPath, "watchextension"));
|
|
400
396
|
}
|
|
401
|
-
processConfigurationFilesFromAppResources(projectData, opts) {
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
yield this.mergeProjectXcconfigFiles(projectData);
|
|
406
|
-
});
|
|
397
|
+
async processConfigurationFilesFromAppResources(projectData, opts) {
|
|
398
|
+
await this.mergeInfoPlists(projectData, opts);
|
|
399
|
+
await this.$iOSEntitlementsService.merge(projectData);
|
|
400
|
+
await this.mergeProjectXcconfigFiles(projectData);
|
|
407
401
|
}
|
|
408
402
|
ensureConfigurationFileInAppResources() {
|
|
409
403
|
return null;
|
|
410
404
|
}
|
|
411
|
-
mergeInfoPlists(projectData, buildOptions) {
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
return;
|
|
426
|
-
}
|
|
427
|
-
this.$logger.trace("Schedule merge plist at: " + plistPath);
|
|
428
|
-
session.patch({
|
|
429
|
-
name: path.relative(projectDir, plistPath),
|
|
430
|
-
read: () => this.$fs.readText(plistPath),
|
|
431
|
-
});
|
|
432
|
-
};
|
|
433
|
-
const allPlugins = this.getAllProductionPlugins(projectData);
|
|
434
|
-
for (const plugin of allPlugins) {
|
|
435
|
-
const pluginInfoPlistPath = path.join(plugin.pluginPlatformsFolderPath(IOSProjectService.IOS_PLATFORM_NAME), this.getPlatformData(projectData).configurationFileName);
|
|
436
|
-
makePatch(pluginInfoPlistPath);
|
|
405
|
+
async mergeInfoPlists(projectData, buildOptions) {
|
|
406
|
+
const projectDir = projectData.projectDir;
|
|
407
|
+
const infoPlistPath = path.join(projectData.appResourcesDirectoryPath, this.getPlatformData(projectData).normalizedPlatformName, this.getPlatformData(projectData).configurationFileName);
|
|
408
|
+
this.ensureConfigurationFileInAppResources();
|
|
409
|
+
const reporterTraceMessage = "Info.plist:";
|
|
410
|
+
const reporter = {
|
|
411
|
+
log: (txt) => this.$logger.trace(`${reporterTraceMessage} ${txt}`),
|
|
412
|
+
warn: (txt) => this.$logger.warn(`${reporterTraceMessage} ${txt}`),
|
|
413
|
+
};
|
|
414
|
+
const session = new plist_merge_patch_1.PlistSession(reporter);
|
|
415
|
+
const makePatch = (plistPath) => {
|
|
416
|
+
if (!this.$fs.exists(plistPath)) {
|
|
417
|
+
this.$logger.trace("No plist found at: " + plistPath);
|
|
418
|
+
return;
|
|
437
419
|
}
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
420
|
+
this.$logger.trace("Schedule merge plist at: " + plistPath);
|
|
421
|
+
session.patch({
|
|
422
|
+
name: path.relative(projectDir, plistPath),
|
|
423
|
+
read: () => this.$fs.readText(plistPath),
|
|
424
|
+
});
|
|
425
|
+
};
|
|
426
|
+
const allPlugins = this.getAllProductionPlugins(projectData);
|
|
427
|
+
for (const plugin of allPlugins) {
|
|
428
|
+
const pluginInfoPlistPath = path.join(plugin.pluginPlatformsFolderPath(IOSProjectService.IOS_PLATFORM_NAME), this.getPlatformData(projectData).configurationFileName);
|
|
429
|
+
makePatch(pluginInfoPlistPath);
|
|
430
|
+
}
|
|
431
|
+
makePatch(infoPlistPath);
|
|
432
|
+
if (projectData.projectIdentifiers && projectData.projectIdentifiers.ios) {
|
|
433
|
+
session.patch({
|
|
434
|
+
name: "CFBundleIdentifier from package.json nativescript.id",
|
|
435
|
+
read: () => `<?xml version="1.0" encoding="UTF-8"?>
|
|
443
436
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
444
437
|
<plist version="1.0">
|
|
445
438
|
<dict>
|
|
@@ -447,14 +440,14 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
447
440
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
448
441
|
</dict>
|
|
449
442
|
</plist>`,
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
if (!buildOptions.release &&
|
|
446
|
+
projectData.projectIdentifiers &&
|
|
447
|
+
projectData.projectIdentifiers.ios) {
|
|
448
|
+
session.patch({
|
|
449
|
+
name: "CFBundleURLTypes from package.json nativescript.id",
|
|
450
|
+
read: () => `<?xml version="1.0" encoding="UTF-8"?>
|
|
458
451
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
459
452
|
<plist version="1.0">
|
|
460
453
|
<dict>
|
|
@@ -471,13 +464,12 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
471
464
|
</array>
|
|
472
465
|
</dict>
|
|
473
466
|
</plist>`,
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
});
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
const plistContent = session.build();
|
|
470
|
+
this.$logger.trace("Info.plist: Write to: " +
|
|
471
|
+
this.getPlatformData(projectData).configurationFilePath);
|
|
472
|
+
this.$fs.writeFile(this.getPlatformData(projectData).configurationFilePath, plistContent);
|
|
481
473
|
}
|
|
482
474
|
getAllProductionPlugins(projectData) {
|
|
483
475
|
return (this.$injector.resolve("pluginsService")).getAllProductionPlugins(projectData, this.getPlatformData(projectData).platformNameLowerCase);
|
|
@@ -489,10 +481,18 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
489
481
|
return name.replace(/\\\"/g, '"');
|
|
490
482
|
}
|
|
491
483
|
getLibSubpathRelativeToProjectPath(targetPath, projectData) {
|
|
492
|
-
const
|
|
484
|
+
const projectRoot = this.getPlatformData(projectData).projectRoot;
|
|
485
|
+
const frameworkPath = path.relative(projectRoot, targetPath);
|
|
493
486
|
return frameworkPath;
|
|
494
487
|
}
|
|
495
488
|
getPbxProjPath(projectData) {
|
|
489
|
+
if (this.$options.hostProjectPath) {
|
|
490
|
+
let xcodeProjectPath = this.$xcprojService.findXcodeProject(this.$options.hostProjectPath);
|
|
491
|
+
if (!xcodeProjectPath) {
|
|
492
|
+
this.$errors.fail("Xcode project not found at the specified directory");
|
|
493
|
+
}
|
|
494
|
+
return path.join(xcodeProjectPath, "project.pbxproj");
|
|
495
|
+
}
|
|
496
496
|
return path.join(this.$xcprojService.getXcodeprojPath(projectData, this.getPlatformData(projectData).projectRoot), "project.pbxproj");
|
|
497
497
|
}
|
|
498
498
|
createPbxProj(projectData) {
|
|
@@ -503,89 +503,81 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
503
503
|
savePbxProj(project, projectData, omitEmptyValues) {
|
|
504
504
|
return this.$fs.writeFile(this.getPbxProjPath(projectData), project.writeSync({ omitEmptyValues }));
|
|
505
505
|
}
|
|
506
|
-
preparePluginNativeCode(pluginData, projectData, opts) {
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
if (this.$fs.exists(projectPodfilePath)) {
|
|
537
|
-
yield this.$cocoapodsService.executePodInstall(platformData.projectRoot, this.$xcprojService.getXcodeprojPath(projectData, platformData.projectRoot));
|
|
538
|
-
yield this.$cocoapodsService.mergePodXcconfigFile(projectData, platformData, opts);
|
|
539
|
-
}
|
|
540
|
-
yield this.$spmService.applySPMPackages(platformData, projectData);
|
|
541
|
-
});
|
|
506
|
+
async preparePluginNativeCode(pluginData, projectData, opts) {
|
|
507
|
+
const pluginPlatformsFolderPath = pluginData.pluginPlatformsFolderPath(IOSProjectService.IOS_PLATFORM_NAME);
|
|
508
|
+
const sourcePath = path.join(pluginPlatformsFolderPath, "src");
|
|
509
|
+
await this.prepareNativeSourceCode(pluginData.name, sourcePath, projectData);
|
|
510
|
+
await this.prepareResources(pluginPlatformsFolderPath, pluginData, projectData);
|
|
511
|
+
await this.prepareFrameworks(pluginPlatformsFolderPath, pluginData, projectData);
|
|
512
|
+
await this.prepareStaticLibs(pluginPlatformsFolderPath, pluginData, projectData);
|
|
513
|
+
}
|
|
514
|
+
async removePluginNativeCode(pluginData, projectData) {
|
|
515
|
+
const pluginPlatformsFolderPath = pluginData.pluginPlatformsFolderPath(IOSProjectService.IOS_PLATFORM_NAME);
|
|
516
|
+
this.removeNativeSourceCode(pluginPlatformsFolderPath, pluginData, projectData);
|
|
517
|
+
this.removeFrameworks(pluginPlatformsFolderPath, pluginData, projectData);
|
|
518
|
+
this.removeStaticLibs(pluginPlatformsFolderPath, pluginData, projectData);
|
|
519
|
+
const projectRoot = this.getPlatformData(projectData).projectRoot;
|
|
520
|
+
this.$cocoapodsService.removePodfileFromProject(pluginData.name, this.$cocoapodsService.getPluginPodfilePath(pluginData), projectData, projectRoot);
|
|
521
|
+
}
|
|
522
|
+
async handleNativeDependenciesChange(projectData, opts) {
|
|
523
|
+
const platformData = this.getPlatformData(projectData);
|
|
524
|
+
const pluginsData = this.getAllProductionPlugins(projectData);
|
|
525
|
+
this.setProductBundleIdentifier(projectData);
|
|
526
|
+
await this.applyPluginsCocoaPods(pluginsData, projectData, platformData);
|
|
527
|
+
await this.$cocoapodsService.applyPodfileFromAppResources(projectData, platformData);
|
|
528
|
+
await this.$cocoapodsService.applyPodfileArchExclusions(projectData, platformData);
|
|
529
|
+
await this.$cocoapodsService.applyPodfileFromExtensions(projectData, platformData);
|
|
530
|
+
const projectPodfilePath = this.$cocoapodsService.getProjectPodfilePath(platformData.projectRoot);
|
|
531
|
+
if (this.$fs.exists(projectPodfilePath)) {
|
|
532
|
+
await this.$cocoapodsService.executePodInstall(platformData.projectRoot, this.$xcprojService.getXcodeprojPath(projectData, platformData.projectRoot));
|
|
533
|
+
await this.$cocoapodsService.mergePodXcconfigFile(projectData, platformData, opts);
|
|
534
|
+
}
|
|
535
|
+
await this.$spmService.applySPMPackages(platformData, projectData);
|
|
542
536
|
}
|
|
543
537
|
beforePrepareAllPlugins(projectData, dependencies) {
|
|
544
538
|
return Promise.resolve(dependencies);
|
|
545
539
|
}
|
|
546
|
-
checkForChanges(changesInfo, prepareData, projectData) {
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
if (
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
break;
|
|
563
|
-
}
|
|
540
|
+
async checkForChanges(changesInfo, prepareData, projectData) {
|
|
541
|
+
const { provision, teamId } = prepareData;
|
|
542
|
+
const hasProvision = provision !== undefined;
|
|
543
|
+
const hasTeamId = teamId !== undefined;
|
|
544
|
+
if (hasProvision || hasTeamId) {
|
|
545
|
+
const pbxprojPath = this.getPbxProjPath(projectData);
|
|
546
|
+
if (this.$fs.exists(pbxprojPath)) {
|
|
547
|
+
const xcode = this.$pbxprojDomXcode.Xcode.open(pbxprojPath);
|
|
548
|
+
const signing = xcode.getSigning(projectData.projectName);
|
|
549
|
+
if (hasProvision) {
|
|
550
|
+
if (signing && signing.style === "Manual") {
|
|
551
|
+
for (const name in signing.configurations) {
|
|
552
|
+
const config = signing.configurations[name];
|
|
553
|
+
if (config.uuid !== provision && config.name !== provision) {
|
|
554
|
+
changesInfo.signingChanged = true;
|
|
555
|
+
break;
|
|
564
556
|
}
|
|
565
557
|
}
|
|
566
|
-
else {
|
|
567
|
-
changesInfo.signingChanged = true;
|
|
568
|
-
}
|
|
569
558
|
}
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
559
|
+
else {
|
|
560
|
+
changesInfo.signingChanged = true;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
if (hasTeamId) {
|
|
564
|
+
if (signing && signing.style === "Automatic") {
|
|
565
|
+
if (signing.team !== teamId) {
|
|
566
|
+
const teamIdsForName = await this.$iOSProvisionService.getTeamIdsWithName(teamId);
|
|
567
|
+
if (!teamIdsForName.some((id) => id === signing.team)) {
|
|
568
|
+
changesInfo.signingChanged = true;
|
|
577
569
|
}
|
|
578
570
|
}
|
|
579
|
-
else {
|
|
580
|
-
changesInfo.signingChanged = true;
|
|
581
|
-
}
|
|
582
571
|
}
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
572
|
+
else {
|
|
573
|
+
changesInfo.signingChanged = true;
|
|
574
|
+
}
|
|
586
575
|
}
|
|
587
576
|
}
|
|
588
|
-
|
|
577
|
+
else {
|
|
578
|
+
changesInfo.signingChanged = true;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
589
581
|
}
|
|
590
582
|
getDeploymentTarget(projectData) {
|
|
591
583
|
const target = this.$xcconfigService.readPropertyValue(this.getBuildXCConfigFilePath(projectData), "IPHONEOS_DEPLOYMENT_TARGET");
|
|
@@ -632,54 +624,50 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
632
624
|
const newFileName = projectData.projectName + fileNamePart;
|
|
633
625
|
this.$fs.rename(path.join(fileRootLocation, oldFileName), path.join(fileRootLocation, newFileName));
|
|
634
626
|
}
|
|
635
|
-
prepareNativeSourceCode(groupName, sourceFolderPath, projectData) {
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
filesRelativeToProject: true,
|
|
642
|
-
});
|
|
643
|
-
project.addToHeaderSearchPaths(group.path);
|
|
644
|
-
const headerFiles = this.$fs.exists(sourceFolderPath)
|
|
645
|
-
? this.$fs.enumerateFilesInDirectorySync(sourceFolderPath, (file, stat) => stat.isDirectory() || path.extname(file) === ".h")
|
|
646
|
-
: [];
|
|
647
|
-
if (headerFiles.length > 0 &&
|
|
648
|
-
!this.$fs.exists(path.join(sourceFolderPath, "module.modulemap"))) {
|
|
649
|
-
this.$logger.warn(`warning: Directory ${sourceFolderPath} with native iOS source code doesn't contain a modulemap file. Metadata for it will not be generated and it will not be accessible from JavaScript. To learn more see https://docs.nativescript.org/guides/ios-source-code`);
|
|
650
|
-
}
|
|
651
|
-
this.savePbxProj(project, projectData);
|
|
627
|
+
async prepareNativeSourceCode(groupName, sourceFolderPath, projectData) {
|
|
628
|
+
const project = this.createPbxProj(projectData);
|
|
629
|
+
const group = this.getRootGroup(groupName, sourceFolderPath);
|
|
630
|
+
project.addPbxGroup(group.files, group.name, group.path, null, {
|
|
631
|
+
isMain: true,
|
|
632
|
+
filesRelativeToProject: true,
|
|
652
633
|
});
|
|
634
|
+
project.addToHeaderSearchPaths(group.path);
|
|
635
|
+
const headerFiles = this.$fs.exists(sourceFolderPath)
|
|
636
|
+
? this.$fs.enumerateFilesInDirectorySync(sourceFolderPath, (file, stat) => stat.isDirectory() || path.extname(file) === ".h")
|
|
637
|
+
: [];
|
|
638
|
+
if (headerFiles.length > 0 &&
|
|
639
|
+
!this.$fs.exists(path.join(sourceFolderPath, "module.modulemap"))) {
|
|
640
|
+
this.$logger.warn(`warning: Directory ${sourceFolderPath} with native iOS source code doesn't contain a modulemap file. Metadata for it will not be generated and it will not be accessible from JavaScript. To learn more see https://docs.nativescript.org/guides/ios-source-code`);
|
|
641
|
+
}
|
|
642
|
+
this.savePbxProj(project, projectData);
|
|
653
643
|
}
|
|
654
|
-
addExtensions(projectData, pluginsData) {
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
644
|
+
async addExtensions(projectData, pluginsData) {
|
|
645
|
+
const resorcesExtensionsPath = path.join(projectData.getAppResourcesDirectoryPath(), this.getPlatformData(projectData).normalizedPlatformName, constants.NATIVE_EXTENSION_FOLDER);
|
|
646
|
+
const platformData = this.getPlatformData(projectData);
|
|
647
|
+
const pbxProjPath = this.getPbxProjPath(projectData);
|
|
648
|
+
const addedExtensionsFromResources = await this.$iOSExtensionsService.addExtensionsFromPath({
|
|
649
|
+
extensionsFolderPath: resorcesExtensionsPath,
|
|
650
|
+
projectData,
|
|
651
|
+
platformData,
|
|
652
|
+
pbxProjPath,
|
|
653
|
+
});
|
|
654
|
+
let addedExtensionsFromPlugins = false;
|
|
655
|
+
for (const pluginIndex in pluginsData) {
|
|
656
|
+
const pluginData = pluginsData[pluginIndex];
|
|
657
|
+
const pluginPlatformsFolderPath = pluginData.pluginPlatformsFolderPath(IOSProjectService.IOS_PLATFORM_NAME);
|
|
658
|
+
const extensionPath = path.join(pluginPlatformsFolderPath, constants.NATIVE_EXTENSION_FOLDER);
|
|
659
|
+
const addedExtensionFromPlugin = await this.$iOSExtensionsService.addExtensionsFromPath({
|
|
660
|
+
extensionsFolderPath: extensionPath,
|
|
661
661
|
projectData,
|
|
662
662
|
platformData,
|
|
663
663
|
pbxProjPath,
|
|
664
664
|
});
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
extensionsFolderPath: extensionPath,
|
|
672
|
-
projectData,
|
|
673
|
-
platformData,
|
|
674
|
-
pbxProjPath,
|
|
675
|
-
});
|
|
676
|
-
addedExtensionsFromPlugins =
|
|
677
|
-
addedExtensionsFromPlugins || addedExtensionFromPlugin;
|
|
678
|
-
}
|
|
679
|
-
if (addedExtensionsFromResources || addedExtensionsFromPlugins) {
|
|
680
|
-
this.$logger.warn("The support for iOS App Extensions is currently in Beta. For more information about the current development state and any known issues, please check the relevant GitHub issue: https://github.com/NativeScript/nativescript-cli/issues/4472");
|
|
681
|
-
}
|
|
682
|
-
});
|
|
665
|
+
addedExtensionsFromPlugins =
|
|
666
|
+
addedExtensionsFromPlugins || addedExtensionFromPlugin;
|
|
667
|
+
}
|
|
668
|
+
if (addedExtensionsFromResources || addedExtensionsFromPlugins) {
|
|
669
|
+
this.$logger.warn("The support for iOS App Extensions is currently in Beta. For more information about the current development state and any known issues, please check the relevant GitHub issue: https://github.com/NativeScript/nativescript-cli/issues/4472");
|
|
670
|
+
}
|
|
683
671
|
}
|
|
684
672
|
getRootGroup(name, rootPath) {
|
|
685
673
|
const filePathsArr = [];
|
|
@@ -699,32 +687,26 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
699
687
|
}
|
|
700
688
|
return rootGroup;
|
|
701
689
|
}
|
|
702
|
-
prepareResources(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
project.addResourceFile(filePath);
|
|
710
|
-
}
|
|
690
|
+
async prepareResources(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
691
|
+
const project = this.createPbxProj(projectData);
|
|
692
|
+
const resourcesPath = path.join(pluginPlatformsFolderPath, "Resources");
|
|
693
|
+
if (this.$fs.exists(resourcesPath) && !this.$fs.isEmptyDir(resourcesPath)) {
|
|
694
|
+
for (const fileName of this.$fs.readDirectory(resourcesPath)) {
|
|
695
|
+
const filePath = path.join(resourcesPath, fileName);
|
|
696
|
+
project.addResourceFile(filePath);
|
|
711
697
|
}
|
|
712
|
-
|
|
713
|
-
|
|
698
|
+
}
|
|
699
|
+
this.savePbxProj(project, projectData);
|
|
714
700
|
}
|
|
715
|
-
prepareFrameworks(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
}
|
|
720
|
-
});
|
|
701
|
+
async prepareFrameworks(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
702
|
+
for (const fileName of this.getAllLibsForPluginWithFileExtension(pluginData, FRAMEWORK_EXTENSIONS)) {
|
|
703
|
+
await this.addFramework(path.join(pluginPlatformsFolderPath, fileName), projectData);
|
|
704
|
+
}
|
|
721
705
|
}
|
|
722
|
-
prepareStaticLibs(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
}
|
|
727
|
-
});
|
|
706
|
+
async prepareStaticLibs(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
707
|
+
for (const fileName of this.getAllLibsForPluginWithFileExtension(pluginData, ".a")) {
|
|
708
|
+
await this.addStaticLibrary(path.join(pluginPlatformsFolderPath, fileName), projectData);
|
|
709
|
+
}
|
|
728
710
|
}
|
|
729
711
|
removeNativeSourceCode(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
730
712
|
const project = this.createPbxProj(projectData);
|
|
@@ -773,46 +755,44 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
773
755
|
const modulemap = `module ${libraryName} { explicit module ${libraryName} { ${headers.join(" ")} } }`;
|
|
774
756
|
this.$fs.writeFile(path.join(headersFolderPath, "module.modulemap"), modulemap);
|
|
775
757
|
}
|
|
776
|
-
mergeProjectXcconfigFiles(projectData) {
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
if (this.$fs.exists(pluginXcconfigFilePath)) {
|
|
788
|
-
for (const pluginsXcconfigFilePath of pluginsXcconfigFilePaths) {
|
|
789
|
-
yield this.$xcconfigService.mergeFiles(pluginXcconfigFilePath, pluginsXcconfigFilePath);
|
|
790
|
-
}
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
const appResourcesXcconfigPath = path.join(projectData.appResourcesDirectoryPath, this.getPlatformData(projectData).normalizedPlatformName, constants_2.BUILD_XCCONFIG_FILE_NAME);
|
|
794
|
-
if (this.$fs.exists(appResourcesXcconfigPath)) {
|
|
758
|
+
async mergeProjectXcconfigFiles(projectData) {
|
|
759
|
+
const platformData = this.getPlatformData(projectData);
|
|
760
|
+
const pluginsXcconfigFilePaths = _.values(this.$xcconfigService.getPluginsXcconfigFilePaths(platformData.projectRoot));
|
|
761
|
+
for (const pluginsXcconfigFilePath of pluginsXcconfigFilePaths) {
|
|
762
|
+
this.$fs.deleteFile(pluginsXcconfigFilePath);
|
|
763
|
+
}
|
|
764
|
+
const allPlugins = this.getAllProductionPlugins(projectData);
|
|
765
|
+
for (const plugin of allPlugins) {
|
|
766
|
+
const pluginPlatformsFolderPath = plugin.pluginPlatformsFolderPath(IOSProjectService.IOS_PLATFORM_NAME);
|
|
767
|
+
const pluginXcconfigFilePath = path.join(pluginPlatformsFolderPath, constants_2.BUILD_XCCONFIG_FILE_NAME);
|
|
768
|
+
if (this.$fs.exists(pluginXcconfigFilePath)) {
|
|
795
769
|
for (const pluginsXcconfigFilePath of pluginsXcconfigFilePaths) {
|
|
796
|
-
|
|
770
|
+
await this.$xcconfigService.mergeFiles(pluginXcconfigFilePath, pluginsXcconfigFilePath);
|
|
797
771
|
}
|
|
798
772
|
}
|
|
773
|
+
}
|
|
774
|
+
const appResourcesXcconfigPath = path.join(projectData.appResourcesDirectoryPath, this.getPlatformData(projectData).normalizedPlatformName, constants_2.BUILD_XCCONFIG_FILE_NAME);
|
|
775
|
+
if (this.$fs.exists(appResourcesXcconfigPath)) {
|
|
799
776
|
for (const pluginsXcconfigFilePath of pluginsXcconfigFilePaths) {
|
|
800
|
-
|
|
801
|
-
this.$fs.writeFile(pluginsXcconfigFilePath, "");
|
|
802
|
-
}
|
|
777
|
+
await this.$xcconfigService.mergeFiles(appResourcesXcconfigPath, pluginsXcconfigFilePath);
|
|
803
778
|
}
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
const tempEntitlementsDir = yield this.$tempService.mkdirSync("entitlements");
|
|
809
|
-
const tempEntitlementsFilePath = path.join(tempEntitlementsDir, "set-entitlements.xcconfig");
|
|
810
|
-
const entitlementsRelativePath = this.$iOSEntitlementsService.getPlatformsEntitlementsRelativePath(projectData);
|
|
811
|
-
this.$fs.writeFile(tempEntitlementsFilePath, `CODE_SIGN_ENTITLEMENTS = ${entitlementsRelativePath}${os_1.EOL}`);
|
|
812
|
-
yield this.$xcconfigService.mergeFiles(tempEntitlementsFilePath, pluginsXcconfigFilePath);
|
|
813
|
-
}
|
|
779
|
+
}
|
|
780
|
+
for (const pluginsXcconfigFilePath of pluginsXcconfigFilePaths) {
|
|
781
|
+
if (!this.$fs.exists(pluginsXcconfigFilePath)) {
|
|
782
|
+
this.$fs.writeFile(pluginsXcconfigFilePath, "");
|
|
814
783
|
}
|
|
815
|
-
}
|
|
784
|
+
}
|
|
785
|
+
for (const pluginsXcconfigFilePath of pluginsXcconfigFilePaths) {
|
|
786
|
+
const entitlementsPropertyValue = this.$xcconfigService.readPropertyValue(pluginsXcconfigFilePath, constants.CODE_SIGN_ENTITLEMENTS);
|
|
787
|
+
if (entitlementsPropertyValue === null &&
|
|
788
|
+
this.$fs.exists(this.$iOSEntitlementsService.getPlatformsEntitlementsPath(projectData))) {
|
|
789
|
+
const tempEntitlementsDir = await this.$tempService.mkdirSync("entitlements");
|
|
790
|
+
const tempEntitlementsFilePath = path.join(tempEntitlementsDir, "set-entitlements.xcconfig");
|
|
791
|
+
const entitlementsRelativePath = this.$iOSEntitlementsService.getPlatformsEntitlementsRelativePath(projectData);
|
|
792
|
+
this.$fs.writeFile(tempEntitlementsFilePath, `CODE_SIGN_ENTITLEMENTS = ${entitlementsRelativePath}${os_1.EOL}`);
|
|
793
|
+
await this.$xcconfigService.mergeFiles(tempEntitlementsFilePath, pluginsXcconfigFilePath);
|
|
794
|
+
}
|
|
795
|
+
}
|
|
816
796
|
}
|
|
817
797
|
getBuildXCConfigFilePath(projectData) {
|
|
818
798
|
const buildXCConfig = path.join(projectData.appResourcesDirectoryPath, this.getPlatformData(projectData).normalizedPlatformName, constants_2.BUILD_XCCONFIG_FILE_NAME);
|
|
@@ -831,21 +811,19 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
831
811
|
this.$logger.warn(`[WARNING]: The CFBundleIdentifier key inside the 'Info.plist' will be overriden by the 'id' set inside the "${constants_2.CONFIG_FILE_NAME_DISPLAY}".`);
|
|
832
812
|
}
|
|
833
813
|
}
|
|
834
|
-
applyPluginsCocoaPods(pluginsData, projectData, platformData) {
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
yield this.$cocoapodsService.applyPodfileToProject(pluginData.name, this.$cocoapodsService.getPluginPodfilePath(pluginData), projectData, platformData);
|
|
840
|
-
}
|
|
814
|
+
async applyPluginsCocoaPods(pluginsData, projectData, platformData) {
|
|
815
|
+
for (const pluginIndex in pluginsData) {
|
|
816
|
+
const pluginData = pluginsData[pluginIndex];
|
|
817
|
+
if (this.$fs.exists(pluginData.pluginPlatformsFolderPath(platformData.normalizedPlatformName))) {
|
|
818
|
+
await this.$cocoapodsService.applyPodfileToProject(pluginData.name, this.$cocoapodsService.getPluginPodfilePath(pluginData), projectData, platformData);
|
|
841
819
|
}
|
|
842
|
-
}
|
|
820
|
+
}
|
|
843
821
|
}
|
|
844
822
|
}
|
|
823
|
+
exports.IOSProjectService = IOSProjectService;
|
|
845
824
|
IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER = "__PROJECT_NAME__";
|
|
846
825
|
IOSProjectService.IOS_PLATFORM_NAME = "ios";
|
|
847
826
|
__decorate([
|
|
848
827
|
(0, helpers_2.hook)("buildIOS")
|
|
849
828
|
], IOSProjectService.prototype, "buildProject", null);
|
|
850
|
-
exports.IOSProjectService = IOSProjectService;
|
|
851
829
|
yok_1.injector.register("iOSProjectService", IOSProjectService);
|