netsuite-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +258 -0
- package/dist/index.d.mts +457 -0
- package/dist/index.d.ts +457 -0
- package/dist/index.js +839 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +819 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/transport/oauth.ts","../src/types/errors.ts","../src/transport/retry.ts","../src/transport/middleware-chain.ts","../src/types/http.ts","../src/transport/http-transport.ts","../src/suiteql/suiteql-client.ts","../src/records/record-client.ts","../src/restlets/restlet-client.ts","../src/utils/validation.ts","../src/client.ts","../src/suiteql/query-builder.ts","../src/utils/response-cache.ts","../src/utils/rate-limiter.ts","../src/utils/date.ts","../src/utils/error-parser.ts","../src/utils/url-builder.ts"],"names":["OAuth","createHmac","axios","http","https","month","day","year"],"mappings":"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","file":"index.js","sourcesContent":["import OAuth from 'oauth-1.0a';\nimport { createHmac } from 'node:crypto';\nimport type { OAuthConfig } from '../types/config.js';\nimport type { HttpMethod } from '../types/http.js';\n\n/**\n * Creates a reusable OAuth 1.0a signing function.\n * Each invocation generates a fresh nonce and timestamp,\n * so it's safe to call on every request (including retries).\n */\nexport function createOAuthSigner(\n config: OAuthConfig,\n): (url: string, method: HttpMethod) => Record<string, string> {\n const oauth = new OAuth({\n consumer: { key: config.consumerKey, secret: config.consumerSecret },\n signature_method: 'HMAC-SHA256',\n hash_function: (baseString: string, key: string) =>\n createHmac('sha256', key).update(baseString).digest('base64'),\n realm: config.realm,\n });\n\n const token = { key: config.tokenKey, secret: config.tokenSecret };\n\n return (url: string, method: HttpMethod): Record<string, string> => {\n const requestData = { url, method };\n const authorization = oauth.authorize(requestData, token);\n return oauth.toHeader(authorization) as unknown as Record<string, string>;\n };\n}\n","import type { HttpMethod } from './http.js';\n\nexport interface NetSuiteErrorDetail {\n type?: string;\n title?: string;\n status?: number;\n detail?: string;\n 'o:errorCode'?: string;\n 'o:errorDetails'?: Array<{\n detail?: string;\n 'o:errorCode'?: string;\n 'o:errorPath'?: string;\n }>;\n}\n\nexport class NetSuiteError extends Error {\n public readonly status: number;\n public readonly code: string;\n public readonly details?: NetSuiteErrorDetail;\n public readonly requestUrl?: string;\n public readonly requestMethod?: HttpMethod;\n\n constructor(\n message: string,\n status: number,\n code: string,\n details?: NetSuiteErrorDetail,\n requestUrl?: string,\n requestMethod?: HttpMethod,\n ) {\n super(message);\n this.name = 'NetSuiteError';\n this.status = status;\n this.code = code;\n this.details = details;\n this.requestUrl = requestUrl;\n this.requestMethod = requestMethod;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, NetSuiteError);\n }\n }\n\n /** Whether this is a retryable error (5xx, timeout, network) */\n get isRetryable(): boolean {\n return this.status >= 500 || this.code === 'TIMEOUT' || this.code === 'NETWORK_ERROR';\n }\n\n /** Whether this is an auth error (401, 403) */\n get isAuthError(): boolean {\n return this.status === 401 || this.status === 403;\n }\n\n static isNetSuiteError(error: unknown): error is NetSuiteError {\n return error instanceof NetSuiteError;\n }\n}\n","import { NetSuiteError } from '../types/errors.js';\n\nexport interface RetryConfig {\n maxRetries: number;\n initialDelay: number;\n maxDelay: number;\n backoffFactor: number;\n shouldRetry: (error: unknown, attempt: number) => boolean;\n onRetry?: (error: unknown, attempt: number) => void;\n}\n\nconst DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n initialDelay: 1000,\n maxDelay: 30_000,\n backoffFactor: 2,\n shouldRetry: (error: unknown) => {\n if (error instanceof NetSuiteError) {\n return error.isRetryable;\n }\n // Retry unknown errors (network failures, etc.)\n return true;\n },\n};\n\n/**\n * Execute a function with exponential backoff retry + jitter.\n * Each retry calls `fn()` fresh, so OAuth signatures get new nonces.\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: Partial<RetryConfig> = {},\n): Promise<T> {\n const opts = { ...DEFAULT_RETRY_CONFIG, ...config };\n\n for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n const isLastAttempt = attempt === opts.maxRetries;\n if (isLastAttempt || !opts.shouldRetry(error, attempt)) {\n throw error;\n }\n\n opts.onRetry?.(error, attempt + 1);\n\n const delay = Math.min(\n opts.initialDelay * Math.pow(opts.backoffFactor, attempt),\n opts.maxDelay,\n );\n // Add jitter: +/- 25% to prevent thundering herd\n const jitter = delay * 0.25 * (Math.random() * 2 - 1);\n await new Promise((resolve) => setTimeout(resolve, delay + jitter));\n }\n }\n\n // Unreachable, but satisfies TypeScript\n throw new Error('Retry loop exited unexpectedly');\n}\n","import type { Middleware, RequestContext, ResponseContext } from '../types/middleware.js';\n\n/**\n * Execute a chain of middleware functions, then the final handler.\n * Each middleware can modify the request context before calling next(),\n * and inspect/modify the response after.\n */\nexport function executeMiddlewareChain(\n middlewares: Middleware[],\n context: RequestContext,\n finalHandler: () => Promise<ResponseContext>,\n): Promise<ResponseContext> {\n let index = 0;\n\n function next(): Promise<ResponseContext> {\n if (index >= middlewares.length) {\n return finalHandler();\n }\n const middleware = middlewares[index++];\n return middleware(context, next);\n }\n\n return next();\n}\n","import type { AxiosResponse } from 'axios';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport interface RequestOptions {\n method?: HttpMethod;\n headers?: Record<string, string>;\n body?: unknown;\n /** Override timeout for this request */\n timeout?: number;\n /** Override retry count for this request */\n maxRetries?: number;\n}\n\nexport interface NetSuiteResponse<T = unknown> {\n data: T;\n status: number;\n headers: Record<string, string>;\n duration: number;\n}\n\n/** Convert AxiosResponse headers to a plain record */\nexport function extractHeaders(response: AxiosResponse): Record<string, string> {\n const headers: Record<string, string> = {};\n if (response.headers) {\n for (const [key, value] of Object.entries(response.headers)) {\n if (typeof value === 'string') {\n headers[key] = value;\n }\n }\n }\n return headers;\n}\n","import axios, { type AxiosInstance, type AxiosError } from 'axios';\nimport http from 'node:http';\nimport https from 'node:https';\nimport { createOAuthSigner } from './oauth.js';\nimport { withRetry } from './retry.js';\nimport { executeMiddlewareChain } from './middleware-chain.js';\nimport { NetSuiteError } from '../types/errors.js';\nimport { extractHeaders } from '../types/http.js';\nimport type { NetSuiteConfig } from '../types/config.js';\nimport type { HttpMethod, RequestOptions, NetSuiteResponse } from '../types/http.js';\nimport type { Middleware, RequestContext, ResponseContext } from '../types/middleware.js';\nimport type { Logger } from '../types/logger.js';\n\ninterface ResolvedConfig {\n timeout: number;\n maxRetries: number;\n retryDelay: number;\n defaultHeaders: Record<string, string>;\n logger?: Logger;\n}\n\nexport class HttpTransport {\n private sign: (url: string, method: HttpMethod) => Record<string, string>;\n private axiosInstance: AxiosInstance;\n private middlewares: Middleware[] = [];\n private config: ResolvedConfig;\n\n constructor(config: NetSuiteConfig) {\n this.config = {\n timeout: config.timeout ?? 30_000,\n maxRetries: config.maxRetries ?? 3,\n retryDelay: config.retryDelay ?? 1000,\n defaultHeaders: config.defaultHeaders ?? {},\n logger: config.logger,\n };\n\n this.sign = createOAuthSigner(config.auth);\n\n this.axiosInstance = axios.create({\n timeout: this.config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n 'Accept-Encoding': 'gzip, deflate',\n },\n httpAgent: new http.Agent({ keepAlive: true }),\n httpsAgent: new https.Agent({ keepAlive: true }),\n maxRedirects: 5,\n // Let us handle all status codes in our error handling\n validateStatus: () => true,\n });\n }\n\n /** Add a middleware to the chain. Returns `this` for chaining. */\n use(middleware: Middleware): this {\n this.middlewares.push(middleware);\n return this;\n }\n\n /** Execute an HTTP request with OAuth signing, retry, and middleware. */\n async request<T = unknown>(\n url: string,\n options: RequestOptions = {},\n ): Promise<NetSuiteResponse<T>> {\n const method = options.method ?? 'GET';\n const timeout = options.timeout ?? this.config.timeout;\n const maxRetries = options.maxRetries ?? this.config.maxRetries;\n\n return withRetry(\n async () => {\n // Re-sign on each attempt (fresh nonce/timestamp)\n const authHeaders = this.sign(url, method);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.config.defaultHeaders,\n ...authHeaders,\n ...options.headers,\n };\n\n const context: RequestContext = {\n url,\n method,\n headers,\n body: options.body,\n metadata: {},\n };\n\n // Execute middleware chain, then the actual HTTP call\n const response = await executeMiddlewareChain(\n this.middlewares,\n context,\n () => this.executeRequest<T>(context, timeout),\n );\n\n return {\n data: response.body as T,\n status: response.status,\n headers: response.headers,\n duration: response.duration,\n };\n },\n {\n maxRetries,\n initialDelay: this.config.retryDelay,\n shouldRetry: (error) => {\n if (error instanceof NetSuiteError) {\n return error.isRetryable;\n }\n return true;\n },\n onRetry: (error, attempt) => {\n this.config.logger?.warn(`Retry attempt ${attempt}/${maxRetries}`, {\n url,\n method,\n error,\n });\n },\n },\n );\n }\n\n private async executeRequest<T>(\n context: RequestContext,\n timeout: number,\n ): Promise<ResponseContext> {\n const startTime = performance.now();\n\n try {\n this.config.logger?.debug(`${context.method} ${context.url}`, {\n headers: Object.keys(context.headers),\n });\n\n const response = await this.axiosInstance.request({\n url: context.url,\n method: context.method,\n headers: context.headers,\n data:\n context.body && ['POST', 'PUT', 'PATCH'].includes(context.method)\n ? context.body\n : undefined,\n timeout,\n });\n\n const duration = Math.round(performance.now() - startTime);\n\n this.config.logger?.info(`${context.method} ${context.url} → ${response.status}`, {\n duration,\n });\n\n // Throw on non-2xx responses\n if (response.status >= 400) {\n const errorBody = response.data ?? {};\n const message =\n errorBody.detail ??\n errorBody.title ??\n errorBody.message ??\n `HTTP ${response.status}`;\n const code =\n errorBody['o:errorCode'] ??\n errorBody.code ??\n `HTTP_${response.status}`;\n\n throw new NetSuiteError(\n message,\n response.status,\n code,\n errorBody,\n context.url,\n context.method,\n );\n }\n\n return {\n status: response.status,\n headers: extractHeaders(response),\n body: response.status === 204 ? undefined : response.data,\n duration,\n };\n } catch (error) {\n if (error instanceof NetSuiteError) {\n throw error;\n }\n\n const duration = Math.round(performance.now() - startTime);\n const axiosError = error as AxiosError;\n\n if (axiosError.code === 'ECONNABORTED' || axiosError.code === 'ERR_CANCELED') {\n throw new NetSuiteError(\n `Request timed out after ${timeout}ms`,\n 504,\n 'TIMEOUT',\n undefined,\n context.url,\n context.method,\n );\n }\n\n throw new NetSuiteError(\n axiosError.message || 'Network error',\n 0,\n 'NETWORK_ERROR',\n undefined,\n context.url,\n context.method,\n );\n }\n }\n}\n","import type { HttpTransport } from '../transport/http-transport.js';\nimport type { SuiteQLOptions, SuiteQLResult, SuiteQLRawResponse } from '../types/suiteql.js';\n\n/**\n * SuiteQL client for executing queries against the NetSuite SuiteQL REST endpoint.\n *\n * Handles the `Prefer: transient` header requirement and automatic pagination.\n */\nexport class SuiteQLClient {\n private transport: HttpTransport;\n private baseUrl: string;\n\n constructor(transport: HttpTransport, accountId: string) {\n this.transport = transport;\n const normalizedId = accountId.toLowerCase().replace(/_/g, '-');\n this.baseUrl = `https://${normalizedId}.suitetalk.api.netsuite.com/services/rest/query/v1/suiteql`;\n }\n\n /**\n * Execute a SuiteQL query and return all matching rows.\n * Automatically paginates across multiple pages.\n *\n * @example\n * ```ts\n * const result = await client.suiteql.query<Customer>(\n * 'SELECT id, companyname, email FROM customer WHERE isinactive = \\'F\\'',\n * { pageSize: 500 }\n * );\n * console.log(result.items); // all rows\n * console.log(result.totalResults); // total count from NetSuite\n * ```\n */\n async query<T = Record<string, unknown>>(\n sql: string,\n options: SuiteQLOptions = {},\n ): Promise<SuiteQLResult<T>> {\n const {\n pageSize = 1000,\n offset: startOffset = 0,\n maxRows = Infinity,\n timeout,\n } = options;\n\n const allItems: T[] = [];\n let currentOffset = startOffset;\n let totalResults = 0;\n let pagesFetched = 0;\n const startTime = performance.now();\n\n while (true) {\n const effectiveLimit = Math.min(pageSize, maxRows - allItems.length);\n if (effectiveLimit <= 0) break;\n\n const url = `${this.baseUrl}?limit=${effectiveLimit}&offset=${currentOffset}`;\n\n const response = await this.transport.request<SuiteQLRawResponse<T>>(url, {\n method: 'POST',\n body: { q: sql },\n headers: { Prefer: 'transient' },\n timeout,\n });\n\n const page = response.data;\n totalResults = page.totalResults;\n pagesFetched++;\n\n allItems.push(...page.items);\n\n // Determine if more pages exist\n const hasMore = page.hasMore || currentOffset + page.items.length < totalResults;\n if (!hasMore || allItems.length >= maxRows || page.items.length === 0) break;\n\n currentOffset += page.items.length;\n }\n\n return {\n items: allItems,\n totalResults,\n pagesFetched,\n hasMore: allItems.length < totalResults,\n duration: Math.round(performance.now() - startTime),\n };\n }\n\n /**\n * Execute a query and return a single row, or null if not found.\n *\n * @example\n * ```ts\n * const customer = await client.suiteql.queryOne<Customer>(\n * 'SELECT id, companyname FROM customer WHERE id = 123'\n * );\n * ```\n */\n async queryOne<T = Record<string, unknown>>(\n sql: string,\n options?: Omit<SuiteQLOptions, 'maxRows'>,\n ): Promise<T | null> {\n const result = await this.query<T>(sql, { ...options, maxRows: 1 });\n return result.items[0] ?? null;\n }\n\n /**\n * Execute a query and yield pages as an async generator.\n * Useful for streaming large result sets without holding everything in memory.\n *\n * @example\n * ```ts\n * for await (const page of client.suiteql.queryPages<Transaction>(\n * 'SELECT id, tranid, total FROM transaction',\n * { pageSize: 500 }\n * )) {\n * await processBatch(page);\n * }\n * ```\n */\n async *queryPages<T = Record<string, unknown>>(\n sql: string,\n options: SuiteQLOptions = {},\n ): AsyncGenerator<T[], void, undefined> {\n const {\n pageSize = 1000,\n offset: startOffset = 0,\n maxRows = Infinity,\n timeout,\n } = options;\n\n let currentOffset = startOffset;\n let totalYielded = 0;\n\n while (true) {\n const effectiveLimit = Math.min(pageSize, maxRows - totalYielded);\n if (effectiveLimit <= 0) return;\n\n const url = `${this.baseUrl}?limit=${effectiveLimit}&offset=${currentOffset}`;\n\n const response = await this.transport.request<SuiteQLRawResponse<T>>(url, {\n method: 'POST',\n body: { q: sql },\n headers: { Prefer: 'transient' },\n timeout,\n });\n\n const page = response.data;\n\n if (page.items.length === 0) return;\n\n yield page.items;\n\n totalYielded += page.items.length;\n const hasMore = page.hasMore || currentOffset + page.items.length < page.totalResults;\n if (!hasMore || totalYielded >= maxRows) return;\n\n currentOffset += page.items.length;\n }\n }\n}\n","import type { HttpTransport } from '../transport/http-transport.js';\nimport type { NetSuiteResponse } from '../types/http.js';\nimport type {\n RecordType,\n RecordGetOptions,\n RecordListOptions,\n RecordListResponse,\n} from '../types/records.js';\n\n/**\n * Client for NetSuite REST Record API v1.\n * Provides CRUD operations on NetSuite records.\n */\nexport class RecordClient {\n private transport: HttpTransport;\n private baseUrl: string;\n\n constructor(transport: HttpTransport, accountId: string) {\n this.transport = transport;\n const normalizedId = accountId.toLowerCase().replace(/_/g, '-');\n this.baseUrl = `https://${normalizedId}.suitetalk.api.netsuite.com/services/rest/record/v1`;\n }\n\n /** Get a record by type and internal ID */\n async get<T = Record<string, unknown>>(\n recordType: RecordType,\n id: string | number,\n options?: RecordGetOptions,\n ): Promise<NetSuiteResponse<T>> {\n const params = new URLSearchParams();\n if (options?.fields?.length) {\n params.set('fields', options.fields.join(','));\n }\n if (options?.expandSubResources) {\n params.set('expandSubResources', 'true');\n }\n const qs = params.toString();\n const url = `${this.baseUrl}/${recordType}/${id}${qs ? `?${qs}` : ''}`;\n\n return this.transport.request<T>(url);\n }\n\n /** List records of a given type */\n async list<T = Record<string, unknown>>(\n recordType: RecordType,\n options?: RecordListOptions,\n ): Promise<NetSuiteResponse<RecordListResponse<T>>> {\n const params = new URLSearchParams();\n if (options?.limit != null) params.set('limit', String(options.limit));\n if (options?.offset != null) params.set('offset', String(options.offset));\n if (options?.fields?.length) params.set('fields', options.fields.join(','));\n if (options?.expandSubResources) params.set('expandSubResources', 'true');\n if (options?.query) {\n for (const [key, value] of Object.entries(options.query)) {\n params.set(key, value);\n }\n }\n const qs = params.toString();\n const url = `${this.baseUrl}/${recordType}${qs ? `?${qs}` : ''}`;\n\n return this.transport.request<RecordListResponse<T>>(url);\n }\n\n /** Create a new record */\n async create<T = Record<string, unknown>>(\n recordType: RecordType,\n body: Record<string, unknown>,\n ): Promise<NetSuiteResponse<T>> {\n return this.transport.request<T>(`${this.baseUrl}/${recordType}`, {\n method: 'POST',\n body,\n });\n }\n\n /** Update an existing record (partial update via PATCH) */\n async update<T = Record<string, unknown>>(\n recordType: RecordType,\n id: string | number,\n body: Record<string, unknown>,\n ): Promise<NetSuiteResponse<T>> {\n return this.transport.request<T>(`${this.baseUrl}/${recordType}/${id}`, {\n method: 'PATCH',\n body,\n });\n }\n\n /** Replace an existing record (full replace via PUT) */\n async replace<T = Record<string, unknown>>(\n recordType: RecordType,\n id: string | number,\n body: Record<string, unknown>,\n ): Promise<NetSuiteResponse<T>> {\n return this.transport.request<T>(`${this.baseUrl}/${recordType}/${id}`, {\n method: 'PUT',\n body,\n });\n }\n\n /** Delete a record */\n async delete(\n recordType: RecordType,\n id: string | number,\n ): Promise<NetSuiteResponse<void>> {\n return this.transport.request<void>(`${this.baseUrl}/${recordType}/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Upsert: create or update based on external ID */\n async upsert<T = Record<string, unknown>>(\n recordType: RecordType,\n externalIdField: string,\n externalIdValue: string,\n body: Record<string, unknown>,\n ): Promise<NetSuiteResponse<T>> {\n return this.transport.request<T>(\n `${this.baseUrl}/${recordType}/eid:${externalIdField}=${externalIdValue}`,\n { method: 'PUT', body },\n );\n }\n}\n","import type { HttpTransport } from '../transport/http-transport.js';\nimport type { RequestOptions, NetSuiteResponse } from '../types/http.js';\n\nexport interface RestletParams {\n /** Script ID of the RESTlet */\n script: string | number;\n /** Deploy ID of the RESTlet */\n deploy: string | number;\n /** Additional query parameters */\n params?: Record<string, string | number | boolean>;\n}\n\n/**\n * Client for calling NetSuite RESTlets.\n * Auto-builds the RESTlet URL from account ID, script, and deploy IDs.\n */\nexport class RestletClient {\n private transport: HttpTransport;\n private baseUrl: string;\n\n constructor(transport: HttpTransport, accountId: string) {\n this.transport = transport;\n const normalizedId = accountId.toLowerCase().replace(/_/g, '-');\n this.baseUrl = `https://${normalizedId}.restlets.api.netsuite.com/app/site/hosting/restlet.nl`;\n }\n\n /** Execute a RESTlet call */\n async call<T = unknown>(\n restlet: RestletParams,\n options?: RequestOptions,\n ): Promise<NetSuiteResponse<T>> {\n const searchParams = new URLSearchParams({\n script: String(restlet.script),\n deploy: String(restlet.deploy),\n });\n\n if (restlet.params) {\n for (const [key, value] of Object.entries(restlet.params)) {\n searchParams.set(key, String(value));\n }\n }\n\n const url = `${this.baseUrl}?${searchParams.toString()}`;\n return this.transport.request<T>(url, options);\n }\n}\n","import type { NetSuiteConfig } from '../types/config.js';\n\n/** Validate a NetSuiteConfig and return an array of error messages (empty = valid). */\nexport function validateConfig(config: unknown): string[] {\n const errors: string[] = [];\n\n if (!config || typeof config !== 'object') {\n return ['Config must be a non-null object'];\n }\n\n const c = config as Record<string, unknown>;\n\n // auth\n if (!c.auth || typeof c.auth !== 'object') {\n errors.push('auth is required and must be an object');\n } else {\n const auth = c.auth as Record<string, unknown>;\n const requiredFields = ['consumerKey', 'consumerSecret', 'tokenKey', 'tokenSecret', 'realm'];\n for (const field of requiredFields) {\n if (!auth[field] || typeof auth[field] !== 'string') {\n errors.push(`auth.${field} is required and must be a non-empty string`);\n }\n }\n }\n\n // accountId\n if (!c.accountId || typeof c.accountId !== 'string') {\n errors.push('accountId is required and must be a non-empty string');\n }\n\n return errors;\n}\n","import { HttpTransport } from './transport/http-transport.js';\nimport { SuiteQLClient } from './suiteql/suiteql-client.js';\nimport { RecordClient } from './records/record-client.js';\nimport { RestletClient } from './restlets/restlet-client.js';\nimport { validateConfig } from './utils/validation.js';\nimport type { NetSuiteConfig } from './types/config.js';\nimport type { RequestOptions, NetSuiteResponse } from './types/http.js';\nimport type { Middleware } from './types/middleware.js';\n\n/**\n * Main NetSuite API client.\n *\n * Provides namespaced access to SuiteQL, Record, and RESTlet APIs,\n * plus raw HTTP methods as an escape hatch.\n *\n * @example\n * ```ts\n * import { NetSuiteClient } from 'netsuite-sdk';\n *\n * const client = new NetSuiteClient({\n * auth: {\n * consumerKey: '...',\n * consumerSecret: '...',\n * tokenKey: '...',\n * tokenSecret: '...',\n * realm: '1234567',\n * },\n * accountId: '1234567',\n * });\n *\n * // SuiteQL\n * const result = await client.suiteql.query('SELECT id, companyname FROM customer');\n *\n * // Records\n * const customer = await client.records.get('customer', 123);\n *\n * // RESTlets\n * const data = await client.restlets.call({ script: '1', deploy: '1' });\n * ```\n */\nexport class NetSuiteClient {\n /** SuiteQL query execution and builder */\n public readonly suiteql: SuiteQLClient;\n\n /** REST Record API CRUD */\n public readonly records: RecordClient;\n\n /** RESTlet caller */\n public readonly restlets: RestletClient;\n\n private readonly transport: HttpTransport;\n\n constructor(config: NetSuiteConfig) {\n const errors = validateConfig(config);\n if (errors.length > 0) {\n throw new Error(`Invalid NetSuite configuration:\\n - ${errors.join('\\n - ')}`);\n }\n\n this.transport = new HttpTransport(config);\n this.suiteql = new SuiteQLClient(this.transport, config.accountId);\n this.records = new RecordClient(this.transport, config.accountId);\n this.restlets = new RestletClient(this.transport, config.accountId);\n }\n\n /** Add middleware to all requests. Returns `this` for chaining. */\n use(middleware: Middleware): this {\n this.transport.use(middleware);\n return this;\n }\n\n /** Make a raw HTTP request (escape hatch for custom endpoints). */\n async request<T = unknown>(\n url: string,\n options?: RequestOptions,\n ): Promise<NetSuiteResponse<T>> {\n return this.transport.request<T>(url, options);\n }\n\n /** Convenience: GET request */\n async get<T = unknown>(\n url: string,\n options?: Omit<RequestOptions, 'method'>,\n ): Promise<NetSuiteResponse<T>> {\n return this.transport.request<T>(url, { ...options, method: 'GET' });\n }\n\n /** Convenience: POST request */\n async post<T = unknown>(\n url: string,\n body?: unknown,\n options?: Omit<RequestOptions, 'method' | 'body'>,\n ): Promise<NetSuiteResponse<T>> {\n return this.transport.request<T>(url, { ...options, method: 'POST', body });\n }\n\n /** Convenience: PUT request */\n async put<T = unknown>(\n url: string,\n body?: unknown,\n options?: Omit<RequestOptions, 'method' | 'body'>,\n ): Promise<NetSuiteResponse<T>> {\n return this.transport.request<T>(url, { ...options, method: 'PUT', body });\n }\n\n /** Convenience: PATCH request */\n async patch<T = unknown>(\n url: string,\n body?: unknown,\n options?: Omit<RequestOptions, 'method' | 'body'>,\n ): Promise<NetSuiteResponse<T>> {\n return this.transport.request<T>(url, { ...options, method: 'PATCH', body });\n }\n\n /** Convenience: DELETE request */\n async delete<T = unknown>(\n url: string,\n options?: Omit<RequestOptions, 'method'>,\n ): Promise<NetSuiteResponse<T>> {\n return this.transport.request<T>(url, { ...options, method: 'DELETE' });\n }\n}\n","/**\n * Fluent builder for constructing SuiteQL queries with basic value escaping.\n *\n * @example\n * ```ts\n * import { suiteql } from 'netsuite-sdk';\n *\n * const sql = suiteql()\n * .select('c.id', 'c.companyname', 'c.email')\n * .from('customer', 'c')\n * .leftJoin('transaction t', 'c.id = t.entity')\n * .whereEquals('c.isinactive', 'F')\n * .whereNotNull('c.email')\n * .groupBy('c.id', 'c.companyname', 'c.email')\n * .orderBy('c.companyname', 'ASC')\n * .build();\n * ```\n */\nexport class SuiteQLBuilder {\n private _select: string[] = [];\n private _from = '';\n private _joins: string[] = [];\n private _where: string[] = [];\n private _groupBy: string[] = [];\n private _orderBy: string[] = [];\n private _having: string[] = [];\n\n /** Add columns to SELECT clause */\n select(...columns: string[]): this {\n this._select.push(...columns);\n return this;\n }\n\n /** Set the FROM table, with optional alias */\n from(table: string, alias?: string): this {\n this._from = alias ? `${table} ${alias}` : table;\n return this;\n }\n\n /** Add a JOIN clause */\n join(table: string, condition: string, type: 'INNER' | 'LEFT' | 'RIGHT' = 'INNER'): this {\n this._joins.push(`${type} JOIN ${table} ON ${condition}`);\n return this;\n }\n\n /** Add a LEFT JOIN clause */\n leftJoin(table: string, condition: string): this {\n return this.join(table, condition, 'LEFT');\n }\n\n /** Add a RIGHT JOIN clause */\n rightJoin(table: string, condition: string): this {\n return this.join(table, condition, 'RIGHT');\n }\n\n /** Add a raw WHERE condition */\n where(condition: string): this {\n this._where.push(condition);\n return this;\n }\n\n /** Add a WHERE column = value condition. Values are escaped. */\n whereEquals(column: string, value: string | number | boolean): this {\n this._where.push(`${column} = ${escapeValue(value)}`);\n return this;\n }\n\n /** Add a WHERE column != value condition. Values are escaped. */\n whereNotEquals(column: string, value: string | number | boolean): this {\n this._where.push(`${column} != ${escapeValue(value)}`);\n return this;\n }\n\n /** Add a WHERE column IN (...) condition. Values are escaped. */\n whereIn(column: string, values: (string | number)[]): this {\n const escaped = values.map(escapeValue);\n this._where.push(`${column} IN (${escaped.join(', ')})`);\n return this;\n }\n\n /** Add a WHERE column IS NULL condition */\n whereNull(column: string): this {\n this._where.push(`${column} IS NULL`);\n return this;\n }\n\n /** Add a WHERE column IS NOT NULL condition */\n whereNotNull(column: string): this {\n this._where.push(`${column} IS NOT NULL`);\n return this;\n }\n\n /** Add a WHERE column BETWEEN start AND end condition. Values are escaped. */\n whereBetween(column: string, start: string | number, end: string | number): this {\n this._where.push(`${column} BETWEEN ${escapeValue(start)} AND ${escapeValue(end)}`);\n return this;\n }\n\n /** Add a WHERE column LIKE pattern condition. Value is escaped. */\n whereLike(column: string, pattern: string): this {\n this._where.push(`${column} LIKE ${escapeValue(pattern)}`);\n return this;\n }\n\n /** Add columns to GROUP BY clause */\n groupBy(...columns: string[]): this {\n this._groupBy.push(...columns);\n return this;\n }\n\n /** Add a HAVING condition (used with GROUP BY) */\n having(condition: string): this {\n this._having.push(condition);\n return this;\n }\n\n /** Add a column to ORDER BY clause */\n orderBy(column: string, direction: 'ASC' | 'DESC' = 'ASC'): this {\n this._orderBy.push(`${column} ${direction}`);\n return this;\n }\n\n /** Build the SQL string. Throws if SELECT or FROM is missing. */\n build(): string {\n if (this._select.length === 0) {\n throw new Error('SuiteQLBuilder: SELECT clause is required');\n }\n if (!this._from) {\n throw new Error('SuiteQLBuilder: FROM clause is required');\n }\n\n const parts: string[] = [\n `SELECT ${this._select.join(', ')}`,\n `FROM ${this._from}`,\n ];\n\n if (this._joins.length > 0) {\n parts.push(this._joins.join(' '));\n }\n\n if (this._where.length > 0) {\n parts.push(`WHERE ${this._where.join(' AND ')}`);\n }\n\n if (this._groupBy.length > 0) {\n parts.push(`GROUP BY ${this._groupBy.join(', ')}`);\n }\n\n if (this._having.length > 0) {\n parts.push(`HAVING ${this._having.join(' AND ')}`);\n }\n\n if (this._orderBy.length > 0) {\n parts.push(`ORDER BY ${this._orderBy.join(', ')}`);\n }\n\n return parts.join(' ');\n }\n\n /** Alias for build() */\n toString(): string {\n return this.build();\n }\n}\n\n/** Escape a value for safe inclusion in a SuiteQL query */\nfunction escapeValue(value: string | number | boolean): string {\n if (typeof value === 'number') {\n return String(value);\n }\n if (typeof value === 'boolean') {\n return value ? \"'T'\" : \"'F'\";\n }\n // Escape single quotes by doubling them\n const escaped = value.replace(/'/g, \"''\");\n return `'${escaped}'`;\n}\n\n/** Factory function for creating a new SuiteQL query builder */\nexport function suiteql(): SuiteQLBuilder {\n return new SuiteQLBuilder();\n}\n","interface CacheEntry<T> {\n data: T;\n expiresAt: number;\n}\n\n/**\n * Simple in-memory TTL-based cache for API responses.\n */\nexport class ResponseCache {\n private cache = new Map<string, CacheEntry<unknown>>();\n\n /** Get a cached value, or null if not found or expired. */\n get<T>(key: string): T | null {\n const entry = this.cache.get(key);\n if (!entry) return null;\n\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n return null;\n }\n\n return entry.data as T;\n }\n\n /** Set a cached value with a TTL in seconds. */\n set(key: string, data: unknown, ttlSeconds: number): void {\n this.cache.set(key, {\n data,\n expiresAt: Date.now() + ttlSeconds * 1000,\n });\n }\n\n /** Delete a specific cache entry. */\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n /** Clear all cached entries. */\n clear(): void {\n this.cache.clear();\n }\n\n /** Get the number of entries (including expired). */\n get size(): number {\n return this.cache.size;\n }\n}\n\n/** Create a cache key from request parameters. */\nexport function createCacheKey(\n url: string,\n method: string,\n params?: unknown,\n): string {\n const base = `${method}:${url}`;\n if (params) {\n return `${base}:${JSON.stringify(params)}`;\n }\n return base;\n}\n","/**\n * Sliding-window rate limiter.\n * Tracks requests within a time window and prevents exceeding the limit.\n */\nexport class RateLimiter {\n private timestamps: number[] = [];\n private maxRequests: number;\n private windowMs: number;\n\n constructor(maxRequests = 100, windowMs = 60_000) {\n this.maxRequests = maxRequests;\n this.windowMs = windowMs;\n }\n\n /** Check if a request can be made without exceeding the limit. */\n canMakeRequest(): boolean {\n this.pruneExpired();\n return this.timestamps.length < this.maxRequests;\n }\n\n /** Record that a request was made. */\n recordRequest(): void {\n this.pruneExpired();\n this.timestamps.push(Date.now());\n }\n\n /** Get the number of remaining requests in the current window. */\n getRemainingRequests(): number {\n this.pruneExpired();\n return Math.max(0, this.maxRequests - this.timestamps.length);\n }\n\n /** Get ms until the next request slot opens. Returns 0 if a slot is available. */\n getTimeUntilNextSlot(): number {\n this.pruneExpired();\n if (this.timestamps.length < this.maxRequests) return 0;\n const oldest = this.timestamps[0];\n return Math.max(0, oldest + this.windowMs - Date.now());\n }\n\n private pruneExpired(): void {\n const cutoff = Date.now() - this.windowMs;\n while (this.timestamps.length > 0 && this.timestamps[0] <= cutoff) {\n this.timestamps.shift();\n }\n }\n}\n","/**\n * Format a Date as a NetSuite date string (YYYY-MM-DD).\n */\nexport function formatNetSuiteDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Parse a NetSuite date string (YYYY-MM-DD or MM/DD/YYYY) into a Date.\n */\nexport function parseNetSuiteDate(dateString: string): Date {\n // Handle MM/DD/YYYY format\n if (dateString.includes('/')) {\n const [month, day, year] = dateString.split('/');\n return new Date(Number(year), Number(month) - 1, Number(day));\n }\n // Handle YYYY-MM-DD format\n const [year, month, day] = dateString.split('-');\n return new Date(Number(year), Number(month) - 1, Number(day));\n}\n","import type { NetSuiteErrorDetail } from '../types/errors.js';\n\n/**\n * Parse a NetSuite error response body into a structured format.\n */\nexport function parseNetSuiteError(error: unknown): {\n message: string;\n code?: string;\n details?: NetSuiteErrorDetail;\n} {\n if (!error || typeof error !== 'object') {\n return { message: String(error) };\n }\n\n const e = error as Record<string, unknown>;\n\n // Standard NetSuite REST API error format\n if (e.title || e.detail) {\n return {\n message: String(e.detail ?? e.title ?? 'Unknown error'),\n code: e['o:errorCode'] as string | undefined,\n details: e as NetSuiteErrorDetail,\n };\n }\n\n // Fallback for other error formats\n if (e.message) {\n return {\n message: String(e.message),\n code: e.code as string | undefined,\n };\n }\n\n return { message: JSON.stringify(error) };\n}\n","/**\n * Normalize a NetSuite account ID for use in API URLs.\n * Sandbox accounts use underscore format (e.g., \"1234567_SB1\")\n * but URLs require hyphens (e.g., \"1234567-sb1\").\n */\nexport function normalizeAccountId(accountId: string): string {\n return accountId.toLowerCase().replace(/_/g, '-');\n}\n\n/** Build the SuiteTalk REST API base URL */\nexport function buildSuiteTalkUrl(accountId: string): string {\n return `https://${normalizeAccountId(accountId)}.suitetalk.api.netsuite.com`;\n}\n\n/** Build the RESTlet base URL */\nexport function buildRestletUrl(accountId: string): string {\n return `https://${normalizeAccountId(accountId)}.restlets.api.netsuite.com`;\n}\n"]}
|