@roxyapi/sdk 1.2.32 → 1.2.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "1.2.32";
1
+ export declare const VERSION = "1.2.34";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1027,7 +1027,7 @@ const { data } = await roxy.humanDesign.calculateVariables({
1027
1027
 
1028
1028
  ## Forecast — `roxy.forecast`
1029
1029
 
1030
- Merge upcoming transit aspects, sign ingresses, retrograde stations, Vimshottari dasha changes, and biorhythm critica...
1030
+ Merge upcoming transit aspects, sign ingresses, retrograde stations, new and full moons, biorhythm critical days, and...
1031
1031
 
1032
1032
  ```typescript
1033
1033
  // Cross-domain forecast timeline - Transits, ingresses, stations, dasha changes, critical days
@@ -1048,7 +1048,7 @@ const { data } = await roxy.forecast.generateTimeline({
1048
1048
  },
1049
1049
  });
1050
1050
 
1051
- // Western transit forecast - Transit aspects, sign ingresses, retrograde stations
1051
+ // Western astrology forecast - aspects, ingresses, stations, eclipses, moon phases
1052
1052
  const { data } = await roxy.forecast.forecastTransits({
1053
1053
  body: {
1054
1054
  birthData: {
@@ -1101,7 +1101,7 @@ const { data } = await roxy.forecast.generateDigest({
1101
1101
  });
1102
1102
 
1103
1103
  // Solar return chart - Annual birthday forecast chart for a single subject
1104
- const { data } = await roxy.forecast.generateSolarReturn({
1104
+ const { data } = await roxy.forecast.forecastSolarReturn({
1105
1105
  body: {
1106
1106
  date: '1990-07-15',
1107
1107
  time: '14:30:00',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roxyapi/sdk",
3
- "version": "1.2.32",
3
+ "version": "1.2.34",
4
4
  "description": "TypeScript SDK for Roxy — the multi-domain spiritual intelligence API",
5
5
  "type": "module",
6
6
  "exports": {
@@ -69,7 +69,7 @@
69
69
  "devDependencies": {
70
70
  "@biomejs/biome": "^2.4.9",
71
71
  "@hey-api/client-fetch": "0.13.1",
72
- "@hey-api/openapi-ts": "0.94.5",
72
+ "@hey-api/openapi-ts": "0.97.3",
73
73
  "@types/node": "^25.5.0",
74
74
  "lefthook": "^2.1.4",
75
75
  "tsup": "^8.5.1",
@@ -31,7 +31,14 @@ export const createClient = (config: Config = {}): Client => {
31
31
 
32
32
  const interceptors = createInterceptors<Request, Response, unknown, ResolvedRequestOptions>();
33
33
 
34
- const beforeRequest = async (options: RequestOptions) => {
34
+ const beforeRequest = async <
35
+ TData = unknown,
36
+ TResponseStyle extends 'data' | 'fields' = 'fields',
37
+ ThrowOnError extends boolean = boolean,
38
+ Url extends string = string,
39
+ >(
40
+ options: RequestOptions<TData, TResponseStyle, ThrowOnError, Url>,
41
+ ) => {
35
42
  const opts = {
36
43
  ..._config,
37
44
  ...options,
@@ -41,10 +48,7 @@ export const createClient = (config: Config = {}): Client => {
41
48
  };
42
49
 
43
50
  if (opts.security) {
44
- await setAuthParams({
45
- ...opts,
46
- security: opts.security,
47
- });
51
+ await setAuthParams(opts);
48
52
  }
49
53
 
50
54
  if (opts.requestValidator) {
@@ -60,178 +64,162 @@ export const createClient = (config: Config = {}): Client => {
60
64
  opts.headers.delete('Content-Type');
61
65
  }
62
66
 
63
- const url = buildUrl(opts);
67
+ const resolvedOpts = opts as typeof opts &
68
+ ResolvedRequestOptions<TResponseStyle, ThrowOnError, Url>;
69
+ const url = buildUrl(resolvedOpts);
64
70
 
65
- return { opts, url };
71
+ return { opts: resolvedOpts, url };
66
72
  };
67
73
 
68
74
  const request: Client['request'] = async (options) => {
69
- // @ts-expect-error
70
- const { opts, url } = await beforeRequest(options);
71
- const requestInit: ReqInit = {
72
- redirect: 'follow',
73
- ...opts,
74
- body: getValidRequestBody(opts),
75
- };
76
-
77
- let request = new Request(url, requestInit);
75
+ const throwOnError = options.throwOnError ?? _config.throwOnError;
76
+ const responseStyle = options.responseStyle ?? _config.responseStyle;
78
77
 
79
- for (const fn of interceptors.request.fns) {
80
- if (fn) {
81
- request = await fn(request, opts);
82
- }
83
- }
84
-
85
- // fetch must be assigned here, otherwise it would throw the error:
86
- // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation
87
- const _fetch = opts.fetch!;
88
- let response: Response;
78
+ let request: Request | undefined;
79
+ let response: Response | undefined;
89
80
 
90
81
  try {
91
- response = await _fetch(request);
92
- } catch (error) {
93
- // Handle fetch exceptions (AbortError, network errors, etc.)
94
- let finalError = error;
82
+ const { opts, url } = await beforeRequest(options);
83
+ const requestInit: ReqInit = {
84
+ redirect: 'follow',
85
+ ...opts,
86
+ body: getValidRequestBody(opts),
87
+ };
95
88
 
96
- for (const fn of interceptors.error.fns) {
89
+ request = new Request(url, requestInit);
90
+
91
+ for (const fn of interceptors.request.fns) {
97
92
  if (fn) {
98
- finalError = (await fn(error, undefined as any, request, opts)) as unknown;
93
+ request = await fn(request, opts);
99
94
  }
100
95
  }
101
96
 
102
- finalError = finalError || ({} as unknown);
97
+ // fetch must be assigned here, otherwise it would throw the error:
98
+ // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation
99
+ const _fetch = opts.fetch!;
103
100
 
104
- if (opts.throwOnError) {
105
- throw finalError;
106
- }
107
-
108
- // Return error response
109
- return opts.responseStyle === 'data'
110
- ? undefined
111
- : {
112
- error: finalError,
113
- request,
114
- response: undefined as any,
115
- };
116
- }
101
+ response = await _fetch(request);
117
102
 
118
- for (const fn of interceptors.response.fns) {
119
- if (fn) {
120
- response = await fn(response, request, opts);
103
+ for (const fn of interceptors.response.fns) {
104
+ if (fn) {
105
+ response = await fn(response, request, opts);
106
+ }
121
107
  }
122
- }
123
-
124
- const result = {
125
- request,
126
- response,
127
- };
128
108
 
129
- if (response.ok) {
130
- const parseAs =
131
- (opts.parseAs === 'auto'
132
- ? getParseAs(response.headers.get('Content-Type'))
133
- : opts.parseAs) ?? 'json';
109
+ const result = {
110
+ request,
111
+ response,
112
+ };
113
+
114
+ if (response.ok) {
115
+ const parseAs =
116
+ (opts.parseAs === 'auto'
117
+ ? getParseAs(response.headers.get('Content-Type'))
118
+ : opts.parseAs) ?? 'json';
119
+
120
+ if (response.status === 204 || response.headers.get('Content-Length') === '0') {
121
+ let emptyData: any;
122
+ switch (parseAs) {
123
+ case 'arrayBuffer':
124
+ case 'blob':
125
+ case 'text':
126
+ emptyData = await response[parseAs]();
127
+ break;
128
+ case 'formData':
129
+ emptyData = new FormData();
130
+ break;
131
+ case 'stream':
132
+ emptyData = response.body;
133
+ break;
134
+ case 'json':
135
+ default:
136
+ emptyData = {};
137
+ break;
138
+ }
139
+ return opts.responseStyle === 'data'
140
+ ? emptyData
141
+ : {
142
+ data: emptyData,
143
+ ...result,
144
+ };
145
+ }
134
146
 
135
- if (response.status === 204 || response.headers.get('Content-Length') === '0') {
136
- let emptyData: any;
147
+ let data: any;
137
148
  switch (parseAs) {
138
149
  case 'arrayBuffer':
139
150
  case 'blob':
151
+ case 'formData':
140
152
  case 'text':
141
- emptyData = await response[parseAs]();
153
+ data = await response[parseAs]();
142
154
  break;
143
- case 'formData':
144
- emptyData = new FormData();
155
+ case 'json': {
156
+ // Some servers return 200 with no Content-Length and empty body.
157
+ // response.json() would throw; read as text and parse if non-empty.
158
+ const text = await response.text();
159
+ data = text ? JSON.parse(text) : {};
145
160
  break;
161
+ }
146
162
  case 'stream':
147
- emptyData = response.body;
148
- break;
149
- case 'json':
150
- default:
151
- emptyData = {};
152
- break;
163
+ return opts.responseStyle === 'data'
164
+ ? response.body
165
+ : {
166
+ data: response.body,
167
+ ...result,
168
+ };
169
+ }
170
+
171
+ if (parseAs === 'json') {
172
+ if (opts.responseValidator) {
173
+ await opts.responseValidator(data);
174
+ }
175
+
176
+ if (opts.responseTransformer) {
177
+ data = await opts.responseTransformer(data);
178
+ }
153
179
  }
180
+
154
181
  return opts.responseStyle === 'data'
155
- ? emptyData
182
+ ? data
156
183
  : {
157
- data: emptyData,
184
+ data,
158
185
  ...result,
159
186
  };
160
187
  }
161
188
 
162
- let data: any;
163
- switch (parseAs) {
164
- case 'arrayBuffer':
165
- case 'blob':
166
- case 'formData':
167
- case 'text':
168
- data = await response[parseAs]();
169
- break;
170
- case 'json': {
171
- // Some servers return 200 with no Content-Length and empty body.
172
- // response.json() would throw; read as text and parse if non-empty.
173
- const text = await response.text();
174
- data = text ? JSON.parse(text) : {};
175
- break;
176
- }
177
- case 'stream':
178
- return opts.responseStyle === 'data'
179
- ? response.body
180
- : {
181
- data: response.body,
182
- ...result,
183
- };
189
+ const textError = await response.text();
190
+ let jsonError: unknown;
191
+
192
+ try {
193
+ jsonError = JSON.parse(textError);
194
+ } catch {
195
+ // noop
184
196
  }
185
197
 
186
- if (parseAs === 'json') {
187
- if (opts.responseValidator) {
188
- await opts.responseValidator(data);
189
- }
198
+ throw jsonError ?? textError;
199
+ } catch (error) {
200
+ let finalError = error;
190
201
 
191
- if (opts.responseTransformer) {
192
- data = await opts.responseTransformer(data);
202
+ for (const fn of interceptors.error.fns) {
203
+ if (fn) {
204
+ finalError = await fn(finalError, response, request, options as ResolvedRequestOptions);
193
205
  }
194
206
  }
195
207
 
196
- return opts.responseStyle === 'data'
197
- ? data
198
- : {
199
- data,
200
- ...result,
201
- };
202
- }
203
-
204
- const textError = await response.text();
205
- let jsonError: unknown;
206
-
207
- try {
208
- jsonError = JSON.parse(textError);
209
- } catch {
210
- // noop
211
- }
212
-
213
- const error = jsonError ?? textError;
214
- let finalError = error;
208
+ finalError = finalError || {};
215
209
 
216
- for (const fn of interceptors.error.fns) {
217
- if (fn) {
218
- finalError = (await fn(error, response, request, opts)) as string;
210
+ if (throwOnError) {
211
+ throw finalError;
219
212
  }
220
- }
221
-
222
- finalError = finalError || ({} as string);
223
213
 
224
- if (opts.throwOnError) {
225
- throw finalError;
214
+ // TODO: we probably want to return error and improve types
215
+ return responseStyle === 'data'
216
+ ? undefined
217
+ : {
218
+ error: finalError,
219
+ request,
220
+ response,
221
+ };
226
222
  }
227
-
228
- // TODO: we probably want to return error and improve types
229
- return opts.responseStyle === 'data'
230
- ? undefined
231
- : {
232
- error: finalError,
233
- ...result,
234
- };
235
223
  };
236
224
 
237
225
  const makeMethodFn = (method: Uppercase<HttpMethod>) => (options: RequestOptions) =>
@@ -242,7 +230,6 @@ export const createClient = (config: Config = {}): Client => {
242
230
  return createSseClient({
243
231
  ...opts,
244
232
  body: opts.body as BodyInit | null | undefined,
245
- headers: opts.headers as unknown as Record<string, string>,
246
233
  method,
247
234
  onRequest: async (url, init) => {
248
235
  let request = new Request(url, init);
@@ -93,6 +93,7 @@ export interface ResolvedRequestOptions<
93
93
  ThrowOnError extends boolean = boolean,
94
94
  Url extends string = string,
95
95
  > extends RequestOptions<unknown, TResponseStyle, ThrowOnError, Url> {
96
+ headers: Headers;
96
97
  serializedBody?: string;
97
98
  }
98
99
 
@@ -126,8 +127,10 @@ export type RequestResult<
126
127
  error: TError extends Record<string, unknown> ? TError[keyof TError] : TError;
127
128
  }
128
129
  ) & {
129
- request: Request;
130
- response: Response;
130
+ /** request may be undefined, because error may be from building the request object itself */
131
+ request?: Request;
132
+ /** response may be undefined, because error may be from building the request object itself or from a network error */
133
+ response?: Response;
131
134
  }
132
135
  >;
133
136
 
@@ -148,12 +151,13 @@ type MethodFn = <
148
151
 
149
152
  type SseFn = <
150
153
  TData = unknown,
151
- TError = unknown,
154
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
155
+ _TError = unknown,
152
156
  ThrowOnError extends boolean = false,
153
157
  TResponseStyle extends ResponseStyle = 'fields',
154
158
  >(
155
- options: Omit<RequestOptions<TData, TResponseStyle, ThrowOnError>, 'method'>,
156
- ) => Promise<ServerSentEventsResult<TData, TError>>;
159
+ options: Omit<RequestOptions<never, TResponseStyle, ThrowOnError>, 'method'>,
160
+ ) => Promise<ServerSentEventsResult<TData>>;
157
161
 
158
162
  type RequestFn = <
159
163
  TData = unknown,
@@ -118,14 +118,12 @@ const checkForExistence = (
118
118
  return false;
119
119
  };
120
120
 
121
- export const setAuthParams = async ({
122
- security,
123
- ...options
124
- }: Pick<Required<RequestOptions>, 'security'> &
125
- Pick<RequestOptions, 'auth' | 'query'> & {
121
+ export async function setAuthParams(
122
+ options: Pick<RequestOptions, 'auth' | 'query' | 'security'> & {
126
123
  headers: Headers;
127
- }) => {
128
- for (const auth of security) {
124
+ },
125
+ ): Promise<void> {
126
+ for (const auth of options.security ?? []) {
129
127
  if (checkForExistence(options, auth.name)) {
130
128
  continue;
131
129
  }
@@ -154,7 +152,7 @@ export const setAuthParams = async ({
154
152
  break;
155
153
  }
156
154
  }
157
- };
155
+ }
158
156
 
159
157
  export const buildUrl: Client['buildUrl'] = (options) =>
160
158
  getUrl({
@@ -218,8 +216,10 @@ export const mergeHeaders = (
218
216
 
219
217
  type ErrInterceptor<Err, Res, Req, Options> = (
220
218
  error: Err,
221
- response: Res,
222
- request: Req,
219
+ /** response may be undefined due to a network error where no response object is produced */
220
+ response: Res | undefined,
221
+ /** request may be undefined, because error may be from building the request object itself */
222
+ request: Req | undefined,
223
223
  options: Options,
224
224
  ) => Err | Promise<Err>;
225
225
 
@@ -104,10 +104,10 @@ const stripEmptySlots = (params: Params) => {
104
104
 
105
105
  export const buildClientParams = (args: ReadonlyArray<unknown>, fields: FieldsConfig) => {
106
106
  const params: Params = {
107
- body: {},
108
- headers: {},
109
- path: {},
110
- query: {},
107
+ body: Object.create(null),
108
+ headers: Object.create(null),
109
+ path: Object.create(null),
110
+ query: Object.create(null),
111
111
  };
112
112
 
113
113
  const map = buildKeyMap(fields);
@@ -79,7 +79,7 @@ export type ServerSentEventsResult<TData = unknown, TReturn = void, TNext = unkn
79
79
  >;
80
80
  };
81
81
 
82
- export const createSseClient = <TData = unknown>({
82
+ export function createSseClient<TData = unknown>({
83
83
  onRequest,
84
84
  onSseError,
85
85
  onSseEvent,
@@ -91,7 +91,7 @@ export const createSseClient = <TData = unknown>({
91
91
  sseSleepFn,
92
92
  url,
93
93
  ...options
94
- }: ServerSentEventsOptions): ServerSentEventsResult<TData> => {
94
+ }: ServerSentEventsOptions): ServerSentEventsResult<TData> {
95
95
  let lastEventId: string | undefined;
96
96
 
97
97
  const sleep = sseSleepFn ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));
@@ -155,8 +155,7 @@ export const createSseClient = <TData = unknown>({
155
155
  const { done, value } = await reader.read();
156
156
  if (done) break;
157
157
  buffer += value;
158
- // Normalize line endings: CRLF -> LF, then CR -> LF
159
- buffer = buffer.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
158
+ buffer = buffer.replace(/\r\n?/g, '\n'); // normalize line endings
160
159
 
161
160
  const chunks = buffer.split('\n\n');
162
161
  buffer = chunks.pop() ?? '';
@@ -240,4 +239,4 @@ export const createSseClient = <TData = unknown>({
240
239
  const stream = createStream();
241
240
 
242
241
  return { stream };
243
- };
242
+ }
package/src/sdk.gen.ts CHANGED
@@ -4,7 +4,7 @@ import type { Client, Options as Options2, TDataShape } from './client';
4
4
  import { client } from './client.gen';
5
5
  import type { GetAngelNumbersLookupData, GetAngelNumbersLookupErrors, GetAngelNumbersLookupResponses, GetAngelNumbersNumbersByNumberData, GetAngelNumbersNumbersByNumberErrors, GetAngelNumbersNumbersByNumberResponses, GetAngelNumbersNumbersData, GetAngelNumbersNumbersErrors, GetAngelNumbersNumbersResponses, GetAstrologyHoroscopeBySignDailyData, GetAstrologyHoroscopeBySignDailyErrors, GetAstrologyHoroscopeBySignDailyResponses, GetAstrologyHoroscopeBySignMonthlyData, GetAstrologyHoroscopeBySignMonthlyErrors, GetAstrologyHoroscopeBySignMonthlyResponses, GetAstrologyHoroscopeBySignWeeklyData, GetAstrologyHoroscopeBySignWeeklyErrors, GetAstrologyHoroscopeBySignWeeklyResponses, GetAstrologyMoonPhaseCalendarByYearByMonthData, GetAstrologyMoonPhaseCalendarByYearByMonthErrors, GetAstrologyMoonPhaseCalendarByYearByMonthResponses, GetAstrologyMoonPhaseCurrentData, GetAstrologyMoonPhaseCurrentErrors, GetAstrologyMoonPhaseCurrentResponses, GetAstrologyMoonPhaseUpcomingData, GetAstrologyMoonPhaseUpcomingErrors, GetAstrologyMoonPhaseUpcomingResponses, GetAstrologyPlanetMeaningsByIdData, GetAstrologyPlanetMeaningsByIdErrors, GetAstrologyPlanetMeaningsByIdResponses, GetAstrologyPlanetMeaningsData, GetAstrologyPlanetMeaningsErrors, GetAstrologyPlanetMeaningsResponses, GetAstrologySignsByIdData, GetAstrologySignsByIdErrors, GetAstrologySignsByIdResponses, GetAstrologySignsData, GetAstrologySignsErrors, GetAstrologySignsResponses, GetCrystalsBirthstoneByMonthData, GetCrystalsBirthstoneByMonthErrors, GetCrystalsBirthstoneByMonthResponses, GetCrystalsByIdData, GetCrystalsByIdErrors, GetCrystalsByIdResponses, GetCrystalsChakraByChakraData, GetCrystalsChakraByChakraErrors, GetCrystalsChakraByChakraResponses, GetCrystalsColorsData, GetCrystalsColorsErrors, GetCrystalsColorsResponses, GetCrystalsData, GetCrystalsElementByElementData, GetCrystalsElementByElementErrors, GetCrystalsElementByElementResponses, GetCrystalsErrors, GetCrystalsPairingsByIdData, GetCrystalsPairingsByIdErrors, GetCrystalsPairingsByIdResponses, GetCrystalsPlanetsData, GetCrystalsPlanetsErrors, GetCrystalsPlanetsResponses, GetCrystalsRandomData, GetCrystalsRandomErrors, GetCrystalsRandomResponses, GetCrystalsResponses, GetCrystalsSearchData, GetCrystalsSearchErrors, GetCrystalsSearchResponses, GetCrystalsZodiacBySignData, GetCrystalsZodiacBySignErrors, GetCrystalsZodiacBySignResponses, GetDreamsSymbolsByIdData, GetDreamsSymbolsByIdErrors, GetDreamsSymbolsByIdResponses, GetDreamsSymbolsData, GetDreamsSymbolsErrors, GetDreamsSymbolsLettersData, GetDreamsSymbolsLettersErrors, GetDreamsSymbolsLettersResponses, GetDreamsSymbolsRandomData, GetDreamsSymbolsRandomErrors, GetDreamsSymbolsRandomResponses, GetDreamsSymbolsResponses, GetHumanDesignCentersByIdData, GetHumanDesignCentersByIdErrors, GetHumanDesignCentersByIdResponses, GetHumanDesignGatesByNumberData, GetHumanDesignGatesByNumberErrors, GetHumanDesignGatesByNumberResponses, GetIchingCastData, GetIchingCastErrors, GetIchingCastResponses, GetIchingHexagramsByNumberData, GetIchingHexagramsByNumberErrors, GetIchingHexagramsByNumberResponses, GetIchingHexagramsData, GetIchingHexagramsErrors, GetIchingHexagramsLookupData, GetIchingHexagramsLookupErrors, GetIchingHexagramsLookupResponses, GetIchingHexagramsRandomData, GetIchingHexagramsRandomErrors, GetIchingHexagramsRandomResponses, GetIchingHexagramsResponses, GetIchingTrigramsByIdData, GetIchingTrigramsByIdErrors, GetIchingTrigramsByIdResponses, GetIchingTrigramsData, GetIchingTrigramsErrors, GetIchingTrigramsResponses, GetLanguagesData, GetLanguagesErrors, GetLanguagesResponses, GetLocationCountriesByIso2Data, GetLocationCountriesByIso2Errors, GetLocationCountriesByIso2Responses, GetLocationCountriesData, GetLocationCountriesErrors, GetLocationCountriesResponses, GetLocationSearchData, GetLocationSearchErrors, GetLocationSearchResponses, GetNumerologyMeaningsByNumberData, GetNumerologyMeaningsByNumberErrors, GetNumerologyMeaningsByNumberResponses, GetTarotCardsByIdData, GetTarotCardsByIdErrors, GetTarotCardsByIdResponses, GetTarotCardsData, GetTarotCardsErrors, GetTarotCardsResponses, GetUsageData, GetUsageErrors, GetUsageResponses, GetVedicAstrologyKpAyanamsaData, GetVedicAstrologyKpAyanamsaErrors, GetVedicAstrologyKpAyanamsaResponses, GetVedicAstrologyNakshatrasByIdData, GetVedicAstrologyNakshatrasByIdErrors, GetVedicAstrologyNakshatrasByIdResponses, GetVedicAstrologyNakshatrasData, GetVedicAstrologyNakshatrasErrors, GetVedicAstrologyNakshatrasResponses, GetVedicAstrologyRashisByIdData, GetVedicAstrologyRashisByIdErrors, GetVedicAstrologyRashisByIdResponses, GetVedicAstrologyRashisData, GetVedicAstrologyRashisErrors, GetVedicAstrologyRashisResponses, GetVedicAstrologyYogaByIdData, GetVedicAstrologyYogaByIdErrors, GetVedicAstrologyYogaByIdResponses, GetVedicAstrologyYogaData, GetVedicAstrologyYogaErrors, GetVedicAstrologyYogaResponses, PostAngelNumbersDailyData, PostAngelNumbersDailyErrors, PostAngelNumbersDailyResponses, PostAstrologyAspectPatternsData, PostAstrologyAspectPatternsErrors, PostAstrologyAspectPatternsResponses, PostAstrologyAspectsData, PostAstrologyAspectsErrors, PostAstrologyAspectsResponses, PostAstrologyCompatibilityScoreData, PostAstrologyCompatibilityScoreErrors, PostAstrologyCompatibilityScoreResponses, PostAstrologyCompositeChartData, PostAstrologyCompositeChartErrors, PostAstrologyCompositeChartResponses, PostAstrologyHousesData, PostAstrologyHousesErrors, PostAstrologyHousesResponses, PostAstrologyLunarReturnData, PostAstrologyLunarReturnErrors, PostAstrologyLunarReturnResponses, PostAstrologyNatalChartData, PostAstrologyNatalChartErrors, PostAstrologyNatalChartResponses, PostAstrologyPlanetaryReturnsData, PostAstrologyPlanetaryReturnsErrors, PostAstrologyPlanetaryReturnsResponses, PostAstrologyPlanetsData, PostAstrologyPlanetsErrors, PostAstrologyPlanetsResponses, PostAstrologySolarReturnData, PostAstrologySolarReturnErrors, PostAstrologySolarReturnResponses, PostAstrologySynastryData, PostAstrologySynastryErrors, PostAstrologySynastryResponses, PostAstrologyTransitAspectsData, PostAstrologyTransitAspectsErrors, PostAstrologyTransitAspectsResponses, PostAstrologyTransitsData, PostAstrologyTransitsErrors, PostAstrologyTransitsResponses, PostBiorhythmCompatibilityData, PostBiorhythmCompatibilityErrors, PostBiorhythmCompatibilityResponses, PostBiorhythmCriticalDaysData, PostBiorhythmCriticalDaysErrors, PostBiorhythmCriticalDaysResponses, PostBiorhythmDailyData, PostBiorhythmDailyErrors, PostBiorhythmDailyResponses, PostBiorhythmForecastData, PostBiorhythmForecastErrors, PostBiorhythmForecastResponses, PostBiorhythmPhasesData, PostBiorhythmPhasesErrors, PostBiorhythmPhasesResponses, PostBiorhythmReadingData, PostBiorhythmReadingErrors, PostBiorhythmReadingResponses, PostCrystalsDailyData, PostCrystalsDailyErrors, PostCrystalsDailyResponses, PostDreamsDailyData, PostDreamsDailyErrors, PostDreamsDailyResponses, PostForecastDigestData, PostForecastDigestErrors, PostForecastDigestResponses, PostForecastSignificantDatesData, PostForecastSignificantDatesErrors, PostForecastSignificantDatesResponses, PostForecastSolarReturnData, PostForecastSolarReturnErrors, PostForecastSolarReturnResponses, PostForecastTimelineData, PostForecastTimelineErrors, PostForecastTimelineResponses, PostForecastTransitsData, PostForecastTransitsErrors, PostForecastTransitsResponses, PostHumanDesignBodygraphData, PostHumanDesignBodygraphErrors, PostHumanDesignBodygraphResponses, PostHumanDesignCentersData, PostHumanDesignCentersErrors, PostHumanDesignCentersResponses, PostHumanDesignChannelsData, PostHumanDesignChannelsErrors, PostHumanDesignChannelsResponses, PostHumanDesignConnectionData, PostHumanDesignConnectionErrors, PostHumanDesignConnectionResponses, PostHumanDesignGatesData, PostHumanDesignGatesErrors, PostHumanDesignGatesResponses, PostHumanDesignPentaData, PostHumanDesignPentaErrors, PostHumanDesignPentaResponses, PostHumanDesignProfileData, PostHumanDesignProfileErrors, PostHumanDesignProfileResponses, PostHumanDesignTransitData, PostHumanDesignTransitErrors, PostHumanDesignTransitResponses, PostHumanDesignTypeData, PostHumanDesignTypeErrors, PostHumanDesignTypeResponses, PostHumanDesignVariablesData, PostHumanDesignVariablesErrors, PostHumanDesignVariablesResponses, PostIchingDailyCastData, PostIchingDailyCastErrors, PostIchingDailyCastResponses, PostIchingDailyData, PostIchingDailyErrors, PostIchingDailyResponses, PostNumerologyBirthDayData, PostNumerologyBirthDayErrors, PostNumerologyBirthDayResponses, PostNumerologyBridgeData, PostNumerologyBridgeErrors, PostNumerologyBridgeResponses, PostNumerologyChartData, PostNumerologyChartErrors, PostNumerologyChartResponses, PostNumerologyCompatibilityData, PostNumerologyCompatibilityErrors, PostNumerologyCompatibilityResponses, PostNumerologyDailyData, PostNumerologyDailyErrors, PostNumerologyDailyResponses, PostNumerologyExpressionData, PostNumerologyExpressionErrors, PostNumerologyExpressionResponses, PostNumerologyKarmicDebtData, PostNumerologyKarmicDebtErrors, PostNumerologyKarmicDebtResponses, PostNumerologyKarmicLessonsData, PostNumerologyKarmicLessonsErrors, PostNumerologyKarmicLessonsResponses, PostNumerologyLifePathData, PostNumerologyLifePathErrors, PostNumerologyLifePathResponses, PostNumerologyMaturityData, PostNumerologyMaturityErrors, PostNumerologyMaturityResponses, PostNumerologyPersonalDayData, PostNumerologyPersonalDayErrors, PostNumerologyPersonalDayResponses, PostNumerologyPersonalityData, PostNumerologyPersonalityErrors, PostNumerologyPersonalityResponses, PostNumerologyPersonalMonthData, PostNumerologyPersonalMonthErrors, PostNumerologyPersonalMonthResponses, PostNumerologyPersonalYearData, PostNumerologyPersonalYearErrors, PostNumerologyPersonalYearResponses, PostNumerologySoulUrgeData, PostNumerologySoulUrgeErrors, PostNumerologySoulUrgeResponses, PostTarotDailyData, PostTarotDailyErrors, PostTarotDailyResponses, PostTarotDrawData, PostTarotDrawErrors, PostTarotDrawResponses, PostTarotSpreadsCareerData, PostTarotSpreadsCareerErrors, PostTarotSpreadsCareerResponses, PostTarotSpreadsCelticCrossData, PostTarotSpreadsCelticCrossErrors, PostTarotSpreadsCelticCrossResponses, PostTarotSpreadsCustomData, PostTarotSpreadsCustomErrors, PostTarotSpreadsCustomResponses, PostTarotSpreadsLoveData, PostTarotSpreadsLoveErrors, PostTarotSpreadsLoveResponses, PostTarotSpreadsThreeCardData, PostTarotSpreadsThreeCardErrors, PostTarotSpreadsThreeCardResponses, PostTarotYesNoData, PostTarotYesNoErrors, PostTarotYesNoResponses, PostVedicAstrologyAshtakavargaData, PostVedicAstrologyAshtakavargaErrors, PostVedicAstrologyAshtakavargaResponses, PostVedicAstrologyAspectsData, PostVedicAstrologyAspectsErrors, PostVedicAstrologyAspectsLunarData, PostVedicAstrologyAspectsLunarErrors, PostVedicAstrologyAspectsLunarResponses, PostVedicAstrologyAspectsMonthlyData, PostVedicAstrologyAspectsMonthlyErrors, PostVedicAstrologyAspectsMonthlyResponses, PostVedicAstrologyAspectsResponses, PostVedicAstrologyBirthChartData, PostVedicAstrologyBirthChartErrors, PostVedicAstrologyBirthChartResponses, PostVedicAstrologyCompatibilityData, PostVedicAstrologyCompatibilityErrors, PostVedicAstrologyCompatibilityResponses, PostVedicAstrologyDashaCurrentData, PostVedicAstrologyDashaCurrentErrors, PostVedicAstrologyDashaCurrentResponses, PostVedicAstrologyDashaMajorData, PostVedicAstrologyDashaMajorErrors, PostVedicAstrologyDashaMajorResponses, PostVedicAstrologyDashaSubByMahadashaData, PostVedicAstrologyDashaSubByMahadashaErrors, PostVedicAstrologyDashaSubByMahadashaResponses, PostVedicAstrologyDivisionalChartData, PostVedicAstrologyDivisionalChartErrors, PostVedicAstrologyDivisionalChartResponses, PostVedicAstrologyDoshaKalsarpaData, PostVedicAstrologyDoshaKalsarpaErrors, PostVedicAstrologyDoshaKalsarpaResponses, PostVedicAstrologyDoshaManglikData, PostVedicAstrologyDoshaManglikErrors, PostVedicAstrologyDoshaManglikResponses, PostVedicAstrologyDoshaSadhesatiData, PostVedicAstrologyDoshaSadhesatiErrors, PostVedicAstrologyDoshaSadhesatiResponses, PostVedicAstrologyEclipticCrossingsData, PostVedicAstrologyEclipticCrossingsErrors, PostVedicAstrologyEclipticCrossingsResponses, PostVedicAstrologyKpChartData, PostVedicAstrologyKpChartErrors, PostVedicAstrologyKpChartResponses, PostVedicAstrologyKpCuspsData, PostVedicAstrologyKpCuspsErrors, PostVedicAstrologyKpCuspsResponses, PostVedicAstrologyKpPlanetsData, PostVedicAstrologyKpPlanetsErrors, PostVedicAstrologyKpPlanetsIntervalData, PostVedicAstrologyKpPlanetsIntervalErrors, PostVedicAstrologyKpPlanetsIntervalResponses, PostVedicAstrologyKpPlanetsResponses, PostVedicAstrologyKpRasiChangesData, PostVedicAstrologyKpRasiChangesErrors, PostVedicAstrologyKpRasiChangesResponses, PostVedicAstrologyKpRulingPlanetsData, PostVedicAstrologyKpRulingPlanetsErrors, PostVedicAstrologyKpRulingPlanetsIntervalData, PostVedicAstrologyKpRulingPlanetsIntervalErrors, PostVedicAstrologyKpRulingPlanetsIntervalResponses, PostVedicAstrologyKpRulingPlanetsResponses, PostVedicAstrologyKpSublordChangesData, PostVedicAstrologyKpSublordChangesErrors, PostVedicAstrologyKpSublordChangesResponses, PostVedicAstrologyNavamsaData, PostVedicAstrologyNavamsaErrors, PostVedicAstrologyNavamsaResponses, PostVedicAstrologyPanchangBasicData, PostVedicAstrologyPanchangBasicErrors, PostVedicAstrologyPanchangBasicResponses, PostVedicAstrologyPanchangChoghadiyaData, PostVedicAstrologyPanchangChoghadiyaErrors, PostVedicAstrologyPanchangChoghadiyaResponses, PostVedicAstrologyPanchangDetailedData, PostVedicAstrologyPanchangDetailedErrors, PostVedicAstrologyPanchangDetailedResponses, PostVedicAstrologyPanchangHoraData, PostVedicAstrologyPanchangHoraErrors, PostVedicAstrologyPanchangHoraResponses, PostVedicAstrologyParallelsData, PostVedicAstrologyParallelsErrors, PostVedicAstrologyParallelsMonthlyData, PostVedicAstrologyParallelsMonthlyErrors, PostVedicAstrologyParallelsMonthlyResponses, PostVedicAstrologyParallelsResponses, PostVedicAstrologyPlanetaryPositionsData, PostVedicAstrologyPlanetaryPositionsErrors, PostVedicAstrologyPlanetaryPositionsMonthlyData, PostVedicAstrologyPlanetaryPositionsMonthlyErrors, PostVedicAstrologyPlanetaryPositionsMonthlyResponses, PostVedicAstrologyPlanetaryPositionsResponses, PostVedicAstrologyShadbalaData, PostVedicAstrologyShadbalaErrors, PostVedicAstrologyShadbalaResponses, PostVedicAstrologyTransitData, PostVedicAstrologyTransitErrors, PostVedicAstrologyTransitMonthlyData, PostVedicAstrologyTransitMonthlyErrors, PostVedicAstrologyTransitMonthlyResponses, PostVedicAstrologyTransitResponses, PostVedicAstrologyUpagrahaData, PostVedicAstrologyUpagrahaErrors, PostVedicAstrologyUpagrahaResponses, PostVedicAstrologyYogaDetectData, PostVedicAstrologyYogaDetectErrors, PostVedicAstrologyYogaDetectResponses } from './types.gen';
6
6
 
7
- export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean> = Options2<TData, ThrowOnError> & {
7
+ export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean, TResponse = unknown> = Options2<TData, ThrowOnError, TResponse> & {
8
8
  /**
9
9
  * You can provide a client instance returned by `createClient()` instead of
10
10
  * individual options. This might be also useful if you want to implement a
@@ -1740,7 +1740,7 @@ export class Forecast extends HeyApiClient {
1740
1740
  /**
1741
1741
  * Cross-domain forecast timeline - Transits, ingresses, stations, dasha changes, critical days
1742
1742
  *
1743
- * Build one time-ordered forecast for a single birth subject by merging upcoming events across three domains: western transit-to-natal aspects, sign ingresses, and retrograde stations; vedic Vimshottari mahadasha and antardasha boundaries; and biorhythm critical days. The window is clamped to 90 days and events are capped and scored by significance. Built for what-is-coming dashboards, daily and weekly forecast feeds, and timing tools.
1743
+ * Build one time-ordered forecast for a single birth subject by merging upcoming events across three domains: western transit-to-natal aspects, sign ingresses, retrograde stations, eclipses, and new and full moons; biorhythm critical days; and vedic Vimshottari mahadasha, antardasha, and pratyantardasha boundaries. The window is clamped to 90 days and events are capped and scored by significance. Built for what-is-coming dashboards, daily and weekly forecast feeds, and timing tools.
1744
1744
  */
1745
1745
  public generateTimeline<ThrowOnError extends boolean = false>(options?: Options<PostForecastTimelineData, ThrowOnError>) {
1746
1746
  return (options?.client ?? this.client).post<PostForecastTimelineResponses, PostForecastTimelineErrors, ThrowOnError>({
@@ -1755,9 +1755,9 @@ export class Forecast extends HeyApiClient {
1755
1755
  }
1756
1756
 
1757
1757
  /**
1758
- * Western transit forecast - Transit aspects, sign ingresses, retrograde stations
1758
+ * Western astrology forecast - aspects, ingresses, stations, eclipses, moon phases
1759
1759
  *
1760
- * Forecast the western astrology events for a single birth chart over a window up to 90 days: every transit-to-natal major aspect refined to its exact instant, every transiting planet sign ingress, and every retrograde or direct station. Returns a time-ordered, significance-scored timeline. Built for astrology forecast feeds, transit alerts, and timing tools.
1760
+ * Forecast the western astrology events for a single birth chart over a window up to 90 days: every transit-to-natal major aspect refined to its exact instant, every transiting planet sign ingress, every retrograde or direct station, every solar and lunar eclipse, and every New and Full Moon. Returns a time-ordered, significance-scored timeline. Built for astrology forecast feeds, transit alerts, and timing tools.
1761
1761
  */
1762
1762
  public forecastTransits<ThrowOnError extends boolean = false>(options?: Options<PostForecastTransitsData, ThrowOnError>) {
1763
1763
  return (options?.client ?? this.client).post<PostForecastTransitsResponses, PostForecastTransitsErrors, ThrowOnError>({
@@ -1810,7 +1810,7 @@ export class Forecast extends HeyApiClient {
1810
1810
  *
1811
1811
  * Cast the solar return chart for one subject and year: the chart erected for the exact moment the transiting Sun returns to its natal ecliptic longitude, the foundational technique for annual astrological forecasting. Returns the full tropical chart with planetary positions, house cusps, aspects, Ascendant, and Midheaven. Location-sensitive: pass the birthplace to anchor the chart to natal geography, or the current city for a relocated solar return where the houses and Ascendant shift to where you are on your birthday. Built for year-ahead forecast tools, birthday charts, and annual horoscope features.
1812
1812
  */
1813
- public generateSolarReturn<ThrowOnError extends boolean = false>(options?: Options<PostForecastSolarReturnData, ThrowOnError>) {
1813
+ public forecastSolarReturn<ThrowOnError extends boolean = false>(options?: Options<PostForecastSolarReturnData, ThrowOnError>) {
1814
1814
  return (options?.client ?? this.client).post<PostForecastSolarReturnResponses, PostForecastSolarReturnErrors, ThrowOnError>({
1815
1815
  security: [{ name: 'X-API-Key', type: 'apiKey' }],
1816
1816
  url: '/forecast/solar-return',