nativescript 9.0.0-alpha.8 → 9.0.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/config/config.json +1 -1
  2. package/config/test-deps-versions-generated.json +3 -3
  3. package/docs/build-jekyll-md.sh +1 -1
  4. package/docs/man_pages/config/config-get.md +36 -0
  5. package/docs/man_pages/config/config-set.md +40 -0
  6. package/docs/man_pages/config/config.md +39 -0
  7. package/docs/man_pages/project/hooks/hooks.md +35 -0
  8. package/docs/man_pages/start.md +1 -0
  9. package/lib/.d.ts +4 -0
  10. package/lib/bootstrap.js +2 -0
  11. package/lib/commands/build.js +22 -3
  12. package/lib/commands/clean.js +3 -3
  13. package/lib/commands/config.js +9 -3
  14. package/lib/commands/hooks/common.js +79 -0
  15. package/lib/commands/hooks/hooks-lock.js +100 -0
  16. package/lib/commands/hooks/hooks.js +71 -0
  17. package/lib/commands/plugin/build-plugin.js +6 -2
  18. package/lib/commands/typings.js +1 -1
  19. package/lib/common/declarations.d.ts +5 -0
  20. package/lib/common/definitions/extensibility.d.ts +2 -2
  21. package/lib/common/definitions/mobile.d.ts +78 -72
  22. package/lib/common/file-system.js +1 -1
  23. package/lib/common/logger/logger.js +1 -1
  24. package/lib/common/mobile/android/android-device.js +8 -2
  25. package/lib/common/mobile/mobile-core/devices-service.js +1 -1
  26. package/lib/common/plist-parser.js +3 -3
  27. package/lib/common/project-helper.js +15 -2
  28. package/lib/common/services/hooks-service.js +1 -1
  29. package/lib/config.js +2 -38
  30. package/lib/constants.js +3 -2
  31. package/lib/controllers/build-controller.js +1 -1
  32. package/lib/controllers/deploy-controller.js +5 -2
  33. package/lib/controllers/migrate-controller.js +6 -5
  34. package/lib/controllers/platform-controller.js +3 -1
  35. package/lib/controllers/prepare-controller.js +54 -13
  36. package/lib/controllers/run-controller.js +12 -13
  37. package/lib/controllers/update-controller.js +2 -2
  38. package/lib/data/build-data.js +2 -0
  39. package/lib/declarations.d.ts +3 -1
  40. package/lib/definitions/android-plugin-migrator.d.ts +3 -2
  41. package/lib/definitions/build.d.ts +4 -2
  42. package/lib/definitions/hooks.d.ts +1 -0
  43. package/lib/definitions/ios-debugger-port-service.d.ts +1 -1
  44. package/lib/definitions/livesync.d.ts +1 -1
  45. package/lib/definitions/project.d.ts +14 -0
  46. package/lib/definitions/run.d.ts +2 -4
  47. package/lib/helpers/deploy-command-helper.js +1 -0
  48. package/lib/nativescript-cli.js +28 -0
  49. package/lib/options.js +9 -2
  50. package/lib/project-data.js +8 -2
  51. package/lib/services/analytics/analytics-broker-process.js +1 -1
  52. package/lib/services/analytics/analytics-service.js +1 -1
  53. package/lib/services/android/gradle-build-args-service.js +21 -7
  54. package/lib/services/android/gradle-build-service.js +15 -1
  55. package/lib/services/android-plugin-build-service.js +58 -44
  56. package/lib/services/android-project-service.js +63 -4
  57. package/lib/services/build-artifacts-service.js +24 -9
  58. package/lib/services/bundler/bundler-compiler-service.js +77 -104
  59. package/lib/services/cocoapods-service.js +10 -4
  60. package/lib/services/device/device-install-app-service.js +27 -5
  61. package/lib/services/extensibility-service.js +1 -1
  62. package/lib/services/ios/xcodebuild-args-service.js +7 -5
  63. package/lib/services/ios-project-service.js +5 -2
  64. package/lib/services/plugins-service.js +3 -2
  65. package/lib/services/project-data-service.js +16 -18
  66. package/lib/services/timeline-profiler-service.js +21 -13
  67. package/lib/services/versions-service.js +2 -1
  68. package/package.json +18 -15
  69. package/vendor/aab-tool/README.txt +1 -1
  70. package/vendor/aab-tool/bundletool.jar +0 -0
  71. package/vendor/gradle-app/app/build.gradle +1292 -0
  72. package/vendor/gradle-app/app/gradle-helpers/AnalyticsCollector.gradle +48 -0
  73. package/vendor/gradle-app/app/gradle-helpers/BuildToolTask.gradle +50 -0
  74. package/vendor/gradle-app/app/gradle-helpers/CustomExecutionLogger.gradle +52 -0
  75. package/vendor/gradle-app/app/gradle.properties +45 -0
  76. package/vendor/gradle-app/build.gradle +170 -0
  77. package/vendor/gradle-app/settings.gradle +78 -0
  78. package/vendor/gradle-plugin/build.gradle +214 -91
  79. package/vendor/gradle-plugin/gradle.properties +2 -18
  80. package/vendor/gradle-plugin/settings.gradle +23 -11
  81. package/lib/common/resources/platform-tools/android/darwin/NOTICE.txt +0 -3407
  82. package/lib/common/resources/platform-tools/android/darwin/adb +0 -0
  83. package/lib/common/resources/platform-tools/android/linux/NOTICE.txt +0 -4451
  84. package/lib/common/resources/platform-tools/android/linux/adb +0 -0
  85. package/lib/common/resources/platform-tools/android/win32/AdbWinApi.dll +0 -0
  86. package/lib/common/resources/platform-tools/android/win32/AdbWinUsbApi.dll +0 -0
  87. package/lib/common/resources/platform-tools/android/win32/NOTICE.txt +0 -4451
  88. package/lib/common/resources/platform-tools/android/win32/adb.exe +0 -0
  89. package/lib/common/resources/platform-tools/android/win32/fastboot.exe +0 -0
package/lib/config.js CHANGED
@@ -1,10 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.StaticConfig = exports.Configuration = void 0;
4
- const path = require("path");
5
- const shelljs = require("shelljs");
6
- const os = require("os");
7
4
  const _ = require("lodash");
5
+ const path = require("path");
8
6
  const yok_1 = require("./common/yok");
9
7
  class Configuration {
10
8
  constructor($fs) {
@@ -61,9 +59,7 @@ class StaticConfig {
61
59
  async getAdbFilePath() {
62
60
  if (!this._adbFilePath) {
63
61
  const androidToolsInfo = this.$injector.resolve("androidToolsInfo");
64
- this._adbFilePath =
65
- (await androidToolsInfo.getPathToAdbFromAndroidHome()) ||
66
- (await this.getAdbFilePathCore());
62
+ this._adbFilePath = await androidToolsInfo.getPathToAdbFromAndroidHome();
67
63
  }
68
64
  return this._adbFilePath;
69
65
  }
@@ -85,38 +81,6 @@ class StaticConfig {
85
81
  get HTML_COMMON_HELPERS_DIR() {
86
82
  return path.join(__dirname, "common", "docs", "helpers");
87
83
  }
88
- async getAdbFilePathCore() {
89
- const $childProcess = this.$injector.resolve("$childProcess");
90
- try {
91
- const proc = await $childProcess.spawnFromEvent("adb", ["version"], "exit", undefined, { throwError: false });
92
- if (proc.stderr) {
93
- return await this.spawnPrivateAdb();
94
- }
95
- }
96
- catch (e) {
97
- if (e.code === "ENOENT") {
98
- return await this.spawnPrivateAdb();
99
- }
100
- }
101
- return "adb";
102
- }
103
- async spawnPrivateAdb() {
104
- const $fs = this.$injector.resolve("$fs"), $childProcess = this.$injector.resolve("$childProcess"), $hostInfo = this.$injector.resolve("$hostInfo");
105
- const defaultAdbDirPath = path.join(__dirname, "common", "resources", "platform-tools", "android", process.platform);
106
- const pathToPackageJson = path.join(__dirname, "..", "package.json");
107
- const nsCliVersion = require(pathToPackageJson).version;
108
- const tmpDir = path.join(os.tmpdir(), `nativescript-cli-${nsCliVersion}`);
109
- $fs.createDirectory(tmpDir);
110
- const targetAdb = path.join(tmpDir, "adb");
111
- if (!$fs.exists(tmpDir) || !$fs.readDirectory(tmpDir).length) {
112
- shelljs.cp(path.join(defaultAdbDirPath, "*"), tmpDir);
113
- if (!$hostInfo.isWindows) {
114
- shelljs.chmod("+x", targetAdb);
115
- }
116
- }
117
- await $childProcess.spawnFromEvent(targetAdb, ["start-server"], "exit");
118
- return targetAdb;
119
- }
120
84
  }
121
85
  exports.StaticConfig = StaticConfig;
122
86
  yok_1.injector.register("staticConfig", StaticConfig);
package/lib/constants.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BUILD_XCCONFIG_FILE_NAME = exports.INCLUDE_GRADLE_NAME = exports.INFO_PLIST_FILE_NAME = exports.APP_GRADLE_FILE_NAME = exports.MANIFEST_FILE_NAME = exports.ANDROID_ANALYTICS_DATA_FILE = exports.ANDROID_ANALYTICS_DATA_DIR = exports.FONTS_DIR = exports.ASSETS_DIR = exports.MAIN_DIR = exports.SRC_DIR = exports.AWAIT_NOTIFICATION_TIMEOUT_SECONDS = exports.CODE_SIGN_ENTITLEMENTS = exports.LIB_DIR_NAME = exports.KARMA_CONFIG_NAME = exports.TSCCONFIG_TNS_JSON_NAME = exports.RSPACK_CONFIG_NAME = exports.WEBPACK_CONFIG_NAME = exports.HOOKS_DIR_NAME = exports.PLATFORMS_DIR_NAME = exports.XML_FILE_EXTENSION = exports.LIVESYNC_EXCLUDED_FILE_PATTERNS = exports.TEST_RUNNER_NAME = exports.TESTING_FRAMEWORKS = exports.LIVESYNC_EXCLUDED_DIRECTORIES = exports.DEFAULT_APP_IDENTIFIER_PREFIX = exports.NODE_MODULE_CACHE_PATH_KEY_NAME = exports.ANDROID_DEVICE_APP_ROOT_TEMPLATE = exports.PACKAGE_LOCK_JSON_FILE_NAME = exports.PACKAGE_JSON_FILE_NAME = exports.SCOPED_VISIONOS_RUNTIME_NAME = exports.SCOPED_IOS_RUNTIME_NAME = exports.SCOPED_ANDROID_RUNTIME_NAME = exports.TNS_IOS_RUNTIME_NAME = exports.TNS_ANDROID_RUNTIME_NAME = exports.UI_MOBILE_BASE_NAME = exports.TNS_CORE_MODULES_WIDGETS_NAME = exports.RSPACK_PLUGIN_NAME = exports.WEBPACK_PLUGIN_NAME = exports.SCOPED_TNS_CORE_THEME_NAME = exports.TNS_CORE_THEME_NAME = exports.SCOPED_TNS_CORE_MODULES = exports.TNS_CORE_MODULES_NAME = exports.TNS_MODULES_FOLDER_NAME = exports.NODE_MODULES_FOLDER_NAME = exports.NATIVESCRIPT_KEY_NAME = exports.NS_BASE_PODFILE = exports.PROJECT_FRAMEWORK_FOLDER_NAME = exports.APP_RESOURCES_FOLDER_NAME = exports.APP_FOLDER_NAME = void 0;
4
- exports.ProjectTypes = exports.JsFlavorName = exports.TsFlavorName = exports.SvelteFlavorName = exports.SolidFlavorName = exports.ReactFlavorName = exports.VueFlavorName = exports.NgFlavorName = exports.SVELTE_NAME = exports.SOLID_NAME = exports.REACT_NAME = exports.TYPESCRIPT_NAME = exports.JAVASCRIPT_NAME = exports.ANGULAR_NAME = exports.VUE_NAME = exports.ItunesConnectApplicationTypes = exports.androidAppResourcesFolderName = exports.iOSAppResourcesFolderName = exports.ITMSConstants = exports.ANALYTICS_LOCAL_TEMPLATE_PREFIX = exports.RESERVED_TEMPLATE_NAMES = exports.ReleaseType = exports.SaveOptions = exports.TemplatesV2PackageJsonKeysToRemove = exports.PackageJsonKeysToKeep = exports.LiveSyncTrackActionNames = exports.PackageVersion = exports.MetadataFilteringConstants = exports.IOS_WATCHAPP_EXTENSION_FOLDER = exports.IOS_WATCHAPP_FOLDER = exports.NATIVE_EXTENSION_FOLDER = exports.APPLICATION_RESPONSE_TIMEOUT_SECONDS = exports.NATIVE_SOURCE_FOLDER = exports.TNS_NATIVE_SOURCE_GROUP_NAME = exports.HASHES_FILE_NAME = exports.APKS_EXTENSION_NAME = exports.AAB_EXTENSION_NAME = exports.APK_EXTENSION_NAME = exports.DEPENDENCIES_JSON_NAME = exports.CONFIG_FILE_NAME_TS = exports.CONFIG_FILE_NAME_JS = exports.CONFIG_FILE_NAME_DISPLAY = exports.CONFIG_NS_APP_ENTRY = exports.CONFIG_NS_APP_RESOURCES_ENTRY = exports.CONFIG_NS_FILE_NAME = exports.RESOURCES_DIR = exports.BUNDLE_DIR = exports.APK_DIR = exports.OUTPUTS_DIR = exports.BUILD_DIR = void 0;
5
- exports.PackageManagers = exports.EMIT_APPENDER_EVENT_NAME = exports.LoggerConfigData = exports.LoggerLevel = exports.DeviceConnectionType = exports.LoggerAppenders = exports.IOSNativeTargetTypes = exports.IOSNativeTargetProductTypes = exports.IOSDeviceTargets = exports.RunOnDeviceEvents = exports.AndroidAppBundleMessages = exports.AndroidBundleValidatorMessages = exports.BundleValidatorMessages = exports.IosProjectConstants = exports.EXTENSION_PROVISIONING_FILENAME = exports.PODFILE_NAME = exports.PLUGINS_BUILD_DATA_FILENAME = exports.PLUGIN_BUILD_DATA_FILENAME = exports.AddPlaformErrors = exports.PACKAGE_PLACEHOLDER_NAME = exports.AndroidBuildDefaults = exports.Hooks = exports.XcodeDeprecationStringFormat = exports.MacOSDeprecationStringFormat = exports.MacOSVersions = exports.AssetConstants = exports.CLI_RESOURCES_DIR_NAME = exports.NATIVESCRIPT_PROPS_INTERNAL_DELIMITER = exports.AnalyticsEventLabelDelimiter = exports.DebugCommandErrors = exports.BUNDLER_COMPILATION_COMPLETE = exports.PREPARE_READY_EVENT_NAME = exports.INITIAL_SYNC_EVENT_NAME = exports.FILES_CHANGE_EVENT_NAME = exports.CACACHE_DIRECTORY_NAME = exports.ANDROID_APP_BUNDLE_SIGNING_ERROR_MESSAGE = exports.ANDROID_RELEASE_BUILD_ERROR_MESSAGE = exports.POST_INSTALL_COMMAND_NAME = exports.INSPECTOR_CACHE_DIRNAME = exports.VERSION_STRING = exports.DEBUGGER_DETACHED_EVENT_NAME = exports.DEBUGGER_ATTACHED_EVENT_NAME = exports.USER_INTERACTION_NEEDED_EVENT_NAME = exports.CONNECTION_ERROR_EVENT_NAME = exports.BUILD_OUTPUT_EVENT_NAME = void 0;
4
+ exports.JsFlavorName = exports.TsFlavorName = exports.SvelteFlavorName = exports.SolidFlavorName = exports.ReactFlavorName = exports.VueFlavorName = exports.NgFlavorName = exports.SVELTE_NAME = exports.SOLID_NAME = exports.REACT_NAME = exports.TYPESCRIPT_NAME = exports.JAVASCRIPT_NAME = exports.ANGULAR_NAME = exports.VUE_NAME = exports.ItunesConnectApplicationTypes = exports.androidAppResourcesFolderName = exports.iOSAppResourcesFolderName = exports.ITMSConstants = exports.ANALYTICS_LOCAL_TEMPLATE_PREFIX = exports.RESERVED_TEMPLATE_NAMES = exports.ReleaseType = exports.SaveOptions = exports.TemplatesV2PackageJsonKeysToRemove = exports.PackageJsonKeysToKeep = exports.LiveSyncTrackActionNames = exports.PackageVersion = exports.MetadataFilteringConstants = exports.IOS_WATCHAPP_EXTENSION_FOLDER = exports.IOS_WATCHAPP_FOLDER = exports.NATIVE_EXTENSION_FOLDER = exports.APPLICATION_RESPONSE_TIMEOUT_SECONDS = exports.NATIVE_SOURCE_FOLDER = exports.TNS_NATIVE_SOURCE_GROUP_NAME = exports.HASHES_FILE_NAME = exports.APKS_EXTENSION_NAME = exports.AAB_EXTENSION_NAME = exports.APK_EXTENSION_NAME = exports.DEPENDENCIES_JSON_NAME = exports.CONFIG_FILE_NAME_TS = exports.CONFIG_FILE_NAME_JS = exports.CONFIG_FILE_NAME_DISPLAY = exports.CONFIG_NS_APP_ENTRY = exports.CONFIG_NS_BUILD_ENTRY = exports.CONFIG_NS_APP_RESOURCES_ENTRY = exports.CONFIG_NS_FILE_NAME = exports.RESOURCES_DIR = exports.BUNDLE_DIR = exports.APK_DIR = exports.OUTPUTS_DIR = exports.BUILD_DIR = void 0;
5
+ exports.PackageManagers = exports.EMIT_APPENDER_EVENT_NAME = exports.LoggerConfigData = exports.LoggerLevel = exports.DeviceConnectionType = exports.LoggerAppenders = exports.IOSNativeTargetTypes = exports.IOSNativeTargetProductTypes = exports.IOSDeviceTargets = exports.RunOnDeviceEvents = exports.AndroidAppBundleMessages = exports.AndroidBundleValidatorMessages = exports.BundleValidatorMessages = exports.IosProjectConstants = exports.EXTENSION_PROVISIONING_FILENAME = exports.PODFILE_NAME = exports.PLUGINS_BUILD_DATA_FILENAME = exports.PLUGIN_BUILD_DATA_FILENAME = exports.AddPlaformErrors = exports.PACKAGE_PLACEHOLDER_NAME = exports.AndroidBuildDefaults = exports.Hooks = exports.XcodeDeprecationStringFormat = exports.MacOSDeprecationStringFormat = exports.MacOSVersions = exports.AssetConstants = exports.CLI_RESOURCES_DIR_NAME = exports.NATIVESCRIPT_PROPS_INTERNAL_DELIMITER = exports.AnalyticsEventLabelDelimiter = exports.DebugCommandErrors = exports.BUNDLER_COMPILATION_COMPLETE = exports.PREPARE_READY_EVENT_NAME = exports.INITIAL_SYNC_EVENT_NAME = exports.FILES_CHANGE_EVENT_NAME = exports.CACACHE_DIRECTORY_NAME = exports.ANDROID_APP_BUNDLE_SIGNING_ERROR_MESSAGE = exports.ANDROID_RELEASE_BUILD_ERROR_MESSAGE = exports.POST_INSTALL_COMMAND_NAME = exports.INSPECTOR_CACHE_DIRNAME = exports.VERSION_STRING = exports.DEBUGGER_DETACHED_EVENT_NAME = exports.DEBUGGER_ATTACHED_EVENT_NAME = exports.USER_INTERACTION_NEEDED_EVENT_NAME = exports.CONNECTION_ERROR_EVENT_NAME = exports.BUILD_OUTPUT_EVENT_NAME = exports.ProjectTypes = void 0;
6
6
  const path_1 = require("path");
7
7
  exports.APP_FOLDER_NAME = "app";
8
8
  exports.APP_RESOURCES_FOLDER_NAME = "App_Resources";
@@ -61,6 +61,7 @@ exports.BUNDLE_DIR = "bundle";
61
61
  exports.RESOURCES_DIR = "res";
62
62
  exports.CONFIG_NS_FILE_NAME = "nsconfig.json";
63
63
  exports.CONFIG_NS_APP_RESOURCES_ENTRY = "appResourcesPath";
64
+ exports.CONFIG_NS_BUILD_ENTRY = "buildPath";
64
65
  exports.CONFIG_NS_APP_ENTRY = "appPath";
65
66
  exports.CONFIG_FILE_NAME_DISPLAY = "nativescript.config.(js|ts)";
66
67
  exports.CONFIG_FILE_NAME_JS = "nativescript.config.js";
@@ -66,7 +66,7 @@ class BuildController extends events_1.EventEmitter {
66
66
  this.$logger.info(`Build time: ${buildTime.toFixed(3)} s.`);
67
67
  const result = await this.$buildArtifactsService.getLatestAppPackagePath(platformData, buildData);
68
68
  if (buildData.copyTo) {
69
- this.$buildArtifactsService.copyLatestAppPackage(buildData.copyTo, platformData, buildData);
69
+ this.$buildArtifactsService.copyAppPackages(buildData.copyTo, platformData, buildData);
70
70
  }
71
71
  else {
72
72
  this.$logger.info(`The build result is located at: ${result}`);
@@ -20,8 +20,11 @@ class DeployController {
20
20
  },
21
21
  };
22
22
  await this.$prepareController.prepare(prepareData);
23
- const packageFilePath = await deviceDescriptor.buildAction();
24
- await this.$deviceInstallAppService.installOnDevice(device, { ...deviceDescriptor.buildData, buildForDevice: !device.isEmulator }, packageFilePath);
23
+ await deviceDescriptor.buildAction();
24
+ await this.$deviceInstallAppService.installOnDevice(device, {
25
+ ...deviceDescriptor.buildData,
26
+ buildForDevice: !device.isEmulator,
27
+ });
25
28
  };
26
29
  await this.$devicesService.execute(executeAction, (device) => _.some(deviceDescriptors, (deviceDescriptor) => deviceDescriptor.identifier === device.deviceInfo.identifier));
27
30
  }
@@ -14,7 +14,7 @@ const fs = require("fs");
14
14
  const os_1 = require("os");
15
15
  const color_1 = require("../color");
16
16
  class MigrateController extends update_controller_base_1.UpdateControllerBase {
17
- constructor($fs, $platformCommandHelper, $platformsDataService, $packageInstallationManager, $packageManager, $pacoteService, $logger, $errors, $pluginsService, $projectDataService, $projectConfigService, $options, $resources, $injector, $settingsService, $staticConfig, $terminalSpinnerService, $projectCleanupService, $projectBackupService, $childProcess) {
17
+ constructor($fs, $platformCommandHelper, $platformsDataService, $packageInstallationManager, $packageManager, $pacoteService, $logger, $errors, $pluginsService, $projectDataService, $projectConfigService, $projectData, $options, $resources, $injector, $settingsService, $staticConfig, $terminalSpinnerService, $projectCleanupService, $projectBackupService, $childProcess) {
18
18
  super($fs, $platformCommandHelper, $platformsDataService, $packageInstallationManager, $packageManager, $pacoteService);
19
19
  this.$fs = $fs;
20
20
  this.$platformCommandHelper = $platformCommandHelper;
@@ -27,6 +27,7 @@ class MigrateController extends update_controller_base_1.UpdateControllerBase {
27
27
  this.$pluginsService = $pluginsService;
28
28
  this.$projectDataService = $projectDataService;
29
29
  this.$projectConfigService = $projectConfigService;
30
+ this.$projectData = $projectData;
30
31
  this.$options = $options;
31
32
  this.$resources = $resources;
32
33
  this.$injector = $injector;
@@ -65,7 +66,7 @@ class MigrateController extends update_controller_base_1.UpdateControllerBase {
65
66
  },
66
67
  {
67
68
  packageName: "nativescript-dev-webpack",
68
- replaceWith: "@nativescript/webpack",
69
+ replaceWith: constants.WEBPACK_PLUGIN_NAME,
69
70
  shouldRemove: true,
70
71
  isDev: true,
71
72
  async shouldMigrateAction() {
@@ -74,7 +75,7 @@ class MigrateController extends update_controller_base_1.UpdateControllerBase {
74
75
  migrateAction: this.migrateWebpack.bind(this),
75
76
  },
76
77
  {
77
- packageName: "@nativescript/webpack",
78
+ packageName: constants.WEBPACK_PLUGIN_NAME,
78
79
  minVersion: "3.0.0",
79
80
  desiredVersion: "~5.0.0",
80
81
  shouldAddIfMissing: true,
@@ -406,7 +407,7 @@ class MigrateController extends update_controller_base_1.UpdateControllerBase {
406
407
  async cleanUpProject(projectData) {
407
408
  await this.$projectCleanupService.clean([
408
409
  constants.HOOKS_DIR_NAME,
409
- constants.PLATFORMS_DIR_NAME,
410
+ this.$projectData.getBuildRelativeDirectoryPath(),
410
411
  constants.NODE_MODULES_FOLDER_NAME,
411
412
  constants.PACKAGE_LOCK_JSON_FILE_NAME,
412
413
  ]);
@@ -955,7 +956,7 @@ class MigrateController extends update_controller_base_1.UpdateControllerBase {
955
956
  this.spinner.info(`Initializing new ${color_1.color.yellow("webpack.config.js")}`);
956
957
  const { desiredVersion: webpackVersion } = this.migrationDependencies.find((dep) => dep.packageName === constants.WEBPACK_PLUGIN_NAME);
957
958
  try {
958
- const scopedWebpackPackage = `@nativescript/webpack`;
959
+ const scopedWebpackPackage = constants.WEBPACK_PLUGIN_NAME;
959
960
  const resolvedVersion = await this.$packageInstallationManager.getMaxSatisfyingVersion(scopedWebpackPackage, webpackVersion);
960
961
  await this.runNPX([
961
962
  "--package",
@@ -29,7 +29,8 @@ class PlatformController {
29
29
  const packageToInstall = await this.getPackageToInstall(platformData, projectData, addPlatformData.frameworkPath, version);
30
30
  this.$logger.trace("Determined package to install is", packageToInstall);
31
31
  const installedPlatformVersion = await this.$addPlatformService.addPlatformSafe(projectData, platformData, packageToInstall, addPlatformData);
32
- this.$fs.ensureDirectoryExists(path.join(projectData.platformsDir, platform));
32
+ const buildPath = projectData.platformsDir;
33
+ this.$fs.ensureDirectoryExists(path.join(buildPath, platform));
33
34
  if (this.$mobileHelper.isAndroidPlatform(platform)) {
34
35
  const gradlePropertiesPath = path.resolve(platformData.projectRoot, "gradle.properties");
35
36
  const commentHeader = "# App configuration";
@@ -48,6 +49,7 @@ class PlatformController {
48
49
  commentHeader,
49
50
  `appPath = ${appPath}`,
50
51
  `appResourcesPath = ${appResourcesPath}`,
52
+ `buildPath = ${buildPath}`,
51
53
  "",
52
54
  ].join("\n");
53
55
  gradlePropertiesContents += dataToWrite;
@@ -15,6 +15,7 @@ const decorators_1 = require("../common/decorators");
15
15
  const helpers_1 = require("../common/helpers");
16
16
  const yok_1 = require("../common/yok");
17
17
  const constants_1 = require("../constants");
18
+ const resolve_package_path_1 = require("@rigor789/resolve-package-path");
18
19
  class PrepareController extends events_1.EventEmitter {
19
20
  constructor($platformController, $hooksService, $fs, $logger, $options, $mobileHelper, $nodeModulesDependenciesBuilder, $platformsDataService, $pluginsService, $prepareNativePlatformService, $projectChangesService, $projectDataService, $bundlerCompilerService, $watchIgnoreListService, $analyticsService, $markingModeService, $projectConfigService, $projectService) {
20
21
  super();
@@ -142,10 +143,15 @@ class PrepareController extends events_1.EventEmitter {
142
143
  async startJSWatcherWithPrepare(platformData, projectData, prepareData) {
143
144
  if (!this.watchersData[projectData.projectDir][platformData.platformNameLowerCase].hasWebpackCompilerProcess) {
144
145
  const handler = (data) => {
146
+ var _a;
145
147
  if (data.platform.toLowerCase() === platformData.platformNameLowerCase) {
146
148
  if (this.isFileWatcherPaused())
147
149
  return;
148
- this.emitPrepareEvent({ ...data, hasNativeChanges: false });
150
+ this.emitPrepareEvent({
151
+ ...data,
152
+ files: (_a = data.files) !== null && _a !== void 0 ? _a : [],
153
+ hasNativeChanges: false,
154
+ });
149
155
  }
150
156
  };
151
157
  this.webpackCompilerHandler = handler.bind(this);
@@ -191,7 +197,7 @@ class PrepareController extends events_1.EventEmitter {
191
197
  this.$logger.info(`Chokidar raised event ${event} for ${filePath}.`);
192
198
  await this.writeRuntimePackageJson(projectData, platformData);
193
199
  this.emitPrepareEvent({
194
- files: [],
200
+ files: [filePath],
195
201
  staleFiles: [],
196
202
  hasOnlyHotUpdateFiles: false,
197
203
  hmrData: null,
@@ -221,28 +227,63 @@ class PrepareController extends events_1.EventEmitter {
221
227
  return patterns;
222
228
  }
223
229
  async writeRuntimePackageJson(projectData, platformData, prepareData = null) {
230
+ var _a, _b;
224
231
  const configInfo = this.$projectConfigService.detectProjectConfigs(projectData.projectDir);
225
232
  if (configInfo.usingNSConfig) {
226
233
  return;
227
234
  }
228
235
  this.$logger.info("Updating runtime package.json with configuration values...");
229
- const nsConfig = this.$projectConfigService.readConfig(projectData.projectDir);
236
+ const { hooks, ignoredNativeDependencies, webpackPackageName, webpackConfigPath, appResourcesPath, buildPath, appPath, ...nsConfig } = this.$projectConfigService.readConfig(projectData.projectDir);
237
+ const platform = platformData.platformNameLowerCase;
238
+ let installedRuntimePackageJSON;
239
+ let runtimePackageName;
240
+ if (platform === "ios") {
241
+ runtimePackageName = ((_a = projectData.nsConfig.ios) === null || _a === void 0 ? void 0 : _a.runtimePackageName) || constants_1.SCOPED_IOS_RUNTIME_NAME;
242
+ }
243
+ else if (platform === "android") {
244
+ runtimePackageName = ((_b = projectData.nsConfig.android) === null || _b === void 0 ? void 0 : _b.runtimePackageName) || constants_1.SCOPED_ANDROID_RUNTIME_NAME;
245
+ }
246
+ const installedRuntimePackageJSONPath = (0, resolve_package_path_1.resolvePackageJSONPath)(runtimePackageName, {
247
+ paths: [projectData.projectDir],
248
+ });
249
+ if (installedRuntimePackageJSONPath) {
250
+ installedRuntimePackageJSON = this.$fs.readJson(installedRuntimePackageJSONPath);
251
+ }
230
252
  const packageData = {
231
253
  ..._.pick(projectData.packageJsonData, ["name"]),
232
254
  ...nsConfig,
233
255
  main: "bundle",
256
+ ...(installedRuntimePackageJSON ? {} : {})
234
257
  };
235
- if (platformData.platformNameLowerCase === "ios" &&
236
- packageData.ios &&
237
- packageData.ios.discardUncaughtJsExceptions) {
238
- packageData.discardUncaughtJsExceptions =
239
- packageData.ios.discardUncaughtJsExceptions;
258
+ if (platform === "ios") {
259
+ if (installedRuntimePackageJSON) {
260
+ packageData.ios = packageData.ios || {};
261
+ packageData.ios.runtime = {
262
+ version: installedRuntimePackageJSON.version
263
+ };
264
+ }
265
+ if (packageData.ios &&
266
+ packageData.ios.discardUncaughtJsExceptions) {
267
+ packageData.discardUncaughtJsExceptions =
268
+ packageData.ios.discardUncaughtJsExceptions;
269
+ }
270
+ delete packageData.android;
240
271
  }
241
- if (platformData.platformNameLowerCase === "android" &&
242
- packageData.android &&
243
- packageData.android.discardUncaughtJsExceptions) {
244
- packageData.discardUncaughtJsExceptions =
245
- packageData.android.discardUncaughtJsExceptions;
272
+ if (platform === "android") {
273
+ if (installedRuntimePackageJSON) {
274
+ packageData.android = packageData.android || {};
275
+ packageData.android.runtime = {
276
+ version: installedRuntimePackageJSON.version,
277
+ version_info: installedRuntimePackageJSON.version_info,
278
+ gradle: installedRuntimePackageJSON.gradle
279
+ };
280
+ }
281
+ if (packageData.android &&
282
+ packageData.android.discardUncaughtJsExceptions) {
283
+ packageData.discardUncaughtJsExceptions =
284
+ packageData.android.discardUncaughtJsExceptions;
285
+ }
286
+ delete packageData.ios;
246
287
  }
247
288
  let packagePath;
248
289
  if (this.$mobileHelper.isApplePlatform(platformData.platformNameLowerCase)) {
@@ -14,6 +14,7 @@ const events_1 = require("events");
14
14
  const util = require("util");
15
15
  const _ = require("lodash");
16
16
  const yok_1 = require("../common/yok");
17
+ const helpers_1 = require("../common/helpers");
17
18
  class RunController extends events_1.EventEmitter {
18
19
  constructor($analyticsService, $buildController, $debugController, $deviceInstallAppService, $devicesService, $errors, $injector, $hmrStatusService, $hooksService, $liveSyncServiceResolver, $liveSyncProcessDataService, $logger, $mobileHelper, $platformsDataService, $pluginsService, $prepareController, $prepareDataService, $prepareNativePlatformService, $projectChangesService, $projectDataService) {
19
20
  super();
@@ -61,11 +62,12 @@ class RunController extends events_1.EventEmitter {
61
62
  const prepareData = this.$prepareDataService.getPrepareData(liveSyncInfo.projectDir, data.platform, { ...liveSyncInfo, watch: !liveSyncInfo.skipWatcher });
62
63
  const changesInfo = await this.$projectChangesService.checkForChanges(platformData, projectData, prepareData);
63
64
  if (changesInfo.hasChanges) {
64
- await this.syncChangedDataOnDevices(data, projectData, liveSyncInfo);
65
+ await this.syncChangedDataOnDevices(data, projectData, platformData, liveSyncInfo);
65
66
  }
66
67
  }
67
68
  else {
68
- await this.syncChangedDataOnDevices(data, projectData, liveSyncInfo);
69
+ const platformData = this.$platformsDataService.getPlatformData(data.platform, projectData);
70
+ await this.syncChangedDataOnDevices(data, projectData, platformData, liveSyncInfo);
69
71
  }
70
72
  };
71
73
  this.prepareReadyEventHandler = handler.bind(this);
@@ -276,26 +278,21 @@ class RunController extends events_1.EventEmitter {
276
278
  };
277
279
  const platformData = this.$platformsDataService.getPlatformData(device.deviceInfo.platform, projectData);
278
280
  try {
279
- let packageFilePath = null;
280
281
  if (rebuiltInformation[platformData.platformNameLowerCase] &&
281
282
  (this.$mobileHelper.isAndroidPlatform(platformData.platformNameLowerCase) ||
282
283
  rebuiltInformation[platformData.platformNameLowerCase]
283
284
  .isEmulator === device.isEmulator)) {
284
- packageFilePath =
285
- rebuiltInformation[platformData.platformNameLowerCase]
286
- .packageFilePath;
287
- await this.$deviceInstallAppService.installOnDevice(device, buildData, packageFilePath);
285
+ await this.$deviceInstallAppService.installOnDevice(device, buildData);
288
286
  }
289
287
  else {
290
288
  const shouldBuild = prepareResultData.hasNativeChanges ||
291
289
  buildData.nativePrepare.forceRebuildNativeApp ||
292
290
  (await this.$buildController.shouldBuild(buildData));
293
291
  if (shouldBuild) {
294
- packageFilePath = await deviceDescriptor.buildAction();
292
+ await deviceDescriptor.buildAction();
295
293
  rebuiltInformation[platformData.platformNameLowerCase] = {
296
294
  isEmulator: device.isEmulator,
297
295
  platform: platformData.platformNameLowerCase,
298
- packageFilePath,
299
296
  };
300
297
  }
301
298
  else {
@@ -305,7 +302,7 @@ class RunController extends events_1.EventEmitter {
305
302
  projectDir: projectData.projectDir,
306
303
  });
307
304
  }
308
- await this.$deviceInstallAppService.installOnDeviceIfNeeded(device, buildData, packageFilePath);
305
+ await this.$deviceInstallAppService.installOnDeviceIfNeeded(device, buildData);
309
306
  }
310
307
  const platformLiveSyncService = this.$liveSyncServiceResolver.resolveLiveSyncService(platformData.platformNameLowerCase);
311
308
  const { force, useHotModuleReload, skipWatcher } = liveSyncInfo;
@@ -343,7 +340,7 @@ class RunController extends events_1.EventEmitter {
343
340
  };
344
341
  await this.addActionToChain(projectData.projectDir, () => this.$devicesService.execute(deviceAction, (device) => _.some(deviceDescriptors, (deviceDescriptor) => deviceDescriptor.identifier === device.deviceInfo.identifier)));
345
342
  }
346
- async syncChangedDataOnDevices(data, projectData, liveSyncInfo) {
343
+ async syncChangedDataOnDevices(data, projectData, platformData, liveSyncInfo) {
347
344
  const successfullySyncedMessageFormat = `Successfully synced application %s on device %s.`;
348
345
  const rebuiltInformation = {};
349
346
  const deviceAction = async (device) => {
@@ -392,8 +389,7 @@ class RunController extends events_1.EventEmitter {
392
389
  packageFilePath: null,
393
390
  };
394
391
  }
395
- await this.$deviceInstallAppService.installOnDevice(device, deviceDescriptor.buildData, rebuiltInformation[platformData.platformNameLowerCase]
396
- .packageFilePath);
392
+ await this.$deviceInstallAppService.installOnDevice(device, deviceDescriptor.buildData);
397
393
  await platformLiveSyncService.syncAfterInstall(device, watchInfo);
398
394
  await this.refreshApplication(projectData, {
399
395
  deviceAppData,
@@ -509,4 +505,7 @@ __decorate([
509
505
  __decorate([
510
506
  (0, decorators_1.cache)()
511
507
  ], RunController.prototype, "attachDeviceLostHandler", null);
508
+ __decorate([
509
+ (0, helpers_1.hook)("syncChangedDataOnDevices")
510
+ ], RunController.prototype, "syncChangedDataOnDevices", null);
512
511
  yok_1.injector.register("runController", RunController);
@@ -123,7 +123,7 @@ class UpdateController extends update_controller_base_1.UpdateControllerBase {
123
123
  async cleanUpProject() {
124
124
  await this.$projectCleanupService.clean([
125
125
  constants.HOOKS_DIR_NAME,
126
- constants.PLATFORMS_DIR_NAME,
126
+ this.$projectDataService.getProjectData().getBuildRelativeDirectoryPath(),
127
127
  constants.NODE_MODULES_FOLDER_NAME,
128
128
  constants.PACKAGE_LOCK_JSON_FILE_NAME,
129
129
  ]);
@@ -135,7 +135,7 @@ UpdateController.updatableDependencies = [
135
135
  packageName: "@nativescript/core",
136
136
  },
137
137
  {
138
- packageName: "@nativescript/webpack",
138
+ packageName: constants.WEBPACK_PLUGIN_NAME,
139
139
  isDev: true,
140
140
  },
141
141
  {
@@ -36,6 +36,8 @@ class AndroidBuildData extends BuildData {
36
36
  this.keyStoreAliasPassword = data.keyStoreAliasPassword;
37
37
  this.keyStorePassword = data.keyStorePassword;
38
38
  this.androidBundle = data.androidBundle || data.aab;
39
+ this.buildFilterDevicesArch = !this.androidBundle && data.filterDevicesArch !== false;
40
+ this.gradleFlavor = data.gradleFlavor;
39
41
  this.gradlePath = data.gradlePath;
40
42
  this.gradleArgs = data.gradleArgs;
41
43
  this.hostProjectPath = data.hostProjectPath;
@@ -585,7 +585,9 @@ interface IEmbedOptions {
585
585
 
586
586
  interface IAndroidOptions extends IEmbedOptions {
587
587
  gradlePath: string;
588
- gradleArgs: string;
588
+ gradleFlavor: string;
589
+ gradleArgs: string[];
590
+ overrideRuntimeGradleFiles: boolean;
589
591
  }
590
592
 
591
593
  interface IIOSOptions extends IEmbedOptions {}
@@ -10,8 +10,9 @@ interface IAndroidBuildOptions {
10
10
  pluginName: string;
11
11
  aarOutputDir: string;
12
12
  tempPluginDirPath: string;
13
+ gradleArgs?: string[];
13
14
  gradlePath?: string;
14
- gradleArgs?: string;
15
+ aarSuffix?: string;
15
16
  }
16
17
 
17
18
  interface IAndroidPluginBuildService {
@@ -48,5 +49,5 @@ interface IBuildAndroidPluginData extends Partial<IProjectDir> {
48
49
  /**
49
50
  * Optional custom Gradle arguments.
50
51
  */
51
- gradleArgs?: string;
52
+ gradleArgs?: string[];
52
53
  }
@@ -31,8 +31,10 @@ interface IAndroidBuildData
31
31
  extends IBuildData,
32
32
  IAndroidSigningData,
33
33
  IHasAndroidBundle {
34
+ buildFilterDevicesArch?: boolean;
35
+ gradleArgs?: string[];
36
+ gradleFlavor?: string;
34
37
  gradlePath?: string;
35
- gradleArgs?: string;
36
38
  }
37
39
 
38
40
  interface IAndroidSigningData {
@@ -62,7 +64,7 @@ interface IBuildArtifactsService {
62
64
  platformData: IPlatformData,
63
65
  buildOutputOptions: IBuildOutputOptions
64
66
  ): Promise<string>;
65
- copyLatestAppPackage(
67
+ copyAppPackages(
66
68
  targetPath: string,
67
69
  platformData: IPlatformData,
68
70
  buildOutputOptions: IBuildOutputOptions
@@ -0,0 +1 @@
1
+ declare module "@nativescript/hook";
@@ -11,7 +11,7 @@ interface IIOSDebuggerPortData {
11
11
 
12
12
  interface IIOSDebuggerPortStoredData {
13
13
  port: number;
14
- timer?: NodeJS.Timer;
14
+ timer?: NodeJS.Timeout;
15
15
  error?: Error;
16
16
  }
17
17
 
@@ -18,7 +18,7 @@ import {
18
18
 
19
19
  declare global {
20
20
  interface ILiveSyncProcessData {
21
- timer: NodeJS.Timer;
21
+ timer: NodeJS.Timeout;
22
22
  actionsChain: Promise<any>;
23
23
  isStopped: boolean;
24
24
  deviceDescriptors: ILiveSyncDeviceDescriptor[];
@@ -125,6 +125,8 @@ export type BundlerType = "webpack" | "rspack" | "vite";
125
125
 
126
126
  interface INsConfigIOS extends INsConfigPlaform {
127
127
  discardUncaughtJsExceptions?: boolean;
128
+ runtimePackageName?: string
129
+ cocoapodUseBundleExec?: boolean
128
130
  /**
129
131
  * Swift Package Manager
130
132
  * List packages to be included in the iOS build.
@@ -168,6 +170,14 @@ interface INsConfigAndroid extends INsConfigPlaform {
168
170
  enableLineBreakpoints?: boolean;
169
171
 
170
172
  enableMultithreadedJavascript?: boolean;
173
+
174
+ gradleVersion?: string;
175
+
176
+ gradleArgs?: string[];
177
+
178
+ plugins?:{ [k:string]: { aarSuffix?: string } }
179
+
180
+ runtimePackageName?: string
171
181
  }
172
182
 
173
183
  interface INsConfigHooks {
@@ -180,8 +190,10 @@ interface INsConfig {
180
190
  main?: string;
181
191
  appPath?: string;
182
192
  appResourcesPath?: string;
193
+ buildPath?: string;
183
194
  shared?: boolean;
184
195
  overridePods?: string;
196
+ webpackPackageName?: string;
185
197
  webpackConfigPath?: string;
186
198
  bundlerConfigPath?: string;
187
199
  bundler?: BundlerType;
@@ -191,6 +203,7 @@ interface INsConfig {
191
203
  ignoredNativeDependencies?: string[];
192
204
  hooks?: INsConfigHooks[];
193
205
  projectName?: string;
206
+ corePackageName?: string;
194
207
  }
195
208
 
196
209
  interface IProjectData extends ICreateProjectData {
@@ -256,6 +269,7 @@ interface IProjectData extends ICreateProjectData {
256
269
  getAppDirectoryRelativePath(): string;
257
270
  getAppResourcesDirectoryPath(projectDir?: string): string;
258
271
  getAppResourcesRelativeDirectoryPath(): string;
272
+ getBuildRelativeDirectoryPath(): string;
259
273
  }
260
274
 
261
275
  interface IProjectDataService {
@@ -31,13 +31,11 @@ declare global {
31
31
  interface IDeviceInstallAppService {
32
32
  installOnDevice(
33
33
  device: Mobile.IDevice,
34
- buildData: IBuildData,
35
- packageFile?: string
34
+ buildData: IBuildData
36
35
  ): Promise<void>;
37
36
  installOnDeviceIfNeeded(
38
37
  device: Mobile.IDevice,
39
- buildData: IBuildData,
40
- packageFile?: string
38
+ buildData: IBuildData
41
39
  ): Promise<void>;
42
40
  shouldInstall(
43
41
  device: Mobile.IDevice,
@@ -36,6 +36,7 @@ class DeployCommandHelper {
36
36
  const buildData = this.$buildDataService.getBuildData(this.$projectData.projectDir, d.deviceInfo.platform, {
37
37
  ...this.$options.argv,
38
38
  outputPath,
39
+ buildFilterDevicesArch: false,
39
40
  buildForDevice: !d.isEmulator,
40
41
  skipWatcher: !this.$options.watch,
41
42
  nativePrepare: {
@@ -5,6 +5,34 @@ require("./bootstrap");
5
5
  const shelljs = require("shelljs");
6
6
  shelljs.config.silent = true;
7
7
  shelljs.config.fatal = true;
8
+ if (process.platform === "win32") {
9
+ const realcp = shelljs.cp;
10
+ shelljs.cp = (...args) => {
11
+ if (args.length === 3) {
12
+ args[1] = replaceDashes(args[1]);
13
+ }
14
+ else {
15
+ args[0] = replaceDashes(args[0]);
16
+ }
17
+ if (args.length == 2) {
18
+ realcp(args[0], args[1]);
19
+ }
20
+ else {
21
+ realcp(args[0], args[1], args[2]);
22
+ }
23
+ };
24
+ function replaceDashes(values) {
25
+ if (Array.isArray(values)) {
26
+ for (let i = 0; i < values.length; ++i) {
27
+ values[i] = replaceDashes(values[i]);
28
+ }
29
+ return values;
30
+ }
31
+ else {
32
+ return values.replace(/\\/g, "/");
33
+ }
34
+ }
35
+ }
8
36
  const errors_1 = require("./common/errors");
9
37
  const helpers_1 = require("./common/helpers");
10
38
  const yok_1 = require("./common/yok");
package/lib/options.js CHANGED
@@ -184,7 +184,7 @@ class Options {
184
184
  default: { type: "boolean", hasSensitiveValue: false },
185
185
  count: { type: "number", hasSensitiveValue: false },
186
186
  analyticsLogFile: { type: "string", hasSensitiveValue: true },
187
- disableAnalytics: { type: "boolean", hasSensitiveValue: false },
187
+ disableAnalytics: { type: "boolean", hasSensitiveValue: false, default: true },
188
188
  cleanupLogFile: { type: "string", hasSensitiveValue: true },
189
189
  hooks: {
190
190
  type: "boolean",
@@ -196,8 +196,14 @@ class Options {
196
196
  default: false,
197
197
  hasSensitiveValue: false,
198
198
  },
199
+ overrideRuntimeGradleFiles: { type: "boolean", hasSensitiveValue: false },
200
+ gradleFlavor: { type: "string", hasSensitiveValue: false },
199
201
  gradlePath: { type: "string", hasSensitiveValue: false },
200
- gradleArgs: { type: "string", hasSensitiveValue: false },
202
+ gradleArgs: {
203
+ type: "string",
204
+ hasSensitiveValue: false,
205
+ array: true,
206
+ },
201
207
  hostProjectPath: { type: "string", hasSensitiveValue: false },
202
208
  hostProjectModuleName: {
203
209
  type: "string",
@@ -205,6 +211,7 @@ class Options {
205
211
  default: constants_1.APP_FOLDER_NAME,
206
212
  },
207
213
  aab: { type: "boolean", hasSensitiveValue: false },
214
+ filterDevicesArch: { type: "boolean", hasSensitiveValue: false },
208
215
  performance: { type: "object", hasSensitiveValue: true },
209
216
  appleApplicationSpecificPassword: {
210
217
  type: "string",