diff --git a/packages/datadog-api-client-v1/models/ObjectSerializer.ts b/packages/datadog-api-client-v1/models/ObjectSerializer.ts index e5d375b7657f..997512e3b7af 100644 --- a/packages/datadog-api-client-v1/models/ObjectSerializer.ts +++ b/packages/datadog-api-client-v1/models/ObjectSerializer.ts @@ -3339,31 +3339,52 @@ export class ObjectSerializer { const instance = new typeMap[type](); const attributesMap = typeMap[type].getAttributeTypeMap(); - const attributesBaseNames = Object.keys(attributesMap).reduce( - (o, key) => Object.assign(o, { [attributesMap[key].baseName]: "" }), - {} - ); + const keepAllInAdditional = + (typeMap[type] as any)._keepTypedInAdditionalProperties === true; + // Single pass: build attributesBaseNames (for extra-key detection) and, when needed, + // baseNameToAttr (for per-field typed deserialization preserving int64 precision). + const attributesBaseNames: { [key: string]: string } = {}; + const baseNameToAttr: { [key: string]: any } = {}; + for (const attrName in attributesMap) { + const baseName = attributesMap[attrName].baseName; + attributesBaseNames[baseName] = ""; + if (keepAllInAdditional && attrName !== "additionalProperties") { + baseNameToAttr[baseName] = attributesMap[attrName]; + } + } const extraAttributes = Object.keys(data).filter( - (key) => !Object.prototype.hasOwnProperty.call(attributesBaseNames, key) + (key) => + keepAllInAdditional || + !Object.prototype.hasOwnProperty.call(attributesBaseNames, key) ); if (extraAttributes.length > 0) { if ("additionalProperties" in attributesMap) { - if (!instance.additionalProperties) { - instance.additionalProperties = {}; - } - const additionalProperties: { [key: string]: any } = {}; - for (const key of extraAttributes) { - additionalProperties[key] = data[key]; + if (keepAllInAdditional) { + for (const key of extraAttributes) { + const attrInfo = baseNameToAttr[key]; + // Use per-field type/format for typed attrs to preserve int64 precision. + additionalProperties[key] = attrInfo + ? ObjectSerializer.deserialize( + data[key], + attrInfo.type, + attrInfo.format + ) + : data[key]; + } + instance.additionalProperties = additionalProperties; + } else { + for (const key of extraAttributes) { + additionalProperties[key] = data[key]; + } + const attributeObj = attributesMap["additionalProperties"]; + instance.additionalProperties = ObjectSerializer.deserialize( + additionalProperties, + attributeObj.type, + attributeObj.format + ); } - - const attributeObj = attributesMap["additionalProperties"]; - instance.additionalProperties = ObjectSerializer.deserialize( - additionalProperties, - attributeObj.type, - attributeObj.format - ); } else { throw new Error( `found extra attributes '${extraAttributes}' in ${type}` diff --git a/packages/datadog-api-client-v1/models/UsageSummaryDate.ts b/packages/datadog-api-client-v1/models/UsageSummaryDate.ts index dc74ed981206..9f9bba0933c3 100644 --- a/packages/datadog-api-client-v1/models/UsageSummaryDate.ts +++ b/packages/datadog-api-client-v1/models/UsageSummaryDate.ts @@ -1269,6 +1269,11 @@ export class UsageSummaryDate { */ "_unparsed"?: boolean; + /** + * @ignore + */ + static readonly _keepTypedInAdditionalProperties = true; + /** * @ignore */ diff --git a/packages/datadog-api-client-v1/models/UsageSummaryDateOrg.ts b/packages/datadog-api-client-v1/models/UsageSummaryDateOrg.ts index 2180f8b16ba4..5bd804d09d3e 100644 --- a/packages/datadog-api-client-v1/models/UsageSummaryDateOrg.ts +++ b/packages/datadog-api-client-v1/models/UsageSummaryDateOrg.ts @@ -1292,6 +1292,11 @@ export class UsageSummaryDateOrg { */ "_unparsed"?: boolean; + /** + * @ignore + */ + static readonly _keepTypedInAdditionalProperties = true; + /** * @ignore */ diff --git a/packages/datadog-api-client-v1/models/UsageSummaryResponse.ts b/packages/datadog-api-client-v1/models/UsageSummaryResponse.ts index 0aff482a5798..45180af90e89 100644 --- a/packages/datadog-api-client-v1/models/UsageSummaryResponse.ts +++ b/packages/datadog-api-client-v1/models/UsageSummaryResponse.ts @@ -1315,6 +1315,11 @@ export class UsageSummaryResponse { */ "_unparsed"?: boolean; + /** + * @ignore + */ + static readonly _keepTypedInAdditionalProperties = true; + /** * @ignore */ diff --git a/packages/datadog-api-client-v2/models/ObjectSerializer.ts b/packages/datadog-api-client-v2/models/ObjectSerializer.ts index f435551d4819..7a7939949d3f 100644 --- a/packages/datadog-api-client-v2/models/ObjectSerializer.ts +++ b/packages/datadog-api-client-v2/models/ObjectSerializer.ts @@ -14701,31 +14701,52 @@ export class ObjectSerializer { const instance = new typeMap[type](); const attributesMap = typeMap[type].getAttributeTypeMap(); - const attributesBaseNames = Object.keys(attributesMap).reduce( - (o, key) => Object.assign(o, { [attributesMap[key].baseName]: "" }), - {} - ); + const keepAllInAdditional = + (typeMap[type] as any)._keepTypedInAdditionalProperties === true; + // Single pass: build attributesBaseNames (for extra-key detection) and, when needed, + // baseNameToAttr (for per-field typed deserialization preserving int64 precision). + const attributesBaseNames: { [key: string]: string } = {}; + const baseNameToAttr: { [key: string]: any } = {}; + for (const attrName in attributesMap) { + const baseName = attributesMap[attrName].baseName; + attributesBaseNames[baseName] = ""; + if (keepAllInAdditional && attrName !== "additionalProperties") { + baseNameToAttr[baseName] = attributesMap[attrName]; + } + } const extraAttributes = Object.keys(data).filter( - (key) => !Object.prototype.hasOwnProperty.call(attributesBaseNames, key) + (key) => + keepAllInAdditional || + !Object.prototype.hasOwnProperty.call(attributesBaseNames, key) ); if (extraAttributes.length > 0) { if ("additionalProperties" in attributesMap) { - if (!instance.additionalProperties) { - instance.additionalProperties = {}; - } - const additionalProperties: { [key: string]: any } = {}; - for (const key of extraAttributes) { - additionalProperties[key] = data[key]; + if (keepAllInAdditional) { + for (const key of extraAttributes) { + const attrInfo = baseNameToAttr[key]; + // Use per-field type/format for typed attrs to preserve int64 precision. + additionalProperties[key] = attrInfo + ? ObjectSerializer.deserialize( + data[key], + attrInfo.type, + attrInfo.format + ) + : data[key]; + } + instance.additionalProperties = additionalProperties; + } else { + for (const key of extraAttributes) { + additionalProperties[key] = data[key]; + } + const attributeObj = attributesMap["additionalProperties"]; + instance.additionalProperties = ObjectSerializer.deserialize( + additionalProperties, + attributeObj.type, + attributeObj.format + ); } - - const attributeObj = attributesMap["additionalProperties"]; - instance.additionalProperties = ObjectSerializer.deserialize( - additionalProperties, - attributeObj.type, - attributeObj.format - ); } else { throw new Error( `found extra attributes '${extraAttributes}' in ${type}`