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