From 631bf672922f01ac68e70b1ce620f2dd4753c640 Mon Sep 17 00:00:00 2001 From: muyao Date: Tue, 3 Mar 2026 14:21:33 +0800 Subject: [PATCH 1/5] update version_client --- eng/versioning/version_client.txt | 110 +++++++++++++++--------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index 31494130db38..c0403e10acd2 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -212,61 +212,61 @@ com.microsoft.azure:azure-eventhubs-eph;3.3.0;3.4.0-beta.1 com.microsoft.azure:azure-servicebus;3.6.7;3.7.0-beta.1 com.microsoft.azure:azure-media;1.0.0-beta.1;1.0.0-beta.1 com.azure.spring:azure-monitor-spring-native-test;1.0.0-beta.1;1.0.0-beta.1 -com.azure.spring:spring-cloud-azure-appconfiguration-config-web;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-appconfiguration-config;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-feature-management-web;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-feature-management;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-appconfiguration-config;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-dependencies;5.23.0;5.24.1 -com.azure.spring:spring-messaging-azure;5.23.0;5.24.1 -com.azure.spring:spring-messaging-azure-eventhubs;5.23.0;5.24.1 -com.azure.spring:spring-messaging-azure-servicebus;5.23.0;5.24.1 -com.azure.spring:spring-messaging-azure-storage-queue;5.23.0;5.24.1 -com.azure.spring:spring-integration-azure-core;5.23.0;5.24.1 -com.azure.spring:spring-integration-azure-eventhubs;5.23.0;5.24.1 -com.azure.spring:spring-integration-azure-servicebus;5.23.0;5.24.1 -com.azure.spring:spring-integration-azure-storage-queue;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-core;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-actuator-autoconfigure;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-actuator;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-autoconfigure;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-docker-compose;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-resourcemanager;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-service;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-active-directory;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-active-directory-b2c;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-actuator;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-appconfiguration;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-cosmos;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-data-cosmos;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-data-redis-lettuce;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-eventhubs;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-eventgrid;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-jdbc-mysql;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-jdbc-postgresql;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-keyvault;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-keyvault-certificates;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-keyvault-jca;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-keyvault-secrets;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-monitor;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-servicebus-jms;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-servicebus;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-storage;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-storage-blob;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-storage-file-share;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-storage-queue;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-integration-eventhubs;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-integration-servicebus;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-integration-storage-queue;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-stream-eventhubs;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter-stream-servicebus;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-starter;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-stream-binder-eventhubs-core;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-stream-binder-eventhubs;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-stream-binder-servicebus-core;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-stream-binder-servicebus;5.23.0;5.24.1 -com.azure.spring:spring-cloud-azure-testcontainers;5.23.0;5.24.1 -com.azure:azure-spring-data-cosmos;5.23.0;5.24.1 +com.azure.spring:spring-cloud-azure-appconfiguration-config-web;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-appconfiguration-config;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-feature-management-web;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-feature-management;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-appconfiguration-config;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-dependencies;5.23.0;5.25.0 +com.azure.spring:spring-messaging-azure;5.23.0;5.25.0 +com.azure.spring:spring-messaging-azure-eventhubs;5.23.0;5.25.0 +com.azure.spring:spring-messaging-azure-servicebus;5.23.0;5.25.0 +com.azure.spring:spring-messaging-azure-storage-queue;5.23.0;5.25.0 +com.azure.spring:spring-integration-azure-core;5.23.0;5.25.0 +com.azure.spring:spring-integration-azure-eventhubs;5.23.0;5.25.0 +com.azure.spring:spring-integration-azure-servicebus;5.23.0;5.25.0 +com.azure.spring:spring-integration-azure-storage-queue;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-core;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-actuator-autoconfigure;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-actuator;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-autoconfigure;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-docker-compose;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-resourcemanager;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-service;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-active-directory;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-active-directory-b2c;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-actuator;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-appconfiguration;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-cosmos;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-data-cosmos;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-data-redis-lettuce;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-eventhubs;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-eventgrid;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-jdbc-mysql;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-jdbc-postgresql;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-keyvault;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-keyvault-certificates;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-keyvault-jca;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-keyvault-secrets;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-monitor;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-servicebus-jms;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-servicebus;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-storage;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-storage-blob;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-storage-file-share;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-storage-queue;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-integration-eventhubs;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-integration-servicebus;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-integration-storage-queue;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-stream-eventhubs;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter-stream-servicebus;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-starter;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-stream-binder-eventhubs-core;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-stream-binder-eventhubs;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-stream-binder-servicebus-core;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-stream-binder-servicebus;5.23.0;5.25.0 +com.azure.spring:spring-cloud-azure-testcontainers;5.23.0;5.25.0 +com.azure:azure-spring-data-cosmos;5.23.0;5.25.0 com.azure.resourcemanager:azure-resourcemanager;2.53.0;2.54.0-beta.1 com.azure.resourcemanager:azure-resourcemanager-appplatform;2.50.3;2.51.0-beta.1 com.azure.resourcemanager:azure-resourcemanager-appservice;2.53.0;2.54.0-beta.1 From 73ab208d8716810c25629a1ebd764bfa73a848ff Mon Sep 17 00:00:00 2001 From: muyao Date: Tue, 3 Mar 2026 15:06:55 +0800 Subject: [PATCH 2/5] update version/readme/changelog --- .../spring-cloud-azure-dependencies/pom.xml | 2 +- sdk/spring/CHANGELOG.md | 8 +++++- sdk/spring/README.md | 2 +- .../azure-spring-data-cosmos/CHANGELOG.md | 5 ++++ sdk/spring/azure-spring-data-cosmos/README.md | 2 +- sdk/spring/azure-spring-data-cosmos/pom.xml | 2 +- .../CHANGELOG.md | 4 +++ .../pom.xml | 8 +++--- .../spring-cloud-azure-actuator/CHANGELOG.md | 4 +++ .../spring-cloud-azure-actuator/pom.xml | 4 +-- .../CHANGELOG.md | 4 +++ .../pom.xml | 4 +-- .../CHANGELOG.md | 4 +++ .../pom.xml | 6 ++--- .../CHANGELOG.md | 4 +++ .../spring-cloud-azure-autoconfigure/pom.xml | 14 +++++----- .../spring-cloud-azure-core/CHANGELOG.md | 4 +++ sdk/spring/spring-cloud-azure-core/pom.xml | 2 +- .../CHANGELOG.md | 4 +++ .../spring-cloud-azure-docker-compose/pom.xml | 6 ++--- .../CHANGELOG.md | 4 +++ .../pom.xml | 6 ++--- .../CHANGELOG.md | 4 +++ .../pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 26 +++++++++---------- .../CHANGELOG.md | 4 +++ .../pom.xml | 4 +-- .../spring-cloud-azure-service/CHANGELOG.md | 4 +++ sdk/spring/spring-cloud-azure-service/pom.xml | 4 +-- .../pom.xml | 4 +-- .../pom.xml | 4 +-- .../pom.xml | 6 ++--- .../CHANGELOG.md | 4 +++ .../README.md | 4 +-- .../pom.xml | 6 ++--- .../pom.xml | 4 +-- .../spring-cloud-azure-starter-cosmos/pom.xml | 4 +-- .../pom.xml | 6 ++--- .../pom.xml | 4 +-- .../pom.xml | 4 +-- .../pom.xml | 4 +-- .../pom.xml | 6 ++--- .../pom.xml | 6 ++--- .../pom.xml | 6 ++--- .../pom.xml | 4 +-- .../pom.xml | 4 +-- .../pom.xml | 4 +-- .../pom.xml | 4 +-- .../pom.xml | 4 +-- .../pom.xml | 8 +++--- .../pom.xml | 2 +- .../CHANGELOG.md | 4 +++ .../pom.xml | 2 +- .../pom.xml | 4 +-- .../pom.xml | 4 +-- .../pom.xml | 4 +-- .../pom.xml | 4 +-- .../pom.xml | 4 +-- .../pom.xml | 8 +++--- .../pom.xml | 4 +-- .../pom.xml | 4 +-- sdk/spring/spring-cloud-azure-starter/pom.xml | 4 +-- .../CHANGELOG.md | 4 +++ .../pom.xml | 4 +-- .../CHANGELOG.md | 4 +++ .../pom.xml | 8 +++--- .../CHANGELOG.md | 4 +++ .../pom.xml | 4 +-- .../CHANGELOG.md | 4 +++ .../pom.xml | 8 +++--- .../CHANGELOG.md | 4 +++ .../spring-cloud-azure-testcontainers/pom.xml | 8 +++--- .../CHANGELOG.md | 4 +++ .../spring-integration-azure-core/pom.xml | 4 +-- .../CHANGELOG.md | 4 +++ .../pom.xml | 8 +++--- .../CHANGELOG.md | 4 +++ .../pom.xml | 10 +++---- .../CHANGELOG.md | 4 +++ .../pom.xml | 6 ++--- .../CHANGELOG.md | 4 +++ .../spring-messaging-azure-eventhubs/pom.xml | 6 ++--- .../CHANGELOG.md | 4 +++ .../spring-messaging-azure-servicebus/pom.xml | 6 ++--- .../CHANGELOG.md | 4 +++ .../pom.xml | 6 ++--- .../spring-messaging-azure/CHANGELOG.md | 4 +++ sdk/spring/spring-messaging-azure/pom.xml | 4 +-- 89 files changed, 275 insertions(+), 160 deletions(-) diff --git a/sdk/boms/spring-cloud-azure-dependencies/pom.xml b/sdk/boms/spring-cloud-azure-dependencies/pom.xml index 8c053277820e..674575728119 100644 --- a/sdk/boms/spring-cloud-azure-dependencies/pom.xml +++ b/sdk/boms/spring-cloud-azure-dependencies/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-dependencies - 5.24.1 + 5.25.0 pom Spring Cloud Azure Dependencies diff --git a/sdk/spring/CHANGELOG.md b/sdk/spring/CHANGELOG.md index bbd52e3ef6df..647239845473 100644 --- a/sdk/spring/CHANGELOG.md +++ b/sdk/spring/CHANGELOG.md @@ -1,6 +1,8 @@ # Release History -## 5.25.0 (Not Released) +## 5.25.0 (2026-03-04) +- This release is compatible with Spring Boot 3.5.0-3.5.8, 3.4.0-3.4.12, 3.3.0-3.3.13, 3.2.0-3.2.12, 3.1.0-3.1.12. (Note: 3.5.x (x>8) should be supported, but they aren't tested with this release.) +- This release is compatible with Spring Cloud 2025.0.0, 2024.0.0-2024.0.2, 2023.0.0-2023.0.5, 2022.0.0-2022.0.5. (Note: 2025.0.x(x>0) should be supported, but they aren't tested with this release.) ### Spring Cloud Azure Autoconfigure @@ -29,6 +31,10 @@ This section includes changes in `spring-cloud-azure-testcontainers` module. - Add ServiceBusContainerConnectionDetailsFactory. [#44019](https://github.com/Azure/azure-sdk-for-java/pull/44019). - Add EventHubsContainerConnectionDetailsFactory. [#47926](https://github.com/Azure/azure-sdk-for-java/pull/47926). +### Azure Spring Data Cosmos +This section includes changes in `azure-spring-data-cosmos` module. +Please refer to [azure-spring-data-cosmos/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/spring/azure-spring-data-cosmos/CHANGELOG.md#5250-03-04) for more details. + ## 5.24.1 (2025-12-09) - This release is compatible with Spring Boot 3.5.0-3.5.8, 3.4.0-3.4.12, 3.3.0-3.3.13, 3.2.0-3.2.12, 3.1.0-3.1.12, 3.0.0-3.0.13. (Note: 3.5.x (x>8) and 3.4.y (y>12) should be supported, but they aren't tested with this release.) - This release is compatible with Spring Cloud 2025.0.0, 2024.0.0-2024.0.2, 2023.0.0-2023.0.5, 2022.0.0-2022.0.5. (Note: 2025.0.x(x>0) and 2024.0.y (y>2) should be supported, but they aren't tested with this release.) diff --git a/sdk/spring/README.md b/sdk/spring/README.md index 6809b4801868..d36cee580e0c 100644 --- a/sdk/spring/README.md +++ b/sdk/spring/README.md @@ -146,7 +146,7 @@ If you’re a Maven user, add our BOM to your pom.xml `` s com.azure.spring spring-cloud-azure-dependencies - 5.24.1 + 5.25.0 pom import diff --git a/sdk/spring/azure-spring-data-cosmos/CHANGELOG.md b/sdk/spring/azure-spring-data-cosmos/CHANGELOG.md index c7348eacc2d8..56b45455a884 100644 --- a/sdk/spring/azure-spring-data-cosmos/CHANGELOG.md +++ b/sdk/spring/azure-spring-data-cosmos/CHANGELOG.md @@ -1,5 +1,10 @@ ## Release History +### 5.25.0 (2026-03-04) + +#### Other Changes +* regular release + ### 5.24.1 (2025-12-09) #### Other Changes diff --git a/sdk/spring/azure-spring-data-cosmos/README.md b/sdk/spring/azure-spring-data-cosmos/README.md index 0ff09140e7d2..c4de54401ea2 100644 --- a/sdk/spring/azure-spring-data-cosmos/README.md +++ b/sdk/spring/azure-spring-data-cosmos/README.md @@ -100,7 +100,7 @@ If you are using Maven, add the following dependency. com.azure azure-spring-data-cosmos - 5.24.1 + 5.25.0 ``` [//]: # ({x-version-update-end}) diff --git a/sdk/spring/azure-spring-data-cosmos/pom.xml b/sdk/spring/azure-spring-data-cosmos/pom.xml index 54d66fe4652a..488e34785302 100644 --- a/sdk/spring/azure-spring-data-cosmos/pom.xml +++ b/sdk/spring/azure-spring-data-cosmos/pom.xml @@ -12,7 +12,7 @@ com.azure azure-spring-data-cosmos - 5.24.1 + 5.25.0 jar Spring Data for Azure Cosmos DB SQL API Spring Data for Azure Cosmos DB SQL API diff --git a/sdk/spring/spring-cloud-azure-actuator-autoconfigure/CHANGELOG.md b/sdk/spring/spring-cloud-azure-actuator-autoconfigure/CHANGELOG.md index 0ffeec3d01e6..0609cc0800ad 100644 --- a/sdk/spring/spring-cloud-azure-actuator-autoconfigure/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-actuator-autoconfigure/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-actuator-autoconfigure/pom.xml b/sdk/spring/spring-cloud-azure-actuator-autoconfigure/pom.xml index 138c93dbfea7..424edf54e649 100644 --- a/sdk/spring/spring-cloud-azure-actuator-autoconfigure/pom.xml +++ b/sdk/spring/spring-cloud-azure-actuator-autoconfigure/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-cloud-azure-actuator-autoconfigure - 5.24.1 + 5.25.0 Spring Cloud Azure Actuator AutoConfigure Spring Cloud Azure Starter Actuator AutoConfigure @@ -52,17 +52,17 @@ com.azure.spring spring-cloud-azure-actuator - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-autoconfigure - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-appconfiguration-config-web - 5.24.1 + 5.25.0 true diff --git a/sdk/spring/spring-cloud-azure-actuator/CHANGELOG.md b/sdk/spring/spring-cloud-azure-actuator/CHANGELOG.md index 0ffeec3d01e6..0609cc0800ad 100644 --- a/sdk/spring/spring-cloud-azure-actuator/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-actuator/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-actuator/pom.xml b/sdk/spring/spring-cloud-azure-actuator/pom.xml index c5e2d8c9970e..f8424d3bd70d 100644 --- a/sdk/spring/spring-cloud-azure-actuator/pom.xml +++ b/sdk/spring/spring-cloud-azure-actuator/pom.xml @@ -17,7 +17,7 @@ com.azure.spring spring-cloud-azure-actuator - 5.24.1 + 5.25.0 Spring Cloud Azure Actuator https://microsoft.github.io/spring-cloud-azure @@ -109,7 +109,7 @@ com.azure.spring spring-cloud-azure-appconfiguration-config-web - 5.24.1 + 5.25.0 true diff --git a/sdk/spring/spring-cloud-azure-appconfiguration-config-web/CHANGELOG.md b/sdk/spring/spring-cloud-azure-appconfiguration-config-web/CHANGELOG.md index d161976e7024..55e3f8c5fefe 100644 --- a/sdk/spring/spring-cloud-azure-appconfiguration-config-web/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-appconfiguration-config-web/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-appconfiguration-config-web/pom.xml b/sdk/spring/spring-cloud-azure-appconfiguration-config-web/pom.xml index d6288daf95b6..f020ea153044 100644 --- a/sdk/spring/spring-cloud-azure-appconfiguration-config-web/pom.xml +++ b/sdk/spring/spring-cloud-azure-appconfiguration-config-web/pom.xml @@ -9,7 +9,7 @@ 4.0.0 com.azure.spring spring-cloud-azure-appconfiguration-config-web - 5.24.1 + 5.25.0 Spring Cloud Azure App Configuration Config Web Integration of Spring Cloud Config and Azure App Configuration Service @@ -21,7 +21,7 @@ com.azure.spring spring-cloud-azure-appconfiguration-config - 5.24.1 + 5.25.0 org.springframework.boot diff --git a/sdk/spring/spring-cloud-azure-appconfiguration-config/CHANGELOG.md b/sdk/spring/spring-cloud-azure-appconfiguration-config/CHANGELOG.md index c885d1968d6e..7784f7edc46a 100644 --- a/sdk/spring/spring-cloud-azure-appconfiguration-config/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-appconfiguration-config/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-appconfiguration-config/pom.xml b/sdk/spring/spring-cloud-azure-appconfiguration-config/pom.xml index 6e820112d780..f887fffefdce 100644 --- a/sdk/spring/spring-cloud-azure-appconfiguration-config/pom.xml +++ b/sdk/spring/spring-cloud-azure-appconfiguration-config/pom.xml @@ -9,7 +9,7 @@ 4.0.0 com.azure.spring spring-cloud-azure-appconfiguration-config - 5.24.1 + 5.25.0 Spring Cloud Azure App Configuration Config Integration of Spring Cloud Config and Azure App Configuration Service @@ -69,12 +69,12 @@ com.azure.spring spring-cloud-azure-service - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-autoconfigure - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/CHANGELOG.md b/sdk/spring/spring-cloud-azure-autoconfigure/CHANGELOG.md index 0ffeec3d01e6..0609cc0800ad 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-autoconfigure/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/pom.xml b/sdk/spring/spring-cloud-azure-autoconfigure/pom.xml index e0fc14b5113e..82bcb6b598a5 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/pom.xml +++ b/sdk/spring/spring-cloud-azure-autoconfigure/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-cloud-azure-autoconfigure - 5.24.1 + 5.25.0 Spring Cloud Azure AutoConfigure Spring Cloud Azure AutoConfigure @@ -41,13 +41,13 @@ com.azure.spring spring-cloud-azure-service - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-resourcemanager - 5.24.1 + 5.25.0 true @@ -56,7 +56,7 @@ com.azure.spring spring-integration-azure-eventhubs - 5.24.1 + 5.25.0 true @@ -70,7 +70,7 @@ com.azure.spring spring-integration-azure-servicebus - 5.24.1 + 5.25.0 true @@ -78,7 +78,7 @@ com.azure.spring spring-integration-azure-storage-queue - 5.24.1 + 5.25.0 true @@ -120,7 +120,7 @@ com.azure azure-spring-data-cosmos - 5.24.1 + 5.25.0 true diff --git a/sdk/spring/spring-cloud-azure-core/CHANGELOG.md b/sdk/spring/spring-cloud-azure-core/CHANGELOG.md index 0ffeec3d01e6..0609cc0800ad 100644 --- a/sdk/spring/spring-cloud-azure-core/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-core/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-core/pom.xml b/sdk/spring/spring-cloud-azure-core/pom.xml index cce41171ce0f..8cd51c800a99 100644 --- a/sdk/spring/spring-cloud-azure-core/pom.xml +++ b/sdk/spring/spring-cloud-azure-core/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-cloud-azure-core - 5.24.1 + 5.25.0 Spring Cloud Azure Core https://microsoft.github.io/spring-cloud-azure diff --git a/sdk/spring/spring-cloud-azure-docker-compose/CHANGELOG.md b/sdk/spring/spring-cloud-azure-docker-compose/CHANGELOG.md index 120baab590a4..c8935c9aa3bf 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-docker-compose/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-docker-compose/pom.xml b/sdk/spring/spring-cloud-azure-docker-compose/pom.xml index fe468c9da775..8328dc69f7c6 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/pom.xml +++ b/sdk/spring/spring-cloud-azure-docker-compose/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-cloud-azure-docker-compose - 5.24.1 + 5.25.0 Spring Cloud Azure Docker Compose Spring Cloud Azure Docker Compose @@ -56,7 +56,7 @@ com.azure.spring spring-cloud-azure-autoconfigure - 5.24.1 + 5.25.0 true @@ -108,7 +108,7 @@ com.azure.spring spring-messaging-azure-servicebus - 5.24.1 + 5.25.0 test diff --git a/sdk/spring/spring-cloud-azure-feature-management-web/CHANGELOG.md b/sdk/spring/spring-cloud-azure-feature-management-web/CHANGELOG.md index 8377305fd06e..a6d452bb71ef 100644 --- a/sdk/spring/spring-cloud-azure-feature-management-web/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-feature-management-web/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-feature-management-web/pom.xml b/sdk/spring/spring-cloud-azure-feature-management-web/pom.xml index 5d3c959717fb..019a1cf00585 100644 --- a/sdk/spring/spring-cloud-azure-feature-management-web/pom.xml +++ b/sdk/spring/spring-cloud-azure-feature-management-web/pom.xml @@ -8,7 +8,7 @@ 4.0.0 com.azure.spring spring-cloud-azure-feature-management-web - 5.24.1 + 5.25.0 Spring Cloud Azure Feature Management Web Adds Feature Management into Spring Web @@ -39,7 +39,7 @@ com.azure.spring spring-cloud-azure-feature-management - 5.24.1 + 5.25.0 jakarta.servlet @@ -127,7 +127,7 @@ - com.azure.spring:spring-cloud-azure-feature-management:[5.24.1] + com.azure.spring:spring-cloud-azure-feature-management:[5.25.0] jakarta.servlet:jakarta.servlet-api:[6.0.0] org.springframework:spring-web:[6.2.9] org.springframework:spring-webmvc:[6.2.9] diff --git a/sdk/spring/spring-cloud-azure-feature-management/CHANGELOG.md b/sdk/spring/spring-cloud-azure-feature-management/CHANGELOG.md index 7115cfbe0d11..5ca6ab2a7132 100644 --- a/sdk/spring/spring-cloud-azure-feature-management/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-feature-management/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-feature-management/pom.xml b/sdk/spring/spring-cloud-azure-feature-management/pom.xml index 829688e948f7..29622270cc5e 100644 --- a/sdk/spring/spring-cloud-azure-feature-management/pom.xml +++ b/sdk/spring/spring-cloud-azure-feature-management/pom.xml @@ -8,7 +8,7 @@ 4.0.0 com.azure.spring spring-cloud-azure-feature-management - 5.24.1 + 5.25.0 Spring Cloud Azure Feature Management Adds Feature Management into Spring diff --git a/sdk/spring/spring-cloud-azure-integration-test-appconfiguration-config/pom.xml b/sdk/spring/spring-cloud-azure-integration-test-appconfiguration-config/pom.xml index 16abf0fa0448..b12729555bd1 100644 --- a/sdk/spring/spring-cloud-azure-integration-test-appconfiguration-config/pom.xml +++ b/sdk/spring/spring-cloud-azure-integration-test-appconfiguration-config/pom.xml @@ -21,7 +21,7 @@ com.azure.spring spring-cloud-azure-starter-appconfiguration-config - 5.24.1 + 5.25.0 org.springframework.boot diff --git a/sdk/spring/spring-cloud-azure-integration-tests/pom.xml b/sdk/spring/spring-cloud-azure-integration-tests/pom.xml index f109887c7fce..1ad694e94967 100644 --- a/sdk/spring/spring-cloud-azure-integration-tests/pom.xml +++ b/sdk/spring/spring-cloud-azure-integration-tests/pom.xml @@ -42,67 +42,67 @@ com.azure.spring spring-cloud-azure-starter-servicebus - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-starter-servicebus-jms - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-starter-eventhubs - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-starter-keyvault-secrets - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-starter-storage-blob - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-starter-storage-file-share - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-starter-storage-queue - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-starter-appconfiguration - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-starter-cosmos - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-starter-data-cosmos - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-stream-binder-eventhubs - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-stream-binder-servicebus - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-starter-jdbc-mysql - 5.24.1 + 5.25.0 org.springframework.cloud diff --git a/sdk/spring/spring-cloud-azure-resourcemanager/CHANGELOG.md b/sdk/spring/spring-cloud-azure-resourcemanager/CHANGELOG.md index 0ffeec3d01e6..0609cc0800ad 100644 --- a/sdk/spring/spring-cloud-azure-resourcemanager/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-resourcemanager/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-resourcemanager/pom.xml b/sdk/spring/spring-cloud-azure-resourcemanager/pom.xml index 24f25f33018e..9cd26d41e1a9 100644 --- a/sdk/spring/spring-cloud-azure-resourcemanager/pom.xml +++ b/sdk/spring/spring-cloud-azure-resourcemanager/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-cloud-azure-resourcemanager - 5.24.1 + 5.25.0 Spring Cloud Azure Resource Manager Spring Cloud Azure Resource Manager @@ -41,7 +41,7 @@ com.azure.spring spring-cloud-azure-core - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-service/CHANGELOG.md b/sdk/spring/spring-cloud-azure-service/CHANGELOG.md index 200a19d7a2ca..2040ebfaa80a 100644 --- a/sdk/spring/spring-cloud-azure-service/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-service/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-service/pom.xml b/sdk/spring/spring-cloud-azure-service/pom.xml index 697827bab37d..e49e336fef4e 100644 --- a/sdk/spring/spring-cloud-azure-service/pom.xml +++ b/sdk/spring/spring-cloud-azure-service/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-cloud-azure-service - 5.24.1 + 5.25.0 Spring Cloud Azure Service Spring Cloud Azure Service @@ -41,7 +41,7 @@ com.azure.spring spring-cloud-azure-core - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-active-directory-b2c/pom.xml b/sdk/spring/spring-cloud-azure-starter-active-directory-b2c/pom.xml index 0068314f9577..0f237f9012e9 100644 --- a/sdk/spring/spring-cloud-azure-starter-active-directory-b2c/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-active-directory-b2c/pom.xml @@ -7,7 +7,7 @@ com.azure.spring spring-cloud-azure-starter-active-directory-b2c - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Active Directory B2C Spring Cloud Azure Starter Active Directory B2C @@ -90,7 +90,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 org.springframework.security diff --git a/sdk/spring/spring-cloud-azure-starter-active-directory/pom.xml b/sdk/spring/spring-cloud-azure-starter-active-directory/pom.xml index 94d8d213a525..587ee34abd42 100644 --- a/sdk/spring/spring-cloud-azure-starter-active-directory/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-active-directory/pom.xml @@ -7,7 +7,7 @@ com.azure.spring spring-cloud-azure-starter-active-directory - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Active Directory Spring Cloud Azure Starter Active Directory @@ -89,7 +89,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 org.springframework.security diff --git a/sdk/spring/spring-cloud-azure-starter-actuator/pom.xml b/sdk/spring/spring-cloud-azure-starter-actuator/pom.xml index 678153973961..ce871cc2a43a 100644 --- a/sdk/spring/spring-cloud-azure-starter-actuator/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-actuator/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-actuator - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Actuator Spring Cloud Azure Starter Actuator @@ -89,12 +89,12 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-actuator-autoconfigure - 5.24.1 + 5.25.0 org.springframework.boot diff --git a/sdk/spring/spring-cloud-azure-starter-appconfiguration-config/CHANGELOG.md b/sdk/spring/spring-cloud-azure-starter-appconfiguration-config/CHANGELOG.md index 6b71b40b745f..edeeb69b6eb6 100644 --- a/sdk/spring/spring-cloud-azure-starter-appconfiguration-config/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-starter-appconfiguration-config/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-starter-appconfiguration-config/README.md b/sdk/spring/spring-cloud-azure-starter-appconfiguration-config/README.md index 568483f89e7b..a560637ae394 100644 --- a/sdk/spring/spring-cloud-azure-starter-appconfiguration-config/README.md +++ b/sdk/spring/spring-cloud-azure-starter-appconfiguration-config/README.md @@ -21,7 +21,7 @@ There are two libraries that can be used spring-cloud-azure-appconfiguration-con com.azure.spring spring-cloud-azure-appconfiguration-config - 5.24.1 + 5.25.0 ``` [//]: # ({x-version-update-end}) @@ -33,7 +33,7 @@ or com.azure.spring spring-cloud-azure-appconfiguration-config-web - 5.24.1 + 5.25.0 ``` [//]: # ({x-version-update-end}) diff --git a/sdk/spring/spring-cloud-azure-starter-appconfiguration-config/pom.xml b/sdk/spring/spring-cloud-azure-starter-appconfiguration-config/pom.xml index 4d1ed8c98ca6..8efa285f5516 100644 --- a/sdk/spring/spring-cloud-azure-starter-appconfiguration-config/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-appconfiguration-config/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-appconfiguration-config - 5.24.1 + 5.25.0 Spring Cloud Azure Starter App Configuration Config Spring Cloud Azure Starter App Configuration Config https://microsoft.github.io/spring-cloud-azure @@ -88,12 +88,12 @@ com.azure.spring spring-cloud-azure-appconfiguration-config-web - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-feature-management-web - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-appconfiguration/pom.xml b/sdk/spring/spring-cloud-azure-starter-appconfiguration/pom.xml index dc299f4b9007..077f21d448e9 100644 --- a/sdk/spring/spring-cloud-azure-starter-appconfiguration/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-appconfiguration/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-appconfiguration - 5.24.1 + 5.25.0 Spring Cloud Azure Starter App Configuration Spring Cloud Azure Starter App Configuration @@ -89,7 +89,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 com.azure diff --git a/sdk/spring/spring-cloud-azure-starter-cosmos/pom.xml b/sdk/spring/spring-cloud-azure-starter-cosmos/pom.xml index f2237bbfbecb..96f86fa5ba16 100644 --- a/sdk/spring/spring-cloud-azure-starter-cosmos/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-cosmos/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-cosmos - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Cosmos DB Spring Cloud Azure Starter Cosmos DB @@ -89,7 +89,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 com.azure diff --git a/sdk/spring/spring-cloud-azure-starter-data-cosmos/pom.xml b/sdk/spring/spring-cloud-azure-starter-data-cosmos/pom.xml index 7477966168a3..a30a492c16ef 100644 --- a/sdk/spring/spring-cloud-azure-starter-data-cosmos/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-data-cosmos/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-data-cosmos - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Data Cosmos DB Spring Cloud Azure Starter Data Cosmos DB @@ -89,12 +89,12 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 com.azure azure-spring-data-cosmos - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-data-redis-lettuce/pom.xml b/sdk/spring/spring-cloud-azure-starter-data-redis-lettuce/pom.xml index 749ce0531b17..e3d0f02c8d9a 100644 --- a/sdk/spring/spring-cloud-azure-starter-data-redis-lettuce/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-data-redis-lettuce/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-data-redis-lettuce - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Data Redis with Lettuce Spring Cloud Azure Starter Data Redis with Lettuce @@ -89,7 +89,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-eventgrid/pom.xml b/sdk/spring/spring-cloud-azure-starter-eventgrid/pom.xml index a3953110d8cc..8c3169e70faa 100644 --- a/sdk/spring/spring-cloud-azure-starter-eventgrid/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-eventgrid/pom.xml @@ -7,7 +7,7 @@ com.azure.spring spring-cloud-azure-starter-eventgrid - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Event Grid Spring Cloud Azure Starter Event Grid @@ -90,7 +90,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-eventhubs/pom.xml b/sdk/spring/spring-cloud-azure-starter-eventhubs/pom.xml index a663c59f3ac9..6139df0bdb6a 100644 --- a/sdk/spring/spring-cloud-azure-starter-eventhubs/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-eventhubs/pom.xml @@ -7,7 +7,7 @@ com.azure.spring spring-cloud-azure-starter-eventhubs - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Event Hubs Spring Cloud Azure Starter Event Hubs @@ -90,7 +90,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-integration-eventhubs/pom.xml b/sdk/spring/spring-cloud-azure-starter-integration-eventhubs/pom.xml index 6a9d9cc91b31..d753cc984fb6 100644 --- a/sdk/spring/spring-cloud-azure-starter-integration-eventhubs/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-integration-eventhubs/pom.xml @@ -7,7 +7,7 @@ com.azure.spring spring-cloud-azure-starter-integration-eventhubs - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Integration Event Hubs Spring Cloud Azure Starter Integration Event Hubs @@ -90,7 +90,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 org.springframework.boot @@ -100,7 +100,7 @@ com.azure.spring spring-integration-azure-eventhubs - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-integration-servicebus/pom.xml b/sdk/spring/spring-cloud-azure-starter-integration-servicebus/pom.xml index 3f0b0d3036fb..f607284a923b 100644 --- a/sdk/spring/spring-cloud-azure-starter-integration-servicebus/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-integration-servicebus/pom.xml @@ -7,7 +7,7 @@ com.azure.spring spring-cloud-azure-starter-integration-servicebus - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Integration Service Bus Spring Cloud Azure Starter Integration Service Bus @@ -90,7 +90,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 org.springframework.boot @@ -100,7 +100,7 @@ com.azure.spring spring-integration-azure-servicebus - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-integration-storage-queue/pom.xml b/sdk/spring/spring-cloud-azure-starter-integration-storage-queue/pom.xml index 22f588e019d1..85f1598e91ec 100644 --- a/sdk/spring/spring-cloud-azure-starter-integration-storage-queue/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-integration-storage-queue/pom.xml @@ -10,7 +10,7 @@ com.azure.spring spring-cloud-azure-starter-integration-storage-queue - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Integration Storage Queue Spring Cloud Azure Starter Integration Storage Queue @@ -93,7 +93,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 org.springframework.boot @@ -103,7 +103,7 @@ com.azure.spring spring-integration-azure-storage-queue - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-jdbc-mysql/pom.xml b/sdk/spring/spring-cloud-azure-starter-jdbc-mysql/pom.xml index 8475096aa591..fabfd124653f 100644 --- a/sdk/spring/spring-cloud-azure-starter-jdbc-mysql/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-jdbc-mysql/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-jdbc-mysql - 5.24.1 + 5.25.0 Spring Cloud Azure Starter JDBC MySQL Spring Cloud Azure Starter for building applications with JDBC and Azure MySQL Services. Support authenticating with Azure AD. @@ -89,7 +89,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-jdbc-postgresql/pom.xml b/sdk/spring/spring-cloud-azure-starter-jdbc-postgresql/pom.xml index 72be36379f2a..423fbbb80e76 100644 --- a/sdk/spring/spring-cloud-azure-starter-jdbc-postgresql/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-jdbc-postgresql/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-jdbc-postgresql - 5.24.1 + 5.25.0 Spring Cloud Azure Starter JDBC PostgreSQL Spring Cloud Azure Starter for building applications with JDBC and Azure PostgreSQL Services. Support authenticating with Azure AD. @@ -89,7 +89,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-keyvault-certificates/pom.xml b/sdk/spring/spring-cloud-azure-starter-keyvault-certificates/pom.xml index 673ac09d8d6f..b406a38cc8d7 100644 --- a/sdk/spring/spring-cloud-azure-starter-keyvault-certificates/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-keyvault-certificates/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-keyvault-certificates - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Key Vault Certificates Spring Cloud Azure Starter Key Vault Certificates @@ -89,7 +89,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 com.azure diff --git a/sdk/spring/spring-cloud-azure-starter-keyvault-jca/pom.xml b/sdk/spring/spring-cloud-azure-starter-keyvault-jca/pom.xml index 981b1dc388e0..59309645f590 100644 --- a/sdk/spring/spring-cloud-azure-starter-keyvault-jca/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-keyvault-jca/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-keyvault-jca - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Key Vault JCA Spring Cloud Azure Starter Key Vault Java Crypto Architecture (JCA) Provider @@ -89,7 +89,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 com.azure diff --git a/sdk/spring/spring-cloud-azure-starter-keyvault-secrets/pom.xml b/sdk/spring/spring-cloud-azure-starter-keyvault-secrets/pom.xml index 262400826205..fbf6f7429622 100644 --- a/sdk/spring/spring-cloud-azure-starter-keyvault-secrets/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-keyvault-secrets/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-keyvault-secrets - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Key Vault Secrets Spring Cloud Azure Starter Key Vault Secrets @@ -89,7 +89,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 com.azure diff --git a/sdk/spring/spring-cloud-azure-starter-keyvault/pom.xml b/sdk/spring/spring-cloud-azure-starter-keyvault/pom.xml index 3c760d47002a..46c8d561769c 100644 --- a/sdk/spring/spring-cloud-azure-starter-keyvault/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-keyvault/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-keyvault - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Key Vault Spring Cloud Azure Starter Key Vault @@ -89,17 +89,17 @@ com.azure.spring spring-cloud-azure-starter-keyvault-secrets - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-starter-keyvault-certificates - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-starter-keyvault-jca - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-monitor-test/pom.xml b/sdk/spring/spring-cloud-azure-starter-monitor-test/pom.xml index bf0c1b352272..eb662a69dd2e 100644 --- a/sdk/spring/spring-cloud-azure-starter-monitor-test/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-monitor-test/pom.xml @@ -42,7 +42,7 @@ com.azure.spring spring-cloud-azure-starter-monitor - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-monitor/CHANGELOG.md b/sdk/spring/spring-cloud-azure-starter-monitor/CHANGELOG.md index f4e7612b0f5d..724ac61a82c9 100644 --- a/sdk/spring/spring-cloud-azure-starter-monitor/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-starter-monitor/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-starter-monitor/pom.xml b/sdk/spring/spring-cloud-azure-starter-monitor/pom.xml index b33cfa0116d7..6448113be8ef 100644 --- a/sdk/spring/spring-cloud-azure-starter-monitor/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-monitor/pom.xml @@ -77,7 +77,7 @@ com.azure.spring spring-cloud-azure-starter-monitor - 5.24.1 + 5.25.0 Azure Monitor OpenTelemetry Distro / Application Insights in Spring native Java application Spring Boot starter providing telemetry data to Azure Monitor for Spring Boot applications and GraalVM native images. diff --git a/sdk/spring/spring-cloud-azure-starter-servicebus-jms/pom.xml b/sdk/spring/spring-cloud-azure-starter-servicebus-jms/pom.xml index 1ec3c3715d7f..30233564983e 100644 --- a/sdk/spring/spring-cloud-azure-starter-servicebus-jms/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-servicebus-jms/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-servicebus-jms - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Service Bus JMS Spring Cloud Azure Starter Service Bus JMS @@ -89,7 +89,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-servicebus/pom.xml b/sdk/spring/spring-cloud-azure-starter-servicebus/pom.xml index c286fd8cd5c1..c0d4227e7147 100644 --- a/sdk/spring/spring-cloud-azure-starter-servicebus/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-servicebus/pom.xml @@ -7,7 +7,7 @@ com.azure.spring spring-cloud-azure-starter-servicebus - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Service Bus Spring Cloud Azure Starter Service Bus @@ -90,7 +90,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 com.azure diff --git a/sdk/spring/spring-cloud-azure-starter-storage-blob/pom.xml b/sdk/spring/spring-cloud-azure-starter-storage-blob/pom.xml index bd6b6785440f..58735deaf9b2 100644 --- a/sdk/spring/spring-cloud-azure-starter-storage-blob/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-storage-blob/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-storage-blob - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Storage Blob Spring Cloud Azure Starter Storage Blob @@ -89,7 +89,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-storage-file-share/pom.xml b/sdk/spring/spring-cloud-azure-starter-storage-file-share/pom.xml index c4bcc3eda461..7bc3e50377da 100644 --- a/sdk/spring/spring-cloud-azure-starter-storage-file-share/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-storage-file-share/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-storage-file-share - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Storage File Share Spring Cloud Azure Starter Storage File Share @@ -89,7 +89,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-storage-queue/pom.xml b/sdk/spring/spring-cloud-azure-starter-storage-queue/pom.xml index e8eb0ec1edc3..6f39e0ebc4a1 100644 --- a/sdk/spring/spring-cloud-azure-starter-storage-queue/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-storage-queue/pom.xml @@ -10,7 +10,7 @@ com.azure.spring spring-cloud-azure-starter-storage-queue - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Storage Queue Spring Cloud Azure Starter Storage Queue @@ -93,7 +93,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 com.azure diff --git a/sdk/spring/spring-cloud-azure-starter-storage/pom.xml b/sdk/spring/spring-cloud-azure-starter-storage/pom.xml index a8ad5025e672..5cb256035d39 100644 --- a/sdk/spring/spring-cloud-azure-starter-storage/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-storage/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter-storage - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Storage Spring Cloud Azure Starter Storage @@ -89,19 +89,19 @@ com.azure.spring spring-cloud-azure-starter-storage-blob - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-starter-storage-file-share - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-starter-storage-queue - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-stream-eventhubs/pom.xml b/sdk/spring/spring-cloud-azure-starter-stream-eventhubs/pom.xml index 36ea57394849..15f9c0bfeee9 100644 --- a/sdk/spring/spring-cloud-azure-starter-stream-eventhubs/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-stream-eventhubs/pom.xml @@ -7,7 +7,7 @@ com.azure.spring spring-cloud-azure-starter-stream-eventhubs - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Stream Event Hubs Spring Cloud Azure Starter Stream Event Hubs @@ -90,7 +90,7 @@ com.azure.spring spring-cloud-azure-stream-binder-eventhubs - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter-stream-servicebus/pom.xml b/sdk/spring/spring-cloud-azure-starter-stream-servicebus/pom.xml index 9f252f5dfbfb..c1cdf5ef627d 100644 --- a/sdk/spring/spring-cloud-azure-starter-stream-servicebus/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter-stream-servicebus/pom.xml @@ -7,7 +7,7 @@ com.azure.spring spring-cloud-azure-starter-stream-servicebus - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Stream Service Bus Spring Cloud Azure Starter Stream Service Bus @@ -90,7 +90,7 @@ com.azure.spring spring-cloud-azure-stream-binder-servicebus - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-starter/pom.xml b/sdk/spring/spring-cloud-azure-starter/pom.xml index 8833ad4009ac..67fdd538fae1 100644 --- a/sdk/spring/spring-cloud-azure-starter/pom.xml +++ b/sdk/spring/spring-cloud-azure-starter/pom.xml @@ -6,7 +6,7 @@ com.azure.spring spring-cloud-azure-starter - 5.24.1 + 5.25.0 Spring Cloud Azure Starter Core starter, including auto-configuration support @@ -94,7 +94,7 @@ com.azure.spring spring-cloud-azure-autoconfigure - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-stream-binder-eventhubs-core/CHANGELOG.md b/sdk/spring/spring-cloud-azure-stream-binder-eventhubs-core/CHANGELOG.md index 0ffeec3d01e6..0609cc0800ad 100644 --- a/sdk/spring/spring-cloud-azure-stream-binder-eventhubs-core/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-stream-binder-eventhubs-core/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-stream-binder-eventhubs-core/pom.xml b/sdk/spring/spring-cloud-azure-stream-binder-eventhubs-core/pom.xml index f773337239b9..af9e6fc79181 100644 --- a/sdk/spring/spring-cloud-azure-stream-binder-eventhubs-core/pom.xml +++ b/sdk/spring/spring-cloud-azure-stream-binder-eventhubs-core/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-cloud-azure-stream-binder-eventhubs-core - 5.24.1 + 5.25.0 Spring Cloud Azure Stream Binder Event Hubs Core Spring Cloud Azure Stream Binder Event Hubs Core @@ -53,7 +53,7 @@ com.azure.spring spring-integration-azure-eventhubs - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/CHANGELOG.md b/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/CHANGELOG.md index 0ffeec3d01e6..0609cc0800ad 100644 --- a/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/pom.xml b/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/pom.xml index 8556d1b55ffd..1748fafffaa9 100644 --- a/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/pom.xml +++ b/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-cloud-azure-stream-binder-eventhubs - 5.24.1 + 5.25.0 Spring Cloud Azure Stream Binder Event Hubs Spring Cloud Azure Stream Binder Event Hubs @@ -41,12 +41,12 @@ com.azure.spring spring-cloud-azure-autoconfigure - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-stream-binder-eventhubs-core - 5.24.1 + 5.25.0 @@ -64,7 +64,7 @@ com.azure.spring spring-cloud-azure-resourcemanager - 5.24.1 + 5.25.0 diff --git a/sdk/spring/spring-cloud-azure-stream-binder-servicebus-core/CHANGELOG.md b/sdk/spring/spring-cloud-azure-stream-binder-servicebus-core/CHANGELOG.md index 200a19d7a2ca..2040ebfaa80a 100644 --- a/sdk/spring/spring-cloud-azure-stream-binder-servicebus-core/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-stream-binder-servicebus-core/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-stream-binder-servicebus-core/pom.xml b/sdk/spring/spring-cloud-azure-stream-binder-servicebus-core/pom.xml index e6115898f9d0..c73a3e4e7b0e 100644 --- a/sdk/spring/spring-cloud-azure-stream-binder-servicebus-core/pom.xml +++ b/sdk/spring/spring-cloud-azure-stream-binder-servicebus-core/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-cloud-azure-stream-binder-servicebus-core - 5.24.1 + 5.25.0 Spring Cloud Azure Stream Binder Service Bus Core Spring Cloud Azure Stream Binder Service Bus Core @@ -47,7 +47,7 @@ com.azure.spring spring-integration-azure-servicebus - 5.24.1 + 5.25.0 com.azure diff --git a/sdk/spring/spring-cloud-azure-stream-binder-servicebus/CHANGELOG.md b/sdk/spring/spring-cloud-azure-stream-binder-servicebus/CHANGELOG.md index 200a19d7a2ca..2040ebfaa80a 100644 --- a/sdk/spring/spring-cloud-azure-stream-binder-servicebus/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-stream-binder-servicebus/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-stream-binder-servicebus/pom.xml b/sdk/spring/spring-cloud-azure-stream-binder-servicebus/pom.xml index 54db30667e66..1dee8ec1aee2 100644 --- a/sdk/spring/spring-cloud-azure-stream-binder-servicebus/pom.xml +++ b/sdk/spring/spring-cloud-azure-stream-binder-servicebus/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-cloud-azure-stream-binder-servicebus - 5.24.1 + 5.25.0 Spring Cloud Azure Stream Binder Service Bus Spring Cloud Azure Stream Binder Service Bus @@ -41,17 +41,17 @@ com.azure.spring spring-cloud-azure-stream-binder-servicebus-core - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-autoconfigure - 5.24.1 + 5.25.0 com.azure.spring spring-cloud-azure-resourcemanager - 5.24.1 + 5.25.0 org.springframework.boot diff --git a/sdk/spring/spring-cloud-azure-testcontainers/CHANGELOG.md b/sdk/spring/spring-cloud-azure-testcontainers/CHANGELOG.md index 702213890512..7178ea3ce64f 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/CHANGELOG.md +++ b/sdk/spring/spring-cloud-azure-testcontainers/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-cloud-azure-testcontainers/pom.xml b/sdk/spring/spring-cloud-azure-testcontainers/pom.xml index 9b078e99a396..8ece45ccc015 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/pom.xml +++ b/sdk/spring/spring-cloud-azure-testcontainers/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-cloud-azure-testcontainers - 5.24.1 + 5.25.0 Spring Cloud Azure Testcontainers Spring Cloud Azure Testcontainers @@ -56,13 +56,13 @@ com.azure.spring spring-cloud-azure-autoconfigure - 5.24.1 + 5.25.0 true com.azure azure-spring-data-cosmos - 5.24.1 + 5.25.0 true @@ -81,7 +81,7 @@ com.azure.spring spring-messaging-azure-servicebus - 5.24.1 + 5.25.0 test diff --git a/sdk/spring/spring-integration-azure-core/CHANGELOG.md b/sdk/spring/spring-integration-azure-core/CHANGELOG.md index 200a19d7a2ca..2040ebfaa80a 100644 --- a/sdk/spring/spring-integration-azure-core/CHANGELOG.md +++ b/sdk/spring/spring-integration-azure-core/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-integration-azure-core/pom.xml b/sdk/spring/spring-integration-azure-core/pom.xml index f3082c4ba3e7..18feaa603675 100644 --- a/sdk/spring/spring-integration-azure-core/pom.xml +++ b/sdk/spring/spring-integration-azure-core/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-integration-azure-core - 5.24.1 + 5.25.0 Spring Integration Azure Core Spring Integration Azure Core @@ -43,7 +43,7 @@ com.azure.spring spring-messaging-azure - 5.24.1 + 5.25.0 org.springframework.integration diff --git a/sdk/spring/spring-integration-azure-eventhubs/CHANGELOG.md b/sdk/spring/spring-integration-azure-eventhubs/CHANGELOG.md index 0ffeec3d01e6..0609cc0800ad 100644 --- a/sdk/spring/spring-integration-azure-eventhubs/CHANGELOG.md +++ b/sdk/spring/spring-integration-azure-eventhubs/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-integration-azure-eventhubs/pom.xml b/sdk/spring/spring-integration-azure-eventhubs/pom.xml index ac02f2064bc2..5d5104b118ca 100644 --- a/sdk/spring/spring-integration-azure-eventhubs/pom.xml +++ b/sdk/spring/spring-integration-azure-eventhubs/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-integration-azure-eventhubs - 5.24.1 + 5.25.0 Spring Integration Azure Event Hubs Spring Integration Azure Event Hubs @@ -41,12 +41,12 @@ com.azure.spring spring-integration-azure-core - 5.24.1 + 5.25.0 com.azure.spring spring-messaging-azure-eventhubs - 5.24.1 + 5.25.0 @@ -180,7 +180,7 @@ com.azure.spring spring-integration-azure-core - 5.24.1 + 5.25.0 test-jar test diff --git a/sdk/spring/spring-integration-azure-servicebus/CHANGELOG.md b/sdk/spring/spring-integration-azure-servicebus/CHANGELOG.md index 200a19d7a2ca..2040ebfaa80a 100644 --- a/sdk/spring/spring-integration-azure-servicebus/CHANGELOG.md +++ b/sdk/spring/spring-integration-azure-servicebus/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-integration-azure-servicebus/pom.xml b/sdk/spring/spring-integration-azure-servicebus/pom.xml index 188a3bfbe79f..dab818a71546 100644 --- a/sdk/spring/spring-integration-azure-servicebus/pom.xml +++ b/sdk/spring/spring-integration-azure-servicebus/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-integration-azure-servicebus - 5.24.1 + 5.25.0 Spring Integration Azure Service Bus Spring Integration Azure Service Bus @@ -41,12 +41,12 @@ com.azure.spring spring-integration-azure-core - 5.24.1 + 5.25.0 com.azure.spring spring-messaging-azure-servicebus - 5.24.1 + 5.25.0 + 5.25.0 test-jar test com.azure.spring spring-messaging-azure-servicebus - 5.24.1 + 5.25.0 test-jar test diff --git a/sdk/spring/spring-integration-azure-storage-queue/CHANGELOG.md b/sdk/spring/spring-integration-azure-storage-queue/CHANGELOG.md index 200a19d7a2ca..2040ebfaa80a 100644 --- a/sdk/spring/spring-integration-azure-storage-queue/CHANGELOG.md +++ b/sdk/spring/spring-integration-azure-storage-queue/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-integration-azure-storage-queue/pom.xml b/sdk/spring/spring-integration-azure-storage-queue/pom.xml index 7af45ecf79fd..d1d1e3a8ac1e 100644 --- a/sdk/spring/spring-integration-azure-storage-queue/pom.xml +++ b/sdk/spring/spring-integration-azure-storage-queue/pom.xml @@ -13,7 +13,7 @@ com.azure.spring spring-integration-azure-storage-queue - 5.24.1 + 5.25.0 Spring Integration Azure Storage Queue Spring Integration Azure Storage Queue @@ -42,12 +42,12 @@ com.azure.spring spring-integration-azure-core - 5.24.1 + 5.25.0 com.azure.spring spring-messaging-azure-storage-queue - 5.24.1 + 5.25.0 + 5.25.0 Spring Messaging Azure Event Hubs Spring Messaging Azure Event Hubs @@ -41,7 +41,7 @@ com.azure.spring spring-messaging-azure - 5.24.1 + 5.25.0 com.azure @@ -226,7 +226,7 @@ com.azure.spring spring-messaging-azure - 5.24.1 + 5.25.0 test-jar test diff --git a/sdk/spring/spring-messaging-azure-servicebus/CHANGELOG.md b/sdk/spring/spring-messaging-azure-servicebus/CHANGELOG.md index 0ffeec3d01e6..0609cc0800ad 100644 --- a/sdk/spring/spring-messaging-azure-servicebus/CHANGELOG.md +++ b/sdk/spring/spring-messaging-azure-servicebus/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-messaging-azure-servicebus/pom.xml b/sdk/spring/spring-messaging-azure-servicebus/pom.xml index 2f80f14ae9b5..cba96f65b6a8 100644 --- a/sdk/spring/spring-messaging-azure-servicebus/pom.xml +++ b/sdk/spring/spring-messaging-azure-servicebus/pom.xml @@ -13,7 +13,7 @@ com.azure.spring spring-messaging-azure-servicebus - 5.24.1 + 5.25.0 Spring Messaging Azure Service Bus Spring Messaging Azure Service Bus @@ -42,7 +42,7 @@ com.azure.spring spring-messaging-azure - 5.24.1 + 5.25.0 com.azure @@ -218,7 +218,7 @@ com.azure.spring spring-messaging-azure - 5.24.1 + 5.25.0 test-jar test diff --git a/sdk/spring/spring-messaging-azure-storage-queue/CHANGELOG.md b/sdk/spring/spring-messaging-azure-storage-queue/CHANGELOG.md index 200a19d7a2ca..2040ebfaa80a 100644 --- a/sdk/spring/spring-messaging-azure-storage-queue/CHANGELOG.md +++ b/sdk/spring/spring-messaging-azure-storage-queue/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-messaging-azure-storage-queue/pom.xml b/sdk/spring/spring-messaging-azure-storage-queue/pom.xml index e68fd9feb04f..9453465246ff 100644 --- a/sdk/spring/spring-messaging-azure-storage-queue/pom.xml +++ b/sdk/spring/spring-messaging-azure-storage-queue/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-messaging-azure-storage-queue - 5.24.1 + 5.25.0 Spring Messaging Azure Storage Queue Spring Messaging Azure Storage Queue @@ -41,7 +41,7 @@ com.azure.spring spring-messaging-azure - 5.24.1 + 5.25.0 com.azure @@ -171,7 +171,7 @@ com.azure.spring spring-messaging-azure - 5.24.1 + 5.25.0 test-jar test diff --git a/sdk/spring/spring-messaging-azure/CHANGELOG.md b/sdk/spring/spring-messaging-azure/CHANGELOG.md index 0ffeec3d01e6..0609cc0800ad 100644 --- a/sdk/spring/spring-messaging-azure/CHANGELOG.md +++ b/sdk/spring/spring-messaging-azure/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +## 5.25.0 (2026-03-04) + +Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5250-2026-03-04) for more details. + ## 5.24.1 (2025-12-09) Please refer to [spring/CHANGELOG.md](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/CHANGELOG.md#5241-2025-12-09) for more details. diff --git a/sdk/spring/spring-messaging-azure/pom.xml b/sdk/spring/spring-messaging-azure/pom.xml index e483b3cadc9a..7b70a041c86a 100644 --- a/sdk/spring/spring-messaging-azure/pom.xml +++ b/sdk/spring/spring-messaging-azure/pom.xml @@ -12,7 +12,7 @@ com.azure.spring spring-messaging-azure - 5.24.1 + 5.25.0 Spring Messaging Azure Spring Messaging Azure @@ -41,7 +41,7 @@ com.azure.spring spring-cloud-azure-service - 5.24.1 + 5.25.0 org.springframework From 36d5abec5f7bad7058bea28f2885a4e3ef52eec1 Mon Sep 17 00:00:00 2001 From: muyao Date: Tue, 3 Mar 2026 16:24:47 +0800 Subject: [PATCH 3/5] sync Create-APIReview.ps1 --- eng/common/scripts/Create-APIReview.ps1 | 255 +++++++++++++++++------- 1 file changed, 181 insertions(+), 74 deletions(-) diff --git a/eng/common/scripts/Create-APIReview.ps1 b/eng/common/scripts/Create-APIReview.ps1 index 5438df067101..f2b21778f09a 100644 --- a/eng/common/scripts/Create-APIReview.ps1 +++ b/eng/common/scripts/Create-APIReview.ps1 @@ -1,28 +1,47 @@ [CmdletBinding()] Param ( - [Parameter(Mandatory=$True)] + [Parameter(Mandatory=$False)] [array] $ArtifactList, [Parameter(Mandatory=$True)] - [string] $ArtifactPath, - [Parameter(Mandatory=$True)] - [string] $APIKey, + [string] $ArtifactPath, [string] $SourceBranch, [string] $DefaultBranch, [string] $RepoName, [string] $BuildId, [string] $PackageName = "", [string] $ConfigFileDir = "", - [string] $APIViewUri = "https://apiview.dev/AutoReview", + [string] $APIViewUri = "https://apiview.org/autoreview", [string] $ArtifactName = "packages", - [bool] $MarkPackageAsShipped = $false + [bool] $MarkPackageAsShipped = $false, + [Parameter(Mandatory=$False)] + [array] $PackageInfoFiles ) Set-StrictMode -Version 3 + . (Join-Path $PSScriptRoot common.ps1) . (Join-Path $PSScriptRoot Helpers ApiView-Helpers.ps1) +# Get Bearer token for APIView authentication +# In Azure DevOps, this uses the service connection's Managed Identity/Service Principal +function Get-ApiViewBearerToken() +{ + try { + $tokenResponse = az account get-access-token --resource "api://apiview" --output json 2>&1 + if ($LASTEXITCODE -ne 0) { + Write-Error "Failed to acquire access token: $tokenResponse" + return $null + } + return ($tokenResponse | ConvertFrom-Json).accessToken + } + catch { + Write-Error "Failed to acquire access token: $($_.Exception.Message)" + return $null + } +} + # Submit API review request and return status whether current revision is approved or pending or failed to create review -function Upload-SourceArtifact($filePath, $apiLabel, $releaseStatus, $packageVersion) +function Upload-SourceArtifact($filePath, $apiLabel, $releaseStatus, $packageVersion, $packageType) { Write-Host "File path: $filePath" $fileName = Split-Path -Leaf $filePath @@ -51,7 +70,7 @@ function Upload-SourceArtifact($filePath, $apiLabel, $releaseStatus, $packageVer $versionContent.Headers.ContentDisposition = $versionParam $multipartContent.Add($versionContent) Write-Host "Request param, packageVersion: $packageVersion" - + $releaseTagParam = [System.Net.Http.Headers.ContentDispositionHeaderValue]::new("form-data") $releaseTagParam.Name = "setReleaseTag" $releaseTagParamContent = [System.Net.Http.StringContent]::new($MarkPackageAsShipped) @@ -59,6 +78,13 @@ function Upload-SourceArtifact($filePath, $apiLabel, $releaseStatus, $packageVer $multipartContent.Add($releaseTagParamContent) Write-Host "Request param, setReleaseTag: $MarkPackageAsShipped" + $packageTypeParam = [System.Net.Http.Headers.ContentDispositionHeaderValue]::new("form-data") + $packageTypeParam.Name = "packageType" + $packageTypeParamContent = [System.Net.Http.StringContent]::new($packageType) + $packageTypeParamContent.Headers.ContentDisposition = $packageTypeParam + $multipartContent.Add($packageTypeParamContent) + Write-Host "Request param, packageType: $packageType" + if ($releaseStatus -and ($releaseStatus -ne "Unreleased")) { $compareAllParam = [System.Net.Http.Headers.ContentDispositionHeaderValue]::new("form-data") @@ -69,9 +95,17 @@ function Upload-SourceArtifact($filePath, $apiLabel, $releaseStatus, $packageVer Write-Host "Request param, compareAllRevisions: true" } - $uri = "${APIViewUri}/UploadAutoReview" + $uri = "${APIViewUri}/upload" + + # Get Bearer token for authentication + $bearerToken = Get-ApiViewBearerToken + if (-not $bearerToken) { + Write-Error "Failed to acquire Bearer token for APIView authentication." + return [System.Net.HttpStatusCode]::Unauthorized + } + $headers = @{ - "ApiKey" = $apiKey; + "Authorization" = "Bearer $bearerToken"; "content-type" = "multipart/form-data" } @@ -83,44 +117,62 @@ function Upload-SourceArtifact($filePath, $apiLabel, $releaseStatus, $packageVer } catch { - Write-Host "Exception details: $($_.Exception.Response)" + Write-Host "ERROR: API request failed" -ForegroundColor Red + Write-Host "Status Code: $($_.Exception.Response.StatusCode.Value__)" -ForegroundColor Yellow + Write-Host "Error: $($_.Exception.Message)" -ForegroundColor Yellow + if ($_.ErrorDetails.Message) { + Write-Host "Details: $($_.ErrorDetails.Message)" -ForegroundColor Yellow + } $StatusCode = $_.Exception.Response.StatusCode } return $StatusCode } -function Upload-ReviewTokenFile($packageName, $apiLabel, $releaseStatus, $reviewFileName, $packageVersion, $filePath) +function Upload-ReviewTokenFile($packageName, $apiLabel, $releaseStatus, $reviewFileName, $packageVersion, $filePath, $packageType) { Write-Host "Original File path: $filePath" $fileName = Split-Path -Leaf $filePath Write-Host "OriginalFile name: $fileName" - $params = "buildId=${BuildId}&artifactName=${ArtifactName}&originalFilePath=${fileName}&reviewFilePath=${reviewFileName}" - $params += "&label=${apiLabel}&repoName=${RepoName}&packageName=${packageName}&project=internal&packageVersion=${packageVersion}" + $params = "buildId=${BuildId}&artifactName=${ArtifactName}&originalFilePath=${fileName}&reviewFilePath=${reviewFileName}" + $params +="&label=${apiLabel}&repoName=${RepoName}&packageName=${packageName}&project=internal&packageVersion=${packageVersion}&packageType=${packageType}" if($MarkPackageAsShipped) { $params += "&setReleaseTag=true" } - $uri = "${APIViewUri}/CreateApiReview?${params}" + $uri = "${APIViewUri}/create?${params}" if ($releaseStatus -and ($releaseStatus -ne "Unreleased")) { $uri += "&compareAllRevisions=true" } Write-Host "Request to APIView: $uri" + + # Get Bearer token for authentication + $bearerToken = Get-ApiViewBearerToken + if (-not $bearerToken) { + Write-Error "Failed to acquire Bearer token for APIView authentication." + return [System.Net.HttpStatusCode]::Unauthorized + } + $headers = @{ - "ApiKey" = $APIKey; + "Authorization" = "Bearer $bearerToken" } try { - $Response = Invoke-WebRequest -Method 'GET' -Uri $uri -Headers $headers + $Response = Invoke-WebRequest -Method 'POST' -Uri $uri -Headers $headers Write-Host "API review: $($Response.Content)" $StatusCode = $Response.StatusCode } catch { - Write-Host "Exception details: $($_.Exception)" + Write-Host "ERROR: API request failed" -ForegroundColor Red + Write-Host "Status Code: $($_.Exception.Response.StatusCode.Value__)" -ForegroundColor Yellow + Write-Host "Error: $($_.Exception.Message)" -ForegroundColor Yellow + if ($_.ErrorDetails.Message) { + Write-Host "Details: $($_.ErrorDetails.Message)" -ForegroundColor Yellow + } $StatusCode = $_.Exception.Response.StatusCode } @@ -141,21 +193,21 @@ function Get-APITokenFileName($packageName) } } -function Submit-APIReview($packageInfo, $packagePath, $packageArtifactName) +function Submit-APIReview($packageInfo, $packagePath) { - $packageName = $packageInfo.Name $apiLabel = "Source Branch:${SourceBranch}" + $packageType = $packageInfo.SdkType # Get generated review token file if present # APIView processes request using different API if token file is already generated - $reviewTokenFileName = Get-APITokenFileName $packageArtifactName + $reviewTokenFileName = Get-APITokenFileName $packageInfo.ArtifactName if ($reviewTokenFileName) { Write-Host "Uploading review token file $reviewTokenFileName to APIView." - return Upload-ReviewTokenFile $packageArtifactName $apiLabel $packageInfo.ReleaseStatus $reviewTokenFileName $packageInfo.Version $packagePath + return Upload-ReviewTokenFile $packageInfo.ArtifactName $apiLabel $packageInfo.ReleaseStatus $reviewTokenFileName $packageInfo.Version $packagePath $packageType } else { Write-Host "Uploading $packagePath to APIView." - return Upload-SourceArtifact $packagePath $apiLabel $packageInfo.ReleaseStatus $packageInfo.Version + return Upload-SourceArtifact $packagePath $apiLabel $packageInfo.ReleaseStatus $packageInfo.Version $packageType } } @@ -172,12 +224,32 @@ function IsApiviewStatusCheckRequired($packageInfo) return $false } -function ProcessPackage($packageName) +function ProcessPackage($packageInfo) { $packages = @{} if ($FindArtifactForApiReviewFn -and (Test-Path "Function:$FindArtifactForApiReviewFn")) { - $packages = &$FindArtifactForApiReviewFn $ArtifactPath $packageName + $pkgArtifactName = $packageInfo.ArtifactName ?? $packageInfo.Name + + # Check if the function supports the packageInfo parameter + $functionInfo = Get-Command $FindArtifactForApiReviewFn -ErrorAction SilentlyContinue + $supportsPackageInfoParam = $false + + if ($functionInfo -and $functionInfo.Parameters) { + # Check if function specifically supports packageInfo parameter + $parameterNames = $functionInfo.Parameters.Keys + $supportsPackageInfoParam = $parameterNames -contains 'packageInfo' + } + + # Call function with appropriate parameters + if ($supportsPackageInfoParam) { + LogInfo "Calling $FindArtifactForApiReviewFn with packageInfo parameter" + $packages = &$FindArtifactForApiReviewFn $ArtifactPath $packageInfo + } + else { + LogInfo "Calling $FindArtifactForApiReviewFn with legacy parameters" + $packages = &$FindArtifactForApiReviewFn $ArtifactPath $pkgArtifactName + } } else { @@ -192,31 +264,23 @@ function ProcessPackage($packageName) foreach($pkgPath in $packages.Values) { $pkg = Split-Path -Leaf $pkgPath - $pkgPropPath = Join-Path -Path $ConfigFileDir "$packageName.json" - if (-Not (Test-Path $pkgPropPath)) + $version = [AzureEngSemanticVersion]::ParseVersionString($packageInfo.Version) + if ($null -eq $version) { - Write-Host " Package property file path $($pkgPropPath) is invalid." - continue - } - # Get package info from json file created before updating version to daily dev - $pkgInfo = Get-Content $pkgPropPath | ConvertFrom-Json - $version = [AzureEngSemanticVersion]::ParseVersionString($pkgInfo.Version) - if ($version -eq $null) - { - Write-Host "Version info is not available for package $packageName, because version '$(pkgInfo.Version)' is invalid. Please check if the version follows Azure SDK package versioning guidelines." + Write-Host "Version info is not available for package $($packageInfo.ArtifactName), because version '$($packageInfo.Version)' is invalid. Please check if the version follows Azure SDK package versioning guidelines." return 1 } - + Write-Host "Version: $($version)" - Write-Host "SDK Type: $($pkgInfo.SdkType)" - Write-Host "Release Status: $($pkgInfo.ReleaseStatus)" + Write-Host "SDK Type: $($packageInfo.SdkType)" + Write-Host "Release Status: $($packageInfo.ReleaseStatus)" # Run create review step only if build is triggered from main branch or if version is GA. # This is to avoid invalidating review status by a build triggered from feature branch if ( ($SourceBranch -eq $DefaultBranch) -or (-not $version.IsPrerelease) -or $MarkPackageAsShipped) { Write-Host "Submitting API Review request for package $($pkg), File path: $($pkgPath)" - $respCode = Submit-APIReview $pkgInfo $pkgPath $packageName + $respCode = Submit-APIReview $packageInfo $pkgPath Write-Host "HTTP Response code: $($respCode)" # no need to check API review status when marking a package as shipped @@ -224,10 +288,10 @@ function ProcessPackage($packageName) { if ($respCode -eq '500') { - Write-Host "Failed to mark package ${packageName} as released. Please reach out to Azure SDK engineering systems on teams channel." + Write-Host "Failed to mark package $($packageInfo.ArtifactName) as released. Please reach out to Azure SDK engineering systems on teams channel." return 1 } - Write-Host "Package ${packageName} is marked as released." + Write-Host "Package $($packageInfo.ArtifactName) is marked as released." return 0 } @@ -239,41 +303,41 @@ function ProcessPackage($packageName) IsApproved = $false Details = "" } - Process-ReviewStatusCode $respCode $packageName $apiStatus $pkgNameStatus + Process-ReviewStatusCode $respCode $packageInfo.ArtifactName $apiStatus $pkgNameStatus if ($apiStatus.IsApproved) { Write-Host "API status: $($apiStatus.Details)" } - elseif (!$pkgInfo.ReleaseStatus -or $pkgInfo.ReleaseStatus -eq "Unreleased") { + elseif (!$packageInfo.ReleaseStatus -or $packageInfo.ReleaseStatus -eq "Unreleased") { Write-Host "Release date is not set for current version in change log file for package. Ignoring API review approval status since package is not yet ready for release." } elseif ($version.IsPrerelease) { # Check if package name is approved. Preview version cannot be released without package name approval - if (!$pkgNameStatus.IsApproved) + if (!$pkgNameStatus.IsApproved) { - if (IsApiviewStatusCheckRequired $pkgInfo) + if (IsApiviewStatusCheckRequired $packageInfo) { Write-Error $($pkgNameStatus.Details) return 1 } else{ - Write-Host "Package name is not approved for package $($packageName), however it is not required for this package type so it can still be released without API review approval." - } + Write-Host "Package name is not approved for package $($packageInfo.ArtifactName), however it is not required for this package type so it can still be released without API review approval." + } } # Ignore API review status for prerelease version Write-Host "Package version is not GA. Ignoring API view approval status" - } + } else { # Return error code if status code is 201 for new data plane package # Temporarily enable API review for spring SDK types. Ideally this should be done be using 'IsReviewRequired' method in language side # to override default check of SDK type client - if (IsApiviewStatusCheckRequired $pkgInfo) + if (IsApiviewStatusCheckRequired $packageInfo) { if (!$apiStatus.IsApproved) { - Write-Host "Package version $($version) is GA and automatic API Review is not yet approved for package $($packageName)." + Write-Host "Package version $($version) is GA and automatic API Review is not yet approved for package $($packageInfo.ArtifactName)." Write-Host "Build and release is not allowed for GA package without API review approval." Write-Host "You will need to queue another build to proceed further after API review is approved" Write-Host "You can check http://aka.ms/azsdk/engsys/apireview/faq for more details on API Approval." @@ -281,7 +345,7 @@ function ProcessPackage($packageName) return 1 } else { - Write-Host "API review is not approved for package $($packageName), however it is not required for this package type so it can still be released without API review approval." + Write-Host "API review is not approved for package $($packageInfo.ArtifactName), however it is not required for this package type so it can still be released without API review approval." } } } @@ -296,42 +360,85 @@ function ProcessPackage($packageName) return 0 } -$responses = @{} -# Check if package config file is present. This file has package version, SDK type etc info. -if (-not $ConfigFileDir) -{ +Write-Host "Artifact path: $($ArtifactPath)" +Write-Host "Source branch: $($SourceBranch)" +Write-Host "Package Info Files: $($PackageInfoFiles)" +Write-Host "Artifact List: $($ArtifactList)" +Write-Host "Package Name: $($PackageName)" + +# Parameter priority and backward compatibility logic +# Priority order: PackageName > Artifacts > PackageInfoFiles (for backward compatibility) + +if (-not $ConfigFileDir) { $ConfigFileDir = Join-Path -Path $ArtifactPath "PackageInfo" } -Write-Host "Artifact path: $($ArtifactPath)" -Write-Host "Source branch: $($SourceBranch)" Write-Host "Config File directory: $($ConfigFileDir)" -# if package name param is not empty then process only that package -if ($PackageName) -{ - Write-Host "Processing $($PackageName)" - $result = ProcessPackage -packageName $PackageName - $responses[$PackageName] = $result +# Initialize working variable +$ProcessedPackageInfoFiles = @() + +if ($PackageName -and $PackageName -ne "") { + # Highest Priority: Single package mode (existing usage) + Write-Host "Using PackageName parameter: $PackageName" + $pkgPropPath = Join-Path -Path $ConfigFileDir "$PackageName.json" + if (Test-Path $pkgPropPath) { + $ProcessedPackageInfoFiles = @($pkgPropPath) + } + else { + Write-Error "Package property file path $pkgPropPath is invalid." + exit 1 + } } -else -{ - # process all packages in the artifact - foreach ($artifact in $ArtifactList) - { - Write-Host "Processing $($artifact.name)" - $result = ProcessPackage -packageName $artifact.name - $responses[$artifact.name] = $result +elseif ($ArtifactList -and $ArtifactList.Count -gt 0) { + # Second Priority: Multiple artifacts mode (existing usage) + Write-Host "Using ArtifactList parameter with $($ArtifactList.Count) artifacts" + foreach ($artifact in $ArtifactList) { + $pkgPropPath = Join-Path -Path $ConfigFileDir "$($artifact.name).json" + if (Test-Path $pkgPropPath) { + $ProcessedPackageInfoFiles += $pkgPropPath + } + else { + Write-Warning "Package property file path $pkgPropPath is invalid." + } } } +elseif ($PackageInfoFiles -and $PackageInfoFiles.Count -gt 0) { + # Lowest Priority: Direct PackageInfoFiles (new method) + Write-Host "Using PackageInfoFiles parameter with $($PackageInfoFiles.Count) files" + # Filter out empty strings or whitespace-only entries + $ProcessedPackageInfoFiles = @($PackageInfoFiles | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }) +} +else { + Write-Error "No package information provided. Please provide either 'PackageName', 'ArtifactList', or 'PackageInfoFiles' parameters." + exit 1 +} + +# Validate that we have package info files to process +if (-not $ProcessedPackageInfoFiles -or $ProcessedPackageInfoFiles.Count -eq 0) { + Write-Error "No package info files found after processing parameters. Or PackageInfoFiles parameter contains only empty or whitespace entries, please check the artifact settings." + exit 1 +} + +$responses = @{} +Write-Host "Processed Package Info Files: $($ProcessedPackageInfoFiles -join ', ')" + +# Process all packages using the processed PackageInfoFiles array +foreach ($packageInfoFile in $ProcessedPackageInfoFiles) +{ + $packageInfo = Get-Content $packageInfoFile | ConvertFrom-Json + Write-Host "Processing $($packageInfo.ArtifactName)" + $result = ProcessPackage -packageInfo $packageInfo + $responses[$packageInfo.ArtifactName] = $result +} $exitCode = 0 foreach($pkg in $responses.keys) -{ +{ if ($responses[$pkg] -eq 1) { Write-Host "API changes are not approved for $($pkg)" $exitCode = 1 } } -exit $exitCode \ No newline at end of file +exit $exitCode From b96b4fc45fdc9505f82bacc3a19075e0a88819eb Mon Sep 17 00:00:00 2001 From: muyao Date: Tue, 3 Mar 2026 16:59:54 +0800 Subject: [PATCH 4/5] sync eng/common/scripts --- eng/common/scripts/ChangeLog-Operations.ps1 | 160 ++++++- eng/common/scripts/Create-APIReview.ps1 | 12 +- eng/common/scripts/Delete-RemoteBranches.ps1 | 33 ++ eng/common/scripts/Detect-Api-Changes.ps1 | 73 ++-- .../scripts/Helpers/ApiView-Helpers.ps1 | 6 +- .../Helpers/CommandInvocation-Helpers.ps1 | 44 +- .../Helpers/DevOps-WorkItem-Helpers.ps1 | 390 +++++++++++++++++- .../scripts/Helpers/Resource-Helpers.ps1 | 77 +++- .../scripts/Mark-ReleasePlanCompletion.ps1 | 65 +++ eng/common/scripts/Package-Properties.ps1 | 58 ++- eng/common/scripts/Prepare-Release.ps1 | 53 ++- .../scripts/Save-Package-Properties.ps1 | 42 +- .../scripts/Set-VcpkgWriteModeCache.ps1 | 23 ++ eng/common/scripts/SetTestPipelineVersion.ps1 | 171 ++++++-- eng/common/scripts/Submit-PullRequest.ps1 | 10 +- eng/common/scripts/Update-ChangeLog.ps1 | 6 +- eng/common/scripts/Update-DocsMsMetadata.ps1 | 7 +- eng/common/scripts/Update-DocsMsPackages.ps1 | 10 +- .../Update-PullRequest-In-ReleasePlan.ps1 | 37 ++ eng/common/scripts/Validate-All-Packages.ps1 | 296 +++++++++++-- eng/common/scripts/Verify-ChangeLogs.ps1 | 13 +- eng/common/scripts/Verify-Links.ps1 | 37 ++ eng/common/scripts/Verify-Readme.ps1 | 2 +- .../check-spelling-in-changed-files.ps1 | 2 +- eng/common/scripts/common.ps1 | 1 + .../scripts/job-matrix/Create-JobMatrix.ps1 | 4 +- eng/common/scripts/logging.ps1 | 21 +- eng/common/scripts/login-to-github.ps1 | 198 +++++++++ .../stress-testing/deploy-stress-tests.ps1 | 25 ++ .../find-all-stress-packages.ps1 | 6 +- .../stress-test-deployment-lib.ps1 | 10 +- 31 files changed, 1720 insertions(+), 172 deletions(-) create mode 100644 eng/common/scripts/Mark-ReleasePlanCompletion.ps1 create mode 100644 eng/common/scripts/Set-VcpkgWriteModeCache.ps1 create mode 100644 eng/common/scripts/Update-PullRequest-In-ReleasePlan.ps1 create mode 100644 eng/common/scripts/login-to-github.ps1 diff --git a/eng/common/scripts/ChangeLog-Operations.ps1 b/eng/common/scripts/ChangeLog-Operations.ps1 index f29fc12068dc..170157ff5112 100644 --- a/eng/common/scripts/ChangeLog-Operations.ps1 +++ b/eng/common/scripts/ChangeLog-Operations.ps1 @@ -8,6 +8,15 @@ $CHANGELOG_UNRELEASED_STATUS = "(Unreleased)" $CHANGELOG_DATE_FORMAT = "yyyy-MM-dd" $RecommendedSectionHeaders = @("Features Added", "Breaking Changes", "Bugs Fixed", "Other Changes") +# Helper function to build the section header regex pattern +function Get-SectionHeaderRegex { + param( + [Parameter(Mandatory = $true)] + [string]$InitialAtxHeader + ) + return "^${InitialAtxHeader}${SECTION_HEADER_REGEX_SUFFIX}" +} + # Returns a Collection of changeLogEntry object containing changelog info for all versions present in the gived CHANGELOG function Get-ChangeLogEntries { param ( @@ -49,9 +58,10 @@ function Get-ChangeLogEntriesFromContent { $initialAtxHeader = $matches["HeaderLevel"] } - $sectionHeaderRegex = "^${initialAtxHeader}${SECTION_HEADER_REGEX_SUFFIX}" + $sectionHeaderRegex = Get-SectionHeaderRegex -InitialAtxHeader $initialAtxHeader $changeLogEntries | Add-Member -NotePropertyName "InitialAtxHeader" -NotePropertyValue $initialAtxHeader $releaseTitleAtxHeader = $initialAtxHeader + "#" + $headerLines = @() try { # walk the document, finding where the version specifiers are and creating lists @@ -83,6 +93,9 @@ function Get-ChangeLogEntriesFromContent { $changeLogEntry.ReleaseContent += $line } + else { + $headerLines += $line + } } } } @@ -90,6 +103,8 @@ function Get-ChangeLogEntriesFromContent { Write-Error "Error parsing Changelog." Write-Error $_ } + + $changeLogEntries | Add-Member -NotePropertyName "HeaderBlock" -NotePropertyValue ($headerLines -Join [Environment]::NewLine) return $changeLogEntries } @@ -265,8 +280,13 @@ function Set-ChangeLogContent { ) $changeLogContent = @() - $changeLogContent += "$($ChangeLogEntries.InitialAtxHeader) Release History" - $changeLogContent += "" + if ($ChangeLogEntries.HeaderBlock) { + $changeLogContent += $ChangeLogEntries.HeaderBlock + } + else { + $changeLogContent += "$($ChangeLogEntries.InitialAtxHeader) Release History" + $changeLogContent += "" + } $ChangeLogEntries = Sort-ChangeLogEntries -changeLogEntries $ChangeLogEntries @@ -290,7 +310,7 @@ function Remove-EmptySections { $InitialAtxHeader = "#" ) - $sectionHeaderRegex = "^${InitialAtxHeader}${SECTION_HEADER_REGEX_SUFFIX}" + $sectionHeaderRegex = Get-SectionHeaderRegex -InitialAtxHeader $InitialAtxHeader $releaseContent = $ChangeLogEntry.ReleaseContent if ($releaseContent.Count -gt 0) @@ -449,3 +469,135 @@ function Confirm-ChangeLogForRelease { } return $ChangeLogStatus.IsValid } + +function Parse-ChangelogContent { + <# + .SYNOPSIS + Parses raw changelog text into structured content with sections. + + .DESCRIPTION + Takes raw changelog text and parses it into structured arrays containing + ReleaseContent (all lines) and Sections (organized by section headers). + This function only generates content structure without modifying any files. + + .PARAMETER ChangelogText + The new changelog text containing sections (e.g., "### Breaking Changes", "### Features Added"). + + .PARAMETER InitialAtxHeader + The markdown header level used in the changelog (e.g., "#" for H1, "##" for H2). + Defaults to "#". + + .OUTPUTS + PSCustomObject with ReleaseContent and Sections properties. + + .EXAMPLE + $content = Parse-ChangelogContent -ChangelogText $changelogText -InitialAtxHeader "#" + $content.ReleaseContent # Array of all lines + $content.Sections # Hashtable of section name to content lines + #> + [CmdletBinding()] + param( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [string]$ChangelogText, + + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [string]$InitialAtxHeader = "#" + ) + + Write-Verbose "Parsing changelog text into structured content..." + + # Parse the new changelog content into lines + $changelogLines = $ChangelogText -split "`r?`n" + + # Initialize content structure + $releaseContent = @() + $sections = @{} + + # Add an empty line after the version header + $releaseContent += "" + + # Parse the changelog content + # InitialAtxHeader represents the markdown header level (e.g., "#" for H1, "##" for H2) + # Section headers are two levels deeper than the changelog title + # (e.g., "### Breaking Changes" if InitialAtxHeader is "#") + $currentSection = $null + $sectionHeaderRegex = Get-SectionHeaderRegex -InitialAtxHeader $InitialAtxHeader + + foreach ($line in $changelogLines) { + if ($line.Trim() -match $sectionHeaderRegex) { + $currentSection = $matches["sectionName"].Trim() + $sections[$currentSection] = @() + $releaseContent += $line + Write-Verbose " Found section: $currentSection" + } + elseif ($currentSection) { + $sections[$currentSection] += $line + $releaseContent += $line + } + else { + $releaseContent += $line + } + } + + Write-Verbose " Parsed $($sections.Count) section(s)" + + # Return structured content + return [PSCustomObject]@{ + ReleaseContent = $releaseContent + Sections = $sections + } +} + +function Set-ChangeLogEntryContent { + <# + .SYNOPSIS + Updates a changelog entry with new content. + + .DESCRIPTION + Takes a changelog entry object and new changelog text, parses the text into + structured content, and updates the entry's ReleaseContent and Sections properties. + + .PARAMETER ChangeLogEntry + The changelog entry object to update (from Get-ChangeLogEntries). + + .PARAMETER NewContent + The new changelog text containing sections. + + .PARAMETER InitialAtxHeader + The markdown header level used in the changelog. Defaults to "#". + + .OUTPUTS + The updated changelog entry object. + + .EXAMPLE + $entries = Get-ChangeLogEntries -ChangeLogLocation $changelogPath + $entry = $entries["1.0.0"] + Set-ChangeLogEntryContent -ChangeLogEntry $entry -NewContent $newText -InitialAtxHeader $entries.InitialAtxHeader + Set-ChangeLogContent -ChangeLogLocation $changelogPath -ChangeLogEntries $entries + #> + [CmdletBinding()] + param( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [PSCustomObject]$ChangeLogEntry, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [string]$NewContent, + + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [string]$InitialAtxHeader = "#" + ) + + # Parse the new content into structured format + $parsedContent = Parse-ChangelogContent -ChangelogText $NewContent -InitialAtxHeader $InitialAtxHeader + + # Update the entry with the parsed content + $ChangeLogEntry.ReleaseContent = $parsedContent.ReleaseContent + $ChangeLogEntry.Sections = $parsedContent.Sections + + return $ChangeLogEntry +} diff --git a/eng/common/scripts/Create-APIReview.ps1 b/eng/common/scripts/Create-APIReview.ps1 index f2b21778f09a..e39490cb4e9e 100644 --- a/eng/common/scripts/Create-APIReview.ps1 +++ b/eng/common/scripts/Create-APIReview.ps1 @@ -96,14 +96,14 @@ function Upload-SourceArtifact($filePath, $apiLabel, $releaseStatus, $packageVer } $uri = "${APIViewUri}/upload" - + # Get Bearer token for authentication $bearerToken = Get-ApiViewBearerToken if (-not $bearerToken) { Write-Error "Failed to acquire Bearer token for APIView authentication." return [System.Net.HttpStatusCode]::Unauthorized } - + $headers = @{ "Authorization" = "Bearer $bearerToken"; "content-type" = "multipart/form-data" @@ -147,14 +147,14 @@ function Upload-ReviewTokenFile($packageName, $apiLabel, $releaseStatus, $review } Write-Host "Request to APIView: $uri" - + # Get Bearer token for authentication $bearerToken = Get-ApiViewBearerToken if (-not $bearerToken) { Write-Error "Failed to acquire Bearer token for APIView authentication." return [System.Net.HttpStatusCode]::Unauthorized } - + $headers = @{ "Authorization" = "Bearer $bearerToken" } @@ -234,13 +234,13 @@ function ProcessPackage($packageInfo) # Check if the function supports the packageInfo parameter $functionInfo = Get-Command $FindArtifactForApiReviewFn -ErrorAction SilentlyContinue $supportsPackageInfoParam = $false - + if ($functionInfo -and $functionInfo.Parameters) { # Check if function specifically supports packageInfo parameter $parameterNames = $functionInfo.Parameters.Keys $supportsPackageInfoParam = $parameterNames -contains 'packageInfo' } - + # Call function with appropriate parameters if ($supportsPackageInfoParam) { LogInfo "Calling $FindArtifactForApiReviewFn with packageInfo parameter" diff --git a/eng/common/scripts/Delete-RemoteBranches.ps1 b/eng/common/scripts/Delete-RemoteBranches.ps1 index 55b20f63126a..9ff5006e1ab0 100644 --- a/eng/common/scripts/Delete-RemoteBranches.ps1 +++ b/eng/common/scripts/Delete-RemoteBranches.ps1 @@ -8,6 +8,12 @@ param( # For sync-eng/common work, we use regex as "^sync-eng/common.*-(?\d+).*$". # For sync-.github/workflows work, we use regex as "^sync-.github/workflows.*-(?\d+).*$". $BranchRegex, + # When set, directly delete this exact branch name without querying all branches. + # This is a fast path that avoids the expensive GraphQL branch listing and rate limit + # checks, useful when the caller already knows the exact branch name to delete (e.g. + # the eng/common sync pipeline). If the branch does not exist, a warning is + # logged and the script exits successfully. + [string]$TargetBranch, # Date format: e.g. Tuesday, April 12, 2022 1:36:02 PM. Allow to use other date format. [AllowNull()] [DateTime]$LastCommitOlderThan, @@ -66,6 +72,33 @@ if ($AuthToken) { $owner, $repo = $RepoId -split "/" +# Fast path: when the caller already knows the exact branch name, skip the expensive +# GraphQL query that lists all branches and the associated rate limit checks. This +# reduces the number of GitHub API calls from ~5+ down to 1 per repo, which helps +# avoid hitting the secondary rate limit when deleting branches across many repos. +if ($TargetBranch) { + LogDebug "TargetBranch specified, using direct deletion for branch '$TargetBranch' in '$RepoId'" + if ($PSCmdlet.ShouldProcess("'$TargetBranch' in '$RepoId'", "Deleting branch (target)")) { + $response = gh api "repos/${RepoId}/git/refs/heads/${TargetBranch}" -X DELETE 2>&1 + if ($LASTEXITCODE) { + # GitHub returns 422 when the ref doesn't exist. Treat that as a non-fatal warning + # since the goal (branch gone) is already achieved. + if ($response -match "Reference does not exist" -or $response -match "HTTP 422") { + LogWarning "Branch '$TargetBranch' does not exist in '$RepoId'. It may have already been deleted." + } + else { + LogError "Deletion of branch '$TargetBranch' in '$RepoId' failed: $response" + exit 1 + } + } + else { + LogDebug "Successfully deleted branch '$TargetBranch' in '$RepoId'." + } + } + # Nothing else to do, exit early. + exit 0 +} + # These will always be output at the end of the script. Their only purpose is for information gathering # Total number returned from query $totalBranchesFromQuery = 0 diff --git a/eng/common/scripts/Detect-Api-Changes.ps1 b/eng/common/scripts/Detect-Api-Changes.ps1 index 25f3101a8b9b..c8e00935cbe0 100644 --- a/eng/common/scripts/Detect-Api-Changes.ps1 +++ b/eng/common/scripts/Detect-Api-Changes.ps1 @@ -22,8 +22,16 @@ Param ( $configFileDir = Join-Path -Path $ArtifactPath "PackageInfo" # Submit API review request and return status whether current revision is approved or pending or failed to create review -function Submit-Request($filePath, $packageName) +function Submit-Request($filePath, $packageInfo) { + $packageName = $packageInfo.ArtifactName ?? $packageInfo.Name + $packageType = $packageInfo.SdkType + + # Construct full package name with groupId if available + $fullPackageName = $packageName + if ($packageInfo.PSObject.Members.Name -contains "Group" -and $packageInfo.Group) { + $fullPackageName = "$($packageInfo.Group):$packageName" + } $repoName = $RepoFullName if (!$repoName) { $repoName = "azure/azure-sdk-for-$LanguageShort" @@ -36,9 +44,10 @@ function Submit-Request($filePath, $packageName) $query.Add('commitSha', $CommitSha) $query.Add('repoName', $repoName) $query.Add('pullRequestNumber', $PullRequestNumber) - $query.Add('packageName', $packageName) + $query.Add('packageName', $fullPackageName) $query.Add('language', $LanguageShort) $query.Add('project', $DevopsProject) + $query.Add('packageType', $packageType) $reviewFileFullName = Join-Path -Path $ArtifactPath $packageName $reviewFileName # If CI generates token file then it passes both token file name and original file (filePath) to APIView # If both files are passed then APIView downloads the parent directory as a zip @@ -73,29 +82,26 @@ function Submit-Request($filePath, $packageName) } catch { - LogError "Error $StatusCode - Exception details: $($_.Exception.Response)" + Write-Host "ERROR: API request failed" -ForegroundColor Red + Write-Host "Status Code: $($_.Exception.Response.StatusCode.Value__)" -ForegroundColor Yellow + Write-Host "Error: $($_.Exception.Message)" -ForegroundColor Yellow + if ($_.ErrorDetails.Message) { + Write-Host "Details: $($_.ErrorDetails.Message)" -ForegroundColor Yellow + } + LogError "Failed to detect API changes. See details above." $StatusCode = $_.Exception.Response.StatusCode } return $StatusCode } -function Should-Process-Package($pkgPath, $packageName) +function Should-Process-Package($packageInfo) { - $pkg = Split-Path -Leaf $pkgPath - $pkgPropPath = Join-Path -Path $configFileDir "$packageName.json" - if (!(Test-Path $pkgPropPath)) - { - LogWarning "Package property file path $($pkgPropPath) is invalid." - return $False - } - # Get package info from json file created before updating version to daily dev - $pkgInfo = Get-Content $pkgPropPath | ConvertFrom-Json - $packagePath = $pkgInfo.DirectoryPath + $packagePath = $packageInfo.DirectoryPath $modifiedFiles = @(Get-ChangedFiles -DiffPath "$packagePath/*" -DiffFilterType '') $filteredFileCount = $modifiedFiles.Count LogInfo "Number of modified files for package: $filteredFileCount" - return ($filteredFileCount -gt 0 -and $pkgInfo.IsNewSdk) + return ($filteredFileCount -gt 0 -and $packageInfo.IsNewSdk) } function Log-Input-Params() @@ -126,29 +132,48 @@ $responses = @{} LogInfo "Processing PackageInfo at $configFileDir" -$packageProperties = Get-ChildItem -Recurse -Force "$configFileDir" ` - | Where-Object { +$packageInfoFiles = Get-ChildItem -Recurse -Force "$configFileDir" ` + | Where-Object { $_.Extension -eq '.json' -and ($_.FullName.Substring($configFileDir.Length + 1) -notmatch '^_.*?[\\\/]') } -foreach ($packagePropFile in $packageProperties) +foreach ($packageInfoFile in $packageInfoFiles) { - $packageMetadata = Get-Content $packagePropFile | ConvertFrom-Json - $pkgArtifactName = $packageMetadata.ArtifactName ?? $packageMetadata.Name + $packageInfo = Get-Content $packageInfoFile | ConvertFrom-Json + $pkgArtifactName = $packageInfo.ArtifactName ?? $packageInfo.Name + $packageType = $packageInfo.SdkType LogInfo "Processing $($pkgArtifactName)" - $packages = &$FindArtifactForApiReviewFn $ArtifactPath $pkgArtifactName + # Check if the function supports the packageInfo parameter + $functionInfo = Get-Command $FindArtifactForApiReviewFn -ErrorAction SilentlyContinue + $supportsPackageInfoParam = $false + + if ($functionInfo -and $functionInfo.Parameters) { + # Check if function specifically supports packageInfo parameter + $parameterNames = $functionInfo.Parameters.Keys + $supportsPackageInfoParam = $parameterNames -contains 'packageInfo' + } + + # Call function with appropriate parameters + if ($supportsPackageInfoParam) { + LogInfo "Calling $FindArtifactForApiReviewFn with packageInfo parameter" + $packages = &$FindArtifactForApiReviewFn $ArtifactPath $packageInfo + } + else { + LogInfo "Calling $FindArtifactForApiReviewFn with legacy parameters" + $packages = &$FindArtifactForApiReviewFn $ArtifactPath $pkgArtifactName + } if ($packages) { $pkgPath = $packages.Values[0] - $isRequired = Should-Process-Package -pkgPath $pkgPath -packageName $pkgArtifactName + $isRequired = Should-Process-Package $packageInfo LogInfo "Is API change detect required for $($pkgArtifactName):$($isRequired)" if ($isRequired -eq $True) { $filePath = $pkgPath.Replace($ArtifactPath , "").Replace("\", "/") - $respCode = Submit-Request -filePath $filePath -packageName $pkgArtifactName + $respCode = Submit-Request -filePath $filePath -packageInfo $packageInfo if ($respCode -ne '200') { $responses[$pkgArtifactName] = $respCode @@ -156,7 +181,7 @@ foreach ($packagePropFile in $packageProperties) } else { - LogInfo "Pull request does not have any change for $($pkgArtifactName)). Skipping API change detect." + LogInfo "Pull request does not have any change for $($pkgArtifactName). Skipping API change detect." } } else diff --git a/eng/common/scripts/Helpers/ApiView-Helpers.ps1 b/eng/common/scripts/Helpers/ApiView-Helpers.ps1 index e8d867db9e95..e65371452306 100644 --- a/eng/common/scripts/Helpers/ApiView-Helpers.ps1 +++ b/eng/common/scripts/Helpers/ApiView-Helpers.ps1 @@ -124,7 +124,7 @@ function Set-ApiViewCommentForRelatedIssues { param ( [Parameter(Mandatory = $true)] [string]$HeadCommitish, - [string]$APIViewHost = "https://apiview.dev", + [string]$APIViewHost = "https://apiview.org", [ValidateNotNullOrEmpty()] [Parameter(Mandatory = $true)] $AuthToken @@ -215,7 +215,7 @@ function Set-ApiViewCommentForPR { try { $existingComment = Get-GitHubIssueComments -RepoOwner $RepoOwner -RepoName $RepoName -IssueNumber $PrNumber -AuthToken $AuthToken $existingAPIViewComment = $existingComment | Where-Object { - $_.body.StartsWith("**API Change Check**", [StringComparison]::OrdinalIgnoreCase) -or $_.body.StartsWith("## API Change Check", [StringComparison]::OrdinalIgnoreCase) } + $_.body.StartsWith("**API Change Check**", [StringComparison]::OrdinalIgnoreCase) -or $_.body.StartsWith("## API Change Check", [StringComparison]::OrdinalIgnoreCase) } | Select-Object -Last 1 } catch { LogWarning "Failed to get comments from Pull Request: $PrNumber in repo: $repoFullName" } @@ -241,7 +241,7 @@ function Set-ApiViewCommentForPR { # Helper function used to create API review requests for Spec generation SDKs pipelines function Create-API-Review { param ( - [string]$apiviewEndpoint = "https://apiview.dev/api/PullRequests/CreateAPIRevisionIfAPIHasChanges", + [string]$apiviewEndpoint = "https://apiview.org/api/PullRequests/CreateAPIRevisionIfAPIHasChanges", [string]$specGenSDKArtifactPath, [string]$apiviewArtifactName, [string]$buildId, diff --git a/eng/common/scripts/Helpers/CommandInvocation-Helpers.ps1 b/eng/common/scripts/Helpers/CommandInvocation-Helpers.ps1 index 0b9f810b83aa..48b81498728c 100644 --- a/eng/common/scripts/Helpers/CommandInvocation-Helpers.ps1 +++ b/eng/common/scripts/Helpers/CommandInvocation-Helpers.ps1 @@ -1,4 +1,6 @@ -function Invoke-LoggedCommand +. $PSScriptRoot/../logging.ps1 + +function Invoke-LoggedMsbuildCommand { [CmdletBinding()] param @@ -8,12 +10,27 @@ function Invoke-LoggedCommand [switch] $GroupOutput, [int[]] $AllowedExitCodes = @(0) ) + return Invoke-LoggedCommand $Command -ExecutePath $ExecutePath -GroupOutput:$GroupOutput -AllowedExitCodes $AllowedExitCodes -OutputProcessor { param($line) ProcessMsBuildLogLine $line } + +} + +function Invoke-LoggedCommand +{ + [CmdletBinding()] + param + ( + [string] $Command, + [string] $ExecutePath, + [switch] $GroupOutput, + [int[]] $AllowedExitCodes = @(0), + [switch] $DoNotExitOnFailedExitCode, + [scriptblock] $OutputProcessor + ) - $pipelineBuild = !!$env:TF_BUILD $startTime = Get-Date - if($pipelineBuild -and $GroupOutput) { - Write-Host "##[group]$Command" + if($GroupOutput) { + LogGroupStart $Command } else { Write-Host "> $Command" } @@ -22,21 +39,24 @@ function Invoke-LoggedCommand Push-Location $ExecutePath } + if (!$OutputProcessor) { + $OutputProcessor = { param($line) $line } + } + try { - Invoke-Expression $Command + Invoke-Expression $Command | Foreach-Object { & $OutputProcessor $_ } $duration = (Get-Date) - $startTime - if($pipelineBuild -and $GroupOutput) { - Write-Host "##[endgroup]" + if($GroupOutput) { + LogGroupEnd } - if($LastExitCode -notin $AllowedExitCodes) + if($LASTEXITCODE -notin $AllowedExitCodes) { - if($pipelineBuild) { - Write-Error "##[error]Command failed to execute ($duration): $Command`n" - } else { - Write-Error "Command failed to execute ($duration): $Command`n" + LogError "Command failed to execute ($duration): $Command`n" + if (!$DoNotExitOnFailedExitCode) { + exit $LASTEXITCODE } } else { diff --git a/eng/common/scripts/Helpers/DevOps-WorkItem-Helpers.ps1 b/eng/common/scripts/Helpers/DevOps-WorkItem-Helpers.ps1 index 9a46e2c126f1..f91693dcafd3 100644 --- a/eng/common/scripts/Helpers/DevOps-WorkItem-Helpers.ps1 +++ b/eng/common/scripts/Helpers/DevOps-WorkItem-Helpers.ps1 @@ -1,8 +1,15 @@ +. (Join-Path $PSScriptRoot .. SemVer.ps1) + $ReleaseDevOpsOrgParameters = @("--organization", "https://dev.azure.com/azure-sdk") $ReleaseDevOpsCommonParameters = $ReleaseDevOpsOrgParameters + @("--output", "json") $ReleaseDevOpsCommonParametersWithProject = $ReleaseDevOpsCommonParameters + @("--project", "Release") +# This is used to determine whether or not the az login and azure-devops extension +# install have already been completed. +$global:AzLoginAndDevOpsExtensionInstallComplete = $false +$global:HasDevOpsAccess = $false + function Get-DevOpsRestHeaders() { # Get a temp access token from the logged in az cli user for azure devops resource @@ -17,27 +24,68 @@ function Get-DevOpsRestHeaders() return $headers } +# Function was created from the same code being in Update-DevOps-Release-WorkItem.ps1 +# and Validate-Package.ps1. The global variable is used to prevent az commands from +# being rerun multiple times +function CheckAzLoginAndDevOpsExtensionInstall() +{ + if (-not $global:AzLoginAndDevOpsExtensionInstallComplete) { + az account show *> $null + if (!$?) { + Write-Host 'Running az login...' + az login *> $null + } + + az extension show -n azure-devops *> $null + if (!$?){ + az extension add --name azure-devops + } else { + # Force update the extension to the latest version if it was already installed + # this is needed to ensure we have the authentication issue fixed from earlier versions + az extension update -n azure-devops *> $null + } + $global:AzLoginAndDevOpsExtensionInstallComplete = $true + } +} + function CheckDevOpsAccess() { - # Dummy test query to validate permissions - $query = "SELECT [System.ID] FROM WorkItems WHERE [Work Item Type] = 'Package' AND [Package] = 'azure-sdk-template'" + if (-not $global:HasDevOpsAccess) { + # Dummy test query to validate permissions + $query = "SELECT [System.ID] FROM WorkItems WHERE [Work Item Type] = 'Package' AND [Package] = 'azure-sdk-template'" - $response = Invoke-RestMethod -Method POST ` - -Uri "https://dev.azure.com/azure-sdk/Release/_apis/wit/wiql/?api-version=6.0" ` - -Headers (Get-DevOpsRestHeaders) -Body "{ ""query"": ""$query"" }" -ContentType "application/json" | ConvertTo-Json -Depth 10 | ConvertFrom-Json -AsHashTable + $response = Invoke-RestMethod -Method POST ` + -Uri "https://dev.azure.com/azure-sdk/Release/_apis/wit/wiql/?api-version=6.0" ` + -Headers (Get-DevOpsRestHeaders) -Body "{ ""query"": ""$query"" }" -ContentType "application/json" | ConvertTo-Json -Depth 10 | ConvertFrom-Json -AsHashTable - if ($response -isnot [HashTable] -or !$response.ContainsKey("workItems")) { - throw "Failed to run test query against Azure DevOps. Please ensure you are logged into the public azure cloud. Consider running 'az logout' and then 'az login'." + if ($response -isnot [HashTable] -or !$response.ContainsKey("workItems")) { + throw "Failed to run test query against Azure DevOps. Please ensure you are logged into the public azure cloud. Consider running 'az logout' and then 'az login'." + } + $global:HasDevOpsAccess = $true } } +function GetGroupId($pkg) +{ + if ($pkg.PSObject.Properties.Name -contains "GroupId") { + return $pkg.GroupId + } + return $null +} + function Invoke-AzBoardsCmd($subCmd, $parameters, $output = $true) { $azCmdStr = "az boards ${subCmd} $($parameters -join ' ')" if ($output) { Write-Host $azCmdStr } - return Invoke-Expression "$azCmdStr" | ConvertFrom-Json -AsHashTable + $response = Invoke-Expression "$azCmdStr" | ConvertFrom-Json -AsHashtable + + if ($LASTEXITCODE -ne 0) { + Write-Host "ERROR command failed: $azCmdStr" + } + + return $response } function Invoke-Query($fields, $wiql, $output = $true) @@ -175,16 +223,17 @@ function FindParentWorkItem($serviceName, $packageDisplayName, $outputCommand = $packageWorkItems = @{} $packageWorkItemWithoutKeyFields = @{} -function FindLatestPackageWorkItem($lang, $packageName, $outputCommand = $true, $ignoreReleasePlannerTests = $true, $tag = $null) +function FindLatestPackageWorkItem($lang, $packageName, $groupId = $null, $outputCommand = $true, $ignoreReleasePlannerTests = $true, $tag = $null) { # Cache all the versions of this package and language work items - $null = FindPackageWorkItem $lang $packageName -includeClosed $true -outputCommand $outputCommand -ignoreReleasePlannerTests $ignoreReleasePlannerTests -tag $tag + $null = FindPackageWorkItem $lang $packageName -includeClosed $true -outputCommand $outputCommand -ignoreReleasePlannerTests $ignoreReleasePlannerTests -tag $tag -groupId $groupId $latestWI = $null foreach ($wi in $packageWorkItems.Values) { if ($wi.fields["Custom.Language"] -ne $lang) { continue } if ($wi.fields["Custom.Package"] -ne $packageName) { continue } + if ($groupId -and $wi.fields["Custom.GroupId"] -ne $groupId) { continue } if (!$latestWI) { $latestWI = $wi @@ -198,9 +247,9 @@ function FindLatestPackageWorkItem($lang, $packageName, $outputCommand = $true, return $latestWI } -function FindPackageWorkItem($lang, $packageName, $version, $outputCommand = $true, $includeClosed = $false, $ignoreReleasePlannerTests = $true, $tag = $null) +function FindPackageWorkItem($lang, $packageName, $version, $groupId = $null, $outputCommand = $true, $includeClosed = $false, $ignoreReleasePlannerTests = $true, $tag = $null) { - $key = BuildHashKeyNoNull $lang $packageName $version + $key = BuildHashKey $lang $packageName $version $groupId if ($key -and $packageWorkItems.ContainsKey($key)) { return $packageWorkItems[$key] } @@ -213,6 +262,7 @@ function FindPackageWorkItem($lang, $packageName, $version, $outputCommand = $tr $fields += "System.Tags" $fields += "Custom.Language" $fields += "Custom.Package" + $fields += "Custom.GroupId" $fields += "Custom.PackageDisplayName" $fields += "System.Title" $fields += "Custom.PackageType" @@ -228,6 +278,7 @@ function FindPackageWorkItem($lang, $packageName, $version, $outputCommand = $tr $fields += "Custom.Generated" $fields += "Custom.RoadmapState" $fields += "Microsoft.VSTS.Common.StateChangeDate" + $fields += "Custom.SpecProjectPath" $fieldList = ($fields | ForEach-Object { "[$_]"}) -join ", " $query = "SELECT ${fieldList} FROM WorkItems WHERE [Work Item Type] = 'Package'" @@ -241,6 +292,9 @@ function FindPackageWorkItem($lang, $packageName, $version, $outputCommand = $tr if ($packageName) { $query += " AND [Package] = '${packageName}'" } + if ($groupId) { + $query += " AND [GroupId] = '${groupId}'" + } if ($version) { $query += " AND [PackageVersionMajorMinor] = '${version}'" } @@ -254,7 +308,7 @@ function FindPackageWorkItem($lang, $packageName, $version, $outputCommand = $tr foreach ($wi in $workItems) { - $localKey = BuildHashKeyNoNull $wi.fields["Custom.Language"] $wi.fields["Custom.Package"] $wi.fields["Custom.PackageVersionMajorMinor"] + $localKey = BuildHashKey $wi.fields["Custom.Language"] $wi.fields["Custom.Package"] $wi.fields["Custom.PackageVersionMajorMinor"] $wi.fields["Custom.GroupId"] if (!$localKey) { $packageWorkItemWithoutKeyFields[$wi.id] = $wi Write-Host "Skipping package [$($wi.id)]$($wi.fields['System.Title']) which is missing required fields language, package, or version." @@ -325,6 +379,18 @@ function CreateWorkItemParent($id, $parentId, $oldParentId, $outputCommand = $tr Invoke-AzBoardsCmd "work-item relation add" $parameters $outputCommand | Out-Null } +function CheckUser($user) +{ + $azCmdStr = "az devops user show --user ${user} $($ReleaseDevOpsCommonParameters -join ' ')" + Invoke-Expression "$azCmdStr" | Out-Null + + if ($LASTEXITCODE -ne 0) { + return $false + } + + return $true +} + function CreateWorkItem($title, $type, $iteration, $area, $fields, $assignedTo, $parentId, $relatedId = $null, $outputCommand = $true, $tag = $null) { $parameters = $ReleaseDevOpsCommonParametersWithProject @@ -332,7 +398,7 @@ function CreateWorkItem($title, $type, $iteration, $area, $fields, $assignedTo, $parameters += "--type", "`"${type}`"" $parameters += "--iteration", "`"${iteration}`"" $parameters += "--area", "`"${area}`"" - if ($assignedTo) { + if ($assignedTo -and (CheckUser $assignedTo)) { $parameters += "--assigned-to", "`"${assignedTo}`"" } if ($tag) @@ -354,7 +420,6 @@ function CreateWorkItem($title, $type, $iteration, $area, $fields, $assignedTo, Write-Host "Creating work item" $workItem = Invoke-AzBoardsCmd "work-item create" $parameters $outputCommand - Write-Host $workItem $workItemId = $workItem.id Write-Host "Created work item [$workItemId]." if ($parentId) @@ -390,7 +455,7 @@ function UpdateWorkItem($id, $fields, $title, $state, $assignedTo, $outputComman if ($state) { $parameters += "--state", "`"${state}`"" } - if ($assignedTo) { + if ($assignedTo -and (CheckUser $assignedTo)) { $parameters += "--assigned-to", "`"${assignedTo}`"" } if ($fields) { @@ -409,10 +474,11 @@ function UpdatePackageWorkItemReleaseState($id, $state, $releaseType, $outputCom function FindOrCreateClonePackageWorkItem($lang, $pkg, $verMajorMinor, $allowPrompt = $false, $outputCommand = $false, $relatedId = $null, $tag= $null, $ignoreReleasePlannerTests = $true) { - $workItem = FindPackageWorkItem -lang $lang -packageName $pkg.Package -version $verMajorMinor -includeClosed $true -outputCommand $outputCommand -tag $tag -ignoreReleasePlannerTests $ignoreReleasePlannerTests + $groupId = GetGroupId $pkg + $workItem = FindPackageWorkItem -lang $lang -packageName $pkg.Package -version $verMajorMinor -includeClosed $true -outputCommand $outputCommand -tag $tag -ignoreReleasePlannerTests $ignoreReleasePlannerTests -groupId $groupId if (!$workItem) { - $latestVersionItem = FindLatestPackageWorkItem -lang $lang -packageName $pkg.Package -outputCommand $outputCommand -tag $tag -ignoreReleasePlannerTests $ignoreReleasePlannerTests + $latestVersionItem = FindLatestPackageWorkItem -lang $lang -packageName $pkg.Package -outputCommand $outputCommand -tag $tag -ignoreReleasePlannerTests $ignoreReleasePlannerTests -groupId $groupId $assignedTo = "me" $extraFields = @() if ($latestVersionItem) { @@ -460,6 +526,9 @@ function CreateOrUpdatePackageWorkItem($lang, $pkg, $verMajorMinor, $existingIte Write-Host "Cannot create or update because one of lang, pkg or verMajorMinor aren't set. [$lang|$($pkg.Package)|$verMajorMinor]" return } + + # PackageProp object uses Group, while other places use GroupId, such as in work item fields and package csv files. + $pkgGroupId = GetGroupId $pkg $pkgName = $pkg.Package $pkgDisplayName = $pkg.DisplayName $pkgType = $pkg.Type @@ -471,6 +540,7 @@ function CreateOrUpdatePackageWorkItem($lang, $pkg, $verMajorMinor, $existingIte $fields = @() $fields += "`"Language=${lang}`"" $fields += "`"Package=${pkgName}`"" + $fields += "`"GroupId=${pkgGroupId}`"" $fields += "`"PackageDisplayName=${pkgDisplayName}`"" $fields += "`"PackageType=${pkgType}`"" $fields += "`"PackageTypeNewLibrary=${pkgNewLibrary}`"" @@ -488,6 +558,7 @@ function CreateOrUpdatePackageWorkItem($lang, $pkg, $verMajorMinor, $existingIte if ($lang -ne $existingItem.fields["Custom.Language"]) { $changedField = "Custom.Language" } if ($pkgName -ne $existingItem.fields["Custom.Package"]) { $changedField = "Custom.Package" } + if ($pkgGroupId -ne $existingItem.fields["Custom.GroupId"]) { $changedField = "Custom.GroupId" } if ($verMajorMinor -ne $existingItem.fields["Custom.PackageVersionMajorMinor"]) { $changedField = "Custom.PackageVersionMajorMinor" } if ($pkgDisplayName -ne $existingItem.fields["Custom.PackageDisplayName"]) { $changedField = "Custom.PackageDisplayName" } if ($pkgType -ne [string]$existingItem.fields["Custom.PackageType"]) { $changedField = "Custom.PackageType" } @@ -977,15 +1048,16 @@ function UpdatePackageVersions($pkgWorkItem, $plannedVersions, $shippedVersions) function UpdateValidationStatus($pkgvalidationDetails, $BuildDefinition, $PipelineUrl) { $pkgName = $pkgValidationDetails.Name + $groupId = GetGroupId $pkgValidationDetails $versionString = $pkgValidationDetails.Version $parsedNewVersion = [AzureEngSemanticVersion]::new($versionString) $versionMajorMinor = "" + $parsedNewVersion.Major + "." + $parsedNewVersion.Minor - $workItem = FindPackageWorkItem -lang $LanguageDisplayName -packageName $pkgName -version $versionMajorMinor -includeClosed $true -outputCommand $false + $workItem = FindPackageWorkItem -lang $LanguageDisplayName -packageName $pkgName -groupId $groupId -version $versionMajorMinor -includeClosed $true -outputCommand $false if (!$workItem) { - Write-Host"No work item found for package [$pkgName]." + Write-Host "No work item found for package [$pkgName] with groupId [$groupId]." return $false } @@ -1015,3 +1087,281 @@ function UpdateValidationStatus($pkgvalidationDetails, $BuildDefinition, $Pipeli Write-Host "[$($workItem.id)]$LanguageDisplayName - $pkgName($versionMajorMinor) - Updated" return $true } + +function Get-LanguageDevOpsName($LanguageShort) +{ + switch ($LanguageShort.ToLower()) + { + "net" { return "Dotnet" } + "js" { return "JavaScript" } + "java" { return "Java" } + "go" { return "Go" } + "python" { return "Python" } + default { return $null } + } +} + +function Get-ReleasePlanForPackage($packageName) +{ + $devopsFieldLanguage = Get-LanguageDevOpsName -LanguageShort $LanguageShort + if (!$devopsFieldLanguage) + { + Write-Host "Unsupported language to check release plans, language [$LanguageShort]" + return $null + } + + $prStatusFieldName = "SDKPullRequestStatusFor$($devopsFieldLanguage)" + $packageNameFieldName = "$($devopsFieldLanguage) Package Name" + $fields = @() + $fields += "System.ID" + $fields += "System.State" + $fields += "System.AssignedTo" + $fields += "System.Parent" + $fields += "System.Tags" + + $fieldList = ($fields | ForEach-Object { "[$_]"}) -join ", " + $query = "SELECT ${fieldList} FROM WorkItems WHERE [Work Item Type] = 'Release Plan' AND [${packageNameFieldName}] = '${packageName}'" + $query += " AND [${prStatusFieldName}] = 'merged'" + $query += " AND [System.State] IN ('In Progress')" + $query += " AND [System.Tags] NOT CONTAINS 'Release Planner App Test'" + $workItems = Invoke-Query $fields $query + return $workItems +} + +function Update-ReleaseStatusInReleasePlan($releasePlanWorkItemId, $status, $version) +{ + $devopsFieldLanguage = Get-LanguageDevOpsName -LanguageShort $LanguageShort + if (!$devopsFieldLanguage) + { + Write-Host "Unsupported language to check release plans, language [$LanguageShort]" + return $null + } + + $fields = @() + $fields += "`"ReleaseStatusFor$($devopsFieldLanguage)=$status`"" + $fields += "`"ReleasedVersionFor$($devopsFieldLanguage)=$version`"" + + Write-Host "Updating Release Plan [$releasePlanWorkItemId] with status [$status] for language [$LanguageShort]." + $workItem = UpdateWorkItem -id $releasePlanWorkItemId -fields $fields + Write-Host "Updated release status for [$LanguageShort] in Release Plan [$releasePlanWorkItemId]" +} + +function Update-PullRequestInReleasePlan($releasePlanWorkItemId, $pullRequestUrl, $status, $languageName) +{ + $devopsFieldLanguage = Get-LanguageDevOpsName -LanguageShort $languageName + if (!$devopsFieldLanguage) + { + Write-Host "Unsupported language to update release plan, language [$languageName]" + return $null + } + + $fields = @() + if ($pullRequestUrl) + { + $fields += "`"SDKPullRequestFor$($devopsFieldLanguage)=$pullRequestUrl`"" + } + $fields += "`"SDKPullRequestStatusFor$($devopsFieldLanguage)=$status`"" + $fields += "`"GenerationStatusFor$($devopsFieldLanguage)=Completed`"" + + Write-Host "Updating release plan [$releasePlanWorkItemId] with pull request details for language [$languageName]." + $workItem = UpdateWorkItem -id $releasePlanWorkItemId -fields $fields + Write-Host "Updated pull request details for [$languageName] in release plan [$releasePlanWorkItemId]" +} + +function Get-ReleasePlan-Link($releasePlanWorkItemId) +{ + $fields = @() + $fields += "System.Id" + $fields += "System.Title" + $fields += "Custom.ReleasePlanLink" + $fields += "Custom.ReleasePlanSubmittedby" + + $fieldList = ($fields | ForEach-Object { "[$_]"}) -join ", " + $query = "SELECT ${fieldList} FROM WorkItems WHERE [System.Id] = $releasePlanWorkItemId" + $workItem = Invoke-Query $fields $query + if (!$workItem) + { + Write-Host "Release plan with ID $releasePlanWorkItemId not found." + return $null + } + return $workItem["fields"] +} + +function Get-ReleasePlansForCPEXAttestation() +{ + $fields = @() + $fields += "Custom.ProductServiceTreeID" + $fields += "Custom.ReleasePlanType" + $fields += "Custom.ProductType" + $fields += "Custom.DataScope" + $fields += "Custom.MgmtScope" + $fields += "Custom.ProductName" + + $fieldList = ($fields | ForEach-Object { "[$_]"}) -join ", " + + $query = "SELECT ${fieldList} FROM WorkItems WHERE [System.WorkItemType] = 'Release Plan'" + $query += " AND [System.State] = 'Finished'" + $query += " AND [Custom.AttestationStatus] IN ('', 'Pending')" + $query += " AND [System.Tags] NOT CONTAINS 'Release Planner App Test'" + $query += " AND [System.Tags] NOT CONTAINS 'Release Planner Test App'" + $query += " AND [System.Tags] NOT CONTAINS 'non-APEX tracking'" + $query += " AND [System.Tags] NOT CONTAINS 'out of scope APEX'" + $query += " AND [System.Tags] NOT CONTAINS 'APEX out of scope'" + $query += " AND [System.Tags] NOT CONTAINS 'validate APEX out of scope'" + $query += " AND [Custom.ProductServiceTreeID] <> ''" + $query += " AND [Custom.ProductLifecycle] <> ''" + $query += " AND [Custom.ProductType] IN ('Feature', 'Offering', 'Sku')" + + $workItems = Invoke-Query $fields $query + return $workItems +} + +function Get-TriagesForCPEXAttestation() +{ + $fields = @() + $fields += "Custom.ProductServiceTreeID" + $fields += "Custom.ProductType" + $fields += "Custom.ProductLifecycle" + $fields += "Custom.DataScope" + $fields += "Custom.MgmtScope" + $fields += "Custom.DataplaneAttestationStatus" + $fields += "Custom.ManagementPlaneAttestationStatus" + $fields += "Custom.ProductName" + + $fieldList = ($fields | ForEach-Object { "[$_]"}) -join ", " + + $query = "SELECT ${fieldList} FROM WorkItems WHERE [System.WorkItemType] = 'Triage'" + $query += " AND ([Custom.DataplaneAttestationStatus] IN ('', 'Pending') OR [Custom.ManagementPlaneAttestationStatus] IN ('', 'Pending'))" + $query += " AND [System.Tags] NOT CONTAINS 'Release Planner App Test'" + $query += " AND [System.Tags] NOT CONTAINS 'Release Planner Test App'" + $query += " AND [System.Tags] NOT CONTAINS 'non-APEX tracking'" + $query += " AND [System.Tags] NOT CONTAINS 'out of scope APEX'" + $query += " AND [System.Tags] NOT CONTAINS 'APEX out of scope'" + $query += " AND [System.Tags] NOT CONTAINS 'validate APEX out of scope'" + $query += " AND [Custom.ProductServiceTreeID] <> ''" + $query += " AND [Custom.ProductLifecycle] <> ''" + $query += " AND [Custom.ProductType] IN ('Feature', 'Offering', 'Sku')" + + $workItems = Invoke-Query $fields $query + return $workItems +} + +function Update-AttestationStatusInWorkItem($workItemId, $fieldName, $status) +{ + $dateFieldName = $fieldName -replace 'Status$', 'Date' + + $fields = @() + $fields += "`"${fieldName}=${status}`"" + $fields += "`"${dateFieldName}=$(Get-Date)`"" + + Write-Host "Updating Work Item [$workItemId] with status [$status] for field [$fieldName]." + $workItem = UpdateWorkItem -id $workItemId -fields $fields + Write-Host "Updated attestation status for [$fieldName] in Work Item [$workItemId]" + return $true +} + +# This function was originally the entirety of what was in Update-DevOps-Release-WorkItem.ps1 +# and has been converted to a function. +function Update-DevOpsReleaseWorkItem { + param( + [Parameter(Mandatory=$true)] + [string]$language, + [Parameter(Mandatory=$true)] + [string]$packageName, + [Parameter(Mandatory=$true)] + [string]$version, + [string]$plannedDate, + [string]$groupId = $null, + [string]$serviceName = $null, + [string]$packageDisplayName = $null, + [string]$packageRepoPath = "NA", + [string]$packageType = "client", + [string]$packageNewLibrary = "true", + [string]$relatedWorkItemId = $null, + [string]$tag = $null, + [bool]$inRelease = $true, + [string]$specProjectPath = "" + ) + + if (!(Get-Command az -ErrorAction SilentlyContinue)) { + Write-Error 'You must have the Azure CLI installed: https://aka.ms/azure-cli' + return $false + } + + CheckAzLoginAndDevOpsExtensionInstall + + CheckDevOpsAccess + + $parsedNewVersion = [AzureEngSemanticVersion]::new($version) + $state = "In Release" + $releaseType = $parsedNewVersion.VersionType + $versionMajorMinor = "" + $parsedNewVersion.Major + "." + $parsedNewVersion.Minor + + $packageInfo = [PSCustomObject][ordered]@{ + Package = $packageName + GroupId = $groupId + DisplayName = $packageDisplayName + ServiceName = $serviceName + RepoPath = $packageRepoPath + Type = $packageType + New = $packageNewLibrary + SpecProjectPath = $specProjectPath + }; + + if (!$plannedDate) { + $plannedDate = Get-Date -Format "MM/dd/yyyy" + } + + $plannedVersions = @( + [PSCustomObject][ordered]@{ + Type = $releaseType + Version = $version + Date = $plannedDate + } + ) + $ignoreReleasePlannerTests = $true + if ($tag -and $tag.Contains("Release Planner App Test")) { + $ignoreReleasePlannerTests = $false + } + + $workItem = FindOrCreateClonePackageWorkItem $language $packageInfo $versionMajorMinor -allowPrompt $true -outputCommand $false -relatedId $relatedWorkItemId -tag $tag -ignoreReleasePlannerTests $ignoreReleasePlannerTests + + if (!$workItem) { + Write-Host "Something failed as we don't have a work-item so exiting." + return $false + } + + Write-Host "Updated or created a release work item for a package release with the following properties:" + Write-Host " Language: $($workItem.fields['Custom.Language'])" + Write-Host " Version: $($workItem.fields['Custom.PackageVersionMajorMinor'])" + Write-Host " Package: $($workItem.fields['Custom.Package'])" + if ($workItem.fields['System.AssignedTo']) { + Write-Host " AssignedTo: $($workItem.fields['System.AssignedTo']["uniqueName"])" + } + else { + Write-Host " AssignedTo: unassigned" + } + Write-Host " PackageDisplayName: $($workItem.fields['Custom.PackageDisplayName'])" + Write-Host " ServiceName: $($workItem.fields['Custom.ServiceName'])" + Write-Host " PackageType: $($workItem.fields['Custom.PackageType'])" + Write-Host "" + if ($inRelease) + { + Write-Host "Marking item [$($workItem.id)]$($workItem.fields['System.Title']) as '$state' for '$releaseType'" + $updatedWI = UpdatePackageWorkItemReleaseState -id $workItem.id -state "In Release" -releaseType $releaseType -outputCommand $false + } + $updatedWI = UpdatePackageVersions $workItem -plannedVersions $plannedVersions + + if ((!$workItem.fields.ContainsKey('Custom.SpecProjectPath') -and $packageInfo.SpecProjectPath) -or + ($workItem.fields.ContainsKey('Custom.SpecProjectPath') -and ($workItem.fields['Custom.SpecProjectPath'] -ne $packageInfo.SpecProjectPath)) + ) { + Write-Host "Updating SpecProjectPath to '$($packageInfo.SpecProjectPath)' for work item [$($workItem.id)]" + UpdateWorkItem ` + -id $workItem.id ` + -fields "`"Custom.SpecProjectPath=$($packageInfo.SpecProjectPath)`"" ` + -outputCommand $false + } + + Write-Host "Release tracking item is at https://dev.azure.com/azure-sdk/Release/_workitems/edit/$($updatedWI.id)/" + return $true +} diff --git a/eng/common/scripts/Helpers/Resource-Helpers.ps1 b/eng/common/scripts/Helpers/Resource-Helpers.ps1 index 546c5dd9aaed..f124ff217d40 100644 --- a/eng/common/scripts/Helpers/Resource-Helpers.ps1 +++ b/eng/common/scripts/Helpers/Resource-Helpers.ps1 @@ -38,6 +38,32 @@ function Get-PurgeableGroupResources { $purgeableResources += $deletedKeyVaults } + Write-Verbose "Retrieving AI resources from resource group $ResourceGroupName" + + # Get AI resources that will go into soft-deleted state when the resource group is deleted + $subscriptionId = (Get-AzContext).Subscription.Id + $aiResources = @() + + # Get active Cognitive Services accounts from the resource group + $response = Invoke-AzRestMethod -Method GET -Path "/subscriptions/$subscriptionId/resourceGroups/$ResourceGroupName/providers/Microsoft.CognitiveServices/accounts?api-version=2024-10-01" -ErrorAction Ignore + if ($response.StatusCode -ge 200 -and $response.StatusCode -lt 300 -and $response.Content) { + $content = $response.Content | ConvertFrom-Json + + foreach ($r in $content.value) { + $aiResources += [pscustomobject] @{ + AzsdkResourceType = "Cognitive Services ($($r.kind))" + AzsdkName = $r.name + Name = $r.name + Id = $r.id + } + } + } + + if ($aiResources) { + Write-Verbose "Found $($aiResources.Count) AI resources to potentially purge after resource group deletion." + $purgeableResources += $aiResources + } + return $purgeableResources } @@ -94,6 +120,29 @@ function Get-PurgeableResources { } catch { } + Write-Verbose "Retrieving deleted Cognitive Services accounts from subscription $subscriptionId" + + # Get deleted Cognitive Services accounts for the current subscription. + $response = Invoke-AzRestMethod -Method GET -Path "/subscriptions/$subscriptionId/providers/Microsoft.CognitiveServices/deletedAccounts?api-version=2024-10-01" -ErrorAction Ignore + if ($response.StatusCode -ge 200 -and $response.StatusCode -lt 300 -and $response.Content) { + $content = $response.Content | ConvertFrom-Json + + $deletedCognitiveServices = @() + foreach ($r in $content.value) { + $deletedCognitiveServices += [pscustomobject] @{ + AzsdkResourceType = "Cognitive Services ($($r.kind))" + AzsdkName = $r.name + Name = $r.name + Id = $r.id + } + } + + if ($deletedCognitiveServices) { + Write-Verbose "Found $($deletedCognitiveServices.Count) deleted Cognitive Services accounts to potentially purge." + $purgeableResources += $deletedCognitiveServices + } + } + return $purgeableResources } @@ -117,16 +166,18 @@ filter Remove-PurgeableResources { } $subscriptionId = (Get-AzContext).Subscription.Id + $verboseFlag = $VerbosePreference -eq 'Continue' foreach ($r in $Resource) { - Log "Attempting to purge $($r.AzsdkResourceType) '$($r.AzsdkName)'" switch ($r.AzsdkResourceType) { 'Key Vault' { if ($r.EnablePurgeProtection) { - Write-Warning "Key Vault '$($r.VaultName)' has purge protection enabled and may not be purged until $($r.ScheduledPurgeDate)" + Write-Verbose "Key Vault '$($r.VaultName)' has purge protection enabled and may not be purged until $($r.ScheduledPurgeDate)" -Verbose:$verboseFlag continue } + Log "Attempting to purge $($r.AzsdkResourceType) '$($r.AzsdkName)'" + # Use `-AsJob` to start a lightweight, cancellable job and pass to `Wait-PurgeableResoruceJob` for consistent behavior. Remove-AzKeyVault -VaultName $r.VaultName -Location $r.Location -InRemovedState -Force -ErrorAction Continue -AsJob ` | Wait-PurgeableResourceJob -Resource $r -Timeout $Timeout -PassThru:$PassThru @@ -134,16 +185,18 @@ filter Remove-PurgeableResources { 'Managed HSM' { if ($r.EnablePurgeProtection) { - Write-Warning "Managed HSM '$($r.Name)' has purge protection enabled and may not be purged until $($r.ScheduledPurgeDate)" + Write-Verbose "Managed HSM '$($r.Name)' has purge protection enabled and may not be purged until $($r.ScheduledPurgeDate)" -Verbose:$verboseFlag continue } + Log "Attempting to purge $($r.AzsdkResourceType) '$($r.AzsdkName)'" + # Use `GetNewClosure()` on the `-Action` ScriptBlock to make sure variables are captured. Invoke-AzRestMethod -Method POST -Path "/subscriptions/$subscriptionId/providers/Microsoft.KeyVault/locations/$($r.Location)/deletedManagedHSMs/$($r.Name)/purge?api-version=2023-02-01" -ErrorAction Ignore -AsJob ` | Wait-PurgeableResourceJob -Resource $r -Timeout $Timeout -PassThru:$PassThru -Action { param ( $response ) if ($response.StatusCode -ge 200 -and $response.StatusCode -lt 300) { - Write-Warning "Successfully requested that Managed HSM '$($r.Name)' be purged, but may take a few minutes before it is actually purged." + Write-Verbose "Successfully requested that Managed HSM '$($r.Name)' be purged, but may take a few minutes before it is actually purged." -Verbose:$verboseFlag } elseif ($response.Content) { $content = $response.Content | ConvertFrom-Json @@ -155,6 +208,22 @@ filter Remove-PurgeableResources { }.GetNewClosure() } + { $_.StartsWith('Cognitive Services') } + { + Log "Attempting to purge $($r.AzsdkResourceType) '$($r.AzsdkName)'" + # Use `GetNewClosure()` on the `-Action` ScriptBlock to make sure variables are captured. + Invoke-AzRestMethod -Method DELETE -Path "$($r.id)?api-version=2024-10-01" -ErrorAction Ignore -AsJob ` + | Wait-PurgeableResourceJob -Resource $r -Timeout $Timeout -PassThru:$PassThru -Action { + param ( $response ) + + if ($response.StatusCode -eq 200 -or $response.StatusCode -eq 202 -or $response.StatusCode -eq 204) { + Write-Verbose "Successfully purged $($r.AzsdkResourceType) '$($r.Name)'." -Verbose:$verboseFlag + } else { + Write-Warning "Failed purging $($r.AzsdkResourceType) '$($r.Name)' with status code $($response.StatusCode)." + } + }.GetNewClosure() + } + default { Write-Warning "Cannot purge $($r.AzsdkResourceType) '$($r.AzsdkName)'. Add support to https://github.com/Azure/azure-sdk-tools/blob/main/eng/common/scripts/Helpers/Resource-Helpers.ps1." } diff --git a/eng/common/scripts/Mark-ReleasePlanCompletion.ps1 b/eng/common/scripts/Mark-ReleasePlanCompletion.ps1 new file mode 100644 index 000000000000..17605957fd2b --- /dev/null +++ b/eng/common/scripts/Mark-ReleasePlanCompletion.ps1 @@ -0,0 +1,65 @@ +param( + [Parameter(Mandatory = $true)] + [string]$PackageInfoFilePath, + [Parameter(Mandatory = $true)] + [string]$AzsdkExePath +) + +<# +.SYNOPSIS + Marks release plan completion by identifying pull requests that changed files in a given path. + +.DESCRIPTION + This script helps to mark release plan completion by finding the active release plans for a package name + +.PARAMETER PackageInfoFilePath + The path to the package information file (required) or path to the directory containing package information files. + +.PARAMETER AzsdkExePath + The path to the azsdk executable used to mark the release completion. +#> + +Set-StrictMode -Version 3 +. (Join-Path $PSScriptRoot common.ps1) + +#Validate azsdk executable path +if (-Not (Test-Path $AzsdkExePath)) +{ + Write-Error "The azsdk executable was not found at path '$AzsdkExePath'. Please ensure the executable exists and the path is correct." + exit 1 +} + +#Get package properties +if (-Not (Test-Path $PackageInfoFilePath)) +{ + Write-Host "Package information file path $($PackageInfoFilePath) is invalid." + exit 0 +} + +function Process-Package([string]$packageInfoPath) +{ + # Get package info from json file created before updating version to daily dev + $pkgInfo = Get-Content $packageInfoPath | ConvertFrom-Json + $PackageName = $pkgInfo.Name + if (!$PackageName) + { + Write-Host "Package name is not available in the package information file. Skipping the release plan status update for the package." + return + } + + Write-Host "Marking release completion for package, name: $PackageName" + $releaseInfo = & $AzsdkExePath release-plan update-release-status --package-name $PackageName --language $LanguageDisplayName --status "Released" + if ($LASTEXITCODE -ne 0) + { + ## Not all releases have a release plan. So we should not fail the script even if a release plan is missing. + Write-Host "Failed to mark release completion for package '$PackageName' using azsdk. Exit code: $LASTEXITCODE" + } + Write-Host "Details: $releaseInfo" +} + +Write-Host "Finding all package info files in the path: $PackageInfoFilePath" +# Get all package info file under the directory given in input param and process +Get-ChildItem -Path $PackageInfoFilePath -Filter "*.json" | ForEach-Object { + Write-Host "Processing package info file: $_" + Process-Package $_.FullName +} \ No newline at end of file diff --git a/eng/common/scripts/Package-Properties.ps1 b/eng/common/scripts/Package-Properties.ps1 index 0142017c8468..7704bd04cea2 100644 --- a/eng/common/scripts/Package-Properties.ps1 +++ b/eng/common/scripts/Package-Properties.ps1 @@ -22,6 +22,10 @@ class PackageProps { [HashTable]$ArtifactDetails [HashTable]$CIParameters + # Path from root of azure-rest-api-specs repo to spec project (read from + # tsp-location.yaml if it exists in the package directory) + [string]$SpecProjectPath + PackageProps([string]$name, [string]$version, [string]$directoryPath, [string]$serviceDirectory) { $this.Initialize($name, $version, $directoryPath, $serviceDirectory) } @@ -61,6 +65,13 @@ class PackageProps { $this.ChangeLogPath = $null } + if (Test-Path (Join-Path $directoryPath 'tsp-location.yaml')) { + $tspLocation = LoadFrom-Yaml (Join-Path $directoryPath 'tsp-location.yaml') + if ($tspLocation -and $tspLocation.directory) { + $this.SpecProjectPath = $tspLocation.directory + } + } + $this.CIParameters = @{"CIMatrixConfigs" = @()} $this.InitializeCIArtifacts() } @@ -219,16 +230,30 @@ class PackageProps { # Returns important properties of the package relative to the language repo # Returns a PS Object with properties @ { pkgName, pkgVersion, pkgDirectoryPath, pkgReadMePath, pkgChangeLogPath } # Note: python is required for parsing python package properties. +# GroupId is optional and is used to filter packages for languages that support group identifiers (e.g., Java). +# When GroupId is provided, the function will match both the package name and the group ID. function Get-PkgProperties { Param ( [Parameter(Mandatory = $true)] [string]$PackageName, - [string]$ServiceDirectory + [string]$ServiceDirectory, + [string]$GroupId ) + Write-Host "Get-PkgProperties called with PackageName: [$PackageName], ServiceDirectory: [$ServiceDirectory], GroupId: [$GroupId]" + $allPkgProps = Get-AllPkgProperties -ServiceDirectory $ServiceDirectory - $pkgProps = $allPkgProps.Where({ $_.Name -eq $PackageName -or $_.ArtifactName -eq $PackageName }); + + if ([string]::IsNullOrEmpty($GroupId)) { + $pkgProps = $allPkgProps.Where({ $_.Name -eq $PackageName -or $_.ArtifactName -eq $PackageName }); + } + else { + $pkgProps = $allPkgProps.Where({ + ($_.Name -eq $PackageName -or $_.ArtifactName -eq $PackageName) -and + ($_.PSObject.Properties.Name -contains "Group" -and $_.Group -eq $GroupId) + }); + } if ($pkgProps.Count -ge 1) { if ($pkgProps.Count -gt 1) { @@ -237,7 +262,12 @@ function Get-PkgProperties { return $pkgProps[0] } - LogError "Failed to retrieve Properties for [$PackageName]" + if ([string]::IsNullOrEmpty($GroupId)) { + LogError "Failed to retrieve Properties for [$PackageName]" + } + else { + LogError "Failed to retrieve Properties for [$PackageName] with GroupId [$GroupId]. Ensure the package has a Group property matching the specified GroupId." + } return $null } @@ -557,3 +587,25 @@ function Get-PkgPropsForEntireService ($serviceDirectoryPath) { return $projectProps } + +# Get the full package name based on packageInfo properties +# Returns Group+ArtifactName if Group exists and has a value, otherwise returns Name +# If UseColonSeparator switch is enabled, returns Group:ArtifactName format (colon separator) +function Get-FullPackageName { + param ( + [Parameter(Mandatory=$true)] + [PSCustomObject]$PackageInfo, + [switch]$UseColonSeparator + ) + + if ($PackageInfo.PSObject.Members.Name -contains "Group") { + $groupId = $PackageInfo.Group + if ($groupId) { + if ($UseColonSeparator) { + return "${groupId}:$($PackageInfo.Name)" + } + return "${groupId}+$($PackageInfo.Name)" + } + } + return $PackageInfo.Name +} diff --git a/eng/common/scripts/Prepare-Release.ps1 b/eng/common/scripts/Prepare-Release.ps1 index e82c5982ac96..6d57acf6d601 100644 --- a/eng/common/scripts/Prepare-Release.ps1 +++ b/eng/common/scripts/Prepare-Release.ps1 @@ -1,3 +1,5 @@ +#!/usr/bin/env pwsh + #Requires -Version 6.0 <# @@ -28,6 +30,9 @@ If one isn't provided, then it will compute the next ship date or today's date i .PARAMETER ReleaseTrackingOnly Optional: If this switch is passed then the script will only update the release work items and not update the versions in the local repo or validate the changelog. +.PARAMETER GroupId +Optional: The group ID for the package. For Java packages, if not provided, the script will prompt for input with 'com.azure' as the default. + .EXAMPLE PS> ./eng/common/scripts/Prepare-Release.ps1 @@ -47,12 +52,26 @@ param( [string]$PackageName, [string]$ServiceDirectory, [string]$ReleaseDate, # Pass Date in the form MM/dd/yyyy" - [switch]$ReleaseTrackingOnly = $false + [switch]$ReleaseTrackingOnly = $false, + [string]$GroupId ) Set-StrictMode -Version 3 . ${PSScriptRoot}\common.ps1 . ${PSScriptRoot}\Helpers\ApiView-Helpers.ps1 +. ${PSScriptRoot}\Helpers\DevOps-WorkItem-Helpers.ps1 + +# Prompt for GroupId if language is Java and GroupId is not provided +if ($Language -eq 'java' -and [string]::IsNullOrEmpty($GroupId)) { + $userInput = Read-Host "Input the group id, or press Enter to use 'com.azure' as the group id" + if ([string]::IsNullOrWhiteSpace($userInput)) { + $GroupId = "com.azure" + } + else { + $GroupId = $userInput.Trim() + } + Write-Host "Using GroupId: $GroupId" -ForegroundColor Green +} function Get-ReleaseDay($baseDate) { @@ -71,7 +90,7 @@ function Get-ReleaseDay($baseDate) $ErrorPreference = 'Stop' $packageProperties = $null -$packageProperties = Get-PkgProperties -PackageName $PackageName -ServiceDirectory $ServiceDirectory +$packageProperties = Get-PkgProperties -PackageName $PackageName -ServiceDirectory $ServiceDirectory -GroupId $GroupId if (!$packageProperties) { @@ -125,7 +144,7 @@ if (Test-Path "Function:GetExistingPackageVersions") } $currentProjectVersion = $packageProperties.Version -$newVersion = Read-Host -Prompt "Input the new version, or press Enter to use use current project version '$currentProjectVersion'" +$newVersion = Read-Host -Prompt "Input the new version, or press Enter to use current project version '$currentProjectVersion'" if (!$newVersion) { @@ -139,18 +158,19 @@ if ($null -eq $newVersionParsed) exit 1 } -&$EngCommonScriptsDir/Update-DevOps-Release-WorkItem.ps1 ` - -language $LanguageDisplayName ` - -packageName $packageProperties.Name ` - -version $newVersion ` - -plannedDate $releaseDateString ` - -packageRepoPath $packageProperties.serviceDirectory ` - -packageType $packageProperties.SDKType ` - -packageNewLibrary $packageProperties.IsNewSDK +$result = Update-DevOpsReleaseWorkItem -language $LanguageDisplayName ` + -packageName $packageProperties.Name ` + -groupId $packageProperties.Group ` + -version $newVersion ` + -plannedDate $releaseDateString ` + -packageRepoPath $packageProperties.serviceDirectory ` + -packageType $packageProperties.SDKType ` + -packageNewLibrary $packageProperties.IsNewSDK -if ($LASTEXITCODE -ne 0) { - Write-Error "Updating of the Devops Release WorkItem failed." - exit 1 +if (-not $result) +{ + Write-Error "Update of the Devops Release WorkItem failed." + exit 1 } # Check API status @@ -163,7 +183,8 @@ try } $url = az keyvault secret show --name "APIURL" --vault-name "AzureSDKPrepRelease-KV" --query "value" --output "tsv" $apiKey = az keyvault secret show --name "APIKEY" --vault-name "AzureSDKPrepRelease-KV" --query "value" --output "tsv" - Check-ApiReviewStatus -PackageName $packageProperties.Name -packageVersion $newVersion -Language $LanguageDisplayName -url $url -apiKey $apiKey + $fullPackageNameInApiView = Get-FullPackageName -PackageInfo $packageProperties -UseColonSeparator + Check-ApiReviewStatus -PackageName $fullPackageNameInApiView -packageVersion $newVersion -Language $LanguageDisplayName -url $url -apiKey $apiKey } catch { @@ -191,7 +212,7 @@ if (Test-Path "Function:SetPackageVersion") } SetPackageVersion -PackageName $packageProperties.Name -Version $newVersion ` -ServiceDirectory $packageProperties.ServiceDirectory -ReleaseDate $releaseDateString ` - -PackageProperties $packageProperties -ReplaceLatestEntryTitle $replaceLatestEntryTitle + -PackageProperties $packageProperties -ReplaceLatestEntryTitle $replaceLatestEntryTitle -GroupId $packageProperties.Group } else { diff --git a/eng/common/scripts/Save-Package-Properties.ps1 b/eng/common/scripts/Save-Package-Properties.ps1 index 0db23f276b96..deccaa553c0e 100644 --- a/eng/common/scripts/Save-Package-Properties.ps1 +++ b/eng/common/scripts/Save-Package-Properties.ps1 @@ -30,7 +30,11 @@ package properties JSON file. If the package properties JSON file already exists, read the Version property from the existing package properties JSON file and set that as the Version property for the new output. This has the effect of "adding" a DevVersion property to the file which could be different from the -Verison property in that file. +Version property in that file. + +.PARAMETER artifactList +Optional array of artifact names to filter the package properties. Only packages +with artifact names matching entries in this list will be processed. #> [CmdletBinding()] @@ -39,7 +43,8 @@ Param ( [Parameter(Mandatory = $True)] [string] $outDirectory, [string] $prDiff, - [switch] $addDevVersion + [switch] $addDevVersion, + [array] $artifactList ) . (Join-Path $PSScriptRoot common.ps1) @@ -132,6 +137,38 @@ if (-not (Test-Path -Path $outDirectory)) New-Item -ItemType Directory -Force -Path $outDirectory | Out-Null } +if ($artifactList) +{ + # Filter out null, empty, or whitespace-only entries + $filteredArtifacts = @($artifactList | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }) + + if ($filteredArtifacts.Count -eq 0) + { + Write-Warning "Artifact list contains no valid entries" + } + else + { + Write-Host "Filtering package properties to match artifact list: $($filteredArtifacts -join ', ')" + $artifactSet = New-Object 'System.Collections.Generic.HashSet[string]' ([System.StringComparer]::OrdinalIgnoreCase) + foreach ($artifact in $filteredArtifacts) { + $artifactSet.Add($artifact) | Out-Null + } + + # Warn about packages missing ArtifactName property + $missingArtifactName = $allPackageProperties | Where-Object { $_.PSObject.Properties.Name -notcontains 'ArtifactName' } + foreach ($pkg in $missingArtifactName) { + Write-Warning "Package '$($pkg.PackageName)' does not have an 'ArtifactName' property and will be excluded from artifact filtering." + } + $allPackageProperties = $allPackageProperties | Where-Object { $_.ArtifactName -and $artifactSet.Contains($_.ArtifactName) } + + if (!$allPackageProperties) + { + Write-Error "No packages found matching the provided artifact list" + exit 1 + } + } +} + foreach ($pkg in $allPackageProperties) { if ($pkg.Name) @@ -144,6 +181,7 @@ foreach ($pkg in $allPackageProperties) if (-not [System.String]::IsNullOrEmpty($pkg.Group)) { Write-Host "GroupId: $($pkg.Group)" } + Write-Host "Spec Project Path: $($pkg.SpecProjectPath)" Write-Host "Release date: $($pkg.ReleaseStatus)" $configFilePrefix = $pkg.Name diff --git a/eng/common/scripts/Set-VcpkgWriteModeCache.ps1 b/eng/common/scripts/Set-VcpkgWriteModeCache.ps1 new file mode 100644 index 000000000000..37bca90019b1 --- /dev/null +++ b/eng/common/scripts/Set-VcpkgWriteModeCache.ps1 @@ -0,0 +1,23 @@ +#!/bin/env pwsh +param( + [string] $StorageAccountName = 'azuresdkartifacts', + [string] $StorageContainerName = 'public-vcpkg-container', + [int] $TokenTimeoutInHours = 1 +) + +$ctx = New-AzStorageContext ` + -StorageAccountName $StorageAccountName ` + -UseConnectedAccount + +$vcpkgBinarySourceSas = New-AzStorageContainerSASToken ` + -Name $StorageContainerName ` + -Permission "rwcl" ` + -Context $ctx ` + -ExpiryTime (Get-Date).AddHours($TokenTimeoutInHours) + +# Ensure redaction of SAS tokens in logs +Write-Host "##vso[task.setvariable variable=VCPKG_BINARY_SAS_TOKEN;issecret=true;]$vcpkgBinarySourceSas" + +Write-Host "Setting vcpkg binary cache to read and write" +Write-Host "##vso[task.setvariable variable=VCPKG_BINARY_SOURCES_SECRET;issecret=true;]clear;x-azcopy-sas,https://$StorageAccountName.blob.core.windows.net/$StorageContainerName,$vcpkgBinarySourceSas,readwrite" +Write-Host "##vso[task.setvariable variable=X_VCPKG_ASSET_SOURCES_SECRET;issecret=true;]clear;x-azurl,https://$StorageAccountName.blob.core.windows.net/$StorageContainerName,$vcpkgBinarySourceSas,readwrite" diff --git a/eng/common/scripts/SetTestPipelineVersion.ps1 b/eng/common/scripts/SetTestPipelineVersion.ps1 index 2b2ee70ef97e..17177a32b573 100644 --- a/eng/common/scripts/SetTestPipelineVersion.ps1 +++ b/eng/common/scripts/SetTestPipelineVersion.ps1 @@ -3,56 +3,161 @@ param ( [Parameter(mandatory = $true)] [string]$BuildID, - [Parameter(mandatory = $true)] - [string]$PackageNames, - [Parameter(mandatory = $true)] + [Parameter(mandatory = $false)] + [string]$PackageNames = "", + [Parameter(mandatory = $false)] + # ServiceDirectory is required when using PackageNames, + # or when Artifacts do not include their own ServiceDirectory property. [string]$ServiceDirectory, [Parameter(mandatory = $false)] - [string]$TagSeparator = "_" + [string]$TagSeparator = "_", + [Parameter(mandatory = $false)] + [object[]]$Artifacts = @() ) . (Join-Path $PSScriptRoot common.ps1) +# Ensure Artifacts is always an array +$Artifacts = @($Artifacts) + Write-Host "PackageNames: $PackageNames" Write-Host "ServiceDirectory: $ServiceDirectory" Write-Host "BuildID: $BuildID" +Write-Host "Artifacts count: $($Artifacts.Count)" -$packageNamesArray = @() +if ($Artifacts -and $Artifacts.Count -gt 0) { + # When using Artifacts, process each artifact with its name and groupId (if applicable) + try { + foreach ($artifact in $Artifacts) { + # Validate required properties + if (-not (Get-Member -InputObject $artifact -Name 'name' -MemberType Properties)) { + LogError "Artifact is missing required 'name' property." + exit 1 + } -if ([String]::IsNullOrWhiteSpace($PackageNames)) { - LogError "PackageNames cannot be empty." - exit 1 -} -else { - $packageNamesArray = $PackageNames.Split(',') -} + $packageName = $artifact.name + if ([String]::IsNullOrWhiteSpace($packageName)) { + LogError "Artifact 'name' property is null or empty." + exit 1 + } -foreach ($packageName in $packageNamesArray) { - Write-Host "Processing $packageName" - $newVersion = [AzureEngSemanticVersion]::new("1.0.0") - $prefix = "$packageName$TagSeparator" - Write-Host "Get Latest Tag : git tag -l $prefix*" - $latestTags = git tag -l "$prefix*" + $artifactServiceDirectory = $null + # Check for ServiceDirectory property + if (Get-Member -InputObject $artifact -Name 'ServiceDirectory' -MemberType Properties) { + if (![String]::IsNullOrWhiteSpace($artifact.ServiceDirectory)) { + $artifactServiceDirectory = $artifact.ServiceDirectory + } + } - $semVars = @() + if ([String]::IsNullOrWhiteSpace($artifactServiceDirectory)) { + $artifactServiceDirectory = $ServiceDirectory + } + + # Validate ServiceDirectory is available + if ([String]::IsNullOrWhiteSpace($artifactServiceDirectory)) { + LogError "ServiceDirectory is required but not provided for artifact '$packageName'. Provide it via script parameter or artifact property." + exit 1 + } - if ($latestTags -and ($latestTags.Length -gt 0)) { - foreach ($tag in $latestTags) { - $semVars += $tag.Substring($prefix.Length) - } + $newVersion = [AzureEngSemanticVersion]::new("1.0.0") + $prefix = "$packageName$TagSeparator" + + if ($Language -eq "java") { + # Check for groupId property + if (-not (Get-Member -InputObject $artifact -Name 'groupId' -MemberType Properties)) { + LogError "Artifact '$packageName' is missing required 'groupId' property for Java language." + exit 1 + } + + $groupId = $artifact.groupId + if ([String]::IsNullOrWhiteSpace($groupId)) { + LogError "GroupId is missing for package $packageName." + exit 1 + } + + Write-Host "Processing $packageName with groupId $groupId" + # Use groupId+artifactName format for tag prefix (e.g., "com.azure.v2+azure-sdk-template_") + $prefix = "$groupId+$packageName$TagSeparator" + } + else { + Write-Host "Processing $packageName" + } + + Write-Host "Get Latest Tag : git tag -l $prefix*" + $latestTags = git tag -l "$prefix*" + + $semVars = @() - $semVarsSorted = [AzureEngSemanticVersion]::SortVersionStrings($semVars) - Write-Host "Last Published Version $($semVarsSorted[0])" - $newVersion = [AzureEngSemanticVersion]::new($semVarsSorted[0]) + if ($latestTags -and ($latestTags.Length -gt 0)) { + foreach ($tag in $latestTags) { + $semVars += $tag.Substring($prefix.Length) + } + + $semVarsSorted = [AzureEngSemanticVersion]::SortVersionStrings($semVars) + Write-Host "Last Published Version $($semVarsSorted[0])" + $newVersion = [AzureEngSemanticVersion]::new($semVarsSorted[0]) + } + + $newVersion.PrereleaseLabel = $newVersion.DefaultPrereleaseLabel + $newVersion.PrereleaseNumber = $BuildID + $newVersion.IsPrerelease = $True + + Write-Host "Version to publish [ $($newVersion.ToString()) ]" + + if ($Language -ne "java") { + SetPackageVersion -PackageName $packageName ` + -Version $newVersion.ToString() ` + -ServiceDirectory $artifactServiceDirectory + } else { + SetPackageVersion -PackageName $packageName ` + -Version $newVersion.ToString() ` + -ServiceDirectory $artifactServiceDirectory ` + -GroupId $groupId + } + } + } + catch { + LogError "Failed to process Artifacts: exception: $($_.Exception.Message)" + exit 1 + } +} elseif (![String]::IsNullOrWhiteSpace($PackageNames)) { + # Fallback to original logic when using PackageNames string + if ([String]::IsNullOrWhiteSpace($ServiceDirectory)) { + LogError "ServiceDirectory is required when using PackageNames." + exit 1 } - $newVersion.PrereleaseLabel = $newVersion.DefaultPrereleaseLabel - $newVersion.PrereleaseNumber = $BuildID - $newVersion.IsPrerelease = $True + $packageNamesArray = $PackageNames.Split(',') + foreach ($packageName in $packageNamesArray) { + Write-Host "Processing $packageName" + $newVersion = [AzureEngSemanticVersion]::new("1.0.0") + $prefix = "$packageName$TagSeparator" + Write-Host "Get Latest Tag : git tag -l $prefix*" + $latestTags = git tag -l "$prefix*" - Write-Host "Version to publish [ $($newVersion.ToString()) ]" + $semVars = @() - SetPackageVersion -PackageName $packageName ` - -Version $newVersion.ToString() ` - -ServiceDirectory $ServiceDirectory + if ($latestTags -and ($latestTags.Length -gt 0)) { + foreach ($tag in $latestTags) { + $semVars += $tag.Substring($prefix.Length) + } + + $semVarsSorted = [AzureEngSemanticVersion]::SortVersionStrings($semVars) + Write-Host "Last Published Version $($semVarsSorted[0])" + $newVersion = [AzureEngSemanticVersion]::new($semVarsSorted[0]) + } + + $newVersion.PrereleaseLabel = $newVersion.DefaultPrereleaseLabel + $newVersion.PrereleaseNumber = $BuildID + $newVersion.IsPrerelease = $True + + Write-Host "Version to publish [ $($newVersion.ToString()) ]" + + SetPackageVersion -PackageName $packageName ` + -Version $newVersion.ToString() ` + -ServiceDirectory $ServiceDirectory + } +} else { + LogError "Either PackageNames or Artifacts must be provided." + exit 1 } diff --git a/eng/common/scripts/Submit-PullRequest.ps1 b/eng/common/scripts/Submit-PullRequest.ps1 index a4c6545b8caf..a2de0a4f0c20 100644 --- a/eng/common/scripts/Submit-PullRequest.ps1 +++ b/eng/common/scripts/Submit-PullRequest.ps1 @@ -130,7 +130,8 @@ else { # ensure that the user that was used to create the PR is not attempted to add as a reviewer # we cast to an array to ensure that length-1 arrays actually stay as array values - $cleanedUsers = @(SplitParameterArray -members $UserReviewers) | ? { $_ -ne $prOwnerUser -and $null -ne $_ } + # we also filter out dependabot user who doesn't have write permission to avoid errors + $cleanedUsers = @(SplitParameterArray -members $UserReviewers) | ? { $_ -ne $prOwnerUser -and $null -ne $_ -and $_ -inotlike "dependabot*" } $cleanedTeamReviewers = @(SplitParameterArray -members $TeamReviewers) | ? { $_ -ne $prOwnerUser -and $null -ne $_ } if ($cleanedUsers -or $cleanedTeamReviewers) { @@ -146,8 +147,13 @@ else { $prState = "open" } + # Clean assignees - remove null entries and bot accounts + $cleanedAssignees = @(SplitParameterArray -members $Assignees) | ? { + $null -ne $_ -and $_ -inotlike "dependabot*" -and $_ -inotlike "copilot*" + } + Update-GitHubIssue -RepoOwner $RepoOwner -RepoName $RepoName -IssueNumber $prNumber ` - -State $prState -Labels $PRLabels -Assignees $Assignees -AuthToken $AuthToken + -State $prState -Labels $PRLabels -Assignees $cleanedAssignees -AuthToken $AuthToken if ($AddBuildSummary) { $summaryPath = New-TemporaryFile diff --git a/eng/common/scripts/Update-ChangeLog.ps1 b/eng/common/scripts/Update-ChangeLog.ps1 index 3541cd489403..3059002f3511 100644 --- a/eng/common/scripts/Update-ChangeLog.ps1 +++ b/eng/common/scripts/Update-ChangeLog.ps1 @@ -4,6 +4,7 @@ # Version : Version to add or replace in change log # Unreleased: Default is true. If it is set to false, then today's date will be set in verion title. If it is True then title will show "Unreleased" # ReplaceLatestEntryTitle: Replaces the latest changelog entry title. +# GroupId: Optional. The group ID for the package. Used for filtering packages in languages that support group identifiers (e.g., Java). [CmdletBinding()] param ( @@ -14,7 +15,8 @@ param ( [Boolean]$Unreleased = $true, [Boolean]$ReplaceLatestEntryTitle = $false, [String]$ChangelogPath, - [String]$ReleaseDate + [String]$ReleaseDate, + [String]$GroupId ) Set-StrictMode -Version 3 @@ -59,7 +61,7 @@ if ($null -eq [AzureEngSemanticVersion]::ParseVersionString($Version)) if ([string]::IsNullOrEmpty($ChangelogPath)) { - $pkgProperties = Get-PkgProperties -PackageName $PackageName -ServiceDirectory $ServiceDirectory + $pkgProperties = Get-PkgProperties -PackageName $PackageName -ServiceDirectory $ServiceDirectory -GroupId $GroupId $ChangelogPath = $pkgProperties.ChangeLogPath } diff --git a/eng/common/scripts/Update-DocsMsMetadata.ps1 b/eng/common/scripts/Update-DocsMsMetadata.ps1 index 01a6c9349b4c..b2c997a58415 100644 --- a/eng/common/scripts/Update-DocsMsMetadata.ps1 +++ b/eng/common/scripts/Update-DocsMsMetadata.ps1 @@ -64,7 +64,12 @@ function GetAdjustedReadmeContent($ReadmeContent, $PackageInfo, $PackageMetadata } Write-Host "The service of package: $service" # Generate the release tag for use in link substitution - $tag = "$($PackageInfo.Name)_$($PackageInfo.Version)" + if ($Language -eq 'java' -and $PackageInfo.Group) { + $groupId = $PackageInfo.Group + $tag = "$($groupId)+$($PackageInfo.Name)_$($PackageInfo.Version)" + } else { + $tag = "$($PackageInfo.Name)_$($PackageInfo.Version)" + } Write-Host "The tag of package: $tag" $date = Get-Date -Format "MM/dd/yyyy" diff --git a/eng/common/scripts/Update-DocsMsPackages.ps1 b/eng/common/scripts/Update-DocsMsPackages.ps1 index 06ee79102eab..f4a61bba4769 100644 --- a/eng/common/scripts/Update-DocsMsPackages.ps1 +++ b/eng/common/scripts/Update-DocsMsPackages.ps1 @@ -26,7 +26,9 @@ param ( [string] $DocRepoLocation, # the location of the cloned doc repo [Parameter(Mandatory = $false)] - [string] $PackageSourceOverride + [string] $PackageSourceOverride, + + [switch] $SkipLegacyOnboarding ) . (Join-Path $PSScriptRoot common.ps1) @@ -57,7 +59,11 @@ function PackageIsValidForDocsOnboarding($package) { -DocRepoLocation $DocRepoLocation } -$MONIKERS = @('latest', 'preview', 'legacy') +$MONIKERS = @('latest', 'preview') +if (!$SkipLegacyOnboarding) { + $MONIKERS += 'legacy' +} + foreach ($moniker in $MONIKERS) { try { Write-Host "Onboarding packages for moniker: $moniker" diff --git a/eng/common/scripts/Update-PullRequest-In-ReleasePlan.ps1 b/eng/common/scripts/Update-PullRequest-In-ReleasePlan.ps1 new file mode 100644 index 000000000000..cb40f5773067 --- /dev/null +++ b/eng/common/scripts/Update-PullRequest-In-ReleasePlan.ps1 @@ -0,0 +1,37 @@ +param( + [Parameter(Mandatory = $true)] + $ReleasePlanWorkItemId, + [Parameter(Mandatory = $true)] + $PullRequestUrl, + [Parameter(Mandatory = $true)] + $Status, + [Parameter(Mandatory = $true)] + $LanguageName +) + +<# +.SYNOPSIS +Updates the pull request URL and status in the specified release plan work item for a given programming language. + +.PARAMETER ReleasePlanWorkItemId +The ID of the release plan work item to update. + +.PARAMETER PullRequestUrl +The URL of the pull request to set in the release plan. + +.PARAMETER Status +The status of the pull request. + +.PARAMETER LanguageName +The programming language associated with the pull request. + +#> + +Set-StrictMode -Version 3 +. (Join-Path $PSScriptRoot common.ps1) +. (Join-Path $PSScriptRoot Helpers DevOps-WorkItem-Helpers.ps1) + + +LogDebug "Updating pull request in release plan" +Update-PullRequestInReleasePlan $ReleasePlanWorkItemId $PullRequestUrl $Status $LanguageName +LogDebug "Updated pull request in release plan" \ No newline at end of file diff --git a/eng/common/scripts/Validate-All-Packages.ps1 b/eng/common/scripts/Validate-All-Packages.ps1 index f327c455291e..f7edb2e55632 100644 --- a/eng/common/scripts/Validate-All-Packages.ps1 +++ b/eng/common/scripts/Validate-All-Packages.ps1 @@ -1,6 +1,6 @@ [CmdletBinding()] Param ( - [Parameter(Mandatory=$True)] + [Parameter(Mandatory=$False)] [array]$ArtifactList, [Parameter(Mandatory=$True)] [string]$ArtifactPath, @@ -11,40 +11,290 @@ Param ( [string]$ConfigFileDir, [string]$BuildDefinition, [string]$PipelineUrl, - [string]$APIViewUri = "https://apiview.dev/AutoReview/GetReviewStatus", - [bool] $IsReleaseBuild = $false + [string]$APIViewUri = "https://apiview.org/AutoReview/GetReviewStatus", + [bool] $IsReleaseBuild = $false, + [Parameter(Mandatory=$False)] + [array] $PackageInfoFiles ) +# Validate-All-Packages.ps1 folds in the code that was originally in Validate-Package.ps1 +# since Validate-Package.ps1 was only called from Validate-All-Packages.ps1. This replaces +# script calls with function calls and also allows calling CheckAzLoginAndDevOpsExtensionInstall +# and CheckDevOpsAccess once for all of the PackageInfo files being processed instead of once +# per artifact in Validate-Package.ps1 and then again in Update-DevOps-Release-WorkItem.ps1 + Set-StrictMode -Version 3 . (Join-Path $PSScriptRoot common.ps1) +. (Join-Path $PSScriptRoot Helpers\ApiView-Helpers.ps1) +. (Join-Path $PSScriptRoot Helpers\DevOps-WorkItem-Helpers.ps1) + +# Function to validate change log +function ValidateChangeLog($changeLogPath, $versionString, $validationStatus) +{ + try + { + $ChangeLogStatus = [PSCustomObject]@{ + IsValid = $false + Message = "" + } + $changeLogFullPath = Join-Path $RepoRoot $changeLogPath + Write-Host "Path to change log: [$changeLogFullPath]" + if (Test-Path $changeLogFullPath) + { + Confirm-ChangeLogEntry -ChangeLogLocation $changeLogFullPath -VersionString $versionString -ForRelease $true -ChangeLogStatus $ChangeLogStatus -SuppressErrors $true + $validationStatus.Status = if ($ChangeLogStatus.IsValid) { "Success" } else { "Failed" } + $validationStatus.Message = $ChangeLogStatus.Message + } + else { + $validationStatus.Status = "Failed" + $validationStatus.Message = "Change log is not found in [$changeLogPath]. Change log file must be present in package root directory." + } + } + catch + { + Write-Host "Current directory: $(Get-Location)" + $validationStatus.Status = "Failed" + $validationStatus.Message = $_.Exception.Message + } +} + +# Function to verify API review status +function VerifyAPIReview($packageName, $packageVersion, $language) +{ + $APIReviewValidation = [PSCustomObject]@{ + Name = "API Review Approval" + Status = "Pending" + Message = "" + } + $PackageNameValidation = [PSCustomObject]@{ + Name = "Package Name Approval" + Status = "Pending" + Message = "" + } + + try + { + $apiStatus = [PSCustomObject]@{ + IsApproved = $false + Details = "" + } + $packageNameStatus = [PSCustomObject]@{ + IsApproved = $false + Details = "" + } + Write-Host "Checking API review status for package $packageName with version $packageVersion. language [$language]." + Check-ApiReviewStatus $packageName $packageVersion $language $APIViewUri $APIKey $apiStatus $packageNameStatus + + Write-Host "API review approval details: $($apiStatus.Details)" + Write-Host "Package name approval details: $($packageNameStatus.Details)" + #API review approval status + $APIReviewValidation.Message = $apiStatus.Details + $APIReviewValidation.Status = if ($apiStatus.IsApproved) { "Approved" } else { "Pending" } + + # Package name approval status + $PackageNameValidation.Status = if ($packageNameStatus.IsApproved) { "Approved" } else { "Pending" } + $PackageNameValidation.Message = $packageNameStatus.Details + } + catch + { + Write-Warning "Failed to get API review status. Error: $_" + $PackageNameValidation.Status = "Failed" + $PackageNameValidation.Message = $_.Exception.Message + $APIReviewValidation.Status = "Failed" + $APIReviewValidation.Message = $_.Exception.Message + } + + return [PSCustomObject]@{ + ApiviewApproval = $APIReviewValidation + PackageNameApproval = $PackageNameValidation + } +} -function ProcessPackage($PackageName, $ConfigFileDir) + +function IsVersionShipped($packageName, $packageVersion, $groupId = $null) { - Write-Host "Artifact path: $($ArtifactPath)" - Write-Host "Package Name: $($PackageName)" - Write-Host "Config File directory: $($ConfigFileDir)" + # This function will decide if a package version is already shipped or not + Write-Host "Checking if a version is already shipped for package $packageName with version $packageVersion." + $parsedNewVersion = [AzureEngSemanticVersion]::new($packageVersion) + $versionMajorMinor = "" + $parsedNewVersion.Major + "." + $parsedNewVersion.Minor + $workItem = FindPackageWorkItem -lang $LanguageDisplayName -packageName $packageName -groupId $groupId -version $versionMajorMinor -includeClosed $true -outputCommand $false + if ($workItem) + { + # Check if the package version is already shipped + $shippedVersionSet = ParseVersionSetFromMDField $workItem.fields["Custom.ShippedPackages"] + if ($shippedVersionSet.ContainsKey($packageVersion)) { + return $true + } + } + else { + Write-Host "No work item found for package [$packageName], group [$groupId]. Creating new work item for package." + } + return $false +} - &$EngCommonScriptsDir/Validate-Package.ps1 ` - -PackageName $PackageName ` - -ArtifactPath $ArtifactPath ` - -RepoRoot $RepoRoot ` - -APIViewUri $APIViewUri ` - -APIKey $APIKey ` - -BuildDefinition $BuildDefinition ` - -PipelineUrl $PipelineUrl ` - -ConfigFileDir $ConfigFileDir - if ($LASTEXITCODE -ne 0) { - Write-Error "Failed to validate package $PackageName" - exit 1 +function CreateUpdatePackageWorkItem($pkgInfo) +{ + # This function will create or update package work item in Azure DevOps + $versionString = $pkgInfo.Version + $packageName = $pkgInfo.Name + $plannedDate = $pkgInfo.ReleaseStatus + $setReleaseState = $true + if (!$plannedDate -or $plannedDate -eq "Unreleased") + { + $setReleaseState = $false + $plannedDate = "unknown" + } + + # Create or update package work item + $result = Update-DevOpsReleaseWorkItem -language $LanguageDisplayName ` + -packageName $packageName ` + -groupId $pkgInfo.Group ` + -version $versionString ` + -plannedDate $plannedDate ` + -packageRepoPath $pkgInfo.serviceDirectory ` + -packageType $pkgInfo.SDKType ` + -packageNewLibrary $pkgInfo.IsNewSDK ` + -serviceName "unknown" ` + -packageDisplayName "unknown" ` + -inRelease $IsReleaseBuild ` + -specProjectPath $pkgInfo.SpecProjectPath + + if (-not $result) + { + Write-Host "Update of the Devops Release WorkItem failed." } + return [bool]$result } +function ProcessPackage($packageInfo) +{ + # Read package property file and identify all packages to process + # $packageInfo.Name is the package name published to package managers, e.g. @azure/azure-template + # $packageInfo.ArtifactName is the name can be used in path and file names, e.g. azure-template + Write-Host "Processing artifact: $($packageInfo.ArtifactName)" + Write-Host "Is Release Build: $IsReleaseBuild" + $pkgName = $packageInfo.Name + $changeLogPath = $packageInfo.ChangeLogPath + $versionString = $packageInfo.Version + Write-Host "Checking if we need to create or update work item for package $pkgName and groupId $packageInfo.Group with version $versionString." + Write-Host "Package name before checking groupId: $pkgName" + $isShipped = IsVersionShipped $pkgName $versionString $packageInfo.Group + if ($isShipped) { + Write-Host "Package work item already exists for version [$versionString] that is marked as shipped. Skipping the update of package work item." + return + } + + # Change log validation + $changeLogStatus = [PSCustomObject]@{ + Name = "Change Log Validation" + Status = "Success" + Message = "" + } + ValidateChangeLog $changeLogPath $versionString $changeLogStatus + + # API review and package name validation + $fullPackageName = $pkgName + + # If there's a groupId that means this is Java and pkgName = GroupId+ArtifactName + # but the VerifyAPIReview requires GroupId:ArtifactName + # Technically we can use groupId+artifactName format in api view, + # however it will need to migrate the existing data and Java parser also needs the change. + $fullPackageName = Get-FullPackageName -PackageInfo $packageInfo -UseColonSeparator + Write-Host "Checking API review status for package $fullPackageName" + $apireviewDetails = VerifyAPIReview $fullPackageName $packageInfo.Version $Language + + # The following object will be used to update package work item, the name should be package name only without groupId + $pkgValidationDetails= [PSCustomObject]@{ + Name = $pkgName + GroupId = $packageInfo.Group + Version = $packageInfo.Version + ChangeLogValidation = $changeLogStatus + APIReviewValidation = $apireviewDetails.ApiviewApproval + PackageNameValidation = $apireviewDetails.PackageNameApproval + } + + $output = ConvertTo-Json $pkgValidationDetails + Write-Host "Output: $($output)" + + # Create json token file in artifact path + # Does the following validation file name also need to use full package name with groupId? + $tokenFile = Join-Path $ArtifactPath "$($packageInfo.ArtifactName)-Validation.json" + $output | Out-File -FilePath $tokenFile -Encoding utf8 + + # Create DevOps work item + $updatedWi = CreateUpdatePackageWorkItem $packageInfo + + # Update validation status in package work item + if ($updatedWi) { + Write-Host "Updating validation status in package work item." + $updatedWi = UpdateValidationStatus $pkgValidationDetails $BuildDefinition $PipelineUrl + } + + # Fail the build if any validation is not successful for a release build + Write-Host "Change log status:" $changeLogStatus.Status + Write-Host "API Review status:" $apireviewDetails.ApiviewApproval.Status + Write-Host "Package Name status:" $apireviewDetails.PackageNameApproval.Status + + if ($IsReleaseBuild) + { + if (!$updatedWi -or $changeLogStatus.Status -ne "Success" -or $apireviewDetails.ApiviewApproval.Status -ne "Approved" -or $apireviewDetails.PackageNameApproval.Status -ne "Approved") { + Write-Error "At least one of the Validations above failed for package $pkgName with version $versionString." + exit 1 + } + } +} + +CheckAzLoginAndDevOpsExtensionInstall + +CheckDevOpsAccess + +Write-Host "Artifact path: $($ArtifactPath)" +Write-Host "Artifact List: $($ArtifactList -join ', ')" +Write-Host "Package Info Files: $($PackageInfoFiles -join ', ')" +Write-Host "IsReleaseBuild: $IsReleaseBuild" + # Check if package config file is present. This file has package version, SDK type etc info. if (-not $ConfigFileDir) { $ConfigFileDir = Join-Path -Path $ArtifactPath "PackageInfo" } -foreach ($artifact in $ArtifactList) + +Write-Host "Config file path: $($ConfigFileDir)" +# Initialize working variable +$ProcessedPackageInfoFiles = @() + +if ($ArtifactList -and $ArtifactList.Count -gt 0) +{ + # Multiple artifacts mode (existing usage) + Write-Host "Using ArtifactList parameter with $($ArtifactList.Count) artifacts" + foreach ($artifact in $ArtifactList) + { + $pkgPropPath = Join-Path -Path $ConfigFileDir "$($artifact.name).json" + if (Test-Path $pkgPropPath) { + $ProcessedPackageInfoFiles += $pkgPropPath + } + else { + Write-Warning "Package property file path $pkgPropPath is invalid." + } + } +} +elseif ($PackageInfoFiles -and $PackageInfoFiles.Count -gt 0) { + # Direct PackageInfoFiles (new method) + Write-Host "Using PackageInfoFiles parameter with $($PackageInfoFiles.Count) files" + # Filter out empty strings or whitespace-only entries + $ProcessedPackageInfoFiles = @($PackageInfoFiles | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }) +} + +# Validate that we have package info files to process +if (-not $ProcessedPackageInfoFiles -or $ProcessedPackageInfoFiles.Count -eq 0) { + Write-Error "No package info files found after processing parameters. Or PackageInfoFiles parameter contains only empty or whitespace entries, please check the artifact settings." + exit 1 +} + +Write-Host "Processed Package Info Files: $($ProcessedPackageInfoFiles -join ', ')" + +# Process all packages using the processed PackageInfoFiles array +foreach ($packageInfoFile in $ProcessedPackageInfoFiles) { - Write-Host "Processing $($artifact.name)" - ProcessPackage -PackageName $artifact.name -ConfigFileDir $ConfigFileDir -} \ No newline at end of file + $packageInfo = Get-Content $packageInfoFile | ConvertFrom-Json + ProcessPackage -packageInfo $packageInfo +} diff --git a/eng/common/scripts/Verify-ChangeLogs.ps1 b/eng/common/scripts/Verify-ChangeLogs.ps1 index 9598472720c5..3b09a8ceebfd 100644 --- a/eng/common/scripts/Verify-ChangeLogs.ps1 +++ b/eng/common/scripts/Verify-ChangeLogs.ps1 @@ -1,7 +1,8 @@ # Wrapper Script for ChangeLog Verification in a PR [CmdletBinding()] param ( - [String]$PackagePropertiesFolder + [String]$PackagePropertiesFolder, + [boolean]$ForRelease = $False ) Set-StrictMode -Version 3 @@ -10,8 +11,10 @@ Set-StrictMode -Version 3 function ShouldVerifyChangeLog ($PkgArtifactDetails) { if ($PkgArtifactDetails) { - if ($PkgArtifactDetails.PSObject.Properties["skipVerifyChangeLog"] -eq $true) { - return $false + if ($PkgArtifactDetails.PSObject.Properties.Name -contains "skipVerifyChangeLog") { + if ($PkgArtifactDetails.skipVerifyChangeLog) { + return $false + } } return $true @@ -33,7 +36,9 @@ foreach($propertiesFile in $packageProperties) { continue } - $validChangeLog = Confirm-ChangeLogEntry -ChangeLogLocation $PackageProp.ChangeLogPath -VersionString $PackageProp.Version -ForRelease $false + Write-Host "Verifying changelog for $($PackageProp.Name)" + + $validChangeLog = Confirm-ChangeLogEntry -ChangeLogLocation $PackageProp.ChangeLogPath -VersionString $PackageProp.Version -ForRelease $ForRelease if (-not $validChangeLog) { $allPassing = $false diff --git a/eng/common/scripts/Verify-Links.ps1 b/eng/common/scripts/Verify-Links.ps1 index d4406c609d0e..0eb1798da6ca 100644 --- a/eng/common/scripts/Verify-Links.ps1 +++ b/eng/common/scripts/Verify-Links.ps1 @@ -120,6 +120,9 @@ function ProcessLink([System.Uri]$linkUri) { # See comment in function below for details. return ProcessCratesIoLink $linkUri $matches['path'] } + elseif ($linkUri -match '^https?://(www\.)?npmjs\.com/package/.+') { + return ProcessNpmLink $linkUri + } else { return ProcessStandardLink $linkUri } @@ -157,6 +160,31 @@ function ProcessCratesIoLink([System.Uri]$linkUri, $path) { return $true } +function ProcessNpmLink([System.Uri]$linkUri) { + # npmjs.com started using Cloudflare which returns 403 and we need to instead check the registry api for existence checks + # https://github.com/orgs/community/discussions/174098#discussioncomment-14461226 + + # Handle versioned URLs: https://www.npmjs.com/package/@azure/ai-agents/v/1.1.0 -> https://registry.npmjs.org/@azure/ai-agents/1.1.0 + # Handle non-versioned URLs: https://www.npmjs.com/package/@azure/ai-agents -> https://registry.npmjs.org/@azure/ai-agents + # The regex captures the package name (which may contain a slash for scoped packages) and optionally the version. + # Query parameters and URL fragments are excluded from the transformation. + $urlString = $linkUri.ToString() + if ($urlString -match '^https?://(?:www\.)?npmjs\.com/package/([^?#]+)/v/([^?#]+)') { + # Versioned URL: remove the /v/ segment but keep the version + $apiUrl = "https://registry.npmjs.org/$($matches[1])/$($matches[2])" + } + elseif ($urlString -match '^https?://(?:www\.)?npmjs\.com/package/([^?#]+)') { + # Non-versioned URL: just replace the domain + $apiUrl = "https://registry.npmjs.org/$($matches[1])" + } + else { + # Fallback: use the original URL if it doesn't match expected patterns + $apiUrl = $urlString + } + + return ProcessStandardLink ([System.Uri]$apiUrl) +} + function ProcessStandardLink([System.Uri]$linkUri) { $headRequestSucceeded = $true try { @@ -530,6 +558,8 @@ foreach ($url in $urls) { LogGroupStart "Link checking details" +$originalcheckLinkGuidance = $checkLinkGuidance + while ($pageUrisToCheck.Count -ne 0) { $pageUri = $pageUrisToCheck.Dequeue(); @@ -538,6 +568,11 @@ while ($pageUrisToCheck.Count -ne 0) if ($checkedPages.ContainsKey($pageUri)) { continue } $checkedPages[$pageUri] = $true; + # copilot instructions require the use of relative links which is against our general guidance + # but we mainly care about those guidelines for docs publishing and not copilot instructions + # so we can disable the guidelines while validating copilot instruction files. + if ($pageUri -match "instructions.md$") { $checkLinkGuidance = $false } + [string[]] $linkUris = GetLinks $pageUri Write-Host "Checking $($linkUris.Count) links found on page $pageUri"; $badLinksPerPage = @(); @@ -561,6 +596,8 @@ while ($pageUrisToCheck.Count -ne 0) } catch { Write-Host "Exception encountered while processing pageUri $pageUri : $($_.Exception)" throw + } finally { + $checkLinkGuidance = $originalcheckLinkGuidance } } diff --git a/eng/common/scripts/Verify-Readme.ps1 b/eng/common/scripts/Verify-Readme.ps1 index 4e2cd6522497..05779d9aa3dc 100644 --- a/eng/common/scripts/Verify-Readme.ps1 +++ b/eng/common/scripts/Verify-Readme.ps1 @@ -9,7 +9,7 @@ param ( [string]$SettingsPath ) . (Join-Path $PSScriptRoot common.ps1) -$DefaultDocWardenVersion = "0.7.2" +$DefaultDocWardenVersion = "0.7.3" $script:FoundError = $false function Test-Readme-Files { diff --git a/eng/common/scripts/check-spelling-in-changed-files.ps1 b/eng/common/scripts/check-spelling-in-changed-files.ps1 index 8ac20c182532..aee066a5c0c1 100644 --- a/eng/common/scripts/check-spelling-in-changed-files.ps1 +++ b/eng/common/scripts/check-spelling-in-changed-files.ps1 @@ -114,7 +114,7 @@ foreach ($file in $changedFiles) { $spellingErrors = &"$PSScriptRoot/../spelling/Invoke-Cspell.ps1" ` -CspellConfigPath $CspellConfigPath ` -SpellCheckRoot $SpellCheckRoot ` - -ScanGlobs $changedFilePaths + -FileList $changedFilePaths if ($spellingErrors) { $errorLoggingFunction = Get-Item 'Function:LogWarning' diff --git a/eng/common/scripts/common.ps1 b/eng/common/scripts/common.ps1 index 6bef283e449c..f9411ccc13f4 100644 --- a/eng/common/scripts/common.ps1 +++ b/eng/common/scripts/common.ps1 @@ -1,3 +1,4 @@ +#Requires -Version 7.0 # cSpell:ignore Apireview # cSpell:ignore Onboarded $RepoRoot = Resolve-Path (Join-Path $PSScriptRoot .. .. ..) diff --git a/eng/common/scripts/job-matrix/Create-JobMatrix.ps1 b/eng/common/scripts/job-matrix/Create-JobMatrix.ps1 index d35b3c923a6d..2ca67e92a7d6 100644 --- a/eng/common/scripts/job-matrix/Create-JobMatrix.ps1 +++ b/eng/common/scripts/job-matrix/Create-JobMatrix.ps1 @@ -54,7 +54,9 @@ LogGroupEnd $serialized = SerializePipelineMatrix $matrix Write-Host "Generated matrix:" -Write-Host $serialized.pretty + +# Write-Output required to support other scripts that call this script directly +Write-Output $serialized.pretty if ($CI) { Write-Output "##vso[task.setVariable variable=matrix;isOutput=true]$($serialized.compressed)" diff --git a/eng/common/scripts/logging.ps1 b/eng/common/scripts/logging.ps1 index 94dc900dba9a..ae0c85438659 100644 --- a/eng/common/scripts/logging.ps1 +++ b/eng/common/scripts/logging.ps1 @@ -38,7 +38,7 @@ function LogWarning { Write-Host ("::warning::$args" -replace "`n", "%0D%0A") } else { - Write-Warning "$args" + Write-Host "$args" -ForegroundColor Yellow } } @@ -59,7 +59,7 @@ function LogErrorForFile($file, $errorString) Write-Host ("::error file=$file,line=1,col=1::$errorString" -replace "`n", "%0D%0A") } else { - Write-Error "[Error in file $file]$errorString" + Write-Host "[Error in file $file]$errorString" -ForegroundColor Red } } @@ -71,7 +71,7 @@ function LogError { Write-Host ("::error::$args" -replace "`n", "%0D%0A") } else { - Write-Error "$args" + Write-Host "$args" -ForegroundColor Red } } @@ -94,6 +94,9 @@ function LogGroupStart() { elseif (Test-SupportsGitHubLogging) { Write-Host "::group::$args" } + else { + Write-Host "> $args" + } } function LogGroupEnd() { @@ -111,3 +114,15 @@ function LogJobFailure() { } # No equivalent for GitHub Actions. Failure is only determined by nonzero exit code. } + +function ProcessMsBuildLogLine($line) { + if (Test-SupportsDevOpsLogging) { + if ($line -like "*: error*") { + return ("##vso[task.LogIssue type=error;]$line" -replace "`n", "%0D%0A") + } + elseif ($line -like "*: warning*") { + return ("##vso[task.LogIssue type=warning;]$line" -replace "`n", "%0D%0A") + } + } + return $line +} diff --git a/eng/common/scripts/login-to-github.ps1 b/eng/common/scripts/login-to-github.ps1 new file mode 100644 index 000000000000..129946a409b3 --- /dev/null +++ b/eng/common/scripts/login-to-github.ps1 @@ -0,0 +1,198 @@ +<# +.SYNOPSIS + Mints a GitHub App installation access token using Azure Key Vault 'sign' (non-exportable key), + and logs in the GitHub CLI by setting GH_TOKEN. + + Works in both Azure DevOps pipelines and GitHub Actions workflows. + Requires Azure CLI to be pre-authenticated (via AzureCLI@2 in ADO, or azure/login in GH Actions). + +.PARAMETER KeyVaultName + Name of the Azure Key Vault containing the non-exportable RSA key. + +.PARAMETER KeyName + Name of the RSA key in Key Vault (imported as a *key*, not a secret). + +.PARAMETER GitHubAppId + Numeric App ID (not client ID) of your GitHub App. + +.PARAMETER InstallationTokenOwners + List of GitHub organizations or users for which to obtain installation tokens. + +.PARAMETER VariableNamePrefix + Prefix for the exported variable name (default: GH_TOKEN). + With a single owner, exports as GH_TOKEN. With multiple owners, exports as GH_TOKEN_. + +.OUTPUTS + Sets environment variables in the current process and exports them to the CI system: + - Azure DevOps: sets secret pipeline variables via ##vso logging commands + - GitHub Actions: writes to GITHUB_ENV and masks the token +#> + +[CmdletBinding()] +param( + [string] $KeyVaultName = "azuresdkengkeyvault", + [string] $KeyName = "azure-sdk-automation", + [string] $GitHubAppId = '1086291', # Azure SDK Automation App ID + [string[]] $InstallationTokenOwners = @("Azure"), + [string] $VariableNamePrefix = "GH_TOKEN" +) + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version Latest + +$GitHubApiBaseUrl = "https://api.github.com" +$GitHubApiVersion = "2022-11-28" + +function Get-Headers { + param( + [Parameter(Mandatory)][string] $Jwt, + [Parameter(Mandatory)][string] $ApiVersion + ) + return @{ + 'Authorization' = "Bearer $Jwt" + 'Accept' = 'application/vnd.github+json' + 'X-GitHub-Api-Version' = $ApiVersion + 'User-Agent' = 'ado-pwsh-ghapp' + } +} + +function New-GitHubAppJwt { + param( + [Parameter(Mandatory)] [string] $VaultName, + [Parameter(Mandatory)] [string] $KeyName, + [Parameter(Mandatory)] [string] $AppId + ) + + function Base64UrlEncode { + param( + [string]$Data, + [switch]$IsBase64String + ) + if ($IsBase64String) { + $base64 = $Data + } else { + $bytes = [System.Text.Encoding]::UTF8.GetBytes($Data) + $base64 = [Convert]::ToBase64String($bytes) + } + return $base64.TrimEnd('=') -replace '\+', '-' -replace '/', '_' + } + + # === STEP 1: Create JWT Header and Payload === + $Header = @{ + alg = "RS256" + typ = "JWT" + } + $Now = [int][double]::Parse((Get-Date -UFormat %s)) + $Payload = @{ + iat = $Now - 10 # 10 seconds clock skew + exp = $Now + 600 # 10 minutes + iss = $AppId + } + + $EncodedHeader = Base64UrlEncode (ConvertTo-Json $Header -Compress) + $EncodedPayload = Base64UrlEncode (ConvertTo-Json $Payload -Compress) + $UnsignedToken = "$EncodedHeader.$EncodedPayload" + + # === STEP 2: Sign the token using Azure CLI === + $UnsignedTokenBytes = [System.Security.Cryptography.SHA256]::Create().ComputeHash([Text.Encoding]::ASCII.GetBytes($UnsignedToken)) + $Base64Value = [Convert]::ToBase64String($UnsignedTokenBytes) + + $SignResultJson = az keyvault key sign ` + --vault-name $VaultName ` + --name $KeyName ` + --algorithm RS256 ` + --digest $Base64Value | ConvertFrom-Json + + if ($LASTEXITCODE -ne 0) { + throw "Failed to sign JWT with Azure Key Vault. Error: $($SignResultJson | ConvertTo-Json -Compress)" + } + + if (!$SignResultJson.signature) { + throw "Azure Key Vault response does not contain a signature. Response: $($SignResultJson | ConvertTo-Json -Compress)" + } + + $Signature = Base64UrlEncode -Data $SignResultJson.signature -IsBase64String + return "$UnsignedToken.$Signature" +} + +function Get-GitHubInstallationId { + param( + [Parameter(Mandatory)][string] $Jwt, + [Parameter(Mandatory)][string] $ApiBase, + [Parameter(Mandatory)][string] $ApiVersion, + [Parameter(Mandatory)][string] $InstallationTokenOwner + ) + + $headers = Get-Headers -Jwt $Jwt -ApiVersion $ApiVersion + + $uri = "$ApiBase/app/installations" + $resp = Invoke-RestMethod -Method Get -Headers $headers -Uri $uri -TimeoutSec 30 -MaximumRetryCount 3 + + $resp | Foreach-Object { Write-Host " $($_.id): $($_.account.login) [$($_.target_type)]" } + + $resp = $resp | Where-Object { $_.account.login -ieq $InstallationTokenOwner } + if (!$resp.id) { throw "No installations found for this App." } + return $resp.id +} + +function New-GitHubInstallationToken { + param( + [Parameter(Mandatory)] [string] $Jwt, + [Parameter(Mandatory)] [string] $InstallationId, + [Parameter(Mandatory)] [string] $ApiBase, + [Parameter(Mandatory)] [string] $ApiVersion + ) + $headers = Get-Headers -Jwt $Jwt -ApiVersion $ApiVersion + $uri = "$ApiBase/app/installations/$InstallationId/access_tokens" + $resp = Invoke-RestMethod -Method Post -Headers $headers -Uri $uri -TimeoutSec 30 -MaximumRetryCount 3 + if (!$resp.token) { throw "Failed to obtain installation access token for installation $InstallationId." } + return $resp.token +} + +Write-Host "Generating GitHub App JWT by signing via Azure Key Vault (no key export)..." +$jwt = New-GitHubAppJwt -VaultName $KeyVaultName -KeyName $KeyName -AppId $GitHubAppId + +foreach ($InstallationTokenOwner in $InstallationTokenOwners) +{ + Write-Host "Fetching installation ID for $InstallationTokenOwner ..." + $installationId = Get-GitHubInstallationId -Jwt $jwt -ApiBase $GitHubApiBaseUrl -ApiVersion $GitHubApiVersion -InstallationTokenOwner $InstallationTokenOwner + + Write-Host "Installation ID resolved: $installationId" + + Write-Host "Exchanging JWT for installation access token..." + $installationToken = New-GitHubInstallationToken -Jwt $jwt -InstallationId $installationId -ApiBase $GitHubApiBaseUrl -ApiVersion $GitHubApiVersion + + $variableName = $VariableNamePrefix + if ($InstallationTokenOwners.Count -gt 1) + { + $variableName = $VariableNamePrefix + "_" + $InstallationTokenOwner + } + + Set-Item -Path Env:$variableName -Value $installationToken + + # Export for gh CLI & git + Write-Host "$variableName has been set in the current process." + + # Azure DevOps: set secret pipeline variable (so later tasks can reuse it) + if ($null -ne $env:SYSTEM_TEAMPROJECTID) { + Write-Host "##vso[task.setvariable variable=$variableName;issecret=true]$installationToken" + Write-Host "Azure DevOps variable '$variableName' has been set (secret)." + } + + # GitHub Actions: mask the token and export to GITHUB_ENV + if ($env:GITHUB_ACTIONS -eq 'true') { + Write-Host "::add-mask::$installationToken" + Add-Content -Path $env:GITHUB_ENV -Value "$variableName=$installationToken" + Write-Host "GitHub Actions env variable '$variableName' has been exported." + } + + try { + Write-Host "`n--- gh auth status ---" + $gh_token_value_before = $env:GH_TOKEN + $env:GH_TOKEN = $installationToken + & gh auth status + } + finally{ + $env:GH_TOKEN = $gh_token_value_before + } +} diff --git a/eng/common/scripts/stress-testing/deploy-stress-tests.ps1 b/eng/common/scripts/stress-testing/deploy-stress-tests.ps1 index cf763b5bb1cd..3f8c0f63bb43 100755 --- a/eng/common/scripts/stress-testing/deploy-stress-tests.ps1 +++ b/eng/common/scripts/stress-testing/deploy-stress-tests.ps1 @@ -42,5 +42,30 @@ param( . $PSScriptRoot/stress-test-deployment-lib.ps1 +# If there are local changes to values.yaml it's almost certain that the user +# is an admin and has provisioned a new stress cluster but not published a +# new addons chart with the new infra config values. In these cases we should +# just fail, as deploying without the local addons override causes misleading +# errors in the cluster with pods not able to mount storage accounts using the +# old values.yaml reference from the published stress-test-addons helm chart. +if (!$LocalAddonsPath) { + try { + $repoRoot = git -C $PSScriptRoot rev-parse --show-toplevel 2>$null + } catch { + $repoRoot = $null + } + + if ($repoRoot -and (Split-Path $repoRoot -Leaf) -eq "azure-sdk-tools") { + $valuesFile = Join-Path $repoRoot "tools/stress-cluster/cluster/kubernetes/stress-test-addons/values.yaml" + if (Test-Path $valuesFile) { + $valuesStatus = git -C $repoRoot status --porcelain -- $valuesFile + if ($valuesStatus) { + $localAddonsDir = Split-Path $valuesFile -Parent + throw "Detected changes to '$valuesFile' without -LocalAddonsPath. Re-run with '-LocalAddonsPath $localAddonsDir' to apply local addon values." + } + } + } +} + CheckDependencies DeployStressTests @PSBoundParameters diff --git a/eng/common/scripts/stress-testing/find-all-stress-packages.ps1 b/eng/common/scripts/stress-testing/find-all-stress-packages.ps1 index 64df21a3a826..f595f8e7fd47 100644 --- a/eng/common/scripts/stress-testing/find-all-stress-packages.ps1 +++ b/eng/common/scripts/stress-testing/find-all-stress-packages.ps1 @@ -31,8 +31,10 @@ function FindStressPackages( $filters['stressTest'] = 'true' $packages = @() $chartFiles = Get-ChildItem -Recurse -Filter 'Chart.yaml' $directory - Write-Host "Found chart files:" - Write-Host ($chartFiles -join "`n") + if ($chartFiles) { + Write-Host "Found chart files:" + Write-Host ($chartFiles -join "`n") + } if (!$MatrixFileName) { $MatrixFileName = 'scenarios-matrix.yaml' diff --git a/eng/common/scripts/stress-testing/stress-test-deployment-lib.ps1 b/eng/common/scripts/stress-testing/stress-test-deployment-lib.ps1 index a2ec15999ad2..64d850bf896f 100644 --- a/eng/common/scripts/stress-testing/stress-test-deployment-lib.ps1 +++ b/eng/common/scripts/stress-testing/stress-test-deployment-lib.ps1 @@ -122,21 +122,21 @@ function DeployStressTests( if ($clusterGroup -or $subscription) { Write-Warning "Overriding cluster group and subscription with defaults for 'pg' environment." } - $clusterGroup = 'rg-stress-cluster-pg' + $clusterGroup = 'SSS3PT_rg-stress-cluster-pg' $subscription = 'Azure SDK Test Resources - TME' $tenant = '70a036f6-8e4d-4615-bad6-149c02e7720d' } elseif ($environment -eq 'prod') { if ($clusterGroup -or $subscription) { Write-Warning "Overriding cluster group and subscription with defaults for 'prod' environment." } - $clusterGroup = 'rg-stress-cluster-prod' + $clusterGroup = 'SSS3PT_rg-stress-cluster-prod' $subscription = 'Azure SDK Test Resources - TME' $tenant = '70a036f6-8e4d-4615-bad6-149c02e7720d' } elseif ($environment -eq 'storage') { if ($clusterGroup -or $subscription) { Write-Warning "Overriding cluster group and subscription with defaults for 'storage' environment." } - $clusterGroup = 'rg-stress-cluster-storage' + $clusterGroup = 'SSS3PT_rg-stress-cluster-storage' $subscription = 'Azure SDK Test Resources - TME' $tenant = '72f988bf-86f1-41af-91ab-2d7cd011db47' } elseif (!$clusterGroup -or !$subscription -or $tenant) { @@ -172,6 +172,10 @@ function DeployStressTests( -MatrixFilters $MatrixFilters ` -MatrixReplace $MatrixReplace ` -MatrixNonSparseParameters $MatrixNonSparseParameters) + if (!$pkgs -or !$pkgs.Length) { + Write-Warning "No stress test packages found in $searchDirectory" + exit 0 + } Write-Host "" "Found $($pkgs.Length) stress test packages:" Write-Host $pkgs.Directory "" foreach ($pkg in $pkgs) { From 6106eacb4ea1b2f0fb903dca42da7a7856a6acef Mon Sep 17 00:00:00 2001 From: muyao Date: Wed, 4 Mar 2026 08:50:43 +0800 Subject: [PATCH 5/5] sync eng/common --- eng/common/.gitignore | 4 + .../TestResources/New-TestResources.ps1 | 92 +- .../TestResources/TestResources-Helpers.ps1 | 77 +- .../TestResources/deploy-test-resources.yml | 7 +- eng/common/actions/login-to-github/action.yml | 102 + .../check-package-readiness.instructions.md | 34 + .../check-package-validation.instructions.md | 23 + .../create-release-plan.instructions.md | 64 + .../local-sdk-workflow.instructions.md | 157 + ...dk-details-in-release-plan.instructions.md | 52 + .../azsdk-tools/typespec-docs.instructions.md | 11 + .../typespec-to-sdk.instructions.md | 94 + .../validate-codeowners.instructions.md | 74 + .../validate-service-label.instructions.md | 54 + .../verify-namespace-approval.instructions.md | 22 + .../azsdk-tools/verify-setup.instructions.md | 28 + .../copilot/sdk-release.instructions.md | 19 + .../knowledge/customizing-client-tsp.md | 510 +++ eng/common/mcp/azure-sdk-mcp.ps1 | 122 +- eng/common/pipelines/ai-evals-tests.yml | 48 + eng/common/pipelines/codeowners-linter.yml | 7 +- .../templates/archetype-typespec-emitter.yml | 88 +- .../pipelines/templates/jobs/ai-eval-job.yml | 100 + eng/common/pipelines/templates/jobs/perf.yml | 9 +- .../templates/jobs/prepare-pipelines.yml | 2 +- .../templates/steps/check-spelling.yml | 33 +- .../templates/steps/create-apireview.yml | 100 +- .../steps/create-authenticated-npmrc.yml | 5 + .../steps/daily-dev-build-variable.yml | 2 + .../templates/steps/detect-api-changes.yml | 4 +- .../templates/steps/install-azsdk-cli.yml | 16 + .../templates/steps/login-to-github.yml | 25 + .../steps/mark-release-completion.yml | 22 + .../steps/set-test-pipeline-version.yml | 26 +- .../templates/steps/set-vcpkg-cache-vars.yml | 26 + .../templates/steps/validate-all-packages.yml | 21 +- .../templates/steps/verify-changelogs.yml | 4 + .../templates/steps/verify-links.yml | 2 +- eng/common/spelling/Invoke-Cspell.ps1 | 148 +- eng/common/spelling/README.md | 84 + eng/common/spelling/package-lock.json | 3227 ++++++----------- eng/common/spelling/package.json | 7 +- eng/common/testproxy/target_version.txt | 2 +- eng/common/tsp-client/README.md | 82 + eng/common/tsp-client/package.json | 5 + 45 files changed, 3274 insertions(+), 2367 deletions(-) create mode 100644 eng/common/.gitignore create mode 100644 eng/common/actions/login-to-github/action.yml create mode 100644 eng/common/instructions/azsdk-tools/check-package-readiness.instructions.md create mode 100644 eng/common/instructions/azsdk-tools/check-package-validation.instructions.md create mode 100644 eng/common/instructions/azsdk-tools/create-release-plan.instructions.md create mode 100644 eng/common/instructions/azsdk-tools/local-sdk-workflow.instructions.md create mode 100644 eng/common/instructions/azsdk-tools/sdk-details-in-release-plan.instructions.md create mode 100644 eng/common/instructions/azsdk-tools/typespec-docs.instructions.md create mode 100644 eng/common/instructions/azsdk-tools/typespec-to-sdk.instructions.md create mode 100644 eng/common/instructions/azsdk-tools/validate-codeowners.instructions.md create mode 100644 eng/common/instructions/azsdk-tools/validate-service-label.instructions.md create mode 100644 eng/common/instructions/azsdk-tools/verify-namespace-approval.instructions.md create mode 100644 eng/common/instructions/azsdk-tools/verify-setup.instructions.md create mode 100644 eng/common/instructions/copilot/sdk-release.instructions.md create mode 100644 eng/common/knowledge/customizing-client-tsp.md create mode 100644 eng/common/pipelines/ai-evals-tests.yml create mode 100644 eng/common/pipelines/templates/jobs/ai-eval-job.yml create mode 100644 eng/common/pipelines/templates/steps/install-azsdk-cli.yml create mode 100644 eng/common/pipelines/templates/steps/login-to-github.yml create mode 100644 eng/common/pipelines/templates/steps/mark-release-completion.yml create mode 100644 eng/common/pipelines/templates/steps/set-vcpkg-cache-vars.yml create mode 100644 eng/common/spelling/README.md create mode 100644 eng/common/tsp-client/README.md create mode 100644 eng/common/tsp-client/package.json diff --git a/eng/common/.gitignore b/eng/common/.gitignore new file mode 100644 index 000000000000..8a59021320d8 --- /dev/null +++ b/eng/common/.gitignore @@ -0,0 +1,4 @@ +## Node + +# Dependency directories +node_modules/ diff --git a/eng/common/TestResources/New-TestResources.ps1 b/eng/common/TestResources/New-TestResources.ps1 index 078991250e64..06fe2eb2034b 100755 --- a/eng/common/TestResources/New-TestResources.ps1 +++ b/eng/common/TestResources/New-TestResources.ps1 @@ -129,6 +129,11 @@ param ( $wellKnownTMETenants = @('70a036f6-8e4d-4615-bad6-149c02e7720d') +# People keep passing this legacy parameter. Throw an error to save them future keystrokes +if ($NewTestResourcesRemainingArguments -like '*UserAuth*') { + throw "The -UserAuth parameter is deprecated and is now the default behavior" +} + if (!$ServicePrincipalAuth) { # Clear secrets if not using Service Principal auth. This prevents secrets # from being passed to pre- and post-scripts. @@ -174,7 +179,7 @@ try { } Write-Verbose "Overriding test resources search directory to '$root'" } - + $templateFiles = @() "$ResourceType-resources.json", "$ResourceType-resources.bicep" | ForEach-Object { @@ -198,7 +203,7 @@ try { # returns empty string if $ServiceDirectory is not set $serviceName = GetServiceLeafDirectoryName $ServiceDirectory - + # in ci, random names are used # in non-ci, without BaseName, ResourceGroupName or ServiceDirectory, all invocations will # generate the same resource group name and base name for a given user @@ -267,13 +272,13 @@ try { if ($context.Tenant.Name -like '*TME*') { if ($currentSubscriptionId -ne '4d042dc6-fe17-4698-a23f-ec6a8d1e98f4') { Log "Attempting to select subscription 'Azure SDK Test Resources - TME (4d042dc6-fe17-4698-a23f-ec6a8d1e98f4)'" - $null = Select-AzSubscription -Subscription '4d042dc6-fe17-4698-a23f-ec6a8d1e98f4' -ErrorAction Ignore + $null = Select-AzSubscription -Subscription '4d042dc6-fe17-4698-a23f-ec6a8d1e98f4' -ErrorAction Ignore -WarningAction Ignore # Update the context. $context = Get-AzContext } } elseif ($currentSubcriptionId -ne 'faa080af-c1d8-40ad-9cce-e1a450ca5b57') { Log "Attempting to select subscription 'Azure SDK Developer Playground (faa080af-c1d8-40ad-9cce-e1a450ca5b57)'" - $null = Select-AzSubscription -Subscription 'faa080af-c1d8-40ad-9cce-e1a450ca5b57' -ErrorAction Ignore + $null = Select-AzSubscription -Subscription 'faa080af-c1d8-40ad-9cce-e1a450ca5b57' -ErrorAction Ignore -WarningAction Ignore # Update the context. $context = Get-AzContext } @@ -305,7 +310,7 @@ try { } } - # This needs to happen after we set the TenantId but before we use the ResourceGroupName + # This needs to happen after we set the TenantId but before we use the ResourceGroupName if ($wellKnownTMETenants.Contains($TenantId)) { # Add a prefix to the resource group name to avoid flagging the usages of local auth # See details at https://eng.ms/docs/products/onecert-certificates-key-vault-and-dsms/key-vault-dsms/certandsecretmngmt/credfreefaqs#how-can-i-disable-s360-reporting-when-testing-customer-facing-3p-features-that-depend-on-use-of-unsafe-local-auth @@ -353,15 +358,19 @@ try { # Make sure the provisioner OID is set so we can pass it through to the deployment. if (!$ProvisionerApplicationId -and !$ProvisionerApplicationOid) { if ($context.Account.Type -eq 'User') { - # Support corp tenant and TME tenant user id lookups - $user = Get-AzADUser -Mail $context.Account.Id - if ($null -eq $user -or !$user.Id) { - $user = Get-AzADUser -UserPrincipalName $context.Account.Id + # Calls to graph API in corp tenant get blocked by conditional access policy now + # but not in TME. For corp tenant we get the user's id from the login context + # but for TME it is different so we have to source it from graph + $userAccountId = if ($wellKnownTMETenants.Contains($TenantId)) { + (Get-AzADUser -SignedIn).Id + } else { + # HomeAccountId format is '.' + (Get-AzContext).Account.ExtendedProperties.HomeAccountId.Split('.')[0] } - if ($null -eq $user -or !$user.Id) { + if ($null -eq $userAccountId) { throw "Failed to find entra object ID for the current user" } - $ProvisionerApplicationOid = $user.Id + $ProvisionerApplicationOid = $userAccountId } elseif ($context.Account.Type -eq 'ServicePrincipal') { $sp = Get-AzADServicePrincipal -ApplicationId $context.Account.Id $ProvisionerApplicationOid = $sp.Id @@ -428,20 +437,25 @@ try { if (!$CI -and !$ServicePrincipalAuth) { if ($TestApplicationId) { - Write-Warning "The specified TestApplicationId '$TestApplicationId' will be ignored when -ServicePrincipalAutth is not set." + Write-Warning "The specified TestApplicationId '$TestApplicationId' will be ignored when -ServicePrincipalAuth is not set." } - # Support corp tenant and TME tenant user id lookups - $userAccount = (Get-AzADUser -Mail (Get-AzContext).Account.Id) - if ($null -eq $userAccount -or !$userAccount.Id) { - $userAccount = (Get-AzADUser -UserPrincipalName (Get-AzContext).Account) + $userAccountName = (Get-AzContext).Account.Id + # HomeAccountId format is '.' + # Calls to graph API in corp tenant get blocked by conditional access policy now + # but not in TME. For corp tenant we get the user's id from the login context + # but for TME it is different so we have to source it from graph + $userAccountId = if ($wellKnownTMETenants.Contains($TenantId)) { + (Get-AzADUser -SignedIn).Id + } else { + # HomeAccountId format is '.' + (Get-AzContext).Account.ExtendedProperties.HomeAccountId.Split('.')[0] } - if ($null -eq $userAccount -or !$userAccount.Id) { + if ($null -eq $userAccountId) { throw "Failed to find entra object ID for the current user" } - $TestApplicationOid = $userAccount.Id + $TestApplicationOid = $userAccountId $TestApplicationId = $testApplicationOid - $userAccountName = $userAccount.UserPrincipalName Log "User authentication with user '$userAccountName' ('$TestApplicationId') will be used." } # If user has specified -ServicePrincipalAuth @@ -613,22 +627,44 @@ try { } Log $msg - $deployment = Retry { - New-AzResourceGroupDeployment ` + # Run a first pass outside of Retry to fail fast for + # template validation errors that won't be fixed with retries. + # Only run Test-AzResourceGroupDeployment after error because it can + # take a while for large templates even during success cases. + try { + $deployment = New-AzResourceGroupDeployment ` + -Name $BaseName ` + -ResourceGroupName $resourceGroup.ResourceGroupName ` + -TemplateFile $templateFile.jsonFilePath ` + -TemplateParameterObject $templateFileParameters ` + -Force:$Force + } catch { + # Throw if we hit a template validation error, otherwise proceed + if ($_.Exception.Message -like '*InvalidTemplateDeployment*') { + $validation = Test-AzResourceGroupDeployment ` + -ResourceGroupName $resourceGroup.ResourceGroupName ` + -TemplateFile $templateFile.jsonFilePath ` + -TemplateParameterObject $templateFileParameters + + HandleTemplateDeploymentError $validation + throw + } + } + + if (!$deployment -or $deployment.ProvisioningState -ne 'Succeeded') { + Write-Warning "Initial deployment attempt failed, retrying..." + $deployment = Retry -Attempts 4 -Action { + New-AzResourceGroupDeployment ` -Name $BaseName ` -ResourceGroupName $resourceGroup.ResourceGroupName ` -TemplateFile $templateFile.jsonFilePath ` -TemplateParameterObject $templateFileParameters ` -Force:$Force + } } + if ($deployment.ProvisioningState -ne 'Succeeded') { - Write-Host "Deployment '$($deployment.DeploymentName)' has state '$($deployment.ProvisioningState)' with CorrelationId '$($deployment.CorrelationId)'. Exiting..." - Write-Host @' -##################################################### -# For help debugging live test provisioning issues, # -# see http://aka.ms/azsdk/engsys/live-test-help # -##################################################### -'@ + HandleDeploymentFailure $deployment exit 1 } diff --git a/eng/common/TestResources/TestResources-Helpers.ps1 b/eng/common/TestResources/TestResources-Helpers.ps1 index cbe047ebc5f1..c6c118cc5038 100644 --- a/eng/common/TestResources/TestResources-Helpers.ps1 +++ b/eng/common/TestResources/TestResources-Helpers.ps1 @@ -185,8 +185,6 @@ function LintBicepFile([string] $path) { } # Work around lack of config file override: https://github.com/Azure/bicep/issues/5013 - $output = bicep lint $path 2>&1 - if ($useBicepCli) { $output = bicep lint $path 2>&1 } else { @@ -264,9 +262,10 @@ function SetDeploymentOutputs( ) { $deploymentEnvironmentVariables = $environmentVariables.Clone() $deploymentOutputs = BuildDeploymentOutputs $serviceName $azContext $deployment $deploymentEnvironmentVariables + $isBicep = $templateFile.originalFilePath -and $templateFile.originalFilePath.EndsWith(".bicep") - if ($OutFile) { - if ($IsWindows -and $Language -eq 'dotnet') { + # Azure SDK for .NET on Windows uses DPAPI-encrypted, JSON-encoded environment variables. + if ($OutFile -and $IsWindows -and $Language -eq 'dotnet') { $outputFile = "$($templateFile.originalFilePath).env" $environmentText = $deploymentOutputs | ConvertTo-Json; @@ -276,29 +275,29 @@ function SetDeploymentOutputs( Set-Content $outputFile -Value $protectedBytes -AsByteStream -Force Write-Host "Test environment settings`n$environmentText`nstored into encrypted $outputFile" + } + # Any Bicep template in a repo that has opted into .env files. + elseif ($OutFile -and $isBicep) { + $bicepTemplateFile = $templateFile.originalFilePath + + # Make sure the file would not write secrets to .env file. + if (!(LintBicepFile $bicepTemplateFile)) { + Write-Error "$bicepTemplateFile may write secrets. No file written." } - elseif ($templateFile.originalFilePath -and $templateFile.originalFilePath.EndsWith(".bicep")) { - $bicepTemplateFile = $templateFile.originalFilePath + $outputFile = $bicepTemplateFile | Split-Path | Join-Path -ChildPath '.env' - # Make sure the file would not write secrets to .env file. - if (!(LintBicepFile $bicepTemplateFile)) { - Write-Error "$bicepTemplateFile may write secrets. No file written." + # Make sure the file would be ignored. + git check-ignore -- "$outputFile" > $null + if ($?) { + $environmentText = foreach ($kv in $deploymentOutputs.GetEnumerator()) { + "$($kv.Key)=`"$($kv.Value)`"" } - $outputFile = $bicepTemplateFile | Split-Path | Join-Path -ChildPath '.env' - - # Make sure the file would be ignored. - git check-ignore -- "$outputFile" > $null - if ($?) { - $environmentText = foreach ($kv in $deploymentOutputs.GetEnumerator()) { - "$($kv.Key)=`"$($kv.Value)`"" - } - Set-Content $outputFile -Value $environmentText -Force - Write-Host "Test environment settings`n$environmentText`nstored in $outputFile" - } - else { - Write-Error "$outputFile is not ignored by .gitignore. No file written." - } + Set-Content $outputFile -Value $environmentText -Force + Write-Host "Test environment settings`n$environmentText`nstored in $outputFile" + } + else { + Write-Error "$outputFile is not ignored by .gitignore. No file written." } } else { @@ -349,3 +348,35 @@ function SetDeploymentOutputs( return $deploymentEnvironmentVariables, $deploymentOutputs } + +function HandleTemplateDeploymentError($templateValidationResult) { + Write-Warning "Deployment template validation failed" + + if (!$templateValidationResult.Details.Message) { + Write-Warning "Could not parse template validation error" + return + } + + # Retrieve one or more messages then decode the strings for readability (remove quote escapes, fix link readability, etc.) + $parsedMessage = ($templateValidationResult.Details.Message -join "$([System.Environment]::NewLine)$([System.Environment]::NewLine)") + $parsedMessage = [System.Net.WebUtility]::UrlDecode($parsedMessage) + + Write-Warning "#####################################################" + Write-Warning "######### TEMPLATE VALIDATION ERROR DETAILS #########" + Write-Warning "#####################################################" + Write-Host $parsedMessage + Write-Warning "#####################################################" +} + +function HandleDeploymentFailure($deployment) { + Write-Host "Deployment '$($deployment.DeploymentName)' has state '$($deployment.ProvisioningState)' with CorrelationId '$($deployment.CorrelationId)'. Exiting..." + Write-Host @' +##################################################### +# For help debugging live test provisioning issues, # +# see http://aka.ms/azsdk/engsys/live-test-help # +##################################################### +'@ + $queryTime = (Get-Date).AddMinutes(-10).ToString("o") + Write-Host "To check the activity log with the below command after waiting 2 minutes for propagation:" + Write-Host "(Get-AzActivityLog -CorrelationId '$($deployment.CorrelationId)' -StartTime '$queryTime').Properties.Content.statusMessage" +} diff --git a/eng/common/TestResources/deploy-test-resources.yml b/eng/common/TestResources/deploy-test-resources.yml index 30efe36e231c..4429d6631aa3 100644 --- a/eng/common/TestResources/deploy-test-resources.yml +++ b/eng/common/TestResources/deploy-test-resources.yml @@ -2,6 +2,7 @@ parameters: ServiceDirectory: '' TestResourcesDirectory: '' ArmTemplateParameters: '@{}' + AdditionalParameters: '@{}' DeleteAfterHours: 8 Location: '' EnvVars: {} @@ -103,7 +104,8 @@ steps: -Location '${{ parameters.Location }}' ` -DeleteAfterHours '${{ parameters.DeleteAfterHours }}' ` @subscriptionConfiguration ` - -AdditionalParameters ${{ parameters.ArmTemplateParameters }} ` + -ArmTemplateParameters ${{ parameters.ArmTemplateParameters }} ` + -AdditionalParameters ${{ parameters.AdditionalParameters }} ` -AllowIpRanges ('$(azsdk-corp-net-ip-ranges)' -split ',') ` -SelfContainedPostScript $postScriptPath ` -CI ` @@ -148,7 +150,8 @@ steps: -Location '${{ parameters.Location }}' ` -DeleteAfterHours '${{ parameters.DeleteAfterHours }}' ` @subscriptionConfiguration ` - -AdditionalParameters ${{ parameters.ArmTemplateParameters }} ` + -ArmTemplateParameters ${{ parameters.ArmTemplateParameters }} ` + -AdditionalParameters ${{ parameters.AdditionalParameters }} ` -AllowIpRanges ('$(azsdk-corp-net-ip-ranges)' -split ',') ` -CI ` -ServicePrincipalAuth ` diff --git a/eng/common/actions/login-to-github/action.yml b/eng/common/actions/login-to-github/action.yml new file mode 100644 index 000000000000..679be3828016 --- /dev/null +++ b/eng/common/actions/login-to-github/action.yml @@ -0,0 +1,102 @@ +# Login to GitHub - Composite Action +# +# Mints a GitHub App installation access token using Azure Key Vault signing. +# This action wraps eng/common/scripts/login-to-github.ps1 for use in GitHub +# Actions workflows. The same script is used by Azure DevOps pipelines via +# eng/common/pipelines/templates/steps/login-to-github.yml. +# +# IMPORTANT: This action requires Azure CLI to be pre-authenticated. +# You must call azure/login BEFORE this action in your workflow. +# This is because composite actions cannot call azure/login internally. +# +# Usage (single owner): +# jobs: +# my-job: +# # An environment is required for OIDC (federated credential) login. +# # Work with EngSys to configure the environment with the federated +# # credential for the AzureSDKEngKeyVault Secrets service connection. +# environment: AzureSDKEngKeyVault +# permissions: +# id-token: write # Required for azure/login OIDC +# steps: +# # Step 1: Authenticate to Azure (required before this action) +# - uses: azure/login@v2 +# with: +# client-id: 5786d1fb-187e-4ca9-9a81-ab89ea278986 +# tenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 +# subscription-id: a18897a6-7e44-457d-9260-f2854c0aca42 +# +# # Step 2: Mint GitHub App token +# - uses: ./eng/common/actions/login-to-github +# with: +# token-owners: Azure +# +# # Step 3: Use the token (available as env var in all subsequent steps) +# - run: gh pr list --repo Azure/azure-sdk-tools +# env: +# GH_TOKEN: ${{ env.GH_TOKEN }} +# +# Usage (multiple owners): +# - uses: ./eng/common/actions/login-to-github +# with: +# token-owners: Azure,azure-sdk,MicrosoftDocs +# +# - run: gh pr list --repo Azure/azure-sdk-tools +# env: +# GH_TOKEN: ${{ env.GH_TOKEN_Azure }} +# +# Tokens are exported to GITHUB_ENV so all subsequent steps can reference +# them as ${{ env.GH_TOKEN }} (single owner) or ${{ env.GH_TOKEN_ }} +# (multiple owners). This matches the Azure DevOps behavior where tokens +# are set as pipeline variables. + +name: 'Login to GitHub' +description: 'Mint a GitHub App installation token via Azure Key Vault signing' + +inputs: + token-owners: + description: > + Comma-separated list of GitHub organizations or users for which to + obtain installation tokens (e.g. "Azure" or "Azure,azure-sdk"). + required: false + default: 'Azure' + variable-name-prefix: + description: > + Prefix for the exported variable name. With a single owner the + variable is named exactly this (default GH_TOKEN). With multiple + owners each variable is named _. + required: false + default: 'GH_TOKEN' + key-vault-name: + description: 'Azure Key Vault name containing the signing key' + required: false + default: 'azuresdkengkeyvault' + key-name: + description: 'Name of the RSA key in Key Vault' + required: false + default: 'azure-sdk-automation' + app-id: + description: 'GitHub App numeric ID' + required: false + default: '1086291' + +runs: + using: 'composite' + steps: + - shell: pwsh + env: + INPUT_TOKEN_OWNERS: ${{ inputs.token-owners }} + INPUT_VARIABLE_NAME_PREFIX: ${{ inputs.variable-name-prefix }} + INPUT_KEY_VAULT_NAME: ${{ inputs.key-vault-name }} + INPUT_KEY_NAME: ${{ inputs.key-name }} + INPUT_APP_ID: ${{ inputs.app-id }} + ACTION_PATH: ${{ github.action_path }} + run: | + $scriptPath = Join-Path $env:ACTION_PATH ".." ".." "scripts" "login-to-github.ps1" + $owners = $env:INPUT_TOKEN_OWNERS -split ',' | ForEach-Object { $_.Trim() } + & $scriptPath ` + -KeyVaultName $env:INPUT_KEY_VAULT_NAME ` + -KeyName $env:INPUT_KEY_NAME ` + -GitHubAppId $env:INPUT_APP_ID ` + -InstallationTokenOwners $owners ` + -VariableNamePrefix $env:INPUT_VARIABLE_NAME_PREFIX diff --git a/eng/common/instructions/azsdk-tools/check-package-readiness.instructions.md b/eng/common/instructions/azsdk-tools/check-package-readiness.instructions.md new file mode 100644 index 000000000000..486d59436bee --- /dev/null +++ b/eng/common/instructions/azsdk-tools/check-package-readiness.instructions.md @@ -0,0 +1,34 @@ +--- +description: 'This prompt is designed to check the release readiness of a SDK package.' +--- +## Goal +Check the release readiness of an SDK package by collecting the required information from the user and executing the readiness check. + +## Instructions +1. **Collect Required Information**: + - Prompt the user for the exact package name + - Prompt the user to select the programming language from the following options (case sensitive): + - Python + - Java + - JavaScript + - .NET + - Go + +2. **Execute Readiness Check**: + - Use the `azsdk_release_sdk` tool with the provided package name, selected language, and set checkReady to true. + - Do not check for existing pull requests to run this step. + - Do not ask the user to create a release plan to run this step. + +3. **Present Results**: + - If the package is ready for release, highlight and provide the link to the release pipeline + - If the package is not ready, display the specific issues that need to be resolved + +4. **Follow-up Actions**: + - Provide clear next steps based on the readiness status + - If issues are found, offer guidance on how to resolve them + +## Expected User Interaction Flow +1. Ask: "What is the exact name of the package you want to check for release readiness?" +2. Ask: "Please select the programming language for this package: Python, Java, JavaScript, .NET, or Go" +3. Execute the readiness check using the provided information +4. Display results and next steps diff --git a/eng/common/instructions/azsdk-tools/check-package-validation.instructions.md b/eng/common/instructions/azsdk-tools/check-package-validation.instructions.md new file mode 100644 index 000000000000..8a1238c81f09 --- /dev/null +++ b/eng/common/instructions/azsdk-tools/check-package-validation.instructions.md @@ -0,0 +1,23 @@ +--- +description: 'Run the package validation checks for the SDK package.' +--- +## Goal +Run the validation checks for the SDK package by collecting the required information from the user and executing the `azsdk_package_run_check` tool. + +## Instructions +1. **Collect Required Information**: + - Prompt the user for the absolute package path to the package directory for the SDK package they want to check. + - Prompt the user to specify values for each of the parameters required by the azsdk_package_run_check tool. Present the user with options to pick from for the allowed values specified by the parameter schema. + +2. **Execute Check**: + - Use the `azsdk_package_run_check` tool with the package path and check type. + +3. **Present Results**: + - If the package has passed all validation checks, highlight and finish + - If the package is not ready, display the specific check types that need to be fixed for each language. + +## Expected User Interaction Flow +1. Ask: "What is the exact path of the package you want to check for validation?" +2. Ask: "Please specify the check type you want to run (e.g., 'all', 'linting', 'format', etc.)" +3. Execute the check using the provided information +4. Display results and next steps \ No newline at end of file diff --git a/eng/common/instructions/azsdk-tools/create-release-plan.instructions.md b/eng/common/instructions/azsdk-tools/create-release-plan.instructions.md new file mode 100644 index 000000000000..6d82d3272eca --- /dev/null +++ b/eng/common/instructions/azsdk-tools/create-release-plan.instructions.md @@ -0,0 +1,64 @@ +> **CRITICAL INSTRUCTIONS FOR LLM** +> 1. Backend processes may use Azure DevOps work item data as needed. However, do **not** mention or display the work item link/URL, or any reference to Azure DevOps work item resources directly in conversation with the user. +> 2. All manual updates to an existing release plan must be made through the [Release Planner Tool](https://aka.ms/sdk-release-planner) to ensure proper tracking and validation. +> 3. Only provide release plan details such as **Release Plan Link** and **Release Plan ID** to the user +> 4. Always check the `NextSteps` field in the tool response and follow any additional prompts provided. Do NOT proceed to other steps until the NextSteps are completed. + +# Release Plan Creation Process +Your goal is to create a valid release plan. You must prompt user to provide all required information and all input must match the format and requirement mentioned in step 3 below. +Follow these steps in order to create or manage a release plan for an API specification pull request: + +## Step 1: Validate Prerequisites +- Check if an API spec pull request is available in the current context +- If no pull request is available, prompt the user to provide the API spec pull request link +- Validate that the provided pull request link is accessible and valid + +## Step 2: Check for Existing Release Plan +- Ask the user if they already have an existing release plan +- If they confirm: + - Query the existing release plan using either: + - The release plan number, or + - The API spec pull request link + - Display the existing release plan details (Release Plan ID, status, associated languages, SDK PRs). +- If no existing release plan is found, continue to Step 3 to gather required details for creating a new one. + +## Step 3: Gather Release Plan Information +Collect the following required information from the user. Do not create a release plan with temporary values. Confirm the values with the user before proceeding to create the release plan. +If any details are missing, prompt the user accordingly: + +- **Service Tree ID**: GUID format identifier for the service in Service Tree. Before creating release plan, always show the value to user and ask them to confirm it's a valid value in service tree. +- **Product Service Tree ID**: GUID format identifier for the product in Service Tree. Before creating release plan, always show the value to user and ask them to confirm it's a valid value in service tree. +- **Expected Release Timeline**: Format must be in "Month YYYY" +- **API Version**: The version of the API being released +- **SDK Release Type**: Value must be beta or stable. + - "beta" for preview API versions + - "stable" for GA API versions + +## Step 4: Create Release Plan +- If the user doesn't know the required details, direct them to create a release plan using the release planner +- Provide this resource: [Release Plan Creation Guide](https://eng.ms/docs/products/azure-developer-experience/plan/release-plan-create) +- Once all information is gathered, use `azsdk_create_release_plan` to create the release plan +- If existing release plans are found, extract and display key information: Release Plan ID, status, associated languages, SDK PRs +- Display the newly created release plan details to the user for confirmation +- Refer to #file:sdk-details-in-release-plan.instructions.md to identify languages configured in the TypeSpec project and add them to the release plan + +## Step 5: Update SDK Details in Release Plan +- Refer to #file:sdk-details-in-release-plan.instructions.md to add languages and package names to the release plan +- If the TypeSpec project is for a management plane, refer to #file:verify-namespace-approval.instructions.md if this is first release of SDK. + +## Step 6: Link SDK Pull Requests (if applicable) +- Ask the user if they have already created SDK pull requests locally for any programming language +- If SDK pull requests exist: + - Collect the pull request links from the user + - Use `azsdk_link_sdk_pull_request_to_release_plan` to link each SDK pull request to the release plan + > **GitHub CLI Authentication Required:** + > Before running any SDK PR linking steps, ensure you are authenticated with GitHub CLI. + > Run: `gh auth login` + > You can check authentication status with `gh auth status`. + - Confirm successful linking for each SDK pull request + +## Step 7: Summary +- Display a summary of the completed actions: + - Release plan status (created or existing) + - Linked SDK pull requests (if any) + - Next steps or recommendations for the user \ No newline at end of file diff --git a/eng/common/instructions/azsdk-tools/local-sdk-workflow.instructions.md b/eng/common/instructions/azsdk-tools/local-sdk-workflow.instructions.md new file mode 100644 index 000000000000..507e9a6cce4b --- /dev/null +++ b/eng/common/instructions/azsdk-tools/local-sdk-workflow.instructions.md @@ -0,0 +1,157 @@ +--- +description: "Guide the user to generate and build SDKs locally for a TypeSpec based API spec" +--- + +# Goal + +Help the user generate and build SDKs locally from TypeSpec API specifications using the `azure-sdk-mcp` tools. +High level steps involved: +1. Generate SDK locally +2. Build / Compile SDK locally +3. Run package checks +4. Run package tests +5. Update change log, metadata and version + +--- + +## Generate SDK Locally + +### Step 1: Outline workflow + +**Goal**: Ensure the user understands the overall SDK generation and build process before starting. +**Actions**: + +- Present the high-level steps involved in generating and building SDK locally: + 1. Select target language + 2. Verify SDK repository + 3. Validate repository path + 4. Identify path to configuration file + 5. Verify setup for the selected language + 6. Generate SDK using `azsdk_package_generate_code` MCP tool + 7. Identify SDK project path + 8. Build/Compile SDK using `azsdk_package_build_code` MCP tool +- Ask the user to confirm readiness to proceed. + +--- + +### Step 2: Select language + +**Goal**: Confirm the target language for SDK generation. +**Actions**: + +- Prompt user to choose one of the supported languages: + - .NET + - Java + - JavaScript + - Python + - Go +- Validate input against the allowed list. + +--- + +### Step 3: Verify SDK repository + +**Goal**: Ensure the correct Azure SDK language repository is available locally. +**Actions**: + +- Prompt user to provide the path to their **locally cloned repository** for the selected language. +- Note: The **local folder name can be arbitrary**, but the repository must have originated from one of the official Azure SDK repositories: + - `azure-sdk-for-net` (.NET) + - `azure-sdk-for-java` (Java) + - `azure-sdk-for-js` (JavaScript) + - `azure-sdk-for-python` (Python) + - `azure-sdk-for-go` (Go) +- If the repository is not cloned → instruct user to clone the appropriate remote repository from GitHub. +- MCP tool will automatically validate the remote origin and repository structure. + +--- + +### Step 4: Validate repository path + +**Actions**: + +- Check if the provided repository path exists and matches the selected SDK language repository. +- If invalid → prompt user to re-enter a valid path. + +--- + +### Step 5: Identify path to configuration file + +**Goal**: Determine the correct path to the TypeSpec configuration file based on the working context. +**Actions**: + +- **Scenario A: Working in a repository cloned from `azure-rest-api-specs`** + - Identify the path to `tspconfig.yaml` (local path or HTTPS URL). + - The local folder name can be arbitrary; the MCP tool will validate that the remote origin URL points to the official `azure-rest-api-specs` repository. + - Example paths (pointing directly to tspconfig.yaml): + - `/home/usr/azure-rest-api-specs/specification/contosowidgetmanager/Contoso.Management/tspconfig.yaml` + - `https://github.com/Azure/azure-rest-api-specs/blob/4af373fc5826cf5a2365a20dde01c4b2efde48f0/specification/contosowidgetmanager/Contoso.Management/tspconfig.yaml` + +- **Scenario B: Working in one of the official Azure SDK language repositories** + (i.e., originally cloned from `azure-sdk-for-net`, `azure-sdk-for-java`, `azure-sdk-for-js`, `azure-sdk-for-python`, `azure-sdk-for-go`) + - Identify the path to `tsp-location.yaml`. + - The local folder name can be arbitrary; MCP tool will validate the remote origin URL. + - Example path: + `/home/usr/azure-sdk-for-net/sdk/contoso/Azure.ResourceManager.Contoso/tsp-location.yaml` + +--- + +### Step 6: Verify setup for selected language +**Actions**: +- Run `azsdk_verify_setup` MCP tool to ensure the local environment is correctly configured for the selected SDK language. + +--- + +### Step 7: Generate SDK + +**Actions**: +- Run `azsdk_package_generate_code` MCP tool to generate the SDK locally. + +--- + +## Build / Compile SDK Locally + +### Step 1: Identify SDK project path + +**Goal**: Locate the generated SDK project directory for building/compiling. +**Actions**: + +- Find the project directory inside the selected Azure SDK language repository. +- Typical structure: + `sdk/{service-name}/{package-name}/` +- Example: + `/path/to/azure-sdk-for-net/contoso/Azure.ResourceManager.Contoso/` + +--- + +### Step 2: Build/Compile the SDK + +**Actions**: + +- Run `azsdk_package_build_code` MCP tool to compile the SDK in the identified project directory. + +--- + +### Step 3: Run package validation + +**Actions**: + +- Run `azsdk_package_run_check` MCP tool to validate the generated SDK package in the identified project directory. + +--- + +### Step 4: Run package tests + +**Actions**: + +- Run `azsdk_package_run_tests` MCP tool to run tests on the generated SDK package in the identified project directory. + +--- + +### Step 5: Update change log, metadata and version + +**Actions**: + +- Run `azsdk_package_update_metadata` MCP tool to update metadata in the identified project directory. +- Run `azsdk_package_update_changelog_content` MCP tool to update change log in the identified project directory. +- Run `azsdk_package_update_version` MCP tool to update version in the identified project directory. \ No newline at end of file diff --git a/eng/common/instructions/azsdk-tools/sdk-details-in-release-plan.instructions.md b/eng/common/instructions/azsdk-tools/sdk-details-in-release-plan.instructions.md new file mode 100644 index 000000000000..bbf8b4841196 --- /dev/null +++ b/eng/common/instructions/azsdk-tools/sdk-details-in-release-plan.instructions.md @@ -0,0 +1,52 @@ +--- +description: 'Identify languages configured in the TypeSpec project and add it to release plan' +--- +# Step 1: Find the list of languages and package names +**Goal**: Identify languages configured in the TypeSpec project and generate the json object with language and package name. +1. Identify the language emitter configuration in the `tspconfig.yaml` file in the TypeSpec project root. +2. Identify the package name or namespace for each language emitter. + - For Java and Python, use `emitter-output-dir` for package name if it exists. Otherwise use `package-dir` to get the package name as fallback approach. + - For .NET, use namespace property to get package name. + - For JavaScript, use `packagedetails:name` property to get package name. + - For Go, use module name and remove `github.com/Azure/azure-sdk-for-go/` to get package name. +3. Map the language name in emitter to one of the following in Pascal case(except .NET): + - .NET + - Java + - Python + - JavaScript + - Go +4. Create a JSON array object with the following structure: + ```json + [ + { + "language": "", + "packageName": "" + }, + ... + ] + ``` +5. If no languages are configured, inform the user: "No languages configured in TypeSpec project. Please add at least one language emitter in tspconfig.yaml." +**Success Criteria**: JSON object with languages and package names created. + +# Step 2: Check if release plan exists +**Goal**: Determine if a release plan exists for the API spec pull request or work item Id or release plan Id in current context. +1. Get release plan +2. If no release plan exists, inform the user: "No release plan exists for the API spec pull request. Please create a release plan first." +3. If a release plan exists, proceed to Step 3. +**Success Criteria**: Release plan exists or user informed to create one. + +# Step 3: Update Release Plan with SDK Information +> **(MANDATORY - DO NOT SKIP) ALWAYS validate all package names against the format rules AND the examples table before calling any update tool, even if the user provides SDK details directly. Auto-correct and inform the user of invalid package names.** +> - **JavaScript**: Must start with `@azure/` +> - **Go**: Must start with `sdk/` +> +> **Valid package name examples (compare against these to catch invalid formats):** +> | Language | Valid | Invalid | +> |----------|-------|---------| +> | JavaScript | `@azure/arm-compute` | `arm-compute`, `azure/arm-compute`,`@azure-arm-compute` | +> | Go (management plane) | `sdk/resourcemanager/compute/armcompute` | `sdk/armcompute`, `/sdk/compute`, `github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute` | + +**Goal**: Update the release plan with the languages and package names identified in Step 1. +1. Use `azsdk_update_sdk_details_in_release_plan` to update the release plan work item with the JSON object created in Step 1. +2. Confirm successful update of the release plan with the SDK information and summary of languages and package names. +**Success Criteria**: Release plan updated with languages and package names. \ No newline at end of file diff --git a/eng/common/instructions/azsdk-tools/typespec-docs.instructions.md b/eng/common/instructions/azsdk-tools/typespec-docs.instructions.md new file mode 100644 index 000000000000..314555691f74 --- /dev/null +++ b/eng/common/instructions/azsdk-tools/typespec-docs.instructions.md @@ -0,0 +1,11 @@ +Your goal is to provide the most up-to-date documentation on the TypeSpec language, core libraries, and writing Azure services and clients in TypeSpec. Whenever a user asks a question about how something should be written in TypeSpec, you should use the documentation links below to pinpoint the most relevant and accurate information. + +## TypeSpec Azure + +- https://azure.github.io/typespec-azure/docs/llms.txt contains an index of up-to-date documentation for TypeSpec Azure libraries, including how to write service specifications for Azure Resource Manager (ARM) and Azure Data Plane services, as well as how to customize generated clients. +- Always refer to https://azure.github.io/typespec-azure/docs/llms.txt when a user asks TypeSpec related questions in case there is existing documentation that can help answer them. This also applies when a user asks to make changes to TypeSpec specifications. + +## TypeSpec documentation + +- https://typespec.io/docs/llms.txt contains an index of up-to-date documentation for TypeSpec language basics and core libraries, including how concepts like visibility and versioning work. +- Always refer to https://typespec.io/docs/llms.txt when a user asks TypeSpec related questions that aren't covered by the TypeSpec Azure topics. diff --git a/eng/common/instructions/azsdk-tools/typespec-to-sdk.instructions.md b/eng/common/instructions/azsdk-tools/typespec-to-sdk.instructions.md new file mode 100644 index 000000000000..15d8b22acf06 --- /dev/null +++ b/eng/common/instructions/azsdk-tools/typespec-to-sdk.instructions.md @@ -0,0 +1,94 @@ +--- +description: 'Generate SDKs from TypeSpec' +--- +Your goal is to guide the user through the process of generating SDKs from TypeSpec projects. **Before starting**, show all the high level steps to the user and ask: + +> "Would you like to begin the SDK generation process now? (yes/no)" + +Wait for the user to respond with a confirmation before proceeding. Use the provided tools to perform actions and gather information as needed. + +SDK languages to be generated: +- Management Plane: .NET, Go, Java, JavaScript, Python +- Data Plane: .NET, Java, JavaScript, Python + +Pre-requisites: +- TypeSpec project path is available in the current context or provided by user. If not available, prompt user to provide the TypeSpec project root path (local path or GitHub URL). + +# SDK generation steps + +## Step: Generate SDKs + +As a first step, you must prompt the user to understand the intention of SDK generation. Based on the user input, you can either run SDK generation locally or use SDK generation pipeline. + +Generate SDK locally in cases below: +- If the user wants to walk through each SDK generation step locally. This approach requires user to have the setup for each language to generate SDK locally. User can create a pull request for each language after completing all the steps in SDK generation successfully to get the generated SDK reviewed and merged. +- If SDK or client.tsp customizations are needed before creating a pull request. +- If the user wants to add tests, samples or any customization to the generated SDK. + +Generate SDK using pipeline: +- If the user wants to generate SDK and get a PR automatically created in Azure SDK language repositories. This approach can be followed if the user does not want to setup local environment for each language. + +### Generate SDK locally: + +**Condition**: If user chooses to generate SDK locally +**Message to user**: "Generating SDKs locally requires you to have the development environment set up for each language. Prompt the user to create a pull request for each language after completing the following steps successfully: generation, validation, build, test and update of metadata, change log, and version." +**Actions**: +Follow the steps in #file:local-sdk-workflow.instructions.md to generate and build SDKs locally from TypeSpec project. + +### Generate SDK using pipeline: + +**Condition**: If user chooses to generate the SDK using pipeline or when generating SDK by GitHub coding agent +**Message to user**: "SDK generation will take approximately 15-20 minutes. SDKs are generated using the Azure DevOps pipeline. SDK generation is supported only from a merged API spec or from an API spec pull request in the https://github.com/Azure/azure-rest-api-specs repository." +**Actions**: +1. Identify whether TypeSpec is for Management Plane or Data Plane based on project structure and files. tspconfig.yaml file contains `resource-manager` for management plane and `data-plane` for data plane as resource provider. + - Execute the SDK generation pipeline with the following required parameters for all languages: + - TypeSpec project root path + - API spec pull request number (if the API spec is not merged to the main branch, otherwise use 0) + - API version + - SDK release type (`beta` for preview API versions, `stable` otherwise) + - Language options: + For management plane: `Python`, `.NET`, `JavaScript`, `Java`, `Go` + For data plane: `Python`, `.NET`, `JavaScript`, `Java` + - Each SDK generation tool call should show a label to indicate the language being generated. +2. Monitor pipeline status after 15 minutes and provide updates. If pipeline is in progress, inform user that it may take additional time and check the status later. +3. Display generated SDK PR links when available. If pipeline fails, inform user with error details and suggest to check pipeline logs for more information. +4. If SDK pull request is available for all languages, ask user to review generated SDK pull request and mark them as ready for review when they are ready to get them reviewed and merged. +5. Inform the user that they can checkout generated SDK pull request locally and add more tests, samples or code customizations if needed using local SDK generation tools. +6. If SDK pull request was created for test purposes, inform user to close the test SDK pull request. +**Success Criteria**: SDK generation pipeline initiated and SDKs generated + +## Step: SDK release plan +**Goal**: Create a release plan for the generated SDKs +**Condition**: Only if SDK PRs are created +**Message to user**: "Creating a release plan is essential to manage the release of the generated SDKs. Each release plan must include SDKs for all required languages based on the TypeSpec project type (Management Plane or Data Plane) or request exclusion approval for any excluded language. SDK pull request needs to get approval and merged to main branch before releasing the SDK package." +**Actions**: +1. Prompt the user to check if they generated the SDK just to test or do they intend to release it: "Do you want to create a release plan for the generated SDKs to publish them? (yes/no)" + - If no, inform user: "You can create a release plan later when ready to release the SDK" and end the workflow. +2. Ask user if they have already created a release plan for the generated SDKs: "Have you already created a release plan for the generated SDKs? (yes/no)" + - If no, proceed to create a new release plan + - If yes, get release plan details and show them to user +3. Prompt the user to provide the API spec pull request link if not already available in the current context. +4. If unsure, check if a release plan already exists for API spec pull request. +5. Prompt user to find the service id and product id in service tree `aka.ms/st` and provide them. Stress the importance of correct service id and product id for proper release plan creation. +6. If a new release plan is needed, refer to #file:create-release-plan.instructions.md to create a release plan using the spec pull request. API spec pull request is required to create a release plan. +7. Prompt user to change spec PR to ready for review: "Please change the spec pull request to ready for review status" +8. Suggest users to follow the instructions on spec PR to get approval from API reviewers and merge the spec PR. +9. Link SDK pull requests to the release plan. +10. Each release plan must release SDK for all languages based on the TypeSpec project type (Management Plane or Data Plane). If any language is missing, inform user: "The release plan must include SDKs for all required languages: Python, .NET, JavaScript, Java, Go (for Management Plane) or Python, .NET, JavaScript, Java (for Data Plane)". If it is intentional to exclude a language then user must provide a justification for it. +**Success Criteria**: Release plan created and linked to SDK PRs + +## Step: Release SDK Package +**Goal**: Release the SDK package using the release plan +**Actions**: +1. Prompt the user to confirm if they want to release the SDK package now: "Do you want to release the SDK package now? (yes/no)" + - If no, inform user: "You can release the SDK package later using the prompt `release for `" and end the workflow. +2. Get SDK pull request status for all languages. +3. Inform user that it needs to check SDK PR status. If any SDK pull request is not merged, inform user: "Please merge all SDK pull requests before releasing the package.". Show a summary of SDK PR status for all languages. +4. If an SDK pull request is merged then run release readiness of the package for that language. +5. Inform user if a language is ready for release and prompt user for a confirmation to proceed with the release. +6. If user confirms, run the tool to release the SDK package. +7. Inform user to approve the package release using release pipeline. Warn user that package will be published to public registries once approved. +8. Identify remaining languages to be released and inform user to release SDK for all languages to complete the release plan. Release plan completion is required for KPI attestation in service tree. + +## Process Complete +Display summary of all created PRs and next steps for user. diff --git a/eng/common/instructions/azsdk-tools/validate-codeowners.instructions.md b/eng/common/instructions/azsdk-tools/validate-codeowners.instructions.md new file mode 100644 index 000000000000..83167f459d02 --- /dev/null +++ b/eng/common/instructions/azsdk-tools/validate-codeowners.instructions.md @@ -0,0 +1,74 @@ +--- +mode: 'agent' +tools: ['azsdk_check_service_label', 'azsdk_engsys_validate_codeowners_entry_for_service', 'azsdk_engsys_codeowner_update'] +--- + +## Goal: +Validate service label and ensure at least 2 valid code owners exist for SDK repositories. + +## Step 1: Validate Service Label +Use `azsdk_check_service_label` to verify the service label exists: +- **DoesNotExist/NotAServiceLabel**: Direct user to create valid service label first. Stop validation process until service label is created. +- **Exists/InReview**: Proceed to Step 2 + +## Step 2: Validate Code Owners +Ask user to specify SDK repository they want to validate codeowners for or detect from context. + +Repository name mapping: +- .NET/dotnet: use "azure-sdk-for-net" +- Python: use "azure-sdk-for-python" +- Java: use "azure-sdk-for-java" +- JavaScript: use "azure-sdk-for-js" +- Go: use "azure-sdk-for-go" + +Use `azsdk_engsys_validate_codeowners_entry_for_service` with either `serviceLabel` OR `repoPath` or both, but at least one must be used. If one isn't provided, leave the parameter field empty. + +**If entry exists**: Go to Step 3 +**If no entry exists**: Go to Step 4 + +## Step 3: Check Existing Code Owners +Valid code owners must be: +- PUBLIC members of Microsoft and Azure GitHub organizations +- Have write access to the SDK repository + +**If at least 2 valid owners**: Success - optionally add or delete additional owners +**If less than 2 valid owners**: CRITICAL - must fix before proceeding: + +After any changes, re-validate with `azsdk_engsys_validate_codeowners_entry_for_service`. + +## Step 4: Create New Code Owner Entry +When no CODEOWNERS entry exists yet: +1. Ensure you have the following information + - repo - **Required** - Repository name mapping: + - .NET/dotnet: use "azure-sdk-for-net" + - Python: use "azure-sdk-for-python" + - Java: use "azure-sdk-for-java" + - JavaScript: use "azure-sdk-for-js" + - Go: use "azure-sdk-for-go" + - typeSpecProjectRoot - **Optional** This should be acquired only if the information is present in the previous chat history, if not, ignore and input `""`. + - path - **Optional** only if there is a service label and we're not making a new entry - This should be acquired when creating a new code owner entry, if no information is present ask the user. Typically looks like `/sdk/projectpath` + - serviceLabel - **Optional** only if there is a path and we're not making a new entry - This should be acquired from the previous step of Check or Create Service Label. + - serviceOwners - **Optional** if no ServiceLabel is present. Can be either owners to add or delete, depending on isAdding. + - sourceOwners - **Optional** if no path or PRLabel are present. Can be either owners to add or delete, depending on isAdding. + - isAdding - **Required** Should be true if adding owners to an existing entry, false if deleting owners from an existing entry. Should also be false when adding a brand new entry. +1. Provide information to the user about what codeowners is for: + - [Learn about CODEOWNERS](https://eng.ms/docs/products/azure-developer-experience/develop/supporting-sdk-customers/overview) + - Service owners is for getting mentioned on issues. + - Source owners is for getting mentioned in PRs. +2. Collect service owners and source owners (GitHub usernames) +3. Use `azsdk_engsys_codeowner_update` with required parameters +4. Must have at least 2 valid owners from the start + +### Fix Options: +1. **Fix invalid owners** - If there are invalid owners after modifing the CODEOWNERS file ALWAYS provide guidance. + Follow instructions [here](https://aka.ms/azsdk/access) for: + - Joining Microsoft and Azure GitHub orgs + - Setting public visibility + - Requesting write access +2. **Add new owners** using `azsdk_engsys_codeowner_update` with `isAdding: true` +3. **Remove invalid + add valid** owners using `azsdk_engsys_codeowner_update` + +## Requirements +- **MINIMUM**: At least 2 valid code owners at all times +- **NO EXCEPTIONS**: Cannot proceed with insufficient owners +- **RESPONSE HANDLING**: If any exception occurs during validation or creation, ALWAYS provide documentation link [CODEOWNERS documentation](https://eng.ms/docs/products/azure-developer-experience/develop/supporting-sdk-customers/codeowners) \ No newline at end of file diff --git a/eng/common/instructions/azsdk-tools/validate-service-label.instructions.md b/eng/common/instructions/azsdk-tools/validate-service-label.instructions.md new file mode 100644 index 000000000000..95dd71e174c2 --- /dev/null +++ b/eng/common/instructions/azsdk-tools/validate-service-label.instructions.md @@ -0,0 +1,54 @@ +--- +mode: 'agent' +tools: ['azsdk_check_service_label', 'azsdk_create_service_label'] +--- + +## Goal +Validate service label exists or create new one for SDK release process. + +## Step 1: Provide Information + +Provide the following information about the importance of service labels: + +"Before your SDK is released, your service must have a valid service label in the Azure SDK repositories. Service labels enable automatic owner assignment and notifications across the Azure SDK ecosystem. + +When properly configured, service labels automatically: + +- Notify service owners when issues are filed against their SDK +- Add appropriate reviewers to pull requests +- Connect code changes to the right team members through CODEOWNERS integration + +Without a valid service label, the process to identify the correct service owners for issues and code reviews becomes manual and inefficient." + +## Step 2: Get Service Label + +Ask user for their service label. If they don't know their service label provide guidance: + +- Check out the [Common Labels CSV](https://github.com/Azure/azure-sdk-tools/blob/main/tools/github/data/common-labels.csv) file and look for a row whose first column contains your service's product name. + +If they don't have a service label - go to Step 3 for new service label + +## Step 3: Validate Label + +Use `azsdk_check_service_label` to check status: + +- **Exists**: Success - user can proceed with next steps in SDK release process +- **InReview**: Label pending approval - user can proceed (will be available once merged) +- **DoesNotExist**: Go to Step 3 to create new label +- **NotAServiceLabel**: Label exists but it is not a service label - go to Step 3 for new service label + +## Step 4: Create New Service Label + +If no valid service label exists, guide the user through creating a new one. + +1. **Check existing labels**: Search for related service labels, offer alternatives +2. **Generate recommendation**: Suggest label name following guidelines: + - Should match the service's official product name as described on Service Tree (e.g., "Event Hubs", "Kusto", "Cosmos", etc.) + - No "Microsoft/Azure" in name + - Title Case (except short prepositions) + - Avoid Service Groups: Use "Communication Rooms" instead of "Communication - Rooms" + - Single label per service +3. **Get confirmation**: User confirms or modifies suggested name +4. **Create label**: Use `azsdk_create_service_label` with confirmed name and documentation link given by user + +Inform user they can proceed. \ No newline at end of file diff --git a/eng/common/instructions/azsdk-tools/verify-namespace-approval.instructions.md b/eng/common/instructions/azsdk-tools/verify-namespace-approval.instructions.md new file mode 100644 index 000000000000..cee268de74e6 --- /dev/null +++ b/eng/common/instructions/azsdk-tools/verify-namespace-approval.instructions.md @@ -0,0 +1,22 @@ +--- +description: 'Verify SDK namespace approval for management plane' +--- +This task is required only for management plane API spec and only if a release plan exists for the API spec pull request. + +## Step 1: Check if release plan exists and it is for management plane SDK +**Goal**: Determine if a release plan exists for the API spec pull request or work item Id or release plan Id in current context. +**Actions**: +1. Get release plan and check if it is for management plane SDK +2. If not, inform user: "This task is only applicable for management plane SDKs. No action required." +3. Check if release plan already has namespace approval issue. Also prompt user to check if this is the first release of SDK. +4. If namespace approval issue exists, inform user: "Namespace approval issue already exists for this release plan.". Prompt user to +check if they want to link a different namespace approval issue to the release plan. Show namespace approval status. +5. Move to Step 2 if namespace approval issue does not exist or user wants to link a different namespace approval issue. + +## Step 2: Gather Namespace Approval Information +**Goal**: Link namespace approval issue to the release plan. +**Actions**: +1. Collect GitHub issue created in Azure/azure-sdk repo for namespace approval. Do not use any other repo name. +2. Run `azsdk_link_namespace_approval_issue` to link the issue to the release plan work item id. +3. Confirm successful linking of the namespace approval issue to the release plan. +**Success Criteria**: Namespace approval issue linked to the release plan or confirmed as already linked. diff --git a/eng/common/instructions/azsdk-tools/verify-setup.instructions.md b/eng/common/instructions/azsdk-tools/verify-setup.instructions.md new file mode 100644 index 000000000000..8fe1427083c7 --- /dev/null +++ b/eng/common/instructions/azsdk-tools/verify-setup.instructions.md @@ -0,0 +1,28 @@ +--- +description: 'Verify Setup' +--- + +## Goal +This tool verifies the developer's environment for SDK development and release tasks. It returns what requirements are missing for the specified languages and repo, or success if all requirements are satisfied. It can help install supported requirements. + +Your goal is to identify the project repo root, and pass in the `packagePath` to the Verify Setup tool. For a language repo, pass in the language of the repo. + +## Instructions +1. Check what's missing by calling verify setup with just language and package path parameters. The tool responds with missing requirements, and if any are installable by the tool itself. +2. Ask the user if they want help installing any missing requirements that the tool can install. On approval, **use the tool again WITH THE EXACT PARAMETERS (langs=, packagePath=, requirementsToInstall=["req", "req2", ...])**. + +## Examples +- in `azure-sdk-for-js`, run `azsdk_verify_setup` with `(langs=javascript, packagePath=/azure-sdk-for-js)`. +- to install, run `azsdk_verify_setup` with `(langs=javascript, packagePath=/azure-sdk-for-js), requirementsToInstall=['pnpm', 'tsp'])`. + +## Parameter Requirements +The user can specify multiple languages to check. If the user wants to check all languages, pass in ALL supported languages. Passing in no languages will only check the core requirements. + +To help the user auto-install, YOU MUST pass in the exact approved list of requirements to install in `requirementsToInstall`. **The tool will not install any requirements that are not EXPLICITLY LISTED.** DO NOT PASS IN AN AUTOINSTALL BOOLEAN. + +## Output +Display clear, step-by-step instructions on how to resolve any missing requirements identified. Explain why the requirement is necessary if it has a `reason` field. Organize requirements into categorical sections. + +Based on the user's shell environment, enhance the tool instructions with shell-specific commands for resolving missing dependencies. + +When Python tool requirements fail, inform the user about the `AZSDKTOOLS_PYTHON_VENV_PATH` environment variable if they have setup issues. The verify-setup tool can only check Python requirements within the virtual environment specified by this environment variable. \ No newline at end of file diff --git a/eng/common/instructions/copilot/sdk-release.instructions.md b/eng/common/instructions/copilot/sdk-release.instructions.md new file mode 100644 index 000000000000..e9b9f62ca53e --- /dev/null +++ b/eng/common/instructions/copilot/sdk-release.instructions.md @@ -0,0 +1,19 @@ +# SDK release + +There are two tools to help with SDK releases: +- Check SDK release readiness +- Release SDK + +## Check SDK Release Readiness +Run `CheckPackageReleaseReadiness` to verify if the package is ready for release. This tool checks: +- API review status +- Change log status +- Package name approval(If package is new and releasing a preview version) +- Release date is set in release tracker + +## Release SDK +Run `ReleasePackage` to release the package. This tool requires package name and language as inputs. It will: +- Check if the package is ready for release +- Identify the release pipeline +- Trigger the release pipeline. +User needs to approve the release stage in the pipeline after it is triggered. \ No newline at end of file diff --git a/eng/common/knowledge/customizing-client-tsp.md b/eng/common/knowledge/customizing-client-tsp.md new file mode 100644 index 000000000000..e9a4520541b1 --- /dev/null +++ b/eng/common/knowledge/customizing-client-tsp.md @@ -0,0 +1,510 @@ +# TypeSpec Client Customizations Reference + +## Quick Setup + +### 1. Project Structure + +``` +project/ +├── main.tsp # Your service definition +├── client.tsp # Client customizations +└── tspconfig.yaml # Compiler configuration +``` + +### 2. Basic client.tsp Template + +```typespec +import "./main.tsp"; +import "@azure-tools/typespec-client-generator-core"; + +using Azure.ClientGenerator.Core; + +// Your customizations here +``` + +## Client Customizations Namespace + +`client.tsp` should have a file-level namespace if types (e.g. models, interfaces, operations, etc) are defined in `client.tsp`. +Do not add a file-level namespace if one already exists. They are only required when types are defined in `client.tsp`. + +```typespec +import "./main.tsp"; +import "@azure-tools/typespec-client-generator-core"; + +using Azure.ClientGenerator.Core; + +namespace ClientCustomizations; + +// Your customizations here +``` + +## Universal Scope Parameter + +**IMPORTANT**: All Azure.ClientGenerator.Core decorators support an optional `scope` parameter as their final parameter to target specific language emitters. + +### Scope Syntax + +```typespec +@decoratorName(/* decorator-specific params */, scope?: string) +``` + +### Scope Patterns + +#### Target Specific Languages + +```typespec +// Single language +@@clientName(Foo, "Bar", "python") +@@access(Foo.get, Access.internal, "csharp") + +// Multiple languages (comma-separated) +@@clientName(Foo, "Bar", "python, javascript") +``` + +#### Exclude Languages (Negation) + +```typespec +// Exclude one language +@@clientName(Foo, "Bar", "!csharp") // All languages EXCEPT C# + +// Exclude multiple languages +@@clientName(Foo, "Bar", "!python, !go") // All languages EXCEPT python and go +``` + +#### Language Identifiers + +- `"csharp"` - C#/.NET +- `"python"` - Python +- `"java"` - Java +- `"javascript"` - TypeScript/JavaScript +- `"go"` - Go +- `"rust"` - Rust + +### Scope Best Practices + +#### DO: Use negation for single language exclusions + +```typespec +// Good: Exclude only C# +@@clientName(get, "getFoo", "!csharp") + +// Bad: List all other languages +@@clientName(get, "getFoo", "python, java, javascript, go") +``` + +#### DO: Combine scopes when logic is identical + +```typespec +// Good: Same customization for multiple languages +@@clientName(name, "sharedName", "python, go") + +// Avoid: Duplicate decorators +@@clientName(name, "sharedName", "python") +@@clientName(name, "sharedName", "go") +``` + +#### DON'T: Overuse scopes without clear need + +```typespec +// Bad: Unnecessary scope for universal customization +@@clientName(MyService, "MyClient", "csharp, python, java, javascript, go") + +// Good: No scope means all languages +@@clientName(MyService, "MyClient") +``` + +## Core Decorators + +### @access + +**Purpose**: Control visibility of types and operations in generated clients. +**Syntax**: `@access(value: Access.public | Access.internal, scope?: string)` +**Usage**: + +```typespec +// Hide internal operations +@@access(getFoo, Access.internal) + +// Make models referenced by internal operations public +@@access(Foo, Access.public) + +// Language-specific access +@@access(getFoo, Access.internal, "csharp") +``` + +**Propagation Rules**: + +- Operations marked `Access.internal` make their models internal +- Operations marked `Access.public` make their models public +- Namespace access propagates to contained types +- Model access propagates to properties and inheritance hierarchy + +### @client + +**Purpose**: Define root clients in the SDK. +**Restrictions**: Cannot be used with `@clientLocation` decorator. Cannot be used as an augmentation (`@@`) decorator. +**Important**: `@client` has to be used on a type defined in `client.tsp`, so a file-level namespace (e.g. `namespace ClientCustomizations;`) should be added if one does not exist. +**Syntax**: `@client(options: ClientOptions, scope?: string)` +**Usage**: + +```typespec +// Basic client +@client({ service: MyService }) +interface MyClient {} + +// Named client +@client({ service: MyService, name: "CustomClient" }) +interface MyClient {} + +// Split operations into multiple clients +@client({ service: PetStore, name: "FoodClient" }) +interface FoodClient { + feed is PetStore.feed; +} + +@client({ service: PetStore, name: "PetClient" }) +interface PetClient { + pet is PetStore.pet; +} +``` + +### @operationGroup + +**Purpose**: Define sub-clients (operation groups). +**Restrictions**: Cannot be used with `@clientLocation` decorator. Cannot be used as an augmentation (`@@`) decorator. +**Important**: `@operationGroup` has to be used on a type defined in `client.tsp`, so a file-level namespace (e.g. `namespace ClientCustomizations;`) should be added if one does not exist. +**Syntax**: `@operationGroup(scope?: string)` +**Usage**: + +```typespec +@client({ service: MyService }) +namespace MyClient; + +@operationGroup +interface Pets { + list is MyService.listPets; + get is MyService.getPet; +} + +@operationGroup +interface Users { + list is MyService.listUsers; + create is MyService.createUser; +} +``` + +### @clientLocation + +**Purpose**: Move operations between clients without restructuring. +**Restrictions**: Cannot be used with `@client` or `@operationGroup` decorators. +**Syntax**: `@clientLocation(target: Interface | Namespace | string, scope?: string)` +**Usage**: + +```typespec +// Move to existing client +@@clientLocation(MyService.upload, AdminOperations); + +// Move to new client +@@clientLocation(MyService.archive, "ArchiveClient"); + +// Move to root client +@@clientLocation(MyService.SubClient.health, MyService); + +// Move parameter to client initialization +@@clientLocation(MyService.upload.subscriptionId, MyService); +``` + +### @clientName + +**Purpose**: Override generated names for SDK elements. Takes precedence over all other naming mechanisms. +**Important**: Always use PascalCase or camelCase for the rename parameter to make it easier to combine language scopes. SDKs will apply language-specific naming conventions automatically. +**Syntax**: `@clientName(rename: string, scope?: string)` +**Usage**: + +```typespec +// Rename Type +@@clientName(PetStore, "PetStoreClient"); + +// Language-specific names +@@clientName(foo, "pythonicFoo", "python") +@@clientName(foo, "CSharpFoo", "csharp") +``` + +### @clientNamespace + +**Purpose**: Change the namespace/package of generated types in the client SDK. +**Syntax**: `@clientNamespace(rename: string, scope?: string)` +**Usage**: + +```typespec +// Change client namespace +@@clientNamespace(MyService, "MyClient"); + +// Move model to different namespace +@@clientNamespace(MyService.MyModel, "MyClient.Models") +``` + +### @clientInitialization + +**Purpose**: Add custom parameters to client initialization. +**Important**: When `@clientInitialization` references a model defined in `client.tsp`, add a file-level namespace (e.g. `namespace ClientCustomizations;`) if one does not exist. +**Syntax**: `@clientInitialization(options: ClientInitializationOptions, scope?: string)` +**Usage**: + +```typespec +// Add initialization parameters +model MyClientOptions { + connectionString: string; +} + +@@clientInitialization(MyService, { parameters: MyClientOptions }); + +// With parameter aliasing +model MyClientOptions { + @paramAlias("subscriptionId") + subId: string; +} + +@@clientInitialization(MyService, { parameters: MyClientOptions }); +``` + +### @alternateType + +**Purpose**: Replace types in generated clients. +**Syntax**: `@alternateType(alternate: Type | ExternalType, scope?: string)` +**Usage**: + +```typespec +// Change property type +@@alternateType(Foo.date, string); + +// Language-specific alternates +@@alternateType(Foo.date, string, "python") + +// External type replacement +@@alternateType(uri, { + identity: "System.Uri", + package: "System", +}, "csharp") +``` + +### @override + +**Purpose**: Customize method signatures in generated clients. +**Restrictions**: Only operation parameter signatures can be customized. +**Important**: When `@override` references an operation defined in `client.tsp`, a file-level namespace (e.g. `namespace ClientCustomizations;`) should be added if one does not exist. +**Syntax**: `@override(override: Operation, scope?: string)` + +**Usage**: + +```typespec +// main.tsp +// Original operation +op myOperation(foo: string, bar: string): void; + +// client.tsp +// Custom signature - combine into options +model MyOperationOptions { + foo: string; + bar: string; +} + +op myOperationCustom(options: MyOperationOptions): void; + +@@override(myOperation, myOperationCustom); +``` + +### @scope + +**Purpose**: Include/exclude operations from specific languages. +**Usage**: + +```typespec +@@scope(Foo.create, "!csharp") // All languages except C# + +@@scope(Foo.create, "python") // Python only + +@@scope(Foo.create, "java, go") // Java and Go only +``` + +### @usage + +**Purpose**: Add usage information to models and enums. +**Note**: The usages provided are _additive_. +**Usage**: + +```typespec +// Add input and output usage to type +@@usage(MyModel, Usage.input | Usage.output) +``` + +**Usage Values**: + +- `Usage.input`: Used in request +- `Usage.output`: Used in response +- `Usage.json`: Used with JSON content type +- `Usage.xml`: Used with XML content type + +### @clientDoc + +**Purpose**: Override documentation for client libraries. +**Usage**: + +```typespec +// Replace type documentation with client documentation +@@clientDoc(myOperation, "Client-specific documentation", DocumentationMode.replace) + +// Append type documentation with client documentation - for only python +@@clientDoc(myModel, "Additional client notes", DocumentationMode.append, "python") +``` + +## Language-specific Customizations + +### @useSystemTextJsonConverter (C# only) + +**Purpose**: Use custom JSON converter for backward compatibility. +**Usage**: + +```typespec +@@useSystemTextJsonConverter(MyModel, "csharp") +``` + +## Best Practices + +### Do's + +- Use `client.tsp` for all customizations +- Use scope parameter for language-specific customizations +- Prefer scope negation (`"!csharp"`) when excluding single languages +- Combine scopes (`"python, java"`) when logic is identical across languages +- Use a file-level namespace (e.g. `namespace ClientCustomizations;`) in `client.tsp` if any types are defined in `client.tsp`. + +### Don'ts + +- Mix `@clientLocation` with `@client`/`@operationGroup` +- Over-customize - prefer defaults when possible +- Use legacy decorators for new services +- Rename without considering the impact on breaking changes +- Forget to specify scope for language-specific customizations + +## Common Scenarios + +### Scenario 1: Move Operations to Root Client + +```typespec +// Before: Operations in interfaces become sub-clients +interface Pets { feed(): void; } +interface Users { login(): void; } + +// After: All operations on root client +@@clientLocation(Pets.feed, MyService); +@@clientLocation(Users.login, MyService); +``` + +### Scenario 2: Rename for Consistency + +```typespec +// Standardize naming across languages +@@clientName(MyService, "MyServiceClient"); +@@clientName(getUserInfo, "GetUserInformation"); + +// Language-specific naming +@@clientName(uploadFile, "UploadFile", "csharp, python"); +``` + +### Scenario 3: Add Client Parameters + +```typespec +// Elevate common parameters to client +model MyServiceOptions { + subscriptionId: string; + resourceGroup: string; +} + +@@clientInitialization(MyService, { parameters: MyServiceOptions }); +``` + +### Scenario 4: Multi-Client Architecture + +```typespec +// Separate admin and user operations +@client({ service: MyService, name: "AdminClient" }) +interface AdminClient { + deleteUser is MyService.deleteUser; + manageRoles is MyService.manageRoles; +} + +@client({ service: MyService, name: "UserClient" }) +interface UserClient { + getProfile is MyService.getProfile; + updateProfile is MyService.updateProfile; +} +``` + +### Scenario 5: Language-specific clients + +```typespec +// Different client names for Java and others +@client({ service: MyService, name: "Foo.MyServiceClient" }, "java") +@client({ service: MyService, name: "MyServiceClient" }, "!java") +interface MyServiceClient { + getAllData is MyService.getAllData; +} + +// Different clients for python and Go +@client({ service: MyService, name: "MyClient" }, "python") +interface MyClientPython { + fetchData is MyService.fetchData; +} +@client({ service: MyService, name: "MyClient" }, "go") +interface MyClientGo { + fetchStream is MyService.fetchStream; +} +``` + +### Scenario 6: Rename custom client operations + +```typespec +// Create a client with operation names changed +@client({ service: MyService, name: "MyClient" }) +interface MyClient { + getFoo is MyService.getFooData; +} +``` + +This reference provides the essential patterns and decorators for TypeSpec client customizations. Focus on the core decorators (`@client`, `@operationGroup`, `@@clientLocation`, `@@clientName`, `@@access`) for most scenarios, and use advanced features selectively. +--- + +## When TypeSpec Isn't Enough: Code Customizations + +TypeSpec customizations (`client.tsp`) should be your **first choice** for SDK customization - they're clean, documented, and survive regeneration. + +For scenarios that TypeSpec cannot express, each language has its own post-generation code customization approach. Refer to the language-specific documentation below. + +### Language-Specific Code Customization Guides + +When you need post-generation customizations, refer to the language-specific documentation: + +| Language | Documentation | Pattern | +|----------|--------------|---------| +| **C#** | [C# Customization Guide](https://github.com/microsoft/typespec/blob/main/packages/http-client-csharp/.tspd/docs/customization.md) | Partial classes with `[CodeGenType]`, `[CodeGenMember]`, `[CodeGenSerialization]` attributes | +| **Python** | [Python Customization Guide](https://github.com/Azure/autorest.python/blob/main/docs/customizations.md) | `_patch.py` files at models, operations, and client levels | +| **Java** | [Java Customization Guide](https://github.com/Azure/autorest.java/blob/main/customization-base/README.md) | `Customization` class with `customizeAst()` method | +| **JavaScript** | [JS Customization Guide](https://github.com/Azure/azure-sdk-for-js/wiki/Modular-(DPG)-Customization-Guide) | Copy `src/` to `generated/`, add customizations in `src/` | +| **Go** | [Go Customization Guide](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/development/generate.md) | Prefer TypeSpec; use custom wrapper files for advanced cases | + +### Decision Flow + +``` +Need to customize SDK? + │ + ▼ + Can it be done in TypeSpec? + │ + ┌────┴────┐ + Yes No + │ │ + ▼ ▼ +Use client.tsp Use code customization +decorators (see language guide above) +``` \ No newline at end of file diff --git a/eng/common/mcp/azure-sdk-mcp.ps1 b/eng/common/mcp/azure-sdk-mcp.ps1 index 331155516005..6a3c23ee6eaf 100755 --- a/eng/common/mcp/azure-sdk-mcp.ps1 +++ b/eng/common/mcp/azure-sdk-mcp.ps1 @@ -20,6 +20,54 @@ $ErrorActionPreference = "Stop" $toolInstallDirectory = $InstallDirectory ? $InstallDirectory : (Get-CommonInstallDirectory) +$mcpMode = $Run + +# Log to console or MCP client json-rpc +function log([object]$message, [switch]$warn, [switch]$err) { + [string]$messageString = $message + + # Assume we are in an MCP client context when `-Run` is specified + # otherwise print to console normally + if (!$mcpMode) { + if ($err) { + Write-Error $messageString -ErrorAction Continue + } + elseif ($warn) { + Write-Warning $messageString + } + else { + Write-Host $messageString + } + return; + } + + $level = switch ($message) { + { $_ -is [System.Management.Automation.ErrorRecord] } { 'error' } + { $_ -is [System.Management.Automation.WarningRecord] } { 'warning' } + default { 'notice' } + } + + # If message stringifies as a valid error message we want to print it + # otherwise print stack for calls to external binaries + if ($messageString -eq 'System.Management.Automation.RemoteException') { + $messageString = $message.ScriptStackTrace + } + + # Log json-rpc messages so the MCP client doesn't print + # '[warning] Failed to parse message:' + $messageObject = @{ + jsonrpc = "2.0" + method = "notifications/message" + params = @{ + level = $level + logger = "installer" + data = $messageString + } + } + + Write-Host ($messageObject | ConvertTo-Json -Depth 100 -Compress) +} + if ($UpdateVsCodeConfig) { $vscodeConfigPath = Join-Path $PSScriptRoot ".." ".." ".." ".vscode" "mcp.json" if (Test-Path $vscodeConfigPath) { @@ -45,7 +93,7 @@ if ($UpdateVsCodeConfig) { } } $vscodeConfig.servers = $orderedServers - Write-Host "Updating vscode mcp config at $vscodeConfigPath" + log "Updating vscode mcp config at $vscodeConfigPath" $vscodeConfig | ConvertTo-Json -Depth 10 | Set-Content -Path $vscodeConfigPath -Force } @@ -54,26 +102,76 @@ if ($UpdateVsCodeConfig) { $tmp = $env:TEMP ? $env:TEMP : [System.IO.Path]::GetTempPath() $guid = [System.Guid]::NewGuid() $tempInstallDirectory = Join-Path $tmp "azsdk-install-$($guid)" -$tempExe = Install-Standalone-Tool ` - -Version $Version ` - -FileName $FileName ` - -Package $Package ` - -Directory $tempInstallDirectory ` - -Repository $Repository + +if ($mcpMode) { + try { + # Swallow all output and re-log so we can wrap any + # output from the inner function as json-rpc + $tempExe = Install-Standalone-Tool ` + -Version $Version ` + -FileName $FileName ` + -Package $Package ` + -Directory $tempInstallDirectory ` + -Repository $Repository ` + *>&1 + | Tee-Object -Variable _ + | ForEach-Object { log $_; $_ } + | Select-Object -Last 1 + } + catch { + log -err $_ + exit 1 + } +} +else { + $tempExe = Install-Standalone-Tool ` + -Version $Version ` + -FileName $FileName ` + -Package $Package ` + -Directory $tempInstallDirectory ` + -Repository $Repository ` + +} if (-not (Test-Path $toolInstallDirectory)) { New-Item -ItemType Directory -Path $toolInstallDirectory -Force | Out-Null } $exeName = Split-Path $tempExe -Leaf $exeDestination = Join-Path $toolInstallDirectory $exeName -Copy-Item -Path $tempExe -Destination $exeDestination -Force -Write-Host "Package $package is installed at $exeDestination" +# Try to copy the new version +$updateSucceeded = $false +try { + Copy-Item -Path $tempExe -Destination $exeDestination -Force + $updateSucceeded = $true +} +catch { + if ($Run -and (Test-Path $exeDestination)) { + # In MCP mode and the executable exists, warn and fall back to the existing installed version + log -warn "Could not update '$exeDestination': $($_.Exception.Message)" + log -warn "Falling back to the currently installed version." + } + else { + # In update-only mode or the executable does not exist, exit with error + log -err "Could not install or update '$exeDestination': $($_.Exception.Message)" + exit 1 + } +} + +# Clean up temp directory +if (Test-Path $tempInstallDirectory) { + Remove-Item -Path $tempInstallDirectory -Recurse -Force -ErrorAction SilentlyContinue +} + +if ($updateSucceeded) { + log "Executable $package is installed at $exeDestination" +} if (!$UpdatePathInProfile) { - Write-Warning "To add the tool to PATH for new shell sessions, re-run with -UpdatePathInProfile to modify the shell profile file." -} else { + log -warn "To add the tool to PATH for new shell sessions, re-run with -UpdatePathInProfile to modify the shell profile file." +} +else { Add-InstallDirectoryToPathInProfile -InstallDirectory $toolInstallDirectory - Write-Warning "'$exeName' will be available in PATH for new shell sessions." + log -warn "'$exeName' will be available in PATH for new shell sessions." } if ($Run) { diff --git a/eng/common/pipelines/ai-evals-tests.yml b/eng/common/pipelines/ai-evals-tests.yml new file mode 100644 index 000000000000..43a7ae5926d6 --- /dev/null +++ b/eng/common/pipelines/ai-evals-tests.yml @@ -0,0 +1,48 @@ +trigger: + branches: + include: + - main + paths: + include: + - .github/copilot-instructions.md + - eng/common/instructions/azsdk-tools/** + +pr: none + +parameters: + - name: EvalProject + type: string + default: 'tools/azsdk-cli/Azure.Sdk.Tools.Cli.Evaluations' + - name: OpenAIEndPoint + type: string + default: 'https://openai-shared.openai.azure.com/' + - name: Model + type: string + default: 'gpt-5' + - name: EvalRepoOwner + type: string + default: 'Azure' + - name: EvalRepoName + type: string + default: 'azure-sdk-tools' + - name: EvalRepoCommit + type: string + default: 'main' + +variables: + TargetRepoOwner: ${{ split(variables['Build.Repository.Name'], '/')[0] }} + TargetRepoName: ${{ split(variables['Build.Repository.Name'], '/')[1] }} + TargetRepoCommit: ${{ variables['Build.SourceVersion'] }} + +extends: + template: /eng/common/pipelines/templates/jobs/ai-eval-job.yml + parameters: + EvalProject: ${{ parameters.EvalProject }} + OpenAIEndPoint: ${{ parameters.OpenAIEndPoint }} + Model: ${{ parameters.Model }} + EvalRepoOwner: ${{ parameters.EvalRepoOwner }} + EvalRepoName: ${{ parameters.EvalRepoName }} + EvalRepoCommit: ${{ parameters.EvalRepoCommit }} + TargetRepoOwner: $(TargetRepoOwner) + TargetRepoName: $(TargetRepoName) + TargetRepoCommit: $(TargetRepoCommit) diff --git a/eng/common/pipelines/codeowners-linter.yml b/eng/common/pipelines/codeowners-linter.yml index a77bcf8ff0bf..b676a4d17a06 100644 --- a/eng/common/pipelines/codeowners-linter.yml +++ b/eng/common/pipelines/codeowners-linter.yml @@ -1,6 +1,5 @@ # Lint the CODEOWNERS file for a given repository and filter out baseline errors -# Note: Due to the nature of the verifications, which includes source paths/globs -# for the repository, this pipeline cannot use sparse-checkout. +# Uses partial clone (fetchFilter: tree:0) to avoid downloading full git history while allowing branch operations trigger: none pr: @@ -39,6 +38,10 @@ stages: UserOrgUri: "https://azuresdkartifacts.blob.core.windows.net/azure-sdk-write-teams/user-org-visibility-blob" steps: + - checkout: self + fetchFilter: tree:0 + fetchTags: false + - pwsh: | dotnet tool install --global --add-source "$(DotNetDevOpsFeed)" --version "$(CodeownersLinterVersion)" "Azure.Sdk.Tools.CodeownersLinter" displayName: Install CodeownersLinter diff --git a/eng/common/pipelines/templates/archetype-typespec-emitter.yml b/eng/common/pipelines/templates/archetype-typespec-emitter.yml index c359c3b1ae12..443ac86a9f21 100644 --- a/eng/common/pipelines/templates/archetype-typespec-emitter.yml +++ b/eng/common/pipelines/templates/archetype-typespec-emitter.yml @@ -137,17 +137,56 @@ extends: $sourceBranch = '$(Build.SourceBranch)' $buildReason = '$(Build.Reason)' $buildNumber = '$(Build.BuildNumber)' + $emitterPackagePath = '${{ parameters.EmitterPackagePath }}' + + # Create emitter identifier from package path for disambiguation + $emitterIdentifier = "" + if (-not [string]::IsNullOrWhiteSpace($emitterPackagePath)) { + # Resolve emitterPackagePath to absolute path (it's relative to repo root) + # EmitterPackagePath is a directory, so append package.json + $absoluteEmitterPackagePath = Join-Path '$(Build.SourcesDirectory)' $emitterPackagePath + $packageJsonPath = Join-Path $absoluteEmitterPackagePath 'package.json' + + # Read the package name from package.json + if (Test-Path $packageJsonPath) { + try { + $packageJson = Get-Content $packageJsonPath -Raw | ConvertFrom-Json + if ($packageJson.name) { + $emitterIdentifier = $packageJson.name + } + } catch { + Write-Host "Warning: Could not read package name from $packageJsonPath" + } + } + + # If we still don't have an identifier, fall back to filename + if ([string]::IsNullOrWhiteSpace($emitterIdentifier)) { + Write-Host "Warning: Could not read emitter name from package.json, falling back to package path" + $emitterIdentifier = [System.IO.Path]::GetFileNameWithoutExtension($emitterPackagePath) + } + + # Clean up the identifier: remove @ prefix, replace invalid chars + $emitterIdentifier = $emitterIdentifier -replace '^@', '' + $emitterIdentifier = $emitterIdentifier -replace '[^a-zA-Z0-9\-_/]', '-' + $emitterIdentifier = $emitterIdentifier.Trim('-').ToLower() + + if (-not [string]::IsNullOrWhiteSpace($emitterIdentifier)) { + $emitterIdentifier = "-$emitterIdentifier" + } + } if ($buildReason -eq 'Schedule') { - $branchName = 'validate-typespec-scheduled' + $branchName = "validate-typespec-scheduled$emitterIdentifier" } elseif ($sourceBranch -match "^refs/pull/(\d+)/(head|merge)$") { - $branchName = "validate-typespec-pr-$($Matches[1])" + $branchName = "validate-typespec-pr-$($Matches[1])$emitterIdentifier" } else { - $branchName = "validate-typespec-$buildNumber" + $branchName = "validate-typespec-$buildNumber$emitterIdentifier" } Write-Host "Setting variable 'branchName' to '$branchName'" Write-Host "##vso[task.setvariable variable=branchName;isOutput=true]$branchName" + Write-Host "Setting variable 'emitterIdentifier' to '$emitterIdentifier'" + Write-Host "##vso[task.setvariable variable=emitterIdentifier;isOutput=true]$emitterIdentifier" displayName: Set branch name name: set_branch_name @@ -259,27 +298,34 @@ extends: displayName: Download pipeline artifacts - pwsh: | - npm install -g @azure-tools/typespec-client-generator-cli@latest + npm ci displayName: Install tsp-client + workingDirectory: $(Build.SourcesDirectory)/eng/common/tsp-client - pwsh: | + # Resolve EmitterPackageJsonOutputPath to absolute path if it's relative + $emitterPath = '${{ parameters.EmitterPackageJsonOutputPath }}' + if (-not [System.IO.Path]::IsPathRooted($emitterPath)) { + $emitterPath = Join-Path '$(Build.SourcesDirectory)' $emitterPath + } + Write-Host "Overrides location: $(buildArtifactsPath)/packages/overrides.json" + Write-Host "Resolved emitter package path: $emitterPath" if (Test-Path -Path '$(buildArtifactsPath)/packages/overrides.json') { Write-Host "Using overrides.json to generate emitter-package.json" - tsp-client generate-config-files ` - --package-json '$(buildArtifactsPath)/lock-files/package.json' ` - --emitter-package-json-path '${{ parameters.EmitterPackageJsonOutputPath }}' ` - --overrides '$(buildArtifactsPath)/packages/overrides.json' + npm exec --no -- tsp-client generate-config-files ` + --package-json '$(buildArtifactsPath)/lock-files/package.json' ` + --emitter-package-json-path "$emitterPath" ` + --overrides '$(buildArtifactsPath)/packages/overrides.json' } else { Write-Host "No overrides.json found. Running tsp-client without overrides." - - tsp-client generate-config-files ` - --package-json '$(buildArtifactsPath)/lock-files/package.json' ` - --emitter-package-json-path '${{ parameters.EmitterPackageJsonOutputPath }}' + npm exec --no -- tsp-client generate-config-files ` + --package-json '$(buildArtifactsPath)/lock-files/package.json' ` + --emitter-package-json-path "$emitterPath" } displayName: Generate emitter-package.json and emitter-package-lock files - workingDirectory: $(Build.SourcesDirectory) + workingDirectory: $(Build.SourcesDirectory)/eng/common/tsp-client - ${{ parameters.InitializationSteps }} @@ -361,15 +407,18 @@ extends: displayName: Create PR dependsOn: - Generate + condition: succeededOrFailed() variables: generateJobResult: $[dependencies.Generate.result] emitterVersion: $[stageDependencies.Build.Build.outputs['initialize.emitterVersion']] + emitterIdentifier: $[stageDependencies.Build.Build.outputs['set_branch_name.emitterIdentifier']] steps: - template: /eng/common/pipelines/templates/steps/sparse-checkout.yml - pwsh: | $generateJobResult = '$(generateJobResult)' $emitterVersion = '$(emitterVersion)' + $emitterIdentifier = '$(emitterIdentifier)' $collectionUri = '$(System.CollectionUri)' $project = '$(System.TeamProject)' $definitionName = '$(Build.DefinitionName)' @@ -381,6 +430,12 @@ extends: $buildNumber = '$(Build.BuildNumber)' $preRelease = '${{ parameters.BuildPrereleaseVersion }}' -eq 'true' + # Use emitterIdentifier for PR title (remove leading dash if present) + $emitterName = "TypeSpec emitter" + if (-not [string]::IsNullOrWhiteSpace($emitterIdentifier)) { + $emitterName = $emitterIdentifier.TrimStart('-') + } + $prBody = "Generated by $definitionName build [$buildNumber]($collectionUri/$project/_build/results?buildId=$buildId)
" if ($sourceBranch -match "^refs/heads/(.+)$") { @@ -397,9 +452,9 @@ extends: $prTitle = "Scheduled code regeneration test" } else { if ($preRelease) { - $prTitle = "Update TypeSpec emitter version to prerelease $emitterVersion" + $prTitle = "Update $emitterName version to prerelease $emitterVersion" } else { - $prTitle = "Update TypeSpec emitter version to $emitterVersion" + $prTitle = "Update $emitterName version to $emitterVersion" } if ($generateJobResult -ne 'Succeeded') { @@ -424,7 +479,8 @@ extends: Write-Error "Build.Repository.Name not in the expected {Owner}/{Name} format" } - $openAsDraft = -not ($reason -eq 'IndividualCI' -and $sourceBranch -eq 'refs/heads/main') + # Open PR as draft if generation failed, or if it's not an IndividualCI build from main + $openAsDraft = ($generateJobResult -ne 'Succeeded') -or (-not ($reason -eq 'IndividualCI' -and $sourceBranch -eq 'refs/heads/main')) Write-Host "Setting OpenAsDraftBool = $openAsDraft" Write-Host "##vso[task.setvariable variable=OpenAsDraft]$openAsDraft" if ($openAsDraft) { diff --git a/eng/common/pipelines/templates/jobs/ai-eval-job.yml b/eng/common/pipelines/templates/jobs/ai-eval-job.yml new file mode 100644 index 000000000000..b6e4ceeb7d1e --- /dev/null +++ b/eng/common/pipelines/templates/jobs/ai-eval-job.yml @@ -0,0 +1,100 @@ +parameters: + - name: EvalProject + type: string + default: 'tools/azsdk-cli/Azure.Sdk.Tools.Cli.Evaluations' + - name: OpenAIEndPoint + type: string + default: 'https://openai-shared.openai.azure.com/' + - name: Model + type: string + default: 'gpt-5' +# Repository where evals are located + - name: EvalRepoOwner + type: string + default: 'Azure' + - name: EvalRepoName + type: string + default: 'azure-sdk-tools' + - name: EvalRepoCommit + type: string + default: 'main' +# Target repository for copilot instructions + - name: TargetRepoOwner + type: string + - name: TargetRepoName + type: string + - name: TargetRepoCommit + type: string + +jobs: + - job: Run_Eval + variables: + - template: /eng/pipelines/templates/variables/globals.yml + - template: /eng/pipelines/templates/variables/image.yml + displayName: 'Run AI Eval' + pool: + name: $(LINUXPOOL) + image: $(LINUXVMIMAGE) + os: linux + + steps: + - checkout: none + - task: UseDotNet@2 + displayName: "Use .NET SDK 9.0.x" + retryCountOnTaskFailure: 3 + inputs: + packageType: sdk + version: 9.0.x + performMultiLevelLookup: true + + - task: UseDotNet@2 + displayName: "Use .NET SDK 8.0.x" + retryCountOnTaskFailure: 3 + inputs: + packageType: sdk + version: 8.0.x + performMultiLevelLookup: true + + - template: /eng/common/pipelines/templates/steps/sparse-checkout.yml + parameters: + SkipCheckoutNone: true + Repositories: + - Name: ${{ parameters.EvalRepoOwner }}/${{ parameters.EvalRepoName }} + Commitish: ${{ parameters.EvalRepoCommit }} + WorkingDirectory: $(System.DefaultWorkingDirectory)/${{ parameters.EvalRepoName }} + - Name: ${{ parameters.TargetRepoOwner }}/${{ parameters.TargetRepoName }} + Commitish: ${{ parameters.TargetRepoCommit }} + WorkingDirectory: $(System.DefaultWorkingDirectory)/${{ parameters.TargetRepoName }} + Paths: + - 'tools/**' + - 'eng/common/**' + - '.github/**' + + - task: AzureCLI@2 + displayName: 'Run eval' + condition: and(succeeded(), ne(variables['Skip.Eval'], 'true')) + inputs: + azureSubscription: opensource-api-connection + scriptType: 'bash' + scriptLocation: 'inlineScript' + workingDirectory: '$(System.DefaultWorkingDirectory)/${{ parameters.EvalRepoName }}/${{ parameters.EvalProject }}' + inlineScript: | + echo "Logged in to Azure" + echo "Running eval" + dotnet test --logger trx + env: + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1 + DOTNET_CLI_TELEMETRY_OPTOUT: 1 + DOTNET_MULTILEVEL_LOOKUP: 0 + AZURE_OPENAI_MODEL_DEPLOYMENT_NAME: ${{ parameters.Model }} + AZURE_OPENAI_ENDPOINT: ${{ parameters.OpenAIEndPoint }} + REPOSITORY_NAME: ${{ parameters.TargetRepoName }} + COPILOT_INSTRUCTIONS_PATH_MCP_EVALS: $(System.DefaultWorkingDirectory)/${{ parameters.TargetRepoName }}/.github/copilot-instructions.md + + - task: PublishTestResults@2 + condition: succeededOrFailed() + inputs: + testResultsFiles: '**/*.trx' + testRunTitle: $(System.JobDisplayName) + testResultsFormat: 'VSTest' + mergeTestResults: true diff --git a/eng/common/pipelines/templates/jobs/perf.yml b/eng/common/pipelines/templates/jobs/perf.yml index 67c4accf3800..2257d783041d 100644 --- a/eng/common/pipelines/templates/jobs/perf.yml +++ b/eng/common/pipelines/templates/jobs/perf.yml @@ -105,9 +105,16 @@ jobs: - Name: ${{ parameters.LanguageRepoName }} Commitish: ${{ parameters.LanguageRepoCommitish }} WorkingDirectory: $(System.DefaultWorkingDirectory) + + - template: /eng/common/pipelines/templates/steps/sparse-checkout.yml + parameters: + Paths: + - 'tools/perf-automation/Azure.Sdk.Tools.PerfAutomation' + Repositories: - Name: Azure/azure-sdk-tools Commitish: ${{ parameters.ToolsRepoCommitish }} WorkingDirectory: $(System.DefaultWorkingDirectory)/azure-sdk-tools + SkipCheckoutNone: true - template: /eng/common/pipelines/templates/steps/verify-agent-os.yml parameters: @@ -208,7 +215,7 @@ jobs: inputs: targetPath: $(System.DefaultWorkingDirectory)/${{ parameters.Language }}-profile.zip artifactName: ${{ parameters.Language }}-profile.zip - condition: ${{ parameters.Profile }} + condition: and(succeeded(), ${{ parameters.Profile }}) - template: /eng/common/TestResources/remove-test-resources.yml parameters: diff --git a/eng/common/pipelines/templates/jobs/prepare-pipelines.yml b/eng/common/pipelines/templates/jobs/prepare-pipelines.yml index 0e54b11a1e87..906a9bfcf1fe 100644 --- a/eng/common/pipelines/templates/jobs/prepare-pipelines.yml +++ b/eng/common/pipelines/templates/jobs/prepare-pipelines.yml @@ -82,7 +82,7 @@ jobs: $generateUnifiedWeekly = 'false' $testServiceConnections = '"Azure" "azure-sdk-tests" "azure-sdk-tests-preview" "azure-sdk-tests-public" "Azure SDK Test Resources - LiveTestSecrets"' - $internalServiceConnections = '"Azure" "Azure SDK Artifacts" "Azure SDK Engineering System" "opensource-api-connection" "AzureSDKEngKeyVault Secrets" "Azure SDK PME Managed Identity"' + $internalServiceConnections = '"Azure" "Azure SDK Artifacts" "Azure SDK Engineering System" "opensource-api-connection" "AzureSDKEngKeyVault Secrets" "Azure SDK PME Managed Identity" "APIView prod deployment"' # Map the language to the appropriate variable groups switch ($lang) diff --git a/eng/common/pipelines/templates/steps/check-spelling.yml b/eng/common/pipelines/templates/steps/check-spelling.yml index 8d7a716cbdfc..d5bfff5ea2d4 100644 --- a/eng/common/pipelines/templates/steps/check-spelling.yml +++ b/eng/common/pipelines/templates/steps/check-spelling.yml @@ -2,16 +2,28 @@ # and some ref (branch, tag, etc.) or commit hash. Only runs on PRs. # ContinueOnError - true: Pipeline warns on spelling error # false: Pipeline fails on spelling error -# TargetBranch - Target ref (e.g. main) to compare to create file change -# list. # CspellConfigPath - Path to cspell.json config location # +# ScriptToValidateUpgrade - Optional script to validate cspell upgrade. This +# is invoked only if package-lock.json for cspell is +# changed. This script should exit with a nonzero exit +# code if the upgrade is invalid. Upgrade check should +# check for errors which would prevent release (i.e. +# public API surface). +# # This check recognizes the setting of variable "Skip.SpellCheck" # if set to 'true', spellchecking will not be invoked. parameters: - ContinueOnError: true - CspellConfigPath: ./.vscode/cspell.json + - name: ContinueOnError + type: boolean + default: true + - name: CspellConfigPath + type: string + default: ./.vscode/cspell.json + - name: ScriptToValidateUpgrade + type: string + default: '' steps: - ${{ if eq(variables['Build.Reason'], 'PullRequest') }}: @@ -26,3 +38,16 @@ steps: -CspellConfigPath ${{ parameters.CspellConfigPath }} -ExitWithError:(!$${{ parameters.ContinueOnError }}) pwsh: true + - ${{ if ne('', parameters.ScriptToValidateUpgrade) }}: + - pwsh: | + $changedFiles = ./eng/common/scripts/get-changedfiles.ps1 + + if ($changedFiles -notcontains 'eng/common/spelling/package-lock.json') { + Write-Host "No changes to cspell package-lock.json detected." + exit 0 + } + + Write-Host "Detected change to cspell package-lock.json. Running upgrade verification." + & '${{ parameters.ScriptToValidateUpgrade }}' + displayName: Verify cspell upgrade + condition: and(succeeded(), ne('true', variables['Skip.SpellCheck'])) diff --git a/eng/common/pipelines/templates/steps/create-apireview.yml b/eng/common/pipelines/templates/steps/create-apireview.yml index 124e027308f4..a6f94c01a377 100644 --- a/eng/common/pipelines/templates/steps/create-apireview.yml +++ b/eng/common/pipelines/templates/steps/create-apireview.yml @@ -1,45 +1,65 @@ parameters: - ArtifactPath: $(Build.ArtifactStagingDirectory) - Artifacts: [] - ConfigFileDir: $(Build.ArtifactStagingDirectory)/PackageInfo - MarkPackageAsShipped: false - GenerateApiReviewForManualOnly: false - ArtifactName: 'packages' - PackageName: '' - SourceRootPath: $(Build.SourcesDirectory) + - name: ArtifactPath + type: string + default: $(Build.ArtifactStagingDirectory) + - name: Artifacts + type: object + default: [] + - name: ConfigFileDir + type: string + default: $(Build.ArtifactStagingDirectory)/PackageInfo + - name: MarkPackageAsShipped + type: boolean + default: false + - name: GenerateApiReviewForManualOnly + type: boolean + default: false + - name: ArtifactName + type: string + default: 'packages' + - name: PackageName + type: string + default: '' + - name: SourceRootPath + type: string + default: $(Build.SourcesDirectory) + - name: PackageInfoFiles + type: object + default: [] steps: - # ideally this should be done as initial step of a job in caller template - # We can remove this step later once it is added in caller - - template: /eng/common/pipelines/templates/steps/set-default-branch.yml - parameters: - WorkingDirectory: ${{ parameters.SourceRootPath }} - # Automatic API review is generated for a package when pipeline runs irrespective of how pipeline gets triggered. - # Below condition ensures that API review is generated only for manual pipeline runs when flag GenerateApiReviewForManualOnly is set to true. + # Below condition ensures that API review is generated only for manual pipeline runs when flag GenerateApiReviewForManualOnly is set to true. - ${{ if or(ne(parameters.GenerateApiReviewForManualOnly, true), eq(variables['Build.Reason'], 'Manual')) }}: - - task: Powershell@2 - inputs: - filePath: ${{ parameters.SourceRootPath }}/eng/common/scripts/Create-APIReview.ps1 - arguments: > - -ArtifactList ('${{ convertToJson(parameters.Artifacts) }}' | ConvertFrom-Json | Select-Object Name) - -ArtifactPath '${{parameters.ArtifactPath}}' - -ArtifactName ${{ parameters.ArtifactName }} - -APIKey '$(azuresdk-apiview-apikey)' - -PackageName '${{parameters.PackageName}}' - -SourceBranch '$(Build.SourceBranchName)' - -DefaultBranch '$(DefaultBranch)' - -ConfigFileDir '${{parameters.ConfigFileDir}}' - -BuildId '$(Build.BuildId)' - -RepoName '$(Build.Repository.Name)' - -MarkPackageAsShipped $${{parameters.MarkPackageAsShipped}} - pwsh: true - displayName: Create API Review - condition: >- - and( - succeededOrFailed(), - ne(variables['Skip.CreateApiReview'], 'true'), - ne(variables['Build.Reason'],'PullRequest'), - eq(variables['System.TeamProject'], 'internal'), - not(endsWith(variables['Build.Repository.Name'], '-pr')) - ) + # ideally this should be done as initial step of a job in caller template + # We can remove this step later once it is added in caller + - template: /eng/common/pipelines/templates/steps/set-default-branch.yml + parameters: + WorkingDirectory: ${{ parameters.SourceRootPath }} + + - ${{ if and(eq(variables['System.TeamProject'], 'internal'), ne(variables['Build.Reason'], 'PullRequest'), not(endsWith(variables['Build.Repository.Name'], '-pr'))) }}: + - task: AzureCLI@2 + inputs: + azureSubscription: 'APIView prod deployment' + scriptType: pscore + scriptLocation: scriptPath + scriptPath: ${{ parameters.SourceRootPath }}/eng/common/scripts/Create-APIReview.ps1 + # PackageInfoFiles example: @('a/file1.json','a/file2.json') + arguments: > + -PackageInfoFiles @('${{ join(''',''', parameters.PackageInfoFiles) }}') + -ArtifactList ('${{ convertToJson(parameters.Artifacts) }}' | ConvertFrom-Json | Select-Object Name) + -ArtifactPath '${{parameters.ArtifactPath}}' + -ArtifactName ${{ parameters.ArtifactName }} + -PackageName '${{parameters.PackageName}}' + -SourceBranch '$(Build.SourceBranchName)' + -DefaultBranch '$(DefaultBranch)' + -ConfigFileDir '${{parameters.ConfigFileDir}}' + -BuildId '$(Build.BuildId)' + -RepoName '$(Build.Repository.Name)' + -MarkPackageAsShipped $${{parameters.MarkPackageAsShipped}} + displayName: Create API Review + condition: >- + and( + succeededOrFailed(), + ne(variables['Skip.CreateApiReview'], 'true') + ) diff --git a/eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml b/eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml index 52379684c4ea..cb29d1312ebd 100644 --- a/eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml +++ b/eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml @@ -6,6 +6,9 @@ parameters: - name: CustomCondition type: string default: succeeded() + - name: ServiceConnection + type: string + default: '' steps: - pwsh: | @@ -21,8 +24,10 @@ steps: $content | Out-File '${{ parameters.npmrcPath }}' displayName: 'Create .npmrc' condition: ${{ parameters.CustomCondition }} + - task: npmAuthenticate@0 displayName: Authenticate .npmrc condition: ${{ parameters.CustomCondition }} inputs: workingFile: ${{ parameters.npmrcPath }} + azureDevOpsServiceConnection: ${{ parameters.ServiceConnection }} diff --git a/eng/common/pipelines/templates/steps/daily-dev-build-variable.yml b/eng/common/pipelines/templates/steps/daily-dev-build-variable.yml index 37efd0bd0312..3191a4928a27 100644 --- a/eng/common/pipelines/templates/steps/daily-dev-build-variable.yml +++ b/eng/common/pipelines/templates/steps/daily-dev-build-variable.yml @@ -2,6 +2,7 @@ # is used when this pipeline is going to be generating and publishing daily dev builds. parameters: ServiceDirectory: '' + Artifacts: [] Condition: succeeded() steps: - ${{if ne(parameters.ServiceDirectory, '')}}: @@ -11,6 +12,7 @@ steps: arguments: > -ServiceDirectory ${{parameters.ServiceDirectory}} -OutDirectory $(Build.ArtifactStagingDirectory)/PackageInfo + -artifactList @('${{ replace(convertToJson(parameters.Artifacts), '''', '`''') }}' | ConvertFrom-Json | Select-Object -ExpandProperty name) pwsh: true workingDirectory: $(Pipeline.Workspace) displayName: Dump Package properties diff --git a/eng/common/pipelines/templates/steps/detect-api-changes.yml b/eng/common/pipelines/templates/steps/detect-api-changes.yml index d997caa84915..b14630b0f6b7 100644 --- a/eng/common/pipelines/templates/steps/detect-api-changes.yml +++ b/eng/common/pipelines/templates/steps/detect-api-changes.yml @@ -7,10 +7,10 @@ parameters: steps: - ${{ if eq(variables['Build.Reason'],'PullRequest') }}: - pwsh: | - $apiChangeDetectRequestUrl = "https://apiview.dev/api/PullRequests/CreateAPIRevisionIfAPIHasChanges" + $apiChangeDetectRequestUrl = "https://apiview.org/api/PullRequests/CreateAPIRevisionIfAPIHasChanges" echo "##vso[task.setvariable variable=ApiChangeDetectRequestUrl]$apiChangeDetectRequestUrl" displayName: "Set API change detect request URL" - condition: and(${{ parameters.Condition}}, eq(variables['ApiChangeDetectRequestUrl'], '')) + condition: and(succeededOrFailed(), ${{ parameters.Condition}}, eq(variables['ApiChangeDetectRequestUrl'], '')) - task: Powershell@2 inputs: diff --git a/eng/common/pipelines/templates/steps/install-azsdk-cli.yml b/eng/common/pipelines/templates/steps/install-azsdk-cli.yml new file mode 100644 index 000000000000..3cbd66d9c4e5 --- /dev/null +++ b/eng/common/pipelines/templates/steps/install-azsdk-cli.yml @@ -0,0 +1,16 @@ +parameters: + InstallDirectory: $(Agent.TempDirectory) + SourceRootPath: '$(System.DefaultWorkingDirectory)' + +steps: + - task: Powershell@2 + displayName: 'Install Azure SDK Tools CLI' + inputs: + targetType: 'inline' + script: | + & "${{ parameters.SourceRootPath }}/eng/common/mcp/azure-sdk-mcp.ps1" -InstallDirectory ${{ parameters.InstallDirectory }} + $azsdkPath = Join-Path "${{ parameters.InstallDirectory }}" "azsdk$(if ($IsWindows) { '.exe' } else { '' })" + Write-Host "##vso[task.setvariable variable=AZSDK]$azsdkPath" + Write-Host "Set AZSDK variable to: $azsdkPath" + pwsh: true + workingDirectory: $(Pipeline.Workspace) \ No newline at end of file diff --git a/eng/common/pipelines/templates/steps/login-to-github.yml b/eng/common/pipelines/templates/steps/login-to-github.yml new file mode 100644 index 000000000000..3df66925da26 --- /dev/null +++ b/eng/common/pipelines/templates/steps/login-to-github.yml @@ -0,0 +1,25 @@ +# Will output a variable named GH_TOKEN_ for each owner in TokenOwners if there is only one owner it will just output GH_TOKEN + +parameters: +- name: TokenOwners + type: object + default: + - Azure +- name: VariableNamePrefix + type: string + default: GH_TOKEN +- name: ScriptDirectory + default: eng/common/scripts + +steps: +- task: AzureCLI@2 + displayName: "Login to GitHub" + inputs: + azureSubscription: 'AzureSDKEngKeyVault Secrets' + scriptType: pscore + scriptLocation: scriptPath + scriptPath: ${{ parameters.ScriptDirectory }}/login-to-github.ps1 + arguments: > + -InstallationTokenOwners '${{ join(''',''', parameters.TokenOwners) }}' + -VariableNamePrefix '${{ parameters.VariableNamePrefix }}' + \ No newline at end of file diff --git a/eng/common/pipelines/templates/steps/mark-release-completion.yml b/eng/common/pipelines/templates/steps/mark-release-completion.yml new file mode 100644 index 000000000000..0e4824872c69 --- /dev/null +++ b/eng/common/pipelines/templates/steps/mark-release-completion.yml @@ -0,0 +1,22 @@ +parameters: + ConfigFileDir: '' + PackageArtifactName: '' + SourceRootPath: $(Build.SourcesDirectory) + +steps: + - template: /eng/common/pipelines/templates/steps/install-azsdk-cli.yml + parameters: + SourceRootPath: ${{ parameters.SourceRootPath }} + + - task: AzureCLI@2 + inputs: + azureSubscription: opensource-api-connection + scriptType: pscore + scriptLocation: scriptPath + scriptPath: ${{ parameters.SourceRootPath }}/eng/common/scripts/Mark-ReleasePlanCompletion.ps1 + arguments: > + -PackageInfoFilePath '${{ parameters.ConfigFileDir }}/${{ parameters.PackageArtifactName }}.json' -AzsdkExePath '$(AZSDK)' + workingDirectory: $(Pipeline.Workspace) + displayName: Mark package as released + continueOnError: true + condition: and(succeeded(), ne(variables['Skip.MarkReleaseCompletion'], 'true')) \ No newline at end of file diff --git a/eng/common/pipelines/templates/steps/set-test-pipeline-version.yml b/eng/common/pipelines/templates/steps/set-test-pipeline-version.yml index 61d49cdb7db4..1e54d16834ba 100644 --- a/eng/common/pipelines/templates/steps/set-test-pipeline-version.yml +++ b/eng/common/pipelines/templates/steps/set-test-pipeline-version.yml @@ -1,12 +1,25 @@ parameters: - PackageName: '' - PackageNames: '' - ServiceDirectory: '' - TagSeparator: '_' - TestPipeline: false +- name: PackageName + type: string + default: '' +- name: PackageNames + type: string + default: '' +- name: ServiceDirectory + type: string + default: '' +- name: TagSeparator + type: string + default: '_' +- name: TestPipeline + type: boolean + default: false +- name: Artifacts + type: object + default: [] steps: -- ${{ if eq(parameters.TestPipeline, 'true') }}: +- ${{ if eq(parameters.TestPipeline, true) }}: - task: PowerShell@2 displayName: Prep template pipeline for release condition: and(succeeded(), ne(variables['Skip.SetTestPipelineVersion'], 'true')) @@ -18,4 +31,5 @@ steps: -PackageNames '${{ coalesce(parameters.PackageName, parameters.PackageNames) }}' -ServiceDirectory '${{ parameters.ServiceDirectory }}' -TagSeparator '${{ parameters.TagSeparator }}' + -Artifacts @('${{ replace(convertToJson(parameters.Artifacts), '''', '`''') }}' | ConvertFrom-Json) pwsh: true diff --git a/eng/common/pipelines/templates/steps/set-vcpkg-cache-vars.yml b/eng/common/pipelines/templates/steps/set-vcpkg-cache-vars.yml new file mode 100644 index 000000000000..c7ece396e0d6 --- /dev/null +++ b/eng/common/pipelines/templates/steps/set-vcpkg-cache-vars.yml @@ -0,0 +1,26 @@ + +parameters: + - name: TokenTimeoutInHours + type: number + default: 1 + +steps: + - pwsh: | + Write-Host "Setting vcpkg cache variables for read only access to vcpkg binary and asset caches" + Write-Host '##vso[task.setvariable variable=VCPKG_BINARY_SOURCES_SECRET;issecret=true;]clear;x-azcopy,https://azuresdkartifacts.blob.core.windows.net/public-vcpkg-container,read' + Write-Host '##vso[task.setvariable variable=X_VCPKG_ASSET_SOURCES_SECRET;issecret=true;]clear;x-azurl,https://azuresdkartifacts.blob.core.windows.net/public-vcpkg-container,,read' + displayName: Set vcpkg variables + + - ${{if eq(variables['System.TeamProject'], 'internal') }}: + - task: AzurePowerShell@5 + displayName: Set Vcpkg Write-mode Cache + inputs: + azureSubscription: 'Azure SDK Artifacts' + ScriptType: FilePath + ScriptPath: eng/common/scripts/Set-VcpkgWriteModeCache.ps1 + ScriptArguments: -TokenTimeoutInHours ${{ parameters.TokenTimeoutInHours }} + azurePowerShellVersion: LatestVersion + pwsh: true + # This step is idempotent and can be run multiple times in cases of + # failure and partial execution. + retryCountOnTaskFailure: 3 diff --git a/eng/common/pipelines/templates/steps/validate-all-packages.yml b/eng/common/pipelines/templates/steps/validate-all-packages.yml index 03a5f84cc29a..4bcb1286738c 100644 --- a/eng/common/pipelines/templates/steps/validate-all-packages.yml +++ b/eng/common/pipelines/templates/steps/validate-all-packages.yml @@ -1,20 +1,30 @@ parameters: - ArtifactPath: $(Build.ArtifactStagingDirectory) - Artifacts: [] - ConfigFileDir: $(Build.ArtifactStagingDirectory)/PackageInfo + - name: ArtifactPath + type: string + default: $(Build.ArtifactStagingDirectory) + - name: Artifacts + type: object + default: [] + - name: ConfigFileDir + type: string + default: $(Build.ArtifactStagingDirectory)/PackageInfo + - name: PackageInfoFiles + type: object + default: [] steps: - ${{ if and(ne(variables['Skip.PackageValidation'], 'true'), and(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['System.TeamProject'], 'internal'))) }}: - pwsh: | echo "##vso[task.setvariable variable=SetAsReleaseBuild]false" displayName: "Set as release build" - condition: and(succeeded(), eq(variables['SetAsReleaseBuild'], '')) + condition: and(succeededOrFailed(), eq(variables['SetAsReleaseBuild'], '')) - task: AzureCLI@2 inputs: azureSubscription: opensource-api-connection scriptType: pscore scriptLocation: inlineScript + # PackageInfoFiles example: @('a/file1.json','a/file2.json') inlineScript: | $(Build.SourcesDirectory)/eng/common/scripts/Validate-All-Packages.ps1 ` -ArtifactList ('${{ convertToJson(parameters.Artifacts) }}' | ConvertFrom-Json | Select-Object Name) ` @@ -24,7 +34,8 @@ steps: -ConfigFileDir '${{ parameters.ConfigFileDir }}' ` -BuildDefinition $(System.CollectionUri)$(System.TeamProject)/_build?definitionId=$(System.DefinitionId) ` -PipelineUrl $(System.CollectionUri)$(System.TeamProject)/_build/results?buildId=$(Build.BuildId) ` - -IsReleaseBuild $$(SetAsReleaseBuild) + -IsReleaseBuild $$(SetAsReleaseBuild) ` + -PackageInfoFiles @('${{ join(''',''', parameters.PackageInfoFiles) }}') workingDirectory: $(Pipeline.Workspace) displayName: Validate packages and update work items continueOnError: true diff --git a/eng/common/pipelines/templates/steps/verify-changelogs.yml b/eng/common/pipelines/templates/steps/verify-changelogs.yml index 3f36954f4cd8..5d6cdf26e99a 100644 --- a/eng/common/pipelines/templates/steps/verify-changelogs.yml +++ b/eng/common/pipelines/templates/steps/verify-changelogs.yml @@ -4,6 +4,9 @@ parameters: - name: Condition type: string default: succeeded() +- name: ForRelease + type: boolean + default: false steps: - task: Powershell@2 @@ -11,6 +14,7 @@ steps: filePath: $(Build.SourcesDirectory)/eng/common/scripts/Verify-ChangeLogs.ps1 arguments: > -PackagePropertiesFolder '${{ parameters.PackagePropertiesFolder }}' + -ForRelease $${{ parameters.ForRelease }} pwsh: true displayName: Verify ChangeLogEntries condition: ${{ parameters.Condition }} diff --git a/eng/common/pipelines/templates/steps/verify-links.yml b/eng/common/pipelines/templates/steps/verify-links.yml index 896b30d0fe38..62a95aea8a8e 100644 --- a/eng/common/pipelines/templates/steps/verify-links.yml +++ b/eng/common/pipelines/templates/steps/verify-links.yml @@ -6,7 +6,7 @@ parameters: Recursive: $false CheckLinkGuidance: $true Urls: '(Get-ChildItem -Path ./ -Recurse -Include *.md)' - BranchReplaceRegex: "^(${env:SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI}/(?:blob|tree)/)$(DefaultBranch)(/.*)$" + BranchReplaceRegex: "^(${env:SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI}(?:\\.git)?/(?:blob|tree)/)$(DefaultBranch)(/.*)$" BranchReplacementName: "${env:SYSTEM_PULLREQUEST_SOURCECOMMITID}" Condition: succeeded() # If you want to run on failure for the link checker, set it to `Condition: succeededOrFailed()`. diff --git a/eng/common/spelling/Invoke-Cspell.ps1 b/eng/common/spelling/Invoke-Cspell.ps1 index 4e5baa0bdf33..ac7ae3d5f2c9 100644 --- a/eng/common/spelling/Invoke-Cspell.ps1 +++ b/eng/common/spelling/Invoke-Cspell.ps1 @@ -1,3 +1,5 @@ +#!/usr/bin/env pwsh + <# .SYNOPSIS Invokes cspell using dependencies defined in adjacent ./package*.json @@ -5,10 +7,8 @@ Invokes cspell using dependencies defined in adjacent ./package*.json .PARAMETER JobType Maps to cspell command (e.g. `lint`, `trace`, etc.). Default is `lint` -.PARAMETER ScanGlobs -List of glob expressions to be scanned. This list is not constrained by -npx/cmd's upper limit on command line length as the globs are inserted into the -cspell config's `files` property. +.PARAMETER FileList +List of file paths to be scanned. This is piped into cspell via stdin. .PARAMETER CSpellConfigPath Location of cspell.json file to use when scanning. Defaults to @@ -28,19 +28,10 @@ calls to Invoke-Cspell.ps1 to prevent creating multiple working directories and redundant calls `npm ci`. .EXAMPLE -./eng/common/scripts/Invoke-Cspell.ps1 -ScanGlobs 'sdk/*/*/PublicAPI/**/*.md' - -This will run spell check with the given globs - -.EXAMPLE -./eng/common/scripts/Invoke-Cspell.ps1 -ScanGlobs @('sdk/storage/**', 'sdk/keyvault/**') - -This will run spell check against multiple globs +./eng/common/scripts/Invoke-Cspell.ps1 -FileList @('./README.md', 'file2.txt') .EXAMPLE -./eng/common/scripts/Invoke-Cspell.ps1 -ScanGlobs './README.md' - -This will run spell check against a single file +git diff main --name-only | ./eng/common/spelling/Invoke-Cspell.ps1 #> [CmdletBinding()] @@ -48,8 +39,8 @@ param( [Parameter()] [string] $JobType = 'lint', - [Parameter()] - [array]$ScanGlobs = '**', + [Parameter(ValueFromPipeline)] + [array]$FileList, [Parameter()] [string] $CSpellConfigPath = (Resolve-Path "$PSScriptRoot/../../../.vscode/cspell.json"), @@ -64,102 +55,59 @@ param( [switch] $LeavePackageInstallCache ) -Set-StrictMode -Version 3.0 +begin { + Set-StrictMode -Version 3.0 -if (!(Get-Command npm -ErrorAction SilentlyContinue)) { - LogError "Could not locate npm. Install NodeJS (includes npm) https://nodejs.org/en/download/" - exit 1 -} + if (!(Get-Command npm -ErrorAction SilentlyContinue)) { + LogError "Could not locate npm. Install NodeJS (includes npm) https://nodejs.org/en/download/" + exit 1 + } -if (!(Test-Path $CSpellConfigPath)) { - LogError "Could not locate config file $CSpellConfigPath" - exit 1 -} + if (!(Test-Path $CSpellConfigPath)) { + LogError "Could not locate config file $CSpellConfigPath" + exit 1 + } -# Prepare the working directory if it does not already have requirements in -# place. -if (!(Test-Path $PackageInstallCache)) { - New-Item -ItemType Directory -Path $PackageInstallCache | Out-Null -} + # Prepare the working directory if it does not already have requirements in + # place. + if (!(Test-Path $PackageInstallCache)) { + New-Item -ItemType Directory -Path $PackageInstallCache | Out-Null + } -if (!(Test-Path "$PackageInstallCache/package.json")) { - Copy-Item "$PSScriptRoot/package.json" $PackageInstallCache -} + if (!(Test-Path "$PackageInstallCache/package.json")) { + Copy-Item "$PSScriptRoot/package.json" $PackageInstallCache + } -if (!(Test-Path "$PackageInstallCache/package-lock.json")) { - Copy-Item "$PSScriptRoot/package-lock.json" $PackageInstallCache -} + if (!(Test-Path "$PackageInstallCache/package-lock.json")) { + Copy-Item "$PSScriptRoot/package-lock.json" $PackageInstallCache + } -$deleteNotExcludedFile = $false -$notExcludedFile = "" -if (Test-Path "$SpellCheckRoot/LICENSE") { - $notExcludedFile = "$SpellCheckRoot/LICENSE" -} elseif (Test-Path "$SpellCheckRoot/LICENSE.txt") { - $notExcludedFile = "$SpellCheckRoot/LICENSE.txt" -} else { - # If there is no LICENSE file, fall back to creating a temporary file - # The "files" list must always contain a file which exists, is not empty, and is - # not excluded in ignorePaths. In this case it will be a file with the contents - # "1" (no spelling errors will be detected) - $notExcludedFile = Join-Path $SpellCheckRoot ([System.IO.Path]::GetRandomFileName()) - "1" >> $notExcludedFile - $deleteNotExcludedFile = $true -} -$ScanGlobs += $notExcludedFile - -$cspellConfigContent = Get-Content $CSpellConfigPath -Raw -$cspellConfig = ConvertFrom-Json $cspellConfigContent - -# If the config has no "files" property this adds it. If the config has a -# "files" property this sets the value, overwriting the existing value. In this -# case, spell checking is only intended to check files from $ScanGlobs so -# preexisting entries in "files" will be overwritten. -Add-Member ` - -MemberType NoteProperty ` - -InputObject $cspellConfig ` - -Name "files" ` - -Value $ScanGlobs ` - -Force - -# Set the temporary config file with the mutated configuration. The temporary -# location is used to configure the command and the original file remains -# unchanged. -Write-Host "Setting config in: $CSpellConfigPath" -Set-Content ` - -Path $CSpellConfigPath ` - -Value (ConvertTo-Json $cspellConfig -Depth 100) - -# Before changing the run location, resolve paths specified in parameters -$CSpellConfigPath = Resolve-Path $CSpellConfigPath -$SpellCheckRoot = Resolve-Path $SpellCheckRoot - -$originalLocation = Get-Location - -try { - Set-Location $PackageInstallCache - npm ci | Write-Host - - # Use the mutated configuration file when calling cspell - $command = "npm exec --no -- cspell $JobType --config $CSpellConfigPath --no-must-find-files --root $SpellCheckRoot --relative" + + $filesToCheck = @() + } +process { + $filesToCheck += $FileList + } +end { + npm --prefix $PackageInstallCache ci | Write-Host + + $command = "npm --prefix $PackageInstallCache exec --no -- cspell $JobType --config $CSpellConfigPath --no-must-find-files --root $SpellCheckRoot --file-list stdin" Write-Host $command - $cspellOutput = npm exec ` + $cspellOutput = $filesToCheck | npm --prefix $PackageInstallCache ` + exec ` --no ` - -- ` + '--' ` cspell ` $JobType ` --config $CSpellConfigPath ` --no-must-find-files ` --root $SpellCheckRoot ` - --relative -} finally { - Set-Location $originalLocation - - Write-Host "cspell run complete, restoring original configuration and removing temp file." - Set-Content -Path $CSpellConfigPath -Value $cspellConfigContent -NoNewLine + --file-list stdin - if ($deleteNotExcludedFile) { - Remove-Item -Path $notExcludedFile + if (!$LeavePackageInstallCache) { + Write-Host "Cleaning up package install cache at $PackageInstallCache" + Remove-Item -Path $PackageInstallCache -Recurse -Force | Out-Null } -} -return $cspellOutput + return $cspellOutput +} diff --git a/eng/common/spelling/README.md b/eng/common/spelling/README.md new file mode 100644 index 000000000000..06e711c90a26 --- /dev/null +++ b/eng/common/spelling/README.md @@ -0,0 +1,84 @@ +# Spelling Check Scripts + +This directory contains a script to run cspell (Code Spell Checker) on the repository using the dependencies defined in the adjacent `package*.json` files. + +## Adding Legitimate Words + +If the spell checker flags legitimate words as misspelled, you can add them to the dictionary configuration file located at `.vscode/cspell.json`. + +### Where to Add Words + +There are two main places to add legitimate words. Maintain alphabetical order when adding words to keep the dictionary organized: + +1. **Root-level words array**: Add words to the `"words"` array at the root level of the configuration file. This is the preferred location for project-specific terms, technical vocabulary, and commonly used words. + +2. **Baseline dictionary**: Add words to the `"baseline"` dictionary under `"dictionaryDefinitions"`. This is typically used for words that were already present in the codebase when the spell checker was first introduced. + + +### Example + +To add new words, edit `.vscode/cspell.json` and add them to the `"words"` array: + +```json +{ + "words": [ + "myprojectname", + "customterm", + "technicalword" + ] +} +``` + +### Guidelines + +- Use lowercase for words +- Consider whether the word is truly legitimate or if it might be a typo + +## Available Scripts + +### PowerShell Version (Windows) +- **File**: `Invoke-Cspell.ps1` +- **Usage**: For Windows PowerShell environments + +## Usage Examples + +```powershell +# Check all files (default) +./eng/common/spelling/Invoke-Cspell.ps1 + +# Check specific files +./eng/common/spelling/Invoke-Cspell.ps1 -ScanGlobs 'sdk/*/*/PublicAPI/**/*.md' + +# Check multiple globs (powershell invocation only) +./eng/common/spelling/Invoke-Cspell.ps1 -ScanGlobs @('sdk/storage/**', 'sdk/keyvault/**') + +# Check single file +./eng/common/spelling/Invoke-Cspell.ps1 -ScanGlobs './README.md' +``` + +## Parameters + +- **Job Type**: The cspell command to run (default: `lint`) +- **Scan Globs**: File patterns to check for spelling +- **Config Path**: Location of the cspell.json configuration file +- **Spell Check Root**: Root directory for relative paths +- **Package Cache**: Working directory for npm dependencies +- **Leave Cache**: Option to preserve the npm package cache + +## Requirements + +- Node.js and npm must be installed +- The `.vscode/cspell.json` configuration file must exist +- `jq` command-line JSON processor (for bash version) + +## How It Works + +1. Creates a temporary working directory for npm packages +2. Copies `package.json` and `package-lock.json` to the working directory +3. Installs npm dependencies using `npm ci` +4. Modifies the cspell configuration to include specified file globs +5. Runs cspell with the modified configuration +6. Restores the original configuration +7. Cleans up temporary files + +The scripts ensure that a LICENSE file (or temporary file) is always included in the scan to meet cspell's requirements for the "files" array. diff --git a/eng/common/spelling/package-lock.json b/eng/common/spelling/package-lock.json index 8f3d520f4a8c..a0199b95496a 100644 --- a/eng/common/spelling/package-lock.json +++ b/eng/common/spelling/package-lock.json @@ -1,534 +1,517 @@ { "name": "cspell-version-pin", - "version": "0.1.1", + "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cspell-version-pin", - "version": "0.1.1", - "dependencies": { - "@cspell/cspell-bundled-dicts": "^6.12.0", - "@cspell/cspell-types": "^6.12.0", - "cspell": "^6.12.0", - "cspell-lib": "^6.12.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "1.0.0", "dependencies": { - "@babel/highlight": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "engines": { - "node": ">=6.9.0" + "cspell": "^9.6.3" } }, - "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" + "node_modules/@cspell/cspell-bundled-dicts": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.6.3.tgz", + "integrity": "sha512-0Ibx+ynlSd8wMAoUmc2Ck4SDN27eJheM45aCmCvCA8saROwkDh7j8zBz7aTTUTtFN+pcotJoNxr71LLD+KXhgQ==", + "dependencies": { + "@cspell/dict-ada": "^4.1.1", + "@cspell/dict-al": "^1.1.1", + "@cspell/dict-aws": "^4.0.17", + "@cspell/dict-bash": "^4.2.2", + "@cspell/dict-companies": "^3.2.10", + "@cspell/dict-cpp": "^7.0.2", + "@cspell/dict-cryptocurrencies": "^5.0.5", + "@cspell/dict-csharp": "^4.0.8", + "@cspell/dict-css": "^4.0.19", + "@cspell/dict-dart": "^2.3.2", + "@cspell/dict-data-science": "^2.0.13", + "@cspell/dict-django": "^4.1.6", + "@cspell/dict-docker": "^1.1.17", + "@cspell/dict-dotnet": "^5.0.11", + "@cspell/dict-elixir": "^4.0.8", + "@cspell/dict-en_us": "^4.4.28", + "@cspell/dict-en-common-misspellings": "^2.1.12", + "@cspell/dict-en-gb-mit": "^3.1.17", + "@cspell/dict-filetypes": "^3.0.15", + "@cspell/dict-flutter": "^1.1.1", + "@cspell/dict-fonts": "^4.0.5", + "@cspell/dict-fsharp": "^1.1.1", + "@cspell/dict-fullstack": "^3.2.8", + "@cspell/dict-gaming-terms": "^1.1.2", + "@cspell/dict-git": "^3.1.0", + "@cspell/dict-golang": "^6.0.26", + "@cspell/dict-google": "^1.0.9", + "@cspell/dict-haskell": "^4.0.6", + "@cspell/dict-html": "^4.0.14", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-java": "^5.0.12", + "@cspell/dict-julia": "^1.1.1", + "@cspell/dict-k8s": "^1.0.12", + "@cspell/dict-kotlin": "^1.1.1", + "@cspell/dict-latex": "^5.0.0", + "@cspell/dict-lorem-ipsum": "^4.0.5", + "@cspell/dict-lua": "^4.0.8", + "@cspell/dict-makefile": "^1.0.5", + "@cspell/dict-markdown": "^2.0.14", + "@cspell/dict-monkeyc": "^1.0.12", + "@cspell/dict-node": "^5.0.9", + "@cspell/dict-npm": "^5.2.32", + "@cspell/dict-php": "^4.1.1", + "@cspell/dict-powershell": "^5.0.15", + "@cspell/dict-public-licenses": "^2.0.15", + "@cspell/dict-python": "^4.2.25", + "@cspell/dict-r": "^2.1.1", + "@cspell/dict-ruby": "^5.1.0", + "@cspell/dict-rust": "^4.1.2", + "@cspell/dict-scala": "^5.0.9", + "@cspell/dict-shell": "^1.1.2", + "@cspell/dict-software-terms": "^5.1.20", + "@cspell/dict-sql": "^2.2.1", + "@cspell/dict-svelte": "^1.0.7", + "@cspell/dict-swift": "^2.0.6", + "@cspell/dict-terraform": "^1.1.3", + "@cspell/dict-typescript": "^3.2.3", + "@cspell/dict-vue": "^3.0.5", + "@cspell/dict-zig": "^1.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-json-reporter": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-9.6.3.tgz", + "integrity": "sha512-4jhqXKGCFAQXomtk4/Ldy/GiGEocC61v8GISiUgn1mH+HPgEvkJijyxKRNFYvzXOoJr4y0KrkGBoKk5FI7cipw==", + "dependencies": { + "@cspell/cspell-types": "9.6.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-performance-monitor": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-performance-monitor/-/cspell-performance-monitor-9.6.3.tgz", + "integrity": "sha512-Y1I0wg7MUTouubREyPeTJe2dKNbBZPBnd6kDNcVet5DRZ3Cck2udS9m1a6DhJO2sGQgHTBULPDBEUU5tcAZ+nQ==", + "engines": { + "node": ">=20.18" } }, - "node_modules/@babel/highlight/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" - }, + "node_modules/@cspell/cspell-pipe": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.6.3.tgz", + "integrity": "sha512-Q0M58JbgHWOOOYvSyBodEysXLP5t8Q58Ff08msj2/XxRFpowR4iIUyfg3k+/d06uyOy89l+RD5AmyTEa5410xg==", "engines": { - "node": ">=4" + "node": ">=20" } }, - "node_modules/@babel/highlight/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==", + "node_modules/@cspell/cspell-resolver": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.6.3.tgz", + "integrity": "sha512-yUMTC8vl+LeRcIeXRrxn0GXL+rurf4OR3uyqZbG6bbtuttvq/Icleeibv9Wts+n700HLp+sVXJ7BrCn0Ehobsw==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "global-directory": "^4.0.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/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": ">=20" } }, - "node_modules/@babel/highlight/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/highlight/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==", + "node_modules/@cspell/cspell-service-bus": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.6.3.tgz", + "integrity": "sha512-gDUDq0PcMcdSG/5HwaQzkptn29E0zCWJUqmP0W/4scSC80AVh/8hgws4tuqv1GWvr4MiBZhIbUEO4f3Pc58OYQ==", "engines": { - "node": ">=4" + "node": ">=20" } }, - "node_modules/@babel/highlight/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" - }, + "node_modules/@cspell/cspell-types": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.6.3.tgz", + "integrity": "sha512-oDTzZ2kG/jJk3TaupESUckDraGJbBpRBEW1xgTrWyIU+uGwdmMXPcGr9XZq9dRS5Zxm01nTgLwxpVM/3BVTvWQ==", "engines": { - "node": ">=4" + "node": ">=20" } }, - "node_modules/@cspell/cspell-bundled-dicts": { - "version": "6.31.2", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.31.2.tgz", - "integrity": "sha512-rQ5y/U1Ah5AaduIh3NU2z371hRrOr1cmNdhhP8oiuz2E4VqmcoVHflXIct9DgY8uIJpwsSCdR6ypOQWZYXYnwA==", + "node_modules/@cspell/cspell-worker": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-worker/-/cspell-worker-9.6.3.tgz", + "integrity": "sha512-zZccf1jLSrqIvlYAqwnnBi4RrLVfSEfWT4eYpiyIzHXHMzWnkUXEstQCG6LFK4L9A44M/w9s8szi7R4DLBzKsA==", "dependencies": { - "@cspell/dict-ada": "^4.0.1", - "@cspell/dict-aws": "^3.0.0", - "@cspell/dict-bash": "^4.1.1", - "@cspell/dict-companies": "^3.0.9", - "@cspell/dict-cpp": "^5.0.2", - "@cspell/dict-cryptocurrencies": "^3.0.1", - "@cspell/dict-csharp": "^4.0.2", - "@cspell/dict-css": "^4.0.5", - "@cspell/dict-dart": "^2.0.2", - "@cspell/dict-django": "^4.0.2", - "@cspell/dict-docker": "^1.1.6", - "@cspell/dict-dotnet": "^5.0.0", - "@cspell/dict-elixir": "^4.0.2", - "@cspell/dict-en_us": "^4.3.2", - "@cspell/dict-en-common-misspellings": "^1.0.2", - "@cspell/dict-en-gb": "1.1.33", - "@cspell/dict-filetypes": "^3.0.0", - "@cspell/dict-fonts": "^3.0.2", - "@cspell/dict-fullstack": "^3.1.5", - "@cspell/dict-gaming-terms": "^1.0.4", - "@cspell/dict-git": "^2.0.0", - "@cspell/dict-golang": "^6.0.1", - "@cspell/dict-haskell": "^4.0.1", - "@cspell/dict-html": "^4.0.3", - "@cspell/dict-html-symbol-entities": "^4.0.0", - "@cspell/dict-java": "^5.0.5", - "@cspell/dict-k8s": "^1.0.1", - "@cspell/dict-latex": "^4.0.0", - "@cspell/dict-lorem-ipsum": "^3.0.0", - "@cspell/dict-lua": "^4.0.1", - "@cspell/dict-node": "^4.0.2", - "@cspell/dict-npm": "^5.0.5", - "@cspell/dict-php": "^4.0.1", - "@cspell/dict-powershell": "^5.0.1", - "@cspell/dict-public-licenses": "^2.0.2", - "@cspell/dict-python": "^4.0.2", - "@cspell/dict-r": "^2.0.1", - "@cspell/dict-ruby": "^5.0.0", - "@cspell/dict-rust": "^4.0.1", - "@cspell/dict-scala": "^5.0.0", - "@cspell/dict-software-terms": "^3.1.6", - "@cspell/dict-sql": "^2.1.0", - "@cspell/dict-svelte": "^1.0.2", - "@cspell/dict-swift": "^2.0.1", - "@cspell/dict-typescript": "^3.1.1", - "@cspell/dict-vue": "^3.0.0" + "cspell-lib": "9.6.3" }, "engines": { - "node": ">=14" - } - }, - "node_modules/@cspell/cspell-pipe": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.31.1.tgz", - "integrity": "sha512-zk1olZi4dr6GLm5PAjvsiZ01HURNSruUYFl1qSicGnTwYN8GaN4RhAwannAytcJ7zJPIcyXlid0YsB58nJf3wQ==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@cspell/cspell-service-bus": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.31.1.tgz", - "integrity": "sha512-YyBicmJyZ1uwKVxujXw7sgs9x+Eps43OkWmCtDZmZlnq489HdTSuhF1kTbVi2yeFSeaXIS87+uHo12z97KkQpg==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@cspell/cspell-types": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.31.1.tgz", - "integrity": "sha512-1KeTQFiHMssW1eRoF2NZIEg4gPVIfXLsL2+VSD/AV6YN7lBcuf6gRRgV5KWYarhxtEfjxhDdDTmu26l/iJEUtw==", - "engines": { - "node": ">=14" + "node": ">=20.18" } }, "node_modules/@cspell/dict-ada": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.0.1.tgz", - "integrity": "sha512-/E9o3nHrXOhYmQE43deKbxZcR3MIJAsa+66IzP9TXGHheKEx8b9dVMVVqydDDH8oom1H0U20NRPtu6KRVbT9xw==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.1.1.tgz", + "integrity": "sha512-E+0YW9RhZod/9Qy2gxfNZiHJjCYFlCdI69br1eviQQWB8yOTJX0JHXLs79kOYhSW0kINPVUdvddEBe6Lu6CjGQ==" + }, + "node_modules/@cspell/dict-al": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-al/-/dict-al-1.1.1.tgz", + "integrity": "sha512-sD8GCaZetgQL4+MaJLXqbzWcRjfKVp8x+px3HuCaaiATAAtvjwUQ5/Iubiqwfd1boIh2Y1/3EgM3TLQ7Q8e0wQ==" }, "node_modules/@cspell/dict-aws": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-3.0.0.tgz", - "integrity": "sha512-O1W6nd5y3Z00AMXQMzfiYrIJ1sTd9fB1oLr+xf/UD7b3xeHeMeYE2OtcWbt9uyeHim4tk+vkSTcmYEBKJgS5bQ==" + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.17.tgz", + "integrity": "sha512-ORcblTWcdlGjIbWrgKF+8CNEBQiLVKdUOFoTn0KPNkAYnFcdPP0muT4892h7H4Xafh3j72wqB4/loQ6Nti9E/w==" }, "node_modules/@cspell/dict-bash": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.1.tgz", - "integrity": "sha512-8czAa/Mh96wu2xr0RXQEGMTBUGkTvYn/Pb0o+gqOO1YW+poXGQc3gx0YPqILDryP/KCERrNvkWUJz3iGbvwC2A==" + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.2.2.tgz", + "integrity": "sha512-kyWbwtX3TsCf5l49gGQIZkRLaB/P8g73GDRm41Zu8Mv51kjl2H7Au0TsEvHv7jzcsRLS6aUYaZv6Zsvk1fOz+Q==", + "dependencies": { + "@cspell/dict-shell": "1.1.2" + } }, "node_modules/@cspell/dict-companies": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.17.tgz", - "integrity": "sha512-vo1jbozgZWSzz2evIL26kLd35tVb+5kW/UTvTzAwaWutSWRloRyKx38nj2CaLJ2IFxBdiATteCFGTzKCvJJl6A==" + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.2.10.tgz", + "integrity": "sha512-bJ1qnO1DkTn7JYGXvxp8FRQc4yq6tRXnrII+jbP8hHmq5TX5o1Wu+rdfpoUQaMWTl6balRvcMYiINDesnpR9Bw==" }, "node_modules/@cspell/dict-cpp": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.3.tgz", - "integrity": "sha512-7sx/RFsf0hB3q8chx8OHYl9Kd+g0pqA1laphwaAQ+/jPwoAreYT3kNQWbJ3bIt/rMoORetFSQxckSbaJXwwqpw==" + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-7.0.2.tgz", + "integrity": "sha512-dfbeERiVNeqmo/npivdR6rDiBCqZi3QtjH2Z0HFcXwpdj6i97dX1xaKyK2GUsO/p4u1TOv63Dmj5Vm48haDpuA==" }, "node_modules/@cspell/dict-cryptocurrencies": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-3.0.1.tgz", - "integrity": "sha512-Tdlr0Ahpp5yxtwM0ukC13V6+uYCI0p9fCRGMGZt36rWv8JQZHIuHfehNl7FB/Qc09NCF7p5ep0GXbL+sVTd/+w==" + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.5.tgz", + "integrity": "sha512-R68hYYF/rtlE6T/dsObStzN5QZw+0aQBinAXuWCVqwdS7YZo0X33vGMfChkHaiCo3Z2+bkegqHlqxZF4TD3rUA==" }, "node_modules/@cspell/dict-csharp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.2.tgz", - "integrity": "sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==" + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.8.tgz", + "integrity": "sha512-qmk45pKFHSxckl5mSlbHxmDitSsGMlk/XzFgt7emeTJWLNSTUK//MbYAkBNRtfzB4uD7pAFiKgpKgtJrTMRnrQ==" }, "node_modules/@cspell/dict-css": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.6.tgz", - "integrity": "sha512-2Lo8W2ezHmGgY8cWFr4RUwnjbndna5mokpCK/DuxGILQnuajR0J31ANQOXj/8iZM2phFB93ZzMNk/0c04TDfSQ==" + "version": "4.0.19", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.19.tgz", + "integrity": "sha512-VYHtPnZt/Zd/ATbW3rtexWpBnHUohUrQOHff/2JBhsVgxOrksAxJnLAO43Q1ayLJBJUUwNVo+RU0sx0aaysZfg==" }, "node_modules/@cspell/dict-dart": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.0.2.tgz", - "integrity": "sha512-jigcODm7Z4IFZ4vParwwP3IT0fIgRq/9VoxkXfrxBMsLBGGM2QltHBj7pl+joX+c4cOHxfyZktGJK1B1wFtR4Q==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.3.2.tgz", + "integrity": "sha512-sUiLW56t9gfZcu8iR/5EUg+KYyRD83Cjl3yjDEA2ApVuJvK1HhX+vn4e4k4YfjpUQMag8XO2AaRhARE09+/rqw==" }, "node_modules/@cspell/dict-data-science": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-1.0.7.tgz", - "integrity": "sha512-Q9VUFaarUpqM6CAmR8peP4o9alk0XQ4rgVoE2R2XalpC2cqPI8Hmg6QwMU2UPioSUcWMJCqLc/KzJti0gBMuxA==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.13.tgz", + "integrity": "sha512-l1HMEhBJkPmw4I2YGVu2eBSKM89K9pVF+N6qIr5Uo5H3O979jVodtuwP8I7LyPrJnC6nz28oxeGRCLh9xC5CVA==" }, "node_modules/@cspell/dict-django": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.0.tgz", - "integrity": "sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==" + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.6.tgz", + "integrity": "sha512-SdbSFDGy9ulETqNz15oWv2+kpWLlk8DJYd573xhIkeRdcXOjskRuxjSZPKfW7O3NxN/KEf3gm3IevVOiNuFS+w==" }, "node_modules/@cspell/dict-docker": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.6.tgz", - "integrity": "sha512-zCCiRTZ6EOQpBnSOm0/3rnKW1kCcAUDUA7SxJG3SuH6iZvKi3I8FEg8+O83WQUeXg0SyPNerD9F40JLnnJjJig==" + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.17.tgz", + "integrity": "sha512-OcnVTIpHIYYKhztNTyK8ShAnXTfnqs43hVH6p0py0wlcwRIXe5uj4f12n7zPf2CeBI7JAlPjEsV0Rlf4hbz/xQ==" }, "node_modules/@cspell/dict-dotnet": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.0.tgz", - "integrity": "sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==" + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.11.tgz", + "integrity": "sha512-LSVKhpFf/ASTWJcfYeS0Sykcl1gVMsv2Z5Eo0TnTMSTLV3738HH+66pIsjUTChqU6SF3gKPuCe6EOaRYqb/evA==" }, "node_modules/@cspell/dict-elixir": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.3.tgz", - "integrity": "sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==" + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.8.tgz", + "integrity": "sha512-CyfphrbMyl4Ms55Vzuj+mNmd693HjBFr9hvU+B2YbFEZprE5AG+EXLYTMRWrXbpds4AuZcvN3deM2XVB80BN/Q==" }, "node_modules/@cspell/dict-en_us": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.4.tgz", - "integrity": "sha512-mR2yqWmFip1zTKja2SqyVMbzuqEThqkEJk9M32bMDziPJpEyOIPvLA0UPmj3cyRKJkRuVF0bhDCE33O+at38hw==" + "version": "4.4.28", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.28.tgz", + "integrity": "sha512-/rzhbZaZDsDWmXbc9Fmmr4/ngmaNcG2b+TGT+ZjGqpOXVQYI75yZ9+XduyI43xJ5O38QcX3QIbJY5GWaJqxPEg==" }, "node_modules/@cspell/dict-en-common-misspellings": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-1.0.2.tgz", - "integrity": "sha512-jg7ZQZpZH7+aAxNBlcAG4tGhYF6Ksy+QS5Df73Oo+XyckBjC9QS+PrRwLTeYoFIgXy5j3ICParK5r3MSSoL4gw==" + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.12.tgz", + "integrity": "sha512-14Eu6QGqyksqOd4fYPuRb58lK1Va7FQK9XxFsRKnZU8LhL3N+kj7YKDW+7aIaAN/0WGEqslGP6lGbQzNti8Akw==" }, - "node_modules/@cspell/dict-en-gb": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz", - "integrity": "sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==" + "node_modules/@cspell/dict-en-gb-mit": { + "version": "3.1.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.17.tgz", + "integrity": "sha512-MLx+3XN9rj+EGwLIFmh0gpEDNalCyQqjcszp+WkedCHcvTCzQgWXQMZK6cPuhO/OKYyW9GOwsx4t0wjU5tRVNg==" }, "node_modules/@cspell/dict-filetypes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.1.tgz", - "integrity": "sha512-8z8mY1IbrTyTRumx2vvD9yzRhNMk9SajM/GtI5hdMM2pPpNSp25bnuauzjRf300eqlqPY2MNb5MmhBFO014DJw==" + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.15.tgz", + "integrity": "sha512-uDMeqYlLlK476w/muEFQGBy9BdQWS0mQ7BJiy/iQv5XUWZxE2O54ZQd9nW8GyQMzAgoyg5SG4hf9l039Qt66oA==" + }, + "node_modules/@cspell/dict-flutter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-flutter/-/dict-flutter-1.1.1.tgz", + "integrity": "sha512-UlOzRcH2tNbFhZmHJN48Za/2/MEdRHl2BMkCWZBYs+30b91mWvBfzaN4IJQU7dUZtowKayVIF9FzvLZtZokc5A==" }, "node_modules/@cspell/dict-fonts": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-3.0.2.tgz", - "integrity": "sha512-Z5QdbgEI7DV+KPXrAeDA6dDm/vTzyaW53SGlKqz6PI5VhkOjgkBXv3YtZjnxMZ4dY2ZIqq+RUK6qa9Pi8rQdGQ==" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.5.tgz", + "integrity": "sha512-BbpkX10DUX/xzHs6lb7yzDf/LPjwYIBJHJlUXSBXDtK/1HaeS+Wqol4Mlm2+NAgZ7ikIE5DQMViTgBUY3ezNoQ==" + }, + "node_modules/@cspell/dict-fsharp": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.1.1.tgz", + "integrity": "sha512-imhs0u87wEA4/cYjgzS0tAyaJpwG7vwtC8UyMFbwpmtw+/bgss+osNfyqhYRyS/ehVCWL17Ewx2UPkexjKyaBA==" }, "node_modules/@cspell/dict-fullstack": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.1.5.tgz", - "integrity": "sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==" + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.2.8.tgz", + "integrity": "sha512-J6EeoeThvx/DFrcA2rJiCA6vfqwJMbkG0IcXhlsmRZmasIpanmxgt90OEaUazbZahFiuJT8wrhgQ1QgD1MsqBw==" }, "node_modules/@cspell/dict-gaming-terms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.0.4.tgz", - "integrity": "sha512-hbDduNXlk4AOY0wFxcDMWBPpm34rpqJBeqaySeoUH70eKxpxm+dvjpoRLJgyu0TmymEICCQSl6lAHTHSDiWKZg==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.1.2.tgz", + "integrity": "sha512-9XnOvaoTBscq0xuD6KTEIkk9hhdfBkkvJAIsvw3JMcnp1214OCGW8+kako5RqQ2vTZR3Tnf3pc57o7VgkM0q1Q==" }, "node_modules/@cspell/dict-git": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-2.0.0.tgz", - "integrity": "sha512-n1AxyX5Kgxij/sZFkxFJlzn3K9y/sCcgVPg/vz4WNJ4K9YeTsUmyGLA2OQI7d10GJeiuAo2AP1iZf2A8j9aj2w==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-3.1.0.tgz", + "integrity": "sha512-KEt9zGkxqGy2q1nwH4CbyqTSv5nadpn8BAlDnzlRcnL0Xb3LX9xTgSGShKvzb0bw35lHoYyLWN2ZKAqbC4pgGQ==" }, "node_modules/@cspell/dict-golang": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.2.tgz", - "integrity": "sha512-5pyZn4AAiYukAW+gVMIMVmUSkIERFrDX2vtPDjg8PLQUhAHWiVeQSDjuOhq9/C5GCCEZU/zWSONkGiwLBBvV9A==" + "version": "6.0.26", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.26.tgz", + "integrity": "sha512-YKA7Xm5KeOd14v5SQ4ll6afe9VSy3a2DWM7L9uBq4u3lXToRBQ1W5PRa+/Q9udd+DTURyVVnQ+7b9cnOlNxaRg==" + }, + "node_modules/@cspell/dict-google": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-google/-/dict-google-1.0.9.tgz", + "integrity": "sha512-biL65POqialY0i4g6crj7pR6JnBkbsPovB2WDYkj3H4TuC/QXv7Pu5pdPxeUJA6TSCHI7T5twsO4VSVyRxD9CA==" }, "node_modules/@cspell/dict-haskell": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.1.tgz", - "integrity": "sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==" + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.6.tgz", + "integrity": "sha512-ib8SA5qgftExpYNjWhpYIgvDsZ/0wvKKxSP+kuSkkak520iPvTJumEpIE+qPcmJQo4NzdKMN8nEfaeci4OcFAQ==" }, "node_modules/@cspell/dict-html": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.3.tgz", - "integrity": "sha512-Gae8i8rrArT0UyG1I6DHDK62b7Be6QEcBSIeWOm4VIIW1CASkN9B0qFgSVnkmfvnu1Y3H7SSaaEynKjdj3cs8w==" + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.14.tgz", + "integrity": "sha512-2bf7n+kS92g+cMKV0wr9o/Oq9n8JzU7CcrB96gIh2GHgnF+0xDOqO2W/1KeFAqOfqosoOVE48t+4dnEMkkoJ2Q==" }, "node_modules/@cspell/dict-html-symbol-entities": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.0.tgz", - "integrity": "sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.5.tgz", + "integrity": "sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA==" }, "node_modules/@cspell/dict-java": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.5.tgz", - "integrity": "sha512-X19AoJgWIBwJBSWGFqSgHaBR/FEykBHTMjL6EqOnhIGEyE9nvuo32tsSHjXNJ230fQxQptEvRZoaldNLtKxsRg==" + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.12.tgz", + "integrity": "sha512-qPSNhTcl7LGJ5Qp6VN71H8zqvRQK04S08T67knMq9hTA8U7G1sTKzLmBaDOFhq17vNX/+rT+rbRYp+B5Nwza1A==" + }, + "node_modules/@cspell/dict-julia": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-julia/-/dict-julia-1.1.1.tgz", + "integrity": "sha512-WylJR9TQ2cgwd5BWEOfdO3zvDB+L7kYFm0I9u0s9jKHWQ6yKmfKeMjU9oXxTBxIufhCXm92SKwwVNAC7gjv+yA==" }, "node_modules/@cspell/dict-k8s": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.1.tgz", - "integrity": "sha512-gc5y4Nm3hVdMZNBZfU2M1AsAmObZsRWjCUk01NFPfGhFBXyVne41T7E62rpnzu5330FV/6b/TnFcPgRmak9lLw==" + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.12.tgz", + "integrity": "sha512-2LcllTWgaTfYC7DmkMPOn9GsBWsA4DZdlun4po8s2ysTP7CPEnZc1ZfK6pZ2eI4TsZemlUQQ+NZxMe9/QutQxg==" + }, + "node_modules/@cspell/dict-kotlin": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-kotlin/-/dict-kotlin-1.1.1.tgz", + "integrity": "sha512-J3NzzfgmxRvEeOe3qUXnSJQCd38i/dpF9/t3quuWh6gXM+krsAXP75dY1CzDmS8mrJAlBdVBeAW5eAZTD8g86Q==" }, "node_modules/@cspell/dict-latex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.0.tgz", - "integrity": "sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-5.0.0.tgz", + "integrity": "sha512-HUrIqUVohM6P0+5b7BsdAdb0STIv0aaFBvguI7pLcreljlcX3FSPUxea7ticzNlCNeVrEaiEn/ws9m6rYUeuNw==" }, "node_modules/@cspell/dict-lorem-ipsum": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-3.0.0.tgz", - "integrity": "sha512-msEV24qEpzWZs2kcEicqYlhyBpR0amfDkJOs+iffC07si9ftqtQ+yP3lf1VFLpgqw3SQh1M1vtU7RD4sPrNlcQ==" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.5.tgz", + "integrity": "sha512-9a4TJYRcPWPBKkQAJ/whCu4uCAEgv/O2xAaZEI0n4y1/l18Yyx8pBKoIX5QuVXjjmKEkK7hi5SxyIsH7pFEK9Q==" }, "node_modules/@cspell/dict-lua": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.1.tgz", - "integrity": "sha512-j0MFmeCouSoC6EdZTbvGe1sJ9V+ruwKSeF+zRkNNNload7R72Co5kX1haW2xLHGdlq0kqSy1ODRZKdVl0e+7hg==" + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.8.tgz", + "integrity": "sha512-N4PkgNDMu9JVsRu7JBS/3E/dvfItRgk9w5ga2dKq+JupP2Y3lojNaAVFhXISh4Y0a6qXDn2clA6nvnavQ/jjLA==" + }, + "node_modules/@cspell/dict-makefile": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-makefile/-/dict-makefile-1.0.5.tgz", + "integrity": "sha512-4vrVt7bGiK8Rx98tfRbYo42Xo2IstJkAF4tLLDMNQLkQ86msDlYSKG1ZCk8Abg+EdNcFAjNhXIiNO+w4KflGAQ==" + }, + "node_modules/@cspell/dict-markdown": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@cspell/dict-markdown/-/dict-markdown-2.0.14.tgz", + "integrity": "sha512-uLKPNJsUcumMQTsZZgAK9RgDLyQhUz/uvbQTEkvF/Q4XfC1i/BnA8XrOrd0+Vp6+tPOKyA+omI5LRWfMu5K/Lw==", + "peerDependencies": { + "@cspell/dict-css": "^4.0.19", + "@cspell/dict-html": "^4.0.14", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-typescript": "^3.2.3" + } + }, + "node_modules/@cspell/dict-monkeyc": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.12.tgz", + "integrity": "sha512-MN7Vs11TdP5mbdNFQP5x2Ac8zOBm97ARg6zM5Sb53YQt/eMvXOMvrep7+/+8NJXs0jkp70bBzjqU4APcqBFNAw==" }, "node_modules/@cspell/dict-node": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.2.tgz", - "integrity": "sha512-FEQJ4TnMcXEFslqBQkXa5HposMoCGsiBv2ux4IZuIXgadXeHKHUHk60iarWpjhzNzQLyN2GD7NoRMd12bK3Llw==" + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-5.0.9.tgz", + "integrity": "sha512-hO+ga+uYZ/WA4OtiMEyKt5rDUlUyu3nXMf8KVEeqq2msYvAPdldKBGH7lGONg6R/rPhv53Rb+0Y1SLdoK1+7wQ==" }, "node_modules/@cspell/dict-npm": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.7.tgz", - "integrity": "sha512-6SegF0HsVaBTl6PlHjeErG8Av+tRYkUG1yaXUQIGWXU0A8oxhI0o4PuL65UWH5lkCKhJyGai69Cd0iytL0oVFg==" + "version": "5.2.32", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.32.tgz", + "integrity": "sha512-H0XD0eg4d96vevle8VUKVoPhsgsw003ByJ47XzipyiMKoQTZ2IAUW+VTkQq8wU1floarNjmThQJOoKL9J4UYuw==" }, "node_modules/@cspell/dict-php": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.1.tgz", - "integrity": "sha512-XaQ/JkSyq2c07MfRG54DjLi2CV+HHwS99DDCAao9Fq2JfkWroTQsUeek7wYZXJATrJVOULoV3HKih12x905AtQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.1.1.tgz", + "integrity": "sha512-EXelI+4AftmdIGtA8HL8kr4WlUE11OqCSVlnIgZekmTkEGSZdYnkFdiJ5IANSALtlQ1mghKjz+OFqVs6yowgWA==" }, "node_modules/@cspell/dict-powershell": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.2.tgz", - "integrity": "sha512-IHfWLme3FXE7vnOmMncSBxOsMTdNWd1Vcyhag03WS8oANSgX8IZ+4lMI00mF0ptlgchf16/OU8WsV4pZfikEFw==" + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.15.tgz", + "integrity": "sha512-l4S5PAcvCFcVDMJShrYD0X6Huv9dcsQPlsVsBGbH38wvuN7gS7+GxZFAjTNxDmTY1wrNi1cCatSg6Pu2BW4rgg==" }, "node_modules/@cspell/dict-public-licenses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.2.tgz", - "integrity": "sha512-baKkbs/WGEV2lCWZoL0KBPh3uiPcul5GSDwmXEBAsR5McEW52LF94/b7xWM0EmSAc/y8ODc5LnPYC7RDRLi6LQ==" + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.15.tgz", + "integrity": "sha512-cJEOs901H13Pfy0fl4dCD1U+xpWIMaEPq8MeYU83FfDZvellAuSo4GqWCripfIqlhns/L6+UZEIJSOZnjgy7Wg==" }, "node_modules/@cspell/dict-python": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.2.tgz", - "integrity": "sha512-Whcn4K8R0Ux/hcx/P9Fbx6i29GwTaXgT3LTt95AuCnV5RRLrzsqoyZkz851hcg5z4kjUQVMduDl3HECGgW/FNw==", + "version": "4.2.25", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.25.tgz", + "integrity": "sha512-hDdN0YhKgpbtZVRjQ2c8jk+n0wQdidAKj1Fk8w7KEHb3YlY5uPJ0mAKJk7AJKPNLOlILoUmN+HAVJz+cfSbWYg==", "dependencies": { - "@cspell/dict-data-science": "^1.0.0" + "@cspell/dict-data-science": "^2.0.13" } }, "node_modules/@cspell/dict-r": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.0.1.tgz", - "integrity": "sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.1.1.tgz", + "integrity": "sha512-71Ka+yKfG4ZHEMEmDxc6+blFkeTTvgKbKAbwiwQAuKl3zpqs1Y0vUtwW2N4b3LgmSPhV3ODVY0y4m5ofqDuKMw==" }, "node_modules/@cspell/dict-ruby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.0.tgz", - "integrity": "sha512-ssb96QxLZ76yPqFrikWxItnCbUKhYXJ2owkoIYzUGNFl2CHSoHCb5a6Zetum9mQ/oUA3gNeUhd28ZUlXs0la2A==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.1.0.tgz", + "integrity": "sha512-9PJQB3cfkBULrMLp5kSAcFPpzf8oz9vFN+QYZABhQwWkGbuzCIXSorHrmWSASlx4yejt3brjaWS57zZ/YL5ZQQ==" }, "node_modules/@cspell/dict-rust": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.0.1.tgz", - "integrity": "sha512-xJSSzHDK2z6lSVaOmMxl3PTOtfoffaxMo7fTcbZUF+SCJzfKbO6vnN9TCGX2sx1RHFDz66Js6goz6SAZQdOwaw==" + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.1.2.tgz", + "integrity": "sha512-O1FHrumYcO+HZti3dHfBPUdnDFkI+nbYK3pxYmiM1sr+G0ebOd6qchmswS0Wsc6ZdEVNiPYJY/gZQR6jfW3uOg==" }, "node_modules/@cspell/dict-scala": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.0.tgz", - "integrity": "sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==" + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.9.tgz", + "integrity": "sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg==" + }, + "node_modules/@cspell/dict-shell": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-shell/-/dict-shell-1.1.2.tgz", + "integrity": "sha512-WqOUvnwcHK1X61wAfwyXq04cn7KYyskg90j4lLg3sGGKMW9Sq13hs91pqrjC44Q+lQLgCobrTkMDw9Wyl9nRFA==" }, "node_modules/@cspell/dict-software-terms": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.0.tgz", - "integrity": "sha512-RI6sv4Bc4i42YH/ofVelv8lXpJRhCyS9IhI2BtejUoMXKhKA9gC01ATXOylx+oaQmj3t5ark4R50xKFRvC7ENA==" + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.1.20.tgz", + "integrity": "sha512-TEk1xHvetTI4pv7Vzje1D322m6QEjaH2P6ucOOf6q7EJCppQIdC0lZSXkgHJAFU5HGSvEXSzvnVeW2RHW86ziQ==" }, "node_modules/@cspell/dict-sql": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.0.tgz", - "integrity": "sha512-Bb+TNWUrTNNABO0bmfcYXiTlSt0RD6sB2MIY+rNlaMyIwug43jUjeYmkLz2tPkn3+2uvySeFEOMVYhMVfcuDKg==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.2.1.tgz", + "integrity": "sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg==" }, "node_modules/@cspell/dict-svelte": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.2.tgz", - "integrity": "sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.7.tgz", + "integrity": "sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ==" }, "node_modules/@cspell/dict-swift": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.1.tgz", - "integrity": "sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.6.tgz", + "integrity": "sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA==" + }, + "node_modules/@cspell/dict-terraform": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.1.3.tgz", + "integrity": "sha512-gr6wxCydwSFyyBKhBA2xkENXtVFToheqYYGFvlMZXWjviynXmh+NK/JTvTCk/VHk3+lzbO9EEQKee6VjrAUSbA==" }, "node_modules/@cspell/dict-typescript": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.1.tgz", - "integrity": "sha512-N9vNJZoOXmmrFPR4ir3rGvnqqwmQGgOYoL1+y6D4oIhyr7FhaYiyF/d7QT61RmjZQcATMa6PSL+ZisCeRLx9+A==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", + "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==" }, "node_modules/@cspell/dict-vue": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.0.tgz", - "integrity": "sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.5.tgz", + "integrity": "sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA==" + }, + "node_modules/@cspell/dict-zig": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-zig/-/dict-zig-1.0.0.tgz", + "integrity": "sha512-XibBIxBlVosU06+M6uHWkFeT0/pW5WajDRYdXG2CgHnq85b0TI/Ks0FuBJykmsgi2CAD3Qtx8UHFEtl/DSFnAQ==" }, "node_modules/@cspell/dynamic-import": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-6.31.1.tgz", - "integrity": "sha512-uliIUv9uZlnyYmjUlcw/Dm3p0xJOEnWJNczHAfqAl4Ytg6QZktw0GtUA9b1umbRXLv0KRTPtSC6nMq3cR7rRmQ==", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-9.6.3.tgz", + "integrity": "sha512-J2RArbv02H0fZCZxfGe2RjhEBFrcBlWgEESh2kDdF3CyoXBoPneevS5L3X4dk2XpOR0LU6bCJEsVIuzJqoFDbw==", "dependencies": { - "import-meta-resolve": "^2.2.2" + "@cspell/url": "9.6.3", + "import-meta-resolve": "^4.2.0" }, "engines": { - "node": ">=14" + "node": ">=20" } }, - "node_modules/@cspell/strong-weak-map": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-6.31.1.tgz", - "integrity": "sha512-z8AuWvUuSnugFKJOA9Ke0aiFuehcqLFqia9bk8XaQNEWr44ahPVn3sEWnAncTxPbpWuUw5UajoJa0egRAE1CCg==", + "node_modules/@cspell/filetypes": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-9.6.3.tgz", + "integrity": "sha512-FocAActFpUanhQblokOQYlsV3yt3xC6FNMnziGURG9f1a5LYPGwmb6v40qkkhsTwK8L9L7Ai1KRtPJ3zyowNCA==", "engines": { - "node": ">=14.6" + "node": ">=20" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "node_modules/@cspell/rpc": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/rpc/-/rpc-9.6.3.tgz", + "integrity": "sha512-D8ouhYPOZR11CI66GKsFu/05sSTSjxwfyUsTZ0m7lQOcILxkJ0P/y4DJ9HffFT6uY62mEbxDeibvlfCLBzWO4w==", "engines": { - "node": ">= 8" + "node": ">=20.18" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@cspell/strong-weak-map": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-9.6.3.tgz", + "integrity": "sha512-2OmE4RCSJG1mAfVsZqEvThJaQY//rYjDBycHfb1pfLb3KlV+O5jNKlYrI6E/+JpiTb1cI9MnzIRw6uzTPgCN1g==", "engines": { - "node": ">= 8" + "node": ">=20" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "node_modules/@cspell/url": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/url/-/url-9.6.3.tgz", + "integrity": "sha512-k+o5Dp8Hp8mjex8Lpe9m9B4LsrMoEzAaaYfvagUPQW1BKPwi3ugkH9YkC7uUOvzD6hOWq77WJZ2t946zY2NDSg==", "engines": { - "node": ">= 8" + "node": ">=20" } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, "node_modules/array-timsort": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==" }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -538,18 +521,30 @@ } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", + "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "chalk": "^5.2.0" }, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, "node_modules/clear-module": { @@ -567,264 +562,211 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/comment-json": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", - "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.5.1.tgz", + "integrity": "sha512-taEtr3ozUmOB7it68Jll7s0Pwm+aoiHyXKrEC8SEodL4rNpdfDLqa7PfBlrgFoCNNdR8ImL+muti5IGvktJAAg==", "dependencies": { "array-timsort": "^1.0.3", "core-util-is": "^1.0.3", - "esprima": "^4.0.1", - "has-own-prop": "^2.0.0", - "repeat-string": "^1.6.1" + "esprima": "^4.0.1" }, "engines": { "node": ">= 6" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "node_modules/cosmiconfig": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", - "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, "node_modules/cspell": { - "version": "6.31.2", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.31.2.tgz", - "integrity": "sha512-HJcQ8jqL/1N3Mj5dufFnIZCX3ACuRoFTSVY6h3Bo5wBqd2iiJTyeQ1SY9Zymlxtb2KyJ6jQRiFmkWeFx2HVs7w==", - "dependencies": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1", - "@cspell/dynamic-import": "6.31.1", - "chalk": "^4.1.2", - "commander": "^10.0.0", - "cspell-gitignore": "6.31.2", - "cspell-glob": "6.31.2", - "cspell-io": "6.31.2", - "cspell-lib": "6.31.2", - "fast-glob": "^3.2.12", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-9.6.3.tgz", + "integrity": "sha512-eGfq/qCJXDNLtqvwo3RFOJ8ECQD45NSEqlEdxJPdMlu/MA7YXSm4QptkJTybdodZmQpIGNpAz8UtVjKwhseqZg==", + "dependencies": { + "@cspell/cspell-json-reporter": "9.6.3", + "@cspell/cspell-performance-monitor": "9.6.3", + "@cspell/cspell-pipe": "9.6.3", + "@cspell/cspell-types": "9.6.3", + "@cspell/cspell-worker": "9.6.3", + "@cspell/dynamic-import": "9.6.3", + "@cspell/url": "9.6.3", + "ansi-regex": "^6.2.2", + "chalk": "^5.6.2", + "chalk-template": "^1.1.2", + "commander": "^14.0.3", + "cspell-config-lib": "9.6.3", + "cspell-dictionary": "9.6.3", + "cspell-gitignore": "9.6.3", + "cspell-glob": "9.6.3", + "cspell-io": "9.6.3", + "cspell-lib": "9.6.3", "fast-json-stable-stringify": "^2.1.0", - "file-entry-cache": "^6.0.1", - "get-stdin": "^8.0.0", - "imurmurhash": "^0.1.4", - "semver": "^7.3.8", - "strip-ansi": "^6.0.1", - "vscode-uri": "^3.0.7" + "flatted": "^3.3.3", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15" }, "bin": { - "cspell": "bin.js", + "cspell": "bin.mjs", "cspell-esm": "bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=20.18" }, "funding": { "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" } }, + "node_modules/cspell-config-lib": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-9.6.3.tgz", + "integrity": "sha512-gQnpAzyf7rPaIb2hjVDtkvfhNc+7hAeHjK+RFAHj7fXiMfdPOWMxnl5IZBOdd9aYHZzVbxYkeyvJbLwF4M3YSg==", + "dependencies": { + "@cspell/cspell-types": "9.6.3", + "comment-json": "^4.5.1", + "smol-toml": "^1.6.0", + "yaml": "^2.8.2" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/cspell-dictionary": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-6.31.1.tgz", - "integrity": "sha512-7+K7aQGarqbpucky26wled7QSCJeg6VkLUWS+hLjyf0Cqc9Zew5xsLa4QjReExWUJx+a97jbiflITZNuWxgMrg==", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-9.6.3.tgz", + "integrity": "sha512-y5te3Wu89WIdUYPYqMKUliviFxSu7xImuEacct6f2XFQd2c4G9vNduRMJjHKJT49cwkRM/fZKtOzJyPy8jzQ4g==", "dependencies": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1", - "cspell-trie-lib": "6.31.1", - "fast-equals": "^4.0.3", - "gensequence": "^5.0.2" + "@cspell/cspell-performance-monitor": "9.6.3", + "@cspell/cspell-pipe": "9.6.3", + "@cspell/cspell-types": "9.6.3", + "cspell-trie-lib": "9.6.3", + "fast-equals": "^6.0.0" }, "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/cspell-gitignore": { - "version": "6.31.2", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.31.2.tgz", - "integrity": "sha512-B1i8aiXCIbb/08u0K3xnDyXtg0qD+lb5B2itOOXi7KXlPkKvIuN4hWyXxhVDweWyYWEzyXD5wBpPrqICVrStHQ==", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-9.6.3.tgz", + "integrity": "sha512-S6XAddSjGEP7opCfEkhWaTnNVCI8ypdyZWgOW/gUW3VMpq8zK7OJ/ddyOLUCIMW1Qwtkx7X4Mf06xJSBWEjKjQ==", "dependencies": { - "cspell-glob": "6.31.2", - "find-up": "^5.0.0" + "@cspell/url": "9.6.3", + "cspell-glob": "9.6.3", + "cspell-io": "9.6.3" }, "bin": { "cspell-gitignore": "bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/cspell-glob": { - "version": "6.31.2", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.31.2.tgz", - "integrity": "sha512-ceTjHM4HaBgvG5S3oiB+PTPYq58EQYG6MmYpycDHzpR5I2H1NurK9lxWHfANmLbi0DsHn58tIZNDMUnnQj19Jw==", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-9.6.3.tgz", + "integrity": "sha512-tcyQP0LXoAEExVzWZMxW4afyo7w/8nea0wskoWQ4G+k36Gk6P52CARARFymHCH4IZLbbybZuLoVDxQ6OgIm3fQ==", "dependencies": { - "micromatch": "^4.0.5" + "@cspell/url": "9.6.3", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/cspell-grammar": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.31.1.tgz", - "integrity": "sha512-AsRVP0idcNFVSb9+p9XjMumFj3BUV67WIPWApaAzJl/dYyiIygQObRE+si0/QtFWGNw873b7hNhWZiKjqIdoaQ==", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-9.6.3.tgz", + "integrity": "sha512-26Pn/zo9hY3/5hGkM4tpV/Nnn4Op1J0DGnA34vA/lDBGtDOFexUEcUHZOieuNtCvZO735ltZPrP3zVxts1CwRg==", "dependencies": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1" + "@cspell/cspell-pipe": "9.6.3", + "@cspell/cspell-types": "9.6.3" }, "bin": { "cspell-grammar": "bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/cspell-io": { - "version": "6.31.2", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.31.2.tgz", - "integrity": "sha512-Lp7LsF/f35LaOneROb/9mWiprShz2ONxjYFAt3bYP7gIxq41lWi8QhO+SN6spoqPp/wQXjSqJ7MuTZsemxPRnA==", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-9.6.3.tgz", + "integrity": "sha512-dZYowJVTWPEjik3y/UrJnX/3PG20N1jgnP//lwX6cLGtHjv05W89lnHxsh5Suzxf3mkN/YZ1JUgmxdjj9HduNw==", "dependencies": { - "@cspell/cspell-service-bus": "6.31.1", - "node-fetch": "^2.6.9" + "@cspell/cspell-service-bus": "9.6.3", + "@cspell/url": "9.6.3" }, "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/cspell-lib": { - "version": "6.31.2", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.31.2.tgz", - "integrity": "sha512-LqaB2ZfVfQHKL5aZzYoKU6/UxxAtWeXAYwpC9l+satXmajYyXtAh4kWmuW+y7kKRH2jA79rJQS3QE6ToeSqgQQ==", - "dependencies": { - "@cspell/cspell-bundled-dicts": "6.31.2", - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1", - "@cspell/strong-weak-map": "6.31.1", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-9.6.3.tgz", + "integrity": "sha512-LFZsCWJX5EjcD0EzF/tb9Sx1d/nKEW6436EDqqb5u/Vxr86LxgX9RbhwkHI7e0XyX3YV64QzPrYGvEkXEuGsCQ==", + "dependencies": { + "@cspell/cspell-bundled-dicts": "9.6.3", + "@cspell/cspell-performance-monitor": "9.6.3", + "@cspell/cspell-pipe": "9.6.3", + "@cspell/cspell-resolver": "9.6.3", + "@cspell/cspell-types": "9.6.3", + "@cspell/dynamic-import": "9.6.3", + "@cspell/filetypes": "9.6.3", + "@cspell/rpc": "9.6.3", + "@cspell/strong-weak-map": "9.6.3", + "@cspell/url": "9.6.3", "clear-module": "^4.1.2", - "comment-json": "^4.2.3", - "configstore": "^5.0.1", - "cosmiconfig": "8.0.0", - "cspell-dictionary": "6.31.1", - "cspell-glob": "6.31.2", - "cspell-grammar": "6.31.1", - "cspell-io": "6.31.2", - "cspell-trie-lib": "6.31.1", - "fast-equals": "^4.0.3", - "find-up": "^5.0.0", - "gensequence": "^5.0.2", - "import-fresh": "^3.3.0", + "cspell-config-lib": "9.6.3", + "cspell-dictionary": "9.6.3", + "cspell-glob": "9.6.3", + "cspell-grammar": "9.6.3", + "cspell-io": "9.6.3", + "cspell-trie-lib": "9.6.3", + "env-paths": "^4.0.0", + "gensequence": "^8.0.8", + "import-fresh": "^3.3.1", "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0", - "vscode-languageserver-textdocument": "^1.0.8", - "vscode-uri": "^3.0.7" + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-uri": "^3.1.0", + "xdg-basedir": "^5.1.0" }, "engines": { - "node": ">=14.6" + "node": ">=20" } }, "node_modules/cspell-trie-lib": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.31.1.tgz", - "integrity": "sha512-MtYh7s4Sbr1rKT31P2BK6KY+YfOy3dWsuusq9HnqCXmq6aZ1HyFgjH/9p9uvqGi/TboMqn1KOV8nifhXK3l3jg==", - "dependencies": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1", - "gensequence": "^5.0.2" - }, + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-9.6.3.tgz", + "integrity": "sha512-bTlL3UjcBJyQXx67RMFcgHh0AXKd2w6Zw8iZkAcU7KVgAgRpGwCiF3LJLHignnMm+Pn8D3Xrx0raENaMh4uGaQ==", "engines": { - "node": ">=14" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" + "node": ">=20" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@cspell/cspell-types": "9.6.3" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/env-paths": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-4.0.0.tgz", + "integrity": "sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw==", "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "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==", + "is-safe-filename": "^0.1.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/esprima": { @@ -840,23 +782,11 @@ } }, "node_modules/fast-equals": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", - "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==" - }, - "node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-6.0.0.tgz", + "integrity": "sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA==", "engines": { - "node": ">=8.6.0" + "node": ">=6.0.0" } }, "node_modules/fast-json-stable-stringify": { @@ -864,158 +794,55 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC" }, "node_modules/gensequence": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-5.0.2.tgz", - "integrity": "sha512-JlKEZnFc6neaeSVlkzBGGgkIoIaSxMgvdamRoPN8r3ozm2r9dusqxeKqYQ7lhzmj2UhFQP8nkyfCaiLQxiLrDA==", + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-8.0.8.tgz", + "integrity": "sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==", "engines": { - "node": ">=14" - } - }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=20" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "ini": "4.1.1" }, "engines": { - "node": "*" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-own-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", - "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -1047,243 +874,31 @@ } }, "node_modules/import-meta-resolve": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.2.tgz", - "integrity": "sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "engines": { - "node": ">=0.8.19" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/is-safe-filename": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-safe-filename/-/is-safe-filename-0.1.1.tgz", + "integrity": "sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parent-module": { @@ -1297,85 +912,18 @@ "node": ">=8" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -1384,69 +932,11 @@ "node": ">=8" } }, - "node_modules/resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dependencies": { - "global-dirs": "^0.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -1454,602 +944,537 @@ "node": ">=10" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "node_modules/smol-toml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" + "node": ">= 18" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/cyyynthia" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" + "node": ">=12.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==" }, "node_modules/vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==" }, "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">=10" + "node": ">= 14.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/eemeli" } } }, "dependencies": { - "@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "@cspell/cspell-bundled-dicts": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.6.3.tgz", + "integrity": "sha512-0Ibx+ynlSd8wMAoUmc2Ck4SDN27eJheM45aCmCvCA8saROwkDh7j8zBz7aTTUTtFN+pcotJoNxr71LLD+KXhgQ==", "requires": { - "@babel/highlight": "^7.22.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" - }, - "@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "@cspell/dict-ada": "^4.1.1", + "@cspell/dict-al": "^1.1.1", + "@cspell/dict-aws": "^4.0.17", + "@cspell/dict-bash": "^4.2.2", + "@cspell/dict-companies": "^3.2.10", + "@cspell/dict-cpp": "^7.0.2", + "@cspell/dict-cryptocurrencies": "^5.0.5", + "@cspell/dict-csharp": "^4.0.8", + "@cspell/dict-css": "^4.0.19", + "@cspell/dict-dart": "^2.3.2", + "@cspell/dict-data-science": "^2.0.13", + "@cspell/dict-django": "^4.1.6", + "@cspell/dict-docker": "^1.1.17", + "@cspell/dict-dotnet": "^5.0.11", + "@cspell/dict-elixir": "^4.0.8", + "@cspell/dict-en_us": "^4.4.28", + "@cspell/dict-en-common-misspellings": "^2.1.12", + "@cspell/dict-en-gb-mit": "^3.1.17", + "@cspell/dict-filetypes": "^3.0.15", + "@cspell/dict-flutter": "^1.1.1", + "@cspell/dict-fonts": "^4.0.5", + "@cspell/dict-fsharp": "^1.1.1", + "@cspell/dict-fullstack": "^3.2.8", + "@cspell/dict-gaming-terms": "^1.1.2", + "@cspell/dict-git": "^3.1.0", + "@cspell/dict-golang": "^6.0.26", + "@cspell/dict-google": "^1.0.9", + "@cspell/dict-haskell": "^4.0.6", + "@cspell/dict-html": "^4.0.14", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-java": "^5.0.12", + "@cspell/dict-julia": "^1.1.1", + "@cspell/dict-k8s": "^1.0.12", + "@cspell/dict-kotlin": "^1.1.1", + "@cspell/dict-latex": "^5.0.0", + "@cspell/dict-lorem-ipsum": "^4.0.5", + "@cspell/dict-lua": "^4.0.8", + "@cspell/dict-makefile": "^1.0.5", + "@cspell/dict-markdown": "^2.0.14", + "@cspell/dict-monkeyc": "^1.0.12", + "@cspell/dict-node": "^5.0.9", + "@cspell/dict-npm": "^5.2.32", + "@cspell/dict-php": "^4.1.1", + "@cspell/dict-powershell": "^5.0.15", + "@cspell/dict-public-licenses": "^2.0.15", + "@cspell/dict-python": "^4.2.25", + "@cspell/dict-r": "^2.1.1", + "@cspell/dict-ruby": "^5.1.0", + "@cspell/dict-rust": "^4.1.2", + "@cspell/dict-scala": "^5.0.9", + "@cspell/dict-shell": "^1.1.2", + "@cspell/dict-software-terms": "^5.1.20", + "@cspell/dict-sql": "^2.2.1", + "@cspell/dict-svelte": "^1.0.7", + "@cspell/dict-swift": "^2.0.6", + "@cspell/dict-terraform": "^1.1.3", + "@cspell/dict-typescript": "^3.2.3", + "@cspell/dict-vue": "^3.0.5", + "@cspell/dict-zig": "^1.0.0" + } + }, + "@cspell/cspell-json-reporter": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-9.6.3.tgz", + "integrity": "sha512-4jhqXKGCFAQXomtk4/Ldy/GiGEocC61v8GISiUgn1mH+HPgEvkJijyxKRNFYvzXOoJr4y0KrkGBoKk5FI7cipw==", "requires": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "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==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } + "@cspell/cspell-types": "9.6.3" } }, - "@cspell/cspell-bundled-dicts": { - "version": "6.31.2", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.31.2.tgz", - "integrity": "sha512-rQ5y/U1Ah5AaduIh3NU2z371hRrOr1cmNdhhP8oiuz2E4VqmcoVHflXIct9DgY8uIJpwsSCdR6ypOQWZYXYnwA==", - "requires": { - "@cspell/dict-ada": "^4.0.1", - "@cspell/dict-aws": "^3.0.0", - "@cspell/dict-bash": "^4.1.1", - "@cspell/dict-companies": "^3.0.9", - "@cspell/dict-cpp": "^5.0.2", - "@cspell/dict-cryptocurrencies": "^3.0.1", - "@cspell/dict-csharp": "^4.0.2", - "@cspell/dict-css": "^4.0.5", - "@cspell/dict-dart": "^2.0.2", - "@cspell/dict-django": "^4.0.2", - "@cspell/dict-docker": "^1.1.6", - "@cspell/dict-dotnet": "^5.0.0", - "@cspell/dict-elixir": "^4.0.2", - "@cspell/dict-en_us": "^4.3.2", - "@cspell/dict-en-common-misspellings": "^1.0.2", - "@cspell/dict-en-gb": "1.1.33", - "@cspell/dict-filetypes": "^3.0.0", - "@cspell/dict-fonts": "^3.0.2", - "@cspell/dict-fullstack": "^3.1.5", - "@cspell/dict-gaming-terms": "^1.0.4", - "@cspell/dict-git": "^2.0.0", - "@cspell/dict-golang": "^6.0.1", - "@cspell/dict-haskell": "^4.0.1", - "@cspell/dict-html": "^4.0.3", - "@cspell/dict-html-symbol-entities": "^4.0.0", - "@cspell/dict-java": "^5.0.5", - "@cspell/dict-k8s": "^1.0.1", - "@cspell/dict-latex": "^4.0.0", - "@cspell/dict-lorem-ipsum": "^3.0.0", - "@cspell/dict-lua": "^4.0.1", - "@cspell/dict-node": "^4.0.2", - "@cspell/dict-npm": "^5.0.5", - "@cspell/dict-php": "^4.0.1", - "@cspell/dict-powershell": "^5.0.1", - "@cspell/dict-public-licenses": "^2.0.2", - "@cspell/dict-python": "^4.0.2", - "@cspell/dict-r": "^2.0.1", - "@cspell/dict-ruby": "^5.0.0", - "@cspell/dict-rust": "^4.0.1", - "@cspell/dict-scala": "^5.0.0", - "@cspell/dict-software-terms": "^3.1.6", - "@cspell/dict-sql": "^2.1.0", - "@cspell/dict-svelte": "^1.0.2", - "@cspell/dict-swift": "^2.0.1", - "@cspell/dict-typescript": "^3.1.1", - "@cspell/dict-vue": "^3.0.0" - } + "@cspell/cspell-performance-monitor": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-performance-monitor/-/cspell-performance-monitor-9.6.3.tgz", + "integrity": "sha512-Y1I0wg7MUTouubREyPeTJe2dKNbBZPBnd6kDNcVet5DRZ3Cck2udS9m1a6DhJO2sGQgHTBULPDBEUU5tcAZ+nQ==" }, "@cspell/cspell-pipe": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.31.1.tgz", - "integrity": "sha512-zk1olZi4dr6GLm5PAjvsiZ01HURNSruUYFl1qSicGnTwYN8GaN4RhAwannAytcJ7zJPIcyXlid0YsB58nJf3wQ==" + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.6.3.tgz", + "integrity": "sha512-Q0M58JbgHWOOOYvSyBodEysXLP5t8Q58Ff08msj2/XxRFpowR4iIUyfg3k+/d06uyOy89l+RD5AmyTEa5410xg==" + }, + "@cspell/cspell-resolver": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.6.3.tgz", + "integrity": "sha512-yUMTC8vl+LeRcIeXRrxn0GXL+rurf4OR3uyqZbG6bbtuttvq/Icleeibv9Wts+n700HLp+sVXJ7BrCn0Ehobsw==", + "requires": { + "global-directory": "^4.0.1" + } }, "@cspell/cspell-service-bus": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.31.1.tgz", - "integrity": "sha512-YyBicmJyZ1uwKVxujXw7sgs9x+Eps43OkWmCtDZmZlnq489HdTSuhF1kTbVi2yeFSeaXIS87+uHo12z97KkQpg==" + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.6.3.tgz", + "integrity": "sha512-gDUDq0PcMcdSG/5HwaQzkptn29E0zCWJUqmP0W/4scSC80AVh/8hgws4tuqv1GWvr4MiBZhIbUEO4f3Pc58OYQ==" }, "@cspell/cspell-types": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.31.1.tgz", - "integrity": "sha512-1KeTQFiHMssW1eRoF2NZIEg4gPVIfXLsL2+VSD/AV6YN7lBcuf6gRRgV5KWYarhxtEfjxhDdDTmu26l/iJEUtw==" + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.6.3.tgz", + "integrity": "sha512-oDTzZ2kG/jJk3TaupESUckDraGJbBpRBEW1xgTrWyIU+uGwdmMXPcGr9XZq9dRS5Zxm01nTgLwxpVM/3BVTvWQ==" + }, + "@cspell/cspell-worker": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-worker/-/cspell-worker-9.6.3.tgz", + "integrity": "sha512-zZccf1jLSrqIvlYAqwnnBi4RrLVfSEfWT4eYpiyIzHXHMzWnkUXEstQCG6LFK4L9A44M/w9s8szi7R4DLBzKsA==", + "requires": { + "cspell-lib": "9.6.3" + } }, "@cspell/dict-ada": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.0.1.tgz", - "integrity": "sha512-/E9o3nHrXOhYmQE43deKbxZcR3MIJAsa+66IzP9TXGHheKEx8b9dVMVVqydDDH8oom1H0U20NRPtu6KRVbT9xw==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.1.1.tgz", + "integrity": "sha512-E+0YW9RhZod/9Qy2gxfNZiHJjCYFlCdI69br1eviQQWB8yOTJX0JHXLs79kOYhSW0kINPVUdvddEBe6Lu6CjGQ==" + }, + "@cspell/dict-al": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-al/-/dict-al-1.1.1.tgz", + "integrity": "sha512-sD8GCaZetgQL4+MaJLXqbzWcRjfKVp8x+px3HuCaaiATAAtvjwUQ5/Iubiqwfd1boIh2Y1/3EgM3TLQ7Q8e0wQ==" }, "@cspell/dict-aws": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-3.0.0.tgz", - "integrity": "sha512-O1W6nd5y3Z00AMXQMzfiYrIJ1sTd9fB1oLr+xf/UD7b3xeHeMeYE2OtcWbt9uyeHim4tk+vkSTcmYEBKJgS5bQ==" + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.17.tgz", + "integrity": "sha512-ORcblTWcdlGjIbWrgKF+8CNEBQiLVKdUOFoTn0KPNkAYnFcdPP0muT4892h7H4Xafh3j72wqB4/loQ6Nti9E/w==" }, "@cspell/dict-bash": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.1.tgz", - "integrity": "sha512-8czAa/Mh96wu2xr0RXQEGMTBUGkTvYn/Pb0o+gqOO1YW+poXGQc3gx0YPqILDryP/KCERrNvkWUJz3iGbvwC2A==" + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.2.2.tgz", + "integrity": "sha512-kyWbwtX3TsCf5l49gGQIZkRLaB/P8g73GDRm41Zu8Mv51kjl2H7Au0TsEvHv7jzcsRLS6aUYaZv6Zsvk1fOz+Q==", + "requires": { + "@cspell/dict-shell": "1.1.2" + } }, "@cspell/dict-companies": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.17.tgz", - "integrity": "sha512-vo1jbozgZWSzz2evIL26kLd35tVb+5kW/UTvTzAwaWutSWRloRyKx38nj2CaLJ2IFxBdiATteCFGTzKCvJJl6A==" + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.2.10.tgz", + "integrity": "sha512-bJ1qnO1DkTn7JYGXvxp8FRQc4yq6tRXnrII+jbP8hHmq5TX5o1Wu+rdfpoUQaMWTl6balRvcMYiINDesnpR9Bw==" }, "@cspell/dict-cpp": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.3.tgz", - "integrity": "sha512-7sx/RFsf0hB3q8chx8OHYl9Kd+g0pqA1laphwaAQ+/jPwoAreYT3kNQWbJ3bIt/rMoORetFSQxckSbaJXwwqpw==" + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-7.0.2.tgz", + "integrity": "sha512-dfbeERiVNeqmo/npivdR6rDiBCqZi3QtjH2Z0HFcXwpdj6i97dX1xaKyK2GUsO/p4u1TOv63Dmj5Vm48haDpuA==" }, "@cspell/dict-cryptocurrencies": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-3.0.1.tgz", - "integrity": "sha512-Tdlr0Ahpp5yxtwM0ukC13V6+uYCI0p9fCRGMGZt36rWv8JQZHIuHfehNl7FB/Qc09NCF7p5ep0GXbL+sVTd/+w==" + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.5.tgz", + "integrity": "sha512-R68hYYF/rtlE6T/dsObStzN5QZw+0aQBinAXuWCVqwdS7YZo0X33vGMfChkHaiCo3Z2+bkegqHlqxZF4TD3rUA==" }, "@cspell/dict-csharp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.2.tgz", - "integrity": "sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==" + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.8.tgz", + "integrity": "sha512-qmk45pKFHSxckl5mSlbHxmDitSsGMlk/XzFgt7emeTJWLNSTUK//MbYAkBNRtfzB4uD7pAFiKgpKgtJrTMRnrQ==" }, "@cspell/dict-css": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.6.tgz", - "integrity": "sha512-2Lo8W2ezHmGgY8cWFr4RUwnjbndna5mokpCK/DuxGILQnuajR0J31ANQOXj/8iZM2phFB93ZzMNk/0c04TDfSQ==" + "version": "4.0.19", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.19.tgz", + "integrity": "sha512-VYHtPnZt/Zd/ATbW3rtexWpBnHUohUrQOHff/2JBhsVgxOrksAxJnLAO43Q1ayLJBJUUwNVo+RU0sx0aaysZfg==" }, "@cspell/dict-dart": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.0.2.tgz", - "integrity": "sha512-jigcODm7Z4IFZ4vParwwP3IT0fIgRq/9VoxkXfrxBMsLBGGM2QltHBj7pl+joX+c4cOHxfyZktGJK1B1wFtR4Q==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.3.2.tgz", + "integrity": "sha512-sUiLW56t9gfZcu8iR/5EUg+KYyRD83Cjl3yjDEA2ApVuJvK1HhX+vn4e4k4YfjpUQMag8XO2AaRhARE09+/rqw==" }, "@cspell/dict-data-science": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-1.0.7.tgz", - "integrity": "sha512-Q9VUFaarUpqM6CAmR8peP4o9alk0XQ4rgVoE2R2XalpC2cqPI8Hmg6QwMU2UPioSUcWMJCqLc/KzJti0gBMuxA==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.13.tgz", + "integrity": "sha512-l1HMEhBJkPmw4I2YGVu2eBSKM89K9pVF+N6qIr5Uo5H3O979jVodtuwP8I7LyPrJnC6nz28oxeGRCLh9xC5CVA==" }, "@cspell/dict-django": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.0.tgz", - "integrity": "sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==" + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.6.tgz", + "integrity": "sha512-SdbSFDGy9ulETqNz15oWv2+kpWLlk8DJYd573xhIkeRdcXOjskRuxjSZPKfW7O3NxN/KEf3gm3IevVOiNuFS+w==" }, "@cspell/dict-docker": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.6.tgz", - "integrity": "sha512-zCCiRTZ6EOQpBnSOm0/3rnKW1kCcAUDUA7SxJG3SuH6iZvKi3I8FEg8+O83WQUeXg0SyPNerD9F40JLnnJjJig==" + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.17.tgz", + "integrity": "sha512-OcnVTIpHIYYKhztNTyK8ShAnXTfnqs43hVH6p0py0wlcwRIXe5uj4f12n7zPf2CeBI7JAlPjEsV0Rlf4hbz/xQ==" }, "@cspell/dict-dotnet": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.0.tgz", - "integrity": "sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw==" + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.11.tgz", + "integrity": "sha512-LSVKhpFf/ASTWJcfYeS0Sykcl1gVMsv2Z5Eo0TnTMSTLV3738HH+66pIsjUTChqU6SF3gKPuCe6EOaRYqb/evA==" }, "@cspell/dict-elixir": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.3.tgz", - "integrity": "sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==" + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.8.tgz", + "integrity": "sha512-CyfphrbMyl4Ms55Vzuj+mNmd693HjBFr9hvU+B2YbFEZprE5AG+EXLYTMRWrXbpds4AuZcvN3deM2XVB80BN/Q==" }, "@cspell/dict-en_us": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.4.tgz", - "integrity": "sha512-mR2yqWmFip1zTKja2SqyVMbzuqEThqkEJk9M32bMDziPJpEyOIPvLA0UPmj3cyRKJkRuVF0bhDCE33O+at38hw==" + "version": "4.4.28", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.28.tgz", + "integrity": "sha512-/rzhbZaZDsDWmXbc9Fmmr4/ngmaNcG2b+TGT+ZjGqpOXVQYI75yZ9+XduyI43xJ5O38QcX3QIbJY5GWaJqxPEg==" }, "@cspell/dict-en-common-misspellings": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-1.0.2.tgz", - "integrity": "sha512-jg7ZQZpZH7+aAxNBlcAG4tGhYF6Ksy+QS5Df73Oo+XyckBjC9QS+PrRwLTeYoFIgXy5j3ICParK5r3MSSoL4gw==" + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.12.tgz", + "integrity": "sha512-14Eu6QGqyksqOd4fYPuRb58lK1Va7FQK9XxFsRKnZU8LhL3N+kj7YKDW+7aIaAN/0WGEqslGP6lGbQzNti8Akw==" }, - "@cspell/dict-en-gb": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz", - "integrity": "sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==" + "@cspell/dict-en-gb-mit": { + "version": "3.1.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.17.tgz", + "integrity": "sha512-MLx+3XN9rj+EGwLIFmh0gpEDNalCyQqjcszp+WkedCHcvTCzQgWXQMZK6cPuhO/OKYyW9GOwsx4t0wjU5tRVNg==" }, "@cspell/dict-filetypes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.1.tgz", - "integrity": "sha512-8z8mY1IbrTyTRumx2vvD9yzRhNMk9SajM/GtI5hdMM2pPpNSp25bnuauzjRf300eqlqPY2MNb5MmhBFO014DJw==" + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.15.tgz", + "integrity": "sha512-uDMeqYlLlK476w/muEFQGBy9BdQWS0mQ7BJiy/iQv5XUWZxE2O54ZQd9nW8GyQMzAgoyg5SG4hf9l039Qt66oA==" + }, + "@cspell/dict-flutter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-flutter/-/dict-flutter-1.1.1.tgz", + "integrity": "sha512-UlOzRcH2tNbFhZmHJN48Za/2/MEdRHl2BMkCWZBYs+30b91mWvBfzaN4IJQU7dUZtowKayVIF9FzvLZtZokc5A==" }, "@cspell/dict-fonts": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-3.0.2.tgz", - "integrity": "sha512-Z5QdbgEI7DV+KPXrAeDA6dDm/vTzyaW53SGlKqz6PI5VhkOjgkBXv3YtZjnxMZ4dY2ZIqq+RUK6qa9Pi8rQdGQ==" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.5.tgz", + "integrity": "sha512-BbpkX10DUX/xzHs6lb7yzDf/LPjwYIBJHJlUXSBXDtK/1HaeS+Wqol4Mlm2+NAgZ7ikIE5DQMViTgBUY3ezNoQ==" + }, + "@cspell/dict-fsharp": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.1.1.tgz", + "integrity": "sha512-imhs0u87wEA4/cYjgzS0tAyaJpwG7vwtC8UyMFbwpmtw+/bgss+osNfyqhYRyS/ehVCWL17Ewx2UPkexjKyaBA==" }, "@cspell/dict-fullstack": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.1.5.tgz", - "integrity": "sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA==" + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.2.8.tgz", + "integrity": "sha512-J6EeoeThvx/DFrcA2rJiCA6vfqwJMbkG0IcXhlsmRZmasIpanmxgt90OEaUazbZahFiuJT8wrhgQ1QgD1MsqBw==" }, "@cspell/dict-gaming-terms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.0.4.tgz", - "integrity": "sha512-hbDduNXlk4AOY0wFxcDMWBPpm34rpqJBeqaySeoUH70eKxpxm+dvjpoRLJgyu0TmymEICCQSl6lAHTHSDiWKZg==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.1.2.tgz", + "integrity": "sha512-9XnOvaoTBscq0xuD6KTEIkk9hhdfBkkvJAIsvw3JMcnp1214OCGW8+kako5RqQ2vTZR3Tnf3pc57o7VgkM0q1Q==" }, "@cspell/dict-git": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-2.0.0.tgz", - "integrity": "sha512-n1AxyX5Kgxij/sZFkxFJlzn3K9y/sCcgVPg/vz4WNJ4K9YeTsUmyGLA2OQI7d10GJeiuAo2AP1iZf2A8j9aj2w==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-3.1.0.tgz", + "integrity": "sha512-KEt9zGkxqGy2q1nwH4CbyqTSv5nadpn8BAlDnzlRcnL0Xb3LX9xTgSGShKvzb0bw35lHoYyLWN2ZKAqbC4pgGQ==" }, "@cspell/dict-golang": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.2.tgz", - "integrity": "sha512-5pyZn4AAiYukAW+gVMIMVmUSkIERFrDX2vtPDjg8PLQUhAHWiVeQSDjuOhq9/C5GCCEZU/zWSONkGiwLBBvV9A==" + "version": "6.0.26", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.26.tgz", + "integrity": "sha512-YKA7Xm5KeOd14v5SQ4ll6afe9VSy3a2DWM7L9uBq4u3lXToRBQ1W5PRa+/Q9udd+DTURyVVnQ+7b9cnOlNxaRg==" + }, + "@cspell/dict-google": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-google/-/dict-google-1.0.9.tgz", + "integrity": "sha512-biL65POqialY0i4g6crj7pR6JnBkbsPovB2WDYkj3H4TuC/QXv7Pu5pdPxeUJA6TSCHI7T5twsO4VSVyRxD9CA==" }, "@cspell/dict-haskell": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.1.tgz", - "integrity": "sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==" + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.6.tgz", + "integrity": "sha512-ib8SA5qgftExpYNjWhpYIgvDsZ/0wvKKxSP+kuSkkak520iPvTJumEpIE+qPcmJQo4NzdKMN8nEfaeci4OcFAQ==" }, "@cspell/dict-html": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.3.tgz", - "integrity": "sha512-Gae8i8rrArT0UyG1I6DHDK62b7Be6QEcBSIeWOm4VIIW1CASkN9B0qFgSVnkmfvnu1Y3H7SSaaEynKjdj3cs8w==" + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.14.tgz", + "integrity": "sha512-2bf7n+kS92g+cMKV0wr9o/Oq9n8JzU7CcrB96gIh2GHgnF+0xDOqO2W/1KeFAqOfqosoOVE48t+4dnEMkkoJ2Q==" }, "@cspell/dict-html-symbol-entities": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.0.tgz", - "integrity": "sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.5.tgz", + "integrity": "sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA==" }, "@cspell/dict-java": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.5.tgz", - "integrity": "sha512-X19AoJgWIBwJBSWGFqSgHaBR/FEykBHTMjL6EqOnhIGEyE9nvuo32tsSHjXNJ230fQxQptEvRZoaldNLtKxsRg==" + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.12.tgz", + "integrity": "sha512-qPSNhTcl7LGJ5Qp6VN71H8zqvRQK04S08T67knMq9hTA8U7G1sTKzLmBaDOFhq17vNX/+rT+rbRYp+B5Nwza1A==" + }, + "@cspell/dict-julia": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-julia/-/dict-julia-1.1.1.tgz", + "integrity": "sha512-WylJR9TQ2cgwd5BWEOfdO3zvDB+L7kYFm0I9u0s9jKHWQ6yKmfKeMjU9oXxTBxIufhCXm92SKwwVNAC7gjv+yA==" }, "@cspell/dict-k8s": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.1.tgz", - "integrity": "sha512-gc5y4Nm3hVdMZNBZfU2M1AsAmObZsRWjCUk01NFPfGhFBXyVne41T7E62rpnzu5330FV/6b/TnFcPgRmak9lLw==" + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.12.tgz", + "integrity": "sha512-2LcllTWgaTfYC7DmkMPOn9GsBWsA4DZdlun4po8s2ysTP7CPEnZc1ZfK6pZ2eI4TsZemlUQQ+NZxMe9/QutQxg==" + }, + "@cspell/dict-kotlin": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-kotlin/-/dict-kotlin-1.1.1.tgz", + "integrity": "sha512-J3NzzfgmxRvEeOe3qUXnSJQCd38i/dpF9/t3quuWh6gXM+krsAXP75dY1CzDmS8mrJAlBdVBeAW5eAZTD8g86Q==" }, "@cspell/dict-latex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.0.tgz", - "integrity": "sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-5.0.0.tgz", + "integrity": "sha512-HUrIqUVohM6P0+5b7BsdAdb0STIv0aaFBvguI7pLcreljlcX3FSPUxea7ticzNlCNeVrEaiEn/ws9m6rYUeuNw==" }, "@cspell/dict-lorem-ipsum": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-3.0.0.tgz", - "integrity": "sha512-msEV24qEpzWZs2kcEicqYlhyBpR0amfDkJOs+iffC07si9ftqtQ+yP3lf1VFLpgqw3SQh1M1vtU7RD4sPrNlcQ==" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.5.tgz", + "integrity": "sha512-9a4TJYRcPWPBKkQAJ/whCu4uCAEgv/O2xAaZEI0n4y1/l18Yyx8pBKoIX5QuVXjjmKEkK7hi5SxyIsH7pFEK9Q==" }, "@cspell/dict-lua": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.1.tgz", - "integrity": "sha512-j0MFmeCouSoC6EdZTbvGe1sJ9V+ruwKSeF+zRkNNNload7R72Co5kX1haW2xLHGdlq0kqSy1ODRZKdVl0e+7hg==" + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.8.tgz", + "integrity": "sha512-N4PkgNDMu9JVsRu7JBS/3E/dvfItRgk9w5ga2dKq+JupP2Y3lojNaAVFhXISh4Y0a6qXDn2clA6nvnavQ/jjLA==" + }, + "@cspell/dict-makefile": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-makefile/-/dict-makefile-1.0.5.tgz", + "integrity": "sha512-4vrVt7bGiK8Rx98tfRbYo42Xo2IstJkAF4tLLDMNQLkQ86msDlYSKG1ZCk8Abg+EdNcFAjNhXIiNO+w4KflGAQ==" + }, + "@cspell/dict-markdown": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@cspell/dict-markdown/-/dict-markdown-2.0.14.tgz", + "integrity": "sha512-uLKPNJsUcumMQTsZZgAK9RgDLyQhUz/uvbQTEkvF/Q4XfC1i/BnA8XrOrd0+Vp6+tPOKyA+omI5LRWfMu5K/Lw==", + "requires": {} + }, + "@cspell/dict-monkeyc": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.12.tgz", + "integrity": "sha512-MN7Vs11TdP5mbdNFQP5x2Ac8zOBm97ARg6zM5Sb53YQt/eMvXOMvrep7+/+8NJXs0jkp70bBzjqU4APcqBFNAw==" }, "@cspell/dict-node": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.2.tgz", - "integrity": "sha512-FEQJ4TnMcXEFslqBQkXa5HposMoCGsiBv2ux4IZuIXgadXeHKHUHk60iarWpjhzNzQLyN2GD7NoRMd12bK3Llw==" + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-5.0.9.tgz", + "integrity": "sha512-hO+ga+uYZ/WA4OtiMEyKt5rDUlUyu3nXMf8KVEeqq2msYvAPdldKBGH7lGONg6R/rPhv53Rb+0Y1SLdoK1+7wQ==" }, "@cspell/dict-npm": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.7.tgz", - "integrity": "sha512-6SegF0HsVaBTl6PlHjeErG8Av+tRYkUG1yaXUQIGWXU0A8oxhI0o4PuL65UWH5lkCKhJyGai69Cd0iytL0oVFg==" + "version": "5.2.32", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.32.tgz", + "integrity": "sha512-H0XD0eg4d96vevle8VUKVoPhsgsw003ByJ47XzipyiMKoQTZ2IAUW+VTkQq8wU1floarNjmThQJOoKL9J4UYuw==" }, "@cspell/dict-php": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.1.tgz", - "integrity": "sha512-XaQ/JkSyq2c07MfRG54DjLi2CV+HHwS99DDCAao9Fq2JfkWroTQsUeek7wYZXJATrJVOULoV3HKih12x905AtQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.1.1.tgz", + "integrity": "sha512-EXelI+4AftmdIGtA8HL8kr4WlUE11OqCSVlnIgZekmTkEGSZdYnkFdiJ5IANSALtlQ1mghKjz+OFqVs6yowgWA==" }, "@cspell/dict-powershell": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.2.tgz", - "integrity": "sha512-IHfWLme3FXE7vnOmMncSBxOsMTdNWd1Vcyhag03WS8oANSgX8IZ+4lMI00mF0ptlgchf16/OU8WsV4pZfikEFw==" + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.15.tgz", + "integrity": "sha512-l4S5PAcvCFcVDMJShrYD0X6Huv9dcsQPlsVsBGbH38wvuN7gS7+GxZFAjTNxDmTY1wrNi1cCatSg6Pu2BW4rgg==" }, "@cspell/dict-public-licenses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.2.tgz", - "integrity": "sha512-baKkbs/WGEV2lCWZoL0KBPh3uiPcul5GSDwmXEBAsR5McEW52LF94/b7xWM0EmSAc/y8ODc5LnPYC7RDRLi6LQ==" + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.15.tgz", + "integrity": "sha512-cJEOs901H13Pfy0fl4dCD1U+xpWIMaEPq8MeYU83FfDZvellAuSo4GqWCripfIqlhns/L6+UZEIJSOZnjgy7Wg==" }, "@cspell/dict-python": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.2.tgz", - "integrity": "sha512-Whcn4K8R0Ux/hcx/P9Fbx6i29GwTaXgT3LTt95AuCnV5RRLrzsqoyZkz851hcg5z4kjUQVMduDl3HECGgW/FNw==", + "version": "4.2.25", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.25.tgz", + "integrity": "sha512-hDdN0YhKgpbtZVRjQ2c8jk+n0wQdidAKj1Fk8w7KEHb3YlY5uPJ0mAKJk7AJKPNLOlILoUmN+HAVJz+cfSbWYg==", "requires": { - "@cspell/dict-data-science": "^1.0.0" + "@cspell/dict-data-science": "^2.0.13" } }, "@cspell/dict-r": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.0.1.tgz", - "integrity": "sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.1.1.tgz", + "integrity": "sha512-71Ka+yKfG4ZHEMEmDxc6+blFkeTTvgKbKAbwiwQAuKl3zpqs1Y0vUtwW2N4b3LgmSPhV3ODVY0y4m5ofqDuKMw==" }, "@cspell/dict-ruby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.0.tgz", - "integrity": "sha512-ssb96QxLZ76yPqFrikWxItnCbUKhYXJ2owkoIYzUGNFl2CHSoHCb5a6Zetum9mQ/oUA3gNeUhd28ZUlXs0la2A==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.1.0.tgz", + "integrity": "sha512-9PJQB3cfkBULrMLp5kSAcFPpzf8oz9vFN+QYZABhQwWkGbuzCIXSorHrmWSASlx4yejt3brjaWS57zZ/YL5ZQQ==" }, "@cspell/dict-rust": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.0.1.tgz", - "integrity": "sha512-xJSSzHDK2z6lSVaOmMxl3PTOtfoffaxMo7fTcbZUF+SCJzfKbO6vnN9TCGX2sx1RHFDz66Js6goz6SAZQdOwaw==" + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.1.2.tgz", + "integrity": "sha512-O1FHrumYcO+HZti3dHfBPUdnDFkI+nbYK3pxYmiM1sr+G0ebOd6qchmswS0Wsc6ZdEVNiPYJY/gZQR6jfW3uOg==" }, "@cspell/dict-scala": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.0.tgz", - "integrity": "sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ==" + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.9.tgz", + "integrity": "sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg==" + }, + "@cspell/dict-shell": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-shell/-/dict-shell-1.1.2.tgz", + "integrity": "sha512-WqOUvnwcHK1X61wAfwyXq04cn7KYyskg90j4lLg3sGGKMW9Sq13hs91pqrjC44Q+lQLgCobrTkMDw9Wyl9nRFA==" }, "@cspell/dict-software-terms": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.0.tgz", - "integrity": "sha512-RI6sv4Bc4i42YH/ofVelv8lXpJRhCyS9IhI2BtejUoMXKhKA9gC01ATXOylx+oaQmj3t5ark4R50xKFRvC7ENA==" + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.1.20.tgz", + "integrity": "sha512-TEk1xHvetTI4pv7Vzje1D322m6QEjaH2P6ucOOf6q7EJCppQIdC0lZSXkgHJAFU5HGSvEXSzvnVeW2RHW86ziQ==" }, "@cspell/dict-sql": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.0.tgz", - "integrity": "sha512-Bb+TNWUrTNNABO0bmfcYXiTlSt0RD6sB2MIY+rNlaMyIwug43jUjeYmkLz2tPkn3+2uvySeFEOMVYhMVfcuDKg==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.2.1.tgz", + "integrity": "sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg==" }, "@cspell/dict-svelte": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.2.tgz", - "integrity": "sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.7.tgz", + "integrity": "sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ==" }, "@cspell/dict-swift": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.1.tgz", - "integrity": "sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.6.tgz", + "integrity": "sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA==" + }, + "@cspell/dict-terraform": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.1.3.tgz", + "integrity": "sha512-gr6wxCydwSFyyBKhBA2xkENXtVFToheqYYGFvlMZXWjviynXmh+NK/JTvTCk/VHk3+lzbO9EEQKee6VjrAUSbA==" }, "@cspell/dict-typescript": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.1.tgz", - "integrity": "sha512-N9vNJZoOXmmrFPR4ir3rGvnqqwmQGgOYoL1+y6D4oIhyr7FhaYiyF/d7QT61RmjZQcATMa6PSL+ZisCeRLx9+A==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", + "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==" }, "@cspell/dict-vue": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.0.tgz", - "integrity": "sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.5.tgz", + "integrity": "sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA==" + }, + "@cspell/dict-zig": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-zig/-/dict-zig-1.0.0.tgz", + "integrity": "sha512-XibBIxBlVosU06+M6uHWkFeT0/pW5WajDRYdXG2CgHnq85b0TI/Ks0FuBJykmsgi2CAD3Qtx8UHFEtl/DSFnAQ==" }, "@cspell/dynamic-import": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-6.31.1.tgz", - "integrity": "sha512-uliIUv9uZlnyYmjUlcw/Dm3p0xJOEnWJNczHAfqAl4Ytg6QZktw0GtUA9b1umbRXLv0KRTPtSC6nMq3cR7rRmQ==", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-9.6.3.tgz", + "integrity": "sha512-J2RArbv02H0fZCZxfGe2RjhEBFrcBlWgEESh2kDdF3CyoXBoPneevS5L3X4dk2XpOR0LU6bCJEsVIuzJqoFDbw==", "requires": { - "import-meta-resolve": "^2.2.2" + "@cspell/url": "9.6.3", + "import-meta-resolve": "^4.2.0" } }, - "@cspell/strong-weak-map": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-6.31.1.tgz", - "integrity": "sha512-z8AuWvUuSnugFKJOA9Ke0aiFuehcqLFqia9bk8XaQNEWr44ahPVn3sEWnAncTxPbpWuUw5UajoJa0egRAE1CCg==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } + "@cspell/filetypes": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-9.6.3.tgz", + "integrity": "sha512-FocAActFpUanhQblokOQYlsV3yt3xC6FNMnziGURG9f1a5LYPGwmb6v40qkkhsTwK8L9L7Ai1KRtPJ3zyowNCA==" }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + "@cspell/rpc": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/rpc/-/rpc-9.6.3.tgz", + "integrity": "sha512-D8ouhYPOZR11CI66GKsFu/05sSTSjxwfyUsTZ0m7lQOcILxkJ0P/y4DJ9HffFT6uY62mEbxDeibvlfCLBzWO4w==" }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } + "@cspell/strong-weak-map": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-9.6.3.tgz", + "integrity": "sha512-2OmE4RCSJG1mAfVsZqEvThJaQY//rYjDBycHfb1pfLb3KlV+O5jNKlYrI6E/+JpiTb1cI9MnzIRw6uzTPgCN1g==" }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } + "@cspell/url": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/@cspell/url/-/url-9.6.3.tgz", + "integrity": "sha512-k+o5Dp8Hp8mjex8Lpe9m9B4LsrMoEzAaaYfvagUPQW1BKPwi3ugkH9YkC7uUOvzD6hOWq77WJZ2t946zY2NDSg==" }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" }, "array-timsort": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==" }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "requires": { - "fill-range": "^7.1.1" - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" + }, + "chalk-template": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", + "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "chalk": "^5.2.0" } }, "clear-module": { @@ -2061,52 +1486,19 @@ "resolve-from": "^5.0.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==" }, "comment-json": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", - "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.5.1.tgz", + "integrity": "sha512-taEtr3ozUmOB7it68Jll7s0Pwm+aoiHyXKrEC8SEodL4rNpdfDLqa7PfBlrgFoCNNdR8ImL+muti5IGvktJAAg==", "requires": { "array-timsort": "^1.0.3", "core-util-is": "^1.0.3", - "esprima": "^4.0.1", - "has-own-prop": "^2.0.0", - "repeat-string": "^1.6.1" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" + "esprima": "^4.0.1" } }, "core-util-is": { @@ -2114,289 +1506,182 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "cosmiconfig": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", - "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", + "cspell": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-9.6.3.tgz", + "integrity": "sha512-eGfq/qCJXDNLtqvwo3RFOJ8ECQD45NSEqlEdxJPdMlu/MA7YXSm4QptkJTybdodZmQpIGNpAz8UtVjKwhseqZg==", "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" + "@cspell/cspell-json-reporter": "9.6.3", + "@cspell/cspell-performance-monitor": "9.6.3", + "@cspell/cspell-pipe": "9.6.3", + "@cspell/cspell-types": "9.6.3", + "@cspell/cspell-worker": "9.6.3", + "@cspell/dynamic-import": "9.6.3", + "@cspell/url": "9.6.3", + "ansi-regex": "^6.2.2", + "chalk": "^5.6.2", + "chalk-template": "^1.1.2", + "commander": "^14.0.3", + "cspell-config-lib": "9.6.3", + "cspell-dictionary": "9.6.3", + "cspell-gitignore": "9.6.3", + "cspell-glob": "9.6.3", + "cspell-io": "9.6.3", + "cspell-lib": "9.6.3", + "fast-json-stable-stringify": "^2.1.0", + "flatted": "^3.3.3", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - }, - "cspell": { - "version": "6.31.2", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.31.2.tgz", - "integrity": "sha512-HJcQ8jqL/1N3Mj5dufFnIZCX3ACuRoFTSVY6h3Bo5wBqd2iiJTyeQ1SY9Zymlxtb2KyJ6jQRiFmkWeFx2HVs7w==", + "cspell-config-lib": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-9.6.3.tgz", + "integrity": "sha512-gQnpAzyf7rPaIb2hjVDtkvfhNc+7hAeHjK+RFAHj7fXiMfdPOWMxnl5IZBOdd9aYHZzVbxYkeyvJbLwF4M3YSg==", "requires": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1", - "@cspell/dynamic-import": "6.31.1", - "chalk": "^4.1.2", - "commander": "^10.0.0", - "cspell-gitignore": "6.31.2", - "cspell-glob": "6.31.2", - "cspell-io": "6.31.2", - "cspell-lib": "6.31.2", - "fast-glob": "^3.2.12", - "fast-json-stable-stringify": "^2.1.0", - "file-entry-cache": "^6.0.1", - "get-stdin": "^8.0.0", - "imurmurhash": "^0.1.4", - "semver": "^7.3.8", - "strip-ansi": "^6.0.1", - "vscode-uri": "^3.0.7" + "@cspell/cspell-types": "9.6.3", + "comment-json": "^4.5.1", + "smol-toml": "^1.6.0", + "yaml": "^2.8.2" } }, "cspell-dictionary": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-6.31.1.tgz", - "integrity": "sha512-7+K7aQGarqbpucky26wled7QSCJeg6VkLUWS+hLjyf0Cqc9Zew5xsLa4QjReExWUJx+a97jbiflITZNuWxgMrg==", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-9.6.3.tgz", + "integrity": "sha512-y5te3Wu89WIdUYPYqMKUliviFxSu7xImuEacct6f2XFQd2c4G9vNduRMJjHKJT49cwkRM/fZKtOzJyPy8jzQ4g==", "requires": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1", - "cspell-trie-lib": "6.31.1", - "fast-equals": "^4.0.3", - "gensequence": "^5.0.2" + "@cspell/cspell-performance-monitor": "9.6.3", + "@cspell/cspell-pipe": "9.6.3", + "@cspell/cspell-types": "9.6.3", + "cspell-trie-lib": "9.6.3", + "fast-equals": "^6.0.0" } }, "cspell-gitignore": { - "version": "6.31.2", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.31.2.tgz", - "integrity": "sha512-B1i8aiXCIbb/08u0K3xnDyXtg0qD+lb5B2itOOXi7KXlPkKvIuN4hWyXxhVDweWyYWEzyXD5wBpPrqICVrStHQ==", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-9.6.3.tgz", + "integrity": "sha512-S6XAddSjGEP7opCfEkhWaTnNVCI8ypdyZWgOW/gUW3VMpq8zK7OJ/ddyOLUCIMW1Qwtkx7X4Mf06xJSBWEjKjQ==", "requires": { - "cspell-glob": "6.31.2", - "find-up": "^5.0.0" + "@cspell/url": "9.6.3", + "cspell-glob": "9.6.3", + "cspell-io": "9.6.3" } }, "cspell-glob": { - "version": "6.31.2", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.31.2.tgz", - "integrity": "sha512-ceTjHM4HaBgvG5S3oiB+PTPYq58EQYG6MmYpycDHzpR5I2H1NurK9lxWHfANmLbi0DsHn58tIZNDMUnnQj19Jw==", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-9.6.3.tgz", + "integrity": "sha512-tcyQP0LXoAEExVzWZMxW4afyo7w/8nea0wskoWQ4G+k36Gk6P52CARARFymHCH4IZLbbybZuLoVDxQ6OgIm3fQ==", "requires": { - "micromatch": "^4.0.5" + "@cspell/url": "9.6.3", + "picomatch": "^4.0.3" } }, "cspell-grammar": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.31.1.tgz", - "integrity": "sha512-AsRVP0idcNFVSb9+p9XjMumFj3BUV67WIPWApaAzJl/dYyiIygQObRE+si0/QtFWGNw873b7hNhWZiKjqIdoaQ==", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-9.6.3.tgz", + "integrity": "sha512-26Pn/zo9hY3/5hGkM4tpV/Nnn4Op1J0DGnA34vA/lDBGtDOFexUEcUHZOieuNtCvZO735ltZPrP3zVxts1CwRg==", "requires": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1" + "@cspell/cspell-pipe": "9.6.3", + "@cspell/cspell-types": "9.6.3" } }, "cspell-io": { - "version": "6.31.2", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.31.2.tgz", - "integrity": "sha512-Lp7LsF/f35LaOneROb/9mWiprShz2ONxjYFAt3bYP7gIxq41lWi8QhO+SN6spoqPp/wQXjSqJ7MuTZsemxPRnA==", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-9.6.3.tgz", + "integrity": "sha512-dZYowJVTWPEjik3y/UrJnX/3PG20N1jgnP//lwX6cLGtHjv05W89lnHxsh5Suzxf3mkN/YZ1JUgmxdjj9HduNw==", "requires": { - "@cspell/cspell-service-bus": "6.31.1", - "node-fetch": "^2.6.9" + "@cspell/cspell-service-bus": "9.6.3", + "@cspell/url": "9.6.3" } }, "cspell-lib": { - "version": "6.31.2", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.31.2.tgz", - "integrity": "sha512-LqaB2ZfVfQHKL5aZzYoKU6/UxxAtWeXAYwpC9l+satXmajYyXtAh4kWmuW+y7kKRH2jA79rJQS3QE6ToeSqgQQ==", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-9.6.3.tgz", + "integrity": "sha512-LFZsCWJX5EjcD0EzF/tb9Sx1d/nKEW6436EDqqb5u/Vxr86LxgX9RbhwkHI7e0XyX3YV64QzPrYGvEkXEuGsCQ==", "requires": { - "@cspell/cspell-bundled-dicts": "6.31.2", - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1", - "@cspell/strong-weak-map": "6.31.1", + "@cspell/cspell-bundled-dicts": "9.6.3", + "@cspell/cspell-performance-monitor": "9.6.3", + "@cspell/cspell-pipe": "9.6.3", + "@cspell/cspell-resolver": "9.6.3", + "@cspell/cspell-types": "9.6.3", + "@cspell/dynamic-import": "9.6.3", + "@cspell/filetypes": "9.6.3", + "@cspell/rpc": "9.6.3", + "@cspell/strong-weak-map": "9.6.3", + "@cspell/url": "9.6.3", "clear-module": "^4.1.2", - "comment-json": "^4.2.3", - "configstore": "^5.0.1", - "cosmiconfig": "8.0.0", - "cspell-dictionary": "6.31.1", - "cspell-glob": "6.31.2", - "cspell-grammar": "6.31.1", - "cspell-io": "6.31.2", - "cspell-trie-lib": "6.31.1", - "fast-equals": "^4.0.3", - "find-up": "^5.0.0", - "gensequence": "^5.0.2", - "import-fresh": "^3.3.0", + "cspell-config-lib": "9.6.3", + "cspell-dictionary": "9.6.3", + "cspell-glob": "9.6.3", + "cspell-grammar": "9.6.3", + "cspell-io": "9.6.3", + "cspell-trie-lib": "9.6.3", + "env-paths": "^4.0.0", + "gensequence": "^8.0.8", + "import-fresh": "^3.3.1", "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0", - "vscode-languageserver-textdocument": "^1.0.8", - "vscode-uri": "^3.0.7" + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-uri": "^3.1.0", + "xdg-basedir": "^5.1.0" } }, "cspell-trie-lib": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.31.1.tgz", - "integrity": "sha512-MtYh7s4Sbr1rKT31P2BK6KY+YfOy3dWsuusq9HnqCXmq6aZ1HyFgjH/9p9uvqGi/TboMqn1KOV8nifhXK3l3jg==", - "requires": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1", - "gensequence": "^5.0.2" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-9.6.3.tgz", + "integrity": "sha512-bTlL3UjcBJyQXx67RMFcgHh0AXKd2w6Zw8iZkAcU7KVgAgRpGwCiF3LJLHignnMm+Pn8D3Xrx0raENaMh4uGaQ==", + "requires": {} }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "env-paths": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-4.0.0.tgz", + "integrity": "sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw==", "requires": { - "is-arrayish": "^0.2.1" + "is-safe-filename": "^0.1.0" } }, - "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==" - }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "fast-equals": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", - "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==" - }, - "fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-6.0.0.tgz", + "integrity": "sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA==" }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } + "fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "requires": {} }, "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" }, "gensequence": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-5.0.2.tgz", - "integrity": "sha512-JlKEZnFc6neaeSVlkzBGGgkIoIaSxMgvdamRoPN8r3ozm2r9dusqxeKqYQ7lhzmj2UhFQP8nkyfCaiLQxiLrDA==" - }, - "get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==" - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-8.0.8.tgz", + "integrity": "sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==" }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", "requires": { - "ini": "^1.3.4" + "ini": "4.1.1" } }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-own-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", - "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==" - }, "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2418,174 +1703,19 @@ } }, "import-meta-resolve": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.2.tgz", - "integrity": "sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==" }, "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==" }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } + "is-safe-filename": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-safe-filename/-/is-safe-filename-0.1.1.tgz", + "integrity": "sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==" }, "parent-module": { "version": "2.0.0", @@ -2595,193 +1725,54 @@ "callsites": "^3.1.0" } }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" }, - "resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "requires": { - "global-dirs": "^0.1.1" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==" + }, + "smol-toml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==" + }, + "tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "requires": { - "lru-cache": "^6.0.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { - "crypto-random-string": "^2.0.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" } }, "vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==" }, "vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==" }, "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==" + }, + "yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==" } } } diff --git a/eng/common/spelling/package.json b/eng/common/spelling/package.json index 533d8c809301..11e19df811cc 100644 --- a/eng/common/spelling/package.json +++ b/eng/common/spelling/package.json @@ -1,10 +1,7 @@ { "name": "cspell-version-pin", - "version": "0.1.1", + "version": "1.0.0", "dependencies": { - "@cspell/cspell-bundled-dicts": "^6.12.0", - "@cspell/cspell-types": "^6.12.0", - "cspell": "^6.12.0", - "cspell-lib": "^6.12.0" + "cspell": "^9.6.3" } } diff --git a/eng/common/testproxy/target_version.txt b/eng/common/testproxy/target_version.txt index 977b480f4fd3..3b2404bfbb0d 100644 --- a/eng/common/testproxy/target_version.txt +++ b/eng/common/testproxy/target_version.txt @@ -1 +1 @@ -1.0.0-dev.20250501.1 +1.0.0-dev.20260128.1 diff --git a/eng/common/tsp-client/README.md b/eng/common/tsp-client/README.md new file mode 100644 index 000000000000..6f88d536c9e2 --- /dev/null +++ b/eng/common/tsp-client/README.md @@ -0,0 +1,82 @@ +# TypeSpec Client Generator CLI + +This directory contains npm package definitions for `@azure-tools/typespec-client-generator-cli` (tsp-client) with pinned versions to ensure reproducible builds across environments. + +## Files + +- **`package.json`** - npm package definition with pinned tsp-client version +- **`package-lock.json`** - Lock file ensuring exact dependency versions + +## Prerequisites + +- **Node.js** (with npm) - Required to install and run tsp-client + +## Installation + +### Install dependencies + +```bash +# Navigate to this directory +cd eng/common/tsp-client + +# Install dependencies +npm ci +``` + +## Usage + +After installation, you can run `tsp-client` using `npm exec --prefix {path_to_the_eng/common/tsp-client}`. +Note that you should *not* navigate into the `eng/common/tsp-client` folder, since several `tsp-client` commands require the current working directory to be the client library's root. + +```bash +# Set the tsp-client directory path relative to your current working directory +_TspClientDir=eng/common/tsp-client + +# Get help +npm exec --prefix ${_TspClientDir} --no -- tsp-client --help + +# Check version +npm exec --prefix ${_TspClientDir} --no -- tsp-client version + +# Generate client code +npm exec --prefix ${_TspClientDir} --no -- tsp-client generate --output-dir ./generated + +# Initialize a new project +npm exec --prefix ${_TspClientDir} --no -- tsp-client init --tsp-config ./tspconfig.yaml +``` + +## CI/CD Best Practices + +```bash +_TspClientDir=eng/common/tsp-client +npm ci --prefix ${_TspClientDir} +npm exec --prefix ${_TspClientDir} --no -- tsp-client init --update-if-exists --tsp-config https://github.com/Azure/azure-rest-api-specs/blob/dee71463cbde1d416c47cf544e34f7966a94ddcb/specification/contosowidgetmanager/Contoso.WidgetManager/tspconfig.yaml +``` + +## Package Management + +### Automatic Updates via Dependabot + +Dependabot is configured to automatically check for updates to `@azure-tools/typespec-client-generator-cli` daily and create pull requests with updated `package.json` and `package-lock.json` files. This ensures the package stays current with the latest versions while maintaining security through the PR review process. + +### Manual Version Updates + +If you need to manually update the tsp-client version: + +1. Edit `package.json` to update the version: + + ```json + { + "dependencies": { + "@azure-tools/typespec-client-generator-cli": "0.28.1" + } + } + ``` + +2. Update the lock file: + + ```bash + npm install + ``` + +3. Commit both `package.json` and `package-lock.json` diff --git a/eng/common/tsp-client/package.json b/eng/common/tsp-client/package.json new file mode 100644 index 000000000000..290f69672cf1 --- /dev/null +++ b/eng/common/tsp-client/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@azure-tools/typespec-client-generator-cli": "0.31.0" + } +}