googlemaps-kit 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -2
- package/dist/books.d.ts +30 -0
- package/dist/books.d.ts.map +1 -0
- package/dist/books.js +77 -0
- package/dist/books.js.map +1 -0
- package/dist/client/http-client.d.ts +3 -1
- package/dist/client/http-client.d.ts.map +1 -1
- package/dist/client/http-client.js +14 -3
- package/dist/client/http-client.js.map +1 -1
- package/dist/client/namespaces.d.ts +1 -4
- package/dist/client/namespaces.d.ts.map +1 -1
- package/dist/client/namespaces.js +1 -5
- package/dist/client/namespaces.js.map +1 -1
- package/dist/finance/client.d.ts +19 -0
- package/dist/finance/client.d.ts.map +1 -0
- package/dist/finance/client.js +75 -0
- package/dist/finance/client.js.map +1 -0
- package/dist/finance/parsers.d.ts +13 -0
- package/dist/finance/parsers.d.ts.map +1 -0
- package/dist/finance/parsers.js +146 -0
- package/dist/finance/parsers.js.map +1 -0
- package/dist/finance/types.d.ts +76 -0
- package/dist/finance/types.d.ts.map +1 -0
- package/dist/finance/types.js +2 -0
- package/dist/finance/types.js.map +1 -0
- package/dist/finance.d.ts +5 -0
- package/dist/finance.d.ts.map +1 -0
- package/dist/finance.js +4 -0
- package/dist/finance.js.map +1 -0
- package/dist/flights/client.d.ts +9 -0
- package/dist/flights/client.d.ts.map +1 -0
- package/dist/flights/client.js +14 -0
- package/dist/flights/client.js.map +1 -0
- package/dist/flights/parsers.d.ts +11 -0
- package/dist/flights/parsers.d.ts.map +1 -0
- package/dist/flights/parsers.js +64 -0
- package/dist/flights/parsers.js.map +1 -0
- package/dist/flights/types.d.ts +52 -0
- package/dist/flights/types.d.ts.map +1 -0
- package/dist/flights/types.js +2 -0
- package/dist/flights/types.js.map +1 -0
- package/dist/flights.d.ts +5 -0
- package/dist/flights.d.ts.map +1 -0
- package/dist/flights.js +4 -0
- package/dist/flights.js.map +1 -0
- package/dist/gemini-web/client.d.ts +16 -0
- package/dist/gemini-web/client.d.ts.map +1 -0
- package/dist/gemini-web/client.js +110 -0
- package/dist/gemini-web/client.js.map +1 -0
- package/dist/gemini-web/parsers.d.ts +5 -0
- package/dist/gemini-web/parsers.d.ts.map +1 -0
- package/dist/gemini-web/parsers.js +62 -0
- package/dist/gemini-web/parsers.js.map +1 -0
- package/dist/gemini-web/types.d.ts +47 -0
- package/dist/gemini-web/types.d.ts.map +1 -0
- package/dist/gemini-web/types.js +2 -0
- package/dist/gemini-web/types.js.map +1 -0
- package/dist/gemini-web.d.ts +5 -0
- package/dist/gemini-web.d.ts.map +1 -0
- package/dist/gemini-web.js +4 -0
- package/dist/gemini-web.js.map +1 -0
- package/dist/google-search/client.d.ts +16 -0
- package/dist/google-search/client.d.ts.map +1 -0
- package/dist/google-search/client.js +117 -0
- package/dist/google-search/client.js.map +1 -0
- package/dist/google-search/errors.d.ts +8 -0
- package/dist/google-search/errors.d.ts.map +1 -0
- package/dist/google-search/errors.js +13 -0
- package/dist/google-search/errors.js.map +1 -0
- package/dist/google-search/html.d.ts +12 -0
- package/dist/google-search/html.d.ts.map +1 -0
- package/dist/google-search/html.js +135 -0
- package/dist/google-search/html.js.map +1 -0
- package/dist/google-search/parsers.d.ts +6 -0
- package/dist/google-search/parsers.d.ts.map +1 -0
- package/dist/google-search/parsers.js +177 -0
- package/dist/google-search/parsers.js.map +1 -0
- package/dist/google-search/types.d.ts +66 -0
- package/dist/google-search/types.d.ts.map +1 -0
- package/dist/google-search/types.js +2 -0
- package/dist/google-search/types.js.map +1 -0
- package/dist/google-search.d.ts +6 -0
- package/dist/google-search.d.ts.map +1 -0
- package/dist/google-search.js +4 -0
- package/dist/google-search.js.map +1 -0
- package/dist/hotels/client.d.ts +9 -0
- package/dist/hotels/client.d.ts.map +1 -0
- package/dist/hotels/client.js +14 -0
- package/dist/hotels/client.js.map +1 -0
- package/dist/hotels/parsers.d.ts +7 -0
- package/dist/hotels/parsers.d.ts.map +1 -0
- package/dist/hotels/parsers.js +74 -0
- package/dist/hotels/parsers.js.map +1 -0
- package/dist/hotels/types.d.ts +55 -0
- package/dist/hotels/types.d.ts.map +1 -0
- package/dist/hotels/types.js +2 -0
- package/dist/hotels/types.js.map +1 -0
- package/dist/hotels.d.ts +4 -0
- package/dist/hotels.d.ts.map +1 -0
- package/dist/hotels.js +3 -0
- package/dist/hotels.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/known-surfaces.d.ts +0 -6
- package/dist/known-surfaces.d.ts.map +1 -1
- package/dist/known-surfaces.js +0 -6
- package/dist/known-surfaces.js.map +1 -1
- package/dist/lens/client.d.ts +14 -0
- package/dist/lens/client.d.ts.map +1 -0
- package/dist/lens/client.js +116 -0
- package/dist/lens/client.js.map +1 -0
- package/dist/lens/errors.d.ts +8 -0
- package/dist/lens/errors.d.ts.map +1 -0
- package/dist/lens/errors.js +13 -0
- package/dist/lens/errors.js.map +1 -0
- package/dist/lens/types.d.ts +27 -0
- package/dist/lens/types.d.ts.map +1 -0
- package/dist/lens/types.js +2 -0
- package/dist/lens/types.js.map +1 -0
- package/dist/lens.d.ts +8 -0
- package/dist/lens.d.ts.map +1 -0
- package/dist/lens.js +5 -0
- package/dist/lens.js.map +1 -0
- package/dist/news.d.ts +46 -0
- package/dist/news.d.ts.map +1 -0
- package/dist/news.js +202 -0
- package/dist/news.js.map +1 -0
- package/dist/pagespeed/client.d.ts +28 -0
- package/dist/pagespeed/client.d.ts.map +1 -0
- package/dist/pagespeed/client.js +222 -0
- package/dist/pagespeed/client.js.map +1 -0
- package/dist/pagespeed/errors.d.ts +9 -0
- package/dist/pagespeed/errors.d.ts.map +1 -0
- package/dist/pagespeed/errors.js +15 -0
- package/dist/pagespeed/errors.js.map +1 -0
- package/dist/pagespeed/parsers.d.ts +7 -0
- package/dist/pagespeed/parsers.d.ts.map +1 -0
- package/dist/pagespeed/parsers.js +236 -0
- package/dist/pagespeed/parsers.js.map +1 -0
- package/dist/pagespeed/types.d.ts +156 -0
- package/dist/pagespeed/types.d.ts.map +1 -0
- package/dist/pagespeed/types.js +2 -0
- package/dist/pagespeed/types.js.map +1 -0
- package/dist/pagespeed/wire.d.ts +10 -0
- package/dist/pagespeed/wire.d.ts.map +1 -0
- package/dist/pagespeed/wire.js +96 -0
- package/dist/pagespeed/wire.js.map +1 -0
- package/dist/pagespeed.d.ts +6 -0
- package/dist/pagespeed.d.ts.map +1 -0
- package/dist/pagespeed.js +4 -0
- package/dist/pagespeed.js.map +1 -0
- package/dist/platform/catalog.d.ts.map +1 -1
- package/dist/platform/catalog.js +0 -9
- package/dist/platform/catalog.js.map +1 -1
- package/dist/services/environment/air-quality.d.ts.map +1 -1
- package/dist/services/environment/air-quality.js +3 -7
- package/dist/services/environment/air-quality.js.map +1 -1
- package/dist/services/environment/weather.d.ts +4 -1
- package/dist/services/environment/weather.d.ts.map +1 -1
- package/dist/services/environment/weather.js +12 -3
- package/dist/services/environment/weather.js.map +1 -1
- package/dist/services/reviews.d.ts.map +1 -1
- package/dist/services/reviews.js +4 -1
- package/dist/services/reviews.js.map +1 -1
- package/dist/translate.d.ts +75 -0
- package/dist/translate.d.ts.map +1 -0
- package/dist/translate.js +126 -0
- package/dist/translate.js.map +1 -0
- package/dist/travel-google/common.d.ts +24 -0
- package/dist/travel-google/common.d.ts.map +1 -0
- package/dist/travel-google/common.js +72 -0
- package/dist/travel-google/common.js.map +1 -0
- package/dist/trends/client.d.ts +17 -0
- package/dist/trends/client.d.ts.map +1 -0
- package/dist/trends/client.js +86 -0
- package/dist/trends/client.js.map +1 -0
- package/dist/trends/errors.d.ts +8 -0
- package/dist/trends/errors.d.ts.map +1 -0
- package/dist/trends/errors.js +13 -0
- package/dist/trends/errors.js.map +1 -0
- package/dist/trends/links.d.ts +8 -0
- package/dist/trends/links.d.ts.map +1 -0
- package/dist/trends/links.js +71 -0
- package/dist/trends/links.js.map +1 -0
- package/dist/trends/parsers.d.ts +5 -0
- package/dist/trends/parsers.d.ts.map +1 -0
- package/dist/trends/parsers.js +126 -0
- package/dist/trends/parsers.js.map +1 -0
- package/dist/trends/types.d.ts +71 -0
- package/dist/trends/types.d.ts.map +1 -0
- package/dist/trends/types.js +2 -0
- package/dist/trends/types.js.map +1 -0
- package/dist/trends.d.ts +9 -0
- package/dist/trends.d.ts.map +1 -0
- package/dist/trends.js +8 -0
- package/dist/trends.js.map +1 -0
- package/dist/types/common.d.ts +0 -2
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/common.js.map +1 -1
- package/dist/utils/google-web.d.ts +24 -0
- package/dist/utils/google-web.d.ts.map +1 -0
- package/dist/utils/google-web.js +150 -0
- package/dist/utils/google-web.js.map +1 -0
- package/dist/youtube/client.d.ts +19 -0
- package/dist/youtube/client.d.ts.map +1 -0
- package/dist/youtube/client.js +115 -0
- package/dist/youtube/client.js.map +1 -0
- package/dist/youtube/errors.d.ts +8 -0
- package/dist/youtube/errors.d.ts.map +1 -0
- package/dist/youtube/errors.js +13 -0
- package/dist/youtube/errors.js.map +1 -0
- package/dist/youtube/parsers.d.ts +9 -0
- package/dist/youtube/parsers.d.ts.map +1 -0
- package/dist/youtube/parsers.js +213 -0
- package/dist/youtube/parsers.js.map +1 -0
- package/dist/youtube/types.d.ts +90 -0
- package/dist/youtube/types.d.ts.map +1 -0
- package/dist/youtube/types.js +2 -0
- package/dist/youtube/types.js.map +1 -0
- package/dist/youtube.d.ts +9 -0
- package/dist/youtube.d.ts.map +1 -0
- package/dist/youtube.js +6 -0
- package/dist/youtube.js.map +1 -0
- package/docs/books.md +18 -0
- package/docs/environment-research.md +65 -0
- package/docs/finance-research.md +153 -0
- package/docs/finance.md +43 -0
- package/docs/gemini-web.md +36 -0
- package/docs/google-ai-books-research.md +53 -0
- package/docs/google-media-research.md +105 -0
- package/docs/google-search-research.md +36 -0
- package/docs/google-search.md +53 -0
- package/docs/google-services-research.md +135 -0
- package/docs/google-travel-research.md +86 -0
- package/docs/internal/reverse-engineering.md +85 -0
- package/docs/lens.md +54 -0
- package/docs/maps-revalidation.md +31 -0
- package/docs/news.md +35 -0
- package/docs/pagespeed-research.md +153 -0
- package/docs/pagespeed.md +135 -0
- package/docs/reviews-research.md +33 -0
- package/docs/translate.md +78 -0
- package/docs/trends-research.md +82 -0
- package/docs/trends.md +75 -0
- package/docs/youtube.md +72 -0
- package/package.json +77 -2
- package/dist/services/aerial-view.d.ts +0 -22
- package/dist/services/aerial-view.d.ts.map +0 -1
- package/dist/services/aerial-view.js +0 -107
- package/dist/services/aerial-view.js.map +0 -1
- package/dist/types/aerial-view.d.ts +0 -39
- package/dist/types/aerial-view.d.ts.map +0 -1
- package/dist/types/aerial-view.js +0 -2
- package/dist/types/aerial-view.js.map +0 -1
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { type GoogleWebConfig, type GoogleWebRequestOptions } from './utils/google-web.js';
|
|
2
|
+
export { GoogleWebError } from './utils/google-web.js';
|
|
3
|
+
export interface TranslateConfig extends GoogleWebConfig {
|
|
4
|
+
locale?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface TranslateOptions extends GoogleWebRequestOptions {
|
|
7
|
+
from?: string;
|
|
8
|
+
to: string;
|
|
9
|
+
}
|
|
10
|
+
export interface TranslationSegment {
|
|
11
|
+
text: string;
|
|
12
|
+
originalText?: string;
|
|
13
|
+
spaceBefore: boolean;
|
|
14
|
+
raw: unknown[];
|
|
15
|
+
}
|
|
16
|
+
export interface TranslationGroup {
|
|
17
|
+
text: string;
|
|
18
|
+
segments: TranslationSegment[];
|
|
19
|
+
raw: unknown[];
|
|
20
|
+
}
|
|
21
|
+
export interface TranslationResult {
|
|
22
|
+
text: string;
|
|
23
|
+
detectedLanguage?: string;
|
|
24
|
+
targetLanguage: string;
|
|
25
|
+
groups: TranslationGroup[];
|
|
26
|
+
raw: unknown[];
|
|
27
|
+
}
|
|
28
|
+
export interface TranslationSuggestion {
|
|
29
|
+
text: string;
|
|
30
|
+
translation: string;
|
|
31
|
+
raw: unknown[];
|
|
32
|
+
}
|
|
33
|
+
export interface TranslationSuggestions {
|
|
34
|
+
suggestions: TranslationSuggestion[];
|
|
35
|
+
sourceLanguage?: string;
|
|
36
|
+
targetLanguage?: string;
|
|
37
|
+
raw: unknown[];
|
|
38
|
+
}
|
|
39
|
+
export interface TranslationSpeech {
|
|
40
|
+
audio: Uint8Array;
|
|
41
|
+
mimeType: 'audio/mpeg';
|
|
42
|
+
raw: unknown[];
|
|
43
|
+
}
|
|
44
|
+
export interface TranslateLanguage {
|
|
45
|
+
code: string;
|
|
46
|
+
name: string;
|
|
47
|
+
raw: unknown[];
|
|
48
|
+
}
|
|
49
|
+
export declare function parseTranslation(raw: unknown): TranslationResult;
|
|
50
|
+
export declare function parseTranslationSuggestions(raw: unknown): TranslationSuggestions;
|
|
51
|
+
/** Public Translate text, suggestion and speech calls, separate from Google Cloud Translation. */
|
|
52
|
+
export declare class TranslateClient {
|
|
53
|
+
private readonly fetcher;
|
|
54
|
+
private readonly timeoutMs;
|
|
55
|
+
private readonly locale;
|
|
56
|
+
private session?;
|
|
57
|
+
private requestId;
|
|
58
|
+
constructor(config?: TranslateConfig);
|
|
59
|
+
translate(text: string, options: TranslateOptions): Promise<TranslationResult>;
|
|
60
|
+
suggest(text: string, options: TranslateOptions): Promise<TranslationSuggestions>;
|
|
61
|
+
speech(text: string, options: GoogleWebRequestOptions & {
|
|
62
|
+
language: string;
|
|
63
|
+
}): Promise<TranslationSpeech>;
|
|
64
|
+
languages(options?: GoogleWebRequestOptions): Promise<{
|
|
65
|
+
languages: TranslateLanguage[];
|
|
66
|
+
raw: unknown[];
|
|
67
|
+
}>;
|
|
68
|
+
speechLanguages(options?: GoogleWebRequestOptions): Promise<{
|
|
69
|
+
languages: string[];
|
|
70
|
+
raw: unknown[];
|
|
71
|
+
}>;
|
|
72
|
+
private rpc;
|
|
73
|
+
}
|
|
74
|
+
export declare function googleTranslate(config?: TranslateConfig): TranslateClient;
|
|
75
|
+
//# sourceMappingURL=translate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translate.d.ts","sourceRoot":"","sources":["../src/translate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyG,KAAK,eAAe,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAElM,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,WAAW,eAAgB,SAAQ,eAAe;IAAG,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AAC5E,MAAM,WAAW,gBAAiB,SAAQ,uBAAuB;IAAG,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AAC/F,MAAM,WAAW,kBAAkB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,EAAE,CAAA;CAAE;AACjH,MAAM,WAAW,gBAAgB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAAC,GAAG,EAAE,OAAO,EAAE,CAAA;CAAE;AAClG,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,GAAG,EAAE,OAAO,EAAE,CAAC;CAChB;AACD,MAAM,WAAW,qBAAqB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,EAAE,CAAA;CAAE;AAC5F,MAAM,WAAW,sBAAsB;IAAG,WAAW,EAAE,qBAAqB,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,EAAE,CAAA;CAAE;AAClJ,MAAM,WAAW,iBAAiB;IAAG,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,OAAO,EAAE,CAAA;CAAE;AAChG,MAAM,WAAW,iBAAiB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,EAAE,CAAA;CAAE;AAiBjF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CAqBhE;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,CAQhF;AAED,kGAAkG;AAClG,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,OAAO,CAAC,CAAgD;IAChE,OAAO,CAAC,SAAS,CAA+C;gBAEpD,MAAM,GAAE,eAAoB;IAMlC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQ9E,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAMjF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IASzG,SAAS,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;QAAC,GAAG,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IAU7G,eAAe,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;YAUhG,GAAG;CAalB;AAED,wBAAgB,eAAe,CAAC,MAAM,GAAE,eAAoB,GAAG,eAAe,CAAwC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { googleBatchBody, googleBatchResponse, googleBootstrap, googleWebText, GoogleWebError, positiveTimeout } from './utils/google-web.js';
|
|
2
|
+
export { GoogleWebError } from './utils/google-web.js';
|
|
3
|
+
function language(value, allowAuto = false) {
|
|
4
|
+
if (typeof value !== 'string' || !/^[a-zA-Z]{2,8}(?:-[a-zA-Z0-9]{1,8})*$/.test(value) || (!allowAuto && value === 'auto'))
|
|
5
|
+
throw new TypeError('Expected a language code');
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
function textInput(value) {
|
|
9
|
+
if (typeof value !== 'string' || !value.trim())
|
|
10
|
+
throw new TypeError('Translation text must not be empty');
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
function array(value, name) {
|
|
14
|
+
if (!Array.isArray(value))
|
|
15
|
+
throw new GoogleWebError(`Malformed Translate ${name}`, 'parse');
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
export function parseTranslation(raw) {
|
|
19
|
+
const data = array(raw, 'response');
|
|
20
|
+
const translation = array(data[1], 'translation');
|
|
21
|
+
if (typeof translation[1] !== 'string')
|
|
22
|
+
throw new GoogleWebError('Translate response has no target language', 'parse');
|
|
23
|
+
const groups = array(translation[0], 'groups').map(value => {
|
|
24
|
+
const group = array(value, 'group');
|
|
25
|
+
const segments = array(group[5] ?? [], 'segments').map(item => {
|
|
26
|
+
const segment = array(item, 'segment');
|
|
27
|
+
if (typeof segment[0] !== 'string')
|
|
28
|
+
throw new GoogleWebError('Translate segment has no text', 'parse');
|
|
29
|
+
return { text: segment[0], originalText: typeof segment[6] === 'string' ? segment[6] : undefined, spaceBefore: segment[2] === true, raw: segment };
|
|
30
|
+
});
|
|
31
|
+
const text = segments.length > 0 ? segments.map(segment => `${segment.spaceBefore ? ' ' : ''}${segment.text}`).join('') : group[0];
|
|
32
|
+
if (typeof text !== 'string')
|
|
33
|
+
throw new GoogleWebError('Translate group has no text or segments', 'parse');
|
|
34
|
+
return { text, segments, raw: group };
|
|
35
|
+
});
|
|
36
|
+
if (groups.length === 0 || groups.every(group => group.text.length === 0))
|
|
37
|
+
throw new GoogleWebError('Translate response has no translated text', 'parse');
|
|
38
|
+
return {
|
|
39
|
+
text: groups.map(group => group.text).join('\n'),
|
|
40
|
+
detectedLanguage: typeof data[2] === 'string' ? data[2] : undefined,
|
|
41
|
+
targetLanguage: translation[1], groups, raw: data,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function parseTranslationSuggestions(raw) {
|
|
45
|
+
const data = array(raw, 'suggestions response');
|
|
46
|
+
const suggestions = array(data[0] ?? [], 'suggestions').map(value => {
|
|
47
|
+
const pair = array(value, 'suggestion');
|
|
48
|
+
if (typeof pair[0] !== 'string' || typeof pair[1] !== 'string')
|
|
49
|
+
throw new GoogleWebError('Malformed Translate suggestion pair', 'parse');
|
|
50
|
+
return { text: pair[0], translation: pair[1], raw: pair };
|
|
51
|
+
});
|
|
52
|
+
return { suggestions, sourceLanguage: typeof data[1] === 'string' ? data[1] : undefined, targetLanguage: typeof data[2] === 'string' ? data[2] : undefined, raw: data };
|
|
53
|
+
}
|
|
54
|
+
/** Public Translate text, suggestion and speech calls, separate from Google Cloud Translation. */
|
|
55
|
+
export class TranslateClient {
|
|
56
|
+
fetcher;
|
|
57
|
+
timeoutMs;
|
|
58
|
+
locale;
|
|
59
|
+
session;
|
|
60
|
+
requestId = Math.floor(Math.random() * 90_000) + 10_000;
|
|
61
|
+
constructor(config = {}) {
|
|
62
|
+
this.fetcher = config.fetch ?? globalThis.fetch;
|
|
63
|
+
this.timeoutMs = positiveTimeout(config.timeoutMs ?? 30_000);
|
|
64
|
+
this.locale = language(config.locale ?? 'en');
|
|
65
|
+
}
|
|
66
|
+
async translate(text, options) {
|
|
67
|
+
textInput(text);
|
|
68
|
+
const from = options.from === 'auto' || options.from === undefined ? 'auto' : language(options.from);
|
|
69
|
+
const to = language(options.to);
|
|
70
|
+
// Current TranslateWebserverUi sends engine flags 1 in request fields [0][3] and [0][5].
|
|
71
|
+
return parseTranslation(await this.rpc('MkEWBc', [[text, from, to, 1, null, 1], []], options));
|
|
72
|
+
}
|
|
73
|
+
async suggest(text, options) {
|
|
74
|
+
textInput(text);
|
|
75
|
+
const from = options.from === 'auto' || options.from === undefined ? 'auto' : language(options.from);
|
|
76
|
+
return parseTranslationSuggestions(await this.rpc('AVdN8', [text, from, language(options.to)], options));
|
|
77
|
+
}
|
|
78
|
+
async speech(text, options) {
|
|
79
|
+
textInput(text);
|
|
80
|
+
const data = array(await this.rpc('jQ1olc', [text, language(options.language), null, null, [0]], options), 'speech');
|
|
81
|
+
if (typeof data[0] !== 'string' || !data[0] || !/^[A-Za-z0-9+/]+={0,2}$/.test(data[0]) || data[0].length % 4 !== 0)
|
|
82
|
+
throw new GoogleWebError('Malformed Translate speech audio', 'parse');
|
|
83
|
+
const audio = new Uint8Array(Buffer.from(data[0], 'base64'));
|
|
84
|
+
if (audio.length < 3 || !((audio[0] === 0xff && (audio[1] & 0xe0) === 0xe0) || (audio[0] === 0x49 && audio[1] === 0x44 && audio[2] === 0x33)))
|
|
85
|
+
throw new GoogleWebError('Translate speech did not return MP3 audio', 'parse');
|
|
86
|
+
return { audio, mimeType: 'audio/mpeg', raw: data };
|
|
87
|
+
}
|
|
88
|
+
async languages(options = {}) {
|
|
89
|
+
const data = array(await this.rpc('n9wk7', [], options), 'languages response');
|
|
90
|
+
const languages = array(data[0], 'languages').map(value => {
|
|
91
|
+
const row = array(value, 'language');
|
|
92
|
+
if (typeof row[0] !== 'string' || typeof row[1] !== 'string')
|
|
93
|
+
throw new GoogleWebError('Malformed Translate language', 'parse');
|
|
94
|
+
return { code: row[0], name: row[1], raw: row };
|
|
95
|
+
});
|
|
96
|
+
return { languages, raw: data };
|
|
97
|
+
}
|
|
98
|
+
async speechLanguages(options = {}) {
|
|
99
|
+
const data = array(await this.rpc('ycyxUb', [], options), 'speech languages response');
|
|
100
|
+
const languages = array(data[0], 'speech languages').map(value => {
|
|
101
|
+
const row = array(value, 'speech language');
|
|
102
|
+
if (typeof row[0] !== 'string')
|
|
103
|
+
throw new GoogleWebError('Malformed Translate speech language', 'parse');
|
|
104
|
+
return row[0];
|
|
105
|
+
});
|
|
106
|
+
return { languages, raw: data };
|
|
107
|
+
}
|
|
108
|
+
async rpc(id, args, options) {
|
|
109
|
+
if (options.signal?.aborted)
|
|
110
|
+
throw options.signal.reason;
|
|
111
|
+
if (!this.session) {
|
|
112
|
+
const url = new URL('https://translate.google.com/');
|
|
113
|
+
url.searchParams.set('hl', this.locale);
|
|
114
|
+
const bootstrap = googleBootstrap(await googleWebText(this.fetcher, url, { method: 'GET' }, this.timeoutMs, options.signal));
|
|
115
|
+
if (typeof bootstrap.cfb2h !== 'string' || typeof bootstrap.FdrFJe !== 'string')
|
|
116
|
+
throw new GoogleWebError('Translate bootstrap is missing build or session ID', 'parse');
|
|
117
|
+
this.session = { build: bootstrap.cfb2h, id: bootstrap.FdrFJe, token: typeof bootstrap.SNlM0e === 'string' ? bootstrap.SNlM0e : undefined };
|
|
118
|
+
}
|
|
119
|
+
const url = new URL('https://translate.google.com/_/TranslateWebserverUi/data/batchexecute');
|
|
120
|
+
for (const [key, value] of Object.entries({ rpcids: id, 'source-path': '/', 'f.sid': this.session.id, bl: this.session.build, hl: this.locale, _reqid: String(this.requestId += 100_000), rt: 'c' }))
|
|
121
|
+
url.searchParams.set(key, value);
|
|
122
|
+
return googleBatchResponse(await googleWebText(this.fetcher, url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }, body: googleBatchBody(id, args, this.session.token) }, this.timeoutMs, options.signal), id);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export function googleTranslate(config = {}) { return new TranslateClient(config); }
|
|
126
|
+
//# sourceMappingURL=translate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translate.js","sourceRoot":"","sources":["../src/translate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { GoogleWebConfig, GoogleWebRequestOptions } from '../utils/google-web.js';
|
|
2
|
+
export interface GoogleTravelConfig extends GoogleWebConfig {
|
|
3
|
+
currency?: string;
|
|
4
|
+
language?: string;
|
|
5
|
+
userAgent?: string;
|
|
6
|
+
}
|
|
7
|
+
export type GoogleTravelRequestOptions = GoogleWebRequestOptions;
|
|
8
|
+
export declare const array: (value: unknown) => unknown[];
|
|
9
|
+
export declare const numeric: (value: unknown) => number | undefined;
|
|
10
|
+
export declare const text: (value: unknown) => string | undefined;
|
|
11
|
+
export declare function travelDate(value: string): number[];
|
|
12
|
+
export declare function dateFromWire(value: unknown): string | undefined;
|
|
13
|
+
export declare class TravelRpc {
|
|
14
|
+
private readonly app;
|
|
15
|
+
readonly currency: string;
|
|
16
|
+
readonly language: string;
|
|
17
|
+
private readonly fetcher;
|
|
18
|
+
private readonly timeoutMs;
|
|
19
|
+
private readonly userAgent;
|
|
20
|
+
private wiz?;
|
|
21
|
+
constructor(app: 'flights' | 'hotels', config?: GoogleTravelConfig);
|
|
22
|
+
call(id: string, args: unknown[], options: GoogleTravelRequestOptions): Promise<unknown>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/travel-google/common.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEvF,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AACD,MAAM,MAAM,0BAA0B,GAAG,uBAAuB,CAAC;AACjE,eAAO,MAAM,KAAK,GAAI,OAAO,OAAO,KAAG,OAAO,EAAuC,CAAC;AACtF,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAAoF,CAAC;AACvI,eAAO,MAAM,IAAI,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAA8E,CAAC;AAE9H,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAKlD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAK/D;AAED,qBAAa,SAAS;IAQR,OAAO,CAAC,QAAQ,CAAC,GAAG;IAPhC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,GAAG,CAAC,CAA0B;gBAET,GAAG,EAAE,SAAS,GAAG,QAAQ,EAAE,MAAM,GAAE,kBAAuB;IAWjF,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,OAAO,CAAC;CAqB/F"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { GoogleWebError, googleBatchBody, googleBatchResponse, googleBootstrap, googleWebText, positiveTimeout, } from '../utils/google-web.js';
|
|
2
|
+
export const array = (value) => Array.isArray(value) ? value : [];
|
|
3
|
+
export const numeric = (value) => typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
4
|
+
export const text = (value) => typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
5
|
+
export function travelDate(value) {
|
|
6
|
+
if (typeof value !== 'string' || !/^\d{4}-\d{2}-\d{2}$/.test(value))
|
|
7
|
+
throw new TypeError('Travel dates must use YYYY-MM-DD');
|
|
8
|
+
const date = new Date(`${value}T00:00:00Z`);
|
|
9
|
+
if (!Number.isFinite(date.getTime()) || date.toISOString().slice(0, 10) !== value)
|
|
10
|
+
throw new RangeError('Invalid travel date');
|
|
11
|
+
return value.split('-').map(Number);
|
|
12
|
+
}
|
|
13
|
+
export function dateFromWire(value) {
|
|
14
|
+
const node = array(value);
|
|
15
|
+
if (node.length < 3 || !node.slice(0, 3).every(Number.isInteger))
|
|
16
|
+
return undefined;
|
|
17
|
+
const result = `${String(node[0]).padStart(4, '0')}-${String(node[1]).padStart(2, '0')}-${String(node[2]).padStart(2, '0')}`;
|
|
18
|
+
try {
|
|
19
|
+
travelDate(result);
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class TravelRpc {
|
|
27
|
+
app;
|
|
28
|
+
currency;
|
|
29
|
+
language;
|
|
30
|
+
fetcher;
|
|
31
|
+
timeoutMs;
|
|
32
|
+
userAgent;
|
|
33
|
+
wiz;
|
|
34
|
+
constructor(app, config = {}) {
|
|
35
|
+
this.app = app;
|
|
36
|
+
this.fetcher = config.fetch ?? globalThis.fetch;
|
|
37
|
+
this.timeoutMs = positiveTimeout(config.timeoutMs ?? 30_000);
|
|
38
|
+
this.currency = config.currency?.toUpperCase() ?? 'USD';
|
|
39
|
+
this.language = config.language ?? 'en';
|
|
40
|
+
if (!/^[A-Z]{3}$/.test(this.currency))
|
|
41
|
+
throw new TypeError('Travel currency must use a three-letter code');
|
|
42
|
+
if (!/^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$/.test(this.language))
|
|
43
|
+
throw new TypeError('Invalid travel language');
|
|
44
|
+
this.userAgent = config.userAgent ?? 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.0.0 Safari/537.36';
|
|
45
|
+
if (!this.userAgent.trim() || /[\r\n]/.test(this.userAgent))
|
|
46
|
+
throw new TypeError('Invalid travel user agent');
|
|
47
|
+
}
|
|
48
|
+
async call(id, args, options) {
|
|
49
|
+
const app = this.app === 'flights' ? 'FlightsFrontendUi' : 'TravelFrontendUi';
|
|
50
|
+
if (!this.wiz) {
|
|
51
|
+
const url = new URL(`https://www.google.com/travel/${this.app}`);
|
|
52
|
+
url.searchParams.set('hl', this.language);
|
|
53
|
+
url.searchParams.set('curr', this.currency);
|
|
54
|
+
const html = await googleWebText(this.fetcher, url, { headers: { 'User-Agent': this.userAgent, Accept: 'text/html' } }, this.timeoutMs, options.signal);
|
|
55
|
+
const wiz = googleBootstrap(html);
|
|
56
|
+
if (wiz.eptZe !== `/_/${app}/`)
|
|
57
|
+
throw new GoogleWebError('Google returned an unsupported travel application', 'parse');
|
|
58
|
+
this.wiz = wiz;
|
|
59
|
+
}
|
|
60
|
+
const url = new URL(`https://www.google.com/_/${app}/data/batchexecute`);
|
|
61
|
+
for (const [key, value] of Object.entries({ rpcids: id, 'source-path': this.app === 'flights' ? '/travel/flights' : '/travel/search', 'f.sid': this.wiz.FdrFJe, bl: this.wiz.cfb2h, hl: this.language, curr: this.currency, rt: 'c' })) {
|
|
62
|
+
if (value != null)
|
|
63
|
+
url.searchParams.set(key, String(value));
|
|
64
|
+
}
|
|
65
|
+
const body = await googleWebText(this.fetcher, url, {
|
|
66
|
+
method: 'POST', headers: { 'User-Agent': this.userAgent, 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', Origin: 'https://www.google.com', Referer: 'https://www.google.com/travel/' },
|
|
67
|
+
body: googleBatchBody(id, args, typeof this.wiz.SNlM0e === 'string' ? this.wiz.SNlM0e : undefined),
|
|
68
|
+
}, this.timeoutMs, options.signal);
|
|
69
|
+
return googleBatchResponse(body, id);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/travel-google/common.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { TrendsConfig, TrendsEmbedType, TrendsExploreOptions, TrendsFeed, TrendsRequestOptions, TrendsSuggestions, TrendingOptions } from './types.js';
|
|
2
|
+
/** Anonymous Trends topic suggestions and the public Trending now RSS feed. */
|
|
3
|
+
export declare class TrendsClient {
|
|
4
|
+
private readonly fetcher;
|
|
5
|
+
private readonly locale;
|
|
6
|
+
private readonly timezone;
|
|
7
|
+
private readonly timeoutMs;
|
|
8
|
+
constructor(config?: TrendsConfig);
|
|
9
|
+
/** Resolves search terms to suggested topic IDs, titles, and topic types. */
|
|
10
|
+
suggestions(keyword: string, options?: TrendsRequestOptions): Promise<TrendsSuggestions>;
|
|
11
|
+
/** Reads the public feed; approximateTraffic retains Google's bucketed display value. */
|
|
12
|
+
trending(options?: TrendingOptions): Promise<TrendsFeed>;
|
|
13
|
+
exploreUrl(options: TrendsExploreOptions): string;
|
|
14
|
+
embedUrl(type: TrendsEmbedType, options: TrendsExploreOptions): string;
|
|
15
|
+
private get;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/trends/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,UAAU,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAc5J,+EAA+E;AAC/E,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,MAAM,GAAE,YAAiB;IAOrC,6EAA6E;IACvE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAOlG,yFAAyF;IACnF,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,UAAU,CAAC;IAMlE,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM;IAIjD,QAAQ,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,oBAAoB,GAAG,MAAM;YAIxD,GAAG;CA0BlB"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { TrendsError } from './errors.js';
|
|
2
|
+
import { buildTrendsEmbedUrl, buildTrendsExploreUrl, trendsGeo, trendsTimezone } from './links.js';
|
|
3
|
+
import { parseSuggestions, parseTrendingRss, parseTrendsJson } from './parsers.js';
|
|
4
|
+
function timeout(value) {
|
|
5
|
+
if (!Number.isFinite(value) || value <= 0 || value > 2_147_483_647)
|
|
6
|
+
throw new RangeError('timeoutMs must be positive and no greater than 2147483647');
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
function retryAfter(value) {
|
|
10
|
+
if (!value)
|
|
11
|
+
return undefined;
|
|
12
|
+
if (/^\d+(?:\.\d+)?$/.test(value))
|
|
13
|
+
return Number(value) * 1000;
|
|
14
|
+
const date = Date.parse(value);
|
|
15
|
+
return Number.isFinite(date) ? Math.max(0, date - Date.now()) : undefined;
|
|
16
|
+
}
|
|
17
|
+
/** Anonymous Trends topic suggestions and the public Trending now RSS feed. */
|
|
18
|
+
export class TrendsClient {
|
|
19
|
+
fetcher;
|
|
20
|
+
locale;
|
|
21
|
+
timezone;
|
|
22
|
+
timeoutMs;
|
|
23
|
+
constructor(config = {}) {
|
|
24
|
+
this.fetcher = config.fetch ?? globalThis.fetch;
|
|
25
|
+
this.locale = config.locale ?? 'en-US';
|
|
26
|
+
this.timezone = trendsTimezone(config.timezone ?? 0);
|
|
27
|
+
this.timeoutMs = timeout(config.timeoutMs ?? 30_000);
|
|
28
|
+
}
|
|
29
|
+
/** Resolves search terms to suggested topic IDs, titles, and topic types. */
|
|
30
|
+
async suggestions(keyword, options = {}) {
|
|
31
|
+
if (typeof keyword !== 'string' || keyword.trim().length === 0)
|
|
32
|
+
throw new TypeError('keyword must be a nonempty string');
|
|
33
|
+
const url = new URL(`https://trends.google.com/trends/api/autocomplete/${encodeURIComponent(keyword)}`);
|
|
34
|
+
url.searchParams.set('hl', this.locale);
|
|
35
|
+
return parseSuggestions(parseTrendsJson(await this.get(url, options)));
|
|
36
|
+
}
|
|
37
|
+
/** Reads the public feed; approximateTraffic retains Google's bucketed display value. */
|
|
38
|
+
async trending(options = {}) {
|
|
39
|
+
const url = new URL('https://trends.google.com/trending/rss');
|
|
40
|
+
url.searchParams.set('geo', trendsGeo(options.geo ?? 'US'));
|
|
41
|
+
return parseTrendingRss(await this.get(url, options));
|
|
42
|
+
}
|
|
43
|
+
exploreUrl(options) {
|
|
44
|
+
return buildTrendsExploreUrl(options, { locale: this.locale });
|
|
45
|
+
}
|
|
46
|
+
embedUrl(type, options) {
|
|
47
|
+
return buildTrendsEmbedUrl(type, options, { locale: this.locale, timezone: this.timezone });
|
|
48
|
+
}
|
|
49
|
+
async get(url, options) {
|
|
50
|
+
if (options.signal?.aborted)
|
|
51
|
+
throw options.signal.reason ?? new DOMException('The operation was aborted', 'AbortError');
|
|
52
|
+
const controller = new AbortController();
|
|
53
|
+
const abort = () => controller.abort(options.signal?.reason ?? new DOMException('The operation was aborted', 'AbortError'));
|
|
54
|
+
options.signal?.addEventListener('abort', abort, { once: true });
|
|
55
|
+
const timer = setTimeout(() => controller.abort(new TrendsError('Google Trends request timed out', 'timeout')), this.timeoutMs);
|
|
56
|
+
timer.unref?.();
|
|
57
|
+
try {
|
|
58
|
+
const response = await this.fetcher(url.toString(), { signal: controller.signal, headers: { Accept: 'application/json, application/rss+xml, application/xml, text/xml' } });
|
|
59
|
+
const body = await response.text();
|
|
60
|
+
if (controller.signal.aborted)
|
|
61
|
+
throw controller.signal.reason;
|
|
62
|
+
if (response.status === 429)
|
|
63
|
+
throw new TrendsError('Google Trends rate limited this request', 'rate-limit', 429, retryAfter(response.headers.get('retry-after')));
|
|
64
|
+
const html = response.headers.get('content-type')?.includes('text/html') || /^\s*<!doctype html|^\s*<html/i.test(body);
|
|
65
|
+
if (html && /unusual traffic|g-recaptcha|recaptcha\/api|\/sorry\/index/i.test(body))
|
|
66
|
+
throw new TrendsError('Google Trends returned a traffic challenge', 'blocked', response.status);
|
|
67
|
+
if (!response.ok)
|
|
68
|
+
throw new TrendsError(`Google Trends returned HTTP ${response.status}`, 'http', response.status, retryAfter(response.headers.get('retry-after')));
|
|
69
|
+
if (html)
|
|
70
|
+
throw new TrendsError('Google Trends returned an HTML access page', 'blocked', response.status);
|
|
71
|
+
return body;
|
|
72
|
+
}
|
|
73
|
+
catch (cause) {
|
|
74
|
+
if (controller.signal.aborted)
|
|
75
|
+
throw controller.signal.reason;
|
|
76
|
+
if (cause instanceof TrendsError)
|
|
77
|
+
throw cause;
|
|
78
|
+
throw new TrendsError('Google Trends request failed', 'network', undefined, undefined, { cause });
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
clearTimeout(timer);
|
|
82
|
+
options.signal?.removeEventListener('abort', abort);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/trends/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type TrendsErrorKind = 'http' | 'rate-limit' | 'blocked' | 'parse' | 'timeout' | 'network';
|
|
2
|
+
export declare class TrendsError extends Error {
|
|
3
|
+
readonly kind: TrendsErrorKind;
|
|
4
|
+
readonly status?: number | undefined;
|
|
5
|
+
readonly retryAfterMs?: number | undefined;
|
|
6
|
+
constructor(message: string, kind: TrendsErrorKind, status?: number | undefined, retryAfterMs?: number | undefined, options?: ErrorOptions);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/trends/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAElG,qBAAa,WAAY,SAAQ,KAAK;IAGlC,QAAQ,CAAC,IAAI,EAAE,eAAe;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM;gBAH9B,OAAO,EAAE,MAAM,EACN,IAAI,EAAE,eAAe,EACrB,MAAM,CAAC,EAAE,MAAM,YAAA,EACf,YAAY,CAAC,EAAE,MAAM,YAAA,EAC9B,OAAO,CAAC,EAAE,YAAY;CAKzB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export class TrendsError extends Error {
|
|
2
|
+
kind;
|
|
3
|
+
status;
|
|
4
|
+
retryAfterMs;
|
|
5
|
+
constructor(message, kind, status, retryAfterMs, options) {
|
|
6
|
+
super(message, options);
|
|
7
|
+
this.kind = kind;
|
|
8
|
+
this.status = status;
|
|
9
|
+
this.retryAfterMs = retryAfterMs;
|
|
10
|
+
this.name = 'TrendsError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/trends/errors.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGzB;IACA;IACA;IAJX,YACE,OAAe,EACN,IAAqB,EACrB,MAAe,EACf,YAAqB,EAC9B,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QALf,SAAI,GAAJ,IAAI,CAAiB;QACrB,WAAM,GAAN,MAAM,CAAS;QACf,iBAAY,GAAZ,YAAY,CAAS;QAI9B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { TrendsEmbedType, TrendsExploreOptions, TrendsLinkOptions } from './types.js';
|
|
2
|
+
export declare function trendsTimezone(value: number): number;
|
|
3
|
+
export declare function trendsGeo(value: string): string;
|
|
4
|
+
/** Builds a website link for comparisons sharing one location and time range. */
|
|
5
|
+
export declare function buildTrendsExploreUrl(options: TrendsExploreOptions, link?: TrendsLinkOptions): string;
|
|
6
|
+
/** Builds an iframe URL using the request structure in Google's shipped embed loader. */
|
|
7
|
+
export declare function buildTrendsEmbedUrl(type: TrendsEmbedType, options: TrendsExploreOptions, link?: TrendsLinkOptions): string;
|
|
8
|
+
//# sourceMappingURL=links.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/trends/links.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAK3F,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/C;AAmBD,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,EAAE,IAAI,GAAE,iBAAsB,GAAG,MAAM,CAgBzG;AAED,yFAAyF;AACzF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,GAAE,iBAAsB,GAAG,MAAM,CAO9H"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const PROPERTIES = new Set(['', 'images', 'news', 'froogle', 'youtube']);
|
|
2
|
+
const EMBEDS = new Set(['TIMESERIES', 'GEO_MAP', 'RELATED_TOPICS', 'RELATED_QUERIES']);
|
|
3
|
+
export function trendsTimezone(value) {
|
|
4
|
+
if (!Number.isInteger(value) || Math.abs(value) > 1440)
|
|
5
|
+
throw new RangeError('timezone must be integer minutes west of UTC between -1440 and 1440');
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
export function trendsGeo(value) {
|
|
9
|
+
if (!/^[A-Z]{2}(?:-[A-Z0-9]+)*$/.test(value))
|
|
10
|
+
throw new TypeError('geo must be a country or subdivision code such as US or US-CA');
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
function request(options) {
|
|
14
|
+
if (!Array.isArray(options.comparisonItem) || options.comparisonItem.length === 0)
|
|
15
|
+
throw new TypeError('comparisonItem must contain at least one keyword');
|
|
16
|
+
const comparisonItem = options.comparisonItem.map(item => {
|
|
17
|
+
if (typeof item.keyword !== 'string' || item.keyword.trim().length === 0)
|
|
18
|
+
throw new TypeError('keyword must be a nonempty search term or topic ID');
|
|
19
|
+
const geo = item.geo ?? '';
|
|
20
|
+
if (geo !== '')
|
|
21
|
+
trendsGeo(geo);
|
|
22
|
+
const time = item.time ?? 'today 12-m';
|
|
23
|
+
if (typeof time !== 'string' || time.trim().length === 0)
|
|
24
|
+
throw new TypeError('time must be a nonempty Trends range expression');
|
|
25
|
+
return { keyword: item.keyword, geo, time };
|
|
26
|
+
});
|
|
27
|
+
const category = options.category ?? 0;
|
|
28
|
+
if (!Number.isSafeInteger(category) || category < 0)
|
|
29
|
+
throw new RangeError('category must be a nonnegative integer');
|
|
30
|
+
const property = options.property ?? '';
|
|
31
|
+
if (!PROPERTIES.has(property))
|
|
32
|
+
throw new TypeError('property must be empty, images, news, froogle, or youtube');
|
|
33
|
+
return { comparisonItem, category, property };
|
|
34
|
+
}
|
|
35
|
+
/** Builds a website link for comparisons sharing one location and time range. */
|
|
36
|
+
export function buildTrendsExploreUrl(options, link = {}) {
|
|
37
|
+
const value = request(options);
|
|
38
|
+
const items = value.comparisonItem;
|
|
39
|
+
if (new Set(items.map(item => item.geo)).size > 1 || new Set(items.map(item => item.time)).size > 1)
|
|
40
|
+
throw new TypeError('Explore links require a shared geo and time; use an embed URL for per-item settings');
|
|
41
|
+
if (items.some(item => item.keyword.includes(',')))
|
|
42
|
+
throw new TypeError('Explore links cannot preserve commas inside keywords; use an embed URL');
|
|
43
|
+
const url = new URL('https://trends.google.com/trends/explore');
|
|
44
|
+
url.searchParams.set('q', items.map(item => item.keyword).join(','));
|
|
45
|
+
const geos = items.map(item => item.geo);
|
|
46
|
+
const times = items.map(item => item.time);
|
|
47
|
+
if (geos.some(Boolean))
|
|
48
|
+
url.searchParams.set('geo', new Set(geos).size === 1 ? geos[0] : geos.join(','));
|
|
49
|
+
url.searchParams.set('date', new Set(times).size === 1 ? times[0] : times.join(','));
|
|
50
|
+
if (value.category !== 0)
|
|
51
|
+
url.searchParams.set('cat', String(value.category));
|
|
52
|
+
if (value.property !== '')
|
|
53
|
+
url.searchParams.set('gprop', String(value.property));
|
|
54
|
+
if (link.locale)
|
|
55
|
+
url.searchParams.set('hl', link.locale);
|
|
56
|
+
if (link.legacy)
|
|
57
|
+
url.searchParams.set('legacy', '');
|
|
58
|
+
return url.toString();
|
|
59
|
+
}
|
|
60
|
+
/** Builds an iframe URL using the request structure in Google's shipped embed loader. */
|
|
61
|
+
export function buildTrendsEmbedUrl(type, options, link = {}) {
|
|
62
|
+
if (!EMBEDS.has(type))
|
|
63
|
+
throw new TypeError('Unsupported Trends embed type');
|
|
64
|
+
const url = new URL(`https://trends.google.com/trends/embed/explore/${type}`);
|
|
65
|
+
url.searchParams.set('req', JSON.stringify(request(options)));
|
|
66
|
+
url.searchParams.set('tz', String(trendsTimezone(link.timezone ?? 0)));
|
|
67
|
+
if (link.locale)
|
|
68
|
+
url.searchParams.set('hl', link.locale.replace(/[^a-z]/ig, ''));
|
|
69
|
+
return url.toString();
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/trends/links.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACzE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAEvF,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI;QAAE,MAAM,IAAI,UAAU,CAAC,qEAAqE,CAAC,CAAC;IACpJ,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,+DAA+D,CAAC,CAAC;IACnI,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,OAA6B;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAC;IAC3J,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACvD,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,oDAAoD,CAAC,CAAC;QACpJ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;QAC3B,IAAI,GAAG,KAAK,EAAE;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC;QACvC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAC;QACjI,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,wCAAwC,CAAC,CAAC;IACpH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,2DAA2D,CAAC,CAAC;IAChH,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAChD,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,qBAAqB,CAAC,OAA6B,EAAE,OAA0B,EAAE;IAC/F,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,cAAuE,CAAC;IAC5F,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,qFAAqF,CAAC,CAAC;IAChN,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,wEAAwE,CAAC,CAAC;IAClJ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAChE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1G,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtF,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,QAAQ,KAAK,EAAE;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjF,IAAI,IAAI,CAAC,MAAM;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,IAAI,CAAC,MAAM;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,mBAAmB,CAAC,IAAqB,EAAE,OAA6B,EAAE,OAA0B,EAAE;IACpH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;IAC9E,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,IAAI,IAAI,CAAC,MAAM;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IACjF,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { TrendsFeed, TrendsSuggestions } from './types.js';
|
|
2
|
+
export declare function parseTrendsJson(text: string): Record<string, unknown>;
|
|
3
|
+
export declare function parseSuggestions(raw: unknown): TrendsSuggestions;
|
|
4
|
+
export declare function parseTrendingRss(raw: string): TrendsFeed;
|
|
5
|
+
//# sourceMappingURL=parsers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/trends/parsers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiC,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAc/F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQrE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CAYhE;AA6CD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAuCxD"}
|