From 397291800f0114f20606a43160e21217e1e137aa Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Wed, 3 Apr 2024 14:57:09 -0700 Subject: [PATCH] feat: visionOS support (#5783) --- README.md | 63 +- lib/bootstrap.ts | 8 + lib/commands/build.ts | 40 +- lib/commands/create-project.ts | 100 +- lib/commands/run.ts | 47 +- lib/common/definitions/key-commands.d.ts | 3 +- lib/common/definitions/mobile.d.ts | 11 + .../mobile/device-platforms-constants.ts | 16 +- lib/common/mobile/ios/device/ios-device.ts | 14 +- .../ios/ios-device-product-name-mapper.ts | 1 + .../ios/simulator/ios-emulator-services.ts | 14 +- .../ios/simulator/ios-simulator-device.ts | 4 +- lib/common/mobile/log-filter.ts | 4 +- .../mobile/mobile-core/devices-service.ts | 29 +- .../mobile-core/ios-device-discovery.ts | 11 +- lib/common/mobile/mobile-helper.ts | 15 + .../test/unit-tests/mobile/devices-service.ts | 161 ++- lib/constants.ts | 22 +- lib/controllers/prepare-controller.ts | 4 +- lib/data/build-data.ts | 2 + lib/declarations.d.ts | 8 + lib/definitions/build.d.ts | 1 + lib/definitions/project.d.ts | 5 + lib/definitions/start-service.d.ts | 2 + lib/device-path-provider.ts | 4 +- lib/helpers/key-command-helper.ts | 5 + lib/helpers/livesync-command-helper.ts | 7 +- lib/key-commands/bootstrap.ts | 6 +- lib/key-commands/index.ts | 134 +- lib/options.ts | 11 +- lib/package-installation-manager.ts | 18 +- lib/project-data.ts | 18 +- lib/resolvers/livesync-service-resolver.ts | 2 +- lib/services/build-data-service.ts | 2 +- lib/services/ios-entitlements-service.ts | 7 +- lib/services/ios-project-service.ts | 87 +- lib/services/ios/spm-service.ts | 20 +- lib/services/ios/xcodebuild-args-service.ts | 56 +- lib/services/platforms-data-service.ts | 4 + lib/services/plugins-service.ts | 12 +- lib/services/prepare-data-service.ts | 2 +- lib/services/project-changes-service.ts | 14 +- lib/services/project-data-service.ts | 12 +- lib/services/start-service.ts | 10 + package-lock.json | 1142 +++++++++-------- package.json | 4 +- test/ios-entitlements-service.ts | 22 +- test/ios-project-service.ts | 33 +- test/project-changes-service.ts | 53 +- test/project-commands.ts | 69 +- test/services/ios/xcodebuild-args-service.ts | 70 +- test/stubs.ts | 24 +- 52 files changed, 1578 insertions(+), 855 deletions(-) diff --git a/README.md b/README.md index 22f3c6a2e9..07ca7c7b89 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@
-

The NativeScript CLI lets you create, build, and deploy NativeScript-based apps on iOS and Android devices.

+

The NativeScript CLI lets you create, build, and deploy NativeScript apps.

@@ -18,30 +18,51 @@ Get it using: `npm install -g nativescript` -* [What is NativeScript](#what-is-nativescript "Quick overview of NativeScript, the JavaScript framework for cross-platform development of native iOS and Android apps") -* [How the NativeScript CLI works](#how-the-nativescript-cli-works "How the CLI works in more detail") -* [Supported Platforms](#supported-platforms "The mobile platforms you can target with NativeScript") -* [System Requirements](#system-requirements "The hardware and software requirements for setting up and working with the NativeScript CLI") -* [Installation](#installation "How to configure and install the NativeScript CLI") - * [Install the NativeScript CLI](#install-the-nativescript-cli) - * [Configure Proxy Usage](#configure-proxy-settings) -* [Quick Start](#quick-start "Get started with the NativeScript CLI") - * [The Commands](#the-commands) - * [Create Project](#create-project) - * [Develop Your Project](#develop-your-project) - * [Build Your Project](#build-your-project) - * [Run Your Project](#run-your-project) -* [Extending the CLI](#extending-the-cli) -* [Troubleshooting](#troubleshooting) -* [How to Contribute](#how-to-contribute) -* [How to Build](#how-to-build) -* [Get Help](#get-help) -* [License](#license) +- [What is NativeScript](#what-is-nativescript) +- [How the NativeScript CLI works](#how-the-nativescript-cli-works) +- [Supported Platforms](#supported-platforms) +- [System Requirements](#system-requirements) +- [Installation](#installation) + - [Install the NativeScript CLI](#install-the-nativescript-cli) + - [Configure Proxy Settings](#configure-proxy-settings) + - [Set Proxy Settings](#set-proxy-settings) + - [Attributes](#attributes) + - [Options](#options) + - [Limitations](#limitations) + - [Display Current Proxy Settings](#display-current-proxy-settings) + - [Clear Proxy Settings](#clear-proxy-settings) +- [Quick Start](#quick-start) + - [The Commands](#the-commands) + - [Create Project](#create-project) + - [Develop Your Project](#develop-your-project) + - [Development with NativeScript](#development-with-nativescript) + - [Development in `app`](#development-in-app) + - [Development in `platforms`](#development-in-platforms) + - [Modifying Configuration Files](#modifying-configuration-files) + - [Modifying Entitlements File (iOS only)](#modifying-entitlements-file-ios-only) + - [Build Your Project](#build-your-project) + - [Run Your Project](#run-your-project) +- [Extending the CLI](#extending-the-cli) +- [Troubleshooting](#troubleshooting) +- [How to Contribute](#how-to-contribute) +- [How to Build](#how-to-build) +- [Get Help](#get-help) +- [License](#license) What is NativeScript === -NativeScript is a cross-platform JavaScript framework that lets you develop native iOS and Android apps from a single code base. The framework provides JavaScript access to the native APIs, user interface, and rendering engines of iOS and Android. By using JavaScript or TypeScript, you can create one project that builds into an iOS or Android app with completely native user experience. +NativeScript provides platform APIs directly to the JavaScript runtime (_with strong types_) for a rich TypeScript development experience. + +Some popular use cases: + +- Building Web, iOS, Android and Vision Pro apps with a shared codebase (aka, cross platform apps) +- Building native platform apps with portable JavaScript skills +- Augmenting JavaScript projects with platform API capabilities +- AndroidTV and Watch development +- watchOS development +- Learning native platforms through JavaScript understanding +- Exploring platform API documentation by trying APIs [directly from a web browser](https://preview.nativescript.org/) without requiring a platform development machine setup. To learn more about NativeScript, you can check the following resources: diff --git a/lib/bootstrap.ts b/lib/bootstrap.ts index 5892901282..74ea58a4b6 100644 --- a/lib/bootstrap.ts +++ b/lib/bootstrap.ts @@ -180,17 +180,23 @@ injector.requireCommand("platform|update", "./commands/update-platform"); injector.requireCommand("run|*all", "./commands/run"); injector.requireCommand("run|ios", "./commands/run"); injector.requireCommand("run|android", "./commands/run"); +injector.requireCommand("run|vision", "./commands/run"); +injector.requireCommand("run|visionos", "./commands/run"); injector.requireCommand("typings", "./commands/typings"); injector.requireCommand("preview", "./commands/preview"); injector.requireCommand("debug|ios", "./commands/debug"); injector.requireCommand("debug|android", "./commands/debug"); +injector.requireCommand("debug|vision", "./commands/debug"); +injector.requireCommand("debug|visionos", "./commands/debug"); injector.requireCommand("fonts", "./commands/fonts"); injector.requireCommand("prepare", "./commands/prepare"); injector.requireCommand("build|ios", "./commands/build"); injector.requireCommand("build|android", "./commands/build"); +injector.requireCommand("build|vision", "./commands/build"); +injector.requireCommand("build|visionos", "./commands/build"); injector.requireCommand("deploy", "./commands/deploy"); injector.require("testExecutionService", "./services/test-execution-service"); @@ -198,6 +204,8 @@ injector.requireCommand("dev-test|android", "./commands/test"); injector.requireCommand("dev-test|ios", "./commands/test"); injector.requireCommand("test|android", "./commands/test"); injector.requireCommand("test|ios", "./commands/test"); +// injector.requireCommand("test|vision", "./commands/test"); +// injector.requireCommand("test|visionos", "./commands/test"); injector.requireCommand("test|init", "./commands/test-init"); injector.requireCommand("dev-generate-help", "./commands/generate-help"); diff --git a/lib/commands/build.ts b/lib/commands/build.ts index b3b732e2d6..d4c6460a1c 100644 --- a/lib/commands/build.ts +++ b/lib/commands/build.ts @@ -108,7 +108,7 @@ export class BuildIosCommand extends BuildCommandBase implements ICommand { $platformValidationService: IPlatformValidationService, $logger: ILogger, $buildDataService: IBuildDataService, - private $migrateController: IMigrateController + protected $migrateController: IMigrateController ) { super( $options, @@ -221,3 +221,41 @@ export class BuildAndroidCommand extends BuildCommandBase implements ICommand { } injector.registerCommand("build|android", BuildAndroidCommand); + +export class BuildVisionOsCommand extends BuildIosCommand implements ICommand { + constructor( + protected $options: IOptions, + $errors: IErrors, + $projectData: IProjectData, + $platformsDataService: IPlatformsDataService, + $devicePlatformsConstants: Mobile.IDevicePlatformsConstants, + $buildController: IBuildController, + $platformValidationService: IPlatformValidationService, + $logger: ILogger, + $buildDataService: IBuildDataService, + protected $migrateController: IMigrateController + ) { + super( + $options, + $errors, + $projectData, + $platformsDataService, + $devicePlatformsConstants, + $buildController, + $platformValidationService, + $logger, + $buildDataService, + $migrateController + ); + } + + public async canExecute(args: string[]): Promise { + this.$errors.fail( + 'Building for "visionOS" platform is not supported via the CLI. Please open the project in Xcode and build it from there.' + ); + return false; + } +} + +injector.registerCommand("build|vision", BuildVisionOsCommand); +injector.registerCommand("build|visionos", BuildVisionOsCommand); diff --git a/lib/commands/create-project.ts b/lib/commands/create-project.ts index fd10ecebb7..424fb8d4ac 100644 --- a/lib/commands/create-project.ts +++ b/lib/commands/create-project.ts @@ -15,6 +15,8 @@ export class CreateProjectCommand implements ICommand { private static BlankTemplateDescription = "A blank app"; private static BlankTsTemplateKey = "Blank Typescript"; private static BlankTsTemplateDescription = "A blank typescript app"; + private static BlankVisionTemplateKey = "visionOS"; + private static BlankVisionTemplateDescription = "A visionOS app"; private static HelloWorldTemplateKey = "Hello World"; private static HelloWorldTemplateDescription = "A Hello World app"; private static DrawerTemplateKey = "SideDrawer"; @@ -58,15 +60,43 @@ export class CreateProjectCommand implements ICommand { let projectName = args[0]; let selectedTemplate: string; - if (this.$options.js) { - selectedTemplate = constants.JAVASCRIPT_NAME; - } else if (this.$options.vue && this.$options.tsc) { + if ( + this.$options["vision-ng"] || + (this.$options.vision && this.$options.ng) + ) { + selectedTemplate = constants.RESERVED_TEMPLATE_NAMES["vision-ng"]; + } else if ( + this.$options["vision-react"] || + (this.$options.vision && this.$options.react) + ) { + selectedTemplate = constants.RESERVED_TEMPLATE_NAMES["vision-react"]; + } else if (this.$options["vision-solid"]) { + // note: we don't have solid templates or --solid + selectedTemplate = constants.RESERVED_TEMPLATE_NAMES["vision-solid"]; + } else if ( + this.$options["vision-svelte"] || + (this.$options.vision && this.$options.svelte) + ) { + selectedTemplate = constants.RESERVED_TEMPLATE_NAMES["vision-svelte"]; + } else if ( + this.$options["vision-vue"] || + (this.$options.vision && (this.$options.vue || this.$options.vuejs)) + ) { + selectedTemplate = constants.RESERVED_TEMPLATE_NAMES["vision-vue"]; + } else if ( + (this.$options.vue || this.$options.vuejs) && + this.$options.tsc + ) { selectedTemplate = "@nativescript/template-blank-vue-ts"; + } else if (this.$options.vision) { + selectedTemplate = constants.RESERVED_TEMPLATE_NAMES["vision"]; + } else if (this.$options.js) { + selectedTemplate = constants.JAVASCRIPT_NAME; } else if (this.$options.tsc) { selectedTemplate = constants.TYPESCRIPT_NAME; } else if (this.$options.ng) { selectedTemplate = constants.ANGULAR_NAME; - } else if (this.$options.vue) { + } else if (this.$options.vue || this.$options.vuejs) { selectedTemplate = constants.VUE_NAME; } else if (this.$options.react) { selectedTemplate = constants.REACT_NAME; @@ -262,6 +292,11 @@ can skip this prompt next time using the --template option, or the --ng, --react value: "@nativescript/template-tab-navigation-ts", description: CreateProjectCommand.TabsTemplateDescription, }, + { + key: CreateProjectCommand.BlankVisionTemplateKey, + value: "@nativescript/template-hello-world-ts-vision", + description: CreateProjectCommand.BlankVisionTemplateDescription, + }, ]; return templates; @@ -284,6 +319,11 @@ can skip this prompt next time using the --template option, or the --ng, --react value: "@nativescript/template-tab-navigation-ng", description: CreateProjectCommand.TabsTemplateDescription, }, + { + key: CreateProjectCommand.BlankVisionTemplateKey, + value: "@nativescript/template-hello-world-ng-vision", + description: CreateProjectCommand.BlankVisionTemplateDescription, + }, ]; return templates; @@ -296,6 +336,11 @@ can skip this prompt next time using the --template option, or the --ng, --react value: constants.RESERVED_TEMPLATE_NAMES.react, description: CreateProjectCommand.HelloWorldTemplateDescription, }, + { + key: CreateProjectCommand.BlankVisionTemplateKey, + value: "@nativescript/template-blank-react-vision", + description: CreateProjectCommand.BlankVisionTemplateDescription, + }, ]; return templates; @@ -308,6 +353,11 @@ can skip this prompt next time using the --template option, or the --ng, --react value: constants.RESERVED_TEMPLATE_NAMES.svelte, description: CreateProjectCommand.HelloWorldTemplateDescription, }, + { + key: CreateProjectCommand.BlankVisionTemplateKey, + value: "@nativescript/template-blank-svelte-vision", + description: CreateProjectCommand.BlankVisionTemplateDescription, + }, ]; return templates; @@ -335,6 +385,11 @@ can skip this prompt next time using the --template option, or the --ng, --react value: "@nativescript/template-tab-navigation-vue", description: CreateProjectCommand.TabsTemplateDescription, }, + { + key: CreateProjectCommand.BlankVisionTemplateKey, + value: "@nativescript/template-blank-vue-vision", + description: CreateProjectCommand.BlankVisionTemplateDescription, + }, ]; return templates; @@ -346,6 +401,33 @@ can skip this prompt next time using the --template option, or the --ng, --react const greyDollarSign = color.grey("$"); this.$logger.clearScreen(); + let runDebugNotes: Array = []; + if ( + this.$options.vision || + this.$options["vision-ng"] || + this.$options["vision-react"] || + this.$options["vision-solid"] || + this.$options["vision-svelte"] || + this.$options["vision-vue"] + ) { + runDebugNotes = [ + `Run the project on Vision Pro with:`, + "", + ` ${greyDollarSign} ${color.green("ns run visionos --no-hmr")}`, + ]; + } else { + runDebugNotes = [ + `Run the project on multiple devices:`, + "", + ` ${greyDollarSign} ${color.green("ns run ios")}`, + ` ${greyDollarSign} ${color.green("ns run android")}`, + "", + "Debug the project with Chrome DevTools:", + "", + ` ${greyDollarSign} ${color.green("ns debug ios")}`, + ` ${greyDollarSign} ${color.green("ns debug android")}`, + ]; + } this.$logger.info( [ [ @@ -358,15 +440,7 @@ can skip this prompt next time using the --template option, or the --ng, --react `cd ${relativePath}` )} and then:`, "", - `Run the project on multiple devices:`, - "", - ` ${greyDollarSign} ${color.green("ns run ios")}`, - ` ${greyDollarSign} ${color.green("ns run android")}`, - "", - "Debug the project with Chrome DevTools:", - "", - ` ${greyDollarSign} ${color.green("ns debug ios")}`, - ` ${greyDollarSign} ${color.green("ns debug android")}`, + ...runDebugNotes, ``, `For more options consult the docs or run ${color.green("ns --help")}`, "", diff --git a/lib/commands/run.ts b/lib/commands/run.ts index 67daf25271..8b7e789c1b 100644 --- a/lib/commands/run.ts +++ b/lib/commands/run.ts @@ -83,7 +83,7 @@ injector.registerCommand("run|*all", RunCommandBase); export class RunIosCommand implements ICommand { @cache() - private get runCommand(): RunCommandBase { + protected get runCommand(): RunCommandBase { const runCommand = this.$injector.resolve(RunCommandBase); runCommand.platform = this.platform; return runCommand; @@ -95,12 +95,12 @@ export class RunIosCommand implements ICommand { } constructor( - private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants, - private $errors: IErrors, - private $injector: IInjector, - private $options: IOptions, - private $platformValidationService: IPlatformValidationService, - private $projectDataService: IProjectDataService + protected $devicePlatformsConstants: Mobile.IDevicePlatformsConstants, + protected $errors: IErrors, + protected $injector: IInjector, + protected $options: IOptions, + protected $platformValidationService: IPlatformValidationService, + protected $projectDataService: IProjectDataService ) {} public async execute(args: string[]): Promise { @@ -112,12 +112,12 @@ export class RunIosCommand implements ICommand { if ( !this.$platformValidationService.isPlatformSupportedForOS( - this.$devicePlatformsConstants.iOS, + this.platform, projectData ) ) { this.$errors.fail( - `Applications for platform ${this.$devicePlatformsConstants.iOS} can not be built on this OS` + `Applications for platform ${this.platform} can not be built on this OS` ); } @@ -127,7 +127,7 @@ export class RunIosCommand implements ICommand { this.$options.provision, this.$options.teamId, projectData, - this.$devicePlatformsConstants.iOS.toLowerCase() + this.platform.toLowerCase() )); return result; } @@ -196,3 +196,30 @@ export class RunAndroidCommand implements ICommand { } injector.registerCommand("run|android", RunAndroidCommand); + +export class RunVisionOSCommand extends RunIosCommand { + public get platform(): string { + return this.$devicePlatformsConstants.visionOS; + } + + constructor( + protected $devicePlatformsConstants: Mobile.IDevicePlatformsConstants, + protected $errors: IErrors, + protected $injector: IInjector, + protected $options: IOptions, + protected $platformValidationService: IPlatformValidationService, + protected $projectDataService: IProjectDataService + ) { + super( + $devicePlatformsConstants, + $errors, + $injector, + $options, + $platformValidationService, + $projectDataService + ); + } +} + +injector.registerCommand("run|vision", RunVisionOSCommand); +injector.registerCommand("run|visionos", RunVisionOSCommand); diff --git a/lib/common/definitions/key-commands.d.ts b/lib/common/definitions/key-commands.d.ts index f6476efe8d..2c4522b929 100644 --- a/lib/common/definitions/key-commands.d.ts +++ b/lib/common/definitions/key-commands.d.ts @@ -1,4 +1,4 @@ -export type IKeyCommandPlatform = "Android" | "iOS" | "all"; +export type IKeyCommandPlatform = "Android" | "iOS" | "visionOS" | "all"; export type IKeysLowerCase = | "a" | "b" @@ -55,6 +55,7 @@ export interface IKeyCommand { key: IValidKeyName; platform: IKeyCommandPlatform; description: string; + group: string; willBlockKeyCommandExecution?: boolean; execute(platform: string): Promise; canExecute?: (processType: SupportedProcessType) => boolean; diff --git a/lib/common/definitions/mobile.d.ts b/lib/common/definitions/mobile.d.ts index c0edb53bcb..74d0fb9a2b 100644 --- a/lib/common/definitions/mobile.d.ts +++ b/lib/common/definitions/mobile.d.ts @@ -1037,6 +1037,10 @@ declare global { * The state of the simulator. Can be 'Shutdown' or 'Booted' */ state?: string; + /** + * The platform of the device (iOS, visionOS) + */ + platform?: string; } interface IiOSSimResolver { @@ -1192,6 +1196,8 @@ declare global { platformNames: string[]; isAndroidPlatform(platform: string): boolean; isiOSPlatform(platform: string): boolean; + isvisionOSPlatform(platform: string): boolean; + isApplePlatform(platform: string): boolean; normalizePlatformName(platform: string): string; validatePlatformName(platform: string): string; buildDevicePath(...args: string[]): string; @@ -1234,6 +1240,11 @@ declare global { interface IDevicePlatformsConstants { iOS: string; Android: string; + visionOS: string; + + isiOS(value: string): boolean; + isAndroid(value: string): boolean; + isvisionOS(value: string): boolean; } interface IDeviceApplication { diff --git a/lib/common/mobile/device-platforms-constants.ts b/lib/common/mobile/device-platforms-constants.ts index 028c806167..a02eb88ffe 100644 --- a/lib/common/mobile/device-platforms-constants.ts +++ b/lib/common/mobile/device-platforms-constants.ts @@ -1,8 +1,22 @@ import { injector } from "../yok"; export class DevicePlatformsConstants - implements Mobile.IDevicePlatformsConstants { + implements Mobile.IDevicePlatformsConstants +{ public iOS = "iOS"; public Android = "Android"; + public visionOS = "visionOS"; + + public isiOS(value: string) { + return value.toLowerCase() === this.iOS.toLowerCase(); + } + + public isAndroid(value: string) { + return value.toLowerCase() === this.Android.toLowerCase(); + } + + public isvisionOS(value: string) { + return value.toLowerCase() === this.visionOS.toLowerCase(); + } } injector.register("devicePlatformsConstants", DevicePlatformsConstants); diff --git a/lib/common/mobile/ios/device/ios-device.ts b/lib/common/mobile/ios/device/ios-device.ts index cf81bcdb30..90dd12e7bc 100644 --- a/lib/common/mobile/ios/device/ios-device.ts +++ b/lib/common/mobile/ios/device/ios-device.ts @@ -48,7 +48,7 @@ export class IOSDevice extends IOSDeviceBase { this.deviceInfo = { identifier: deviceActionInfo.deviceId, vendor: "Apple", - platform: this.$devicePlatformsConstants.iOS, + platform: this.getPlatform(productType), status: deviceStatus, errorHelp: deviceStatus === commonConstants.UNREACHABLE_STATUS @@ -156,6 +156,9 @@ export class IOSDevice extends IOSDeviceBase { isArm64Architecture = majorVersion >= 4; } else if (_.startsWith(productType, "ipod")) { isArm64Architecture = majorVersion >= 7; + } else if (_.startsWith(productType, "realitydevice")) { + // visionos + isArm64Architecture = true; } activeArchitecture = isArm64Architecture ? "arm64" : "armv7"; @@ -163,6 +166,15 @@ export class IOSDevice extends IOSDeviceBase { return activeArchitecture; } + + private getPlatform(productType: string): string { + productType = productType.toLowerCase().trim(); + if (_.startsWith(productType, "realitydevice")) { + // visionos + return this.$devicePlatformsConstants.visionOS; + } + return this.$devicePlatformsConstants.iOS; + } } injector.register("iOSDevice", IOSDevice); diff --git a/lib/common/mobile/ios/ios-device-product-name-mapper.ts b/lib/common/mobile/ios/ios-device-product-name-mapper.ts index 2951a60009..cf63decd54 100644 --- a/lib/common/mobile/ios/ios-device-product-name-mapper.ts +++ b/lib/common/mobile/ios/ios-device-product-name-mapper.ts @@ -55,6 +55,7 @@ class IosDeviceProductNameMapper implements Mobile.IiOSDeviceProductNameMapper { "iPod4,1": "iPod touch (4th gen)", "iPod5,1": "iPod touch (5th gen)", "iPod7,1": "iPod touch (6th gen)", + "RealityDevice14,1": "Vision Pro (1st gen)", }; public resolveProductName(deviceType: string): string { diff --git a/lib/common/mobile/ios/simulator/ios-emulator-services.ts b/lib/common/mobile/ios/simulator/ios-emulator-services.ts index f8185eada5..c7510ab1ed 100644 --- a/lib/common/mobile/ios/simulator/ios-emulator-services.ts +++ b/lib/common/mobile/ios/simulator/ios-emulator-services.ts @@ -23,6 +23,18 @@ class IosEmulatorServices implements Mobile.IiOSSimulatorService { let error = null; try { + if ( + options.platform === this.$devicePlatformsConstants.visionOS && + !options.emulatorIdOrName + ) { + // find first available visionOS simulator (for now). + const { devices } = await this.tryGetiOSSimDevices(); + options.emulatorIdOrName = devices.find( + (device) => + device.platform === this.$devicePlatformsConstants.visionOS + )?.id; + } + await this.$iOSSimResolver.iOSSim.startSimulator({ device: options.imageIdentifier || options.emulatorIdOrName, state: "None", @@ -132,7 +144,7 @@ class IosEmulatorServices implements Mobile.IiOSSimulatorService { isTablet: this.$mobileHelper.isiOSTablet(simDevice.name), type: DeviceTypes.Emulator, connectionTypes: [DeviceConnectionType.Local], - platform: this.$devicePlatformsConstants.iOS, + platform: simDevice.platform ?? this.$devicePlatformsConstants.iOS, }; } } diff --git a/lib/common/mobile/ios/simulator/ios-simulator-device.ts b/lib/common/mobile/ios/simulator/ios-simulator-device.ts index 6654428a6b..fa52f04088 100644 --- a/lib/common/mobile/ios/simulator/ios-simulator-device.ts +++ b/lib/common/mobile/ios/simulator/ios-simulator-device.ts @@ -46,7 +46,7 @@ export class IOSSimulator extends IOSDeviceBase implements Mobile.IiOSDevice { model: _.last(this.simulator.fullId.split(".")), version: this.simulator.runtimeVersion, vendor: "Apple", - platform: this.$devicePlatformsConstants.iOS, + platform: this.simulator.platform ?? this.$devicePlatformsConstants.iOS, status: constants.CONNECTED_STATUS, errorHelp: null, isTablet: this.simulator.fullId.toLowerCase().indexOf("ipad") !== -1, @@ -99,7 +99,7 @@ export class IOSSimulator extends IOSDeviceBase implements Mobile.IiOSDevice { .catch((e) => this.$logger.error(e)); }, 5e3); - // the internal retry-mechanism of getDebuggerPort will ensure the above + // the internal retry-mechanism of getDebuggerPort will ensure the above // interval has a chance to execute multiple times const port = await super.getDebuggerPort(appId).finally(() => { clearInterval(postNotificationRetryInterval); diff --git a/lib/common/mobile/log-filter.ts b/lib/common/mobile/log-filter.ts index 6ad2b43dce..5cd3850d9d 100644 --- a/lib/common/mobile/log-filter.ts +++ b/lib/common/mobile/log-filter.ts @@ -42,7 +42,9 @@ export class LogFilter implements Mobile.ILogFilter { if (platform) { if ( platform.toLowerCase() === - this.$devicePlatformsConstants.iOS.toLowerCase() + this.$devicePlatformsConstants.iOS.toLowerCase() || + platform.toLowerCase() === + this.$devicePlatformsConstants.visionOS.toLowerCase() ) { return this.$injector.resolve("iOSLogFilter"); } else if ( diff --git a/lib/common/mobile/mobile-core/devices-service.ts b/lib/common/mobile/mobile-core/devices-service.ts index 9d4adcc8bd..8f72d11747 100644 --- a/lib/common/mobile/mobile-core/devices-service.ts +++ b/lib/common/mobile/mobile-core/devices-service.ts @@ -54,7 +54,8 @@ export class DevicesService private $androidEmulatorServices: Mobile.IEmulatorPlatformService, private $androidEmulatorDiscovery: Mobile.IDeviceDiscovery, private $emulatorHelper: Mobile.IEmulatorHelper, - private $prompter: IPrompter + private $prompter: IPrompter, + private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants ) { super(); this.attachToKnownDeviceDiscoveryEvents(); @@ -296,7 +297,11 @@ export class DevicesService } public getDeviceInstances(): Mobile.IDevice[] { - return _.values(this._devices); + return _.values(this._devices).map((device: Mobile.IDevice) => { + const simPlatform = (device as any).simulator?.platform; + device.deviceInfo.platform = simPlatform ?? device.deviceInfo.platform; + return device; + }); } @exported("devicesService") @@ -516,7 +521,7 @@ export class DevicesService this.getDeviceInstances(), (device: Mobile.IDevice) => { if ( - this.$mobileHelper.isiOSPlatform(device.deviceInfo.platform) && + this.$mobileHelper.isApplePlatform(device.deviceInfo.platform) && device.isEmulator ) { return ( @@ -783,7 +788,7 @@ export class DevicesService if (!deviceInitOpts.deviceId && _.isEmpty(deviceInstances)) { if ( !this.$hostInfo.isDarwin && - this.$mobileHelper.isiOSPlatform(deviceInitOpts.platform) + this.$mobileHelper.isApplePlatform(deviceInitOpts.platform) ) { this.$errors.fail(constants.ERROR_NO_DEVICES_CANT_USE_IOS_SIMULATOR); } @@ -826,6 +831,20 @@ export class DevicesService } } + // make sure if the target platform is visionOS we don't try to run it on an already running iOS simulator... + if ( + data.platform === this.$devicePlatformsConstants.visionOS && + deviceInstances.length + ) { + const runningDeviceInstance = deviceInstances.find( + (device) => + device.deviceInfo.platform === this.$devicePlatformsConstants.visionOS + ); + if (!runningDeviceInstance) { + return this.startEmulatorCore(data); + } + } + // if only emulator flag is passed and no other emulators are running, start default emulator if (data.emulator && deviceInstances.length) { const runningDeviceInstance = _.some( @@ -1079,7 +1098,7 @@ export class DevicesService platform?: string ): Mobile.IEmulatorPlatformService { platform = platform || this._platform; - if (this.$mobileHelper.isiOSPlatform(platform)) { + if (this.$mobileHelper.isApplePlatform(platform)) { return this.$injector.resolve("iOSEmulatorServices"); } else if (this.$mobileHelper.isAndroidPlatform(platform)) { return this.$injector.resolve("androidEmulatorServices"); diff --git a/lib/common/mobile/mobile-core/ios-device-discovery.ts b/lib/common/mobile/mobile-core/ios-device-discovery.ts index 7cfe3ec91e..d7b5a210e9 100644 --- a/lib/common/mobile/mobile-core/ios-device-discovery.ts +++ b/lib/common/mobile/mobile-core/ios-device-discovery.ts @@ -8,7 +8,8 @@ export class IOSDeviceDiscovery extends DeviceDiscovery { private $injector: IInjector, private $logger: ILogger, private $mobileHelper: Mobile.IMobileHelper, - private $iosDeviceOperations: IIOSDeviceOperations + private $iosDeviceOperations: IIOSDeviceOperations, + private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants ) { super(); } @@ -21,11 +22,17 @@ export class IOSDeviceDiscovery extends DeviceDiscovery { if ( options && options.platform && - (!this.$mobileHelper.isiOSPlatform(options.platform) || options.emulator) + (!this.$mobileHelper.isApplePlatform(options.platform) || + options.emulator) ) { return; } + if (this.$mobileHelper.isvisionOSPlatform(options.platform)) { + // look for ios devices - same logic. + options.platform = this.$devicePlatformsConstants.iOS; + } + await this.$iosDeviceOperations.startLookingForDevices( (deviceInfo: IOSDeviceLib.IDeviceActionInfo) => { const device = this.createDevice(deviceInfo); diff --git a/lib/common/mobile/mobile-helper.ts b/lib/common/mobile/mobile-helper.ts index 2ac4f189e1..666f2ffae9 100644 --- a/lib/common/mobile/mobile-helper.ts +++ b/lib/common/mobile/mobile-helper.ts @@ -20,6 +20,7 @@ export class MobileHelper implements Mobile.IMobileHelper { return [ this.$devicePlatformsConstants.iOS, this.$devicePlatformsConstants.Android, + this.$devicePlatformsConstants.visionOS, ]; } @@ -39,11 +40,25 @@ export class MobileHelper implements Mobile.IMobileHelper { ); } + public isvisionOSPlatform(platform: string): boolean { + return !!( + platform && + this.$devicePlatformsConstants.visionOS.toLowerCase() === + platform.toLowerCase() + ); + } + + public isApplePlatform(platform: string): boolean { + return this.isiOSPlatform(platform) || this.isvisionOSPlatform(platform); + } + public normalizePlatformName(platform: string): string { if (this.isAndroidPlatform(platform)) { return "Android"; } else if (this.isiOSPlatform(platform)) { return "iOS"; + } else if (this.isvisionOSPlatform(platform)) { + return "visionOS"; } return undefined; diff --git a/lib/common/test/unit-tests/mobile/devices-service.ts b/lib/common/test/unit-tests/mobile/devices-service.ts index 2e4692db70..7602454834 100644 --- a/lib/common/test/unit-tests/mobile/devices-service.ts +++ b/lib/common/test/unit-tests/mobile/devices-service.ts @@ -208,12 +208,20 @@ function createTestInjector(): IInjector { testInjector.register("prompter", {}); testInjector.register("mobileHelper", { - platformNames: ["ios", "android"], + platformNames: ["ios", "android", "visionos"], validatePlatformName: (platform: string) => platform.toLowerCase(), isiOSPlatform: (platform: string) => !!(platform && platform.toLowerCase() === "ios"), isAndroidPlatform: (platform: string) => !!(platform && platform.toLowerCase() === "android"), + isvisionOSPlatform: (platform: string) => + !!(platform && platform.toLowerCase() === "visionos"), + isApplePlatform: (platform: string) => + !!( + platform && + (platform.toLowerCase() === "ios" || + platform.toLowerCase() === "visionos") + ), }); testInjector.register("deviceLogProvider", { @@ -452,9 +460,10 @@ describe("devicesService", () => { }; it(`emits ${EmulatorDiscoveryNames.EMULATOR_IMAGE_FOUND} event when new Android Emulator image is found`, (done: mocha.Done) => { - const androidEmulatorDiscovery = testInjector.resolve< - AndroidEmulatorDiscoveryStub - >("androidEmulatorDiscovery"); + const androidEmulatorDiscovery = + testInjector.resolve( + "androidEmulatorDiscovery" + ); devicesService.on( EmulatorDiscoveryNames.EMULATOR_IMAGE_FOUND, (emulatorImage: Mobile.IDeviceInfo) => { @@ -485,9 +494,10 @@ describe("devicesService", () => { }); it(`emits ${EmulatorDiscoveryNames.EMULATOR_IMAGE_LOST} event when new Android Emulator image is deleted`, (done: mocha.Done) => { - const androidEmulatorDiscovery = testInjector.resolve< - AndroidEmulatorDiscoveryStub - >("androidEmulatorDiscovery"); + const androidEmulatorDiscovery = + testInjector.resolve( + "androidEmulatorDiscovery" + ); devicesService.on( EmulatorDiscoveryNames.EMULATOR_IMAGE_LOST, (emulatorImage: Mobile.IDeviceInfo) => { @@ -1098,21 +1108,19 @@ describe("devicesService", () => { }); it("does not fail when iOSDeviceDiscovery startLookingForDevices fails", async () => { - (iOSDeviceDiscovery).startLookingForDevices = (): Promise< - void - > => { - throw new Error("my error"); - }; + (iOSDeviceDiscovery).startLookingForDevices = + (): Promise => { + throw new Error("my error"); + }; await assertAllMethodsResults("1"); assert.isTrue(logger.traceOutput.indexOf("my error") !== -1); }); it("does not fail when androidDeviceDiscovery startLookingForDevices fails", async () => { - (androidDeviceDiscovery).startLookingForDevices = (): Promise< - void - > => { - throw new Error("my error"); - }; + (androidDeviceDiscovery).startLookingForDevices = + (): Promise => { + throw new Error("my error"); + }; iOSDeviceDiscovery.emit( DeviceDiscoveryEventNames.DEVICE_FOUND, iOSDevice @@ -1129,11 +1137,10 @@ describe("devicesService", () => { it("does not fail when iosSimulatorDiscovery startLookingForDevices fails", async () => { const hostInfo = testInjector.resolve("hostInfo"); hostInfo.isDarwin = true; - (iOSSimulatorDiscovery).startLookingForDevices = (): Promise< - void - > => { - throw new Error("my error"); - }; + (iOSSimulatorDiscovery).startLookingForDevices = + (): Promise => { + throw new Error("my error"); + }; iOSDeviceDiscovery.emit( DeviceDiscoveryEventNames.DEVICE_FOUND, iOSDevice @@ -1350,21 +1357,19 @@ describe("devicesService", () => { }); it("does not fail when iOSDeviceDiscovery startLookingForDevices fails", async () => { - (iOSDeviceDiscovery).startLookingForDevices = (): Promise< - void - > => { - throw new Error("my error"); - }; + (iOSDeviceDiscovery).startLookingForDevices = + (): Promise => { + throw new Error("my error"); + }; await assertAllMethodsResults("1"); assert.isTrue(logger.traceOutput.indexOf("my error") !== -1); }); it("does not fail when androidDeviceDiscovery startLookingForDevices fails", async () => { - (androidDeviceDiscovery).startLookingForDevices = (): Promise< - void - > => { - throw new Error("my error"); - }; + (androidDeviceDiscovery).startLookingForDevices = + (): Promise => { + throw new Error("my error"); + }; iOSDeviceDiscovery.emit( DeviceDiscoveryEventNames.DEVICE_FOUND, iOSDevice @@ -2425,11 +2430,10 @@ describe("devicesService", () => { it("should check for ios devices.", async () => { let hasCheckedForIosDevices = false; - $iOSDeviceDiscovery.startLookingForDevices = async (): Promise< - void - > => { - hasCheckedForIosDevices = true; - }; + $iOSDeviceDiscovery.startLookingForDevices = + async (): Promise => { + hasCheckedForIosDevices = true; + }; devicesService.startDeviceDetectionInterval(); @@ -2465,11 +2469,10 @@ describe("devicesService", () => { it("should start interval that will check for android devices.", async () => { let hasCheckedForAndroidDevices = false; - $androidDeviceDiscovery.startLookingForDevices = async (): Promise< - void - > => { - hasCheckedForAndroidDevices = true; - }; + $androidDeviceDiscovery.startLookingForDevices = + async (): Promise => { + hasCheckedForAndroidDevices = true; + }; mockSetInterval(); devicesService.startDeviceDetectionInterval(); @@ -2500,11 +2503,10 @@ describe("devicesService", () => { beforeEach(() => { $iOSSimulatorDiscovery = testInjector.resolve("iOSSimulatorDiscovery"); - ($iOSSimulatorDiscovery).checkForDevices = async (): Promise< - void - > => { - /** */ - }; + ($iOSSimulatorDiscovery).checkForDevices = + async (): Promise => { + /** */ + }; $hostInfo = testInjector.resolve("hostInfo"); $hostInfo.isDarwin = true; @@ -2538,11 +2540,10 @@ describe("devicesService", () => { it("should check for devices in interval", async () => { let hasCheckedForDevices = false; - customDeviceDiscovery.startLookingForDevices = async (): Promise< - void - > => { - hasCheckedForDevices = true; - }; + customDeviceDiscovery.startLookingForDevices = + async (): Promise => { + hasCheckedForDevices = true; + }; mockSetInterval(); devicesService.startDeviceDetectionInterval(); @@ -2581,17 +2582,15 @@ describe("devicesService", () => { "androidDeviceDiscovery" ); - androidDevice.applicationManager.checkForApplicationUpdates = async (): Promise< - void - > => { - hasCheckedForAndroidAppUpdates = true; - }; + androidDevice.applicationManager.checkForApplicationUpdates = + async (): Promise => { + hasCheckedForAndroidAppUpdates = true; + }; - iOSDevice.applicationManager.checkForApplicationUpdates = async (): Promise< - void - > => { - hasCheckedForIosAppUpdates = true; - }; + iOSDevice.applicationManager.checkForApplicationUpdates = + async (): Promise => { + hasCheckedForIosAppUpdates = true; + }; $androidDeviceDiscovery.emit( DeviceDiscoveryEventNames.DEVICE_FOUND, @@ -2613,7 +2612,8 @@ describe("devicesService", () => { }); it("should check for application updates if the check on one device throws an exception.", async () => { - iOSDevice.applicationManager.checkForApplicationUpdates = throwErrorFunction; + iOSDevice.applicationManager.checkForApplicationUpdates = + throwErrorFunction; devicesService.startDeviceDetectionInterval(); @@ -2633,8 +2633,10 @@ describe("devicesService", () => { }); it("should not throw if all checks for application updates on all devices throw exceptions.", () => { - iOSDevice.applicationManager.checkForApplicationUpdates = throwErrorFunction; - androidDevice.applicationManager.checkForApplicationUpdates = throwErrorFunction; + iOSDevice.applicationManager.checkForApplicationUpdates = + throwErrorFunction; + androidDevice.applicationManager.checkForApplicationUpdates = + throwErrorFunction; const callback = () => { devicesService.startDeviceDetectionInterval.call(devicesService); @@ -2661,11 +2663,10 @@ describe("devicesService", () => { it("should start looking for android devices.", async () => { let hasStartedLookingForAndroidDevices = false; - $androidDeviceDiscovery.startLookingForDevices = async (): Promise< - void - > => { - hasStartedLookingForAndroidDevices = true; - }; + $androidDeviceDiscovery.startLookingForDevices = + async (): Promise => { + hasStartedLookingForAndroidDevices = true; + }; await devicesService.detectCurrentlyAttachedDevices(); @@ -2767,9 +2768,8 @@ describe("devicesService", () => { let actualDeviceIdentifier: string; let actualAppIdentifier: string; let actualFramework: string; - const $androidProcessService: Mobile.IAndroidProcessService = testInjector.resolve( - "androidProcessService" - ); + const $androidProcessService: Mobile.IAndroidProcessService = + testInjector.resolve("androidProcessService"); $androidProcessService.mapAbstractToTcpPort = async ( deviceIdentifier: string, appIdentifier: string, @@ -2793,12 +2793,10 @@ describe("devicesService", () => { }); it("should get debuggable apps correctly for multiple devices.", async () => { - const $iOSDeviceDiscovery: Mobile.IDeviceDiscovery = testInjector.resolve( - "iOSDeviceDiscovery" - ); - const $androidDeviceDiscovery: Mobile.IAndroidDeviceDiscovery = testInjector.resolve( - "androidDeviceDiscovery" - ); + const $iOSDeviceDiscovery: Mobile.IDeviceDiscovery = + testInjector.resolve("iOSDeviceDiscovery"); + const $androidDeviceDiscovery: Mobile.IAndroidDeviceDiscovery = + testInjector.resolve("androidDeviceDiscovery"); $androidDeviceDiscovery.emit( DeviceDiscoveryEventNames.DEVICE_FOUND, @@ -2849,9 +2847,8 @@ describe("devicesService", () => { iOSDevice.deviceInfo.identifier, ]); const debuggableAppsResult = await Promise.all(futures); - const debuggableApps = _.flatten( - debuggableAppsResult - ); + const debuggableApps = + _.flatten(debuggableAppsResult); assert.deepStrictEqual( debuggableApps, diff --git a/lib/constants.ts b/lib/constants.ts index bb1cf94aa5..d64a27dda9 100644 --- a/lib/constants.ts +++ b/lib/constants.ts @@ -22,6 +22,7 @@ export const TNS_ANDROID_RUNTIME_NAME = "tns-android"; export const TNS_IOS_RUNTIME_NAME = "tns-ios"; export const SCOPED_ANDROID_RUNTIME_NAME = "@nativescript/android"; export const SCOPED_IOS_RUNTIME_NAME = "@nativescript/ios"; +export const SCOPED_VISIONOS_RUNTIME_NAME = "@nativescript/visionos"; export const PACKAGE_JSON_FILE_NAME = "package.json"; export const PACKAGE_LOCK_JSON_FILE_NAME = "package-lock.json"; export const ANDROID_DEVICE_APP_ROOT_TEMPLATE = `/data/data/%s/files`; @@ -67,7 +68,7 @@ export const APK_EXTENSION_NAME = ".apk"; export const AAB_EXTENSION_NAME = ".aab"; export const APKS_EXTENSION_NAME = ".apks"; export const HASHES_FILE_NAME = ".nshashes"; -export const TNS_NATIVE_SOURCE_GROUP_NAME = "TNSNativeSource"; +export const TNS_NATIVE_SOURCE_GROUP_NAME = "NSNativeSources"; export const NATIVE_SOURCE_FOLDER = "src"; export const APPLICATION_RESPONSE_TIMEOUT_SECONDS = 60; export const NATIVE_EXTENSION_FOLDER = "extensions"; @@ -144,6 +145,13 @@ export const RESERVED_TEMPLATE_NAMES: IStringDictionary = { react: "@nativescript/template-blank-react", reactjs: "@nativescript/template-blank-react", svelte: "@nativescript/template-blank-svelte", + // vision templates + vision: "@nativescript/template-hello-world-ts-vision", + "vision-vue": "@nativescript/template-blank-vue-vision", + "vision-ng": "@nativescript/template-hello-world-ng-vision", + "vision-react": "@nativescript/template-blank-react-vision", + "vision-solid": "@nativescript/template-blank-solid-vision", + "vision-svelte": "@nativescript/template-blank-svelte-vision", }; export const ANALYTICS_LOCAL_TEMPLATE_PREFIX = "localTemplate_"; @@ -160,7 +168,8 @@ export class ITMSConstants { } class ItunesConnectApplicationTypesClass - implements IiTunesConnectApplicationType { + implements IiTunesConnectApplicationType +{ public iOS = "iOS App"; public Mac = "Mac OS X App"; } @@ -168,7 +177,8 @@ class ItunesConnectApplicationTypesClass export const iOSAppResourcesFolderName = "iOS"; export const androidAppResourcesFolderName = "Android"; -export const ItunesConnectApplicationTypes = new ItunesConnectApplicationTypesClass(); +export const ItunesConnectApplicationTypes = + new ItunesConnectApplicationTypesClass(); export const VUE_NAME = "vue"; export const ANGULAR_NAME = "angular"; export const JAVASCRIPT_NAME = "javascript"; @@ -329,9 +339,13 @@ export const PLUGINS_BUILD_DATA_FILENAME = ".ns-plugins-build-data.json"; export const enum PlatformTypes { ios = "ios", android = "android", + visionos = "visionos", } -export type SupportedPlatform = PlatformTypes.ios | PlatformTypes.android; +export type SupportedPlatform = + | PlatformTypes.ios + | PlatformTypes.android + | PlatformTypes.visionos; export const PODFILE_NAME = "Podfile"; diff --git a/lib/controllers/prepare-controller.ts b/lib/controllers/prepare-controller.ts index 8c22fe3e61..538fc75527 100644 --- a/lib/controllers/prepare-controller.ts +++ b/lib/controllers/prepare-controller.ts @@ -466,7 +466,9 @@ export class PrepareController extends EventEmitter { packageData.android.discardUncaughtJsExceptions; } let packagePath: string; - if (platformData.platformNameLowerCase === "ios") { + if ( + this.$mobileHelper.isApplePlatform(platformData.platformNameLowerCase) + ) { packagePath = path.join( platformData.projectRoot, projectData.projectName, diff --git a/lib/data/build-data.ts b/lib/data/build-data.ts index 87af14d166..fc50640dbd 100644 --- a/lib/data/build-data.ts +++ b/lib/data/build-data.ts @@ -3,6 +3,7 @@ import { IiOSBuildData, IBuildData } from "../definitions/build"; export class BuildData extends PrepareData implements IBuildData { public device?: string; + public _device?: Mobile.IDevice; public emulator?: boolean; public clean: boolean; public buildForDevice?: boolean; @@ -14,6 +15,7 @@ export class BuildData extends PrepareData implements IBuildData { super(projectDir, platform, data); this.device = data.device; + this._device = data?._device; this.emulator = data.emulator; this.clean = data.clean; this.buildForDevice = data.buildForDevice || data.forDevice; diff --git a/lib/declarations.d.ts b/lib/declarations.d.ts index 9f627a9202..b3c4018280 100644 --- a/lib/declarations.d.ts +++ b/lib/declarations.d.ts @@ -677,6 +677,12 @@ interface IOptions vue: boolean; vuejs: boolean; js: boolean; + vision: boolean; + "vision-ng": boolean; + "vision-react": boolean; + "vision-solid": boolean; + "vision-svelte": boolean; + "vision-vue": boolean; javascript: boolean; androidTypings: boolean; production: boolean; //npm flag @@ -692,6 +698,8 @@ interface IOptions markingMode: boolean; git: boolean; dryRun: boolean; + + platformOverride: string; } interface IEnvOptions { diff --git a/lib/definitions/build.d.ts b/lib/definitions/build.d.ts index 0ef831745c..e64a318c6d 100644 --- a/lib/definitions/build.d.ts +++ b/lib/definitions/build.d.ts @@ -9,6 +9,7 @@ import { interface IBuildData extends IPrepareData { device?: string; + _device?: Mobile.IDevice; emulator?: boolean; clean: boolean; buildForDevice?: boolean; diff --git a/lib/definitions/project.d.ts b/lib/definitions/project.d.ts index a25346adfa..40fd0456b4 100644 --- a/lib/definitions/project.d.ts +++ b/lib/definitions/project.d.ts @@ -105,6 +105,8 @@ interface INsConfigIOS extends INsConfigPlaform { discardUncaughtJsExceptions?: boolean; } +interface INSConfigVisionOS extends INsConfigIOS {} + interface INsConfigAndroid extends INsConfigPlaform { v8Flags?: string; @@ -156,6 +158,7 @@ interface INsConfig { webpackConfigPath?: string; ios?: INsConfigIOS; android?: INsConfigAndroid; + visionos?: INSConfigVisionOS; ignoredNativeDependencies?: string[]; hooks?: INsConfigHooks[]; } @@ -558,6 +561,8 @@ interface IBuildConfig clean?: boolean; architectures?: string[]; buildOutputStdio?: string; + platform?: string; + _device?: Mobile.IDevice; } /** diff --git a/lib/definitions/start-service.d.ts b/lib/definitions/start-service.d.ts index 98815046a6..441967b697 100644 --- a/lib/definitions/start-service.d.ts +++ b/lib/definitions/start-service.d.ts @@ -7,7 +7,9 @@ export interface IStartService { toggleVerbose(): void; runIOS(): Promise; + runVisionOS(): Promise; runAndroid(): Promise; stopIOS(): Promise; + stopVisionOS(): Promise; stopAndroid(): Promise; } diff --git a/lib/device-path-provider.ts b/lib/device-path-provider.ts index 692c6775d1..6995c41b31 100644 --- a/lib/device-path-provider.ts +++ b/lib/device-path-provider.ts @@ -17,7 +17,7 @@ export class DevicePathProvider implements IDevicePathProvider { options: IDeviceProjectRootOptions ): Promise { let projectRoot = ""; - if (this.$mobileHelper.isiOSPlatform(device.deviceInfo.platform)) { + if (this.$mobileHelper.isApplePlatform(device.deviceInfo.platform)) { projectRoot = device.isEmulator ? await this.$iOSSimResolver.iOSSim.getApplicationPath( device.deviceInfo.identifier, @@ -53,7 +53,7 @@ export class DevicePathProvider implements IDevicePathProvider { } public getDeviceSyncZipPath(device: Mobile.IDevice): string { - return this.$mobileHelper.isiOSPlatform(device.deviceInfo.platform) && + return this.$mobileHelper.isApplePlatform(device.deviceInfo.platform) && !device.isEmulator ? LiveSyncPaths.IOS_DEVICE_SYNC_ZIP_PATH : undefined; diff --git a/lib/helpers/key-command-helper.ts b/lib/helpers/key-command-helper.ts index 28f01ff5dd..ecfaabd367 100644 --- a/lib/helpers/key-command-helper.ts +++ b/lib/helpers/key-command-helper.ts @@ -88,6 +88,7 @@ export default class KeyCommandHelper implements IKeyCommandHelper { public printCommands(platform: IKeyCommandPlatform) { const commands = injector.getRegisteredKeyCommandsNames(); + const groupings: { [key: string]: boolean } = {}; const commandHelp = commands.reduce((arr, key) => { const command = injector.resolveKeyCommand(key as IValidKeyName); @@ -100,6 +101,10 @@ export default class KeyCommandHelper implements IKeyCommandHelper { ) { return arr; } else { + if (!groupings[command.group]) { + groupings[command.group] = true; + arr.push(` \n${color.underline(color.bold(command.group))}\n`); + } arr.push(` ${color.bold(command.key)} — ${command.description}`); return arr; } diff --git a/lib/helpers/livesync-command-helper.ts b/lib/helpers/livesync-command-helper.ts index e1077d21c6..ea9cc44ea4 100644 --- a/lib/helpers/livesync-command-helper.ts +++ b/lib/helpers/livesync-command-helper.ts @@ -104,6 +104,7 @@ export class LiveSyncCommandHelper implements ILiveSyncCommandHelper { nativePrepare: { forceRebuildNativeApp: additionalOptions.forceRebuildNativeApp, }, + _device: d, } ); this.$androidBundleValidatorHelper.validateDeviceApiLevel(d, buildData); @@ -256,15 +257,15 @@ export class LiveSyncCommandHelper implements ILiveSyncCommandHelper { } } - const workingWithiOSDevices = - !platform || this.$mobileHelper.isiOSPlatform(platform); + const workingWithAppleDevices = + !platform || this.$mobileHelper.isApplePlatform(platform); const shouldKeepProcessAlive = this.$options.watch || !this.$options.justlaunch; if (shouldKeepProcessAlive) { this.$analyticsService.setShouldDispose(false); this.$cleanupService.setShouldDispose(false); - if (workingWithiOSDevices) { + if (workingWithAppleDevices) { this.$iosDeviceOperations.setShouldDispose(false); this.$iOSSimulatorLogProvider.setShouldDispose(false); } diff --git a/lib/key-commands/bootstrap.ts b/lib/key-commands/bootstrap.ts index 955178e5a5..a10d2bd7b8 100644 --- a/lib/key-commands/bootstrap.ts +++ b/lib/key-commands/bootstrap.ts @@ -4,9 +4,11 @@ import { injector } from "../common/yok"; const path = "./key-commands/index"; injector.requireKeyCommand("a", path); -injector.requireKeyCommand("i", path); injector.requireKeyCommand("A", path); +injector.requireKeyCommand("i", path); injector.requireKeyCommand("I", path); +injector.requireKeyCommand("v", path); +injector.requireKeyCommand("V", path); injector.requireKeyCommand("r", path); injector.requireKeyCommand("R", path); injector.requireKeyCommand("w", path); @@ -17,3 +19,5 @@ injector.requireKeyCommand(SpecialKeys.QuestionMark, path); injector.requireKeyCommand(SpecialKeys.CtrlC, path); injector.requireCommand("open|ios", path); injector.requireCommand("open|android", path); +injector.requireCommand("open|visionos", path); +injector.requireCommand("open|vision", path); diff --git a/lib/key-commands/index.ts b/lib/key-commands/index.ts index 182262808b..440fec13af 100644 --- a/lib/key-commands/index.ts +++ b/lib/key-commands/index.ts @@ -22,7 +22,8 @@ import { IOptions } from "../declarations"; export class A implements IKeyCommand { key: IValidKeyName = "a"; platform: IKeyCommandPlatform = "Android"; - description: string = "Run android app"; + description: string = "Run Android app"; + group = "Android"; constructor(private $startService: IStartService) {} @@ -38,7 +39,8 @@ export class A implements IKeyCommand { export class ShiftA implements IKeyCommand { key: IValidKeyName = "A"; platform: IKeyCommandPlatform = "Android"; - description: string = "Open android project in Android Studio"; + description: string = "Open project in Android Studio"; + group = "Android"; willBlockKeyCommandExecution: boolean = true; protected isInteractive: boolean = true; constructor( @@ -134,6 +136,7 @@ export class I implements IKeyCommand { key: IValidKeyName = "i"; platform: IKeyCommandPlatform = "iOS"; description: string = "Run iOS app"; + group = "iOS"; constructor(private $startService: IStartService) {} @@ -149,7 +152,8 @@ export class I implements IKeyCommand { export class ShiftI implements IKeyCommand { key: IValidKeyName = "I"; platform: IKeyCommandPlatform = "iOS"; - description: string = "Open iOS project in Xcode"; + description: string = "Open project in Xcode"; + group = "iOS"; willBlockKeyCommandExecution: boolean = true; protected isInteractive: boolean = true; @@ -228,10 +232,118 @@ export class OpenIOSCommand extends ShiftI { } } +export class V implements IKeyCommand { + key: IValidKeyName = "v"; + platform: IKeyCommandPlatform = "visionOS"; + description: string = "Run visionOS app"; + group = "visionOS"; + + constructor(private $startService: IStartService) {} + + async execute(): Promise { + this.$startService.runVisionOS(); + } + + canExecute(processType: SupportedProcessType) { + return processType === "start"; + } +} + +export class ShiftV implements IKeyCommand { + key: IValidKeyName = "V"; + platform: IKeyCommandPlatform = "visionOS"; + description: string = "Open project in Xcode"; + group = "visionOS"; + willBlockKeyCommandExecution: boolean = true; + protected isInteractive: boolean = true; + + constructor( + private $iOSProjectService: IOSProjectService, + private $logger: ILogger, + private $childProcess: IChildProcess, + private $projectData: IProjectData, + private $xcodeSelectService: IXcodeSelectService, + private $xcodebuildArgsService: IXcodebuildArgsService, + protected $options: IOptions + ) {} + + async execute(): Promise { + this.$options.platformOverride = "visionOS"; + const os = currentPlatform(); + if (os === "darwin") { + this.$projectData.initializeProjectData(); + const visionOSDir = path.resolve( + this.$projectData.platformsDir, + "visionos" + ); + + if (!fs.existsSync(visionOSDir)) { + const prepareCommand = injector.resolveCommand( + "prepare" + ) as PrepareCommand; + + await prepareCommand.execute(["visionos"]); + if (this.isInteractive) { + process.stdin.resume(); + } + } + const platformData = this.$iOSProjectService.getPlatformData( + this.$projectData + ); + const xcprojectFile = this.$xcodebuildArgsService.getXcodeProjectArgs( + platformData, + this.$projectData + )[1]; + + if (fs.existsSync(xcprojectFile)) { + this.$xcodeSelectService + .getDeveloperDirectoryPath() + .then(() => this.$childProcess.exec(`open ${xcprojectFile}`, {})) + .catch((e) => { + this.$logger.error(e.message); + }); + } else { + this.$logger.error(`Unable to open project file: ${xcprojectFile}`); + } + } else { + this.$logger.error("Opening a project in XCode requires macOS."); + } + this.$options.platformOverride = null; + } +} + +export class OpenVisionOSCommand extends ShiftV { + constructor( + $iOSProjectService: IOSProjectService, + $logger: ILogger, + $childProcess: IChildProcess, + $projectData: IProjectData, + $xcodeSelectService: IXcodeSelectService, + $xcodebuildArgsService: IXcodebuildArgsService, + protected $options: IOptions + ) { + super( + $iOSProjectService, + $logger, + $childProcess, + $projectData, + $xcodeSelectService, + $xcodebuildArgsService, + $options + ); + this.isInteractive = false; + } + async execute(): Promise { + this.$options.watch = false; + super.execute(); + } +} + export class R implements IKeyCommand { key: IValidKeyName = "r"; platform: IKeyCommandPlatform = "all"; description: string = "Rebuild native app if needed and restart"; + group = "Development Workflow"; willBlockKeyCommandExecution: boolean = true; constructor(private $liveSyncCommandHelper: ILiveSyncCommandHelper) {} @@ -255,6 +367,7 @@ export class ShiftR implements IKeyCommand { key: IValidKeyName = "R"; platform: IKeyCommandPlatform = "all"; description: string = "Force rebuild native app and restart"; + group = "Development Workflow"; willBlockKeyCommandExecution: boolean = true; constructor(private $liveSyncCommandHelper: ILiveSyncCommandHelper) {} @@ -279,6 +392,7 @@ export class CtrlC implements IKeyCommand { key: IValidKeyName = SpecialKeys.CtrlC; platform: IKeyCommandPlatform = "all"; description: string; + group = "Development Workflow"; willBlockKeyCommandExecution: boolean = false; async execute(): Promise { @@ -290,6 +404,7 @@ export class W implements IKeyCommand { key: IValidKeyName = "w"; platform: IKeyCommandPlatform = "all"; description: string = "Toggle file watcher"; + group = "Development Workflow"; willBlockKeyCommandExecution: boolean = true; constructor(private $prepareController: IPrepareController) {} @@ -310,6 +425,7 @@ export class C implements IKeyCommand { key: IValidKeyName = "c"; platform: IKeyCommandPlatform = "all"; description: string = "Clean project"; + group = "Development Workflow"; willBlockKeyCommandExecution: boolean = true; constructor( @@ -337,6 +453,7 @@ export class N implements IKeyCommand { key: IValidKeyName = "n"; platform: IKeyCommandPlatform = "all"; description: string = "Install dependencies"; + group = "Development Workflow"; willBlockKeyCommandExecution: boolean = true; async execute(platform: string): Promise { @@ -350,6 +467,7 @@ export class QuestionMark implements IKeyCommand { key: IValidKeyName = SpecialKeys.QuestionMark; platform: IKeyCommandPlatform = "all"; description: string = "Show this help"; + group = "Development Workflow"; willBlockKeyCommandExecution: boolean = true; constructor(private $keyCommandHelper: IKeyCommandHelper) {} @@ -363,6 +481,10 @@ export class QuestionMark implements IKeyCommand { case "ios": platform = "iOS"; break; + case "visionOS": + case "vision": + platform = "visionOS"; + break; default: platform = "all"; break; @@ -373,9 +495,11 @@ export class QuestionMark implements IKeyCommand { } injector.registerKeyCommand("a", A); -injector.registerKeyCommand("i", I); injector.registerKeyCommand("A", ShiftA); +injector.registerKeyCommand("i", I); injector.registerKeyCommand("I", ShiftI); +injector.registerKeyCommand("v", V); +injector.registerKeyCommand("V", ShiftV); injector.registerKeyCommand("r", R); injector.registerKeyCommand("R", ShiftR); injector.registerKeyCommand("w", W); @@ -386,4 +510,6 @@ injector.registerKeyCommand(SpecialKeys.QuestionMark, QuestionMark); injector.registerKeyCommand(SpecialKeys.CtrlC, CtrlC); injector.registerCommand("open|ios", OpenIOSCommand); +injector.registerCommand("open|visionos", OpenVisionOSCommand); +injector.registerCommand("open|vision", OpenVisionOSCommand); injector.registerCommand("open|android", OpenAndroidCommand); diff --git a/lib/options.ts b/lib/options.ts index 26451d8264..3a9dcf3c0a 100644 --- a/lib/options.ts +++ b/lib/options.ts @@ -132,6 +132,12 @@ export class Options { vue: { type: OptionType.Boolean, hasSensitiveValue: false }, vuejs: { type: OptionType.Boolean, hasSensitiveValue: false }, svelte: { type: OptionType.Boolean, hasSensitiveValue: false }, + vision: { type: OptionType.Boolean, hasSensitiveValue: false }, + "vision-ng": { type: OptionType.Boolean, hasSensitiveValue: false }, + "vision-react": { type: OptionType.Boolean, hasSensitiveValue: false }, + "vision-solid": { type: OptionType.Boolean, hasSensitiveValue: false }, + "vision-svelte": { type: OptionType.Boolean, hasSensitiveValue: false }, + "vision-vue": { type: OptionType.Boolean, hasSensitiveValue: false }, tsc: { type: OptionType.Boolean, hasSensitiveValue: false }, ts: { type: OptionType.Boolean, hasSensitiveValue: false }, typescript: { type: OptionType.Boolean, hasSensitiveValue: false }, @@ -422,9 +428,8 @@ export class Options { this.$settingsService.setSettings({ profileDir: this.argv.profileDir, }); - this.argv.profileDir = this.argv[ - "profile-dir" - ] = this.$settingsService.getProfileDir(); + this.argv.profileDir = this.argv["profile-dir"] = + this.$settingsService.getProfileDir(); // if justlaunch is set, it takes precedence over the --watch flag and the default true value if (this.argv.justlaunch) { diff --git a/lib/package-installation-manager.ts b/lib/package-installation-manager.ts index 904d5caaec..535ff2d942 100644 --- a/lib/package-installation-manager.ts +++ b/lib/package-installation-manager.ts @@ -70,9 +70,21 @@ export class PackageInstallationManager implements IPackageInstallationManager { versions: true, }); - return semver - .maxSatisfying(data?.versions ?? data, versionRange) - ?.toString(); + let versions; + + if (typeof data === "string") { + versions = [data]; + } else if (data?.versions) { + versions = data.versions; + } else { + versions = data; + } + + if (!versions || !Array.isArray(versions)) { + return null; + } + + return semver.maxSatisfying(versions, versionRange)?.toString(); } public async getMaxSatisfyingVersionSafe( diff --git a/lib/project-data.ts b/lib/project-data.ts index f8bee9a09c..63ddc34e73 100644 --- a/lib/project-data.ts +++ b/lib/project-data.ts @@ -79,6 +79,7 @@ export class ProjectData implements IProjectData { this.warnProjectId(); this.projectIdentifiers.ios = identifier; this.projectIdentifiers.android = identifier; + this.projectIdentifiers.visionos = identifier; } public projectName: string; @@ -217,11 +218,10 @@ export class ProjectData implements IProjectData { appResourcesDir, this.$devicePlatformsConstants.Android ); - const androidManifestDir = this.$androidResourcesMigrationService.hasMigrated( - appResourcesDir - ) - ? path.join(androidDirPath, constants.SRC_DIR, constants.MAIN_DIR) - : androidDirPath; + const androidManifestDir = + this.$androidResourcesMigrationService.hasMigrated(appResourcesDir) + ? path.join(androidDirPath, constants.SRC_DIR, constants.MAIN_DIR) + : androidDirPath; return path.join(androidManifestDir, constants.MANIFEST_FILE_NAME); } @@ -244,7 +244,8 @@ export class ProjectData implements IProjectData { } public getAppResourcesDirectoryPath(projectDir?: string): string { - const appResourcesRelativePath = this.getAppResourcesRelativeDirectoryPath(); + const appResourcesRelativePath = + this.getAppResourcesRelativeDirectoryPath(); return this.resolveToProjectDir(appResourcesRelativePath, projectDir); } @@ -313,12 +314,14 @@ export class ProjectData implements IProjectData { return { ios: "", android: "", + visionos: "", }; } const identifier: Mobile.IProjectIdentifier = { ios: config.id, android: config.id, + visionos: config.id, }; if (config.ios && config.ios.id) { @@ -327,6 +330,9 @@ export class ProjectData implements IProjectData { if (config.android && config.android.id) { identifier.android = config.android.id; } + if (config.visionos && config.visionos.id) { + identifier.visionos = config.visionos.id; + } return identifier; } diff --git a/lib/resolvers/livesync-service-resolver.ts b/lib/resolvers/livesync-service-resolver.ts index f7399ea47a..714374117b 100644 --- a/lib/resolvers/livesync-service-resolver.ts +++ b/lib/resolvers/livesync-service-resolver.ts @@ -10,7 +10,7 @@ export class LiveSyncServiceResolver implements ILiveSyncServiceResolver { ) {} public resolveLiveSyncService(platform: string): IPlatformLiveSyncService { - if (this.$mobileHelper.isiOSPlatform(platform)) { + if (this.$mobileHelper.isApplePlatform(platform)) { return this.$injector.resolve("iOSLiveSyncService"); } else if (this.$mobileHelper.isAndroidPlatform(platform)) { return this.$injector.resolve("androidLiveSyncService"); diff --git a/lib/services/build-data-service.ts b/lib/services/build-data-service.ts index 4eba5a8506..e8a13f7c6f 100644 --- a/lib/services/build-data-service.ts +++ b/lib/services/build-data-service.ts @@ -6,7 +6,7 @@ export class BuildDataService implements IBuildDataService { constructor(private $mobileHelper: Mobile.IMobileHelper) {} public getBuildData(projectDir: string, platform: string, data: any) { - if (this.$mobileHelper.isiOSPlatform(platform)) { + if (this.$mobileHelper.isApplePlatform(platform)) { return new IOSBuildData(projectDir, platform, data); } else if (this.$mobileHelper.isAndroidPlatform(platform)) { return new AndroidBuildData(projectDir, platform, data); diff --git a/lib/services/ios-entitlements-service.ts b/lib/services/ios-entitlements-service.ts index bd2d6c097b..c506971016 100644 --- a/lib/services/ios-entitlements-service.ts +++ b/lib/services/ios-entitlements-service.ts @@ -3,10 +3,12 @@ import { PlistSession } from "plist-merge-patch"; import { IPluginsService, IPluginData } from "../definitions/plugins"; import { IProjectData } from "../definitions/project"; import { IFileSystem } from "../common/declarations"; +import { IOptions } from "../declarations"; import { injector } from "../common/yok"; export class IOSEntitlementsService { constructor( + private $options: IOptions, private $fs: IFileSystem, private $logger: ILogger, private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants, @@ -21,7 +23,7 @@ export class IOSEntitlementsService { const entitlementsPath = path.join( projectData.appResourcesDirectoryPath, this.$mobileHelper.normalizePlatformName( - this.$devicePlatformsConstants.iOS + this.$options.platformOverride ?? this.$devicePlatformsConstants.iOS ), entitlementsName ); @@ -31,7 +33,8 @@ export class IOSEntitlementsService { public getPlatformsEntitlementsPath(projectData: IProjectData): string { return path.join( projectData.platformsDir, - this.$devicePlatformsConstants.iOS.toLowerCase(), + this.$options.platformOverride ?? + this.$devicePlatformsConstants.iOS.toLowerCase(), projectData.projectName, projectData.projectName + ".entitlements" ); diff --git a/lib/services/ios-project-service.ts b/lib/services/ios-project-service.ts index dafe91ebad..f100b31c45 100644 --- a/lib/services/ios-project-service.ts +++ b/lib/services/ios-project-service.ts @@ -63,14 +63,32 @@ interface INativeSourceCodeGroup { files: string[]; } -const DevicePlatformSdkName = "iphoneos"; -const SimulatorPlatformSdkName = "iphonesimulator"; +export const DevicePlatformSdkName = "iphoneos"; +export const SimulatorPlatformSdkName = "iphonesimulator"; +export const VisionDevicePlatformSdkName = "xros"; +export const VisionSimulatorPlatformSdkName = "xrsimulator"; + const FRAMEWORK_EXTENSIONS = [".framework", ".xcframework"]; -const getPlatformSdkName = (forDevice: boolean): string => - forDevice ? DevicePlatformSdkName : SimulatorPlatformSdkName; -const getConfigurationName = (release: boolean): string => - release ? Configurations.Release : Configurations.Debug; +const getPlatformSdkName = (buildData: IBuildData): string => { + const forDevice = + !buildData || buildData.buildForDevice || buildData.buildForAppStore; + const isvisionOS = injector + .resolve("devicePlatformsConstants") + .isvisionOS(buildData.platform); + + if (isvisionOS) { + return forDevice + ? VisionDevicePlatformSdkName + : VisionSimulatorPlatformSdkName; + } + + return forDevice ? DevicePlatformSdkName : SimulatorPlatformSdkName; +}; + +const getConfigurationName = (release: boolean): string => { + return release ? Configurations.Release : Configurations.Debug; +}; export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServiceBase { private static IOS_PROJECT_NAME_PLACEHOLDER = "__PROJECT_NAME__"; @@ -78,6 +96,7 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ constructor( $fs: IFileSystem, + private $options: IOptions, private $childProcess: IChildProcess, private $cocoapodsService: ICocoaPodsService, private $errors: IErrors, @@ -101,7 +120,8 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ private $iOSNativeTargetService: IIOSNativeTargetService, private $sysInfo: ISysInfo, private $tempService: ITempService, - private $spmService: ISPMService + private $spmService: ISPMService, + private $mobileHelper: Mobile.IMobileHelper ) { super($fs, $projectDataService); } @@ -120,19 +140,22 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ projectData.platformsDir && this._platformsDirCache !== projectData.platformsDir ) { + const platform = this.$mobileHelper.normalizePlatformName( + this.$options.platformOverride ?? this.$devicePlatformsConstants.iOS + ); const projectRoot = path.join( projectData.platformsDir, - this.$devicePlatformsConstants.iOS.toLowerCase() + platform.toLowerCase() ); const runtimePackage = this.$projectDataService.getRuntimePackage( projectData.projectDir, - constants.PlatformTypes.ios + platform.toLowerCase() as constants.SupportedPlatform ); this._platformData = { frameworkPackageName: runtimePackage.name, - normalizedPlatformName: "iOS", - platformNameLowerCase: "ios", + normalizedPlatformName: platform, + platformNameLowerCase: platform.toLowerCase(), appDestinationDirectoryPath: path.join( projectRoot, projectData.projectName @@ -144,9 +167,7 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ return path.join( projectRoot, constants.BUILD_DIR, - `${config}-${getPlatformSdkName( - !options || options.buildForDevice || options.buildForAppStore - )}` + `${config}-${getPlatformSdkName(options)}` ); }, getValidBuildOutputData: ( @@ -654,12 +675,20 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ this.savePbxProj(project, projectData); - const resourcesNativeCodePath = path.join( + let resourcesNativeCodePath = path.join( resourcesDirectoryPath, platformData.normalizedPlatformName, constants.NATIVE_SOURCE_FOLDER ); + if (!this.$fs.exists(resourcesNativeCodePath)) { + resourcesNativeCodePath = path.join( + resourcesDirectoryPath, + this.$devicePlatformsConstants.iOS, + constants.NATIVE_SOURCE_FOLDER + ); + } + await this.prepareNativeSourceCode( constants.TNS_NATIVE_SOURCE_GROUP_NAME, resourcesNativeCodePath, @@ -696,15 +725,29 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ this.$fs.deleteDirectory(platformsAppResourcesPath); this.$fs.ensureDirectoryExists(platformsAppResourcesPath); - this.$fs.copyFile( - path.join( - projectAppResourcesPath, - platformData.normalizedPlatformName, - "*" - ), - platformsAppResourcesPath + const platformAppResourcesPath = path.join( + projectAppResourcesPath, + platformData.normalizedPlatformName ); + // this allows App_Resources/visionOS + if (this.$fs.exists(platformAppResourcesPath)) { + this.$fs.copyFile( + path.join(platformAppResourcesPath, "*"), + platformsAppResourcesPath + ); + } else { + // otherwise falls back to App_Resources/iOS + this.$fs.copyFile( + path.join( + projectAppResourcesPath, + this.$devicePlatformsConstants.iOS, + "*" + ), + platformsAppResourcesPath + ); + } + this.$fs.deleteFile( path.join(platformsAppResourcesPath, platformData.configurationFileName) ); diff --git a/lib/services/ios/spm-service.ts b/lib/services/ios/spm-service.ts index 0d654e45bc..9965549ce4 100644 --- a/lib/services/ios/spm-service.ts +++ b/lib/services/ios/spm-service.ts @@ -15,25 +15,32 @@ export class SPMService implements ISPMService { private $xcodebuildArgsService: IXcodebuildArgsService ) {} - public getSPMPackages(projectData: IProjectData): IosSPMPackageDefinition[] { + public getSPMPackages( + projectData: IProjectData, + platform: string + ): IosSPMPackageDefinition[] { const spmPackages = this.$projectConfigService.getValue( - "ios.SPMPackages", + `${platform}.SPMPackages`, [] ); return spmPackages; } - public hasSPMPackages(projectData: IProjectData): boolean { - return this.getSPMPackages(projectData).length > 0; - } + // note: this is not used anywhere at the moment. + // public hasSPMPackages(projectData: IProjectData): boolean { + // return this.getSPMPackages(projectData).length > 0; + // } public async applySPMPackages( platformData: IPlatformData, projectData: IProjectData ) { try { - const spmPackages = this.getSPMPackages(projectData); + const spmPackages = this.getSPMPackages( + projectData, + platformData.platformNameLowerCase + ); if (!spmPackages.length) { this.$logger.trace("SPM: no SPM packages to apply."); @@ -48,6 +55,7 @@ export class SPMService implements ISPMService { }); await project.load(); + // note: in trapeze both visionOS and iOS are handled by the ios project. if (!project.ios) { this.$logger.trace("SPM: no iOS project found via trapeze."); return; diff --git a/lib/services/ios/xcodebuild-args-service.ts b/lib/services/ios/xcodebuild-args-service.ts index a10c456452..b97a11d8e5 100644 --- a/lib/services/ios/xcodebuild-args-service.ts +++ b/lib/services/ios/xcodebuild-args-service.ts @@ -13,8 +13,11 @@ import { IFileSystem } from "../../common/declarations"; import { injector } from "../../common/yok"; import * as _ from "lodash"; -const DevicePlatformSdkName = "iphoneos"; -const SimulatorPlatformSdkName = "iphonesimulator"; +import { + DevicePlatformSdkName, + SimulatorPlatformSdkName, + VisionSimulatorPlatformSdkName, +} from "../ios-project-service"; export class XcodebuildArgsService implements IXcodebuildArgsService { constructor( @@ -39,10 +42,23 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { args = args.concat(["CODE_SIGN_IDENTITY="]); } + let destination = "generic/platform=iOS Simulator"; + + let isvisionOS = this.$devicePlatformsConstants.isvisionOS( + buildConfig.platform + ); + + if (isvisionOS) { + destination = "platform=visionOS Simulator"; + if (buildConfig._device) { + destination += `,id=${buildConfig._device.deviceInfo.identifier}`; + } + } + args = args .concat([ "-destination", - "generic/platform=iOS Simulator", + destination, "build", "-configuration", buildConfig.release ? Configurations.Release : Configurations.Debug, @@ -51,7 +67,7 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { this.getBuildCommonArgs( platformData, projectData, - SimulatorPlatformSdkName + isvisionOS ? VisionSimulatorPlatformSdkName : SimulatorPlatformSdkName ) ) .concat(this.getBuildLoggingArgs()) @@ -70,9 +86,20 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { platformData.getBuildOutputPath(buildConfig), projectData.projectName + ".xcarchive" ); + let destination = "generic/platform=iOS"; + let isvisionOS = this.$devicePlatformsConstants.isvisionOS( + buildConfig.platform + ); + + if (isvisionOS) { + destination = "platform=visionOS"; + if (buildConfig._device) { + destination += `,id=${buildConfig._device.deviceInfo.identifier}`; + } + } const args = [ "-destination", - "generic/platform=iOS", + destination, "archive", "-archivePath", archivePath, @@ -99,6 +126,11 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { ): Promise { const args = []; + if (this.$devicePlatformsConstants.isvisionOS(buildConfig.platform)) { + args.push("ONLY_ACTIVE_ARCH=YES"); + return args; + } + const devicesArchitectures = buildConfig.buildForDevice ? await this.getArchitecturesFromConnectedDevices(buildConfig) : []; @@ -117,7 +149,6 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { platformData.projectRoot, `${projectData.projectName}.xcworkspace` ); - // Introduced in Xcode 14+ // ref: https://forums.swift.org/t/telling-xcode-14-beta-4-to-trust-build-tool-plugins-programatically/59305/5 const skipPackageValidation = "-skipPackagePluginValidation"; @@ -133,12 +164,14 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { platformData.normalizedPlatformName, constants.BUILD_XCCONFIG_FILE_NAME ); - // Only include explit deploy target if one is defined + + // Only include explicit properties from build.xcconfig // Note: we could include entire file via -xcconfig flag // however doing so introduces unwanted side effects // like cocoapods issues related to ASSETCATALOG_COMPILER_APPICON_NAME // references: https://medium.com/@iostechset/why-cocoapods-eats-app-icons-79fe729808d4 // https://github.com/CocoaPods/CocoaPods/issues/7003 + const deployTargetProperty = "IPHONEOS_DEPLOYMENT_TARGET"; const deployTargetVersion = this.$xcconfigService.readPropertyValue( BUILD_SETTINGS_FILE_PATH, @@ -148,6 +181,15 @@ export class XcodebuildArgsService implements IXcodebuildArgsService { extraArgs.push(`${deployTargetProperty}=${deployTargetVersion}`); } + const swiftUIBootProperty = "NS_SWIFTUI_BOOT"; + const swiftUIBootValue = this.$xcconfigService.readPropertyValue( + BUILD_SETTINGS_FILE_PATH, + swiftUIBootProperty + ); + if (swiftUIBootValue) { + extraArgs.push(`${swiftUIBootProperty}=${swiftUIBootValue}`); + } + if (this.$fs.exists(xcworkspacePath)) { return ["-workspace", xcworkspacePath, ...extraArgs]; } diff --git a/lib/services/platforms-data-service.ts b/lib/services/platforms-data-service.ts index 04fc5f0756..0f0ac30848 100644 --- a/lib/services/platforms-data-service.ts +++ b/lib/services/platforms-data-service.ts @@ -2,17 +2,20 @@ import { IProjectData } from "../definitions/project"; import { IPlatformData, IPlatformsDataService } from "../definitions/platform"; import { injector } from "../common/yok"; import * as _ from "lodash"; +import { IOptions } from "../declarations"; export class PlatformsDataService implements IPlatformsDataService { private platformsDataService: { [index: string]: any } = {}; constructor( + private $options: IOptions, $androidProjectService: IPlatformProjectService, $iOSProjectService: IPlatformProjectService ) { this.platformsDataService = { ios: $iOSProjectService, android: $androidProjectService, + visionos: $iOSProjectService, }; } @@ -23,6 +26,7 @@ export class PlatformsDataService implements IPlatformsDataService { const platformKey = platform && _.first(platform.toLowerCase().split("@")); let platformData: IPlatformData; if (platformKey) { + this.$options.platformOverride ??= platform; platformData = this.platformsDataService[platformKey] && this.platformsDataService[platformKey].getPlatformData(projectData); diff --git a/lib/services/plugins-service.ts b/lib/services/plugins-service.ts index 6bb14996af..b1dc3a5a63 100644 --- a/lib/services/plugins-service.ts +++ b/lib/services/plugins-service.ts @@ -633,8 +633,16 @@ This framework comes from ${dependencyName} plugin, which is installed multiple this.getPackageJsonFilePathForModule(cacheData.name, projectDir) ); pluginData.isPlugin = !!cacheData.nativescript; - pluginData.pluginPlatformsFolderPath = (platform: string) => - path.join(pluginData.fullPath, "platforms", platform.toLowerCase()); + pluginData.pluginPlatformsFolderPath = (platform: string) => { + if (this.$mobileHelper.isvisionOSPlatform(platform)) { + platform = constants.PlatformTypes.ios; + } + return path.join( + pluginData.fullPath, + "platforms", + platform.toLowerCase() + ); + }; const data = cacheData.nativescript; if (pluginData.isPlugin) { diff --git a/lib/services/prepare-data-service.ts b/lib/services/prepare-data-service.ts index b533a4e6da..90f34766f6 100644 --- a/lib/services/prepare-data-service.ts +++ b/lib/services/prepare-data-service.ts @@ -7,7 +7,7 @@ export class PrepareDataService implements IPrepareDataService { public getPrepareData(projectDir: string, platform: string, data: any) { const platformLowerCase = platform.toLowerCase(); - if (this.$mobileHelper.isiOSPlatform(platform)) { + if (this.$mobileHelper.isApplePlatform(platform)) { return new IOSPrepareData(projectDir, platformLowerCase, data); } else if (this.$mobileHelper.isAndroidPlatform(platform)) { return new AndroidPrepareData(projectDir, platformLowerCase, data); diff --git a/lib/services/project-changes-service.ts b/lib/services/project-changes-service.ts index edb9b2593d..5ffa09c3bf 100644 --- a/lib/services/project-changes-service.ts +++ b/lib/services/project-changes-service.ts @@ -83,10 +83,22 @@ export class ProjectChangesService implements IProjectChangesService { prepareData ); if (!isNewPrepareInfo) { - const platformResourcesDir = path.join( + let platformResourcesDir = path.join( projectData.appResourcesDirectoryPath, platformData.normalizedPlatformName ); + + if ( + !this.$fs.exists(platformResourcesDir) && + platformData.platformNameLowerCase === + this.$devicePlatformsConstants.visionOS.toLowerCase() + ) { + platformResourcesDir = path.join( + projectData.appResourcesDirectoryPath, + this.$devicePlatformsConstants.iOS + ); + } + this._changesInfo.appResourcesChanged = this.containsNewerFiles( platformResourcesDir, projectData diff --git a/lib/services/project-data-service.ts b/lib/services/project-data-service.ts index abc917c424..52f1ff49a5 100644 --- a/lib/services/project-data-service.ts +++ b/lib/services/project-data-service.ts @@ -246,9 +246,8 @@ export class ProjectDataService implements IProjectDataService { // ignore } - const content = this.getImageDefinitions()[ - useLegacy ? "android_legacy" : "android" - ]; + const content = + this.getImageDefinitions()[useLegacy ? "android_legacy" : "android"]; return { icons: this.getAndroidAssetSubGroup(content.icons, basePath), @@ -638,6 +637,8 @@ export class ProjectDataService implements IProjectDataService { constants.SCOPED_ANDROID_RUNTIME_NAME, constants.TNS_ANDROID_RUNTIME_NAME, ].includes(d.name); + } else if (platform === constants.PlatformTypes.visionos) { + return d.name === constants.SCOPED_VISIONOS_RUNTIME_NAME; } }); @@ -694,6 +695,11 @@ export class ProjectDataService implements IProjectDataService { name: constants.SCOPED_ANDROID_RUNTIME_NAME, version: null, }; + } else if (platform === constants.PlatformTypes.visionos) { + return { + name: constants.SCOPED_VISIONOS_RUNTIME_NAME, + version: null, + }; } } diff --git a/lib/services/start-service.ts b/lib/services/start-service.ts index 3ce4b8df2a..7ed068916d 100644 --- a/lib/services/start-service.ts +++ b/lib/services/start-service.ts @@ -11,6 +11,7 @@ import { IStaticConfig } from "../declarations"; export default class StartService implements IStartService { ios: ChildProcess; + visionos: ChildProcess; android: ChildProcess; verbose: boolean = false; @@ -64,6 +65,10 @@ export default class StartService implements IStartService { this.runForPlatform(this.$devicePlatformsConstants.iOS); } + async runVisionOS(): Promise { + this.runForPlatform(this.$devicePlatformsConstants.visionOS); + } + async runAndroid(): Promise { this.runForPlatform(this.$devicePlatformsConstants.Android); } @@ -72,6 +77,11 @@ export default class StartService implements IStartService { this.ios.kill("SIGINT"); } } + async stopVisionOS(): Promise { + if (this.visionos) { + this.visionos.kill("SIGINT"); + } + } async stopAndroid(): Promise { if (this.android) { this.android.kill("SIGINT"); diff --git a/package-lock.json b/package-lock.json index 508f5c24e8..fc3d08553e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "glob": "9.3.4", "ios-device-lib": "0.9.3", "ios-mobileprovision-finder": "1.1.0", - "ios-sim-portable": "4.4.1", + "ios-sim-portable": "4.5.0", "jimp": "0.22.10", "lodash": "4.17.21", "log4js": "6.9.1", @@ -45,7 +45,7 @@ "minimatch": "7.4.2", "mkdirp": "2.1.6", "mute-stream": "1.0.0", - "nativescript-dev-xcode": "0.6.0", + "nativescript-dev-xcode": "0.7.0", "open": "8.4.2", "ora": "5.4.1", "pacote": "15.1.1", @@ -140,81 +140,17 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", @@ -224,13 +160,14 @@ } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -531,11 +468,11 @@ "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==" }, "node_modules/@jimp/bmp": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.22.10.tgz", - "integrity": "sha512-1UXRl1Nw1KptZ1r0ANqtXOst9vGH51dq7keVKQzyyTO2lz4dOaezS9StuSTNh+RmiHg/SVPaFRpPfB0S/ln4Kg==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.22.12.tgz", + "integrity": "sha512-aeI64HD0npropd+AR76MCcvvRaa+Qck6loCOS03CkkxGHN5/r336qTM5HPUdHKMDOGzqknuVPA8+kK1t03z12g==", "dependencies": { - "@jimp/utils": "^0.22.10", + "@jimp/utils": "^0.22.12", "bmp-js": "^0.1.0" }, "peerDependencies": { @@ -543,11 +480,11 @@ } }, "node_modules/@jimp/core": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.22.10.tgz", - "integrity": "sha512-ZKyrehVy6wu1PnBXIUpn/fXmyMRQiVSbvHDubgXz4bfTOao3GiOurKHjByutQIgozuAN6ZHWiSge1dKA+dex3w==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.22.12.tgz", + "integrity": "sha512-l0RR0dOPyzMKfjUW1uebzueFEDtCOj9fN6pyTYWWOM/VS4BciXQ1VVrJs8pO3kycGYZxncRKhCoygbNr8eEZQA==", "dependencies": { - "@jimp/utils": "^0.22.10", + "@jimp/utils": "^0.22.12", "any-base": "^1.1.0", "buffer": "^5.2.0", "exif-parser": "^0.1.12", @@ -558,19 +495,19 @@ } }, "node_modules/@jimp/custom": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.22.10.tgz", - "integrity": "sha512-sPZkUYe1hu0iIgNisjizxPJqq2vaaKvkCkPoXq2U6UV3ZA1si/WVdrg25da3IcGIEV+83AoHgM8TvqlLgrCJsg==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.22.12.tgz", + "integrity": "sha512-xcmww1O/JFP2MrlGUMd3Q78S3Qu6W3mYTXYuIqFq33EorgYHV/HqymHfXy9GjiCJ7OI+7lWx6nYFOzU7M4rd1Q==", "dependencies": { - "@jimp/core": "^0.22.10" + "@jimp/core": "^0.22.12" } }, "node_modules/@jimp/gif": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.22.10.tgz", - "integrity": "sha512-yEX2dSpamvkSx1PPDWGnKeWDrBz0vrCKjVG/cn4Zr68MRRT75tbZIeOrBa+RiUpY3ho5ix7d36LkYvt3qfUIhQ==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.22.12.tgz", + "integrity": "sha512-y6BFTJgch9mbor2H234VSjd9iwAhaNf/t3US5qpYIs0TSbAvM02Fbc28IaDETj9+4YB4676sz4RcN/zwhfu1pg==", "dependencies": { - "@jimp/utils": "^0.22.10", + "@jimp/utils": "^0.22.12", "gifwrap": "^0.10.1", "omggif": "^1.0.9" }, @@ -579,11 +516,11 @@ } }, "node_modules/@jimp/jpeg": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.22.10.tgz", - "integrity": "sha512-6bu98pAcVN4DY2oiDLC4TOgieX/lZrLd1tombWZOFCN5PBmqaHQxm7IUmT+Wj4faEvh8QSHgVLSA+2JQQRJWVA==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.22.12.tgz", + "integrity": "sha512-Rq26XC/uQWaQKyb/5lksCTCxXhtY01NJeBN+dQv5yNYedN0i7iYu+fXEoRsfaJ8xZzjoANH8sns7rVP4GE7d/Q==", "dependencies": { - "@jimp/utils": "^0.22.10", + "@jimp/utils": "^0.22.12", "jpeg-js": "^0.4.4" }, "peerDependencies": { @@ -591,44 +528,44 @@ } }, "node_modules/@jimp/plugin-blit": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.22.10.tgz", - "integrity": "sha512-6EI8Sl+mxYHEIy6Yteh6eknD+EZguKpNdr3sCKxNezmLR0+vK99vHcllo6uGSjXXiwtwS67Xqxn8SsoatL+UJQ==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.22.12.tgz", + "integrity": "sha512-xslz2ZoFZOPLY8EZ4dC29m168BtDx95D6K80TzgUi8gqT7LY6CsajWO0FAxDwHz6h0eomHMfyGX0stspBrTKnQ==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "node_modules/@jimp/plugin-blur": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.22.10.tgz", - "integrity": "sha512-4XRTWuPVdMXJeclJMisXPGizeHtTryVaVV5HnuQXpKqIZtzXReCCpNGH8q/i0kBQOQMXhGWS3mpqOEwtpPePKw==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.22.12.tgz", + "integrity": "sha512-S0vJADTuh1Q9F+cXAwFPlrKWzDj2F9t/9JAbUvaaDuivpyWuImEKXVz5PUZw2NbpuSHjwssbTpOZ8F13iJX4uw==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "node_modules/@jimp/plugin-circle": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.22.10.tgz", - "integrity": "sha512-mhcwTO1ywRxiCgtLGge6tDDIDPlX6qkI3CY+BjgGG/XhVHccCddXgOGLdlf+5OuKIEF2Nqs0V01LQEQIJFTmEw==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.22.12.tgz", + "integrity": "sha512-SWVXx1yiuj5jZtMijqUfvVOJBwOifFn0918ou4ftoHgegc5aHWW5dZbYPjvC9fLpvz7oSlptNl2Sxr1zwofjTg==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "node_modules/@jimp/plugin-color": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.22.10.tgz", - "integrity": "sha512-e4t3L7Kedd96E0x1XjsTM6NcgulKUU66HdFTao7Tc9FYJRFSlttARZ/C6LEryGDm/i69R6bJEpo7BkNz0YL55Q==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.22.12.tgz", + "integrity": "sha512-xImhTE5BpS8xa+mAN6j4sMRWaUgUDLoaGHhJhpC+r7SKKErYDR0WQV4yCE4gP+N0gozD0F3Ka1LUSaMXrn7ZIA==", "dependencies": { - "@jimp/utils": "^0.22.10", + "@jimp/utils": "^0.22.12", "tinycolor2": "^1.6.0" }, "peerDependencies": { @@ -636,11 +573,11 @@ } }, "node_modules/@jimp/plugin-contain": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.22.10.tgz", - "integrity": "sha512-eP8KrzctuEoqibQAxi9WhbnoRosydhiwg+IYya3dKuKDBTrD9UHt+ERlPQ/lTNWHzV/l4S1ntV3r9s9saJgsXA==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.22.12.tgz", + "integrity": "sha512-Eo3DmfixJw3N79lWk8q/0SDYbqmKt1xSTJ69yy8XLYQj9svoBbyRpSnHR+n9hOw5pKXytHwUW6nU4u1wegHNoQ==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", @@ -650,11 +587,11 @@ } }, "node_modules/@jimp/plugin-cover": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.22.10.tgz", - "integrity": "sha512-kJCwL5T1igfa0InCfkE7bBeqg26m46aoRt10ug+rvm11P6RrvRMGrgINFyIKB+mnB7CiyBN/MOula1CvLhSInQ==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.22.12.tgz", + "integrity": "sha512-z0w/1xH/v/knZkpTNx+E8a7fnasQ2wHG5ze6y5oL2dhH1UufNua8gLQXlv8/W56+4nJ1brhSd233HBJCo01BXA==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", @@ -664,55 +601,55 @@ } }, "node_modules/@jimp/plugin-crop": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.22.10.tgz", - "integrity": "sha512-BOZ+YGaZlhU7c5ye65RxikicXH0Ki0It6/XHISvipR5WZrfjLjL2Ke20G+AGnwBQc76gKenVcMXVUCnEjtZV+Q==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.22.12.tgz", + "integrity": "sha512-FNuUN0OVzRCozx8XSgP9MyLGMxNHHJMFt+LJuFjn1mu3k0VQxrzqbN06yIl46TVejhyAhcq5gLzqmSCHvlcBVw==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "node_modules/@jimp/plugin-displace": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.22.10.tgz", - "integrity": "sha512-llNiWWMTKISDXt5+cXI0GaFmZWAjlT+4fFLYf4eXquuL/9wZoQsEBhv2GdGd48mkiS8jZq1Nnb2Q4ehEPTvrzw==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.22.12.tgz", + "integrity": "sha512-qpRM8JRicxfK6aPPqKZA6+GzBwUIitiHaZw0QrJ64Ygd3+AsTc7BXr+37k2x7QcyCvmKXY4haUrSIsBug4S3CA==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "node_modules/@jimp/plugin-dither": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.22.10.tgz", - "integrity": "sha512-05WLmeV5M+P/0FS+bWf13hMew2X0oa8w9AtmevL2UyA/5GqiyvP2Xm5WfGQ8oFiiMvpnL6RFomJQOZtWca0C2w==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.22.12.tgz", + "integrity": "sha512-jYgGdSdSKl1UUEanX8A85v4+QUm+PE8vHFwlamaKk89s+PXQe7eVE3eNeSZX4inCq63EHL7cX580dMqkoC3ZLw==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "node_modules/@jimp/plugin-fisheye": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.22.10.tgz", - "integrity": "sha512-InjiXvc7Gkzrx8VWtU97kDqV7ENnhHGPULymJWeZaF2aicud9Fpk4iCtd/DcZIrk7Cbe60A8RwNXN00HXIbSCg==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.22.12.tgz", + "integrity": "sha512-LGuUTsFg+fOp6KBKrmLkX4LfyCy8IIsROwoUvsUPKzutSqMJnsm3JGDW2eOmWIS/jJpPaeaishjlxvczjgII+Q==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "node_modules/@jimp/plugin-flip": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.22.10.tgz", - "integrity": "sha512-42GkGtTHWnhnwTMPVK/kXObZbkYIpQWfuIfy5EMEMk6zRj05zpv4vsjkKWfuemweZINwfvD7wDJF7FVFNNcZZg==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.22.12.tgz", + "integrity": "sha512-m251Rop7GN8W0Yo/rF9LWk6kNclngyjIJs/VXHToGQ6EGveOSTSQaX2Isi9f9lCDLxt+inBIb7nlaLLxnvHX8Q==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", @@ -720,55 +657,55 @@ } }, "node_modules/@jimp/plugin-gaussian": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.22.10.tgz", - "integrity": "sha512-ykrG/6lTp9Q5YA8jS5XzwMHtRxb9HOFMgtmnrUZ8kU+BK8REecfy9Ic5BUEOjCYvS1a/xLsnrZQU07iiYxBxFg==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.22.12.tgz", + "integrity": "sha512-sBfbzoOmJ6FczfG2PquiK84NtVGeScw97JsCC3rpQv1PHVWyW+uqWFF53+n3c8Y0P2HWlUjflEla2h/vWShvhg==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "node_modules/@jimp/plugin-invert": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.22.10.tgz", - "integrity": "sha512-d8j9BlUJYs/c994t4azUWSWmQq4LLPG4ecm8m6SSNqap+S/HlVQGqjYhJEBbY9EXkOTYB9vBL9bqwSM1Rr6paA==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.22.12.tgz", + "integrity": "sha512-N+6rwxdB+7OCR6PYijaA/iizXXodpxOGvT/smd/lxeXsZ/empHmFFFJ/FaXcYh19Tm04dGDaXcNF/dN5nm6+xQ==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "node_modules/@jimp/plugin-mask": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.22.10.tgz", - "integrity": "sha512-yRBs1230XZkz24uFTdTcSlZ0HXZpIWzM3iFQN56MzZ7USgdVZjPPDCQ8I9RpqfZ36nDflQkUO0wV7ucsi4ogow==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.22.12.tgz", + "integrity": "sha512-4AWZg+DomtpUA099jRV8IEZUfn1wLv6+nem4NRJC7L/82vxzLCgXKTxvNvBcNmJjT9yS1LAAmiJGdWKXG63/NA==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "node_modules/@jimp/plugin-normalize": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.22.10.tgz", - "integrity": "sha512-Wk9GX6eJMchX/ZAazVa70Fagu+OXMvHiPY+HrcEwcclL+p1wo8xAHEsf9iKno7Ja4EU9lLhbBRY5hYJyiKMEkg==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.22.12.tgz", + "integrity": "sha512-0So0rexQivnWgnhacX4cfkM2223YdExnJTTy6d06WbkfZk5alHUx8MM3yEzwoCN0ErO7oyqEWRnEkGC+As1FtA==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "node_modules/@jimp/plugin-print": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.22.10.tgz", - "integrity": "sha512-1U3VloIR+beE1kWPdGEJMiE2h1Do29iv3w8sBbvPyRP4qXxRFcDpmCGtctsrKmb1krlBFlj8ubyAY90xL+5n9w==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.22.12.tgz", + "integrity": "sha512-c7TnhHlxm87DJeSnwr/XOLjJU/whoiKYY7r21SbuJ5nuH+7a78EW1teOaj5gEr2wYEd7QtkFqGlmyGXY/YclyQ==", "dependencies": { - "@jimp/utils": "^0.22.10", + "@jimp/utils": "^0.22.12", "load-bmfont": "^1.4.1" }, "peerDependencies": { @@ -777,22 +714,22 @@ } }, "node_modules/@jimp/plugin-resize": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.22.10.tgz", - "integrity": "sha512-ixomxVcnAONXDgaq0opvAx4UAOiEhOA/tipuhFFOvPKFd4yf1BAnEviB5maB0SBHHkJXPUSzDp/73xVTMGSe7g==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.22.12.tgz", + "integrity": "sha512-3NyTPlPbTnGKDIbaBgQ3HbE6wXbAlFfxHVERmrbqAi8R3r6fQPxpCauA8UVDnieg5eo04D0T8nnnNIX//i/sXg==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5" } }, "node_modules/@jimp/plugin-rotate": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.22.10.tgz", - "integrity": "sha512-eeFX8dnRyf3LAdsdXWKWuN18hLRg8zy1cP0cP9rHzQVWRK7ck/QsLxK1vHq7MADGwQalNaNTJ9SQxH6c8mz6jw==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.22.12.tgz", + "integrity": "sha512-9YNEt7BPAFfTls2FGfKBVgwwLUuKqy+E8bDGGEsOqHtbuhbshVGxN2WMZaD4gh5IDWvR+emmmPPWGgaYNYt1gA==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", @@ -802,11 +739,11 @@ } }, "node_modules/@jimp/plugin-scale": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.22.10.tgz", - "integrity": "sha512-TG/H0oUN69C9ArBCZg4PmuoixFVKIiru8282KzSB/Tp1I0xwX0XLTv3dJ5pobPlIgPcB+TmD4xAIdkCT4rtWxg==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.22.12.tgz", + "integrity": "sha512-dghs92qM6MhHj0HrV2qAwKPMklQtjNpoYgAB94ysYpsXslhRTiPisueSIELRwZGEr0J0VUxpUY7HgJwlSIgGZw==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", @@ -814,11 +751,11 @@ } }, "node_modules/@jimp/plugin-shadow": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.22.10.tgz", - "integrity": "sha512-TN9xm6fI7XfxbMUQqFPZjv59Xdpf0tSiAQdINB4g6pJMWiVANR/74OtDONoy3KKpenu5Y38s+FkrtID/KcQAhw==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.22.12.tgz", + "integrity": "sha512-FX8mTJuCt7/3zXVoeD/qHlm4YH2bVqBuWQHXSuBK054e7wFRnRnbSLPUqAwSeYP3lWqpuQzJtgiiBxV3+WWwTg==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", @@ -827,11 +764,11 @@ } }, "node_modules/@jimp/plugin-threshold": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.22.10.tgz", - "integrity": "sha512-DA2lSnU0TgIRbAgmXaxroYw3Ad6J2DOFEoJp0NleSm2h3GWbZEE5yW9U2B6hD3iqn4AenG4E2b2WzHXZyzSutw==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.22.12.tgz", + "integrity": "sha512-4x5GrQr1a/9L0paBC/MZZJjjgjxLYrqSmWd+e+QfAEPvmRxdRoQ5uKEuNgXnm9/weHQBTnQBQsOY2iFja+XGAw==", "dependencies": { - "@jimp/utils": "^0.22.10" + "@jimp/utils": "^0.22.12" }, "peerDependencies": { "@jimp/custom": ">=0.3.5", @@ -840,31 +777,31 @@ } }, "node_modules/@jimp/plugins": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.22.10.tgz", - "integrity": "sha512-KDMZyM6pmvS8freB+UBLko1TO/k4D7URS/nphCozuH+P7i3UMe7NdckXKJ8u+WD6sqN0YFYvBehpkpnUiw/91w==", - "dependencies": { - "@jimp/plugin-blit": "^0.22.10", - "@jimp/plugin-blur": "^0.22.10", - "@jimp/plugin-circle": "^0.22.10", - "@jimp/plugin-color": "^0.22.10", - "@jimp/plugin-contain": "^0.22.10", - "@jimp/plugin-cover": "^0.22.10", - "@jimp/plugin-crop": "^0.22.10", - "@jimp/plugin-displace": "^0.22.10", - "@jimp/plugin-dither": "^0.22.10", - "@jimp/plugin-fisheye": "^0.22.10", - "@jimp/plugin-flip": "^0.22.10", - "@jimp/plugin-gaussian": "^0.22.10", - "@jimp/plugin-invert": "^0.22.10", - "@jimp/plugin-mask": "^0.22.10", - "@jimp/plugin-normalize": "^0.22.10", - "@jimp/plugin-print": "^0.22.10", - "@jimp/plugin-resize": "^0.22.10", - "@jimp/plugin-rotate": "^0.22.10", - "@jimp/plugin-scale": "^0.22.10", - "@jimp/plugin-shadow": "^0.22.10", - "@jimp/plugin-threshold": "^0.22.10", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.22.12.tgz", + "integrity": "sha512-yBJ8vQrDkBbTgQZLty9k4+KtUQdRjsIDJSPjuI21YdVeqZxYywifHl4/XWILoTZsjTUASQcGoH0TuC0N7xm3ww==", + "dependencies": { + "@jimp/plugin-blit": "^0.22.12", + "@jimp/plugin-blur": "^0.22.12", + "@jimp/plugin-circle": "^0.22.12", + "@jimp/plugin-color": "^0.22.12", + "@jimp/plugin-contain": "^0.22.12", + "@jimp/plugin-cover": "^0.22.12", + "@jimp/plugin-crop": "^0.22.12", + "@jimp/plugin-displace": "^0.22.12", + "@jimp/plugin-dither": "^0.22.12", + "@jimp/plugin-fisheye": "^0.22.12", + "@jimp/plugin-flip": "^0.22.12", + "@jimp/plugin-gaussian": "^0.22.12", + "@jimp/plugin-invert": "^0.22.12", + "@jimp/plugin-mask": "^0.22.12", + "@jimp/plugin-normalize": "^0.22.12", + "@jimp/plugin-print": "^0.22.12", + "@jimp/plugin-resize": "^0.22.12", + "@jimp/plugin-rotate": "^0.22.12", + "@jimp/plugin-scale": "^0.22.12", + "@jimp/plugin-shadow": "^0.22.12", + "@jimp/plugin-threshold": "^0.22.12", "timm": "^1.6.1" }, "peerDependencies": { @@ -872,11 +809,11 @@ } }, "node_modules/@jimp/png": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.22.10.tgz", - "integrity": "sha512-RYinU7tZToeeR2g2qAMn42AU+8OUHjXPKZZ9RkmoL4bguA1xyZWaSdr22/FBkmnHhOERRlr02KPDN1OTOYHLDQ==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.22.12.tgz", + "integrity": "sha512-Mrp6dr3UTn+aLK8ty/dSKELz+Otdz1v4aAXzV5q53UDD2rbB5joKVJ/ChY310B+eRzNxIovbUF1KVrUsYdE8Hg==", "dependencies": { - "@jimp/utils": "^0.22.10", + "@jimp/utils": "^0.22.12", "pngjs": "^6.0.0" }, "peerDependencies": { @@ -884,9 +821,9 @@ } }, "node_modules/@jimp/tiff": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.22.10.tgz", - "integrity": "sha512-OaivlSYzpNTHyH/h7pEtl3A7F7TbsgytZs52GLX/xITW92ffgDgT6PkldIrMrET6ERh/hdijNQiew7IoEEr2og==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.22.12.tgz", + "integrity": "sha512-E1LtMh4RyJsoCAfAkBRVSYyZDTtLq9p9LUiiYP0vPtXyxX4BiYBUYihTLSBlCQg5nF2e4OpQg7SPrLdJ66u7jg==", "dependencies": { "utif2": "^4.0.1" }, @@ -895,15 +832,15 @@ } }, "node_modules/@jimp/types": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.22.10.tgz", - "integrity": "sha512-u/r+XYzbCx4zZukDmxx8S0er3Yq3iDPI6+31WKX0N18i2qPPJYcn8qwIFurfupRumGvJ8SlGLCgt/T+Y8zzUIw==", - "dependencies": { - "@jimp/bmp": "^0.22.10", - "@jimp/gif": "^0.22.10", - "@jimp/jpeg": "^0.22.10", - "@jimp/png": "^0.22.10", - "@jimp/tiff": "^0.22.10", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.22.12.tgz", + "integrity": "sha512-wwKYzRdElE1MBXFREvCto5s699izFHNVvALUv79GXNbsOVqlwlOxlWJ8DuyOGIXoLP4JW/m30YyuTtfUJgMRMA==", + "dependencies": { + "@jimp/bmp": "^0.22.12", + "@jimp/gif": "^0.22.12", + "@jimp/jpeg": "^0.22.12", + "@jimp/png": "^0.22.12", + "@jimp/tiff": "^0.22.12", "timm": "^1.6.1" }, "peerDependencies": { @@ -911,17 +848,17 @@ } }, "node_modules/@jimp/utils": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.22.10.tgz", - "integrity": "sha512-ztlOK9Mm2iLG2AMoabzM4i3WZ/FtshcgsJCbZCRUs/DKoeS2tySRJTnQZ1b7Roq0M4Ce+FUAxnCAcBV0q7PH9w==", + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.22.12.tgz", + "integrity": "sha512-yJ5cWUknGnilBq97ZXOyOS0HhsHOyAyjHwYfHxGbSyMTohgQI6sVyE8KPgDwH8HHW/nMKXk8TrSwAE71zt716Q==", "dependencies": { "regenerator-runtime": "^0.13.3" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } @@ -1016,24 +953,24 @@ "dev": true }, "node_modules/@npmcli/agent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", - "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.1" + "socks-proxy-agent": "^8.0.3" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@npmcli/arborist": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.3.1.tgz", - "integrity": "sha512-qjMywu8clYczZE2SlLZWVOujAyiJEHHSEzapIXpuMURRH/tfY0KPKvGPyjvV041QsGN3tsWeaTUHcOi59wscSw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.4.0.tgz", + "integrity": "sha512-VFsUaTrV8NR+0E2I+xhp6pPC5eAbMmSMSMZbS57aogLc6du6HWBPATFOaiNWwp1QTFVeP4aLhYixQM9hHfaAsA==", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^3.1.0", @@ -1043,7 +980,7 @@ "@npmcli/name-from-folder": "^2.0.0", "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^5.0.0", - "@npmcli/query": "^3.0.1", + "@npmcli/query": "^3.1.0", "@npmcli/run-script": "^7.0.2", "bin-links": "^4.0.1", "cacache": "^18.0.0", @@ -1077,24 +1014,32 @@ } }, "node_modules/@npmcli/arborist/node_modules/@sigstore/bundle": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.1.tgz", - "integrity": "sha512-v3/iS+1nufZdKQ5iAlQKcCsoh0jffQyABvYIxKsZQFWc4ubuGjwZklFHpDgV6O6T7vvV78SW5NHI91HFKEcxKg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.2.0.tgz", + "integrity": "sha512-5VI58qgNs76RDrwXNhpmyN/jKpq9evV/7f1XrcqcAfvxDl5SeVY/I5Rmfe96ULAV7/FK5dge9RBKGBJPhL1WsQ==", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1" + "@sigstore/protobuf-specs": "^0.3.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@npmcli/arborist/node_modules/@sigstore/protobuf-specs": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.1.tgz", + "integrity": "sha512-aIL8Z9NsMr3C64jyQzE0XlkEyBLpgEJJFDHLVVStkFV5Q3Il/r/YtY6NJWKQ4cy4AE7spP1IX5Jq7VCAxHHMfQ==", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/@npmcli/arborist/node_modules/@sigstore/sign": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.1.tgz", - "integrity": "sha512-U5sKQEj+faE1MsnLou1f4DQQHeFZay+V9s9768lw48J4pKykPj34rWyI1lsMOGJ3Mae47Ye6q3HAJvgXO21rkQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.3.tgz", + "integrity": "sha512-LqlA+ffyN02yC7RKszCdMTS6bldZnIodiox+IkT8B2f8oRYXCB3LQ9roXeiEL21m64CVH1wyveYAORfD65WoSw==", "dependencies": { - "@sigstore/bundle": "^2.1.1", - "@sigstore/core": "^0.2.0", - "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.0", "make-fetch-happen": "^13.0.0" }, "engines": { @@ -1102,11 +1047,11 @@ } }, "node_modules/@npmcli/arborist/node_modules/@sigstore/tuf": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.0.tgz", - "integrity": "sha512-S98jo9cpJwO1mtQ+2zY7bOdcYyfVYCUaofCG6wWRzk3pxKHVAkSfshkfecto2+LKsx7Ovtqbgb2LS8zTRhxJ9Q==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.2.tgz", + "integrity": "sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w==", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/protobuf-specs": "^0.3.0", "tuf-js": "^2.2.0" }, "engines": { @@ -1134,15 +1079,15 @@ } }, "node_modules/@npmcli/arborist/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -1155,9 +1100,9 @@ } }, "node_modules/@npmcli/arborist/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1233,16 +1178,16 @@ } }, "node_modules/@npmcli/arborist/node_modules/sigstore": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.2.0.tgz", - "integrity": "sha512-fcU9clHwEss2/M/11FFM8Jwc4PjBgbhXoNskoK5guoK0qGQBSeUbQZRJ+B2fDFIvhyf0gqCaPrel9mszbhAxug==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.2.2.tgz", + "integrity": "sha512-2A3WvXkQurhuMgORgT60r6pOWiCOO5LlEqY2ADxGBDGVYLSo5HN0uLtb68YpVpuL/Vi8mLTe7+0Dx2Fq8lLqEg==", "dependencies": { - "@sigstore/bundle": "^2.1.1", - "@sigstore/core": "^0.2.0", - "@sigstore/protobuf-specs": "^0.2.1", - "@sigstore/sign": "^2.2.1", - "@sigstore/tuf": "^2.3.0", - "@sigstore/verify": "^0.1.0" + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.0", + "@sigstore/sign": "^2.2.3", + "@sigstore/tuf": "^2.3.1", + "@sigstore/verify": "^1.1.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -1320,15 +1265,15 @@ } }, "node_modules/@npmcli/map-workspaces/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -1341,9 +1286,9 @@ } }, "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1377,24 +1322,32 @@ } }, "node_modules/@npmcli/metavuln-calculator/node_modules/@sigstore/bundle": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.1.tgz", - "integrity": "sha512-v3/iS+1nufZdKQ5iAlQKcCsoh0jffQyABvYIxKsZQFWc4ubuGjwZklFHpDgV6O6T7vvV78SW5NHI91HFKEcxKg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.2.0.tgz", + "integrity": "sha512-5VI58qgNs76RDrwXNhpmyN/jKpq9evV/7f1XrcqcAfvxDl5SeVY/I5Rmfe96ULAV7/FK5dge9RBKGBJPhL1WsQ==", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1" + "@sigstore/protobuf-specs": "^0.3.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@npmcli/metavuln-calculator/node_modules/@sigstore/protobuf-specs": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.1.tgz", + "integrity": "sha512-aIL8Z9NsMr3C64jyQzE0XlkEyBLpgEJJFDHLVVStkFV5Q3Il/r/YtY6NJWKQ4cy4AE7spP1IX5Jq7VCAxHHMfQ==", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/@npmcli/metavuln-calculator/node_modules/@sigstore/sign": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.1.tgz", - "integrity": "sha512-U5sKQEj+faE1MsnLou1f4DQQHeFZay+V9s9768lw48J4pKykPj34rWyI1lsMOGJ3Mae47Ye6q3HAJvgXO21rkQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.3.tgz", + "integrity": "sha512-LqlA+ffyN02yC7RKszCdMTS6bldZnIodiox+IkT8B2f8oRYXCB3LQ9roXeiEL21m64CVH1wyveYAORfD65WoSw==", "dependencies": { - "@sigstore/bundle": "^2.1.1", - "@sigstore/core": "^0.2.0", - "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.0", "make-fetch-happen": "^13.0.0" }, "engines": { @@ -1402,11 +1355,11 @@ } }, "node_modules/@npmcli/metavuln-calculator/node_modules/@sigstore/tuf": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.0.tgz", - "integrity": "sha512-S98jo9cpJwO1mtQ+2zY7bOdcYyfVYCUaofCG6wWRzk3pxKHVAkSfshkfecto2+LKsx7Ovtqbgb2LS8zTRhxJ9Q==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.2.tgz", + "integrity": "sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w==", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/protobuf-specs": "^0.3.0", "tuf-js": "^2.2.0" }, "engines": { @@ -1434,15 +1387,15 @@ } }, "node_modules/@npmcli/metavuln-calculator/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -1455,9 +1408,9 @@ } }, "node_modules/@npmcli/metavuln-calculator/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1533,16 +1486,16 @@ } }, "node_modules/@npmcli/metavuln-calculator/node_modules/sigstore": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.2.0.tgz", - "integrity": "sha512-fcU9clHwEss2/M/11FFM8Jwc4PjBgbhXoNskoK5guoK0qGQBSeUbQZRJ+B2fDFIvhyf0gqCaPrel9mszbhAxug==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.2.2.tgz", + "integrity": "sha512-2A3WvXkQurhuMgORgT60r6pOWiCOO5LlEqY2ADxGBDGVYLSo5HN0uLtb68YpVpuL/Vi8mLTe7+0Dx2Fq8lLqEg==", "dependencies": { - "@sigstore/bundle": "^2.1.1", - "@sigstore/core": "^0.2.0", - "@sigstore/protobuf-specs": "^0.2.1", - "@sigstore/sign": "^2.2.1", - "@sigstore/tuf": "^2.3.0", - "@sigstore/verify": "^0.1.0" + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.0", + "@sigstore/sign": "^2.2.3", + "@sigstore/tuf": "^2.3.1", + "@sigstore/verify": "^1.1.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -1621,15 +1574,15 @@ } }, "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -1642,9 +1595,9 @@ } }, "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1675,9 +1628,9 @@ } }, "node_modules/@npmcli/query": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.0.1.tgz", - "integrity": "sha512-0jE8iHBogf/+bFDj+ju6/UMLbJ39c8h6nSe6qile+dB7PJ0iV3gNqcb2vtt6WWCBrxv9uAjzUT/8vroluulidA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz", + "integrity": "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -1769,9 +1722,9 @@ } }, "node_modules/@sigstore/core": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-0.2.0.tgz", - "integrity": "sha512-THobAPPZR9pDH2CAvDLpkrYedt7BlZnsyxDe+Isq4ZmGfPy5juOFZq487vCU2EgKD7aHSiTfE/i7sN7aEdzQnA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", "engines": { "node": "^16.14.0 || >=18.0.0" } @@ -1839,15 +1792,15 @@ } }, "node_modules/@sigstore/sign/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -1859,6 +1812,14 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@sigstore/sign/node_modules/glob/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/@sigstore/sign/node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -1918,9 +1879,9 @@ } }, "node_modules/@sigstore/sign/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1987,29 +1948,37 @@ } }, "node_modules/@sigstore/verify": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-0.1.0.tgz", - "integrity": "sha512-2UzMNYAa/uaz11NhvgRnIQf4gpLTJ59bhb8ESXaoSS5sxedfS+eLak8bsdMc+qpNQfITUTFoSKFx5h8umlRRiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.1.1.tgz", + "integrity": "sha512-BNANJms49rw9Q5J+fJjrDqOQSzjXDcOq/pgKDaVdDoIvQwqIfaoUriy+fQfh8sBX04hr4bkkrwu3EbhQqoQH7A==", "dependencies": { - "@sigstore/bundle": "^2.1.1", - "@sigstore/core": "^0.2.0", - "@sigstore/protobuf-specs": "^0.2.1" + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@sigstore/verify/node_modules/@sigstore/bundle": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.1.tgz", - "integrity": "sha512-v3/iS+1nufZdKQ5iAlQKcCsoh0jffQyABvYIxKsZQFWc4ubuGjwZklFHpDgV6O6T7vvV78SW5NHI91HFKEcxKg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.2.0.tgz", + "integrity": "sha512-5VI58qgNs76RDrwXNhpmyN/jKpq9evV/7f1XrcqcAfvxDl5SeVY/I5Rmfe96ULAV7/FK5dge9RBKGBJPhL1WsQ==", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1" + "@sigstore/protobuf-specs": "^0.3.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@sigstore/verify/node_modules/@sigstore/protobuf-specs": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.1.tgz", + "integrity": "sha512-aIL8Z9NsMr3C64jyQzE0XlkEyBLpgEJJFDHLVVStkFV5Q3Il/r/YtY6NJWKQ4cy4AE7spP1IX5Jq7VCAxHHMfQ==", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -2127,9 +2096,9 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", @@ -2167,9 +2136,9 @@ } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2365,9 +2334,9 @@ } }, "node_modules/@types/npmcli__package-json": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/npmcli__package-json/-/npmcli__package-json-4.0.3.tgz", - "integrity": "sha512-FafZwr1SnJEHlyPJeT5IRvsEjhvm3+dCNdy1OsAJZVrIKT0jNi3sFLbKRqVrHnnXEVI1rNljFGVEcuNG4PMuJw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/npmcli__package-json/-/npmcli__package-json-4.0.4.tgz", + "integrity": "sha512-6QjlFUSHBmZJWuC08bz1ZCx6tm4t+7+OJXAdvM6tL2pI7n6Bh5SIp/YxQvnOLFf8MzCXs2ijyFgrzaiu1UFBGA==", "dev": true }, "node_modules/@types/npmlog": { @@ -2662,9 +2631,9 @@ "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==" }, "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dependencies": { "debug": "^4.3.4" }, @@ -2976,6 +2945,11 @@ "node": ">=0.10.0" } }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -3145,11 +3119,14 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bindings": { @@ -3331,15 +3308,15 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -3352,9 +3329,9 @@ } }, "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3436,14 +3413,19 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4510,17 +4492,20 @@ "dev": true }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-lazy-prop": { @@ -4606,10 +4591,19 @@ "node": ">=8" } }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "engines": { "node": ">=0.3.1" } @@ -4723,6 +4717,27 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es6-promise": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-0.1.2.tgz", @@ -4730,9 +4745,9 @@ "dev": true }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -4863,9 +4878,9 @@ } }, "node_modules/execa/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -5037,9 +5052,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", - "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dependencies": { "reusify": "^1.0.4" } @@ -5170,14 +5185,14 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -5266,10 +5281,14 @@ } }, "node_modules/formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", + "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0" + }, "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" } @@ -5410,16 +5429,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6710,21 +6733,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -6814,9 +6837,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -6833,6 +6856,14 @@ "he": "bin/he" } }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "engines": { + "node": ">=8" + } + }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -6877,9 +6908,9 @@ "dev": true }, "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -6889,9 +6920,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6988,9 +7019,9 @@ } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7106,9 +7137,9 @@ } }, "node_modules/ios-sim-portable": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/ios-sim-portable/-/ios-sim-portable-4.4.1.tgz", - "integrity": "sha512-8g/IlCaIQ+2IAe1qrMq2HO2Y+D4pnSk3l5NpabmCiNB/f367Db4a8MVFBVPS9jY65Ao57UedP6kaFFAUPoLnsA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/ios-sim-portable/-/ios-sim-portable-4.5.0.tgz", + "integrity": "sha512-fJ6HewuZh6uoUkljXbTZF1MhDiSUs33C6WWPd+M7UuwHsf0e6urjURvxSS5MkkSedIVJyY6vCRup781HieW7NQ==", "dependencies": { "bplist-parser": "0.3.2", "lodash": "4.17.21", @@ -7124,10 +7155,22 @@ "node": ">=6.0.0" } }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" }, "node_modules/is-absolute": { "version": "1.0.0", @@ -7656,6 +7699,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, "node_modules/jsmin2": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/jsmin2/-/jsmin2-1.2.1.tgz", @@ -8695,12 +8743,12 @@ } }, "node_modules/mergexml": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/mergexml/-/mergexml-1.2.3.tgz", - "integrity": "sha512-sNc9qswtLUoGmN0MB3dY+MCIJqCGEZZrtYp0Z5Iwsk6ELc/V96SFIuv5Y6O6tYAsFtdpJcPFV0FgOSHSciJLbA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/mergexml/-/mergexml-1.2.4.tgz", + "integrity": "sha512-yiOlDqcVCz7AG1eSboonc18FTlfqDEKYfGoAV3Lul98u6YRV/s0kjtf4bjk47t0hLTFJR0BSYMd6BpmX3xDjNQ==", "dependencies": { "@xmldom/xmldom": "^0.7.0", - "formidable": "^1.2.1", + "formidable": "^3.5.1", "xpath": "0.0.27" } }, @@ -9236,9 +9284,9 @@ } }, "node_modules/nan": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", - "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", "dev": true, "optional": true }, @@ -9328,9 +9376,9 @@ } }, "node_modules/nativescript-dev-xcode": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/nativescript-dev-xcode/-/nativescript-dev-xcode-0.6.0.tgz", - "integrity": "sha512-8LAQZgX5SXABbcPsBpcRHc+qlJEufC1S0AmfZA03abMhaLgvWzo3SREuePz46XEDtj50DZvPN840SIzv1t26Fw==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/nativescript-dev-xcode/-/nativescript-dev-xcode-0.7.0.tgz", + "integrity": "sha512-L0oe44Kqeqzv9kBzBwGnyh0KJ1bVWNQEiLMRE9l7EyIC/mdoajaz/1hTZEq9JmKuUB8CQ4i7CK/f9WvyDJ9sxw==", "dependencies": { "simple-plist": "1.3.1", "uuid": "9.0.1" @@ -9452,9 +9500,9 @@ } }, "node_modules/node-gyp": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", - "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", + "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", @@ -9483,15 +9531,15 @@ } }, "node_modules/node-gyp/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -9504,9 +9552,9 @@ } }, "node_modules/node-gyp/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -10275,15 +10323,15 @@ } }, "node_modules/pacote/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -10508,9 +10556,9 @@ } }, "node_modules/pacote/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -10791,12 +10839,12 @@ "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==" }, "node_modules/parse-bmfont-xml": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", - "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz", + "integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==", "dependencies": { "xml-parse-from-string": "^1.0.0", - "xml2js": "^0.4.5" + "xml2js": "^0.5.0" } }, "node_modules/parse-conflict-json": { @@ -10924,11 +10972,11 @@ } }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { @@ -11005,7 +11053,13 @@ "node_modules/phin": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info." + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -11096,9 +11150,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11291,12 +11345,12 @@ } }, "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", + "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -11425,15 +11479,15 @@ } }, "node_modules/read-package-json/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -11465,9 +11519,9 @@ } }, "node_modules/read-package-json/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12363,16 +12417,17 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "dependencies": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12479,14 +12534,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12557,15 +12616,15 @@ } }, "node_modules/sigstore/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -12577,6 +12636,14 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/sigstore/node_modules/glob/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/sigstore/node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -12636,9 +12703,9 @@ } }, "node_modules/sigstore/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12904,24 +12971,24 @@ } }, "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", + "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.1", "debug": "^4.3.4", "socks": "^2.7.1" }, @@ -12987,9 +13054,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz", - "integrity": "sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", @@ -13001,9 +13068,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==" }, "node_modules/split": { "version": "1.0.1", @@ -13589,14 +13656,11 @@ "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" }, "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "engines": { - "node": ">=8.17.0" + "node": ">=14.14" } }, "node_modules/to-object-path": { @@ -13898,15 +13962,15 @@ } }, "node_modules/tuf-js/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -13918,6 +13982,14 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/tuf-js/node_modules/glob/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/tuf-js/node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -13977,9 +14049,9 @@ } }, "node_modules/tuf-js/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, diff --git a/package.json b/package.json index b9905fea6d..e76c987490 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "nativescript", "preferGlobal": true, - "version": "8.6.6", + "version": "8.7.0-rc.2", "author": "NativeScript ", "description": "Command-line interface for building NativeScript projects", "bin": { @@ -77,7 +77,7 @@ "glob": "9.3.4", "ios-device-lib": "0.9.3", "ios-mobileprovision-finder": "1.1.0", - "ios-sim-portable": "4.4.1", + "ios-sim-portable": "4.5.0", "jimp": "0.22.10", "lodash": "4.17.21", "log4js": "6.9.1", diff --git a/test/ios-entitlements-service.ts b/test/ios-entitlements-service.ts index 842ef0bbcd..455e9900fe 100644 --- a/test/ios-entitlements-service.ts +++ b/test/ios-entitlements-service.ts @@ -39,6 +39,8 @@ describe("IOSEntitlements Service Tests", () => { testInjector.register("tempService", stubs.TempServiceStub); + testInjector.register("options", {}); + return testInjector; }; @@ -57,22 +59,23 @@ describe("IOSEntitlements Service Tests", () => { projectData.platformsDir = temp.mkdirSync("platformsDir"); projectData.projectDir = temp.mkdirSync("projectDir"); projectData.appDirectoryPath = projectData.getAppDirectoryPath(); - projectData.appResourcesDirectoryPath = projectData.getAppResourcesDirectoryPath(); + projectData.appResourcesDirectoryPath = + projectData.getAppResourcesDirectoryPath(); fs = injector.resolve("$fs"); iOSEntitlementsService = injector.resolve("iOSEntitlementsService"); - destinationFilePath = iOSEntitlementsService.getPlatformsEntitlementsPath( - projectData - ); + destinationFilePath = + iOSEntitlementsService.getPlatformsEntitlementsPath(projectData); }); describe("Ensure paths constructed are correct", () => { it("Ensure destination entitlements relative path is calculated correctly.", () => { const expected = path.join("testApp", "testApp.entitlements"); - const actual = iOSEntitlementsService.getPlatformsEntitlementsRelativePath( - projectData - ); + const actual = + iOSEntitlementsService.getPlatformsEntitlementsRelativePath( + projectData + ); assert.equal(actual, expected); }); @@ -83,9 +86,8 @@ describe("IOSEntitlements Service Tests", () => { "testApp", "testApp.entitlements" ); - const actual = iOSEntitlementsService.getPlatformsEntitlementsPath( - projectData - ); + const actual = + iOSEntitlementsService.getPlatformsEntitlementsPath(projectData); assert.equal(actual, expected); }); }); diff --git a/test/ios-project-service.ts b/test/ios-project-service.ts index 9c6dd5f9be..330976a257 100644 --- a/test/ios-project-service.ts +++ b/test/ios-project-service.ts @@ -50,6 +50,7 @@ import { IPluginData } from "../lib/definitions/plugins"; import { IXcconfigService } from "../lib/declarations"; import { IInjector } from "../lib/common/definitions/yok"; import { IStringDictionary, IFileSystem } from "../lib/common/declarations"; +import { DevicePlatformsConstants } from "../lib/common/mobile/device-platforms-constants"; temp.track(); class IOSSimulatorDiscoveryMock extends DeviceDiscovery { @@ -120,7 +121,7 @@ function createTestInjector( testInjector.register("staticConfig", ConfigLib.StaticConfig); testInjector.register("projectDataService", ProjectDataServiceStub); testInjector.register("prompter", {}); - testInjector.register("devicePlatformsConstants", { iOS: "iOS" }); + testInjector.register("devicePlatformsConstants", DevicePlatformsConstants); testInjector.register("devicesService", DevicesService); testInjector.register("iOSDeviceDiscovery", IOSDeviceDiscovery); testInjector.register("iOSSimulatorDiscovery", IOSSimulatorDiscoveryMock); @@ -1159,9 +1160,8 @@ describe("Merge Project XCConfig files", () => { for (const release in [true, false]) { await (iOSProjectService).mergeProjectXcconfigFiles(projectData); - const destinationFilePaths = xcconfigService.getPluginsXcconfigFilePaths( - projectRoot - ); + const destinationFilePaths = + xcconfigService.getPluginsXcconfigFilePaths(projectRoot); _.each(destinationFilePaths, (destinationFilePath) => { assert.isTrue( @@ -1197,9 +1197,8 @@ describe("Merge Project XCConfig files", () => { release, }); - const destinationFilePaths = xcconfigService.getPluginsXcconfigFilePaths( - projectRoot - ); + const destinationFilePaths = + xcconfigService.getPluginsXcconfigFilePaths(projectRoot); _.each(destinationFilePaths, (destinationFilePath) => { assert.isTrue( @@ -1207,9 +1206,10 @@ describe("Merge Project XCConfig files", () => { "Target build xcconfig is missing for release: " + release ); const expected = { - CODE_SIGN_ENTITLEMENTS: iOSEntitlementsService.getPlatformsEntitlementsRelativePath( - projectData - ), + CODE_SIGN_ENTITLEMENTS: + iOSEntitlementsService.getPlatformsEntitlementsRelativePath( + projectData + ), }; assertPropertyValues(expected, destinationFilePath, testInjector); }); @@ -1226,9 +1226,8 @@ describe("Merge Project XCConfig files", () => { await (iOSProjectService).mergeProjectXcconfigFiles(projectData); - const destinationFilePaths = xcconfigService.getPluginsXcconfigFilePaths( - projectRoot - ); + const destinationFilePaths = + xcconfigService.getPluginsXcconfigFilePaths(projectRoot); _.each(destinationFilePaths, (destinationFilePath) => { assert.isTrue( @@ -1248,9 +1247,8 @@ describe("Merge Project XCConfig files", () => { it("creates empty plugins-.xcconfig in case there are no build.xcconfig in App_Resources and in plugins", async () => { await (iOSProjectService).mergeProjectXcconfigFiles(projectData); - const destinationFilePaths = xcconfigService.getPluginsXcconfigFilePaths( - projectRoot - ); + const destinationFilePaths = + xcconfigService.getPluginsXcconfigFilePaths(projectRoot); _.each(destinationFilePaths, (destinationFilePath) => { assert.isTrue( @@ -1279,7 +1277,8 @@ describe("handleNativeDependenciesChange", () => { cocoapodsService.mergePodXcconfigFile = async () => executedCocoapodsMethods.push("podMerge"); cocoapodsService.applyPodfileFromAppResources = async () => ({}); - cocoapodsService.removeDuplicatedPlatfomsFromProjectPodFile = async () => ({}); + cocoapodsService.removeDuplicatedPlatfomsFromProjectPodFile = + async () => ({}); cocoapodsService.getProjectPodfilePath = () => projectPodfilePath; const fs = testInjector.resolve("fs"); diff --git a/test/project-changes-service.ts b/test/project-changes-service.ts index afb7a42835..97784fdd31 100644 --- a/test/project-changes-service.ts +++ b/test/project-changes-service.ts @@ -45,6 +45,7 @@ class ProjectChangesServiceTest extends BaseServiceTest { this.injector.register("logger", LoggerStub); this.injector.register("hooksService", HooksServiceStub); this.injector.register("nodeModulesDependenciesBuilder", {}); + this.injector.register("options", {}); const fs = this.injector.resolve("fs"); fs.writeJson(path.join(this.projectDir, Constants.PACKAGE_JSON_FILE_NAME), { @@ -124,9 +125,10 @@ describe("Project Changes Service Tests", () => { describe("Get Prepare Info File Path", () => { it("Gets the correct Prepare Info path for ios/android", () => { for (const platform of ["ios", "android"]) { - const actualPrepareInfoPath = serviceTest.projectChangesService.getPrepareInfoFilePath( - serviceTest.getPlatformData(platform) - ); + const actualPrepareInfoPath = + serviceTest.projectChangesService.getPrepareInfoFilePath( + serviceTest.getPlatformData(platform) + ); const expectedPrepareInfoPath = path.join( serviceTest.projectDir, @@ -175,9 +177,10 @@ describe("Project Changes Service Tests", () => { fs.writeJson(prepareInfoPath, expectedPrepareInfo); // act - const actualPrepareInfo = serviceTest.projectChangesService.getPrepareInfo( - serviceTest.getPlatformData(platform) - ); + const actualPrepareInfo = + serviceTest.projectChangesService.getPrepareInfo( + serviceTest.getPlatformData(platform) + ); // assert assert.deepStrictEqual(actualPrepareInfo, expectedPrepareInfo); @@ -187,14 +190,15 @@ describe("Project Changes Service Tests", () => { describe("Accumulates Changes From Project Services", () => { it("accumulates changes from the project service", async () => { - const iOSChanges = await serviceTest.projectChangesService.checkForChanges( - serviceTest.getPlatformData("ios"), - serviceTest.projectData, - { - provision: undefined, - teamId: undefined, - } - ); + const iOSChanges = + await serviceTest.projectChangesService.checkForChanges( + serviceTest.getPlatformData("ios"), + serviceTest.projectData, + { + provision: undefined, + teamId: undefined, + } + ); assert.isTrue( !!iOSChanges.signingChanged, "iOS signingChanged expected to be true" @@ -214,9 +218,10 @@ describe("Project Changes Service Tests", () => { } ); - const actualPrepareInfo = serviceTest.projectChangesService.getPrepareInfo( - serviceTest.getPlatformData(platform) - ); + const actualPrepareInfo = + serviceTest.projectChangesService.getPrepareInfo( + serviceTest.getPlatformData(platform) + ); assert.deepStrictEqual(actualPrepareInfo, { nativePlatformStatus: Constants.NativePlatformStatus.requiresPrepare, @@ -249,9 +254,10 @@ describe("Project Changes Service Tests", () => { } ); - const actualPrepareInfo = serviceTest.projectChangesService.getPrepareInfo( - serviceTest.getPlatformData(platform) - ); + const actualPrepareInfo = + serviceTest.projectChangesService.getPrepareInfo( + serviceTest.getPlatformData(platform) + ); prepareInfo.nativePlatformStatus = Constants.NativePlatformStatus.alreadyPrepared; assert.deepStrictEqual(actualPrepareInfo, prepareInfo); @@ -277,9 +283,10 @@ describe("Project Changes Service Tests", () => { { nativePlatformStatus: nativePlatformStatus } ); - const actualPrepareInfo = serviceTest.projectChangesService.getPrepareInfo( - serviceTest.getPlatformData(platform) - ); + const actualPrepareInfo = + serviceTest.projectChangesService.getPrepareInfo( + serviceTest.getPlatformData(platform) + ); assert.deepStrictEqual(actualPrepareInfo, { nativePlatformStatus: nativePlatformStatus, }); diff --git a/test/project-commands.ts b/test/project-commands.ts index 4a3f8e245e..3b993d899b 100644 --- a/test/project-commands.ts +++ b/test/project-commands.ts @@ -61,18 +61,57 @@ const templateChoices = { key: "Tabs", description: "An app with pre-built pages that uses tabs for navigation", }, + vision: { + description: "A visionOS app", + key: "visionOS", + }, +}; +// const expectedTemplateChoices = [ +// templateChoices.helloWorld, +// templateChoices.sideDrawer, +// templateChoices.tabs, +// ]; +// const expectedTemplateChoicesVue = [ +// templateChoices.blank, +// templateChoices.blankTypeScript, +// templateChoices.sideDrawer, +// templateChoices.tabs, +// ]; + +const expectedTemplateChoices: Record = { + [constants.JsFlavorName]: [ + templateChoices.helloWorld, + templateChoices.sideDrawer, + templateChoices.tabs, + ], + [constants.TsFlavorName]: [ + templateChoices.helloWorld, + templateChoices.sideDrawer, + templateChoices.tabs, + templateChoices.vision, + ], + [constants.NgFlavorName]: [ + templateChoices.helloWorld, + templateChoices.sideDrawer, + templateChoices.tabs, + templateChoices.vision, + ], + [constants.VueFlavorName]: [ + templateChoices.blank, + templateChoices.blankTypeScript, + templateChoices.sideDrawer, + templateChoices.tabs, + templateChoices.vision, + ], + [constants.ReactFlavorName]: [ + templateChoices.helloWorld, + templateChoices.vision, + ], + [constants.SvelteFlavorName]: [ + templateChoices.helloWorld, + templateChoices.vision, + ], }; -const expectedTemplateChoices = [ - templateChoices.helloWorld, - templateChoices.sideDrawer, - templateChoices.tabs, -]; -const expectedTemplateChoicesVue = [ - templateChoices.blank, - templateChoices.blankTypeScript, - templateChoices.sideDrawer, - templateChoices.tabs, -]; class ProjectServiceMock implements IProjectService { async validateProjectName(opts: { @@ -157,10 +196,12 @@ describe("Project commands tests", () => { ? "Finally" : "Next, which template would you like to start from:"; answers[templateQuestion] = opts.templateAnswer; + + if (opts.flavorAnswer in expectedTemplateChoices === false) { + throw new Error(`Unexpected flavorAnswer: ${opts.flavorAnswer}`); + } questionChoices[templateQuestion] = - opts.flavorAnswer === constants.VueFlavorName - ? expectedTemplateChoicesVue - : expectedTemplateChoices; + expectedTemplateChoices[opts.flavorAnswer]; } prompterStub.expect({ diff --git a/test/services/ios/xcodebuild-args-service.ts b/test/services/ios/xcodebuild-args-service.ts index a615ab0889..1dea63bb8b 100644 --- a/test/services/ios/xcodebuild-args-service.ts +++ b/test/services/ios/xcodebuild-args-service.ts @@ -76,42 +76,47 @@ describe("xcodebuildArgsService", () => { _.each([true, false], (hasProjectWorkspace) => { _.each(["INFO", "TRACE"], (logLevel) => { _.each(["Debug", "Release"], (configuration) => { - it(`should return correct args when workspace is ${hasProjectWorkspace} with ${logLevel} log level and ${configuration} configuration`, async () => { - const injector = createTestInjector({ - logLevel, - hasProjectWorkspace, - }); + _.each(["iOS", "visionOS"], (platform) => { + it(`should return correct args when workspace is ${hasProjectWorkspace} with ${logLevel} log level and ${configuration} configuration (platform = ${platform})`, async () => { + const injector = createTestInjector({ + logLevel, + hasProjectWorkspace, + }); - const buildConfig = { - buildForDevice: false, - release: configuration === "Release", - }; - const xcodebuildArgsService = injector.resolve( - "xcodebuildArgsService" - ); - const actualArgs = - await xcodebuildArgsService.getBuildForSimulatorArgs( - { projectRoot, normalizedPlatformName }, - { projectName, appResourcesDirectoryPath }, - buildConfig + const buildConfig = { + buildForDevice: false, + release: configuration === "Release", + platform, + }; + const xcodebuildArgsService = injector.resolve( + "xcodebuildArgsService" ); + const actualArgs = + await xcodebuildArgsService.getBuildForSimulatorArgs( + { projectRoot, normalizedPlatformName }, + { projectName, appResourcesDirectoryPath }, + buildConfig + ); - const expectedArgs = [ - "ONLY_ACTIVE_ARCH=NO", - "CODE_SIGN_IDENTITY=", - "-destination", - "generic/platform=iOS Simulator", - "build", - "-configuration", - configuration, - "-sdk", - "iphonesimulator", - ] - .concat(getCommonArgs()) - .concat(getBuildLoggingArgs(logLevel)) - .concat(getXcodeProjectArgs({ hasProjectWorkspace })); + const expectedArgs = [ + `ONLY_ACTIVE_ARCH=${platform === "visionOS" ? "YES" : "NO"}`, + "CODE_SIGN_IDENTITY=", + "-destination", + platform === "visionOS" + ? "platform=visionOS Simulator" + : "generic/platform=iOS Simulator", + "build", + "-configuration", + configuration, + "-sdk", + platform === "visionOS" ? "xrsimulator" : "iphonesimulator", + ] + .concat(getCommonArgs()) + .concat(getBuildLoggingArgs(logLevel)) + .concat(getXcodeProjectArgs({ hasProjectWorkspace })); - assert.deepStrictEqual(actualArgs, expectedArgs); + assert.deepStrictEqual(actualArgs, expectedArgs); + }); }); }); }); @@ -164,6 +169,7 @@ describe("xcodebuildArgsService", () => { const buildConfig = { buildForDevice: true, release: configuration === "Release", + platform: "ios", }; const xcodebuildArgsService: IXcodebuildArgsService = injector.resolve("xcodebuildArgsService"); diff --git a/test/stubs.ts b/test/stubs.ts index 82aafdd215..39f1f012b5 100644 --- a/test/stubs.ts +++ b/test/stubs.ts @@ -387,7 +387,8 @@ export class ErrorsStub implements IErrors { } export class PackageInstallationManagerStub - implements IPackageInstallationManager { + implements IPackageInstallationManager +{ clearInspectorCache(): void { return undefined; } @@ -733,7 +734,8 @@ export class ProjectDataStub implements IProjectData { } export class AndroidPluginBuildServiceStub - implements IAndroidPluginBuildService { + implements IAndroidPluginBuildService +{ buildAar(options: IPluginBuildOptions): Promise { return Promise.resolve(true); } @@ -745,7 +747,8 @@ export class AndroidPluginBuildServiceStub export class PlatformProjectServiceStub extends EventEmitter - implements IPlatformProjectService { + implements IPlatformProjectService +{ constructor(private platform: string) { super(); } @@ -888,7 +891,8 @@ export class PlatformProjectServiceStub export class NativeProjectDataStub extends EventEmitter - implements IPlatformsDataService { + implements IPlatformsDataService +{ public platformNames: string[]; public getPlatformData( @@ -1126,7 +1130,8 @@ function unexpected(msg: string): Error { export class DebugServiceStub extends EventEmitter - implements IDeviceDebugService { + implements IDeviceDebugService +{ public async debug(): Promise { return; } @@ -1140,7 +1145,8 @@ export class DebugServiceStub export class LiveSyncServiceStub extends EventEmitter - implements ILiveSyncService { + implements ILiveSyncService +{ public async liveSync( deviceDescriptors: ILiveSyncDeviceDescriptor[], liveSyncData: ILiveSyncInfo @@ -1308,7 +1314,8 @@ export class CommandsService implements ICommandsService { } export class AndroidResourcesMigrationServiceStub - implements IAndroidResourcesMigrationService { + implements IAndroidResourcesMigrationService +{ canMigrate(platformString: string): boolean { return true; } @@ -1323,7 +1330,8 @@ export class AndroidResourcesMigrationServiceStub } export class AndroidBundleValidatorHelper - implements IAndroidBundleValidatorHelper { + implements IAndroidBundleValidatorHelper +{ validateDeviceApiLevel(device: Mobile.IDevice, buildData: IBuildData): void { return; }