From 05abb2c77d5a072c439dee118f5541bbb48bcb97 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Mon, 15 Dec 2025 14:30:51 +0800 Subject: [PATCH 01/21] add arrayEncode to Property --- .../http-client-java/emitter/src/code-model-builder.ts | 4 ++++ packages/http-client-java/emitter/src/common/client.ts | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/packages/http-client-java/emitter/src/code-model-builder.ts b/packages/http-client-java/emitter/src/code-model-builder.ts index fe0d0c6ddcd..a022548a3ae 100644 --- a/packages/http-client-java/emitter/src/code-model-builder.ts +++ b/packages/http-client-java/emitter/src/code-model-builder.ts @@ -108,6 +108,7 @@ import { fail } from "assert"; import pkg from "lodash"; import { Client as CodeModelClient, + EncodedProperty, EncodedSchema, PageableContinuationToken, Serializable, @@ -2865,6 +2866,9 @@ export class CodeModelBuilder { serializedName: getPropertySerializedName(modelProperty), extensions: extensions, }); + if (modelProperty.encode) { + (codeModelProperty as EncodedProperty).arrayEncode = modelProperty.encode; + } // xml if (modelProperty.serializationOptions.xml) { diff --git a/packages/http-client-java/emitter/src/common/client.ts b/packages/http-client-java/emitter/src/common/client.ts index 193727115a0..0b055b93508 100644 --- a/packages/http-client-java/emitter/src/common/client.ts +++ b/packages/http-client-java/emitter/src/common/client.ts @@ -9,6 +9,7 @@ import { Security, } from "@autorest/codemodel"; import { DeepPartial } from "@azure-tools/codegen"; +import { ArrayKnownEncoding } from "@azure-tools/typespec-client-generator-core"; import { XmlSerializationFormat } from "./formats/xml.js"; export interface Client extends Aspect { @@ -103,6 +104,14 @@ export interface EncodedSchema { encode?: string; } +export interface EncodedProperty { + /** + * The encoding of array items. + * The type for SDK would "SdkArrayType" with a "valueType", the type on wire be "string". + */ + arrayEncode?: ArrayKnownEncoding; +} + export class PageableContinuationToken { /** * The parameter of the operation as continuationToken in API request. From b71290e3b478f78e04264be8e0d84c89e56592f3 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Mon, 15 Dec 2025 15:34:21 +0800 Subject: [PATCH 02/21] add ArrayEncoding --- .../emitter/src/code-model-builder.ts | 2 +- .../emitter/src/common/client.ts | 2 +- .../extension/model/codemodel/Property.java | 19 +++++++++ .../core/model/clientmodel/ArrayEncoding.java | 42 +++++++++++++++++++ .../clientmodel/ClientModelProperty.java | 20 ++++++++- 5 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ArrayEncoding.java diff --git a/packages/http-client-java/emitter/src/code-model-builder.ts b/packages/http-client-java/emitter/src/code-model-builder.ts index a022548a3ae..0fb99281050 100644 --- a/packages/http-client-java/emitter/src/code-model-builder.ts +++ b/packages/http-client-java/emitter/src/code-model-builder.ts @@ -2867,7 +2867,7 @@ export class CodeModelBuilder { extensions: extensions, }); if (modelProperty.encode) { - (codeModelProperty as EncodedProperty).arrayEncode = modelProperty.encode; + (codeModelProperty as EncodedProperty).arrayEncoding = modelProperty.encode; } // xml diff --git a/packages/http-client-java/emitter/src/common/client.ts b/packages/http-client-java/emitter/src/common/client.ts index 0b055b93508..d5d26f13963 100644 --- a/packages/http-client-java/emitter/src/common/client.ts +++ b/packages/http-client-java/emitter/src/common/client.ts @@ -109,7 +109,7 @@ export interface EncodedProperty { * The encoding of array items. * The type for SDK would "SdkArrayType" with a "valueType", the type on wire be "string". */ - arrayEncode?: ArrayKnownEncoding; + arrayEncoding?: ArrayKnownEncoding; } export class PageableContinuationToken { diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/extension/model/codemodel/Property.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/extension/model/codemodel/Property.java index 8bade836e7b..2248fcdf351 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/extension/model/codemodel/Property.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/extension/model/codemodel/Property.java @@ -18,6 +18,7 @@ public class Property extends Value { private String summary; // TypeSpec only private SerializationFormats serialization; + private String arrayEncoding; // internal use, not from modelerfour private ObjectSchema parentSchema; @@ -161,6 +162,24 @@ public void setSerialization(SerializationFormats serialization) { this.serialization = serialization; } + /** + * Gets the array encoding style of this property. + * + * @return The array encoding style of this property. + */ + public String getArrayEncoding() { + return arrayEncoding; + } + + /** + * Sets the array encoding style of this property. + * + * @param arrayEncoding The array encoding style of this property. + */ + public void setArrayEncoding(String arrayEncoding) { + this.arrayEncoding = arrayEncoding; + } + @Override public String getSummary() { return summary; diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ArrayEncoding.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ArrayEncoding.java new file mode 100644 index 00000000000..fa73dd38f52 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ArrayEncoding.java @@ -0,0 +1,42 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.typespec.http.client.generator.core.model.clientmodel; + +/** + * Known array encoding strategies supported by the generator. + */ +public enum ArrayEncoding { + PIPE_DELIMITED("pipeDelimited"), + SPACE_DELIMITED("spaceDelimited"), + COMMA_DELIMITED("commaDelimited"), + NEWLINE_DELIMITED("newlineDelimited"); + + private final String arrayEncoding; + + ArrayEncoding(String value) { + this.arrayEncoding = value; + } + + public String value() { + return this.arrayEncoding; + } + + @Override + public String toString() { + return this.value(); + } + + public static ArrayEncoding fromValue(String value) { + if (value == null) { + return null; + } + + for (ArrayEncoding v : values()) { + if (v.value().equalsIgnoreCase(value)) { + return v; + } + } + return null; + } +} diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientModelProperty.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientModelProperty.java index 8ef97bc3134..0bc39246b65 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientModelProperty.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ClientModelProperty.java @@ -91,6 +91,7 @@ public class ClientModelProperty implements ClientModelPropertyAccess { private final String xmlPrefix; private final Boolean requiredForCreate; + private final ArrayEncoding arrayEncoding; /** * Create a new ClientModelProperty with the provided properties. @@ -115,13 +116,16 @@ public class ClientModelProperty implements ClientModelPropertyAccess { * @param polymorphicDiscriminator Whether this property is a polymorphic discriminator. * @param isXmlText Whether this property uses the value of an XML tag. * @param xmlPrefix The prefix of the XML attribute or element this property represents. + * @param requiredForCreate Whether this property is required when create the resource. + * @param arrayEncoding The array encoding metadata of this property. */ private ClientModelProperty(String name, String description, String annotationArguments, boolean isXmlAttribute, String xmlName, String xmlNamespace, String serializedName, boolean isXmlWrapper, String xmlListElementName, String xmlListElementNamespace, String xmlListElementPrefix, IType wireType, IType clientType, boolean isConstant, String defaultValue, boolean isReadOnly, List mutabilities, boolean isRequired, String headerCollectionPrefix, boolean isAdditionalProperties, boolean needsFlatten, boolean clientFlatten, - boolean polymorphicDiscriminator, boolean isXmlText, String xmlPrefix, Boolean requiredForCreate) { + boolean polymorphicDiscriminator, boolean isXmlText, String xmlPrefix, Boolean requiredForCreate, + ArrayEncoding arrayEncoding) { this.name = name; this.description = description; this.annotationArguments = annotationArguments; @@ -148,6 +152,7 @@ private ClientModelProperty(String name, String description, String annotationAr this.isXmlText = isXmlText; this.xmlPrefix = xmlPrefix; this.requiredForCreate = requiredForCreate; + this.arrayEncoding = arrayEncoding; } public final String getName() { @@ -282,6 +287,10 @@ public boolean isRequiredForCreate() { return requiredForCreate == null ? this.isRequired() : requiredForCreate; } + public ArrayEncoding getArrayEncoding() { + return arrayEncoding; + } + /** * Add this ServiceModelProperty's imports to the provided set of imports. * @@ -393,6 +402,7 @@ public static class Builder { private boolean isXmlText = false; private String xmlPrefix; private Boolean requiredForCreate; + private ArrayEncoding arrayEncoding; /** * Sets the name of this property. @@ -684,6 +694,11 @@ public Builder xmlPrefix(String xmlPrefix) { return this; } + public Builder arrayEncoding(ArrayEncoding arrayEncoding) { + this.arrayEncoding = arrayEncoding; + return this; + } + /** * Creates a new instance of Builder. */ @@ -717,6 +732,7 @@ private Builder(ClientModelProperty property) { this.isXmlText = property.isXmlText(); this.xmlPrefix = property.getXmlPrefix(); this.requiredForCreate = property.requiredForCreate; + this.arrayEncoding = property.getArrayEncoding(); } public ClientModelProperty build() { @@ -724,7 +740,7 @@ public ClientModelProperty build() { xmlNamespace, serializedName, isXmlWrapper, xmlListElementName, xmlListElementNamespace, xmlListElementPrefix, wireType, clientType, isConstant, defaultValue, isReadOnly, mutabilities, isRequired, headerCollectionPrefix, isAdditionalProperties, needsFlatten, clientFlatten, - polymorphicDiscriminator, isXmlText, xmlPrefix, requiredForCreate); + polymorphicDiscriminator, isXmlText, xmlPrefix, requiredForCreate, arrayEncoding); } } } From 26bb1311b8132a9ee6a2e52fadbfb203019b753e Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Tue, 16 Dec 2025 12:48:05 +0800 Subject: [PATCH 03/21] support element type String --- .../core/mapper/ModelPropertyMapper.java | 6 +++ .../core/model/clientmodel/ArrayEncoding.java | 22 ++++++---- .../StreamSerializationModelTemplate.java | 42 ++++++++++++++++--- 3 files changed, 57 insertions(+), 13 deletions(-) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelPropertyMapper.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelPropertyMapper.java index c3b46ea1e23..44484d50143 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelPropertyMapper.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/mapper/ModelPropertyMapper.java @@ -10,6 +10,7 @@ import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.Schema; import com.microsoft.typespec.http.client.generator.core.extension.model.codemodel.XmlSerializationFormat; import com.microsoft.typespec.http.client.generator.core.extension.plugin.JavaSettings; +import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ArrayEncoding; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClassType; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.ClientModelProperty; import com.microsoft.typespec.http.client.generator.core.model.clientmodel.EnumType; @@ -242,6 +243,11 @@ public ClientModelProperty map(Property property, boolean mutableAsOptional) { builder.defaultValue(autoRestPropertyDefaultValueExpression); } + // array encoding + if (property.getArrayEncoding() != null) { + builder.arrayEncoding(ArrayEncoding.fromValue(property.getArrayEncoding())); + } + return builder.build(); } } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ArrayEncoding.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ArrayEncoding.java index fa73dd38f52..12b507bdfc6 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ArrayEncoding.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ArrayEncoding.java @@ -7,19 +7,25 @@ * Known array encoding strategies supported by the generator. */ public enum ArrayEncoding { - PIPE_DELIMITED("pipeDelimited"), - SPACE_DELIMITED("spaceDelimited"), - COMMA_DELIMITED("commaDelimited"), - NEWLINE_DELIMITED("newlineDelimited"); + PIPE_DELIMITED("pipeDelimited", "|"), + SPACE_DELIMITED("spaceDelimited", " "), + COMMA_DELIMITED("commaDelimited", ","), + NEWLINE_DELIMITED("newlineDelimited", "\\n"); - private final String arrayEncoding; + private final String value; + private final String delimiter; - ArrayEncoding(String value) { - this.arrayEncoding = value; + ArrayEncoding(String value, String delimiter) { + this.value = value; + this.delimiter = delimiter; } public String value() { - return this.arrayEncoding; + return this.value; + } + + public String getDelimiter() { + return this.delimiter; } @Override diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java index 65efe095082..4a74fd1dc72 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java @@ -29,10 +29,12 @@ import io.clientcore.core.utils.CoreUtils; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Base64; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -93,6 +95,9 @@ protected void addSerializationImports(Set imports, ClientModel model, J imports.add(Base64.class.getName()); imports.add(LinkedHashMap.class.getName()); imports.add(List.class.getName()); + imports.add(LinkedList.class.getName()); + imports.add(Arrays.class.getName()); + imports.add(Collectors.class.getName()); imports.add(Map.class.getName()); imports.add(Objects.class.getName()); } @@ -742,9 +747,21 @@ private void serializeJsonProperty(JavaBlock methodBlock, ClientModelProperty pr .line("jsonWriter.writeUntypedField(\"" + serializedName + "\", " + propertyValueGetter + ");"); } } else if (wireType instanceof IterableType) { - serializeJsonContainerProperty(methodBlock, "writeArrayField", wireType, - ((IterableType) wireType).getElementType(), serializedName, propertyValueGetter, 0, - isJsonMergePatch); + if (property.getArrayEncoding() == null) { + serializeJsonContainerProperty(methodBlock, "writeArrayField", wireType, + ((IterableType) wireType).getElementType(), serializedName, propertyValueGetter, 0, + isJsonMergePatch); + } else { + // wireType is String + // at present, only String element is supported + methodBlock.ifBlock(propertyValueGetter + " != null", ifBlock -> { + String serializeExpression = propertyValueGetter + + ".stream().map(element -> element == null ? \"\" : element).collect(Collectors.joining(\"" + + property.getArrayEncoding().getDelimiter() + "\"))"; + methodBlock.line("jsonWriter.writeStringField(\"%s\", %s);", serializedName, + serializeExpression); + }); + } } else if (wireType instanceof MapType) { // Assumption is that the key type for the Map is a String. This may not always hold true and when that // becomes reality this will need to be reworked to handle that case. @@ -1587,13 +1604,28 @@ private void generateJsonDeserializationLogic(JavaBlock deserializationBlock, Cl deserializationBlock.line(property.getName() + " = reader.readUntyped();"); } } else if (wireType instanceof IterableType) { + final String propertyStringVariableName = property.getName() + "EncodedAsString"; + if (property.getArrayEncoding() != null) { + // need to prepare the expression for propertyStringVariableName, + // to be used in "if (property.getArrayEncoding() == null)" block + deserializationBlock.line("String " + propertyStringVariableName + " = reader.getString();"); + } + if (!propertiesManager.hasConstructorArguments()) { deserializationBlock.text(property.getClientType() + " "); } deserializationBlock.text(property.getName() + " = "); - deserializeJsonContainerProperty(deserializationBlock, "readArray", wireType, - ((IterableType) wireType).getElementType(), ((IterableType) clientType).getElementType(), 0); + if (property.getArrayEncoding() == null) { + deserializeJsonContainerProperty(deserializationBlock, "readArray", wireType, + ((IterableType) wireType).getElementType(), ((IterableType) clientType).getElementType(), 0); + } else { + // wireType is String + // at present, only String element is supported + deserializationBlock.text(propertyStringVariableName + + " == null ? null : new LinkedList<>(Arrays.asList(" + propertyStringVariableName + ".split(\"" + + property.getArrayEncoding().getDelimiter() + "\")));"); + } if (!propertiesManager.hasConstructorArguments()) { handleSettingDeserializedValue(deserializationBlock, property, property.getName(), fromSuper); From 66f1c3aac50a427fb4a7f247f0564582ab889298 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Tue, 16 Dec 2025 12:57:14 +0800 Subject: [PATCH 04/21] regen --- .../array/models/CommaDelimitedArrayProperty.java | 13 +++++++++++-- .../array/models/NewlineDelimitedArrayProperty.java | 13 +++++++++++-- .../array/models/PipeDelimitedArrayProperty.java | 13 +++++++++++-- .../array/models/SpaceDelimitedArrayProperty.java | 13 +++++++++++-- 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/CommaDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/CommaDelimitedArrayProperty.java index 1e3a6406b61..a2a02e3faa8 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/CommaDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/CommaDelimitedArrayProperty.java @@ -11,7 +11,10 @@ import com.azure.json.JsonToken; import com.azure.json.JsonWriter; import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; /** * The CommaDelimitedArrayProperty model. @@ -51,7 +54,10 @@ public List getValue() { @Override public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); - jsonWriter.writeArrayField("value", this.value, (writer, element) -> writer.writeString(element)); + if (this.value != null) { + jsonWriter.writeStringField("value", + this.value.stream().map(element -> element == null ? "" : element).collect(Collectors.joining(","))); + } return jsonWriter.writeEndObject(); } @@ -73,7 +79,10 @@ public static CommaDelimitedArrayProperty fromJson(JsonReader jsonReader) throws reader.nextToken(); if ("value".equals(fieldName)) { - value = reader.readArray(reader1 -> reader1.getString()); + String valueEncodedAsString = reader.getString(); + value = valueEncodedAsString == null + ? null + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split(","))); } else { reader.skipChildren(); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/NewlineDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/NewlineDelimitedArrayProperty.java index 605c2f10f09..810c49ce703 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/NewlineDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/NewlineDelimitedArrayProperty.java @@ -11,7 +11,10 @@ import com.azure.json.JsonToken; import com.azure.json.JsonWriter; import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; /** * The NewlineDelimitedArrayProperty model. @@ -51,7 +54,10 @@ public List getValue() { @Override public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); - jsonWriter.writeArrayField("value", this.value, (writer, element) -> writer.writeString(element)); + if (this.value != null) { + jsonWriter.writeStringField("value", + this.value.stream().map(element -> element == null ? "" : element).collect(Collectors.joining("\n"))); + } return jsonWriter.writeEndObject(); } @@ -73,7 +79,10 @@ public static NewlineDelimitedArrayProperty fromJson(JsonReader jsonReader) thro reader.nextToken(); if ("value".equals(fieldName)) { - value = reader.readArray(reader1 -> reader1.getString()); + String valueEncodedAsString = reader.getString(); + value = valueEncodedAsString == null + ? null + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split("\n"))); } else { reader.skipChildren(); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/PipeDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/PipeDelimitedArrayProperty.java index 6f9b85082c1..69e07877020 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/PipeDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/PipeDelimitedArrayProperty.java @@ -11,7 +11,10 @@ import com.azure.json.JsonToken; import com.azure.json.JsonWriter; import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; /** * The PipeDelimitedArrayProperty model. @@ -51,7 +54,10 @@ public List getValue() { @Override public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); - jsonWriter.writeArrayField("value", this.value, (writer, element) -> writer.writeString(element)); + if (this.value != null) { + jsonWriter.writeStringField("value", + this.value.stream().map(element -> element == null ? "" : element).collect(Collectors.joining("|"))); + } return jsonWriter.writeEndObject(); } @@ -73,7 +79,10 @@ public static PipeDelimitedArrayProperty fromJson(JsonReader jsonReader) throws reader.nextToken(); if ("value".equals(fieldName)) { - value = reader.readArray(reader1 -> reader1.getString()); + String valueEncodedAsString = reader.getString(); + value = valueEncodedAsString == null + ? null + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split("|"))); } else { reader.skipChildren(); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/SpaceDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/SpaceDelimitedArrayProperty.java index 8a0d3181c2e..31be05d3faf 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/SpaceDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/SpaceDelimitedArrayProperty.java @@ -11,7 +11,10 @@ import com.azure.json.JsonToken; import com.azure.json.JsonWriter; import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; /** * The SpaceDelimitedArrayProperty model. @@ -51,7 +54,10 @@ public List getValue() { @Override public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); - jsonWriter.writeArrayField("value", this.value, (writer, element) -> writer.writeString(element)); + if (this.value != null) { + jsonWriter.writeStringField("value", + this.value.stream().map(element -> element == null ? "" : element).collect(Collectors.joining(" "))); + } return jsonWriter.writeEndObject(); } @@ -73,7 +79,10 @@ public static SpaceDelimitedArrayProperty fromJson(JsonReader jsonReader) throws reader.nextToken(); if ("value".equals(fieldName)) { - value = reader.readArray(reader1 -> reader1.getString()); + String valueEncodedAsString = reader.getString(); + value = valueEncodedAsString == null + ? null + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split(" "))); } else { reader.skipChildren(); } From 5b32626844ec4e6bd8ee749ede9d76362db57441 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Tue, 16 Dec 2025 13:07:58 +0800 Subject: [PATCH 05/21] test by agent --- .../java/encode/array/EncodeArrayTests.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArrayTests.java diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArrayTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArrayTests.java new file mode 100644 index 00000000000..3e45e1c1f56 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArrayTests.java @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package encode.array; + +import encode.array.models.CommaDelimitedArrayProperty; +import encode.array.models.NewlineDelimitedArrayProperty; +import encode.array.models.PipeDelimitedArrayProperty; +import encode.array.models.SpaceDelimitedArrayProperty; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public final class EncodeArrayTests { + + private static final List COLORS = List.of("blue", "red", "green"); + + private final ArrayClient client = new ArrayClientBuilder().buildClient(); + + @Test + public void commaDelimitedProperty() { + CommaDelimitedArrayProperty response = client.commaDelimited(new CommaDelimitedArrayProperty(COLORS)); + Assertions.assertEquals(COLORS, response.getValue()); + } + + @Test + public void spaceDelimitedProperty() { + SpaceDelimitedArrayProperty response = client.spaceDelimited(new SpaceDelimitedArrayProperty(COLORS)); + Assertions.assertEquals(COLORS, response.getValue()); + } + + @Test + public void pipeDelimitedProperty() { + PipeDelimitedArrayProperty response = client.pipeDelimited(new PipeDelimitedArrayProperty(COLORS)); + Assertions.assertEquals(COLORS, response.getValue()); + } + + @Test + public void newlineDelimitedProperty() { + NewlineDelimitedArrayProperty response = client.newlineDelimited(new NewlineDelimitedArrayProperty(COLORS)); + Assertions.assertEquals(COLORS, response.getValue()); + } +} From 03b85676858ded149ee1ad2aa59ed43b98ecbb90 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Tue, 16 Dec 2025 13:14:07 +0800 Subject: [PATCH 06/21] bug fix --- .../core/model/clientmodel/ArrayEncoding.java | 14 +++++++++++++- .../template/StreamSerializationModelTemplate.java | 2 +- .../array/models/PipeDelimitedArrayProperty.java | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ArrayEncoding.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ArrayEncoding.java index 12b507bdfc6..d26cbbf38e8 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ArrayEncoding.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/model/clientmodel/ArrayEncoding.java @@ -7,17 +7,25 @@ * Known array encoding strategies supported by the generator. */ public enum ArrayEncoding { - PIPE_DELIMITED("pipeDelimited", "|"), + PIPE_DELIMITED("pipeDelimited", "|", "\\\\|"), SPACE_DELIMITED("spaceDelimited", " "), COMMA_DELIMITED("commaDelimited", ","), NEWLINE_DELIMITED("newlineDelimited", "\\n"); private final String value; private final String delimiter; + private final String escapedDelimiter; ArrayEncoding(String value, String delimiter) { this.value = value; this.delimiter = delimiter; + this.escapedDelimiter = delimiter; + } + + ArrayEncoding(String value, String delimiter, String escapedDelimiter) { + this.value = value; + this.delimiter = delimiter; + this.escapedDelimiter = escapedDelimiter; } public String value() { @@ -28,6 +36,10 @@ public String getDelimiter() { return this.delimiter; } + public String getEscapedDelimiter() { + return escapedDelimiter; + } + @Override public String toString() { return this.value(); diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java index 4a74fd1dc72..dec7e5e532e 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java @@ -1624,7 +1624,7 @@ private void generateJsonDeserializationLogic(JavaBlock deserializationBlock, Cl // at present, only String element is supported deserializationBlock.text(propertyStringVariableName + " == null ? null : new LinkedList<>(Arrays.asList(" + propertyStringVariableName + ".split(\"" - + property.getArrayEncoding().getDelimiter() + "\")));"); + + property.getArrayEncoding().getEscapedDelimiter() + "\")));"); } if (!propertiesManager.hasConstructorArguments()) { diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/PipeDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/PipeDelimitedArrayProperty.java index 69e07877020..8f09acb5bb1 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/PipeDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/PipeDelimitedArrayProperty.java @@ -82,7 +82,7 @@ public static PipeDelimitedArrayProperty fromJson(JsonReader jsonReader) throws String valueEncodedAsString = reader.getString(); value = valueEncodedAsString == null ? null - : new LinkedList<>(Arrays.asList(valueEncodedAsString.split("|"))); + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split("\\|"))); } else { reader.skipChildren(); } From 441d8b3123ba09e1f271839e6e9e0625a07531de Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Tue, 16 Dec 2025 13:54:14 +0800 Subject: [PATCH 07/21] regen --- .../encode/array/CommaDelimitedArrayProperty.java | 13 +++++++++++-- .../encode/array/NewlineDelimitedArrayProperty.java | 13 +++++++++++-- .../encode/array/PipeDelimitedArrayProperty.java | 13 +++++++++++-- .../encode/array/SpaceDelimitedArrayProperty.java | 13 +++++++++++-- 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/CommaDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/CommaDelimitedArrayProperty.java index 76d0e3a5e47..e92126d2bba 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/CommaDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/CommaDelimitedArrayProperty.java @@ -7,7 +7,10 @@ import io.clientcore.core.serialization.json.JsonToken; import io.clientcore.core.serialization.json.JsonWriter; import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; /** * The CommaDelimitedArrayProperty model. @@ -47,7 +50,10 @@ public List getValue() { @Override public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); - jsonWriter.writeArrayField("value", this.value, (writer, element) -> writer.writeString(element)); + if (this.value != null) { + jsonWriter.writeStringField("value", + this.value.stream().map(element -> element == null ? "" : element).collect(Collectors.joining(","))); + } return jsonWriter.writeEndObject(); } @@ -69,7 +75,10 @@ public static CommaDelimitedArrayProperty fromJson(JsonReader jsonReader) throws reader.nextToken(); if ("value".equals(fieldName)) { - value = reader.readArray(reader1 -> reader1.getString()); + String valueEncodedAsString = reader.getString(); + value = valueEncodedAsString == null + ? null + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split(","))); } else { reader.skipChildren(); } diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/NewlineDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/NewlineDelimitedArrayProperty.java index 9c4e02945fc..605fc4fc58e 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/NewlineDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/NewlineDelimitedArrayProperty.java @@ -7,7 +7,10 @@ import io.clientcore.core.serialization.json.JsonToken; import io.clientcore.core.serialization.json.JsonWriter; import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; /** * The NewlineDelimitedArrayProperty model. @@ -47,7 +50,10 @@ public List getValue() { @Override public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); - jsonWriter.writeArrayField("value", this.value, (writer, element) -> writer.writeString(element)); + if (this.value != null) { + jsonWriter.writeStringField("value", + this.value.stream().map(element -> element == null ? "" : element).collect(Collectors.joining("\n"))); + } return jsonWriter.writeEndObject(); } @@ -69,7 +75,10 @@ public static NewlineDelimitedArrayProperty fromJson(JsonReader jsonReader) thro reader.nextToken(); if ("value".equals(fieldName)) { - value = reader.readArray(reader1 -> reader1.getString()); + String valueEncodedAsString = reader.getString(); + value = valueEncodedAsString == null + ? null + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split("\n"))); } else { reader.skipChildren(); } diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/PipeDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/PipeDelimitedArrayProperty.java index 591c83021e5..6c12dd24381 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/PipeDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/PipeDelimitedArrayProperty.java @@ -7,7 +7,10 @@ import io.clientcore.core.serialization.json.JsonToken; import io.clientcore.core.serialization.json.JsonWriter; import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; /** * The PipeDelimitedArrayProperty model. @@ -47,7 +50,10 @@ public List getValue() { @Override public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); - jsonWriter.writeArrayField("value", this.value, (writer, element) -> writer.writeString(element)); + if (this.value != null) { + jsonWriter.writeStringField("value", + this.value.stream().map(element -> element == null ? "" : element).collect(Collectors.joining("|"))); + } return jsonWriter.writeEndObject(); } @@ -69,7 +75,10 @@ public static PipeDelimitedArrayProperty fromJson(JsonReader jsonReader) throws reader.nextToken(); if ("value".equals(fieldName)) { - value = reader.readArray(reader1 -> reader1.getString()); + String valueEncodedAsString = reader.getString(); + value = valueEncodedAsString == null + ? null + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split("\\|"))); } else { reader.skipChildren(); } diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/SpaceDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/SpaceDelimitedArrayProperty.java index 5b98f94f20a..2eef27f0392 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/SpaceDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/SpaceDelimitedArrayProperty.java @@ -7,7 +7,10 @@ import io.clientcore.core.serialization.json.JsonToken; import io.clientcore.core.serialization.json.JsonWriter; import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; /** * The SpaceDelimitedArrayProperty model. @@ -47,7 +50,10 @@ public List getValue() { @Override public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStartObject(); - jsonWriter.writeArrayField("value", this.value, (writer, element) -> writer.writeString(element)); + if (this.value != null) { + jsonWriter.writeStringField("value", + this.value.stream().map(element -> element == null ? "" : element).collect(Collectors.joining(" "))); + } return jsonWriter.writeEndObject(); } @@ -69,7 +75,10 @@ public static SpaceDelimitedArrayProperty fromJson(JsonReader jsonReader) throws reader.nextToken(); if ("value".equals(fieldName)) { - value = reader.readArray(reader1 -> reader1.getString()); + String valueEncodedAsString = reader.getString(); + value = valueEncodedAsString == null + ? null + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split(" "))); } else { reader.skipChildren(); } From 9515a853e76bf938b19c928289fc7e8cb7262386 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Tue, 16 Dec 2025 14:03:10 +0800 Subject: [PATCH 08/21] test in cliencore --- .../java/encode/array/EncodeArrayTests.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 packages/http-client-java/generator/http-client-generator-clientcore-test/src/test/java/encode/array/EncodeArrayTests.java diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/test/java/encode/array/EncodeArrayTests.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/test/java/encode/array/EncodeArrayTests.java new file mode 100644 index 00000000000..fb616b74df7 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/test/java/encode/array/EncodeArrayTests.java @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package encode.array; + +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public final class EncodeArrayTests { + + private static final List COLORS = List.of("blue", "red", "green"); + + private final ArrayClient client = new ArrayClientBuilder().buildArrayClient(); + + @Test + public void commaDelimitedProperty() { + CommaDelimitedArrayProperty response = client.commaDelimited(new CommaDelimitedArrayProperty(COLORS)); + Assertions.assertEquals(COLORS, response.getValue()); + } + + @Test + public void spaceDelimitedProperty() { + SpaceDelimitedArrayProperty response = client.spaceDelimited(new SpaceDelimitedArrayProperty(COLORS)); + Assertions.assertEquals(COLORS, response.getValue()); + } + + @Test + public void pipeDelimitedProperty() { + PipeDelimitedArrayProperty response = client.pipeDelimited(new PipeDelimitedArrayProperty(COLORS)); + Assertions.assertEquals(COLORS, response.getValue()); + } + + @Test + public void newlineDelimitedProperty() { + NewlineDelimitedArrayProperty response = client.newlineDelimited(new NewlineDelimitedArrayProperty(COLORS)); + Assertions.assertEquals(COLORS, response.getValue()); + } +} From 531a42f8c4f5ba60a44f20148361a5ea9898cf53 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Tue, 16 Dec 2025 14:15:37 +0800 Subject: [PATCH 09/21] log error if element type is not string --- .../http-client-java/emitter/src/code-model-builder.ts | 9 +++++++++ packages/http-client-java/emitter/src/lib.ts | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/packages/http-client-java/emitter/src/code-model-builder.ts b/packages/http-client-java/emitter/src/code-model-builder.ts index 0fb99281050..ef5bd0894e4 100644 --- a/packages/http-client-java/emitter/src/code-model-builder.ts +++ b/packages/http-client-java/emitter/src/code-model-builder.ts @@ -2867,6 +2867,15 @@ export class CodeModelBuilder { extensions: extensions, }); if (modelProperty.encode) { + if (schema instanceof ArraySchema) { + const elementSchema = schema.elementType; + if (!(elementSchema instanceof StringSchema)) { + reportDiagnostic(this.program, { + code: "non-string-array-encoding-element-notsupported", + target: modelProperty.__raw ?? NoTarget, + }); + } + } (codeModelProperty as EncodedProperty).arrayEncoding = modelProperty.encode; } diff --git a/packages/http-client-java/emitter/src/lib.ts b/packages/http-client-java/emitter/src/lib.ts index a7e5491c184..d2221445b79 100644 --- a/packages/http-client-java/emitter/src/lib.ts +++ b/packages/http-client-java/emitter/src/lib.ts @@ -119,6 +119,12 @@ export const $lib = createTypeSpecLibrary({ default: paramMessage`Constant header '${"headerName"}' is removed from response headers.`, }, }, + "non-string-array-encoding-element-notsupported": { + severity: "error", + messages: { + default: "Element of type other than 'string' is not supported for 'ArrayEncoding'.", + }, + }, }, emitter: { options: EmitterOptionsSchema, From d4ca7ef2d934d9cd4c5965e9582d0b1080ff53ac Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Tue, 16 Dec 2025 14:19:07 +0800 Subject: [PATCH 10/21] remove ClientLocationClientTests to pass nightly build --- .../ClientLocationClientTests.java | 62 ------------------- 1 file changed, 62 deletions(-) delete mode 100644 packages/http-client-java/generator/http-client-generator-test/src/test/java/azure/clientgenerator/core/clientlocation/ClientLocationClientTests.java diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/azure/clientgenerator/core/clientlocation/ClientLocationClientTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/azure/clientgenerator/core/clientlocation/ClientLocationClientTests.java deleted file mode 100644 index 0f7f299e599..00000000000 --- a/packages/http-client-java/generator/http-client-generator-test/src/test/java/azure/clientgenerator/core/clientlocation/ClientLocationClientTests.java +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -package azure.clientgenerator.core.clientlocation; - -import azure.clientgenerator.core.clientlocation.movemethodparametertoclient.models.Blob; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -public final class ClientLocationClientTests { - - private final ClientLocationClientBuilder builder = new ClientLocationClientBuilder().storageAccount("testaccount"); - - @Test - public void testMoveToExistingSubClient() { - MoveToExistingSubUserOperationsClient userClient = builder.buildMoveToExistingSubUserOperationsClient(); - userClient.getUser(); - - MoveToExistingSubAdminOperationsClient adminClient = builder.buildMoveToExistingSubAdminOperationsClient(); - // deleteUser moved to MoveToExistingSubAdminOperationsClient - adminClient.deleteUser(); - adminClient.getAdminInfo(); - } - - @Test - public void testMoveToNewSubClient() { - MoveToNewSubProductOperationsClient productClient = builder.buildMoveToNewSubProductOperationsClient(); - productClient.listProducts(); - - ArchiveOperationsClient archiveClient = builder.buildArchiveOperationsClient(); - // archiveProduct moved to ArchiveOperationsClient - archiveClient.archiveProduct(); - } - - @Test - public void testMoveToRootClient() { - MoveToRootResourceOperationsClient resourceClient = builder.buildMoveToRootResourceOperationsClient(); - resourceClient.getResource(); - - ClientLocationClient rootClient = builder.buildClient(); - // getHealthStatus moved to root client - rootClient.getHealthStatus(); - } - - @Test - public void testMoveMethodParameterToClient() { - MoveMethodParameterToBlobOperationsClient blobClient = builder.buildMoveMethodParameterToBlobOperationsClient(); - - // Test the scenario: GET /blob?storageAccount=testaccount&container=testcontainer&blob=testblob.txt - // Expected response: {"id": "blob-001", "name": "testblob.txt", "size": 1024, "path": - // "/testcontainer/testblob.txt"} - // "testaccount" moved to client - Blob blob = blobClient.getBlob("testcontainer", "testblob.txt"); - - // Verify the Blob model structure - Assertions.assertNotNull(blob); - Assertions.assertNotNull(blob.getId()); - Assertions.assertNotNull(blob.getName()); - Assertions.assertTrue(blob.getSize() > 0); - Assertions.assertNotNull(blob.getPath()); - } -} From cd11ae7c2d4fae57d67b31d2afe35c74d388d9da Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Tue, 16 Dec 2025 14:21:53 +0800 Subject: [PATCH 11/21] bump dependencies --- .../package.json | 2 +- .../http-client-generator-test/package.json | 2 +- packages/http-client-java/package-lock.json | 633 +++++++++--------- packages/http-client-java/package.json | 16 +- 4 files changed, 342 insertions(+), 311 deletions(-) diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/package.json b/packages/http-client-java/generator/http-client-generator-clientcore-test/package.json index c11c0a1a842..2655f182441 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/package.json +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/package.json @@ -20,7 +20,7 @@ "@typespec/http-client-java-tests": "file:" }, "overrides": { - "@typespec/compiler": "1.7.0", + "@typespec/compiler": "1.7.1", "@typespec/http": "1.7.0", "@typespec/rest": "0.77.0", "@typespec/versioning": "0.77.0", diff --git a/packages/http-client-java/generator/http-client-generator-test/package.json b/packages/http-client-java/generator/http-client-generator-test/package.json index 1285ccb6134..9eb627fdfd7 100644 --- a/packages/http-client-java/generator/http-client-generator-test/package.json +++ b/packages/http-client-java/generator/http-client-generator-test/package.json @@ -20,7 +20,7 @@ "@typespec/http-client-java-tests": "file:" }, "overrides": { - "@typespec/compiler": "1.7.0", + "@typespec/compiler": "1.7.1", "@typespec/http": "1.7.0", "@typespec/rest": "0.77.0", "@typespec/versioning": "0.77.0", diff --git a/packages/http-client-java/package-lock.json b/packages/http-client-java/package-lock.json index 710a31da7e6..c60eeb53be9 100644 --- a/packages/http-client-java/package-lock.json +++ b/packages/http-client-java/package-lock.json @@ -19,12 +19,12 @@ "@azure-tools/typespec-azure-resource-manager": "0.63.0", "@azure-tools/typespec-azure-rulesets": "0.63.0", "@azure-tools/typespec-client-generator-core": "0.63.0", - "@microsoft/api-extractor": "^7.55.1", - "@microsoft/api-extractor-model": "^7.32.1", + "@microsoft/api-extractor": "^7.55.2", + "@microsoft/api-extractor-model": "^7.32.2", "@types/js-yaml": "~4.0.9", "@types/lodash": "~4.17.21", - "@types/node": "~24.10.1", - "@typespec/compiler": "1.7.0", + "@types/node": "~25.0.2", + "@typespec/compiler": "1.7.1", "@typespec/events": "0.77.0", "@typespec/http": "1.7.0", "@typespec/openapi": "1.7.0", @@ -34,12 +34,12 @@ "@typespec/streams": "0.77.0", "@typespec/versioning": "0.77.0", "@typespec/xml": "0.77.0", - "@vitest/coverage-v8": "^4.0.14", - "@vitest/ui": "^4.0.14", + "@vitest/coverage-v8": "^4.0.15", + "@vitest/ui": "^4.0.15", "c8": "~10.1.3", "rimraf": "~6.1.2", "typescript": "~5.9.3", - "vitest": "^4.0.14" + "vitest": "^4.0.15" }, "engines": { "node": ">=20.0.0" @@ -49,7 +49,7 @@ "@azure-tools/typespec-azure-core": ">=0.63.0 <1.0.0", "@azure-tools/typespec-azure-resource-manager": ">=0.63.0 <1.0.0", "@azure-tools/typespec-client-generator-core": ">=0.63.0 <1.0.0", - "@typespec/compiler": "^1.7.0", + "@typespec/compiler": "^1.7.1", "@typespec/events": ">=0.77.0 <1.0.0", "@typespec/http": "^1.7.0", "@typespec/openapi": "^1.7.0", @@ -141,6 +141,7 @@ "integrity": "sha512-FbEmpZSQENzBt/Y8qSF1b98T8CqT3bV7IRV8AGGm/73NQZiWQCm2LvQzR0/lbqGntS2EnSBrt394Kt69wM4ifA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" }, @@ -156,6 +157,7 @@ "integrity": "sha512-QXHryXgV9Rh7lBW9hrehjdGVM/W8eBN6wnfRRZtAAyfTc1AkRGDKOMFBtRtfbEkQpur16mgQTd7EyH2tpqfuSw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "change-case": "~5.4.4", "pluralize": "^8.0.0" @@ -194,6 +196,7 @@ "integrity": "sha512-zpvFvjCjNW+GWzHBV7vJ2E1PKXrmyNqp7FQiYo/D7PJBVTXNtOyIKqqo043ktAaWihbr8cl5QguuNSoBAKL0+Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "change-case": "~5.4.4", "pluralize": "^8.0.0", @@ -565,9 +568,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", + "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", "cpu": [ "ppc64" ], @@ -582,9 +585,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", + "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", "cpu": [ "arm" ], @@ -599,9 +602,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", + "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", "cpu": [ "arm64" ], @@ -616,9 +619,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", + "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", "cpu": [ "x64" ], @@ -633,9 +636,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", + "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", "cpu": [ "arm64" ], @@ -650,9 +653,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", + "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", "cpu": [ "x64" ], @@ -667,9 +670,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", + "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", "cpu": [ "arm64" ], @@ -684,9 +687,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", + "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", "cpu": [ "x64" ], @@ -701,9 +704,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", + "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", "cpu": [ "arm" ], @@ -718,9 +721,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", + "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", "cpu": [ "arm64" ], @@ -735,9 +738,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", + "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", "cpu": [ "ia32" ], @@ -752,9 +755,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", + "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", "cpu": [ "loong64" ], @@ -769,9 +772,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", + "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", "cpu": [ "mips64el" ], @@ -786,9 +789,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", + "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", "cpu": [ "ppc64" ], @@ -803,9 +806,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", + "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", "cpu": [ "riscv64" ], @@ -820,9 +823,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", + "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", "cpu": [ "s390x" ], @@ -837,9 +840,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz", + "integrity": "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==", "cpu": [ "x64" ], @@ -854,9 +857,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", + "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", "cpu": [ "arm64" ], @@ -871,9 +874,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", + "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", "cpu": [ "x64" ], @@ -888,9 +891,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", + "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", "cpu": [ "arm64" ], @@ -905,9 +908,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", + "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", "cpu": [ "x64" ], @@ -922,9 +925,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", + "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", "cpu": [ "arm64" ], @@ -939,9 +942,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", + "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", "cpu": [ "x64" ], @@ -956,9 +959,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", + "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", "cpu": [ "arm64" ], @@ -973,9 +976,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", + "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", "cpu": [ "ia32" ], @@ -990,9 +993,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", + "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", "cpu": [ "x64" ], @@ -1604,19 +1607,19 @@ } }, "node_modules/@microsoft/api-extractor": { - "version": "7.55.1", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.55.1.tgz", - "integrity": "sha512-l8Z+8qrLkZFM3HM95Dbpqs6G39fpCa7O5p8A7AkA6hSevxkgwsOlLrEuPv0ADOyj5dI1Af5WVDiwpKG/ya5G3w==", + "version": "7.55.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.55.2.tgz", + "integrity": "sha512-1jlWO4qmgqYoVUcyh+oXYRztZde/pAi7cSVzBz/rc+S7CoVzDasy8QE13dx6sLG4VRo8SfkkLbFORR6tBw4uGQ==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/api-extractor-model": "7.32.1", + "@microsoft/api-extractor-model": "7.32.2", "@microsoft/tsdoc": "~0.16.0", "@microsoft/tsdoc-config": "~0.18.0", - "@rushstack/node-core-library": "5.19.0", + "@rushstack/node-core-library": "5.19.1", "@rushstack/rig-package": "0.6.0", - "@rushstack/terminal": "0.19.4", - "@rushstack/ts-command-line": "5.1.4", + "@rushstack/terminal": "0.19.5", + "@rushstack/ts-command-line": "5.1.5", "diff": "~8.0.2", "lodash": "~4.17.15", "minimatch": "10.0.3", @@ -1630,15 +1633,15 @@ } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.32.1", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.32.1.tgz", - "integrity": "sha512-u4yJytMYiUAnhcNQcZDTh/tVtlrzKlyKrQnLOV+4Qr/5gV+cpufWzCYAB1Q23URFqD6z2RoL2UYncM9xJVGNKA==", + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.32.2.tgz", + "integrity": "sha512-Ussc25rAalc+4JJs9HNQE7TuO9y6jpYQX9nWD1DhqUzYPBr3Lr7O9intf+ZY8kD5HnIqeIRJX7ccCT0QyBy2Ww==", "dev": true, "license": "MIT", "dependencies": { "@microsoft/tsdoc": "~0.16.0", "@microsoft/tsdoc-config": "~0.18.0", - "@rushstack/node-core-library": "5.19.0" + "@rushstack/node-core-library": "5.19.1" } }, "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { @@ -1758,9 +1761,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", - "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.5.tgz", + "integrity": "sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==", "cpu": [ "arm" ], @@ -1772,9 +1775,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", - "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.5.tgz", + "integrity": "sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==", "cpu": [ "arm64" ], @@ -1786,9 +1789,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.5.tgz", + "integrity": "sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==", "cpu": [ "arm64" ], @@ -1800,9 +1803,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.5.tgz", + "integrity": "sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==", "cpu": [ "x64" ], @@ -1814,9 +1817,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", - "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.5.tgz", + "integrity": "sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==", "cpu": [ "arm64" ], @@ -1828,9 +1831,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", - "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.5.tgz", + "integrity": "sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==", "cpu": [ "x64" ], @@ -1842,9 +1845,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", - "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.5.tgz", + "integrity": "sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==", "cpu": [ "arm" ], @@ -1856,9 +1859,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", - "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.5.tgz", + "integrity": "sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==", "cpu": [ "arm" ], @@ -1870,9 +1873,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.5.tgz", + "integrity": "sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==", "cpu": [ "arm64" ], @@ -1884,9 +1887,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", - "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.5.tgz", + "integrity": "sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==", "cpu": [ "arm64" ], @@ -1898,9 +1901,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", - "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.5.tgz", + "integrity": "sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==", "cpu": [ "loong64" ], @@ -1912,9 +1915,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", - "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.5.tgz", + "integrity": "sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==", "cpu": [ "ppc64" ], @@ -1926,9 +1929,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", - "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.5.tgz", + "integrity": "sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==", "cpu": [ "riscv64" ], @@ -1940,9 +1943,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", - "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.5.tgz", + "integrity": "sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==", "cpu": [ "riscv64" ], @@ -1954,9 +1957,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", - "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.5.tgz", + "integrity": "sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==", "cpu": [ "s390x" ], @@ -1968,9 +1971,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.5.tgz", + "integrity": "sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==", "cpu": [ "x64" ], @@ -1982,9 +1985,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", - "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.5.tgz", + "integrity": "sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==", "cpu": [ "x64" ], @@ -1996,9 +1999,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", - "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.5.tgz", + "integrity": "sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==", "cpu": [ "arm64" ], @@ -2010,9 +2013,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", - "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.5.tgz", + "integrity": "sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==", "cpu": [ "arm64" ], @@ -2024,9 +2027,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", - "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.5.tgz", + "integrity": "sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==", "cpu": [ "ia32" ], @@ -2038,9 +2041,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", - "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.5.tgz", + "integrity": "sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==", "cpu": [ "x64" ], @@ -2052,9 +2055,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.5.tgz", + "integrity": "sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==", "cpu": [ "x64" ], @@ -2066,9 +2069,9 @@ ] }, "node_modules/@rushstack/node-core-library": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.19.0.tgz", - "integrity": "sha512-BxAopbeWBvNJ6VGiUL+5lbJXywTdsnMeOS8j57Cn/xY10r6sV/gbsTlfYKjzVCUBZATX2eRzJHSMCchsMTGN6A==", + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.19.1.tgz", + "integrity": "sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA==", "dev": true, "license": "MIT", "dependencies": { @@ -2163,13 +2166,13 @@ } }, "node_modules/@rushstack/terminal": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.4.tgz", - "integrity": "sha512-f4XQk02CrKfrMgyOfhYd3qWI944dLC21S4I/LUhrlAP23GTMDNG6EK5effQtFkISwUKCgD9vMBrJZaPSUquxWQ==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.5.tgz", + "integrity": "sha512-6k5tpdB88G0K7QrH/3yfKO84HK9ggftfUZ51p7fePyCE7+RLLHkWZbID9OFWbXuna+eeCFE7AkKnRMHMxNbz7Q==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/node-core-library": "5.19.0", + "@rushstack/node-core-library": "5.19.1", "@rushstack/problem-matcher": "0.1.1", "supports-color": "~8.1.1" }, @@ -2183,13 +2186,13 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.4.tgz", - "integrity": "sha512-H0I6VdJ6sOUbktDFpP2VW5N29w8v4hRoNZOQz02vtEi6ZTYL1Ju8u+TcFiFawUDrUsx/5MQTUhd79uwZZVwVlA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.5.tgz", + "integrity": "sha512-YmrFTFUdHXblYSa+Xc9OO9FsL/XFcckZy0ycQ6q7VSBsVs5P0uD9vcges5Q9vctGlVdu27w+Ct6IuJ458V0cTQ==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/terminal": "0.19.4", + "@rushstack/terminal": "0.19.5", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" @@ -2219,9 +2222,9 @@ } }, "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "dev": true, "license": "MIT" }, @@ -2277,21 +2280,23 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "version": "25.0.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.2.tgz", + "integrity": "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } }, "node_modules/@typespec/compiler": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-1.7.0.tgz", - "integrity": "sha512-KE2t5I7u/33M/nsIxdng06FUPrqaGSbMsSEsv51eMwYnj3v1+Z3qTTX/dxHAXRXHcfadNlX/NtyAKju+pkMTFQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-1.7.1.tgz", + "integrity": "sha512-sb3MEsKjFlAx8ZG484exs5Ec+JwmYf2anJqLjMusrV3rRMUhv3fbEulk9MD+l4eOkBS46VMNGqRu0wTn8suVVA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "~7.27.1", "@inquirer/prompts": "^8.0.1", @@ -2469,6 +2474,7 @@ "integrity": "sha512-NbOzi7axEt/xGgXaLjcGGV2HjQKNFjbvsQpCeDA6loUghZDK5+5ik/jwMumeUDunoBsAKF78ZxVF5qhQh56dGA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" }, @@ -2482,6 +2488,7 @@ "integrity": "sha512-4cGkcMiob3bedWbFkRcq614TDH7WPEI3YMgrg44mBarj903arpEniAESIhNUbLQzQFFc5rOJagexQDl4agVDyA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" }, @@ -2501,6 +2508,7 @@ "integrity": "sha512-tEAIgGnjLvOjbGAoCfkBudvpe/tXaOXkzy5nVFXs4921/jAaMTwzcJIt0bTXZpp5cExdlL7w9ZrnehARHiposQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" }, @@ -2515,6 +2523,7 @@ "integrity": "sha512-DEUMD9zYqUVUhKCGktV7Z+sFkzj+bcSpJRhEXxOrJxupWM4I3N4deMop+ulxezxlLxIRUz7ELc+6WucYXgOnAA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" }, @@ -2553,6 +2562,16 @@ "node": ">=16.0.0" } }, + "node_modules/@typespec/spec-coverage-sdk/node_modules/@types/node": { + "version": "24.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.4.tgz", + "integrity": "sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, "node_modules/@typespec/spector": { "version": "0.1.0-alpha.21", "resolved": "https://registry.npmjs.org/@typespec/spector/-/spector-0.1.0-alpha.21.tgz", @@ -2739,6 +2758,7 @@ "integrity": "sha512-rVML/sPNj+MomKXftko/eUNM5OhHlIevoit3Dbtaf1aWS5pcJ5jKX05Prz53VIyeUP7ra5ocmPE/iIEPb8ZbCA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" }, @@ -2755,6 +2775,7 @@ "integrity": "sha512-qqfJW4n19Jgi5FxQhsEgoIc5zD9o47AAoZxLKUX91z6aB/YWrLSTrrrIAvhNCESXuB89zlJPwlZ/j4YmpxZ/jw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" }, @@ -2783,6 +2804,7 @@ "integrity": "sha512-eAInPZYPkxpBUS8IKQfNZ5eZsLfkWqEX0d6YM/AfooGYbxcKdHQBfYOWBvRC4NkKEMub4ROaD5GcPLYTyWQIWw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" }, @@ -2796,6 +2818,7 @@ "integrity": "sha512-DNVAOMaRUPGpLEsqf3sn7UAWuAE1rs8Jf1FIAU7DF/sVmzeXs4OBanxSSsVmbcdfPRHPbjPuRnW6e+QS2Sjk3Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" }, @@ -2804,14 +2827,14 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.14.tgz", - "integrity": "sha512-EYHLqN/BY6b47qHH7gtMxAg++saoGmsjWmAq9MlXxAz4M0NcHh9iOyKhBZyU4yxZqOd8Xnqp80/5saeitz4Cng==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.15.tgz", + "integrity": "sha512-FUJ+1RkpTFW7rQITdgTi93qOCWJobWhBirEPCeXh2SW2wsTlFxy51apDz5gzG+ZEYt/THvWeNmhdAoS9DTwpCw==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.0.14", + "@vitest/utils": "4.0.15", "ast-v8-to-istanbul": "^0.3.8", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", @@ -2826,8 +2849,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "4.0.14", - "vitest": "4.0.14" + "@vitest/browser": "4.0.15", + "vitest": "4.0.15" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -2836,16 +2859,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.14.tgz", - "integrity": "sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.15.tgz", + "integrity": "sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.14", - "@vitest/utils": "4.0.14", + "@vitest/spy": "4.0.15", + "@vitest/utils": "4.0.15", "chai": "^6.2.1", "tinyrainbow": "^3.0.3" }, @@ -2854,13 +2877,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.14.tgz", - "integrity": "sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.15.tgz", + "integrity": "sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.0.14", + "@vitest/spy": "4.0.15", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -2881,9 +2904,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.14.tgz", - "integrity": "sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.15.tgz", + "integrity": "sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==", "dev": true, "license": "MIT", "dependencies": { @@ -2894,13 +2917,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.14.tgz", - "integrity": "sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.15.tgz", + "integrity": "sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.14", + "@vitest/utils": "4.0.15", "pathe": "^2.0.3" }, "funding": { @@ -2908,13 +2931,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.14.tgz", - "integrity": "sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.15.tgz", + "integrity": "sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.14", + "@vitest/pretty-format": "4.0.15", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -2923,9 +2946,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.14.tgz", - "integrity": "sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.15.tgz", + "integrity": "sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==", "dev": true, "license": "MIT", "funding": { @@ -2933,13 +2956,14 @@ } }, "node_modules/@vitest/ui": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.0.14.tgz", - "integrity": "sha512-fvDz8o7SQpFLoSBo6Cudv+fE85/fPCkwTnLAN85M+Jv7k59w2mSIjT9Q5px7XwGrmYqqKBEYxh/09IBGd1E7AQ==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.0.15.tgz", + "integrity": "sha512-sxSyJMaKp45zI0u+lHrPuZM1ZJQ8FaVD35k+UxVrha1yyvQ+TZuUYllUixwvQXlB7ixoDc7skf3lQPopZIvaQw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@vitest/utils": "4.0.14", + "@vitest/utils": "4.0.15", "fflate": "^0.8.2", "flatted": "^3.3.3", "pathe": "^2.0.3", @@ -2951,17 +2975,17 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "4.0.14" + "vitest": "4.0.15" } }, "node_modules/@vitest/utils": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.14.tgz", - "integrity": "sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.15.tgz", + "integrity": "sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.14", + "@vitest/pretty-format": "4.0.15", "tinyrainbow": "^3.0.3" }, "funding": { @@ -3787,9 +3811,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", + "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3800,32 +3824,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" + "@esbuild/aix-ppc64": "0.27.1", + "@esbuild/android-arm": "0.27.1", + "@esbuild/android-arm64": "0.27.1", + "@esbuild/android-x64": "0.27.1", + "@esbuild/darwin-arm64": "0.27.1", + "@esbuild/darwin-x64": "0.27.1", + "@esbuild/freebsd-arm64": "0.27.1", + "@esbuild/freebsd-x64": "0.27.1", + "@esbuild/linux-arm": "0.27.1", + "@esbuild/linux-arm64": "0.27.1", + "@esbuild/linux-ia32": "0.27.1", + "@esbuild/linux-loong64": "0.27.1", + "@esbuild/linux-mips64el": "0.27.1", + "@esbuild/linux-ppc64": "0.27.1", + "@esbuild/linux-riscv64": "0.27.1", + "@esbuild/linux-s390x": "0.27.1", + "@esbuild/linux-x64": "0.27.1", + "@esbuild/netbsd-arm64": "0.27.1", + "@esbuild/netbsd-x64": "0.27.1", + "@esbuild/openbsd-arm64": "0.27.1", + "@esbuild/openbsd-x64": "0.27.1", + "@esbuild/openharmony-arm64": "0.27.1", + "@esbuild/sunos-x64": "0.27.1", + "@esbuild/win32-arm64": "0.27.1", + "@esbuild/win32-ia32": "0.27.1", + "@esbuild/win32-x64": "0.27.1" } }, "node_modules/escalade": { @@ -3875,9 +3899,9 @@ } }, "node_modules/expect-type": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", - "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -6030,9 +6054,9 @@ } }, "node_modules/rollup": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", - "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.5.tgz", + "integrity": "sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6046,28 +6070,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.3", - "@rollup/rollup-android-arm64": "4.53.3", - "@rollup/rollup-darwin-arm64": "4.53.3", - "@rollup/rollup-darwin-x64": "4.53.3", - "@rollup/rollup-freebsd-arm64": "4.53.3", - "@rollup/rollup-freebsd-x64": "4.53.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", - "@rollup/rollup-linux-arm-musleabihf": "4.53.3", - "@rollup/rollup-linux-arm64-gnu": "4.53.3", - "@rollup/rollup-linux-arm64-musl": "4.53.3", - "@rollup/rollup-linux-loong64-gnu": "4.53.3", - "@rollup/rollup-linux-ppc64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-musl": "4.53.3", - "@rollup/rollup-linux-s390x-gnu": "4.53.3", - "@rollup/rollup-linux-x64-gnu": "4.53.3", - "@rollup/rollup-linux-x64-musl": "4.53.3", - "@rollup/rollup-openharmony-arm64": "4.53.3", - "@rollup/rollup-win32-arm64-msvc": "4.53.3", - "@rollup/rollup-win32-ia32-msvc": "4.53.3", - "@rollup/rollup-win32-x64-gnu": "4.53.3", - "@rollup/rollup-win32-x64-msvc": "4.53.3", + "@rollup/rollup-android-arm-eabi": "4.53.5", + "@rollup/rollup-android-arm64": "4.53.5", + "@rollup/rollup-darwin-arm64": "4.53.5", + "@rollup/rollup-darwin-x64": "4.53.5", + "@rollup/rollup-freebsd-arm64": "4.53.5", + "@rollup/rollup-freebsd-x64": "4.53.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.5", + "@rollup/rollup-linux-arm-musleabihf": "4.53.5", + "@rollup/rollup-linux-arm64-gnu": "4.53.5", + "@rollup/rollup-linux-arm64-musl": "4.53.5", + "@rollup/rollup-linux-loong64-gnu": "4.53.5", + "@rollup/rollup-linux-ppc64-gnu": "4.53.5", + "@rollup/rollup-linux-riscv64-gnu": "4.53.5", + "@rollup/rollup-linux-riscv64-musl": "4.53.5", + "@rollup/rollup-linux-s390x-gnu": "4.53.5", + "@rollup/rollup-linux-x64-gnu": "4.53.5", + "@rollup/rollup-linux-x64-musl": "4.53.5", + "@rollup/rollup-openharmony-arm64": "4.53.5", + "@rollup/rollup-win32-arm64-msvc": "4.53.5", + "@rollup/rollup-win32-ia32-msvc": "4.53.5", + "@rollup/rollup-win32-x64-gnu": "4.53.5", + "@rollup/rollup-win32-x64-msvc": "4.53.5", "fsevents": "~2.3.2" } }, @@ -6766,11 +6790,14 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/tinyglobby": { "version": "0.2.15", @@ -6813,6 +6840,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -6998,13 +7026,14 @@ } }, "node_modules/vite": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.4.tgz", - "integrity": "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", + "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "esbuild": "^0.25.0", + "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", @@ -7096,6 +7125,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7104,19 +7134,20 @@ } }, "node_modules/vitest": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.14.tgz", - "integrity": "sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.15.tgz", + "integrity": "sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@vitest/expect": "4.0.14", - "@vitest/mocker": "4.0.14", - "@vitest/pretty-format": "4.0.14", - "@vitest/runner": "4.0.14", - "@vitest/snapshot": "4.0.14", - "@vitest/spy": "4.0.14", - "@vitest/utils": "4.0.14", + "@vitest/expect": "4.0.15", + "@vitest/mocker": "4.0.15", + "@vitest/pretty-format": "4.0.15", + "@vitest/runner": "4.0.15", + "@vitest/snapshot": "4.0.15", + "@vitest/spy": "4.0.15", + "@vitest/utils": "4.0.15", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", "magic-string": "^0.30.21", @@ -7125,7 +7156,7 @@ "picomatch": "^4.0.3", "std-env": "^3.10.0", "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", + "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.0.3", "vite": "^6.0.0 || ^7.0.0", @@ -7144,10 +7175,10 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.14", - "@vitest/browser-preview": "4.0.14", - "@vitest/browser-webdriverio": "4.0.14", - "@vitest/ui": "4.0.14", + "@vitest/browser-playwright": "4.0.15", + "@vitest/browser-preview": "4.0.15", + "@vitest/browser-webdriverio": "4.0.15", + "@vitest/ui": "4.0.15", "happy-dom": "*", "jsdom": "*" }, diff --git a/packages/http-client-java/package.json b/packages/http-client-java/package.json index 061c137213c..f5e9237a270 100644 --- a/packages/http-client-java/package.json +++ b/packages/http-client-java/package.json @@ -53,7 +53,7 @@ "@azure-tools/typespec-azure-core": ">=0.63.0 <1.0.0", "@azure-tools/typespec-azure-resource-manager": ">=0.63.0 <1.0.0", "@azure-tools/typespec-client-generator-core": ">=0.63.0 <1.0.0", - "@typespec/compiler": "^1.7.0", + "@typespec/compiler": "^1.7.1", "@typespec/events": ">=0.77.0 <1.0.0", "@typespec/http": "^1.7.0", "@typespec/openapi": "^1.7.0", @@ -74,12 +74,12 @@ "@azure-tools/typespec-azure-resource-manager": "0.63.0", "@azure-tools/typespec-azure-rulesets": "0.63.0", "@azure-tools/typespec-client-generator-core": "0.63.0", - "@microsoft/api-extractor": "^7.55.1", - "@microsoft/api-extractor-model": "^7.32.1", + "@microsoft/api-extractor": "^7.55.2", + "@microsoft/api-extractor-model": "^7.32.2", "@types/js-yaml": "~4.0.9", "@types/lodash": "~4.17.21", - "@types/node": "~24.10.1", - "@typespec/compiler": "1.7.0", + "@types/node": "~25.0.2", + "@typespec/compiler": "1.7.1", "@typespec/events": "0.77.0", "@typespec/http": "1.7.0", "@typespec/openapi": "1.7.0", @@ -89,11 +89,11 @@ "@typespec/streams": "0.77.0", "@typespec/versioning": "0.77.0", "@typespec/xml": "0.77.0", - "@vitest/coverage-v8": "^4.0.14", - "@vitest/ui": "^4.0.14", + "@vitest/coverage-v8": "^4.0.15", + "@vitest/ui": "^4.0.15", "c8": "~10.1.3", "rimraf": "~6.1.2", "typescript": "~5.9.3", - "vitest": "^4.0.14" + "vitest": "^4.0.15" } } From 3d0d060b02bc7f96d76f7debeb90c4e65770dfda Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Tue, 16 Dec 2025 14:50:08 +0800 Subject: [PATCH 12/21] comment --- .../core/template/StreamSerializationModelTemplate.java | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java index dec7e5e532e..88302337c4a 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java @@ -1622,6 +1622,7 @@ private void generateJsonDeserializationLogic(JavaBlock deserializationBlock, Cl } else { // wireType is String // at present, only String element is supported + // LinkedList is used to be consistent with internal code of core, e.g. "readArray" API deserializationBlock.text(propertyStringVariableName + " == null ? null : new LinkedList<>(Arrays.asList(" + propertyStringVariableName + ".split(\"" + property.getArrayEncoding().getEscapedDelimiter() + "\")));"); From 086ee5b5e43e9ddb40164163445e4a3112f8b389 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Wed, 17 Dec 2025 10:20:04 +0800 Subject: [PATCH 13/21] unit test for corner cases --- .../array/EncodeArraySerializationTests.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java new file mode 100644 index 00000000000..ae74b9a3fe0 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package encode.array; + +import com.azure.core.util.BinaryData; +import encode.array.models.CommaDelimitedArrayProperty; +import java.util.List; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public final class EncodeArraySerializationTests { + + @Test + public void testNull() { + CommaDelimitedArrayProperty model = new CommaDelimitedArrayProperty(null); + Assertions.assertEquals("{}", BinaryData.fromObject(model).toString()); + + model = BinaryData.fromString("{}").toObject(CommaDelimitedArrayProperty.class); + Assertions.assertNull(model.getValue()); + } + + @Test + public void testEmptyStringOnWire() { + CommaDelimitedArrayProperty model = new CommaDelimitedArrayProperty(List.of()); + Assertions.assertEquals("{\"value\":\"\"}", BinaryData.fromObject(model).toString()); + + model = BinaryData.fromString("{\"value\":\"\"}").toObject(CommaDelimitedArrayProperty.class); + Assertions.assertEquals(0, model.getValue().size()); + } + + @Test + public void testEmptyElement() { + CommaDelimitedArrayProperty model = new CommaDelimitedArrayProperty(List.of("", "")); + Assertions.assertEquals("{\"value\":\",\"}", BinaryData.fromObject(model).toString()); + + model = BinaryData.fromString("{\"value\":\",\"}").toObject(CommaDelimitedArrayProperty.class); + Assertions.assertEquals(2, model.getValue().size()); + } +} From fd843b126ce6942c203ef4db899a12dae6c79afc Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Wed, 17 Dec 2025 11:23:53 +0800 Subject: [PATCH 14/21] bug fix and regen --- .../main/java/encode/array/CommaDelimitedArrayProperty.java | 4 +++- .../java/encode/array/NewlineDelimitedArrayProperty.java | 4 +++- .../main/java/encode/array/PipeDelimitedArrayProperty.java | 4 +++- .../main/java/encode/array/SpaceDelimitedArrayProperty.java | 4 +++- .../core/template/StreamSerializationModelTemplate.java | 6 +++--- .../encode/array/models/CommaDelimitedArrayProperty.java | 4 +++- .../encode/array/models/NewlineDelimitedArrayProperty.java | 4 +++- .../encode/array/models/PipeDelimitedArrayProperty.java | 4 +++- .../encode/array/models/SpaceDelimitedArrayProperty.java | 4 +++- 9 files changed, 27 insertions(+), 11 deletions(-) diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/CommaDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/CommaDelimitedArrayProperty.java index e92126d2bba..77176e44514 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/CommaDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/CommaDelimitedArrayProperty.java @@ -78,7 +78,9 @@ public static CommaDelimitedArrayProperty fromJson(JsonReader jsonReader) throws String valueEncodedAsString = reader.getString(); value = valueEncodedAsString == null ? null - : new LinkedList<>(Arrays.asList(valueEncodedAsString.split(","))); + : valueEncodedAsString.isEmpty() + ? new LinkedList<>() + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split(",", -1))); } else { reader.skipChildren(); } diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/NewlineDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/NewlineDelimitedArrayProperty.java index 605fc4fc58e..a5f6d1d0b4a 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/NewlineDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/NewlineDelimitedArrayProperty.java @@ -78,7 +78,9 @@ public static NewlineDelimitedArrayProperty fromJson(JsonReader jsonReader) thro String valueEncodedAsString = reader.getString(); value = valueEncodedAsString == null ? null - : new LinkedList<>(Arrays.asList(valueEncodedAsString.split("\n"))); + : valueEncodedAsString.isEmpty() + ? new LinkedList<>() + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split("\n", -1))); } else { reader.skipChildren(); } diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/PipeDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/PipeDelimitedArrayProperty.java index 6c12dd24381..e5cc35a4960 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/PipeDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/PipeDelimitedArrayProperty.java @@ -78,7 +78,9 @@ public static PipeDelimitedArrayProperty fromJson(JsonReader jsonReader) throws String valueEncodedAsString = reader.getString(); value = valueEncodedAsString == null ? null - : new LinkedList<>(Arrays.asList(valueEncodedAsString.split("\\|"))); + : valueEncodedAsString.isEmpty() + ? new LinkedList<>() + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split("\\|", -1))); } else { reader.skipChildren(); } diff --git a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/SpaceDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/SpaceDelimitedArrayProperty.java index 2eef27f0392..4e514f16ecf 100644 --- a/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/SpaceDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-clientcore-test/src/main/java/encode/array/SpaceDelimitedArrayProperty.java @@ -78,7 +78,9 @@ public static SpaceDelimitedArrayProperty fromJson(JsonReader jsonReader) throws String valueEncodedAsString = reader.getString(); value = valueEncodedAsString == null ? null - : new LinkedList<>(Arrays.asList(valueEncodedAsString.split(" "))); + : valueEncodedAsString.isEmpty() + ? new LinkedList<>() + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split(" ", -1))); } else { reader.skipChildren(); } diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java index 88302337c4a..c97529dda61 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java @@ -1623,9 +1623,9 @@ private void generateJsonDeserializationLogic(JavaBlock deserializationBlock, Cl // wireType is String // at present, only String element is supported // LinkedList is used to be consistent with internal code of core, e.g. "readArray" API - deserializationBlock.text(propertyStringVariableName - + " == null ? null : new LinkedList<>(Arrays.asList(" + propertyStringVariableName + ".split(\"" - + property.getArrayEncoding().getEscapedDelimiter() + "\")));"); + deserializationBlock.line( + "%1$s == null ? null : %1$s.isEmpty() ? new LinkedList<>() : new LinkedList<>(Arrays.asList(%1$s.split(\"%2$s\", -1)));", + propertyStringVariableName, property.getArrayEncoding().getEscapedDelimiter()); } if (!propertiesManager.hasConstructorArguments()) { diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/CommaDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/CommaDelimitedArrayProperty.java index a2a02e3faa8..25747bc7fe0 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/CommaDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/CommaDelimitedArrayProperty.java @@ -82,7 +82,9 @@ public static CommaDelimitedArrayProperty fromJson(JsonReader jsonReader) throws String valueEncodedAsString = reader.getString(); value = valueEncodedAsString == null ? null - : new LinkedList<>(Arrays.asList(valueEncodedAsString.split(","))); + : valueEncodedAsString.isEmpty() + ? new LinkedList<>() + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split(",", -1))); } else { reader.skipChildren(); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/NewlineDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/NewlineDelimitedArrayProperty.java index 810c49ce703..03acae4ccd1 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/NewlineDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/NewlineDelimitedArrayProperty.java @@ -82,7 +82,9 @@ public static NewlineDelimitedArrayProperty fromJson(JsonReader jsonReader) thro String valueEncodedAsString = reader.getString(); value = valueEncodedAsString == null ? null - : new LinkedList<>(Arrays.asList(valueEncodedAsString.split("\n"))); + : valueEncodedAsString.isEmpty() + ? new LinkedList<>() + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split("\n", -1))); } else { reader.skipChildren(); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/PipeDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/PipeDelimitedArrayProperty.java index 8f09acb5bb1..37a143a7016 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/PipeDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/PipeDelimitedArrayProperty.java @@ -82,7 +82,9 @@ public static PipeDelimitedArrayProperty fromJson(JsonReader jsonReader) throws String valueEncodedAsString = reader.getString(); value = valueEncodedAsString == null ? null - : new LinkedList<>(Arrays.asList(valueEncodedAsString.split("\\|"))); + : valueEncodedAsString.isEmpty() + ? new LinkedList<>() + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split("\\|", -1))); } else { reader.skipChildren(); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/SpaceDelimitedArrayProperty.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/SpaceDelimitedArrayProperty.java index 31be05d3faf..1c270faa5b9 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/SpaceDelimitedArrayProperty.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/encode/array/models/SpaceDelimitedArrayProperty.java @@ -82,7 +82,9 @@ public static SpaceDelimitedArrayProperty fromJson(JsonReader jsonReader) throws String valueEncodedAsString = reader.getString(); value = valueEncodedAsString == null ? null - : new LinkedList<>(Arrays.asList(valueEncodedAsString.split(" "))); + : valueEncodedAsString.isEmpty() + ? new LinkedList<>() + : new LinkedList<>(Arrays.asList(valueEncodedAsString.split(" ", -1))); } else { reader.skipChildren(); } From 805e28db284c0936fceb5071d7b0128c07a402a3 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Wed, 17 Dec 2025 11:34:00 +0800 Subject: [PATCH 15/21] format --- .../test/java/encode/array/EncodeArraySerializationTests.java | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java index ae74b9a3fe0..1361b97a644 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java @@ -6,7 +6,6 @@ import com.azure.core.util.BinaryData; import encode.array.models.CommaDelimitedArrayProperty; import java.util.List; - import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; From 20bb4c058d3e31b21d7815587907be2d58c4c430 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Wed, 17 Dec 2025 11:53:21 +0800 Subject: [PATCH 16/21] one more test --- .../encode/array/EncodeArraySerializationTests.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java index 1361b97a644..e8ac3eaf9e8 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java @@ -5,6 +5,8 @@ import com.azure.core.util.BinaryData; import encode.array.models.CommaDelimitedArrayProperty; + +import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -37,4 +39,15 @@ public void testEmptyElement() { model = BinaryData.fromString("{\"value\":\",\"}").toObject(CommaDelimitedArrayProperty.class); Assertions.assertEquals(2, model.getValue().size()); } + + @Test + public void testNullElement() { + List list = new LinkedList<>(); + list.add("data1"); + list.add(null); + list.add("data2"); + + CommaDelimitedArrayProperty model = new CommaDelimitedArrayProperty(list); + Assertions.assertEquals("{\"value\":\"data1,,data2\"}", BinaryData.fromObject(model).toString()); + } } From 883929b9c3010d43be078fb43292969fba63db73 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Wed, 17 Dec 2025 12:52:38 +0800 Subject: [PATCH 17/21] format --- .../test/java/encode/array/EncodeArraySerializationTests.java | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java index e8ac3eaf9e8..c6a58209e5c 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/encode/array/EncodeArraySerializationTests.java @@ -5,7 +5,6 @@ import com.azure.core.util.BinaryData; import encode.array.models.CommaDelimitedArrayProperty; - import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.Assertions; From a5dad3f635081681fd29e45d5fb404a875d18777 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Thu, 18 Dec 2025 09:44:09 +0800 Subject: [PATCH 18/21] comment --- .../core/template/StreamSerializationModelTemplate.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java index c97529dda61..25f70a12618 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/template/StreamSerializationModelTemplate.java @@ -753,7 +753,7 @@ private void serializeJsonProperty(JavaBlock methodBlock, ClientModelProperty pr isJsonMergePatch); } else { // wireType is String - // at present, only String element is supported + // at present, only String element is supported. this check is in ts code. methodBlock.ifBlock(propertyValueGetter + " != null", ifBlock -> { String serializeExpression = propertyValueGetter + ".stream().map(element -> element == null ? \"\" : element).collect(Collectors.joining(\"" @@ -1621,7 +1621,7 @@ private void generateJsonDeserializationLogic(JavaBlock deserializationBlock, Cl ((IterableType) wireType).getElementType(), ((IterableType) clientType).getElementType(), 0); } else { // wireType is String - // at present, only String element is supported + // at present, only String element is supported. this check is in ts code. // LinkedList is used to be consistent with internal code of core, e.g. "readArray" API deserializationBlock.line( "%1$s == null ? null : %1$s.isEmpty() ? new LinkedList<>() : new LinkedList<>(Arrays.asList(%1$s.split(\"%2$s\", -1)));", From 149d715e76831d8785e4daa8e8e3cc76f53aa13a Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Thu, 18 Dec 2025 10:30:55 +0800 Subject: [PATCH 19/21] test for example --- .../tsp/builtin.tsp | 5 +- .../tsp/examples/BuiltinOp_Read.json | 7 +-- .../tsp/examples/BuiltinOp_Write.json | 48 +++++++++++++++++++ 3 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 packages/http-client-java/generator/http-client-generator-test/tsp/examples/BuiltinOp_Write.json diff --git a/packages/http-client-java/generator/http-client-generator-test/tsp/builtin.tsp b/packages/http-client-java/generator/http-client-generator-test/tsp/builtin.tsp index b386874aa6f..a7e2ae798b2 100644 --- a/packages/http-client-java/generator/http-client-generator-test/tsp/builtin.tsp +++ b/packages/http-client-java/generator/http-client-generator-test/tsp/builtin.tsp @@ -61,6 +61,9 @@ model Encoded { @encode("unknown-bytes") unknownBytes?: bytes; + + @encode(ArrayEncoding.commaDelimited) + commaDeliminatedArray?: string[]; } model Request { @@ -89,6 +92,6 @@ interface BuiltinOp { @body body: Builtin; }; - @convenientAPI(false) + @post write(@body body: Builtin): OkResponse; } diff --git a/packages/http-client-java/generator/http-client-generator-test/tsp/examples/BuiltinOp_Read.json b/packages/http-client-java/generator/http-client-generator-test/tsp/examples/BuiltinOp_Read.json index fcee79fbb95..3d2808c0b4d 100644 --- a/packages/http-client-java/generator/http-client-generator-test/tsp/examples/BuiltinOp_Read.json +++ b/packages/http-client-java/generator/http-client-generator-test/tsp/examples/BuiltinOp_Read.json @@ -24,13 +24,14 @@ "url": "https://www.github.com", "stringList": ["a", "b", "c"], "encoded": { - "timeInSeconds": "PT15M", - "timeInSecondsFraction": "PT20.345S", + "timeInSeconds": "900", + "timeInSecondsFraction": "1200.345", "dateTime": "1966-03-03T00:06:56.52Z", "dateTimeRfc7231": "Sun, 06 Nov 1994 08:49:37 GMT", "unixTimestamp": "1693362903", "base64": "aHR0cHM6Ly93d3cuZ2l0aHViLmNvbQ==", - "base64url": "aHR0cHM6Ly93d3cuZ2l0aHViLmNvbQ==" + "base64url": "aHR0cHM6Ly93d3cuZ2l0aHViLmNvbQ==", + "commaDeliminatedArray": "a,b,c" } } }, diff --git a/packages/http-client-java/generator/http-client-generator-test/tsp/examples/BuiltinOp_Write.json b/packages/http-client-java/generator/http-client-generator-test/tsp/examples/BuiltinOp_Write.json new file mode 100644 index 00000000000..11dbdce71e2 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/tsp/examples/BuiltinOp_Write.json @@ -0,0 +1,48 @@ +{ + "operationId": "BuiltinOp_Write", + "title": "BuiltinOp Write", + "parameters": { + "body": { + "boolean": true, + "string": "myString", + "safeint": 32, + "long": 64, + "float": 32.0, + "double": 64.0, + "duration": "PT15M", + "date": "2023-08-29", + "dateTime": "2019-10-12T07:20:50.520Z", + "nullableFloatDict": { + "max": 15.0, + "min": 14.0, + "average": 14.3 + }, + "url": "https://www.github.com", + "stringList": ["a", "b", "c"], + "encoded": { + "timeInSeconds": "900", + "timeInSecondsFraction": "1200.345", + "dateTime": "1966-03-03T00:06:56.52Z", + "dateTimeRfc7231": "Sun, 06 Nov 1994 08:49:37 GMT", + "unixTimestamp": "1693362903", + "base64": "aHR0cHM6Ly93d3cuZ2l0aHViLmNvbQ==", + "base64url": "aHR0cHM6Ly93d3cuZ2l0aHViLmNvbQ==", + "commaDeliminatedArray": "a,b,c" + } + } + }, + "responses": { + "200": { + }, + "default": { + "headers": { + "Content-Type": "application/json", + "x-ms-error-code": "Error Code" + }, + "body": { + "code": "Error Code", + "message": "Error Message" + } + } + } +} From 3c3d03a862918545322e0a52f5e5bef062f81b8b Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Thu, 18 Dec 2025 10:31:25 +0800 Subject: [PATCH 20/21] simple handling for example as CSV --- .../generator/core/util/ModelExampleUtil.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ModelExampleUtil.java b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ModelExampleUtil.java index a504b443aa7..bb2d8da54e0 100644 --- a/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ModelExampleUtil.java +++ b/packages/http-client-java/generator/http-client-generator-core/src/main/java/com/microsoft/typespec/http/client/generator/core/util/ModelExampleUtil.java @@ -71,6 +71,19 @@ public static ExampleNode parseNode(IType type, IType wireType, Object objectVal ExampleNode childNode = parseNode(elementType, childObjectValue); node.getChildNodes().add(childNode); } + } else if (objectValue instanceof String) { + // there is ArrayEncoding that serializes array to string + // for simplicity, treat it as CSV + ListNode listNode = new ListNode(elementType, objectValue); + if (!((String) objectValue).isEmpty()) { + String value = (String) objectValue; + String[] elements = value.split(",", -1); + for (String childObjectValue : elements) { + ExampleNode childNode = parseNode(elementType, childObjectValue); + listNode.getChildNodes().add(childNode); + } + } + node = listNode; } else { throw new IllegalStateException("Example value is not List type: " + objectValue); } From 9f566af045e45823eb093df1d5161be59f39e459 Mon Sep 17 00:00:00 2001 From: Weidong Xu Date: Thu, 18 Dec 2025 10:51:20 +0800 Subject: [PATCH 21/21] regen --- .../tsptest/builtin/BuiltinAsyncClient.java | 26 ++++++++++ .../java/tsptest/builtin/BuiltinClient.java | 25 +++++++++ .../implementation/BuiltinOpsImpl.java | 12 +++++ .../java/tsptest/builtin/models/Encoded.java | 46 +++++++++++++++++ .../tsptest-builtin_apiview_properties.json | 4 ++ .../META-INF/tsptest-builtin_metadata.json | 2 +- .../builtin/generated/BuiltinOpWrite.java | 51 +++++++++++++++++++ .../builtin/generated/BuiltinOpReadTests.java | 1 + .../generated/BuiltinOpWriteTests.java | 50 ++++++++++++++++++ 9 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/builtin/generated/BuiltinOpWrite.java create mode 100644 packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/builtin/generated/BuiltinOpWriteTests.java diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/BuiltinAsyncClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/BuiltinAsyncClient.java index 9443a552413..d5741af7c39 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/BuiltinAsyncClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/BuiltinAsyncClient.java @@ -97,6 +97,9 @@ public final class BuiltinAsyncClient { * unknownDurationFormat: String (Optional) * unknownDateTimeFormat: String (Optional) * unknownBytes: String (Optional) + * commaDeliminatedArray (Optional): [ + * String (Optional) + * ] * } * uuid: String (Required) * } @@ -159,6 +162,9 @@ public Mono> readWithResponse(String queryParam, String que * unknownDurationFormat: String (Optional) * unknownDateTimeFormat: String (Optional) * unknownBytes: String (Optional) + * commaDeliminatedArray (Optional): [ + * String (Optional) + * ] * } * uuid: String (Required) * } @@ -239,4 +245,24 @@ public Mono read(String queryParam, String queryParamEncoded) { return readWithResponse(queryParam, queryParamEncoded, requestOptions).flatMap(FluxUtil::toMono) .map(protocolMethodData -> protocolMethodData.toObject(Builtin.class)); } + + /** + * The write operation. + * + * @param body The body parameter. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return A {@link Mono} that completes when a successful response is received. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono write(Builtin body) { + // Generated convenience method for writeWithResponse + RequestOptions requestOptions = new RequestOptions(); + return writeWithResponse(BinaryData.fromObject(body), requestOptions).flatMap(FluxUtil::toMono); + } } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/BuiltinClient.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/BuiltinClient.java index 4b13ab1ebef..bd2fb3d0c98 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/BuiltinClient.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/BuiltinClient.java @@ -95,6 +95,9 @@ public final class BuiltinClient { * unknownDurationFormat: String (Optional) * unknownDateTimeFormat: String (Optional) * unknownBytes: String (Optional) + * commaDeliminatedArray (Optional): [ + * String (Optional) + * ] * } * uuid: String (Required) * } @@ -157,6 +160,9 @@ public Response readWithResponse(String queryParam, String queryPara * unknownDurationFormat: String (Optional) * unknownDateTimeFormat: String (Optional) * unknownBytes: String (Optional) + * commaDeliminatedArray (Optional): [ + * String (Optional) + * ] * } * uuid: String (Required) * } @@ -235,4 +241,23 @@ public Builtin read(String queryParam, String queryParamEncoded) { RequestOptions requestOptions = new RequestOptions(); return readWithResponse(queryParam, queryParamEncoded, requestOptions).getValue().toObject(Builtin.class); } + + /** + * The write operation. + * + * @param body The body parameter. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public void write(Builtin body) { + // Generated convenience method for writeWithResponse + RequestOptions requestOptions = new RequestOptions(); + writeWithResponse(BinaryData.fromObject(body), requestOptions).getValue(); + } } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/implementation/BuiltinOpsImpl.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/implementation/BuiltinOpsImpl.java index a7db120b993..009b00691a7 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/implementation/BuiltinOpsImpl.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/implementation/BuiltinOpsImpl.java @@ -157,6 +157,9 @@ Response writeSync(@HostParam("endpoint") String endpoint, * unknownDurationFormat: String (Optional) * unknownDateTimeFormat: String (Optional) * unknownBytes: String (Optional) + * commaDeliminatedArray (Optional): [ + * String (Optional) + * ] * } * uuid: String (Required) * } @@ -236,6 +239,9 @@ public Mono> readWithResponseAsync(String queryParam, Strin * unknownDurationFormat: String (Optional) * unknownDateTimeFormat: String (Optional) * unknownBytes: String (Optional) + * commaDeliminatedArray (Optional): [ + * String (Optional) + * ] * } * uuid: String (Required) * } @@ -299,6 +305,9 @@ public Response readWithResponse(String queryParam, String queryPara * unknownDurationFormat: String (Optional) * unknownDateTimeFormat: String (Optional) * unknownBytes: String (Optional) + * commaDeliminatedArray (Optional): [ + * String (Optional) + * ] * } * uuid: String (Required) * } @@ -360,6 +369,9 @@ public Mono> writeWithResponseAsync(BinaryData body, RequestOptio * unknownDurationFormat: String (Optional) * unknownDateTimeFormat: String (Optional) * unknownBytes: String (Optional) + * commaDeliminatedArray (Optional): [ + * String (Optional) + * ] * } * uuid: String (Required) * } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/models/Encoded.java b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/models/Encoded.java index 314dec46ae7..47297757eac 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/models/Encoded.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/java/tsptest/builtin/models/Encoded.java @@ -19,7 +19,11 @@ import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** * The Encoded model. @@ -86,6 +90,12 @@ public final class Encoded implements JsonSerializable { @Generated private String unknownBytes; + /* + * The commaDeliminatedArray property. + */ + @Generated + private List commaDeliminatedArray; + /** * Creates an instance of Encoded class. */ @@ -348,6 +358,28 @@ public Encoded setUnknownBytes(String unknownBytes) { return this; } + /** + * Get the commaDeliminatedArray property: The commaDeliminatedArray property. + * + * @return the commaDeliminatedArray value. + */ + @Generated + public List getCommaDeliminatedArray() { + return this.commaDeliminatedArray; + } + + /** + * Set the commaDeliminatedArray property: The commaDeliminatedArray property. + * + * @param commaDeliminatedArray the commaDeliminatedArray value to set. + * @return the Encoded object itself. + */ + @Generated + public Encoded setCommaDeliminatedArray(List commaDeliminatedArray) { + this.commaDeliminatedArray = commaDeliminatedArray; + return this; + } + /** * {@inheritDoc} */ @@ -366,6 +398,12 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStringField("unknownDurationFormat", this.unknownDurationFormat); jsonWriter.writeStringField("unknownDateTimeFormat", this.unknownDateTimeFormat); jsonWriter.writeStringField("unknownBytes", this.unknownBytes); + if (this.commaDeliminatedArray != null) { + jsonWriter.writeStringField("commaDeliminatedArray", + this.commaDeliminatedArray.stream() + .map(element -> element == null ? "" : element) + .collect(Collectors.joining(","))); + } return jsonWriter.writeEndObject(); } @@ -408,6 +446,14 @@ public static Encoded fromJson(JsonReader jsonReader) throws IOException { deserializedEncoded.unknownDateTimeFormat = reader.getString(); } else if ("unknownBytes".equals(fieldName)) { deserializedEncoded.unknownBytes = reader.getString(); + } else if ("commaDeliminatedArray".equals(fieldName)) { + String commaDeliminatedArrayEncodedAsString = reader.getString(); + List commaDeliminatedArray = commaDeliminatedArrayEncodedAsString == null + ? null + : commaDeliminatedArrayEncodedAsString.isEmpty() + ? new LinkedList<>() + : new LinkedList<>(Arrays.asList(commaDeliminatedArrayEncodedAsString.split(",", -1))); + deserializedEncoded.commaDeliminatedArray = commaDeliminatedArray; } else { reader.skipChildren(); } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-builtin_apiview_properties.json b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-builtin_apiview_properties.json index 8862773b538..4f2f513124e 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-builtin_apiview_properties.json +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-builtin_apiview_properties.json @@ -4,9 +4,13 @@ "tsptest.builtin.BuiltinAsyncClient": "TspTest.Builtin.BuiltinOp", "tsptest.builtin.BuiltinAsyncClient.read": "TspTest.Builtin.BuiltinOp.read", "tsptest.builtin.BuiltinAsyncClient.readWithResponse": "TspTest.Builtin.BuiltinOp.read", + "tsptest.builtin.BuiltinAsyncClient.write": "TspTest.Builtin.BuiltinOp.write", + "tsptest.builtin.BuiltinAsyncClient.writeWithResponse": "TspTest.Builtin.BuiltinOp.write", "tsptest.builtin.BuiltinClient": "TspTest.Builtin.BuiltinOp", "tsptest.builtin.BuiltinClient.read": "TspTest.Builtin.BuiltinOp.read", "tsptest.builtin.BuiltinClient.readWithResponse": "TspTest.Builtin.BuiltinOp.read", + "tsptest.builtin.BuiltinClient.write": "TspTest.Builtin.BuiltinOp.write", + "tsptest.builtin.BuiltinClient.writeWithResponse": "TspTest.Builtin.BuiltinOp.write", "tsptest.builtin.BuiltinClientBuilder": "TspTest.Builtin", "tsptest.builtin.models.Builtin": "TspTest.Builtin.Builtin", "tsptest.builtin.models.Encoded": "TspTest.Builtin.Encoded" diff --git a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-builtin_metadata.json b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-builtin_metadata.json index 5cbe7a748d1..8e0acdcd6f0 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-builtin_metadata.json +++ b/packages/http-client-java/generator/http-client-generator-test/src/main/resources/META-INF/tsptest-builtin_metadata.json @@ -1 +1 @@ -{"flavor":"Azure","crossLanguageDefinitions":{"tsptest.builtin.BuiltinAsyncClient":"TspTest.Builtin.BuiltinOp","tsptest.builtin.BuiltinAsyncClient.read":"TspTest.Builtin.BuiltinOp.read","tsptest.builtin.BuiltinAsyncClient.readWithResponse":"TspTest.Builtin.BuiltinOp.read","tsptest.builtin.BuiltinClient":"TspTest.Builtin.BuiltinOp","tsptest.builtin.BuiltinClient.read":"TspTest.Builtin.BuiltinOp.read","tsptest.builtin.BuiltinClient.readWithResponse":"TspTest.Builtin.BuiltinOp.read","tsptest.builtin.BuiltinClientBuilder":"TspTest.Builtin","tsptest.builtin.models.Builtin":"TspTest.Builtin.Builtin","tsptest.builtin.models.Encoded":"TspTest.Builtin.Encoded"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/builtin/BuiltinAsyncClient.java","src/main/java/tsptest/builtin/BuiltinClient.java","src/main/java/tsptest/builtin/BuiltinClientBuilder.java","src/main/java/tsptest/builtin/implementation/BuiltinClientImpl.java","src/main/java/tsptest/builtin/implementation/BuiltinOpsImpl.java","src/main/java/tsptest/builtin/implementation/package-info.java","src/main/java/tsptest/builtin/models/Builtin.java","src/main/java/tsptest/builtin/models/Encoded.java","src/main/java/tsptest/builtin/models/package-info.java","src/main/java/tsptest/builtin/package-info.java"]} \ No newline at end of file +{"flavor":"Azure","crossLanguageDefinitions":{"tsptest.builtin.BuiltinAsyncClient":"TspTest.Builtin.BuiltinOp","tsptest.builtin.BuiltinAsyncClient.read":"TspTest.Builtin.BuiltinOp.read","tsptest.builtin.BuiltinAsyncClient.readWithResponse":"TspTest.Builtin.BuiltinOp.read","tsptest.builtin.BuiltinAsyncClient.write":"TspTest.Builtin.BuiltinOp.write","tsptest.builtin.BuiltinAsyncClient.writeWithResponse":"TspTest.Builtin.BuiltinOp.write","tsptest.builtin.BuiltinClient":"TspTest.Builtin.BuiltinOp","tsptest.builtin.BuiltinClient.read":"TspTest.Builtin.BuiltinOp.read","tsptest.builtin.BuiltinClient.readWithResponse":"TspTest.Builtin.BuiltinOp.read","tsptest.builtin.BuiltinClient.write":"TspTest.Builtin.BuiltinOp.write","tsptest.builtin.BuiltinClient.writeWithResponse":"TspTest.Builtin.BuiltinOp.write","tsptest.builtin.BuiltinClientBuilder":"TspTest.Builtin","tsptest.builtin.models.Builtin":"TspTest.Builtin.Builtin","tsptest.builtin.models.Encoded":"TspTest.Builtin.Encoded"},"generatedFiles":["src/main/java/module-info.java","src/main/java/tsptest/builtin/BuiltinAsyncClient.java","src/main/java/tsptest/builtin/BuiltinClient.java","src/main/java/tsptest/builtin/BuiltinClientBuilder.java","src/main/java/tsptest/builtin/implementation/BuiltinClientImpl.java","src/main/java/tsptest/builtin/implementation/BuiltinOpsImpl.java","src/main/java/tsptest/builtin/implementation/package-info.java","src/main/java/tsptest/builtin/models/Builtin.java","src/main/java/tsptest/builtin/models/Encoded.java","src/main/java/tsptest/builtin/models/package-info.java","src/main/java/tsptest/builtin/package-info.java"]} \ No newline at end of file diff --git a/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/builtin/generated/BuiltinOpWrite.java b/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/builtin/generated/BuiltinOpWrite.java new file mode 100644 index 00000000000..daabacae809 --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/samples/java/tsptest/builtin/generated/BuiltinOpWrite.java @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package tsptest.builtin.generated; + +import com.azure.core.util.Configuration; +import java.time.Duration; +import java.time.LocalDate; +import java.time.OffsetDateTime; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import tsptest.builtin.BuiltinClient; +import tsptest.builtin.BuiltinClientBuilder; +import tsptest.builtin.models.Builtin; +import tsptest.builtin.models.Encoded; + +public class BuiltinOpWrite { + public static void main(String[] args) { + BuiltinClient builtinClient + = new BuiltinClientBuilder().endpoint(Configuration.getGlobalConfiguration().get("ENDPOINT")).buildClient(); + // BEGIN:tsptest.builtin.generated.builtin-op-write.builtin-op-write + builtinClient.write(new Builtin(true, "myString", null, 0, 32L, null, 64L, 32.0, 64.0, Duration.parse("PT15M"), + LocalDate.parse("2023-08-29"), OffsetDateTime.parse("2019-10-12T07:20:50.520Z"), + Arrays.asList("a", "b", "c"), null, "https://www.github.com", + mapOf("max", 15.0D, "min", 14.0D, "average", 14.3D), + new Encoded().setTimeInSeconds(Duration.parse("PT15M")) + .setTimeInSecondsFraction(Duration.parse("PT20M0.345S")) + .setDateTime(OffsetDateTime.parse("1966-03-03T00:06:56.52Z")) + .setDateTimeRfc7231(OffsetDateTime.parse("1994-11-06T08:49:37Z")) + .setUnixTimestamp(OffsetDateTime.parse("2023-08-30T02:35:03Z")) + .setBase64("aHR0cHM6Ly93d3cuZ2l0aHViLmNvbQ==".getBytes()) + .setBase64url("aHR0cHM6Ly93d3cuZ2l0aHViLmNvbQ==".getBytes()) + .setCommaDeliminatedArray(Arrays.asList("a", "b", "c")), + null)); + // END:tsptest.builtin.generated.builtin-op-write.builtin-op-write + } + + // Use "Map.of" if available + @SuppressWarnings("unchecked") + private static Map mapOf(Object... inputs) { + Map map = new HashMap<>(); + for (int i = 0; i < inputs.length; i += 2) { + String key = (String) inputs[i]; + T value = (T) inputs[i + 1]; + map.put(key, value); + } + return map; + } +} diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/builtin/generated/BuiltinOpReadTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/builtin/generated/BuiltinOpReadTests.java index 46155f8c613..8fa08f909c1 100644 --- a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/builtin/generated/BuiltinOpReadTests.java +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/builtin/generated/BuiltinOpReadTests.java @@ -56,5 +56,6 @@ public void testBuiltinOpReadTests() { Assertions.assertNotNull(responseEncoded.getUnixTimestamp()); Assertions.assertNotNull(responseEncoded.getBase64()); Assertions.assertNotNull(responseEncoded.getBase64url()); + Assertions.assertNotNull(responseEncoded.getCommaDeliminatedArray()); } } diff --git a/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/builtin/generated/BuiltinOpWriteTests.java b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/builtin/generated/BuiltinOpWriteTests.java new file mode 100644 index 00000000000..1f8e4e16d7a --- /dev/null +++ b/packages/http-client-java/generator/http-client-generator-test/src/test/java/tsptest/builtin/generated/BuiltinOpWriteTests.java @@ -0,0 +1,50 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package tsptest.builtin.generated; + +import java.time.Duration; +import java.time.LocalDate; +import java.time.OffsetDateTime; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import tsptest.builtin.models.Builtin; +import tsptest.builtin.models.Encoded; + +@Disabled +public final class BuiltinOpWriteTests extends BuiltinClientTestBase { + @Test + @Disabled + public void testBuiltinOpWriteTests() { + // method invocation + builtinClient.write(new Builtin(true, "myString", null, 0, 32L, null, 64L, 32.0, 64.0, Duration.parse("PT15M"), + LocalDate.parse("2023-08-29"), OffsetDateTime.parse("2019-10-12T07:20:50.520Z"), + Arrays.asList("a", "b", "c"), null, "https://www.github.com", + mapOf("max", 15.0D, "min", 14.0D, "average", 14.3D), + new Encoded().setTimeInSeconds(Duration.parse("PT15M")) + .setTimeInSecondsFraction(Duration.parse("PT20M0.345S")) + .setDateTime(OffsetDateTime.parse("1966-03-03T00:06:56.52Z")) + .setDateTimeRfc7231(OffsetDateTime.parse("1994-11-06T08:49:37Z")) + .setUnixTimestamp(OffsetDateTime.parse("2023-08-30T02:35:03Z")) + .setBase64("aHR0cHM6Ly93d3cuZ2l0aHViLmNvbQ==".getBytes()) + .setBase64url("aHR0cHM6Ly93d3cuZ2l0aHViLmNvbQ==".getBytes()) + .setCommaDeliminatedArray(Arrays.asList("a", "b", "c")), + null)); + } + + // Use "Map.of" if available + @SuppressWarnings("unchecked") + private static Map mapOf(Object... inputs) { + Map map = new HashMap<>(); + for (int i = 0; i < inputs.length; i += 2) { + String key = (String) inputs[i]; + T value = (T) inputs[i + 1]; + map.put(key, value); + } + return map; + } +}