From bf65e86883722caea0a4daf8da22aaf90449c7eb Mon Sep 17 00:00:00 2001 From: Ayush7614 Date: Sun, 5 Jul 2026 14:24:56 +0530 Subject: [PATCH 1/6] feat(addresszen): add Addresszen plugin for autocomplete and verify Implements the Addresszen OSS integration with API-key auth, autocomplete suggestions, USPS CASS address verification, local DB entities, and tests. Uses Authorization header auth, adds dotenv devDependency, and documents unknown API fields per plugin conventions. Closes #352 --- demo/testing/package.json | 1 + demo/testing/src/server/corsair.ts | 4 + packages/addresszen/api.test.ts | 65 ++++++ packages/addresszen/client.ts | 85 +++++++ packages/addresszen/endpoints/autocomplete.ts | 50 ++++ packages/addresszen/endpoints/index.ts | 12 + packages/addresszen/endpoints/types.ts | 107 +++++++++ packages/addresszen/endpoints/verify.ts | 56 +++++ packages/addresszen/error-handlers.ts | 69 ++++++ packages/addresszen/index.ts | 180 ++++++++++++++ packages/addresszen/jest.config.cjs | 54 +++++ packages/addresszen/package.json | 45 ++++ packages/addresszen/schema/database.ts | 29 +++ packages/addresszen/schema/index.ts | 12 + packages/addresszen/tsconfig.json | 20 ++ packages/addresszen/tsup.config.ts | 15 ++ pnpm-lock.yaml | 219 ++++++++++-------- 17 files changed, 925 insertions(+), 98 deletions(-) create mode 100644 packages/addresszen/api.test.ts create mode 100644 packages/addresszen/client.ts create mode 100644 packages/addresszen/endpoints/autocomplete.ts create mode 100644 packages/addresszen/endpoints/index.ts create mode 100644 packages/addresszen/endpoints/types.ts create mode 100644 packages/addresszen/endpoints/verify.ts create mode 100644 packages/addresszen/error-handlers.ts create mode 100644 packages/addresszen/index.ts create mode 100644 packages/addresszen/jest.config.cjs create mode 100644 packages/addresszen/package.json create mode 100644 packages/addresszen/schema/database.ts create mode 100644 packages/addresszen/schema/index.ts create mode 100644 packages/addresszen/tsconfig.json create mode 100644 packages/addresszen/tsup.config.ts diff --git a/demo/testing/package.json b/demo/testing/package.json index 3dcf0da17..3fa5f4d96 100644 --- a/demo/testing/package.json +++ b/demo/testing/package.json @@ -25,6 +25,7 @@ }, "dependencies": { "@anthropic-ai/claude-agent-sdk": "^0.2.0", + "@corsair-dev/addresszen": "workspace:*", "@corsair-dev/agentql": "workspace:*", "@corsair-dev/bitwarden": "workspace:*", "@corsair-dev/cursor": "workspace:*", diff --git a/demo/testing/src/server/corsair.ts b/demo/testing/src/server/corsair.ts index 3755c8b3e..b82fdc32d 100644 --- a/demo/testing/src/server/corsair.ts +++ b/demo/testing/src/server/corsair.ts @@ -2,6 +2,7 @@ import dotenv from 'dotenv'; dotenv.config({ path: '../.env' }); +import { addresszen } from '@corsair-dev/addresszen'; import { agentql } from '@corsair-dev/agentql'; import { gmail } from '@corsair-dev/gmail'; import { googlecalendar } from '@corsair-dev/googlecalendar'; @@ -58,6 +59,9 @@ export const corsair = createCorsair({ agentql({ key: process.env.AGENTQL_API_KEY, }), + addresszen({ + key: process.env.ADDRESSZEN_API_KEY, + }), twilio(), vapi({ key: process.env.VAPI_API_KEY, diff --git a/packages/addresszen/api.test.ts b/packages/addresszen/api.test.ts new file mode 100644 index 000000000..72918e4c7 --- /dev/null +++ b/packages/addresszen/api.test.ts @@ -0,0 +1,65 @@ +import 'dotenv/config'; +import { makeAddresszenRequest } from './client'; +import type { + AutocompleteAddressesResponse, + VerifyAddressResponse, +} from './endpoints/types'; +import { AddresszenEndpointOutputSchemas } from './endpoints/types'; + +const TEST_API_KEY = process.env.ADDRESSZEN_API_KEY!; + +describe('Addresszen API Type Tests', () => { + describe('autocomplete', () => { + it('autocompleteAddresses returns correct type', async () => { + const response = + await makeAddresszenRequest( + 'autocomplete/addresses', + TEST_API_KEY, + { + method: 'GET', + query: { + query: '10 downing', + }, + }, + ); + + AddresszenEndpointOutputSchemas.autocompleteAddresses.parse(response); + expect(response.code).toBe(2000); + }); + }); + + describe('verify', () => { + it('verifyAddress returns correct type', async () => { + const response = await makeAddresszenRequest( + 'verify/addresses', + TEST_API_KEY, + { + method: 'POST', + body: { + query: '123 Main St, Springfield, CO 81073', + }, + }, + ); + + AddresszenEndpointOutputSchemas.verifyAddress.parse(response); + expect(response.code).toBe(2000); + }); + + it('verifyAddress with split components returns correct type', async () => { + const response = await makeAddresszenRequest( + 'verify/addresses', + TEST_API_KEY, + { + method: 'POST', + body: { + query: '123 Main St', + city: 'Springfield', + state: 'CO', + }, + }, + ); + + AddresszenEndpointOutputSchemas.verifyAddress.parse(response); + }); + }); +}); diff --git a/packages/addresszen/client.ts b/packages/addresszen/client.ts new file mode 100644 index 000000000..56164c584 --- /dev/null +++ b/packages/addresszen/client.ts @@ -0,0 +1,85 @@ +import type { ApiRequestOptions, OpenAPIConfig } from 'corsair/http'; +import { ApiError, request } from 'corsair/http'; + +export class AddresszenAPIError extends Error { + public readonly status?: number; + public readonly statusText?: string; + // Using unknown because Addresszen API error response bodies vary by endpoint + // and error code, making a strict type infeasible without per-endpoint handling. + public readonly body?: unknown; + public readonly retryAfter?: number; + + constructor( + message: string, + public readonly code?: number, + options?: { cause?: Error }, + ) { + super(message, options); + this.name = 'AddresszenAPIError'; + + if (options?.cause instanceof ApiError) { + this.status = options.cause.status; + this.statusText = options.cause.statusText; + this.body = options.cause.body; + this.retryAfter = options.cause.retryAfter; + } + } +} + +const ADDRESSZEN_API_BASE = 'https://api.addresszen.com/v1'; + +/** + * Performs a request to the Addresszen API. + * + * Auth: API key passed via the Authorization header to avoid leaking credentials + * into URL access logs. Addresszen also supports query-string auth, but header + * auth is preferred per their API reference. + */ +export async function makeAddresszenRequest( + endpoint: string, + apiKey: string, + options: { + method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'; + body?: Record; + query?: Record; + } = {}, +): Promise { + const { method = 'GET', body, query = {} } = options; + const isWrite = method === 'POST' || method === 'PUT' || method === 'PATCH'; + + const config: OpenAPIConfig = { + BASE: ADDRESSZEN_API_BASE, + VERSION: '1.0.0', + WITH_CREDENTIALS: false, + CREDENTIALS: 'omit', + TOKEN: undefined, + HEADERS: { + Authorization: `api_key="${apiKey}"`, + ...(isWrite ? { 'Content-Type': 'application/json' } : {}), + }, + }; + + const requestOptions: ApiRequestOptions = { + method, + url: endpoint, + body: isWrite ? body : undefined, + mediaType: isWrite ? 'application/json; charset=utf-8' : undefined, + query, + }; + + try { + return await request(config, requestOptions); + } catch (error) { + if (error instanceof ApiError) { + throw new AddresszenAPIError(error.message, error.status, { + cause: error, + }); + } + if (error instanceof Error) { + throw new AddresszenAPIError(error.message, undefined, { + cause: error, + }); + } + throw new AddresszenAPIError('Unknown error'); + } +} diff --git a/packages/addresszen/endpoints/autocomplete.ts b/packages/addresszen/endpoints/autocomplete.ts new file mode 100644 index 000000000..001b66ccc --- /dev/null +++ b/packages/addresszen/endpoints/autocomplete.ts @@ -0,0 +1,50 @@ +import { logEventFromContext } from 'corsair/core'; +import { makeAddresszenRequest } from '../client'; +import type { AddresszenEndpoints } from '../index'; +import type { AddresszenEndpointOutputs } from './types'; + +/** + * Get address autocomplete suggestions for a partial query. + * + * API: GET /autocomplete/addresses + * Docs: https://docs.addresszen.com/docs/api/find-address + */ +export const addresses: AddresszenEndpoints['autocompleteAddresses'] = async ( + ctx, + input, +) => { + const response = await makeAddresszenRequest< + AddresszenEndpointOutputs['autocompleteAddresses'] + >('autocomplete/addresses', ctx.key, { + method: 'GET', + query: { + query: input.query, + }, + }); + + if (ctx.db.autocompleteResults) { + try { + const { result, ...rest } = response; + await ctx.db.autocompleteResults.upsertByEntityId(input.query, { + ...rest, + query: input.query, + hits: result.hits, + updatedAt: new Date(), + }); + } catch (error) { + console.warn( + '[addresszen] Failed to save autocomplete results to database:', + error, + ); + } + } + + await logEventFromContext( + ctx, + 'addresszen.autocomplete.addresses', + { query: input.query, hitCount: response.result.hits.length }, + 'completed', + ); + + return response; +}; diff --git a/packages/addresszen/endpoints/index.ts b/packages/addresszen/endpoints/index.ts new file mode 100644 index 000000000..8015f5e38 --- /dev/null +++ b/packages/addresszen/endpoints/index.ts @@ -0,0 +1,12 @@ +import { addresses } from './autocomplete'; +import { address } from './verify'; + +export const Autocomplete = { + addresses, +}; + +export const Verify = { + address, +}; + +export * from './types'; diff --git a/packages/addresszen/endpoints/types.ts b/packages/addresszen/endpoints/types.ts new file mode 100644 index 000000000..2e5d9993f --- /dev/null +++ b/packages/addresszen/endpoints/types.ts @@ -0,0 +1,107 @@ +import { z } from 'zod'; + +const AddressSuggestionSchema = z + .object({ + id: z.string(), + suggestion: z.string(), + // urls shape varies by country (US vs UK); provider may return null. + urls: z.record(z.string(), z.unknown()).nullable().optional(), + udprn: z.number().optional(), + }) + .loose(); + +export type AddressSuggestion = z.infer; + +export const AutocompleteAddressesInputSchema = z.object({ + query: z + .string() + .min(1) + .max(150) + .describe('Partial address string to autocomplete'), +}); + +export type AutocompleteAddressesInput = z.infer< + typeof AutocompleteAddressesInputSchema +>; + +export const AutocompleteAddressesResponseSchema = z.object({ + code: z.number(), + message: z.string(), + result: z + .object({ + hits: z.array(AddressSuggestionSchema), + }) + .loose(), +}); + +export type AutocompleteAddressesResponse = z.infer< + typeof AutocompleteAddressesResponseSchema +>; + +export const VerifyAddressInputSchema = z.object({ + query: z + .string() + .min(1) + .describe( + 'Address to verify. Use a full free-form address, or only the first line when city/state or zip_code are provided separately.', + ), + zip_code: z.string().optional(), + city: z.string().optional(), + state: z.string().optional(), + context: z + .string() + .optional() + .describe('Optional metadata tag stored with the lookup'), +}); + +export type VerifyAddressInput = z.infer; + +const VerifyResultSchema = z + .object({ + query: z.string(), + query_city: z.string().optional(), + query_state: z.string().optional(), + query_zip_code: z.string().optional(), + // match is a oneOf across US/UK address object schemas in the OpenAPI spec. + match: z.unknown().nullable().optional(), + count: z.number().optional(), + fit: z.number().optional(), + confidence: z.number().optional(), + // match_information structure depends on the matched address type. + match_information: z.unknown().optional(), + address_line_one: z.string().optional(), + address_line_two: z.string().optional(), + city: z.string().optional(), + state: z.string().optional(), + zip_code: z.string().optional(), + country_iso_2: z.string().optional(), + }) + .loose(); + +export const VerifyAddressResponseSchema = z.object({ + code: z.number(), + message: z.string(), + result: VerifyResultSchema, +}); + +export type VerifyAddressResponse = z.infer; + +export type AddresszenEndpointInputs = { + autocompleteAddresses: AutocompleteAddressesInput; + verifyAddress: VerifyAddressInput; +}; + +export type AddresszenEndpointOutputs = { + autocompleteAddresses: AutocompleteAddressesResponse; + verifyAddress: VerifyAddressResponse; +}; + +export const AddresszenEndpointInputSchemas = { + autocompleteAddresses: AutocompleteAddressesInputSchema, + verifyAddress: VerifyAddressInputSchema, +} as const; + +export const AddresszenEndpointOutputSchemas = { + autocompleteAddresses: AutocompleteAddressesResponseSchema, + verifyAddress: VerifyAddressResponseSchema, +} as const; diff --git a/packages/addresszen/endpoints/verify.ts b/packages/addresszen/endpoints/verify.ts new file mode 100644 index 000000000..1f9771bbd --- /dev/null +++ b/packages/addresszen/endpoints/verify.ts @@ -0,0 +1,56 @@ +import { logEventFromContext } from 'corsair/core'; +import { makeAddresszenRequest } from '../client'; +import type { AddresszenEndpoints } from '../index'; +import type { AddresszenEndpointOutputs } from './types'; + +/** + * Verify and standardize a US address using USPS CASS. + * + * API: POST /verify/addresses + * Docs: https://docs.addresszen.com/docs/api/address-verify + */ +export const address: AddresszenEndpoints['verifyAddress'] = async ( + ctx, + input, +) => { + const { context, ...body } = input; + + const response = await makeAddresszenRequest< + AddresszenEndpointOutputs['verifyAddress'] + >('verify/addresses', ctx.key, { + method: 'POST', + query: context ? { context } : undefined, + body, + }); + + if (ctx.db.verifiedAddresses) { + try { + const entityId = [input.query, input.city, input.state, input.zip_code] + .filter(Boolean) + .join('|'); + + await ctx.db.verifiedAddresses.upsertByEntityId(entityId, { + ...response, + query: input.query, + city: input.city ?? null, + state: input.state ?? null, + zipCode: input.zip_code ?? null, + updatedAt: new Date(), + }); + } catch (error) { + console.warn( + '[addresszen] Failed to save verified address to database:', + error, + ); + } + } + + await logEventFromContext( + ctx, + 'addresszen.verify.address', + { query: input.query }, + 'completed', + ); + + return response; +}; diff --git a/packages/addresszen/error-handlers.ts b/packages/addresszen/error-handlers.ts new file mode 100644 index 000000000..29a179988 --- /dev/null +++ b/packages/addresszen/error-handlers.ts @@ -0,0 +1,69 @@ +import type { CorsairErrorHandler } from 'corsair/core'; +import type { AddresszenAPIError } from './client'; + +/** + * Helper to extract the HTTP status from an error. + * Works with AddresszenAPIError (which copies status from ApiError) + * and any error that exposes a numeric `status` property. + */ +function getStatus(error: Error): number | undefined { + return (error as Partial).status; +} + +/** + * Helper to extract the Retry-After value (in ms) from an error. + */ +function getRetryAfter(error: Error): number | undefined { + return (error as Partial).retryAfter; +} + +export const errorHandlers = { + RATE_LIMIT_ERROR: { + match: (error: Error) => { + if (getStatus(error) === 429) return true; + const msg = error.message.toLowerCase(); + return msg.includes('429') || msg.includes('rate limit'); + }, + handler: async (error: Error) => ({ + maxRetries: 3, + retryStrategy: 'exponential_backoff' as const, + headersRetryAfterMs: getRetryAfter(error), + }), + }, + AUTH_ERROR: { + match: (error: Error) => { + if (getStatus(error) === 401) return true; + const msg = error.message.toLowerCase(); + return ( + msg.includes('invalid key') || + msg.includes('unauthorized') || + msg.includes('401') + ); + }, + handler: async () => ({ maxRetries: 0 }), + }, + NOT_FOUND_ERROR: { + match: (error: Error) => { + if (getStatus(error) === 404) return true; + const msg = error.message.toLowerCase(); + return msg.includes('404') || msg.includes('not found'); + }, + handler: async () => ({ maxRetries: 0 }), + }, + SERVER_ERROR: { + match: (error: Error) => { + const status = getStatus(error); + if (status !== undefined && status >= 500) return true; + const msg = error.message.toLowerCase(); + return msg.includes('503') || msg.includes('server error'); + }, + handler: async () => ({ + maxRetries: 2, + retryStrategy: 'exponential_backoff' as const, + }), + }, + DEFAULT: { + match: () => true, + handler: async () => ({ maxRetries: 0 }), + }, +} satisfies CorsairErrorHandler; diff --git a/packages/addresszen/index.ts b/packages/addresszen/index.ts new file mode 100644 index 000000000..3d6f61719 --- /dev/null +++ b/packages/addresszen/index.ts @@ -0,0 +1,180 @@ +import type { + AuthTypes, + BindEndpoints, + CorsairEndpoint, + CorsairErrorHandler, + CorsairPlugin, + CorsairPluginContext, + KeyBuilderContext, + PickAuth, + PluginAuthConfig, + PluginPermissionsConfig, + RequiredPluginEndpointMeta, + RequiredPluginEndpointSchemas, +} from 'corsair/core'; +import { AuthMissingError } from 'corsair/core'; +import { Autocomplete, Verify } from './endpoints'; +import type { + AddresszenEndpointInputs, + AddresszenEndpointOutputs, +} from './endpoints/types'; +import { + AddresszenEndpointInputSchemas, + AddresszenEndpointOutputSchemas, +} from './endpoints/types'; +import { errorHandlers } from './error-handlers'; +import { AddresszenSchema } from './schema'; + +export type AddresszenPluginOptions = { + authType?: PickAuth<'api_key'>; + key?: string; + hooks?: InternalAddresszenPlugin['hooks']; + errorHandlers?: CorsairErrorHandler; + permissions?: PluginPermissionsConfig; +}; + +export type AddresszenContext = CorsairPluginContext< + typeof AddresszenSchema, + AddresszenPluginOptions +>; + +export type AddresszenKeyBuilderContext = + KeyBuilderContext; + +export type AddresszenBoundEndpoints = BindEndpoints< + typeof addresszenEndpointsNested +>; + +type AddresszenEndpoint = + CorsairEndpoint< + AddresszenContext, + AddresszenEndpointInputs[K], + AddresszenEndpointOutputs[K] + >; + +export type AddresszenEndpoints = { + autocompleteAddresses: AddresszenEndpoint<'autocompleteAddresses'>; + verifyAddress: AddresszenEndpoint<'verifyAddress'>; +}; + +const addresszenEndpointsNested = { + autocomplete: { + addresses: Autocomplete.addresses, + }, + verify: { + address: Verify.address, + }, +} as const; + +const addresszenWebhooksNested = {} as const; + +export const addresszenEndpointSchemas = { + 'autocomplete.addresses': { + input: AddresszenEndpointInputSchemas.autocompleteAddresses, + output: AddresszenEndpointOutputSchemas.autocompleteAddresses, + }, + 'verify.address': { + input: AddresszenEndpointInputSchemas.verifyAddress, + output: AddresszenEndpointOutputSchemas.verifyAddress, + }, +} as const satisfies RequiredPluginEndpointSchemas< + typeof addresszenEndpointsNested +>; + +const defaultAuthType: AuthTypes = 'api_key' as const; + +const addresszenEndpointMeta = { + 'autocomplete.addresses': { + riskLevel: 'read', + description: + 'Get address autocomplete suggestions for a partial address query', + }, + 'verify.address': { + riskLevel: 'read', + description: + 'Verify and standardize a US address using USPS CASS validation', + }, +} as const satisfies RequiredPluginEndpointMeta< + typeof addresszenEndpointsNested +>; + +export const addresszenAuthConfig = { + api_key: {}, +} as const satisfies PluginAuthConfig; + +export type BaseAddresszenPlugin = + CorsairPlugin< + 'addresszen', + typeof AddresszenSchema, + typeof addresszenEndpointsNested, + typeof addresszenWebhooksNested, + T, + typeof defaultAuthType + >; + +export type InternalAddresszenPlugin = + BaseAddresszenPlugin; + +export type ExternalAddresszenPlugin = + BaseAddresszenPlugin; + +export function addresszen( + incomingOptions: AddresszenPluginOptions & T = {} as AddresszenPluginOptions & + T, +): ExternalAddresszenPlugin { + const options = { + ...incomingOptions, + authType: incomingOptions.authType ?? defaultAuthType, + }; + return { + id: 'addresszen', + authConfig: addresszenAuthConfig, + schema: AddresszenSchema, + options: options, + hooks: options.hooks, + webhookHooks: undefined, + endpoints: addresszenEndpointsNested, + webhooks: addresszenWebhooksNested, + endpointMeta: addresszenEndpointMeta, + endpointSchemas: addresszenEndpointSchemas, + pluginWebhookMatcher: undefined, + errorHandlers: { + ...errorHandlers, + ...options.errorHandlers, + }, + keyBuilder: async (ctx: AddresszenKeyBuilderContext, source) => { + if (source === 'endpoint' && options.key) { + return options.key; + } + + if (source === 'endpoint' && ctx.authType === 'api_key') { + const res = await ctx.keys.get_api_key(); + if (!res) { + throw new AuthMissingError('addresszen', 'api_key'); + } + return res; + } + + throw new AuthMissingError('addresszen', 'api_key'); + }, + } satisfies InternalAddresszenPlugin; +} + +export type { + AddressSuggestion, + AddresszenEndpointInputs, + AddresszenEndpointOutputs, + AutocompleteAddressesInput, + AutocompleteAddressesResponse, + VerifyAddressInput, + VerifyAddressResponse, +} from './endpoints/types'; + +export { + AddresszenEndpointInputSchemas, + AddresszenEndpointOutputSchemas, + AutocompleteAddressesInputSchema, + AutocompleteAddressesResponseSchema, + VerifyAddressInputSchema, + VerifyAddressResponseSchema, +} from './endpoints/types'; diff --git a/packages/addresszen/jest.config.cjs b/packages/addresszen/jest.config.cjs new file mode 100644 index 000000000..296a927ca --- /dev/null +++ b/packages/addresszen/jest.config.cjs @@ -0,0 +1,54 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + roots: [''], + testMatch: [ + '**/*.test.ts', + '**/tests/**/*.test.ts', + '**/plugins/**/*.test.ts', + '**/setup/**/*.test.ts', + ], + collectCoverageFrom: [ + '**/*.ts', + '!**/*.d.ts', + '!**/node_modules/**', + '!**/dist/**', + '!jest.config.ts', + '!tests/**', + ], + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'], + transform: { + '^.+\\.yaml$': '/../corsair/jest-yaml-transform.cjs', + '^.+\\.ts$': [ + 'ts-jest', + { + useESM: true, + tsconfig: { + esModuleInterop: true, + allowSyntheticDefaultImports: true, + verbatimModuleSyntax: false, + module: 'ESNext', + moduleResolution: 'Bundler', + }, + }, + ], + '.*\\.js$': [ + 'ts-jest', + { + useESM: true, + tsconfig: { + esModuleInterop: true, + allowSyntheticDefaultImports: true, + }, + }, + ], + }, + moduleNameMapper: { + '^corsair/http$': '/../corsair/http.ts', + '^(\\.\\.?/.*)\\.js$': '$1', + }, + transformIgnorePatterns: ['node_modules/(?!.*uuid.*)'], + extensionsToTreatAsEsm: ['.ts'], + testTimeout: 30000, + verbose: true, +}; diff --git a/packages/addresszen/package.json b/packages/addresszen/package.json new file mode 100644 index 000000000..40a42c2f8 --- /dev/null +++ b/packages/addresszen/package.json @@ -0,0 +1,45 @@ +{ + "name": "@corsair-dev/addresszen", + "version": "0.1.0", + "description": "Addresszen plugin for Corsair", + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "dev-source": "./index.ts", + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "scripts": { + "build": "rm -rf dist && tsc --build --force && tsup", + "typecheck": "tsc --noEmit", + "test": "jest" + }, + "peerDependencies": { + "corsair": ">=0.1.0", + "zod": "^4.1.13" + }, + "devDependencies": { + "@types/jest": "^29.5.14", + "corsair": "workspace:*", + "dotenv": "^17.2.3", + "jest": "^29.7.0", + "ts-jest": "^29.4.9", + "tsup": "^8.0.1", + "typescript": "catalog:", + "zod": "^4.1.13" + }, + "keywords": [ + "corsair", + "addresszen", + "plugin" + ], + "author": "", + "license": "Apache-2.0", + "files": [ + "dist" + ] +} diff --git a/packages/addresszen/schema/database.ts b/packages/addresszen/schema/database.ts new file mode 100644 index 000000000..a910dfa51 --- /dev/null +++ b/packages/addresszen/schema/database.ts @@ -0,0 +1,29 @@ +import { z } from 'zod'; + +export const AddresszenAutocompleteResult = z.object({ + query: z.string(), + // Suggestion objects vary between US and UK response formats. + hits: z.array(z.record(z.string(), z.unknown())), + code: z.number().optional(), + message: z.string().optional(), + updatedAt: z.coerce.date().nullable().optional(), +}); + +export const AddresszenVerifiedAddress = z.object({ + query: z.string(), + city: z.string().nullable().optional(), + state: z.string().nullable().optional(), + zipCode: z.string().nullable().optional(), + // Stored verify payload mirrors the API result object, which varies by match type. + result: z.record(z.string(), z.unknown()), + code: z.number().optional(), + message: z.string().optional(), + updatedAt: z.coerce.date().nullable().optional(), +}); + +export type AddresszenAutocompleteResult = z.infer< + typeof AddresszenAutocompleteResult +>; +export type AddresszenVerifiedAddress = z.infer< + typeof AddresszenVerifiedAddress +>; diff --git a/packages/addresszen/schema/index.ts b/packages/addresszen/schema/index.ts new file mode 100644 index 000000000..8fba4c996 --- /dev/null +++ b/packages/addresszen/schema/index.ts @@ -0,0 +1,12 @@ +import { + AddresszenAutocompleteResult, + AddresszenVerifiedAddress, +} from './database'; + +export const AddresszenSchema = { + version: '1.0.0', + entities: { + autocompleteResults: AddresszenAutocompleteResult, + verifiedAddresses: AddresszenVerifiedAddress, + }, +} as const; diff --git a/packages/addresszen/tsconfig.json b/packages/addresszen/tsconfig.json new file mode 100644 index 000000000..15e507a13 --- /dev/null +++ b/packages/addresszen/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "lib": ["esnext"], + "types": ["node", "jest"], + "module": "ESNext", + "moduleResolution": "Bundler", + "outDir": "./dist", + "rootDir": "./", + "composite": true, + "incremental": true, + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "skipLibCheck": true + }, + "include": ["./**/*"], + "exclude": ["dist", "node_modules"], + "references": [] +} diff --git a/packages/addresszen/tsup.config.ts b/packages/addresszen/tsup.config.ts new file mode 100644 index 000000000..3ec221e23 --- /dev/null +++ b/packages/addresszen/tsup.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + clean: false, + dts: false, + format: ['esm'], + target: 'esnext', + platform: 'node', + bundle: true, + splitting: true, + minify: true, + outDir: 'dist', + external: ['corsair', 'zod'], + entry: ['index.ts'], +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ada285871..f69e484f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -140,6 +140,9 @@ importers: '@anthropic-ai/claude-agent-sdk': specifier: ^0.2.0 version: 0.2.71(zod@3.25.76) + '@corsair-dev/addresszen': + specifier: workspace:* + version: link:../../packages/addresszen '@corsair-dev/agentql': specifier: workspace:* version: link:../../packages/agentql @@ -277,6 +280,33 @@ importers: specifier: ^5.9.3 version: 5.9.3 + packages/addresszen: + devDependencies: + '@types/jest': + specifier: ^29.5.14 + version: 29.5.14 + corsair: + specifier: workspace:* + version: link:../corsair + dotenv: + specifier: ^17.2.3 + version: 17.4.2 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) + ts-jest: + specifier: ^29.4.9 + version: 29.4.9(@babel/core@7.28.6)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.28.6))(esbuild@0.27.0)(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) + tsup: + specifier: ^8.0.1 + version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) + typescript: + specifier: 'catalog:' + version: 5.9.3 + zod: + specifier: ^4.1.13 + version: 4.1.13 + packages/agentql: devDependencies: corsair: @@ -305,7 +335,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -329,7 +359,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -353,7 +383,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -399,7 +429,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -444,7 +474,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -468,7 +498,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -492,7 +522,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -516,7 +546,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -571,7 +601,7 @@ importers: version: 2.6.1 ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.28.6)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.28.6))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.28.6)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.28.6))(esbuild@0.27.0)(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@24.10.1)(typescript@5.9.3) @@ -601,7 +631,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -683,7 +713,7 @@ importers: version: 19.2.7(react@19.2.7) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.28.6)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.28.6))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@24.10.1)(typescript@5.9.3) @@ -710,7 +740,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -734,7 +764,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -779,7 +809,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -803,7 +833,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -827,7 +857,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -851,7 +881,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -875,7 +905,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -899,7 +929,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -923,7 +953,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -947,7 +977,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -971,7 +1001,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -995,7 +1025,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1019,7 +1049,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1043,7 +1073,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1067,7 +1097,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1091,7 +1121,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1115,7 +1145,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1145,7 +1175,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1169,7 +1199,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1193,7 +1223,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1217,7 +1247,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1287,7 +1317,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1311,7 +1341,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1335,7 +1365,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1359,7 +1389,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1383,7 +1413,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1407,7 +1437,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1431,7 +1461,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1459,7 +1489,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1483,7 +1513,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.6 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1507,7 +1537,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.6 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1531,7 +1561,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1555,7 +1585,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1579,7 +1609,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1603,7 +1633,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1627,7 +1657,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1651,7 +1681,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1675,7 +1705,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1775,7 +1805,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1799,7 +1829,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1823,7 +1853,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1847,7 +1877,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1871,7 +1901,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1895,7 +1925,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1919,7 +1949,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1943,7 +1973,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1967,7 +1997,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -1991,7 +2021,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -2015,7 +2045,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -2070,7 +2100,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -2094,7 +2124,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -2118,7 +2148,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -2142,7 +2172,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -2166,7 +2196,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -2190,7 +2220,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -2214,7 +2244,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3) tsup: specifier: ^8.0.1 version: 8.5.1(jiti@2.7.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -2232,7 +2262,7 @@ importers: version: link:../packages/github '@next/third-parties': specifier: 15.3.2 - version: 15.3.2(next@15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5) + version: 15.3.2(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5) '@phosphor-icons/react': specifier: ^2.1.10 version: 2.1.10(react-dom@19.2.5(react@19.2.5))(react@19.2.5) @@ -2253,7 +2283,7 @@ importers: version: 11.8.1(typescript@5.9.3) better-auth: specifier: ^1.5.5 - version: 1.6.15(@cloudflare/workers-types@4.20251121.0)(@opentelemetry/api@1.9.0)(@prisma/client@6.19.0(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20251121.0)(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(@prisma/client@6.19.0(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.15.6)(better-sqlite3@12.5.0)(bun-types@1.3.3)(gel@2.2.0)(kysely@0.28.17)(mysql2@3.15.3)(pg@8.21.0)(postgres@3.4.7)(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(sqlite3@5.1.7))(mysql2@3.15.3)(next@15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.21.0)(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 1.6.15(@cloudflare/workers-types@4.20251121.0)(@opentelemetry/api@1.9.0)(@prisma/client@6.19.0(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20251121.0)(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(@prisma/client@6.19.0(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.15.6)(better-sqlite3@12.5.0)(bun-types@1.3.3)(gel@2.2.0)(kysely@0.28.17)(mysql2@3.15.3)(pg@8.21.0)(postgres@3.4.7)(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(sqlite3@5.1.7))(mysql2@3.15.3)(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.21.0)(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(react-dom@19.2.5(react@19.2.5))(react@19.2.5) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -2271,13 +2301,13 @@ importers: version: 0.44.7(@cloudflare/workers-types@4.20251121.0)(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(@prisma/client@6.19.0(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.15.6)(better-sqlite3@12.5.0)(bun-types@1.3.3)(gel@2.2.0)(kysely@0.28.17)(mysql2@3.15.3)(pg@8.21.0)(postgres@3.4.7)(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(sqlite3@5.1.7) inngest: specifier: ^3.54.0 - version: 3.54.2(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(express@5.2.1)(hono@4.12.2)(next@15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3)(zod@4.4.3) + version: 3.54.2(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(express@5.2.1)(hono@4.12.2)(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3)(zod@4.4.3) next: specifier: ^15.3.2 - version: 15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) next-sanity: specifier: ^11.6.13 - version: 11.6.13(@emotion/is-prop-valid@1.4.0)(@sanity/client@7.23.0)(@sanity/icons@3.7.4(react@19.2.5))(@sanity/types@6.2.0(@types/react@19.2.6))(next@15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react-is@19.2.7)(react@19.2.5)(sanity@4.22.0(@emotion/is-prop-valid@1.4.0)(@portabletext/sanity-bridge@1.2.14(@types/react@19.2.6))(@types/node@24.10.1)(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(jiti@2.7.0)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0))(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3) + version: 11.6.13(@emotion/is-prop-valid@1.4.0)(@sanity/client@7.23.0)(@sanity/icons@3.7.4(react@19.2.5))(@sanity/types@6.2.0(@types/react@19.2.6))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react-is@19.2.7)(react@19.2.5)(sanity@4.22.0(@emotion/is-prop-valid@1.4.0)(@portabletext/sanity-bridge@1.2.14(@types/react@19.2.6))(@types/node@24.10.1)(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(jiti@2.7.0)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0))(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3) pg: specifier: ^8.20.0 version: 8.21.0 @@ -12068,11 +12098,6 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} - hasBin: true - semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} @@ -16392,9 +16417,9 @@ snapshots: '@next/swc-win32-x64-msvc@15.5.18': optional: true - '@next/third-parties@15.3.2(next@15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)': + '@next/third-parties@15.3.2(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)': dependencies: - next: 15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + next: 15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) react: 19.2.5 third-party-capital: 1.0.20 @@ -19042,7 +19067,7 @@ snapshots: optionalDependencies: '@sanity/types': 6.2.0(@types/react@19.2.6) - '@sanity/visual-editing@4.0.3(@emotion/is-prop-valid@1.4.0)(@sanity/client@7.23.0)(@sanity/types@6.2.0(@types/react@19.2.6))(next@15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react-is@19.2.7)(react@19.2.5)(sanity@4.22.0(@emotion/is-prop-valid@1.4.0)(@portabletext/sanity-bridge@1.2.14(@types/react@19.2.6))(@types/node@24.10.1)(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(jiti@2.7.0)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0))(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3)': + '@sanity/visual-editing@4.0.3(@emotion/is-prop-valid@1.4.0)(@sanity/client@7.23.0)(@sanity/types@6.2.0(@types/react@19.2.6))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react-is@19.2.7)(react@19.2.5)(sanity@4.22.0(@emotion/is-prop-valid@1.4.0)(@portabletext/sanity-bridge@1.2.14(@types/react@19.2.6))(@types/node@24.10.1)(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(jiti@2.7.0)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0))(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3)': dependencies: '@sanity/comlink': 4.0.1 '@sanity/icons': 3.7.4(react@19.2.5) @@ -19064,7 +19089,7 @@ snapshots: xstate: 5.32.2 optionalDependencies: '@sanity/client': 7.23.0 - next: 15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + next: 15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) transitivePeerDependencies: - '@emotion/is-prop-valid' - '@sanity/types' @@ -20104,7 +20129,7 @@ snapshots: before-after-hook@4.0.0: {} - better-auth@1.6.15(@cloudflare/workers-types@4.20251121.0)(@opentelemetry/api@1.9.0)(@prisma/client@6.19.0(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20251121.0)(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(@prisma/client@6.19.0(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.15.6)(better-sqlite3@12.5.0)(bun-types@1.3.3)(gel@2.2.0)(kysely@0.28.17)(mysql2@3.15.3)(pg@8.21.0)(postgres@3.4.7)(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(sqlite3@5.1.7))(mysql2@3.15.3)(next@15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.21.0)(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + better-auth@1.6.15(@cloudflare/workers-types@4.20251121.0)(@opentelemetry/api@1.9.0)(@prisma/client@6.19.0(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(better-sqlite3@12.5.0)(drizzle-kit@0.31.8)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20251121.0)(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(@prisma/client@6.19.0(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.15.6)(better-sqlite3@12.5.0)(bun-types@1.3.3)(gel@2.2.0)(kysely@0.28.17)(mysql2@3.15.3)(pg@8.21.0)(postgres@3.4.7)(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(sqlite3@5.1.7))(mysql2@3.15.3)(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(pg@8.21.0)(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: '@better-auth/core': 1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20251121.0)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.1)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/drizzle-adapter': 1.6.15(@better-auth/core@1.6.15(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20251121.0)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.4.3))(jose@6.2.1)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20251121.0)(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(@prisma/client@6.19.0(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.15.6)(better-sqlite3@12.5.0)(bun-types@1.3.3)(gel@2.2.0)(kysely@0.28.17)(mysql2@3.15.3)(pg@8.21.0)(postgres@3.4.7)(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(sqlite3@5.1.7)) @@ -20129,7 +20154,7 @@ snapshots: drizzle-kit: 0.31.8 drizzle-orm: 0.44.7(@cloudflare/workers-types@4.20251121.0)(@libsql/client@0.14.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(@prisma/client@6.19.0(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.15.6)(better-sqlite3@12.5.0)(bun-types@1.3.3)(gel@2.2.0)(kysely@0.28.17)(mysql2@3.15.3)(pg@8.21.0)(postgres@3.4.7)(prisma@6.19.0(magicast@0.3.5)(typescript@5.9.3))(sqlite3@5.1.7) mysql2: 3.15.3 - next: 15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + next: 15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) pg: 8.21.0 prisma: 6.19.0(magicast@0.3.5)(typescript@5.9.3) react: 19.2.5 @@ -22017,7 +22042,7 @@ snapshots: - encoding - supports-color - inngest@3.54.2(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(express@5.2.1)(hono@4.12.2)(next@15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3)(zod@4.4.3): + inngest@3.54.2(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(express@5.2.1)(hono@4.12.2)(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3)(zod@4.4.3): dependencies: '@bufbuild/protobuf': 2.11.0 '@inngest/ai': 0.1.7 @@ -22048,7 +22073,7 @@ snapshots: optionalDependencies: express: 5.2.1 hono: 4.12.2 - next: 15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + next: 15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) typescript: 5.9.3 transitivePeerDependencies: - '@opentelemetry/core' @@ -23268,18 +23293,18 @@ snapshots: neo-async@2.6.2: {} - next-sanity@11.6.13(@emotion/is-prop-valid@1.4.0)(@sanity/client@7.23.0)(@sanity/icons@3.7.4(react@19.2.5))(@sanity/types@6.2.0(@types/react@19.2.6))(next@15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react-is@19.2.7)(react@19.2.5)(sanity@4.22.0(@emotion/is-prop-valid@1.4.0)(@portabletext/sanity-bridge@1.2.14(@types/react@19.2.6))(@types/node@24.10.1)(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(jiti@2.7.0)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0))(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3): + next-sanity@11.6.13(@emotion/is-prop-valid@1.4.0)(@sanity/client@7.23.0)(@sanity/icons@3.7.4(react@19.2.5))(@sanity/types@6.2.0(@types/react@19.2.6))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react-is@19.2.7)(react@19.2.5)(sanity@4.22.0(@emotion/is-prop-valid@1.4.0)(@portabletext/sanity-bridge@1.2.14(@types/react@19.2.6))(@types/node@24.10.1)(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(jiti@2.7.0)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0))(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3): dependencies: '@portabletext/react': 6.2.0(react@19.2.5) '@sanity/client': 7.23.0 '@sanity/comlink': 4.0.1 '@sanity/presentation-comlink': 2.1.0(@sanity/client@7.23.0)(@sanity/types@6.2.0(@types/react@19.2.6)) '@sanity/preview-url-secret': 3.0.0(@sanity/client@7.23.0)(@sanity/icons@3.7.4(react@19.2.5))(sanity@4.22.0(@emotion/is-prop-valid@1.4.0)(@portabletext/sanity-bridge@1.2.14(@types/react@19.2.6))(@types/node@24.10.1)(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(jiti@2.7.0)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0)) - '@sanity/visual-editing': 4.0.3(@emotion/is-prop-valid@1.4.0)(@sanity/client@7.23.0)(@sanity/types@6.2.0(@types/react@19.2.6))(next@15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react-is@19.2.7)(react@19.2.5)(sanity@4.22.0(@emotion/is-prop-valid@1.4.0)(@portabletext/sanity-bridge@1.2.14(@types/react@19.2.6))(@types/node@24.10.1)(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(jiti@2.7.0)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0))(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3) + '@sanity/visual-editing': 4.0.3(@emotion/is-prop-valid@1.4.0)(@sanity/client@7.23.0)(@sanity/types@6.2.0(@types/react@19.2.6))(next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react-is@19.2.7)(react@19.2.5)(sanity@4.22.0(@emotion/is-prop-valid@1.4.0)(@portabletext/sanity-bridge@1.2.14(@types/react@19.2.6))(@types/node@24.10.1)(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(jiti@2.7.0)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0))(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3) dequal: 2.0.3 groq: 4.22.0 history: 5.3.0 - next: 15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + next: 15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) react: 19.2.5 react-dom: 19.2.5(react@19.2.5) sanity: 4.22.0(@emotion/is-prop-valid@1.4.0)(@portabletext/sanity-bridge@1.2.14(@types/react@19.2.6))(@types/node@24.10.1)(@types/react-dom@19.2.3(@types/react@19.2.6))(@types/react@19.2.6)(jiti@2.7.0)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(styled-components@6.4.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(tsx@4.22.4)(typescript@5.9.3)(yaml@2.9.0) @@ -23323,7 +23348,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.5.18(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + next@15.5.18(@babel/core@7.29.7)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: '@next/env': 15.5.18 '@swc/helpers': 0.5.15 @@ -23331,7 +23356,7 @@ snapshots: postcss: 8.4.31 react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - styled-jsx: 5.1.6(@babel/core@7.28.6)(react@19.2.5) + styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.2.5) optionalDependencies: '@next/swc-darwin-arm64': 15.5.18 '@next/swc-darwin-x64': 15.5.18 @@ -24757,9 +24782,6 @@ snapshots: semver@7.7.3: {} - semver@7.7.4: - optional: true - semver@7.8.5: {} send@0.19.2: @@ -24883,7 +24905,7 @@ snapshots: dependencies: '@img/colour': 1.1.0 detect-libc: 2.1.2 - semver: 7.7.4 + semver: 7.8.5 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.5 '@img/sharp-darwin-x64': 0.34.5 @@ -25189,12 +25211,12 @@ snapshots: client-only: 0.0.1 react: 18.3.1 - styled-jsx@5.1.6(@babel/core@7.28.6)(react@19.2.5): + styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.2.5): dependencies: client-only: 0.0.1 react: 19.2.5 optionalDependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.7 stylis@4.3.6: {} @@ -25401,7 +25423,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.4.9(@babel/core@7.28.6)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.28.6))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3): + ts-jest@29.4.9(@babel/core@7.28.6)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.28.6))(esbuild@0.27.0)(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -25419,9 +25441,10 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 30.4.1 babel-jest: 29.7.0(@babel/core@7.28.6) + esbuild: 0.27.0 jest-util: 30.4.1 - ts-jest@29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1))(typescript@5.9.3): + ts-jest@29.4.9(@babel/core@7.29.7)(@jest/transform@29.7.0)(@jest/types@30.4.1)(babel-jest@29.7.0(@babel/core@7.29.7))(jest-util@30.4.1)(jest@29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 From 7c53ef7eb366e95a6e0d9cb738bce9b6e80b2f34 Mon Sep 17 00:00:00 2001 From: Dhirender Choudhary Date: Wed, 5 Aug 2026 17:44:02 +0530 Subject: [PATCH 2/6] feat(addresszen): add key availability and resolve USA ops Cover the OSS catalog surface and keep autocomplete/verify. --- packages/addresszen/api.test.ts | 43 ++++++++++++++++ packages/addresszen/endpoints/index.ts | 10 ++++ packages/addresszen/endpoints/key.ts | 47 +++++++++++++++++ packages/addresszen/endpoints/resolve.ts | 49 ++++++++++++++++++ packages/addresszen/endpoints/types.ts | 64 ++++++++++++++++++++++++ packages/addresszen/endpoints/verify.ts | 10 ++-- packages/addresszen/index.ts | 36 ++++++++++++- packages/addresszen/schema/database.ts | 23 +++++++++ packages/addresszen/schema/index.ts | 4 ++ 9 files changed, 282 insertions(+), 4 deletions(-) create mode 100644 packages/addresszen/endpoints/key.ts create mode 100644 packages/addresszen/endpoints/resolve.ts diff --git a/packages/addresszen/api.test.ts b/packages/addresszen/api.test.ts index 72918e4c7..65c3d40dd 100644 --- a/packages/addresszen/api.test.ts +++ b/packages/addresszen/api.test.ts @@ -2,6 +2,8 @@ import 'dotenv/config'; import { makeAddresszenRequest } from './client'; import type { AutocompleteAddressesResponse, + KeyAvailabilityResponse, + ResolveAddressUsaResponse, VerifyAddressResponse, } from './endpoints/types'; import { AddresszenEndpointOutputSchemas } from './endpoints/types'; @@ -9,6 +11,20 @@ import { AddresszenEndpointOutputSchemas } from './endpoints/types'; const TEST_API_KEY = process.env.ADDRESSZEN_API_KEY!; describe('Addresszen API Type Tests', () => { + describe('key', () => { + it('keyAvailability returns correct type', async () => { + const response = await makeAddresszenRequest( + `keys/${encodeURIComponent(TEST_API_KEY)}`, + TEST_API_KEY, + { method: 'GET' }, + ); + + AddresszenEndpointOutputSchemas.keyAvailability.parse(response); + expect(response.code).toBe(2000); + expect(typeof response.result.available).toBe('boolean'); + }); + }); + describe('autocomplete', () => { it('autocompleteAddresses returns correct type', async () => { const response = @@ -28,6 +44,33 @@ describe('Addresszen API Type Tests', () => { }); }); + describe('resolve', () => { + it('resolveAddressUsa returns correct type', async () => { + const suggestions = + await makeAddresszenRequest( + 'autocomplete/addresses', + TEST_API_KEY, + { + method: 'GET', + query: { query: '1600 Garfield Aliquippa' }, + }, + ); + + const addressId = suggestions.result.hits[0]?.id; + expect(addressId).toBeTruthy(); + + const response = await makeAddresszenRequest( + `autocomplete/addresses/${encodeURIComponent(addressId!)}/usa`, + TEST_API_KEY, + { method: 'GET' }, + ); + + AddresszenEndpointOutputSchemas.resolveAddressUsa.parse(response); + expect(response.code).toBe(2000); + expect(response.result.line_1).toBeTruthy(); + }); + }); + describe('verify', () => { it('verifyAddress returns correct type', async () => { const response = await makeAddresszenRequest( diff --git a/packages/addresszen/endpoints/index.ts b/packages/addresszen/endpoints/index.ts index 8015f5e38..9884a09c4 100644 --- a/packages/addresszen/endpoints/index.ts +++ b/packages/addresszen/endpoints/index.ts @@ -1,4 +1,6 @@ import { addresses } from './autocomplete'; +import { availability } from './key'; +import { addressUsa } from './resolve'; import { address } from './verify'; export const Autocomplete = { @@ -9,4 +11,12 @@ export const Verify = { address, }; +export const Key = { + availability, +}; + +export const Resolve = { + addressUsa, +}; + export * from './types'; diff --git a/packages/addresszen/endpoints/key.ts b/packages/addresszen/endpoints/key.ts new file mode 100644 index 000000000..bfa6fe744 --- /dev/null +++ b/packages/addresszen/endpoints/key.ts @@ -0,0 +1,47 @@ +import { logEventFromContext } from 'corsair/core'; +import { makeAddresszenRequest } from '../client'; +import type { AddresszenEndpoints } from '../index'; +import type { AddresszenEndpointOutputs } from './types'; + +/** + * Get public information on an API key, including whether it is usable. + * + * API: GET /keys/:key + * Docs: https://docs.addresszen.com/docs/api/key-availability + */ +export const availability: AddresszenEndpoints['keyAvailability'] = async ( + ctx, + _input, +) => { + const response = await makeAddresszenRequest< + AddresszenEndpointOutputs['keyAvailability'] + >(`keys/${encodeURIComponent(ctx.key)}`, ctx.key, { + method: 'GET', + }); + + if (ctx.db.keyAvailability) { + try { + await ctx.db.keyAvailability.upsertByEntityId(ctx.key, { + available: response.result.available, + context: response.result.context ?? null, + code: response.code, + message: response.message, + updatedAt: new Date(), + }); + } catch (error) { + console.warn( + '[addresszen] Failed to save key availability to database:', + error, + ); + } + } + + await logEventFromContext( + ctx, + 'addresszen.key.availability', + { available: response.result.available }, + 'completed', + ); + + return response; +}; diff --git a/packages/addresszen/endpoints/resolve.ts b/packages/addresszen/endpoints/resolve.ts new file mode 100644 index 000000000..01cc399a8 --- /dev/null +++ b/packages/addresszen/endpoints/resolve.ts @@ -0,0 +1,49 @@ +import { logEventFromContext } from 'corsair/core'; +import { makeAddresszenRequest } from '../client'; +import type { AddresszenEndpoints } from '../index'; +import type { AddresszenEndpointOutputs } from './types'; + +/** + * Resolve an address autocompletion by ID and return the full US-format address. + * + * API: GET /autocomplete/addresses/:address/usa + * Docs: https://docs.addresszen.com/docs/api/retrieve-address + */ +export const addressUsa: AddresszenEndpoints['resolveAddressUsa'] = async ( + ctx, + input, +) => { + const response = await makeAddresszenRequest< + AddresszenEndpointOutputs['resolveAddressUsa'] + >( + `autocomplete/addresses/${encodeURIComponent(input.addressId)}/usa`, + ctx.key, + { method: 'GET' }, + ); + + if (ctx.db.resolvedAddresses) { + try { + const { result, ...rest } = response; + await ctx.db.resolvedAddresses.upsertByEntityId(input.addressId, { + ...rest, + addressId: input.addressId, + address: result, + updatedAt: new Date(), + }); + } catch (error) { + console.warn( + '[addresszen] Failed to save resolved address to database:', + error, + ); + } + } + + await logEventFromContext( + ctx, + 'addresszen.resolve.addressUsa', + { addressId: input.addressId }, + 'completed', + ); + + return response; +}; diff --git a/packages/addresszen/endpoints/types.ts b/packages/addresszen/endpoints/types.ts index 2e5d9993f..1a35c5c51 100644 --- a/packages/addresszen/endpoints/types.ts +++ b/packages/addresszen/endpoints/types.ts @@ -86,22 +86,86 @@ export const VerifyAddressResponseSchema = z.object({ export type VerifyAddressResponse = z.infer; +export const KeyAvailabilityInputSchema = z.object({}); + +export type KeyAvailabilityInput = z.infer; + +export const KeyAvailabilityResponseSchema = z.object({ + code: z.number(), + message: z.string(), + result: z + .object({ + available: z.boolean(), + context: z.string().optional(), + // Country/context catalog; large and varies by key entitlements. + contexts: z.array(z.record(z.string(), z.unknown())).optional(), + }) + .loose(), +}); + +export type KeyAvailabilityResponse = z.infer< + typeof KeyAvailabilityResponseSchema +>; + +export const ResolveAddressUsaInputSchema = z.object({ + addressId: z + .string() + .min(1) + .describe( + 'Address suggestion ID from autocomplete (e.g. usps_X130125796|1600||1933)', + ), +}); + +export type ResolveAddressUsaInput = z.infer< + typeof ResolveAddressUsaInputSchema +>; + +export const ResolveAddressUsaResponseSchema = z.object({ + code: z.number(), + message: z.string(), + // US-format resolved address fields vary across datasets; keep loose. + result: z + .object({ + id: z.string().optional(), + line_1: z.string().optional(), + line_2: z.string().optional(), + city: z.string().optional(), + state: z.string().optional(), + state_abbreviation: z.string().optional(), + zip_code: z.string().optional(), + country_iso_2: z.string().optional(), + }) + .loose(), +}); + +export type ResolveAddressUsaResponse = z.infer< + typeof ResolveAddressUsaResponseSchema +>; + export type AddresszenEndpointInputs = { autocompleteAddresses: AutocompleteAddressesInput; verifyAddress: VerifyAddressInput; + keyAvailability: KeyAvailabilityInput; + resolveAddressUsa: ResolveAddressUsaInput; }; export type AddresszenEndpointOutputs = { autocompleteAddresses: AutocompleteAddressesResponse; verifyAddress: VerifyAddressResponse; + keyAvailability: KeyAvailabilityResponse; + resolveAddressUsa: ResolveAddressUsaResponse; }; export const AddresszenEndpointInputSchemas = { autocompleteAddresses: AutocompleteAddressesInputSchema, verifyAddress: VerifyAddressInputSchema, + keyAvailability: KeyAvailabilityInputSchema, + resolveAddressUsa: ResolveAddressUsaInputSchema, } as const; export const AddresszenEndpointOutputSchemas = { autocompleteAddresses: AutocompleteAddressesResponseSchema, verifyAddress: VerifyAddressResponseSchema, + keyAvailability: KeyAvailabilityResponseSchema, + resolveAddressUsa: ResolveAddressUsaResponseSchema, } as const; diff --git a/packages/addresszen/endpoints/verify.ts b/packages/addresszen/endpoints/verify.ts index 1f9771bbd..9e0907deb 100644 --- a/packages/addresszen/endpoints/verify.ts +++ b/packages/addresszen/endpoints/verify.ts @@ -25,9 +25,13 @@ export const address: AddresszenEndpoints['verifyAddress'] = async ( if (ctx.db.verifiedAddresses) { try { - const entityId = [input.query, input.city, input.state, input.zip_code] - .filter(Boolean) - .join('|'); + // ponytail: JSON key avoids `|` collisions in free-form address inputs + const entityId = JSON.stringify([ + input.query, + input.city ?? null, + input.state ?? null, + input.zip_code ?? null, + ]); await ctx.db.verifiedAddresses.upsertByEntityId(entityId, { ...response, diff --git a/packages/addresszen/index.ts b/packages/addresszen/index.ts index 3d6f61719..454319ea9 100644 --- a/packages/addresszen/index.ts +++ b/packages/addresszen/index.ts @@ -13,7 +13,7 @@ import type { RequiredPluginEndpointSchemas, } from 'corsair/core'; import { AuthMissingError } from 'corsair/core'; -import { Autocomplete, Verify } from './endpoints'; +import { Autocomplete, Key, Resolve, Verify } from './endpoints'; import type { AddresszenEndpointInputs, AddresszenEndpointOutputs, @@ -55,6 +55,8 @@ type AddresszenEndpoint = export type AddresszenEndpoints = { autocompleteAddresses: AddresszenEndpoint<'autocompleteAddresses'>; verifyAddress: AddresszenEndpoint<'verifyAddress'>; + keyAvailability: AddresszenEndpoint<'keyAvailability'>; + resolveAddressUsa: AddresszenEndpoint<'resolveAddressUsa'>; }; const addresszenEndpointsNested = { @@ -64,6 +66,12 @@ const addresszenEndpointsNested = { verify: { address: Verify.address, }, + key: { + availability: Key.availability, + }, + resolve: { + addressUsa: Resolve.addressUsa, + }, } as const; const addresszenWebhooksNested = {} as const; @@ -77,6 +85,14 @@ export const addresszenEndpointSchemas = { input: AddresszenEndpointInputSchemas.verifyAddress, output: AddresszenEndpointOutputSchemas.verifyAddress, }, + 'key.availability': { + input: AddresszenEndpointInputSchemas.keyAvailability, + output: AddresszenEndpointOutputSchemas.keyAvailability, + }, + 'resolve.addressUsa': { + input: AddresszenEndpointInputSchemas.resolveAddressUsa, + output: AddresszenEndpointOutputSchemas.resolveAddressUsa, + }, } as const satisfies RequiredPluginEndpointSchemas< typeof addresszenEndpointsNested >; @@ -94,6 +110,16 @@ const addresszenEndpointMeta = { description: 'Verify and standardize a US address using USPS CASS validation', }, + 'key.availability': { + riskLevel: 'read', + description: + 'Get public information on an API key, including whether it is currently usable', + }, + 'resolve.addressUsa': { + riskLevel: 'read', + description: + 'Resolve an address autocompletion by its address ID and return the full address in US format', + }, } as const satisfies RequiredPluginEndpointMeta< typeof addresszenEndpointsNested >; @@ -166,6 +192,10 @@ export type { AddresszenEndpointOutputs, AutocompleteAddressesInput, AutocompleteAddressesResponse, + KeyAvailabilityInput, + KeyAvailabilityResponse, + ResolveAddressUsaInput, + ResolveAddressUsaResponse, VerifyAddressInput, VerifyAddressResponse, } from './endpoints/types'; @@ -175,6 +205,10 @@ export { AddresszenEndpointOutputSchemas, AutocompleteAddressesInputSchema, AutocompleteAddressesResponseSchema, + KeyAvailabilityInputSchema, + KeyAvailabilityResponseSchema, + ResolveAddressUsaInputSchema, + ResolveAddressUsaResponseSchema, VerifyAddressInputSchema, VerifyAddressResponseSchema, } from './endpoints/types'; diff --git a/packages/addresszen/schema/database.ts b/packages/addresszen/schema/database.ts index a910dfa51..109fd0ac7 100644 --- a/packages/addresszen/schema/database.ts +++ b/packages/addresszen/schema/database.ts @@ -21,9 +21,32 @@ export const AddresszenVerifiedAddress = z.object({ updatedAt: z.coerce.date().nullable().optional(), }); +export const AddresszenKeyAvailability = z.object({ + available: z.boolean(), + context: z.string().nullable().optional(), + code: z.number().optional(), + message: z.string().optional(), + updatedAt: z.coerce.date().nullable().optional(), +}); + +export const AddresszenResolvedAddress = z.object({ + addressId: z.string(), + // Full US-format resolve payload; field set varies by dataset. + address: z.record(z.string(), z.unknown()), + code: z.number().optional(), + message: z.string().optional(), + updatedAt: z.coerce.date().nullable().optional(), +}); + export type AddresszenAutocompleteResult = z.infer< typeof AddresszenAutocompleteResult >; export type AddresszenVerifiedAddress = z.infer< typeof AddresszenVerifiedAddress >; +export type AddresszenKeyAvailability = z.infer< + typeof AddresszenKeyAvailability +>; +export type AddresszenResolvedAddress = z.infer< + typeof AddresszenResolvedAddress +>; diff --git a/packages/addresszen/schema/index.ts b/packages/addresszen/schema/index.ts index 8fba4c996..c2c2e54cc 100644 --- a/packages/addresszen/schema/index.ts +++ b/packages/addresszen/schema/index.ts @@ -1,5 +1,7 @@ import { AddresszenAutocompleteResult, + AddresszenKeyAvailability, + AddresszenResolvedAddress, AddresszenVerifiedAddress, } from './database'; @@ -8,5 +10,7 @@ export const AddresszenSchema = { entities: { autocompleteResults: AddresszenAutocompleteResult, verifiedAddresses: AddresszenVerifiedAddress, + keyAvailability: AddresszenKeyAvailability, + resolvedAddresses: AddresszenResolvedAddress, }, } as const; From 7bd78a40e1c0bf7cf7f3400b351375ae4ac705ce Mon Sep 17 00:00:00 2001 From: Dhirender Choudhary Date: Wed, 5 Aug 2026 17:53:10 +0530 Subject: [PATCH 3/6] fix(addresszen): address review findings on tests and persistence --- packages/addresszen/api.test.ts | 23 ++++++++++--------- packages/addresszen/endpoints/autocomplete.ts | 4 +++- packages/addresszen/endpoints/key.ts | 3 ++- packages/addresszen/endpoints/types.ts | 2 ++ packages/addresszen/endpoints/verify.ts | 2 ++ packages/addresszen/schema/database.ts | 1 + 6 files changed, 22 insertions(+), 13 deletions(-) diff --git a/packages/addresszen/api.test.ts b/packages/addresszen/api.test.ts index 65c3d40dd..8b8d00246 100644 --- a/packages/addresszen/api.test.ts +++ b/packages/addresszen/api.test.ts @@ -8,14 +8,15 @@ import type { } from './endpoints/types'; import { AddresszenEndpointOutputSchemas } from './endpoints/types'; -const TEST_API_KEY = process.env.ADDRESSZEN_API_KEY!; +const TEST_API_KEY = process.env.ADDRESSZEN_API_KEY; +const describeIfApiKey = TEST_API_KEY ? describe : describe.skip; -describe('Addresszen API Type Tests', () => { +describeIfApiKey('Addresszen API Type Tests', () => { describe('key', () => { it('keyAvailability returns correct type', async () => { const response = await makeAddresszenRequest( - `keys/${encodeURIComponent(TEST_API_KEY)}`, - TEST_API_KEY, + `keys/${encodeURIComponent(TEST_API_KEY!)}`, + TEST_API_KEY!, { method: 'GET' }, ); @@ -30,11 +31,11 @@ describe('Addresszen API Type Tests', () => { const response = await makeAddresszenRequest( 'autocomplete/addresses', - TEST_API_KEY, + TEST_API_KEY!, { method: 'GET', query: { - query: '10 downing', + q: '10 downing', }, }, ); @@ -49,10 +50,10 @@ describe('Addresszen API Type Tests', () => { const suggestions = await makeAddresszenRequest( 'autocomplete/addresses', - TEST_API_KEY, + TEST_API_KEY!, { method: 'GET', - query: { query: '1600 Garfield Aliquippa' }, + query: { q: '1600 Garfield Aliquippa' }, }, ); @@ -61,7 +62,7 @@ describe('Addresszen API Type Tests', () => { const response = await makeAddresszenRequest( `autocomplete/addresses/${encodeURIComponent(addressId!)}/usa`, - TEST_API_KEY, + TEST_API_KEY!, { method: 'GET' }, ); @@ -75,7 +76,7 @@ describe('Addresszen API Type Tests', () => { it('verifyAddress returns correct type', async () => { const response = await makeAddresszenRequest( 'verify/addresses', - TEST_API_KEY, + TEST_API_KEY!, { method: 'POST', body: { @@ -91,7 +92,7 @@ describe('Addresszen API Type Tests', () => { it('verifyAddress with split components returns correct type', async () => { const response = await makeAddresszenRequest( 'verify/addresses', - TEST_API_KEY, + TEST_API_KEY!, { method: 'POST', body: { diff --git a/packages/addresszen/endpoints/autocomplete.ts b/packages/addresszen/endpoints/autocomplete.ts index 001b66ccc..af5e35d80 100644 --- a/packages/addresszen/endpoints/autocomplete.ts +++ b/packages/addresszen/endpoints/autocomplete.ts @@ -18,7 +18,9 @@ export const addresses: AddresszenEndpoints['autocompleteAddresses'] = async ( >('autocomplete/addresses', ctx.key, { method: 'GET', query: { - query: input.query, + q: input.query, + limit: input.limit, + page: input.page, }, }); diff --git a/packages/addresszen/endpoints/key.ts b/packages/addresszen/endpoints/key.ts index bfa6fe744..cbd69a9d0 100644 --- a/packages/addresszen/endpoints/key.ts +++ b/packages/addresszen/endpoints/key.ts @@ -21,7 +21,8 @@ export const availability: AddresszenEndpoints['keyAvailability'] = async ( if (ctx.db.keyAvailability) { try { - await ctx.db.keyAvailability.upsertByEntityId(ctx.key, { + const accountId = await ctx.$getAccountId(); + await ctx.db.keyAvailability.upsertByEntityId(accountId, { available: response.result.available, context: response.result.context ?? null, code: response.code, diff --git a/packages/addresszen/endpoints/types.ts b/packages/addresszen/endpoints/types.ts index 1a35c5c51..e24eb55b4 100644 --- a/packages/addresszen/endpoints/types.ts +++ b/packages/addresszen/endpoints/types.ts @@ -18,6 +18,8 @@ export const AutocompleteAddressesInputSchema = z.object({ .min(1) .max(150) .describe('Partial address string to autocomplete'), + limit: z.number().int().positive().optional(), + page: z.number().int().nonnegative().optional(), }); export type AutocompleteAddressesInput = z.infer< diff --git a/packages/addresszen/endpoints/verify.ts b/packages/addresszen/endpoints/verify.ts index 9e0907deb..4fc87a33a 100644 --- a/packages/addresszen/endpoints/verify.ts +++ b/packages/addresszen/endpoints/verify.ts @@ -31,6 +31,7 @@ export const address: AddresszenEndpoints['verifyAddress'] = async ( input.city ?? null, input.state ?? null, input.zip_code ?? null, + input.context ?? null, ]); await ctx.db.verifiedAddresses.upsertByEntityId(entityId, { @@ -39,6 +40,7 @@ export const address: AddresszenEndpoints['verifyAddress'] = async ( city: input.city ?? null, state: input.state ?? null, zipCode: input.zip_code ?? null, + context: input.context ?? null, updatedAt: new Date(), }); } catch (error) { diff --git a/packages/addresszen/schema/database.ts b/packages/addresszen/schema/database.ts index 109fd0ac7..92c6c137d 100644 --- a/packages/addresszen/schema/database.ts +++ b/packages/addresszen/schema/database.ts @@ -14,6 +14,7 @@ export const AddresszenVerifiedAddress = z.object({ city: z.string().nullable().optional(), state: z.string().nullable().optional(), zipCode: z.string().nullable().optional(), + context: z.string().nullable().optional(), // Stored verify payload mirrors the API result object, which varies by match type. result: z.record(z.string(), z.unknown()), code: z.number().optional(), From 759962910311d0659242b015bb52ddecc847683c Mon Sep 17 00:00:00 2001 From: Dhirender Choudhary Date: Wed, 5 Aug 2026 17:55:47 +0530 Subject: [PATCH 4/6] chore(addresszen): drop demo/testing from plugin PR scope --- demo/testing/package.json | 1 - demo/testing/src/server/corsair.ts | 4 ---- pnpm-lock.yaml | 3 --- 3 files changed, 8 deletions(-) diff --git a/demo/testing/package.json b/demo/testing/package.json index 3fa5f4d96..3dcf0da17 100644 --- a/demo/testing/package.json +++ b/demo/testing/package.json @@ -25,7 +25,6 @@ }, "dependencies": { "@anthropic-ai/claude-agent-sdk": "^0.2.0", - "@corsair-dev/addresszen": "workspace:*", "@corsair-dev/agentql": "workspace:*", "@corsair-dev/bitwarden": "workspace:*", "@corsair-dev/cursor": "workspace:*", diff --git a/demo/testing/src/server/corsair.ts b/demo/testing/src/server/corsair.ts index b82fdc32d..3755c8b3e 100644 --- a/demo/testing/src/server/corsair.ts +++ b/demo/testing/src/server/corsair.ts @@ -2,7 +2,6 @@ import dotenv from 'dotenv'; dotenv.config({ path: '../.env' }); -import { addresszen } from '@corsair-dev/addresszen'; import { agentql } from '@corsair-dev/agentql'; import { gmail } from '@corsair-dev/gmail'; import { googlecalendar } from '@corsair-dev/googlecalendar'; @@ -59,9 +58,6 @@ export const corsair = createCorsair({ agentql({ key: process.env.AGENTQL_API_KEY, }), - addresszen({ - key: process.env.ADDRESSZEN_API_KEY, - }), twilio(), vapi({ key: process.env.VAPI_API_KEY, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a85baffb2..48ec4fb3d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -162,9 +162,6 @@ importers: '@anthropic-ai/claude-agent-sdk': specifier: ^0.2.0 version: 0.2.71(zod@4.4.3) - '@corsair-dev/addresszen': - specifier: workspace:* - version: link:../../packages/addresszen '@corsair-dev/agentql': specifier: workspace:* version: link:../../packages/agentql From bf2c76069ebaa4155d06be59da240aed81d98ed7 Mon Sep 17 00:00:00 2001 From: Dhirender Choudhary Date: Wed, 5 Aug 2026 17:58:46 +0530 Subject: [PATCH 5/6] feat(addresszen): register provider in core constants --- packages/corsair/core/constants.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/corsair/core/constants.ts b/packages/corsair/core/constants.ts index 063b1ec46..c2bd24988 100644 --- a/packages/corsair/core/constants.ts +++ b/packages/corsair/core/constants.ts @@ -15,6 +15,7 @@ export type AllErrors = export const BaseProviders = [ 'abstract', 'activetrail', + 'addresszen', 'agentql', 'ahrefs', 'airtable', @@ -113,6 +114,7 @@ export const BaseProviders = [ export const ProviderDisplayNames = { abstract: 'Abstract', activetrail: 'Active Trail', + addresszen: 'Addresszen', agentql: 'AgentQL', ahrefs: 'Ahrefs', airtable: 'Airtable', @@ -218,6 +220,7 @@ export function formatProviderDisplayName(plugin: string): string { export type AllProviders = | 'abstract' | 'activetrail' + | 'addresszen' | 'agentql' | 'ahrefs' | 'airtable' From 25447211f9325447a226a1026a57b6849609273a Mon Sep 17 00:00:00 2001 From: Dhirender Choudhary Date: Wed, 5 Aug 2026 18:03:25 +0530 Subject: [PATCH 6/6] fix(addresszen): omit auth header on public key availability --- packages/addresszen/api.test.ts | 2 +- packages/addresszen/client.ts | 6 ++++-- packages/addresszen/endpoints/key.ts | 5 +++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/addresszen/api.test.ts b/packages/addresszen/api.test.ts index 8b8d00246..6029c0e28 100644 --- a/packages/addresszen/api.test.ts +++ b/packages/addresszen/api.test.ts @@ -17,7 +17,7 @@ describeIfApiKey('Addresszen API Type Tests', () => { const response = await makeAddresszenRequest( `keys/${encodeURIComponent(TEST_API_KEY!)}`, TEST_API_KEY!, - { method: 'GET' }, + { method: 'GET', auth: false }, ); AddresszenEndpointOutputSchemas.keyAvailability.parse(response); diff --git a/packages/addresszen/client.ts b/packages/addresszen/client.ts index 56164c584..ab99da666 100644 --- a/packages/addresszen/client.ts +++ b/packages/addresszen/client.ts @@ -42,9 +42,11 @@ export async function makeAddresszenRequest( method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'; body?: Record; query?: Record; + /** When false, skip Authorization (public endpoints that identify the key in the path). */ + auth?: boolean; } = {}, ): Promise { - const { method = 'GET', body, query = {} } = options; + const { method = 'GET', body, query = {}, auth = true } = options; const isWrite = method === 'POST' || method === 'PUT' || method === 'PATCH'; const config: OpenAPIConfig = { @@ -54,7 +56,7 @@ export async function makeAddresszenRequest( CREDENTIALS: 'omit', TOKEN: undefined, HEADERS: { - Authorization: `api_key="${apiKey}"`, + ...(auth ? { Authorization: `api_key="${apiKey}"` } : {}), ...(isWrite ? { 'Content-Type': 'application/json' } : {}), }, }; diff --git a/packages/addresszen/endpoints/key.ts b/packages/addresszen/endpoints/key.ts index cbd69a9d0..081578710 100644 --- a/packages/addresszen/endpoints/key.ts +++ b/packages/addresszen/endpoints/key.ts @@ -8,6 +8,10 @@ import type { AddresszenEndpointOutputs } from './types'; * * API: GET /keys/:key * Docs: https://docs.addresszen.com/docs/api/key-availability + * + * Addresszen requires the key as the path resource id for this public endpoint; + * there is no header-only variant. Auth header is omitted so the credential is + * not also sent in Authorization. */ export const availability: AddresszenEndpoints['keyAvailability'] = async ( ctx, @@ -17,6 +21,7 @@ export const availability: AddresszenEndpoints['keyAvailability'] = async ( AddresszenEndpointOutputs['keyAvailability'] >(`keys/${encodeURIComponent(ctx.key)}`, ctx.key, { method: 'GET', + auth: false, }); if (ctx.db.keyAvailability) {