From acb31a2f1d18902deb3a99a79647a236774c9850 Mon Sep 17 00:00:00 2001 From: ryoppippi <1560508+ryoppippi@users.noreply.github.com> Date: Fri, 12 Dec 2025 17:03:48 +0000 Subject: [PATCH 1/3] refactor(consts): extract USER_AGENT string into constant Replace hard-coded 'stackone-ai-node' User-Agent string with a shared constant to improve maintainability and ensure consistency across the codebase. Changes: - Add USER_AGENT constant to src/consts.ts - Update requestBuilder.ts to use USER_AGENT constant - Update rpc-client.ts to use USER_AGENT constant - Update utils/errors.ts to use USER_AGENT constant - Update requestBuilder.test.ts to use USER_AGENT constant This centralises the User-Agent value, making future updates simpler and reducing the risk of inconsistent values across different modules. --- src/consts.ts | 5 +++++ src/requestBuilder.test.ts | 7 ++++--- src/requestBuilder.ts | 3 ++- src/rpc-client.ts | 3 ++- src/utils/errors.ts | 4 ++-- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/consts.ts b/src/consts.ts index e63929e..a02454c 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -1,3 +1,8 @@ +/** + * Package name used as User-Agent header + */ +export const USER_AGENT = 'stackone-ai-node'; + /** * Default base URL for StackOne API */ diff --git a/src/requestBuilder.test.ts b/src/requestBuilder.test.ts index 084fd2b..b418b07 100644 --- a/src/requestBuilder.test.ts +++ b/src/requestBuilder.test.ts @@ -1,8 +1,9 @@ import { http, HttpResponse } from 'msw'; import { server } from '../mocks/node'; +import { USER_AGENT } from './consts'; +import { RequestBuilder } from './requestBuilder'; import { type HttpExecuteConfig, ParameterLocation } from './types'; import { StackOneAPIError } from './utils/errors'; -import { RequestBuilder } from './requestBuilder'; describe('RequestBuilder', () => { let builder: RequestBuilder; @@ -79,7 +80,7 @@ describe('RequestBuilder', () => { const headers = builder.prepareHeaders(); expect(headers).toEqual({ - 'User-Agent': 'stackone-ai-node', + 'User-Agent': USER_AGENT, 'Initial-Header': 'test', 'Custom-Header': 'value', }); @@ -170,7 +171,7 @@ describe('RequestBuilder', () => { url: 'https://api.example.com/test/path-value', method: 'GET', headers: { - 'User-Agent': 'stackone-ai-node', + 'User-Agent': USER_AGENT, 'Initial-Header': 'test', }, body: undefined, diff --git a/src/requestBuilder.ts b/src/requestBuilder.ts index 973c64e..c729a88 100644 --- a/src/requestBuilder.ts +++ b/src/requestBuilder.ts @@ -1,3 +1,4 @@ +import { USER_AGENT } from './consts'; import { type ExecuteOptions, type HttpBodyType, @@ -57,7 +58,7 @@ export class RequestBuilder { */ prepareHeaders(): Record { return { - 'User-Agent': 'stackone-ai-node', + 'User-Agent': USER_AGENT, ...this.headers, }; } diff --git a/src/rpc-client.ts b/src/rpc-client.ts index a277fd8..47194df 100644 --- a/src/rpc-client.ts +++ b/src/rpc-client.ts @@ -1,3 +1,4 @@ +import { USER_AGENT } from './consts'; import { STACKONE_HEADER_KEYS } from './headers'; import { type RpcActionRequest, @@ -68,7 +69,7 @@ export class RpcClient { const httpHeaders = { 'Content-Type': 'application/json', Authorization: this.authHeader, - 'User-Agent': 'stackone-ai-node', + 'User-Agent': USER_AGENT, ...forwardedHeaders, } satisfies Record; diff --git a/src/utils/errors.ts b/src/utils/errors.ts index 0d01d7c..dd95bea 100644 --- a/src/utils/errors.ts +++ b/src/utils/errors.ts @@ -1,4 +1,4 @@ -// Type aliases for common types +import { USER_AGENT } from '../consts'; /** * Base exception for StackOne errors @@ -73,7 +73,7 @@ export class StackOneAPIError extends StackOneError { // Add request headers information (for debugging) errorMessage += '\n\nRequest Headers:'; errorMessage += '\n- Authorization: [REDACTED]'; - errorMessage += '\n- User-Agent: stackone-ai-node'; + errorMessage += `\n- User-Agent: ${USER_AGENT}`; // Add request body information if available if (this.requestBody) { From d26be852fbc0582b43bdaf9f83ce16d46f4976ee Mon Sep 17 00:00:00 2001 From: ryoppippi <1560508+ryoppippi@users.noreply.github.com> Date: Fri, 12 Dec 2025 17:10:27 +0000 Subject: [PATCH 2/3] refactor(rpc-client): use DEFAULT_BASE_URL constant Replace hard-coded 'https://api.stackone.com' fallback URL with the DEFAULT_BASE_URL constant from consts.ts for consistency. --- src/rpc-client.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rpc-client.ts b/src/rpc-client.ts index 47194df..f2e1f8d 100644 --- a/src/rpc-client.ts +++ b/src/rpc-client.ts @@ -1,4 +1,4 @@ -import { USER_AGENT } from './consts'; +import { DEFAULT_BASE_URL, USER_AGENT } from './consts'; import { STACKONE_HEADER_KEYS } from './headers'; import { type RpcActionRequest, @@ -26,7 +26,7 @@ export class RpcClient { constructor(config: RpcClientConfig) { const validatedConfig = rpcClientConfigSchema.parse(config); - this.baseUrl = validatedConfig.serverURL || 'https://api.stackone.com'; + this.baseUrl = validatedConfig.serverURL || DEFAULT_BASE_URL; const username = validatedConfig.security.username; const password = validatedConfig.security.password || ''; this.authHeader = `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`; From 930aa61c12a5bd06a04add9f76072999bfddd85a Mon Sep 17 00:00:00 2001 From: ryoppippi <1560508+ryoppippi@users.noreply.github.com> Date: Fri, 12 Dec 2025 17:11:18 +0000 Subject: [PATCH 3/3] revert(test): keep hard-coded values in requestBuilder tests Tests should use hard-coded values to properly verify the expected output rather than referencing the same constant being tested. --- src/requestBuilder.test.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/requestBuilder.test.ts b/src/requestBuilder.test.ts index b418b07..084fd2b 100644 --- a/src/requestBuilder.test.ts +++ b/src/requestBuilder.test.ts @@ -1,9 +1,8 @@ import { http, HttpResponse } from 'msw'; import { server } from '../mocks/node'; -import { USER_AGENT } from './consts'; -import { RequestBuilder } from './requestBuilder'; import { type HttpExecuteConfig, ParameterLocation } from './types'; import { StackOneAPIError } from './utils/errors'; +import { RequestBuilder } from './requestBuilder'; describe('RequestBuilder', () => { let builder: RequestBuilder; @@ -80,7 +79,7 @@ describe('RequestBuilder', () => { const headers = builder.prepareHeaders(); expect(headers).toEqual({ - 'User-Agent': USER_AGENT, + 'User-Agent': 'stackone-ai-node', 'Initial-Header': 'test', 'Custom-Header': 'value', }); @@ -171,7 +170,7 @@ describe('RequestBuilder', () => { url: 'https://api.example.com/test/path-value', method: 'GET', headers: { - 'User-Agent': USER_AGENT, + 'User-Agent': 'stackone-ai-node', 'Initial-Header': 'test', }, body: undefined,