Skip to content

Commit 4687abd

Browse files
committed
Simplify types and fix intelligence
1 parent c61499c commit 4687abd

4 files changed

Lines changed: 37 additions & 41 deletions

File tree

mod.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ export type {
1313
AllowArbitraryParams,
1414
BaseParameters,
1515
BaseResponse,
16-
EngineName,
1716
EngineParameters,
1817
GetBySearchIdParameters,
1918
Location,

src/serpapi.ts

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1+
import { EngineMap } from "./engines/engine_map.ts";
12
import { InvalidArgumentTypesError } from "./errors.ts";
23
import {
34
AccountApiParameters,
45
AccountInformation,
5-
AllowArbitraryParams,
66
BaseResponse,
7-
EngineName,
87
EngineParameters,
98
GetBySearchIdParameters,
109
Locations,
@@ -71,16 +70,16 @@ const SEARCH_ARCHIVE_PATH = `/searches`;
7170
* });
7271
*/
7372
export function getJson<
74-
E extends EngineName = EngineName,
75-
P1 extends AllowArbitraryParams<EngineParameters<E>> = EngineParameters<E>,
76-
P2 extends AllowArbitraryParams<EngineParameters<E, false>> =
77-
EngineParameters<E, false>,
73+
E extends keyof EngineMap,
7874
>(
7975
...args:
80-
| [parameters: P1, callback?: (json: BaseResponse<E>) => void]
8176
| [
82-
engine: string, // intentionally kept as a string to support arbitrary params
83-
parameters: P2,
77+
parameters: EngineParameters<E>,
78+
callback?: (json: BaseResponse<E>) => void,
79+
]
80+
| [
81+
engine: E | string,
82+
parameters: EngineParameters<E, false>,
8483
callback?: (json: BaseResponse<E>) => void,
8584
]
8685
): Promise<BaseResponse<E>> {
@@ -89,7 +88,7 @@ export function getJson<
8988
typeof args[1] === "object"
9089
) {
9190
const [engine, parameters, callback] = args;
92-
const newParameters = { engine, ...parameters } as P1;
91+
const newParameters = { ...parameters, engine } as EngineParameters<E>;
9392
return _getJson(newParameters, callback);
9493
} else if (
9594
typeof args[0] === "object" &&
@@ -103,10 +102,9 @@ export function getJson<
103102
}
104103

105104
async function _getJson<
106-
E extends EngineName = EngineName,
107-
P extends AllowArbitraryParams<EngineParameters<E>> = EngineParameters<E>,
105+
E extends keyof EngineMap,
108106
>(
109-
parameters: P,
107+
parameters: EngineParameters<E>,
110108
callback?: (json: BaseResponse<E>) => void,
111109
): Promise<BaseResponse<E>> {
112110
const key = validateApiKey(parameters.api_key, true);
@@ -156,16 +154,16 @@ async function _getJson<
156154
* getHtml({ engine: "google", api_key: API_KEY, q: "coffee" }, console.log);
157155
*/
158156
export function getHtml<
159-
E extends EngineName = EngineName,
160-
P1 extends AllowArbitraryParams<EngineParameters<E>> = EngineParameters<E>,
161-
P2 extends AllowArbitraryParams<EngineParameters<E, false>> =
162-
EngineParameters<E, false>,
157+
E extends keyof EngineMap,
163158
>(
164159
...args:
165-
| [parameters: P1, callback?: (html: string) => void]
166160
| [
167-
engine: string, // intentionally kept as a string to support arbitrary params
168-
parameters: P2,
161+
parameters: EngineParameters<E>,
162+
callback?: (html: string) => void,
163+
]
164+
| [
165+
engine: E | string,
166+
parameters: EngineParameters<E, false>,
169167
callback?: (html: string) => void,
170168
]
171169
): Promise<string> {
@@ -174,7 +172,7 @@ export function getHtml<
174172
typeof args[1] === "object"
175173
) {
176174
const [engine, parameters, callback] = args;
177-
const newParameters = { engine, ...parameters } as P1;
175+
const newParameters = { ...parameters, engine } as EngineParameters<E>;
178176
return _getHtml(newParameters, callback);
179177
} else if (
180178
typeof args[0] === "object" &&
@@ -188,10 +186,9 @@ export function getHtml<
188186
}
189187

190188
async function _getHtml<
191-
E extends EngineName = EngineName,
192-
P extends AllowArbitraryParams<EngineParameters<E>> = EngineParameters<E>,
189+
E extends keyof EngineMap,
193190
>(
194-
parameters: P,
191+
parameters: EngineParameters<E>,
195192
callback?: (html: string) => void,
196193
): Promise<string> {
197194
const key = validateApiKey(parameters.api_key, true);
@@ -233,7 +230,7 @@ async function _getHtml<
233230
* getJsonBySearchId(id, { api_key: API_KEY }, console.log);
234231
*/
235232
export async function getJsonBySearchId<
236-
R extends BaseResponse,
233+
R extends BaseResponse<keyof EngineMap>,
237234
>(
238235
searchId: string,
239236
parameters: GetBySearchIdParameters = {},

src/types.ts

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,19 @@ export type BaseParameters = {
4747
timeout?: number;
4848
};
4949

50-
// https://github.com/microsoft/TypeScript/issues/29729
51-
// deno-lint-ignore ban-types
52-
type AnyEngineName = string & {};
53-
export type EngineName = (keyof EngineMap) | AnyEngineName;
5450
export type EngineParameters<
55-
E extends EngineName = EngineName,
56-
W = true, // flag for whether `engine` is a required param
57-
> = {
58-
[K in E]:
59-
& (W extends true ? { engine: K } : { engine?: K })
60-
& (K extends keyof EngineMap ? EngineMap[K]["parameters"] : BaseParameters);
61-
}[E];
51+
E extends keyof EngineMap,
52+
EngineRequired = true,
53+
> =
54+
// https://github.com/microsoft/TypeScript/issues/29729
55+
// deno-lint-ignore ban-types
56+
& (EngineRequired extends true ? { engine: E | (string & {}) }
57+
// deno-lint-ignore ban-types
58+
: { engine?: E | (string & {}) })
59+
& EngineMap[E]["parameters"]
60+
& Record<string, unknown>;
6261

63-
export type BaseResponse<E extends EngineName = EngineName> = {
62+
export type BaseResponse<E extends keyof EngineMap> = {
6463
search_metadata: {
6564
id: string;
6665
status: "Queued" | "Processing" | "Success";

src/utils.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import type { EngineName, EngineParameters } from "./types.ts";
1+
import type { EngineParameters } from "./types.ts";
22
import { version } from "../version.ts";
3+
import { EngineMap } from "./engines/engine_map.ts";
34

45
type UrlParameters = Record<
56
string,
@@ -35,15 +36,15 @@ function getBaseUrl() {
3536
return "https://serpapi.com";
3637
}
3738

38-
type NextParameters<E extends EngineName = EngineName> = {
39+
type NextParameters<E extends keyof EngineMap> = {
3940
[
4041
K in keyof Omit<
4142
EngineParameters<E>,
4243
"api_key" | "no_cache" | "async" | "timeout"
4344
>
4445
]: string;
4546
};
46-
export function extractNextParameters<E extends EngineName = EngineName>(json: {
47+
export function extractNextParameters<E extends keyof EngineMap>(json: {
4748
serpapi_pagination?: { next: string };
4849
pagination?: { next: string };
4950
}) {

0 commit comments

Comments
 (0)