nativescript 8.9.0-dev.2 → 8.9.0-dev.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/test-deps-versions-generated.json +1 -1
- package/docs/man_pages/project/configuration/widget-ios.md +24 -0
- package/docs/man_pages/project/configuration/widget.md +24 -0
- package/docs/man_pages/start.md +1 -1
- package/lib/android-tools-info.js +11 -22
- package/lib/base-package-manager.js +53 -70
- package/lib/bun-package-manager.js +75 -98
- package/lib/color.js +4 -4
- 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 +54 -67
- package/lib/commands/build.js +55 -87
- package/lib/commands/clean.js +169 -184
- package/lib/commands/command-base.js +14 -27
- package/lib/commands/config.js +49 -68
- package/lib/commands/create-project.js +215 -234
- package/lib/commands/debug.js +66 -88
- package/lib/commands/deploy.js +28 -44
- package/lib/commands/embedding/embed.js +37 -56
- 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 +49 -60
- 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 +23 -46
- package/lib/commands/platform-clean.js +19 -32
- package/lib/commands/plugin/add-plugin.js +12 -25
- package/lib/commands/plugin/build-plugin.js +31 -44
- package/lib/commands/plugin/create-plugin.js +114 -137
- package/lib/commands/plugin/list-plugins.js +22 -33
- package/lib/commands/plugin/remove-plugin.js +21 -34
- package/lib/commands/plugin/update-plugin.js +20 -33
- package/lib/commands/post-install.js +25 -38
- package/lib/commands/prepare.js +19 -35
- package/lib/commands/preview.js +50 -63
- package/lib/commands/remove-platform.js +7 -18
- package/lib/commands/resources/resources-update.js +14 -27
- package/lib/commands/run.js +55 -76
- package/lib/commands/start.js +6 -19
- package/lib/commands/test-init.js +126 -137
- package/lib/commands/test.js +72 -95
- package/lib/commands/typings.js +126 -142
- package/lib/commands/update-platform.js +26 -39
- package/lib/commands/update.js +31 -44
- package/lib/commands/widget.js +408 -357
- 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 +29 -42
- package/lib/common/commands/autocompletion.js +41 -58
- package/lib/common/commands/device/device-log-stream.js +12 -23
- package/lib/common/commands/device/get-file.js +23 -34
- 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 +24 -35
- package/lib/common/commands/device/put-file.js +23 -34
- 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 +27 -42
- package/lib/common/commands/proxy/proxy-base.js +11 -22
- 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 +84 -101
- package/lib/common/errors.js +92 -107
- package/lib/common/file-system.js +110 -132
- package/lib/common/header.js +1 -2
- package/lib/common/helpers.js +149 -178
- package/lib/common/host-info.js +40 -53
- package/lib/common/http-client.js +104 -119
- 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 +4 -4
- package/lib/common/mobile/android/android-application-manager.js +138 -159
- package/lib/common/mobile/android/android-debug-bridge-result-handler.js +1 -1
- package/lib/common/mobile/android/android-debug-bridge.js +92 -117
- package/lib/common/mobile/android/android-device-file-system.js +101 -134
- package/lib/common/mobile/android/android-device-hash-service.js +52 -77
- package/lib/common/mobile/android/android-device.js +73 -90
- 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 +78 -99
- package/lib/common/mobile/android/device-android-debug-bridge.js +13 -29
- package/lib/common/mobile/android/genymotion/genymotion-service.js +94 -121
- package/lib/common/mobile/android/genymotion/virtualbox-service.js +74 -91
- package/lib/common/mobile/android/logcat-helper.js +114 -133
- package/lib/common/mobile/application-manager-base.js +89 -112
- package/lib/common/mobile/device-log-provider-base.js +7 -18
- 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 +106 -143
- 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 +66 -95
- package/lib/common/mobile/ios/simulator/ios-sim-resolver.js +1 -1
- package/lib/common/mobile/ios/simulator/ios-simulator-application-manager.js +61 -90
- package/lib/common/mobile/ios/simulator/ios-simulator-device.js +31 -47
- 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 +44 -63
- package/lib/common/mobile/mobile-core/android-emulator-discovery.js +23 -34
- package/lib/common/mobile/mobile-core/android-process-service.js +174 -213
- package/lib/common/mobile/mobile-core/device-discovery.js +2 -13
- package/lib/common/mobile/mobile-core/devices-service.js +400 -450
- package/lib/common/mobile/mobile-core/ios-device-discovery.js +25 -36
- package/lib/common/mobile/mobile-core/ios-simulator-discovery.js +49 -64
- 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/prompter.js +91 -106
- package/lib/common/queue.js +9 -20
- package/lib/common/services/auto-completion-service.js +40 -53
- package/lib/common/services/cancellation.js +17 -28
- package/lib/common/services/commands-service.js +156 -179
- package/lib/common/services/help-service.js +130 -155
- package/lib/common/services/hooks-service.js +99 -114
- package/lib/common/services/ios-notification-service.js +21 -34
- package/lib/common/services/json-file-settings-service.js +56 -75
- 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 +6 -17
- package/lib/common/services/net-service.js +92 -109
- 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 +2 -2
- 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 +25 -38
- package/lib/config.js +41 -56
- package/lib/constants.js +24 -24
- package/lib/controllers/build-controller.js +82 -99
- package/lib/controllers/debug-controller.js +111 -132
- package/lib/controllers/deploy-controller.js +15 -23
- package/lib/controllers/migrate-controller.js +780 -853
- package/lib/controllers/platform-controller.js +74 -89
- package/lib/controllers/prepare-controller.js +241 -270
- package/lib/controllers/run-controller.js +411 -425
- package/lib/controllers/update-controller-base.js +16 -29
- package/lib/controllers/update-controller.js +101 -126
- package/lib/data/prepare-data.js +4 -1
- package/lib/definitions/project.d.ts +24 -24
- 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 +155 -170
- package/lib/device-sockets/ios/notification.js +1 -1
- package/lib/device-sockets/ios/socket-request-executor.js +26 -41
- package/lib/helpers/android-bundle-validator-helper.js +1 -1
- package/lib/helpers/deploy-command-helper.js +44 -49
- package/lib/helpers/key-command-helper.js +4 -13
- package/lib/helpers/livesync-command-helper.js +138 -153
- 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 +103 -124
- package/lib/key-commands/index.js +150 -200
- package/lib/nativescript-cli.js +5 -14
- package/lib/node-package-manager.js +90 -113
- package/lib/options.js +4 -13
- package/lib/package-installation-manager.js +132 -167
- package/lib/package-manager.js +64 -87
- package/lib/platform-command-param.js +4 -15
- package/lib/pnpm-package-manager.js +60 -79
- package/lib/project-data.js +1 -1
- package/lib/providers/project-files-provider.js +1 -1
- 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 +165 -201
- 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 +10 -21
- package/lib/services/android/gradle-build-service.js +22 -35
- package/lib/services/android/gradle-command-service.js +22 -35
- package/lib/services/android-device-debug-service.js +92 -119
- package/lib/services/android-plugin-build-service.js +219 -245
- package/lib/services/android-project-service.js +134 -179
- package/lib/services/android-resources-migration-service.js +57 -70
- package/lib/services/apple-portal/apple-portal-application-service.js +46 -63
- package/lib/services/apple-portal/apple-portal-session-service.js +196 -215
- package/lib/services/apple-portal/srp/srp-wrapper.js +45 -60
- package/lib/services/assets-generation/assets-generation-service.js +114 -128
- 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 +124 -145
- package/lib/services/device/device-install-app-service.js +54 -71
- package/lib/services/doctor-service.js +106 -125
- package/lib/services/extensibility-service.js +87 -106
- package/lib/services/files-hash-service.js +26 -43
- package/lib/services/hmr-status-service.js +1 -1
- package/lib/services/initialize-service.js +38 -51
- package/lib/services/ios/export-options-plist-service.js +41 -54
- package/lib/services/ios/ios-signing-service.js +171 -190
- package/lib/services/ios/spm-service.js +52 -65
- 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 +52 -71
- package/lib/services/ios-debugger-port-service.js +24 -37
- 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 +530 -591
- package/lib/services/ios-provision-service.js +110 -131
- package/lib/services/ios-watch-app-service.js +21 -32
- package/lib/services/ip-service.js +39 -54
- 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 +121 -150
- package/lib/services/livesync/android-device-livesync-sockets-service.js +123 -154
- package/lib/services/livesync/android-livesync-service.js +14 -35
- package/lib/services/livesync/android-livesync-tool.js +90 -113
- package/lib/services/livesync/device-livesync-service-base.js +16 -29
- package/lib/services/livesync/ios-device-livesync-service.js +120 -149
- package/lib/services/livesync/ios-livesync-service.js +43 -59
- package/lib/services/livesync/platform-livesync-service-base.js +98 -123
- package/lib/services/log-parser-service.js +1 -1
- package/lib/services/log-source-map-service.js +31 -42
- package/lib/services/marking-mode-service.js +17 -30
- package/lib/services/npm-config-service.js +1 -1
- package/lib/services/pacote-service.js +54 -69
- package/lib/services/performance-service.js +1 -1
- package/lib/services/platform/add-platform-service.js +57 -78
- package/lib/services/platform/platform-validation-service.js +22 -33
- package/lib/services/platform/prepare-native-platform-service.js +51 -64
- package/lib/services/platform-environment-requirements.js +27 -38
- package/lib/services/plugins-service.js +126 -151
- package/lib/services/project-backup-service.js +1 -1
- package/lib/services/project-changes-service.js +126 -143
- package/lib/services/project-cleanup-service.js +65 -78
- package/lib/services/project-config-service.js +78 -88
- package/lib/services/project-data-service.js +112 -129
- package/lib/services/project-name-service.js +28 -43
- package/lib/services/project-service.js +90 -109
- 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 +15 -26
- package/lib/services/test-execution-service.js +64 -77
- package/lib/services/test-initialization-service.js +2 -2
- package/lib/services/timeline-profiler-service.js +1 -1
- package/lib/services/versions-service.js +120 -139
- package/lib/services/webpack/webpack-compiler-service.js +228 -251
- package/lib/services/xcconfig-service.js +8 -19
- 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 +62 -81
- package/package.json +67 -82
- package/node_modules/@npmcli/move-file/LICENSE.md +0 -22
- package/node_modules/@npmcli/move-file/README.md +0 -69
- package/node_modules/@npmcli/move-file/lib/index.js +0 -185
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/LICENSE +0 -21
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/bin/cmd.js +0 -68
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/index.js +0 -31
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/lib/find-made.js +0 -29
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/lib/mkdirp-manual.js +0 -64
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/lib/mkdirp-native.js +0 -39
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/lib/opts-arg.js +0 -23
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/lib/path-arg.js +0 -29
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/lib/use-native.js +0 -10
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/package.json +0 -44
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/readme.markdown +0 -266
- package/node_modules/@npmcli/move-file/package.json +0 -47
- package/node_modules/balanced-match/.github/FUNDING.yml +0 -2
- package/node_modules/balanced-match/LICENSE.md +0 -21
- package/node_modules/balanced-match/README.md +0 -97
- package/node_modules/balanced-match/index.js +0 -62
- package/node_modules/balanced-match/package.json +0 -48
- package/node_modules/concat-map/.travis.yml +0 -4
- package/node_modules/concat-map/LICENSE +0 -18
- package/node_modules/concat-map/README.markdown +0 -62
- package/node_modules/concat-map/example/map.js +0 -6
- package/node_modules/concat-map/index.js +0 -13
- package/node_modules/concat-map/package.json +0 -43
- package/node_modules/concat-map/test/map.js +0 -39
- package/node_modules/fs.realpath/LICENSE +0 -43
- package/node_modules/fs.realpath/README.md +0 -33
- package/node_modules/fs.realpath/index.js +0 -66
- package/node_modules/fs.realpath/old.js +0 -303
- package/node_modules/fs.realpath/package.json +0 -26
- package/node_modules/inflight/LICENSE +0 -15
- package/node_modules/inflight/README.md +0 -37
- package/node_modules/inflight/inflight.js +0 -54
- package/node_modules/inflight/package.json +0 -29
- package/node_modules/inherits/LICENSE +0 -16
- package/node_modules/inherits/README.md +0 -42
- package/node_modules/inherits/inherits.js +0 -9
- package/node_modules/inherits/inherits_browser.js +0 -27
- package/node_modules/inherits/package.json +0 -29
- package/node_modules/once/LICENSE +0 -15
- package/node_modules/once/README.md +0 -79
- package/node_modules/once/once.js +0 -42
- package/node_modules/once/package.json +0 -33
- package/node_modules/path-is-absolute/index.js +0 -20
- package/node_modules/path-is-absolute/license +0 -21
- package/node_modules/path-is-absolute/package.json +0 -43
- package/node_modules/path-is-absolute/readme.md +0 -59
- package/node_modules/rimraf/LICENSE +0 -15
- package/node_modules/rimraf/README.md +0 -101
- package/node_modules/rimraf/bin.js +0 -68
- package/node_modules/rimraf/node_modules/brace-expansion/LICENSE +0 -21
- package/node_modules/rimraf/node_modules/brace-expansion/README.md +0 -129
- package/node_modules/rimraf/node_modules/brace-expansion/index.js +0 -201
- package/node_modules/rimraf/node_modules/brace-expansion/package.json +0 -47
- package/node_modules/rimraf/node_modules/glob/LICENSE +0 -21
- package/node_modules/rimraf/node_modules/glob/README.md +0 -378
- package/node_modules/rimraf/node_modules/glob/common.js +0 -238
- package/node_modules/rimraf/node_modules/glob/glob.js +0 -790
- package/node_modules/rimraf/node_modules/glob/package.json +0 -55
- package/node_modules/rimraf/node_modules/glob/sync.js +0 -486
- package/node_modules/rimraf/node_modules/minimatch/LICENSE +0 -15
- package/node_modules/rimraf/node_modules/minimatch/README.md +0 -230
- package/node_modules/rimraf/node_modules/minimatch/minimatch.js +0 -947
- package/node_modules/rimraf/node_modules/minimatch/package.json +0 -33
- package/node_modules/rimraf/package.json +0 -32
- package/node_modules/rimraf/rimraf.js +0 -360
- package/node_modules/stringify-package/LICENSE +0 -13
- package/node_modules/stringify-package/README.md +0 -55
- package/node_modules/stringify-package/index.js +0 -18
- package/node_modules/stringify-package/package.json +0 -38
- package/node_modules/wrappy/LICENSE +0 -15
- package/node_modules/wrappy/README.md +0 -36
- package/node_modules/wrappy/package.json +0 -29
- package/node_modules/wrappy/wrappy.js +0 -33
|
@@ -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");
|
|
@@ -152,122 +143,110 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
152
143
|
}
|
|
153
144
|
return this._platformData;
|
|
154
145
|
}
|
|
155
|
-
validateOptions(projectId, provision, teamId) {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
return true;
|
|
169
|
-
});
|
|
146
|
+
async validateOptions(projectId, provision, teamId) {
|
|
147
|
+
if (provision && teamId) {
|
|
148
|
+
this.$errors.fail("The options --provision and --teamId are mutually exclusive.");
|
|
149
|
+
}
|
|
150
|
+
if (provision === true) {
|
|
151
|
+
await this.$iOSProvisionService.listProvisions(projectId);
|
|
152
|
+
this.$errors.fail("Please provide provisioning profile uuid or name with the --provision option.");
|
|
153
|
+
}
|
|
154
|
+
if (teamId === true) {
|
|
155
|
+
await this.$iOSProvisionService.listTeams();
|
|
156
|
+
this.$errors.fail("Please provide team id or team name with the --teamId options.");
|
|
157
|
+
}
|
|
158
|
+
return true;
|
|
170
159
|
}
|
|
171
160
|
getAppResourcesDestinationDirectoryPath(projectData) {
|
|
172
161
|
return path.join(this.getPlatformData(projectData).projectRoot, projectData.projectName, "Resources");
|
|
173
162
|
}
|
|
174
|
-
validate(projectData, options, notConfiguredEnvOptions) {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
notConfiguredEnvOptions,
|
|
184
|
-
});
|
|
185
|
-
if (checkEnvironmentRequirementsOutput &&
|
|
186
|
-
checkEnvironmentRequirementsOutput.canExecute) {
|
|
187
|
-
const xcodeWarning = yield this.$sysInfo.getXcodeWarning();
|
|
188
|
-
if (xcodeWarning) {
|
|
189
|
-
this.$logger.warn(xcodeWarning);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return {
|
|
193
|
-
checkEnvironmentRequirementsOutput,
|
|
194
|
-
};
|
|
163
|
+
async validate(projectData, options, notConfiguredEnvOptions) {
|
|
164
|
+
if (!this.$hostInfo.isDarwin) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const checkEnvironmentRequirementsOutput = await this.$platformEnvironmentRequirements.checkEnvironmentRequirements({
|
|
168
|
+
platform: this.getPlatformData(projectData).normalizedPlatformName,
|
|
169
|
+
projectDir: projectData.projectDir,
|
|
170
|
+
options,
|
|
171
|
+
notConfiguredEnvOptions,
|
|
195
172
|
});
|
|
173
|
+
if (checkEnvironmentRequirementsOutput &&
|
|
174
|
+
checkEnvironmentRequirementsOutput.canExecute) {
|
|
175
|
+
const xcodeWarning = await this.$sysInfo.getXcodeWarning();
|
|
176
|
+
if (xcodeWarning) {
|
|
177
|
+
this.$logger.warn(xcodeWarning);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return {
|
|
181
|
+
checkEnvironmentRequirementsOutput,
|
|
182
|
+
};
|
|
196
183
|
}
|
|
197
|
-
createProject(frameworkDir, frameworkVersion, projectData) {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
shell.cp("-R", path.join(frameworkDir, "*"), this.getPlatformData(projectData).projectRoot);
|
|
201
|
-
});
|
|
184
|
+
async createProject(frameworkDir, frameworkVersion, projectData) {
|
|
185
|
+
this.$fs.ensureDirectoryExists(path.join(this.getPlatformData(projectData).projectRoot, IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER));
|
|
186
|
+
shell.cp("-R", path.join(frameworkDir, "*"), this.getPlatformData(projectData).projectRoot);
|
|
202
187
|
}
|
|
203
188
|
//TODO: plamen5kov: revisit this method, might have unnecessary/obsolete logic
|
|
204
|
-
interpolateData(projectData) {
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
}
|
|
240
|
-
});
|
|
189
|
+
async interpolateData(projectData) {
|
|
190
|
+
const projectRootFilePath = path.join(this.getPlatformData(projectData).projectRoot, IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER);
|
|
191
|
+
// Starting with NativeScript for iOS 1.6.0, the project Info.plist file resides not in the platform project,
|
|
192
|
+
// but in the hello-world app template as a platform specific resource.
|
|
193
|
+
if (this.$fs.exists(path.join(projectRootFilePath, IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER + "-Info.plist"))) {
|
|
194
|
+
this.replaceFileName("-Info.plist", projectRootFilePath, projectData);
|
|
195
|
+
}
|
|
196
|
+
this.replaceFileName("-Prefix.pch", projectRootFilePath, projectData);
|
|
197
|
+
if (this.$fs.exists(path.join(projectRootFilePath, IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER + ".entitlements"))) {
|
|
198
|
+
this.replaceFileName(".entitlements", projectRootFilePath, projectData);
|
|
199
|
+
}
|
|
200
|
+
const xcschemeDirPath = path.join(this.getPlatformData(projectData).projectRoot, IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER +
|
|
201
|
+
constants_2.IosProjectConstants.XcodeProjExtName, "xcshareddata/xcschemes");
|
|
202
|
+
const xcschemeFilePath = path.join(xcschemeDirPath, IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER +
|
|
203
|
+
constants_2.IosProjectConstants.XcodeSchemeExtName);
|
|
204
|
+
if (this.$fs.exists(xcschemeFilePath)) {
|
|
205
|
+
this.$logger.trace("Found shared scheme at xcschemeFilePath, renaming to match project name.");
|
|
206
|
+
this.$logger.trace("Checkpoint 0");
|
|
207
|
+
this.replaceFileContent(xcschemeFilePath, projectData);
|
|
208
|
+
this.$logger.trace("Checkpoint 1");
|
|
209
|
+
this.replaceFileName(constants_2.IosProjectConstants.XcodeSchemeExtName, xcschemeDirPath, projectData);
|
|
210
|
+
this.$logger.trace("Checkpoint 2");
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
this.$logger.trace("Copying xcscheme from template not found at " + xcschemeFilePath);
|
|
214
|
+
}
|
|
215
|
+
this.replaceFileName(constants_2.IosProjectConstants.XcodeProjExtName, this.getPlatformData(projectData).projectRoot, projectData);
|
|
216
|
+
const pbxprojFilePath = this.getPbxProjPath(projectData);
|
|
217
|
+
this.replaceFileContent(pbxprojFilePath, projectData);
|
|
218
|
+
const internalDirPath = path.join(projectRootFilePath, "..", "internal");
|
|
219
|
+
const xcframeworksFilePath = path.join(internalDirPath, "XCFrameworks.zip");
|
|
220
|
+
if (this.$fs.exists(xcframeworksFilePath)) {
|
|
221
|
+
await this.$fs.unzip(xcframeworksFilePath, internalDirPath);
|
|
222
|
+
this.$fs.deleteFile(xcframeworksFilePath);
|
|
223
|
+
}
|
|
241
224
|
}
|
|
242
225
|
interpolateConfigurationFile(projectData) {
|
|
243
226
|
return undefined;
|
|
244
227
|
}
|
|
245
|
-
cleanProject(projectRoot, projectData) {
|
|
246
|
-
return
|
|
247
|
-
return null;
|
|
248
|
-
});
|
|
228
|
+
async cleanProject(projectRoot, projectData) {
|
|
229
|
+
return null;
|
|
249
230
|
}
|
|
250
231
|
afterCreateProject(projectRoot, projectData) {
|
|
251
232
|
this.$fs.rename(path.join(projectRoot, IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER), path.join(projectRoot, projectData.projectName));
|
|
252
233
|
}
|
|
253
|
-
buildProject(projectRoot, projectData, buildData) {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
this.validateApplicationIdentifier(projectData);
|
|
270
|
-
});
|
|
234
|
+
async buildProject(projectRoot, projectData, buildData) {
|
|
235
|
+
const platformData = this.getPlatformData(projectData);
|
|
236
|
+
const handler = (data) => {
|
|
237
|
+
this.emit(constants.BUILD_OUTPUT_EVENT_NAME, data);
|
|
238
|
+
};
|
|
239
|
+
if (buildData.buildForDevice) {
|
|
240
|
+
await this.$iOSSigningService.setupSigningForDevice(projectRoot, projectData, buildData);
|
|
241
|
+
await (0, helpers_1.attachAwaitDetach)(constants.BUILD_OUTPUT_EVENT_NAME, this.$childProcess, handler, this.$xcodebuildService.buildForDevice(platformData, projectData, buildData));
|
|
242
|
+
}
|
|
243
|
+
else if (buildData.buildForAppStore) {
|
|
244
|
+
await (0, helpers_1.attachAwaitDetach)(constants.BUILD_OUTPUT_EVENT_NAME, this.$childProcess, handler, this.$xcodebuildService.buildForAppStore(platformData, projectData, buildData));
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
await (0, helpers_1.attachAwaitDetach)(constants.BUILD_OUTPUT_EVENT_NAME, this.$childProcess, handler, this.$xcodebuildService.buildForSimulator(platformData, projectData, buildData));
|
|
248
|
+
}
|
|
249
|
+
this.validateApplicationIdentifier(projectData);
|
|
271
250
|
}
|
|
272
251
|
isPlatformPrepared(projectRoot, projectData) {
|
|
273
252
|
return this.$fs.exists(path.join(projectRoot, projectData.projectName, constants.APP_FOLDER_NAME));
|
|
@@ -275,210 +254,200 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
275
254
|
cleanDeviceTempFolder(deviceIdentifier) {
|
|
276
255
|
return Promise.resolve();
|
|
277
256
|
}
|
|
278
|
-
isDynamicFramework(frameworkPath) {
|
|
279
|
-
|
|
280
|
-
const
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
break;
|
|
295
|
-
}
|
|
257
|
+
async isDynamicFramework(frameworkPath) {
|
|
258
|
+
const isDynamicFrameworkBundle = async (bundlePath, frameworkName) => {
|
|
259
|
+
const frameworkBinaryPath = path.join(bundlePath, frameworkName);
|
|
260
|
+
const fileResult = (await this.$childProcess.spawnFromEvent("file", [frameworkBinaryPath], "close")).stdout;
|
|
261
|
+
const isDynamicallyLinked = _.includes(fileResult, "dynamically linked");
|
|
262
|
+
return isDynamicallyLinked;
|
|
263
|
+
};
|
|
264
|
+
if (path.extname(frameworkPath) === ".xcframework") {
|
|
265
|
+
let isDynamic = true;
|
|
266
|
+
const plistJson = this.$plistParser.parseFileSync(path.join(frameworkPath, "Info.plist"));
|
|
267
|
+
for (const library of plistJson.AvailableLibraries) {
|
|
268
|
+
const singlePlatformFramework = path.join(frameworkPath, library.LibraryIdentifier, library.LibraryPath);
|
|
269
|
+
if (this.$fs.exists(singlePlatformFramework)) {
|
|
270
|
+
const frameworkName = path.basename(singlePlatformFramework, path.extname(singlePlatformFramework));
|
|
271
|
+
isDynamic = await isDynamicFrameworkBundle(singlePlatformFramework, frameworkName);
|
|
272
|
+
break;
|
|
296
273
|
}
|
|
297
|
-
return isDynamic;
|
|
298
274
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
275
|
+
return isDynamic;
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
const frameworkName = path.basename(frameworkPath, path.extname(frameworkPath));
|
|
279
|
+
return await isDynamicFrameworkBundle(frameworkPath, frameworkName);
|
|
280
|
+
}
|
|
304
281
|
}
|
|
305
|
-
addFramework(frameworkPath, projectData) {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
this.savePbxProj(project, projectData);
|
|
339
|
-
});
|
|
282
|
+
async addFramework(frameworkPath, projectData) {
|
|
283
|
+
if (this.$hostInfo.isWindows) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
this.validateFramework(frameworkPath);
|
|
287
|
+
const project = this.createPbxProj(projectData);
|
|
288
|
+
const frameworkAddOptions = { customFramework: true };
|
|
289
|
+
const dynamic = await this.isDynamicFramework(frameworkPath);
|
|
290
|
+
if (dynamic) {
|
|
291
|
+
frameworkAddOptions["embed"] = true;
|
|
292
|
+
frameworkAddOptions["sign"] = true;
|
|
293
|
+
}
|
|
294
|
+
if (this.$options.hostProjectPath) {
|
|
295
|
+
// always mark xcframeworks for embedding
|
|
296
|
+
frameworkAddOptions["embed"] = true;
|
|
297
|
+
frameworkAddOptions["sign"] = false;
|
|
298
|
+
}
|
|
299
|
+
// Note: we used to prepend "$(SRCROOT)/" to the framework path, but seems like it's not needed anymore
|
|
300
|
+
// "$(SRCROOT)/" +
|
|
301
|
+
const frameworkRelativePath = this.getLibSubpathRelativeToProjectPath(frameworkPath, projectData);
|
|
302
|
+
project.addFramework(frameworkRelativePath, frameworkAddOptions);
|
|
303
|
+
// filePathsArray, buildPhaseType, comment, target, optionsOrFolderType, subfolderPath
|
|
304
|
+
// project.addBuildPhase(
|
|
305
|
+
// [],
|
|
306
|
+
// "PBXShellScriptBuildPhase",
|
|
307
|
+
// "Debug SRCROOT",
|
|
308
|
+
// undefined,
|
|
309
|
+
// {
|
|
310
|
+
// shellPath: "/bin/sh",
|
|
311
|
+
// shellScript: `echo "SRCROOT: $SRCROOT"`,
|
|
312
|
+
// }
|
|
313
|
+
// );
|
|
314
|
+
this.savePbxProj(project, projectData);
|
|
340
315
|
}
|
|
341
|
-
addStaticLibrary(staticLibPath, projectData) {
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
this.savePbxProj(project, projectData);
|
|
354
|
-
});
|
|
316
|
+
async addStaticLibrary(staticLibPath, projectData) {
|
|
317
|
+
// Copy files to lib folder.
|
|
318
|
+
const libraryName = path.basename(staticLibPath, ".a");
|
|
319
|
+
const headersSubpath = path.join(path.dirname(staticLibPath), "include", libraryName);
|
|
320
|
+
// Add static library to project file and setup header search paths
|
|
321
|
+
const project = this.createPbxProj(projectData);
|
|
322
|
+
const relativeStaticLibPath = this.getLibSubpathRelativeToProjectPath(staticLibPath, projectData);
|
|
323
|
+
project.addFramework(relativeStaticLibPath);
|
|
324
|
+
const relativeHeaderSearchPath = path.join(this.getLibSubpathRelativeToProjectPath(headersSubpath, projectData));
|
|
325
|
+
project.addToHeaderSearchPaths({ relativePath: relativeHeaderSearchPath });
|
|
326
|
+
this.generateModulemap(headersSubpath, libraryName);
|
|
327
|
+
this.savePbxProj(project, projectData);
|
|
355
328
|
}
|
|
356
|
-
prepareProject(projectData, prepareData) {
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
329
|
+
async prepareProject(projectData, prepareData) {
|
|
330
|
+
const projectRoot = this.$options.hostProjectPath
|
|
331
|
+
? this.$options.hostProjectPath
|
|
332
|
+
: path.join(projectData.platformsDir, this.$devicePlatformsConstants.iOS.toLowerCase());
|
|
333
|
+
const platformData = this.getPlatformData(projectData);
|
|
334
|
+
const pluginsData = this.getAllProductionPlugins(projectData);
|
|
335
|
+
const pbxProjPath = this.getPbxProjPath(projectData);
|
|
336
|
+
this.$iOSExtensionsService.removeExtensions({ pbxProjPath });
|
|
337
|
+
await this.addExtensions(projectData, pluginsData);
|
|
338
|
+
const resourcesDirectoryPath = projectData.getAppResourcesDirectoryPath();
|
|
339
|
+
const provision = prepareData && prepareData.provision;
|
|
340
|
+
const teamId = prepareData && prepareData.teamId;
|
|
341
|
+
if (provision) {
|
|
342
|
+
await this.$iOSSigningService.setupSigningFromProvision(projectRoot, projectData, provision, prepareData.mobileProvisionData);
|
|
343
|
+
}
|
|
344
|
+
if (teamId) {
|
|
345
|
+
await this.$iOSSigningService.setupSigningFromTeam(projectRoot, projectData, teamId);
|
|
346
|
+
}
|
|
347
|
+
const project = this.createPbxProj(projectData);
|
|
348
|
+
if (this.$options.hostProjectPath) {
|
|
349
|
+
try {
|
|
350
|
+
project.addPbxGroup([], "NativeScript", "NativeScript", null, {
|
|
351
|
+
isMain: true,
|
|
352
|
+
filesRelativeToProject: true,
|
|
353
|
+
uuid: "NATIVESCRIPTNATIVESCRIPT",
|
|
354
|
+
});
|
|
355
|
+
/**
|
|
356
|
+
* 1. Add platforms/ios/{projectname}/app build to the host app
|
|
357
|
+
*/
|
|
358
|
+
// Note: allow customization of this targetFolderName
|
|
359
|
+
// const targetFolderName = "app";
|
|
360
|
+
const buildFolderPath = path.join(this.$options.hostProjectPath, projectData.projectName);
|
|
361
|
+
project.addResourceFile(buildFolderPath, {}, "NATIVESCRIPTNATIVESCRIPT");
|
|
362
|
+
// filePathsArray, buildPhaseType, comment, target, optionsOrFolderType, subfolderPath
|
|
363
|
+
// project.addBuildPhase(
|
|
364
|
+
// [],
|
|
365
|
+
// "PBXShellScriptBuildPhase",
|
|
366
|
+
// "Copy Metadata (DEBUG)",
|
|
367
|
+
// undefined,
|
|
368
|
+
// {
|
|
369
|
+
// shellPath: "/bin/sh",
|
|
370
|
+
// shellScript: `cp ./platforms/ios/build/Debug-iphonesimulator/metadata-arm64.bin $CONFIGURATION_BUILD_DIR`,
|
|
371
|
+
// outputPaths: [
|
|
372
|
+
// JSON.stringify("$(CONFIGURATION_BUILD_DIR)/metadata-arm64.bin"),
|
|
373
|
+
// // JSON.stringify("$(CONFIGURATION_BUILD_DIR)/metadata-arm64e.bin"),
|
|
374
|
+
// // JSON.stringify("$(CONFIGURATION_BUILD_DIR)/metadata-i386.bin"),
|
|
375
|
+
// // JSON.stringify("$(CONFIGURATION_BUILD_DIR)/metadata-x86_64.bin"),
|
|
376
|
+
// ],
|
|
377
|
+
// }
|
|
378
|
+
// );
|
|
379
|
+
const metadataPath = path.relative(this.$options.hostProjectPath, buildFolderPath);
|
|
380
|
+
project.addToOtherLinkerFlags(JSON.stringify(`-sectcreate __DATA __TNSMetadata "${metadataPath}/metadata-arm64.bin"`));
|
|
381
|
+
// // no shorthand way to get UUID of build phase that i can tell
|
|
382
|
+
// // methods return the phase as an object but ommitted the actual key (uuid we need)
|
|
383
|
+
// // this does it same way nativescript-dev-xcode does but gets the uuid we need
|
|
384
|
+
// const resourcesBuildPhaseKeys = Object.keys(
|
|
385
|
+
// project.hash.project.objects["PBXResourcesBuildPhase"]
|
|
386
|
+
// );
|
|
387
|
+
// // console.log('resourcesBuildPhaseKeys:', resourcesBuildPhaseKeys);
|
|
388
|
+
// const buildPhaseUUID = resourcesBuildPhaseKeys[0];
|
|
389
|
+
// const comment = `${targetFolderName} in Resources`;
|
|
390
|
+
// project.hash.project.objects["PBXResourcesBuildPhase"][
|
|
391
|
+
// buildPhaseUUID
|
|
392
|
+
// ].files.forEach((f: any) => {
|
|
393
|
+
// console.log(f);
|
|
394
|
+
// });
|
|
395
|
+
// if (
|
|
396
|
+
// !project.hash.project.objects["PBXResourcesBuildPhase"][
|
|
397
|
+
// buildPhaseUUID
|
|
398
|
+
// ].files.find((f: any) => f.comment === comment)
|
|
399
|
+
// ) {
|
|
400
|
+
// project.addResourceFile(buildFolderPath, {}, buildPhaseUUID);
|
|
401
|
+
// }
|
|
402
|
+
/**
|
|
403
|
+
* 2. Ensure metadata is copied as a file
|
|
404
|
+
* The apps metadata-{arch}.bin should be added as a file reference.
|
|
405
|
+
*/
|
|
406
|
+
// TODO
|
|
407
|
+
this.savePbxProj(project, projectData);
|
|
374
408
|
}
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
try {
|
|
378
|
-
project.addPbxGroup([], "NativeScript", "NativeScript", null, {
|
|
379
|
-
isMain: true,
|
|
380
|
-
filesRelativeToProject: true,
|
|
381
|
-
uuid: "NATIVESCRIPTNATIVESCRIPT",
|
|
382
|
-
});
|
|
383
|
-
/**
|
|
384
|
-
* 1. Add platforms/ios/{projectname}/app build to the host app
|
|
385
|
-
*/
|
|
386
|
-
// Note: allow customization of this targetFolderName
|
|
387
|
-
// const targetFolderName = "app";
|
|
388
|
-
const buildFolderPath = path.join(this.$options.hostProjectPath, projectData.projectName
|
|
389
|
-
// targetFolderName
|
|
390
|
-
);
|
|
391
|
-
project.addResourceFile(buildFolderPath, {}, "NATIVESCRIPTNATIVESCRIPT");
|
|
392
|
-
// filePathsArray, buildPhaseType, comment, target, optionsOrFolderType, subfolderPath
|
|
393
|
-
// project.addBuildPhase(
|
|
394
|
-
// [],
|
|
395
|
-
// "PBXShellScriptBuildPhase",
|
|
396
|
-
// "Copy Metadata (DEBUG)",
|
|
397
|
-
// undefined,
|
|
398
|
-
// {
|
|
399
|
-
// shellPath: "/bin/sh",
|
|
400
|
-
// shellScript: `cp ./platforms/ios/build/Debug-iphonesimulator/metadata-arm64.bin $CONFIGURATION_BUILD_DIR`,
|
|
401
|
-
// outputPaths: [
|
|
402
|
-
// JSON.stringify("$(CONFIGURATION_BUILD_DIR)/metadata-arm64.bin"),
|
|
403
|
-
// // JSON.stringify("$(CONFIGURATION_BUILD_DIR)/metadata-arm64e.bin"),
|
|
404
|
-
// // JSON.stringify("$(CONFIGURATION_BUILD_DIR)/metadata-i386.bin"),
|
|
405
|
-
// // JSON.stringify("$(CONFIGURATION_BUILD_DIR)/metadata-x86_64.bin"),
|
|
406
|
-
// ],
|
|
407
|
-
// }
|
|
408
|
-
// );
|
|
409
|
-
const metadataPath = path.relative(this.$options.hostProjectPath, buildFolderPath);
|
|
410
|
-
project.addToOtherLinkerFlags(JSON.stringify(`-sectcreate __DATA __TNSMetadata "${metadataPath}/metadata-arm64.bin"`));
|
|
411
|
-
// // no shorthand way to get UUID of build phase that i can tell
|
|
412
|
-
// // methods return the phase as an object but ommitted the actual key (uuid we need)
|
|
413
|
-
// // this does it same way nativescript-dev-xcode does but gets the uuid we need
|
|
414
|
-
// const resourcesBuildPhaseKeys = Object.keys(
|
|
415
|
-
// project.hash.project.objects["PBXResourcesBuildPhase"]
|
|
416
|
-
// );
|
|
417
|
-
// // console.log('resourcesBuildPhaseKeys:', resourcesBuildPhaseKeys);
|
|
418
|
-
// const buildPhaseUUID = resourcesBuildPhaseKeys[0];
|
|
419
|
-
// const comment = `${targetFolderName} in Resources`;
|
|
420
|
-
// project.hash.project.objects["PBXResourcesBuildPhase"][
|
|
421
|
-
// buildPhaseUUID
|
|
422
|
-
// ].files.forEach((f: any) => {
|
|
423
|
-
// console.log(f);
|
|
424
|
-
// });
|
|
425
|
-
// if (
|
|
426
|
-
// !project.hash.project.objects["PBXResourcesBuildPhase"][
|
|
427
|
-
// buildPhaseUUID
|
|
428
|
-
// ].files.find((f: any) => f.comment === comment)
|
|
429
|
-
// ) {
|
|
430
|
-
// project.addResourceFile(buildFolderPath, {}, buildPhaseUUID);
|
|
431
|
-
// }
|
|
432
|
-
/**
|
|
433
|
-
* 2. Ensure metadata is copied as a file
|
|
434
|
-
* The apps metadata-{arch}.bin should be added as a file reference.
|
|
435
|
-
*/
|
|
436
|
-
// TODO
|
|
437
|
-
this.savePbxProj(project, projectData);
|
|
438
|
-
}
|
|
439
|
-
catch (err) {
|
|
440
|
-
this.$logger.trace("Error adding NativeScript group to host project", err);
|
|
441
|
-
}
|
|
409
|
+
catch (err) {
|
|
410
|
+
this.$logger.trace("Error adding NativeScript group to host project", err);
|
|
442
411
|
}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
412
|
+
}
|
|
413
|
+
const resources = project.pbxGroupByName("Resources");
|
|
414
|
+
if (resources && !this.$options.hostProjectPath) {
|
|
415
|
+
const references = project.pbxFileReferenceSection();
|
|
416
|
+
const xcodeProjectImages = _.map(resources.children, (resource) => this.replace(references[resource.value].name));
|
|
417
|
+
this.$logger.trace("Images from Xcode project");
|
|
418
|
+
this.$logger.trace(xcodeProjectImages);
|
|
419
|
+
const appResourcesImages = this.$fs.readDirectory(this.getAppResourcesDestinationDirectoryPath(projectData));
|
|
420
|
+
this.$logger.trace("Current images from App_Resources");
|
|
421
|
+
this.$logger.trace(appResourcesImages);
|
|
422
|
+
const imagesToAdd = _.difference(appResourcesImages, xcodeProjectImages);
|
|
423
|
+
this.$logger.trace(`New images to add into xcode project: ${imagesToAdd.join(", ")}`);
|
|
424
|
+
_.each(imagesToAdd, (image) => project.addResourceFile(path.relative(this.getPlatformData(projectData).projectRoot, path.join(this.getAppResourcesDestinationDirectoryPath(projectData), image))));
|
|
425
|
+
const imagesToRemove = _.difference(xcodeProjectImages, appResourcesImages);
|
|
426
|
+
this.$logger.trace(`Images to remove from xcode project: ${imagesToRemove.join(", ")}`);
|
|
427
|
+
_.each(imagesToRemove, (image) => project.removeResourceFile(path.join(this.getAppResourcesDestinationDirectoryPath(projectData), image)));
|
|
428
|
+
this.savePbxProj(project, projectData);
|
|
429
|
+
let resourcesNativeCodePath = path.join(resourcesDirectoryPath, platformData.normalizedPlatformName, constants.NATIVE_SOURCE_FOLDER);
|
|
430
|
+
if (!this.$fs.exists(resourcesNativeCodePath)) {
|
|
431
|
+
resourcesNativeCodePath = path.join(resourcesDirectoryPath, this.$devicePlatformsConstants.iOS, constants.NATIVE_SOURCE_FOLDER);
|
|
432
|
+
}
|
|
433
|
+
await this.prepareNativeSourceCode(constants.TNS_NATIVE_SOURCE_GROUP_NAME, resourcesNativeCodePath, projectData);
|
|
434
|
+
const nativeSource = this.$projectConfigService.getValue(`${this._platformData.platformNameLowerCase}.NativeSource`, []);
|
|
435
|
+
if (nativeSource === null || nativeSource === void 0 ? void 0 : nativeSource.length) {
|
|
436
|
+
for (const source of nativeSource) {
|
|
437
|
+
await this.prepareNativeSourceCode(source.name, source.path, projectData);
|
|
469
438
|
}
|
|
470
439
|
}
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
if (addedWatchApp) {
|
|
479
|
-
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");
|
|
480
|
-
}
|
|
440
|
+
}
|
|
441
|
+
this.$iOSWatchAppService.removeWatchApp({ pbxProjPath });
|
|
442
|
+
const addedWatchApp = await this.$iOSWatchAppService.addWatchAppFromPath({
|
|
443
|
+
watchAppFolderPath: path.join(resourcesDirectoryPath, platformData.normalizedPlatformName),
|
|
444
|
+
projectData,
|
|
445
|
+
platformData,
|
|
446
|
+
pbxProjPath,
|
|
481
447
|
});
|
|
448
|
+
if (addedWatchApp) {
|
|
449
|
+
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");
|
|
450
|
+
}
|
|
482
451
|
}
|
|
483
452
|
prepareAppResources(projectData) {
|
|
484
453
|
const platformData = this.getPlatformData(projectData);
|
|
@@ -502,48 +471,45 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
502
471
|
this.$fs.deleteDirectory(path.join(platformsAppResourcesPath, "watchapp"));
|
|
503
472
|
this.$fs.deleteDirectory(path.join(platformsAppResourcesPath, "watchextension"));
|
|
504
473
|
}
|
|
505
|
-
processConfigurationFilesFromAppResources(projectData, opts) {
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
yield this.mergeProjectXcconfigFiles(projectData);
|
|
510
|
-
});
|
|
474
|
+
async processConfigurationFilesFromAppResources(projectData, opts) {
|
|
475
|
+
await this.mergeInfoPlists(projectData, opts);
|
|
476
|
+
await this.$iOSEntitlementsService.merge(projectData);
|
|
477
|
+
await this.mergeProjectXcconfigFiles(projectData);
|
|
511
478
|
}
|
|
512
479
|
ensureConfigurationFileInAppResources() {
|
|
513
480
|
return null;
|
|
514
481
|
}
|
|
515
|
-
mergeInfoPlists(projectData, buildOptions) {
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
return;
|
|
530
|
-
}
|
|
531
|
-
this.$logger.trace("Schedule merge plist at: " + plistPath);
|
|
532
|
-
session.patch({
|
|
533
|
-
name: path.relative(projectDir, plistPath),
|
|
534
|
-
read: () => this.$fs.readText(plistPath),
|
|
535
|
-
});
|
|
536
|
-
};
|
|
537
|
-
const allPlugins = this.getAllProductionPlugins(projectData);
|
|
538
|
-
for (const plugin of allPlugins) {
|
|
539
|
-
const pluginInfoPlistPath = path.join(plugin.pluginPlatformsFolderPath(IOSProjectService.IOS_PLATFORM_NAME), this.getPlatformData(projectData).configurationFileName);
|
|
540
|
-
makePatch(pluginInfoPlistPath);
|
|
482
|
+
async mergeInfoPlists(projectData, buildOptions) {
|
|
483
|
+
const projectDir = projectData.projectDir;
|
|
484
|
+
const infoPlistPath = path.join(projectData.appResourcesDirectoryPath, this.getPlatformData(projectData).normalizedPlatformName, this.getPlatformData(projectData).configurationFileName);
|
|
485
|
+
this.ensureConfigurationFileInAppResources();
|
|
486
|
+
const reporterTraceMessage = "Info.plist:";
|
|
487
|
+
const reporter = {
|
|
488
|
+
log: (txt) => this.$logger.trace(`${reporterTraceMessage} ${txt}`),
|
|
489
|
+
warn: (txt) => this.$logger.warn(`${reporterTraceMessage} ${txt}`),
|
|
490
|
+
};
|
|
491
|
+
const session = new plist_merge_patch_1.PlistSession(reporter);
|
|
492
|
+
const makePatch = (plistPath) => {
|
|
493
|
+
if (!this.$fs.exists(plistPath)) {
|
|
494
|
+
this.$logger.trace("No plist found at: " + plistPath);
|
|
495
|
+
return;
|
|
541
496
|
}
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
497
|
+
this.$logger.trace("Schedule merge plist at: " + plistPath);
|
|
498
|
+
session.patch({
|
|
499
|
+
name: path.relative(projectDir, plistPath),
|
|
500
|
+
read: () => this.$fs.readText(plistPath),
|
|
501
|
+
});
|
|
502
|
+
};
|
|
503
|
+
const allPlugins = this.getAllProductionPlugins(projectData);
|
|
504
|
+
for (const plugin of allPlugins) {
|
|
505
|
+
const pluginInfoPlistPath = path.join(plugin.pluginPlatformsFolderPath(IOSProjectService.IOS_PLATFORM_NAME), this.getPlatformData(projectData).configurationFileName);
|
|
506
|
+
makePatch(pluginInfoPlistPath);
|
|
507
|
+
}
|
|
508
|
+
makePatch(infoPlistPath);
|
|
509
|
+
if (projectData.projectIdentifiers && projectData.projectIdentifiers.ios) {
|
|
510
|
+
session.patch({
|
|
511
|
+
name: "CFBundleIdentifier from package.json nativescript.id",
|
|
512
|
+
read: () => `<?xml version="1.0" encoding="UTF-8"?>
|
|
547
513
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
548
514
|
<plist version="1.0">
|
|
549
515
|
<dict>
|
|
@@ -551,14 +517,14 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
551
517
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
552
518
|
</dict>
|
|
553
519
|
</plist>`,
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
if (!buildOptions.release &&
|
|
523
|
+
projectData.projectIdentifiers &&
|
|
524
|
+
projectData.projectIdentifiers.ios) {
|
|
525
|
+
session.patch({
|
|
526
|
+
name: "CFBundleURLTypes from package.json nativescript.id",
|
|
527
|
+
read: () => `<?xml version="1.0" encoding="UTF-8"?>
|
|
562
528
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
563
529
|
<plist version="1.0">
|
|
564
530
|
<dict>
|
|
@@ -575,13 +541,12 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
575
541
|
</array>
|
|
576
542
|
</dict>
|
|
577
543
|
</plist>`,
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
});
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
const plistContent = session.build();
|
|
547
|
+
this.$logger.trace("Info.plist: Write to: " +
|
|
548
|
+
this.getPlatformData(projectData).configurationFilePath);
|
|
549
|
+
this.$fs.writeFile(this.getPlatformData(projectData).configurationFilePath, plistContent);
|
|
585
550
|
}
|
|
586
551
|
getAllProductionPlugins(projectData) {
|
|
587
552
|
return (this.$injector.resolve("pluginsService")).getAllProductionPlugins(projectData, this.getPlatformData(projectData).platformNameLowerCase);
|
|
@@ -621,112 +586,104 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
621
586
|
savePbxProj(project, projectData, omitEmptyValues) {
|
|
622
587
|
return this.$fs.writeFile(this.getPbxProjPath(projectData), project.writeSync({ omitEmptyValues }));
|
|
623
588
|
}
|
|
624
|
-
preparePluginNativeCode(pluginData, projectData, opts) {
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
this.removeStaticLibs(pluginPlatformsFolderPath, pluginData, projectData);
|
|
640
|
-
const projectRoot = this.getPlatformData(projectData).projectRoot;
|
|
641
|
-
this.$cocoapodsService.removePodfileFromProject(pluginData.name, this.$cocoapodsService.getPluginPodfilePath(pluginData), projectData, projectRoot);
|
|
642
|
-
});
|
|
589
|
+
async preparePluginNativeCode(pluginData, projectData, opts) {
|
|
590
|
+
const pluginPlatformsFolderPath = pluginData.pluginPlatformsFolderPath(IOSProjectService.IOS_PLATFORM_NAME);
|
|
591
|
+
const sourcePath = path.join(pluginPlatformsFolderPath, "src");
|
|
592
|
+
await this.prepareNativeSourceCode(pluginData.name, sourcePath, projectData);
|
|
593
|
+
await this.prepareResources(pluginPlatformsFolderPath, pluginData, projectData);
|
|
594
|
+
await this.prepareFrameworks(pluginPlatformsFolderPath, pluginData, projectData);
|
|
595
|
+
await this.prepareStaticLibs(pluginPlatformsFolderPath, pluginData, projectData);
|
|
596
|
+
}
|
|
597
|
+
async removePluginNativeCode(pluginData, projectData) {
|
|
598
|
+
const pluginPlatformsFolderPath = pluginData.pluginPlatformsFolderPath(IOSProjectService.IOS_PLATFORM_NAME);
|
|
599
|
+
this.removeNativeSourceCode(pluginPlatformsFolderPath, pluginData, projectData);
|
|
600
|
+
this.removeFrameworks(pluginPlatformsFolderPath, pluginData, projectData);
|
|
601
|
+
this.removeStaticLibs(pluginPlatformsFolderPath, pluginData, projectData);
|
|
602
|
+
const projectRoot = this.getPlatformData(projectData).projectRoot;
|
|
603
|
+
this.$cocoapodsService.removePodfileFromProject(pluginData.name, this.$cocoapodsService.getPluginPodfilePath(pluginData), projectData, projectRoot);
|
|
643
604
|
}
|
|
644
|
-
handleNativeDependenciesChange(projectData, opts) {
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
pluginSpmPackages.push(...packages);
|
|
671
|
-
}
|
|
605
|
+
async handleNativeDependenciesChange(projectData, opts) {
|
|
606
|
+
const platformData = this.getPlatformData(projectData);
|
|
607
|
+
const pluginsData = this.getAllProductionPlugins(projectData);
|
|
608
|
+
this.setProductBundleIdentifier(projectData);
|
|
609
|
+
await this.applyPluginsCocoaPods(pluginsData, projectData, platformData);
|
|
610
|
+
await this.$cocoapodsService.applyPodfileFromAppResources(projectData, platformData);
|
|
611
|
+
await this.$cocoapodsService.applyPodfileArchExclusions(projectData, platformData);
|
|
612
|
+
await this.$cocoapodsService.applyPodfileFromExtensions(projectData, platformData);
|
|
613
|
+
const projectPodfilePath = this.$cocoapodsService.getProjectPodfilePath(platformData.projectRoot);
|
|
614
|
+
if (this.$fs.exists(projectPodfilePath)) {
|
|
615
|
+
await this.$cocoapodsService.executePodInstall(platformData.projectRoot, this.$xcprojService.getXcodeprojPath(projectData, platformData.projectRoot));
|
|
616
|
+
// The `pod install` command adds a new target to the .pbxproject. This target adds additional build phases to Xcode project.
|
|
617
|
+
// Some of these phases relies on env variables (like PODS_PODFILE_DIR_PATH or PODS_ROOT).
|
|
618
|
+
// These variables are produced from merge of pod's xcconfig file and project's xcconfig file.
|
|
619
|
+
// So the correct order is `pod install` to be executed before merging pod's xcconfig file.
|
|
620
|
+
await this.$cocoapodsService.mergePodXcconfigFile(projectData, platformData, opts);
|
|
621
|
+
}
|
|
622
|
+
const pluginSpmPackages = [];
|
|
623
|
+
for (const plugin of pluginsData) {
|
|
624
|
+
if (plugin.fullPath) {
|
|
625
|
+
const pluginConfigPath = path.join(plugin.fullPath, constants.CONFIG_FILE_NAME_TS);
|
|
626
|
+
if (this.$fs.exists(pluginConfigPath)) {
|
|
627
|
+
const config = this.$projectConfigService.readConfig(plugin.fullPath);
|
|
628
|
+
const packages = _.get(config, `${platformData.platformNameLowerCase}.SPMPackages`, []);
|
|
629
|
+
if (packages.length) {
|
|
630
|
+
pluginSpmPackages.push(...packages);
|
|
672
631
|
}
|
|
673
632
|
}
|
|
674
633
|
}
|
|
675
|
-
|
|
676
|
-
|
|
634
|
+
}
|
|
635
|
+
await this.$spmService.applySPMPackages(platformData, projectData, pluginSpmPackages);
|
|
677
636
|
}
|
|
678
637
|
beforePrepareAllPlugins(projectData, dependencies) {
|
|
679
638
|
return Promise.resolve(dependencies);
|
|
680
639
|
}
|
|
681
|
-
checkForChanges(changesInfo, prepareData, projectData) {
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
if
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
if (
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
break;
|
|
699
|
-
}
|
|
640
|
+
async checkForChanges(changesInfo, prepareData, projectData) {
|
|
641
|
+
const { provision, teamId } = prepareData;
|
|
642
|
+
const hasProvision = provision !== undefined;
|
|
643
|
+
const hasTeamId = teamId !== undefined;
|
|
644
|
+
if (hasProvision || hasTeamId) {
|
|
645
|
+
// Check if the native project's signing is set to the provided provision...
|
|
646
|
+
const pbxprojPath = this.getPbxProjPath(projectData);
|
|
647
|
+
if (this.$fs.exists(pbxprojPath)) {
|
|
648
|
+
const xcode = this.$pbxprojDomXcode.Xcode.open(pbxprojPath);
|
|
649
|
+
const signing = xcode.getSigning(projectData.projectName);
|
|
650
|
+
if (hasProvision) {
|
|
651
|
+
if (signing && signing.style === "Manual") {
|
|
652
|
+
for (const name in signing.configurations) {
|
|
653
|
+
const config = signing.configurations[name];
|
|
654
|
+
if (config.uuid !== provision && config.name !== provision) {
|
|
655
|
+
changesInfo.signingChanged = true;
|
|
656
|
+
break;
|
|
700
657
|
}
|
|
701
658
|
}
|
|
702
|
-
else {
|
|
703
|
-
// Specifying provisioning profile requires "Manual" signing style.
|
|
704
|
-
// If the current signing style was not "Manual" it was probably "Automatic" or,
|
|
705
|
-
// it was not uniform for the debug and release build configurations.
|
|
706
|
-
changesInfo.signingChanged = true;
|
|
707
|
-
}
|
|
708
659
|
}
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
660
|
+
else {
|
|
661
|
+
// Specifying provisioning profile requires "Manual" signing style.
|
|
662
|
+
// If the current signing style was not "Manual" it was probably "Automatic" or,
|
|
663
|
+
// it was not uniform for the debug and release build configurations.
|
|
664
|
+
changesInfo.signingChanged = true;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
if (hasTeamId) {
|
|
668
|
+
if (signing && signing.style === "Automatic") {
|
|
669
|
+
if (signing.team !== teamId) {
|
|
670
|
+
const teamIdsForName = await this.$iOSProvisionService.getTeamIdsWithName(teamId);
|
|
671
|
+
if (!teamIdsForName.some((id) => id === signing.team)) {
|
|
672
|
+
changesInfo.signingChanged = true;
|
|
716
673
|
}
|
|
717
674
|
}
|
|
718
|
-
else {
|
|
719
|
-
// Specifying team id or name requires "Automatic" signing style.
|
|
720
|
-
// If the current signing style was not "Automatic" it was probably "Manual".
|
|
721
|
-
changesInfo.signingChanged = true;
|
|
722
|
-
}
|
|
723
675
|
}
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
676
|
+
else {
|
|
677
|
+
// Specifying team id or name requires "Automatic" signing style.
|
|
678
|
+
// If the current signing style was not "Automatic" it was probably "Manual".
|
|
679
|
+
changesInfo.signingChanged = true;
|
|
680
|
+
}
|
|
727
681
|
}
|
|
728
682
|
}
|
|
729
|
-
|
|
683
|
+
else {
|
|
684
|
+
changesInfo.signingChanged = true;
|
|
685
|
+
}
|
|
686
|
+
}
|
|
730
687
|
}
|
|
731
688
|
getDeploymentTarget(projectData) {
|
|
732
689
|
const target = this.$xcconfigService.readPropertyValue(this.getBuildXCConfigFilePath(projectData), "IPHONEOS_DEPLOYMENT_TARGET");
|
|
@@ -770,120 +727,106 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
770
727
|
const newFileName = projectData.projectName + fileNamePart;
|
|
771
728
|
this.$fs.rename(path.join(fileRootLocation, oldFileName), path.join(fileRootLocation, newFileName));
|
|
772
729
|
}
|
|
773
|
-
prepareNativeSourceCode(groupName, sourceFolderPath, projectData) {
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
filesRelativeToProject: true,
|
|
780
|
-
});
|
|
781
|
-
project.addToHeaderSearchPaths(group.path);
|
|
782
|
-
const headerFiles = this.$fs.exists(sourceFolderPath)
|
|
783
|
-
? this.$fs.enumerateFilesInDirectorySync(sourceFolderPath, (file, stat) => stat.isDirectory() || path.extname(file) === ".h")
|
|
784
|
-
: [];
|
|
785
|
-
if (headerFiles.length > 0 &&
|
|
786
|
-
!this.$fs.exists(path.join(sourceFolderPath, "module.modulemap"))) {
|
|
787
|
-
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`);
|
|
788
|
-
}
|
|
789
|
-
this.savePbxProj(project, projectData);
|
|
730
|
+
async prepareNativeSourceCode(groupName, sourceFolderPath, projectData) {
|
|
731
|
+
const project = this.createPbxProj(projectData);
|
|
732
|
+
const group = await this.getRootGroup(groupName, sourceFolderPath);
|
|
733
|
+
project.addPbxGroup(group.files, group.name, group.path, null, {
|
|
734
|
+
isMain: true,
|
|
735
|
+
filesRelativeToProject: true,
|
|
790
736
|
});
|
|
737
|
+
project.addToHeaderSearchPaths(group.path);
|
|
738
|
+
const headerFiles = this.$fs.exists(sourceFolderPath)
|
|
739
|
+
? this.$fs.enumerateFilesInDirectorySync(sourceFolderPath, (file, stat) => stat.isDirectory() || path.extname(file) === ".h")
|
|
740
|
+
: [];
|
|
741
|
+
if (headerFiles.length > 0 &&
|
|
742
|
+
!this.$fs.exists(path.join(sourceFolderPath, "module.modulemap"))) {
|
|
743
|
+
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`);
|
|
744
|
+
}
|
|
745
|
+
this.savePbxProj(project, projectData);
|
|
791
746
|
}
|
|
792
|
-
addExtensions(projectData, pluginsData) {
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
747
|
+
async addExtensions(projectData, pluginsData) {
|
|
748
|
+
const resorcesExtensionsPath = path.join(projectData.getAppResourcesDirectoryPath(), this.getPlatformData(projectData).normalizedPlatformName, constants.NATIVE_EXTENSION_FOLDER);
|
|
749
|
+
const platformData = this.getPlatformData(projectData);
|
|
750
|
+
const pbxProjPath = this.getPbxProjPath(projectData);
|
|
751
|
+
const addedExtensionsFromResources = await this.$iOSExtensionsService.addExtensionsFromPath({
|
|
752
|
+
extensionsFolderPath: resorcesExtensionsPath,
|
|
753
|
+
projectData,
|
|
754
|
+
platformData,
|
|
755
|
+
pbxProjPath,
|
|
756
|
+
});
|
|
757
|
+
let addedExtensionsFromPlugins = false;
|
|
758
|
+
for (const pluginIndex in pluginsData) {
|
|
759
|
+
const pluginData = pluginsData[pluginIndex];
|
|
760
|
+
const pluginPlatformsFolderPath = pluginData.pluginPlatformsFolderPath(IOSProjectService.IOS_PLATFORM_NAME);
|
|
761
|
+
const extensionPath = path.join(pluginPlatformsFolderPath, constants.NATIVE_EXTENSION_FOLDER);
|
|
762
|
+
const addedExtensionFromPlugin = await this.$iOSExtensionsService.addExtensionsFromPath({
|
|
763
|
+
extensionsFolderPath: extensionPath,
|
|
799
764
|
projectData,
|
|
800
765
|
platformData,
|
|
801
766
|
pbxProjPath,
|
|
802
767
|
});
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
extensionsFolderPath: extensionPath,
|
|
810
|
-
projectData,
|
|
811
|
-
platformData,
|
|
812
|
-
pbxProjPath,
|
|
813
|
-
});
|
|
814
|
-
addedExtensionsFromPlugins =
|
|
815
|
-
addedExtensionsFromPlugins || addedExtensionFromPlugin;
|
|
816
|
-
}
|
|
817
|
-
if (addedExtensionsFromResources || addedExtensionsFromPlugins) {
|
|
818
|
-
this.$logger.warn("Let us know if there are other Extension features you'd like! https://github.com/NativeScript/NativeScript/issues");
|
|
819
|
-
}
|
|
820
|
-
});
|
|
768
|
+
addedExtensionsFromPlugins =
|
|
769
|
+
addedExtensionsFromPlugins || addedExtensionFromPlugin;
|
|
770
|
+
}
|
|
771
|
+
if (addedExtensionsFromResources || addedExtensionsFromPlugins) {
|
|
772
|
+
this.$logger.warn("Let us know if there are other Extension features you'd like! https://github.com/NativeScript/NativeScript/issues");
|
|
773
|
+
}
|
|
821
774
|
}
|
|
822
|
-
getRootGroup(name, rootPath) {
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
filePathsArr.push(sourceFilePath);
|
|
836
|
-
}
|
|
775
|
+
async getRootGroup(name, rootPath) {
|
|
776
|
+
const filePathsArr = [];
|
|
777
|
+
const rootGroup = {
|
|
778
|
+
name: name,
|
|
779
|
+
files: filePathsArr,
|
|
780
|
+
path: rootPath,
|
|
781
|
+
};
|
|
782
|
+
if (fastGlob.isDynamicPattern(rootPath)) {
|
|
783
|
+
const projectRoot = this.$projectDataService.getProjectData().projectDir;
|
|
784
|
+
const filePaths = await fastGlob(rootPath);
|
|
785
|
+
for (const filePath of filePaths) {
|
|
786
|
+
const sourceFilePath = path.normalize(path.join(projectRoot, filePath));
|
|
787
|
+
filePathsArr.push(sourceFilePath);
|
|
837
788
|
}
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
}
|
|
789
|
+
}
|
|
790
|
+
else {
|
|
791
|
+
if (this.$fs.exists(rootPath)) {
|
|
792
|
+
const stats = this.$fs.getFsStats(rootPath);
|
|
793
|
+
if (stats.isDirectory() && !this.$fs.isEmptyDir(rootPath)) {
|
|
794
|
+
this.$fs.readDirectory(rootPath).forEach((fileName) => {
|
|
795
|
+
const filePath = path.join(rootGroup.path, fileName);
|
|
796
|
+
filePathsArr.push(filePath);
|
|
797
|
+
});
|
|
847
798
|
}
|
|
848
799
|
}
|
|
849
|
-
|
|
850
|
-
|
|
800
|
+
}
|
|
801
|
+
return rootGroup;
|
|
851
802
|
}
|
|
852
|
-
prepareResources(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
project.addResourceFile(filePath);
|
|
860
|
-
}
|
|
803
|
+
async prepareResources(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
804
|
+
const project = this.createPbxProj(projectData);
|
|
805
|
+
const resourcesPath = path.join(pluginPlatformsFolderPath, "Resources");
|
|
806
|
+
if (this.$fs.exists(resourcesPath) && !this.$fs.isEmptyDir(resourcesPath)) {
|
|
807
|
+
for (const fileName of this.$fs.readDirectory(resourcesPath)) {
|
|
808
|
+
const filePath = path.join(resourcesPath, fileName);
|
|
809
|
+
project.addResourceFile(filePath);
|
|
861
810
|
}
|
|
862
|
-
|
|
863
|
-
|
|
811
|
+
}
|
|
812
|
+
this.savePbxProj(project, projectData);
|
|
864
813
|
}
|
|
865
|
-
prepareFrameworks(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
}
|
|
870
|
-
});
|
|
814
|
+
async prepareFrameworks(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
815
|
+
for (const fileName of this.getAllLibsForPluginWithFileExtension(pluginData, FRAMEWORK_EXTENSIONS)) {
|
|
816
|
+
await this.addFramework(path.join(pluginPlatformsFolderPath, fileName), projectData);
|
|
817
|
+
}
|
|
871
818
|
}
|
|
872
|
-
prepareStaticLibs(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
}
|
|
877
|
-
});
|
|
819
|
+
async prepareStaticLibs(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
820
|
+
for (const fileName of this.getAllLibsForPluginWithFileExtension(pluginData, ".a")) {
|
|
821
|
+
await this.addStaticLibrary(path.join(pluginPlatformsFolderPath, fileName), projectData);
|
|
822
|
+
}
|
|
878
823
|
}
|
|
879
|
-
removeNativeSourceCode(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
this.savePbxProj(project, projectData);
|
|
886
|
-
});
|
|
824
|
+
async removeNativeSourceCode(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
825
|
+
const project = this.createPbxProj(projectData);
|
|
826
|
+
const group = await this.getRootGroup(pluginData.name, pluginPlatformsFolderPath);
|
|
827
|
+
project.removePbxGroup(group.name, group.path);
|
|
828
|
+
project.removeFromHeaderSearchPaths(group.path);
|
|
829
|
+
this.savePbxProj(project, projectData);
|
|
887
830
|
}
|
|
888
831
|
removeFrameworks(pluginPlatformsFolderPath, pluginData, projectData) {
|
|
889
832
|
const project = this.createPbxProj(projectData);
|
|
@@ -925,50 +868,48 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
925
868
|
const modulemap = `module ${libraryName} { explicit module ${libraryName} { ${headers.join(" ")} } }`;
|
|
926
869
|
this.$fs.writeFile(path.join(headersFolderPath, "module.modulemap"), modulemap);
|
|
927
870
|
}
|
|
928
|
-
mergeProjectXcconfigFiles(projectData) {
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
if (this.$fs.exists(pluginXcconfigFilePath)) {
|
|
940
|
-
for (const pluginsXcconfigFilePath of pluginsXcconfigFilePaths) {
|
|
941
|
-
yield this.$xcconfigService.mergeFiles(pluginXcconfigFilePath, pluginsXcconfigFilePath);
|
|
942
|
-
}
|
|
943
|
-
}
|
|
944
|
-
}
|
|
945
|
-
const appResourcesXcconfigPath = path.join(projectData.appResourcesDirectoryPath, this.getPlatformData(projectData).normalizedPlatformName, constants_2.BUILD_XCCONFIG_FILE_NAME);
|
|
946
|
-
if (this.$fs.exists(appResourcesXcconfigPath)) {
|
|
871
|
+
async mergeProjectXcconfigFiles(projectData) {
|
|
872
|
+
const platformData = this.getPlatformData(projectData);
|
|
873
|
+
const pluginsXcconfigFilePaths = _.values(this.$xcconfigService.getPluginsXcconfigFilePaths(platformData.projectRoot));
|
|
874
|
+
for (const pluginsXcconfigFilePath of pluginsXcconfigFilePaths) {
|
|
875
|
+
this.$fs.deleteFile(pluginsXcconfigFilePath);
|
|
876
|
+
}
|
|
877
|
+
const allPlugins = this.getAllProductionPlugins(projectData);
|
|
878
|
+
for (const plugin of allPlugins) {
|
|
879
|
+
const pluginPlatformsFolderPath = plugin.pluginPlatformsFolderPath(IOSProjectService.IOS_PLATFORM_NAME);
|
|
880
|
+
const pluginXcconfigFilePath = path.join(pluginPlatformsFolderPath, constants_2.BUILD_XCCONFIG_FILE_NAME);
|
|
881
|
+
if (this.$fs.exists(pluginXcconfigFilePath)) {
|
|
947
882
|
for (const pluginsXcconfigFilePath of pluginsXcconfigFilePaths) {
|
|
948
|
-
|
|
883
|
+
await this.$xcconfigService.mergeFiles(pluginXcconfigFilePath, pluginsXcconfigFilePath);
|
|
949
884
|
}
|
|
950
885
|
}
|
|
886
|
+
}
|
|
887
|
+
const appResourcesXcconfigPath = path.join(projectData.appResourcesDirectoryPath, this.getPlatformData(projectData).normalizedPlatformName, constants_2.BUILD_XCCONFIG_FILE_NAME);
|
|
888
|
+
if (this.$fs.exists(appResourcesXcconfigPath)) {
|
|
951
889
|
for (const pluginsXcconfigFilePath of pluginsXcconfigFilePaths) {
|
|
952
|
-
|
|
953
|
-
// We need the pluginsXcconfig file to exist in platforms dir as it is required in the native template:
|
|
954
|
-
// https://github.com/NativeScript/ios-runtime/blob/9c2b7b5f70b9bee8452b7a24aa6b646214c7d2be/build/project-template/__PROJECT_NAME__/build-debug.xcconfig#L3
|
|
955
|
-
// From Xcode 10 in case the file is missing, this include fails and the build itself fails (was a warning in previous Xcode versions).
|
|
956
|
-
this.$fs.writeFile(pluginsXcconfigFilePath, "");
|
|
957
|
-
}
|
|
890
|
+
await this.$xcconfigService.mergeFiles(appResourcesXcconfigPath, pluginsXcconfigFilePath);
|
|
958
891
|
}
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
const entitlementsRelativePath = this.$iOSEntitlementsService.getPlatformsEntitlementsRelativePath(projectData);
|
|
967
|
-
this.$fs.writeFile(tempEntitlementsFilePath, `CODE_SIGN_ENTITLEMENTS = ${entitlementsRelativePath}${os_1.EOL}`);
|
|
968
|
-
yield this.$xcconfigService.mergeFiles(tempEntitlementsFilePath, pluginsXcconfigFilePath);
|
|
969
|
-
}
|
|
892
|
+
}
|
|
893
|
+
for (const pluginsXcconfigFilePath of pluginsXcconfigFilePaths) {
|
|
894
|
+
if (!this.$fs.exists(pluginsXcconfigFilePath)) {
|
|
895
|
+
// We need the pluginsXcconfig file to exist in platforms dir as it is required in the native template:
|
|
896
|
+
// https://github.com/NativeScript/ios-runtime/blob/9c2b7b5f70b9bee8452b7a24aa6b646214c7d2be/build/project-template/__PROJECT_NAME__/build-debug.xcconfig#L3
|
|
897
|
+
// From Xcode 10 in case the file is missing, this include fails and the build itself fails (was a warning in previous Xcode versions).
|
|
898
|
+
this.$fs.writeFile(pluginsXcconfigFilePath, "");
|
|
970
899
|
}
|
|
971
|
-
}
|
|
900
|
+
}
|
|
901
|
+
for (const pluginsXcconfigFilePath of pluginsXcconfigFilePaths) {
|
|
902
|
+
// Set Entitlements Property to point to default file if not set explicitly by the user.
|
|
903
|
+
const entitlementsPropertyValue = this.$xcconfigService.readPropertyValue(pluginsXcconfigFilePath, constants.CODE_SIGN_ENTITLEMENTS);
|
|
904
|
+
if (entitlementsPropertyValue === null &&
|
|
905
|
+
this.$fs.exists(this.$iOSEntitlementsService.getPlatformsEntitlementsPath(projectData))) {
|
|
906
|
+
const tempEntitlementsDir = await this.$tempService.mkdirSync("entitlements");
|
|
907
|
+
const tempEntitlementsFilePath = path.join(tempEntitlementsDir, "set-entitlements.xcconfig");
|
|
908
|
+
const entitlementsRelativePath = this.$iOSEntitlementsService.getPlatformsEntitlementsRelativePath(projectData);
|
|
909
|
+
this.$fs.writeFile(tempEntitlementsFilePath, `CODE_SIGN_ENTITLEMENTS = ${entitlementsRelativePath}${os_1.EOL}`);
|
|
910
|
+
await this.$xcconfigService.mergeFiles(tempEntitlementsFilePath, pluginsXcconfigFilePath);
|
|
911
|
+
}
|
|
912
|
+
}
|
|
972
913
|
}
|
|
973
914
|
getBuildXCConfigFilePath(projectData) {
|
|
974
915
|
const buildXCConfig = path.join(projectData.appResourcesDirectoryPath, this.getPlatformData(projectData).normalizedPlatformName, constants_2.BUILD_XCCONFIG_FILE_NAME);
|
|
@@ -987,22 +928,20 @@ class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase
|
|
|
987
928
|
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}".`);
|
|
988
929
|
}
|
|
989
930
|
}
|
|
990
|
-
applyPluginsCocoaPods(pluginsData, projectData, platformData) {
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
yield this.$cocoapodsService.applyPodfileToProject(pluginData.name, this.$cocoapodsService.getPluginPodfilePath(pluginData), projectData, platformData);
|
|
996
|
-
}
|
|
931
|
+
async applyPluginsCocoaPods(pluginsData, projectData, platformData) {
|
|
932
|
+
for (const pluginIndex in pluginsData) {
|
|
933
|
+
const pluginData = pluginsData[pluginIndex];
|
|
934
|
+
if (this.$fs.exists(pluginData.pluginPlatformsFolderPath(platformData.normalizedPlatformName))) {
|
|
935
|
+
await this.$cocoapodsService.applyPodfileToProject(pluginData.name, this.$cocoapodsService.getPluginPodfilePath(pluginData), projectData, platformData);
|
|
997
936
|
}
|
|
998
|
-
}
|
|
937
|
+
}
|
|
999
938
|
}
|
|
1000
939
|
}
|
|
940
|
+
exports.IOSProjectService = IOSProjectService;
|
|
1001
941
|
IOSProjectService.IOS_PROJECT_NAME_PLACEHOLDER = "__PROJECT_NAME__";
|
|
1002
942
|
IOSProjectService.IOS_PLATFORM_NAME = "ios";
|
|
1003
943
|
__decorate([
|
|
1004
944
|
(0, helpers_2.hook)("buildIOS")
|
|
1005
945
|
], IOSProjectService.prototype, "buildProject", null);
|
|
1006
|
-
exports.IOSProjectService = IOSProjectService;
|
|
1007
946
|
yok_1.injector.register("iOSProjectService", IOSProjectService);
|
|
1008
947
|
//# sourceMappingURL=ios-project-service.js.map
|