From 4d0ae63831283d112fcbc73cdcba9f0cbdc3395e Mon Sep 17 00:00:00 2001 From: Jacob McKenzie Date: Tue, 3 Mar 2026 11:14:16 -0700 Subject: [PATCH] Added three new fields to the Metadata struct: IANATimeZone (string), IANAUTCOffset (float32), and IANADST (bool). These three new fields are accessible via setting a new feature flag "iana-timezone" --- src/ClientBuilder.js | 25 +++++++++++++++---------- src/us_street/Candidate.js | 3 +++ tests/test_ClientBuilder.ts | 23 +++++++++++++++++++++++ tests/us_street/test_Candidate.js | 6 ++++++ 4 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 tests/test_ClientBuilder.ts diff --git a/src/ClientBuilder.js b/src/ClientBuilder.js index 8fa8b37..d510f2e 100644 --- a/src/ClientBuilder.js +++ b/src/ClientBuilder.js @@ -2,9 +2,12 @@ const HttpSender = require("./HttpSender"); const SigningSender = require("./SigningSender"); const BaseUrlSender = require("./BaseUrlSender"); const AgentSender = require("./AgentSender"); -const StaticCredentials = require("./StaticCredentials"); -const SharedCredentials = require("./SharedCredentials"); -const BasicAuthCredentials = require("./BasicAuthCredentials"); +const _StaticCredentials = require("./StaticCredentials"); +const StaticCredentials = _StaticCredentials.default || _StaticCredentials; +const _SharedCredentials = require("./SharedCredentials"); +const SharedCredentials = _SharedCredentials.default || _SharedCredentials; +const _BasicAuthCredentials = require("./BasicAuthCredentials"); +const BasicAuthCredentials = _BasicAuthCredentials.default || _BasicAuthCredentials; const CustomHeaderSender = require("./CustomHeaderSender"); const StatusCodeSender = require("./StatusCodeSender"); const LicenseSender = require("./LicenseSender"); @@ -194,13 +197,8 @@ class ClientBuilder { * @return ClientBuilder this to accommodate method chaining. */ withCustomCommaSeperatedQuery(key, value) { - let values = this.customQueries.get(key); - if (values === "") { - values = value; - } else { - values += "," + value; - } - this.customQueries.set(key, values); + const existing = this.customQueries.get(key); + this.customQueries.set(key, existing ? existing + "," + value : value); return this; } @@ -228,6 +226,13 @@ class ClientBuilder { return this.withCustomCommaSeperatedQuery("features", "occupant-use"); } + /** + * Adds to the request query to use the IANA timezone feature. + * @return ClientBuilder this to accommodate method chaining. + */ + withFeatureIANATimeZone() { + return this.withCustomCommaSeperatedQuery("features", "iana-timezone"); + } buildSender() { if (this.httpSender) return this.httpSender; diff --git a/src/us_street/Candidate.js b/src/us_street/Candidate.js index eb160cf..5ccfe3c 100644 --- a/src/us_street/Candidate.js +++ b/src/us_street/Candidate.js @@ -64,6 +64,9 @@ class Candidate { this.metadata.timeZone = responseData.metadata.time_zone; this.metadata.utcOffset = responseData.metadata.utc_offset; this.metadata.obeysDst = responseData.metadata.dst; + this.metadata.ianaTimeZone = responseData.metadata.iana_time_zone; + this.metadata.ianaUtcOffset = responseData.metadata.iana_utc_offset; + this.metadata.ianaDst = responseData.metadata.iana_dst; this.metadata.isEwsMatch = responseData.metadata.ews_match; } diff --git a/tests/test_ClientBuilder.ts b/tests/test_ClientBuilder.ts new file mode 100644 index 0000000..57354bc --- /dev/null +++ b/tests/test_ClientBuilder.ts @@ -0,0 +1,23 @@ +import { expect } from "chai"; +import StaticCredentials from "../src/StaticCredentials.js"; +// eslint-disable-next-line @typescript-eslint/no-require-imports +const ClientBuilder = require("../src/ClientBuilder"); + +describe("ClientBuilder", function () { + const credentials = new StaticCredentials("test-id", "test-token"); + + it("sets the iana-timezone feature flag.", function () { + const builder = new ClientBuilder(credentials); + builder.withFeatureIANATimeZone(); + + expect(builder.customQueries.get("features")).to.equal("iana-timezone"); + }); + + it("appends iana-timezone when combined with component-analysis.", function () { + const builder = new ClientBuilder(credentials); + builder.withFeatureComponentAnalysis(); + builder.withFeatureIANATimeZone(); + + expect(builder.customQueries.get("features")).to.equal("component-analysis,iana-timezone"); + }); +}); diff --git a/tests/us_street/test_Candidate.js b/tests/us_street/test_Candidate.js index 2bfd515..1211d00 100644 --- a/tests/us_street/test_Candidate.js +++ b/tests/us_street/test_Candidate.js @@ -52,6 +52,9 @@ describe("A match candidate", function () { time_zone: "39", utc_offset: 40.0, dst: "41", + iana_time_zone: "68", + iana_utc_offset: 69.0, + iana_dst: "70", ews_match: "47", }, analysis: { @@ -132,6 +135,9 @@ describe("A match candidate", function () { expect(candidate.metadata.timeZone).to.equal("39"); expect(candidate.metadata.utcOffset).to.equal(40.0); expect(candidate.metadata.obeysDst).to.equal("41"); + expect(candidate.metadata.ianaTimeZone).to.equal("68"); + expect(candidate.metadata.ianaUtcOffset).to.equal(69.0); + expect(candidate.metadata.ianaDst).to.equal("70"); expect(candidate.metadata.isEwsMatch).to.equal("47"); expect(candidate.analysis.dpvMatchCode).to.equal("42");