litescrape-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +283 -0
  3. package/dist/cjs/batch.d.ts +12 -0
  4. package/dist/cjs/batch.d.ts.map +1 -0
  5. package/dist/cjs/batch.js +131 -0
  6. package/dist/cjs/batch.js.map +1 -0
  7. package/dist/cjs/cache.d.ts +21 -0
  8. package/dist/cjs/cache.d.ts.map +1 -0
  9. package/dist/cjs/cache.js +112 -0
  10. package/dist/cjs/cache.js.map +1 -0
  11. package/dist/cjs/client.d.ts +38 -0
  12. package/dist/cjs/client.d.ts.map +1 -0
  13. package/dist/cjs/client.js +143 -0
  14. package/dist/cjs/client.js.map +1 -0
  15. package/dist/cjs/errors.d.ts +53 -0
  16. package/dist/cjs/errors.d.ts.map +1 -0
  17. package/dist/cjs/errors.js +121 -0
  18. package/dist/cjs/errors.js.map +1 -0
  19. package/dist/cjs/index.d.ts +8 -0
  20. package/dist/cjs/index.d.ts.map +1 -0
  21. package/dist/cjs/index.js +40 -0
  22. package/dist/cjs/index.js.map +1 -0
  23. package/dist/cjs/models.d.ts +1735 -0
  24. package/dist/cjs/models.d.ts.map +1 -0
  25. package/dist/cjs/models.js +389 -0
  26. package/dist/cjs/models.js.map +1 -0
  27. package/dist/cjs/package.json +1 -0
  28. package/dist/cjs/result.d.ts +23 -0
  29. package/dist/cjs/result.d.ts.map +1 -0
  30. package/dist/cjs/result.js +49 -0
  31. package/dist/cjs/result.js.map +1 -0
  32. package/dist/cjs/runtime.d.ts +53 -0
  33. package/dist/cjs/runtime.d.ts.map +1 -0
  34. package/dist/cjs/runtime.js +237 -0
  35. package/dist/cjs/runtime.js.map +1 -0
  36. package/dist/cjs/stores.d.ts +143 -0
  37. package/dist/cjs/stores.d.ts.map +1 -0
  38. package/dist/cjs/stores.js +194 -0
  39. package/dist/cjs/stores.js.map +1 -0
  40. package/dist/cjs/validation.d.ts +65 -0
  41. package/dist/cjs/validation.d.ts.map +1 -0
  42. package/dist/cjs/validation.js +122 -0
  43. package/dist/cjs/validation.js.map +1 -0
  44. package/dist/cjs/version.d.ts +2 -0
  45. package/dist/cjs/version.d.ts.map +1 -0
  46. package/dist/cjs/version.js +5 -0
  47. package/dist/cjs/version.js.map +1 -0
  48. package/dist/esm/batch.d.ts +12 -0
  49. package/dist/esm/batch.d.ts.map +1 -0
  50. package/dist/esm/batch.js +128 -0
  51. package/dist/esm/batch.js.map +1 -0
  52. package/dist/esm/cache.d.ts +21 -0
  53. package/dist/esm/cache.d.ts.map +1 -0
  54. package/dist/esm/cache.js +106 -0
  55. package/dist/esm/cache.js.map +1 -0
  56. package/dist/esm/client.d.ts +38 -0
  57. package/dist/esm/client.d.ts.map +1 -0
  58. package/dist/esm/client.js +138 -0
  59. package/dist/esm/client.js.map +1 -0
  60. package/dist/esm/errors.d.ts +53 -0
  61. package/dist/esm/errors.d.ts.map +1 -0
  62. package/dist/esm/errors.js +106 -0
  63. package/dist/esm/errors.js.map +1 -0
  64. package/dist/esm/index.d.ts +8 -0
  65. package/dist/esm/index.d.ts.map +1 -0
  66. package/dist/esm/index.js +6 -0
  67. package/dist/esm/index.js.map +1 -0
  68. package/dist/esm/models.d.ts +1735 -0
  69. package/dist/esm/models.d.ts.map +1 -0
  70. package/dist/esm/models.js +384 -0
  71. package/dist/esm/models.js.map +1 -0
  72. package/dist/esm/result.d.ts +23 -0
  73. package/dist/esm/result.d.ts.map +1 -0
  74. package/dist/esm/result.js +45 -0
  75. package/dist/esm/result.js.map +1 -0
  76. package/dist/esm/runtime.d.ts +53 -0
  77. package/dist/esm/runtime.d.ts.map +1 -0
  78. package/dist/esm/runtime.js +226 -0
  79. package/dist/esm/runtime.js.map +1 -0
  80. package/dist/esm/stores.d.ts +143 -0
  81. package/dist/esm/stores.d.ts.map +1 -0
  82. package/dist/esm/stores.js +190 -0
  83. package/dist/esm/stores.js.map +1 -0
  84. package/dist/esm/validation.d.ts +65 -0
  85. package/dist/esm/validation.d.ts.map +1 -0
  86. package/dist/esm/validation.js +109 -0
  87. package/dist/esm/validation.js.map +1 -0
  88. package/dist/esm/version.d.ts +2 -0
  89. package/dist/esm/version.d.ts.map +1 -0
  90. package/dist/esm/version.js +2 -0
  91. package/dist/esm/version.js.map +1 -0
  92. package/package.json +74 -0
  93. package/src/batch.ts +158 -0
  94. package/src/cache.ts +123 -0
  95. package/src/client.ts +199 -0
  96. package/src/errors.ts +120 -0
  97. package/src/index.ts +17 -0
  98. package/src/models.ts +570 -0
  99. package/src/package.json +3 -0
  100. package/src/result.ts +49 -0
  101. package/src/runtime.ts +255 -0
  102. package/src/stores.ts +206 -0
  103. package/src/validation.ts +140 -0
  104. package/src/version.ts +1 -0
@@ -0,0 +1,226 @@
1
+ import { createHash } from "node:crypto";
2
+ import { setTimeout as delay } from "node:timers/promises";
3
+ import { APIError, TransportError, apiError, isObject } from "./errors.js";
4
+ import { VERSION } from "./version.js";
5
+ export const DEFAULT_BASE_URL = "https://api.litescrape.com";
6
+ export const USER_AGENT = `litescrape-sdk/${VERSION} (Node/${process.versions.node}; ${process.platform}; TypeScript)`;
7
+ export const CLIENT_HEADER_VALUE = `typescript-sdk/${VERSION}`;
8
+ export const emptyOutcome = () => ({
9
+ data: null,
10
+ error: null,
11
+ statusCode: null,
12
+ requestId: "",
13
+ attempts: 0,
14
+ });
15
+ /** FIFO gate. Waiting and backoff do not hold a network slot. */
16
+ export class Semaphore {
17
+ limit;
18
+ active = 0;
19
+ queue = [];
20
+ constructor(limit) {
21
+ this.limit = limit;
22
+ }
23
+ async acquire(signal) {
24
+ signal?.throwIfAborted();
25
+ return new Promise((resolve, reject) => {
26
+ const waiter = {
27
+ start: () => {
28
+ signal?.removeEventListener("abort", waiter.cancel);
29
+ this.active++;
30
+ let released = false;
31
+ resolve(() => {
32
+ if (released)
33
+ return;
34
+ released = true;
35
+ this.active--;
36
+ this.drain();
37
+ });
38
+ },
39
+ cancel: () => {
40
+ const index = this.queue.indexOf(waiter);
41
+ if (index !== -1)
42
+ this.queue.splice(index, 1);
43
+ reject(signal?.reason);
44
+ },
45
+ };
46
+ if (this.active < this.limit)
47
+ waiter.start();
48
+ else {
49
+ this.queue.push(waiter);
50
+ signal?.addEventListener("abort", waiter.cancel, { once: true });
51
+ }
52
+ });
53
+ }
54
+ resize(limit) {
55
+ this.limit = limit;
56
+ this.drain();
57
+ }
58
+ drain() {
59
+ while (this.active < this.limit && this.queue.length)
60
+ this.queue.shift().start();
61
+ }
62
+ }
63
+ // One key-wide cap shared by overlapping scrape calls. Per-call limits are separate,
64
+ // so two callers with different overrides cannot accidentally multiply the key limit.
65
+ const sharedLimits = new Map();
66
+ export function keySemaphore(key, baseUrl, limit) {
67
+ const identity = createHash("sha256")
68
+ .update(JSON.stringify([key, baseUrl]))
69
+ .digest("hex");
70
+ let entry = sharedLimits.get(identity);
71
+ if (!entry) {
72
+ entry = { semaphore: new Semaphore(limit), users: 0 };
73
+ sharedLimits.set(identity, entry);
74
+ }
75
+ else
76
+ entry.semaphore.resize(limit);
77
+ entry.users++;
78
+ const held = entry;
79
+ return {
80
+ semaphore: held.semaphore,
81
+ release: () => {
82
+ held.users--;
83
+ if (held.users === 0)
84
+ sharedLimits.delete(identity);
85
+ },
86
+ };
87
+ }
88
+ export function shouldRetry(error) {
89
+ if (error instanceof TransportError)
90
+ return error.retryable;
91
+ return (error instanceof APIError &&
92
+ (error.retryable ||
93
+ error.statusCode === 429 ||
94
+ (error.statusCode ?? 0) >= 500 ||
95
+ ["proxy_capacity_unavailable", "upstream_session_unavailable", "service_unavailable"].includes(error.errorCode)));
96
+ }
97
+ export function backoff(attempt, retryAfter = null) {
98
+ if (retryAfter !== null)
99
+ return Math.min(Math.max(retryAfter, 0), 30);
100
+ const ceiling = Math.min(30, 2 ** Math.min(Math.max(attempt - 1, 0), 6));
101
+ return ceiling * (0.5 + Math.random() / 2);
102
+ }
103
+ export async function sleep(seconds, signal) {
104
+ signal?.throwIfAborted();
105
+ try {
106
+ await delay(seconds * 1000, undefined, { signal });
107
+ }
108
+ catch (error) {
109
+ signal?.throwIfAborted();
110
+ throw error;
111
+ }
112
+ }
113
+ export async function requestWithRetries(path, options) {
114
+ const { signal } = options;
115
+ const outcome = emptyOutcome();
116
+ for (let attempt = 1; attempt <= options.attempts; attempt++) {
117
+ signal?.throwIfAborted();
118
+ const release = [];
119
+ try {
120
+ for (const semaphore of options.semaphores ?? [])
121
+ release.push(await semaphore.acquire(signal));
122
+ signal?.throwIfAborted();
123
+ const blocked = options.gate?.();
124
+ if (blocked) {
125
+ outcome.error = blocked;
126
+ outcome.statusCode = blocked.statusCode;
127
+ outcome.requestId = blocked.requestId;
128
+ return outcome;
129
+ }
130
+ Object.assign(outcome, emptyOutcome(), { attempts: attempt });
131
+ const controller = new AbortController();
132
+ const timeout = setTimeout(() => controller.abort(new DOMException("HTTP transport timed out", "TimeoutError")), options.timeout * 1000);
133
+ const combined = signal ? AbortSignal.any([signal, controller.signal]) : controller.signal;
134
+ try {
135
+ const url = new URL(options.baseUrl + path);
136
+ for (const [key, value] of Object.entries(options.params ?? {}))
137
+ url.searchParams.set(key, value);
138
+ const response = await options.fetch(url, {
139
+ method: options.method ?? "GET",
140
+ redirect: "manual",
141
+ signal: combined,
142
+ headers: {
143
+ Accept: "application/json",
144
+ "User-Agent": USER_AGENT,
145
+ "X-Litescrape-Client": CLIENT_HEADER_VALUE,
146
+ Authorization: `Bearer ${options.apiKey}`,
147
+ ...(options.body ? { "Content-Type": "application/json" } : {}),
148
+ ...options.headers,
149
+ },
150
+ ...(options.body ? { body: JSON.stringify(options.body) } : {}),
151
+ });
152
+ outcome.statusCode = response.status;
153
+ outcome.requestId = response.headers.get("x-request-id") ?? "";
154
+ let data;
155
+ let bodyError;
156
+ try {
157
+ data = await response.json();
158
+ }
159
+ catch (error) {
160
+ bodyError = error;
161
+ }
162
+ signal?.throwIfAborted();
163
+ if (!(options.acceptedStatuses ?? [200]).includes(response.status)) {
164
+ outcome.error = apiError(response.status, data, response.headers);
165
+ outcome.requestId = outcome.error instanceof APIError ? outcome.error.requestId : outcome.requestId;
166
+ }
167
+ else if (bodyError) {
168
+ outcome.error = new TransportError("Response body was not JSON", {
169
+ retryable: true,
170
+ cause: bodyError,
171
+ });
172
+ }
173
+ else if (!isObject(data)) {
174
+ outcome.error = new TransportError("Response body was not a JSON object", { retryable: true });
175
+ }
176
+ else
177
+ outcome.data = data;
178
+ }
179
+ catch (cause) {
180
+ signal?.throwIfAborted();
181
+ const retryable = controller.signal.aborted ||
182
+ cause instanceof TypeError ||
183
+ (cause instanceof DOMException && ["AbortError", "TimeoutError"].includes(cause.name));
184
+ outcome.error = new TransportError(cause instanceof Error ? cause.message : String(cause), {
185
+ retryable,
186
+ cause,
187
+ });
188
+ }
189
+ finally {
190
+ clearTimeout(timeout);
191
+ }
192
+ // Set the fatal gate while the slot is held, before queued requests can start.
193
+ options.onOutcome?.(outcome);
194
+ }
195
+ finally {
196
+ for (const unlock of release.reverse())
197
+ unlock();
198
+ }
199
+ if (!outcome.error || attempt === options.attempts || !shouldRetry(outcome.error))
200
+ return outcome;
201
+ await sleep(backoff(attempt, outcome.error instanceof APIError ? outcome.error.retryAfter : null), signal);
202
+ }
203
+ return outcome;
204
+ }
205
+ /** A bounded worker pool; errors stop new work and settle all workers before returning. */
206
+ export async function each(items, limit, operation) {
207
+ let next = 0;
208
+ let failed = false;
209
+ const worker = async () => {
210
+ while (!failed && next < items.length) {
211
+ const item = items[next++];
212
+ try {
213
+ await operation(item);
214
+ }
215
+ catch (error) {
216
+ failed = true;
217
+ throw error;
218
+ }
219
+ }
220
+ };
221
+ const settled = await Promise.allSettled(Array.from({ length: Math.min(limit, items.length) }, worker));
222
+ const failure = settled.find((result) => result.status === "rejected");
223
+ if (failure?.status === "rejected")
224
+ throw failure.reason;
225
+ }
226
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ import { z } from "zod";
2
+ import { type Rule } from "./validation.js";
3
+ export declare const playApps: {
4
+ hl: z.ZodDefault<z.ZodString>;
5
+ gl: z.ZodDefault<z.ZodString>;
6
+ q: z.ZodOptional<z.ZodNullable<z.ZodString>>;
7
+ chart: z.ZodOptional<z.ZodNullable<z.ZodString>>;
8
+ next_page_token: z.ZodOptional<z.ZodNullable<z.ZodString>>;
9
+ section_page_token: z.ZodOptional<z.ZodNullable<z.ZodString>>;
10
+ see_more_token: z.ZodOptional<z.ZodNullable<z.ZodString>>;
11
+ apps_category: z.ZodOptional<z.ZodNullable<z.ZodString>>;
12
+ age: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
13
+ AGE_RANGE1: "AGE_RANGE1";
14
+ AGE_RANGE2: "AGE_RANGE2";
15
+ AGE_RANGE3: "AGE_RANGE3";
16
+ }>>>;
17
+ store_device: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
18
+ car: "car";
19
+ chromebook: "chromebook";
20
+ phone: "phone";
21
+ tablet: "tablet";
22
+ tv: "tv";
23
+ watch: "watch";
24
+ }>>>;
25
+ };
26
+ export declare const playGames: {
27
+ hl: z.ZodDefault<z.ZodString>;
28
+ gl: z.ZodDefault<z.ZodString>;
29
+ q: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
+ chart: z.ZodOptional<z.ZodNullable<z.ZodString>>;
31
+ next_page_token: z.ZodOptional<z.ZodNullable<z.ZodString>>;
32
+ section_page_token: z.ZodOptional<z.ZodNullable<z.ZodString>>;
33
+ see_more_token: z.ZodOptional<z.ZodNullable<z.ZodString>>;
34
+ games_category: z.ZodOptional<z.ZodNullable<z.ZodString>>;
35
+ store_device: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
36
+ chromebook: "chromebook";
37
+ phone: "phone";
38
+ tablet: "tablet";
39
+ tv: "tv";
40
+ watch: "watch";
41
+ windows: "windows";
42
+ }>>>;
43
+ };
44
+ export declare const playBooks: {
45
+ hl: z.ZodDefault<z.ZodString>;
46
+ gl: z.ZodDefault<z.ZodString>;
47
+ q: z.ZodOptional<z.ZodNullable<z.ZodString>>;
48
+ chart: z.ZodOptional<z.ZodNullable<z.ZodString>>;
49
+ next_page_token: z.ZodOptional<z.ZodNullable<z.ZodString>>;
50
+ section_page_token: z.ZodOptional<z.ZodNullable<z.ZodString>>;
51
+ see_more_token: z.ZodOptional<z.ZodNullable<z.ZodString>>;
52
+ books_category: z.ZodOptional<z.ZodNullable<z.ZodString>>;
53
+ age: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
54
+ AGE_RANGE1: "AGE_RANGE1";
55
+ AGE_RANGE2: "AGE_RANGE2";
56
+ AGE_RANGE3: "AGE_RANGE3";
57
+ }>>>;
58
+ price: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>]>, z.ZodNumber>, z.ZodNumber>>>;
59
+ };
60
+ export declare const playMovies: {
61
+ hl: z.ZodDefault<z.ZodString>;
62
+ gl: z.ZodDefault<z.ZodString>;
63
+ q: z.ZodOptional<z.ZodNullable<z.ZodString>>;
64
+ chart: z.ZodOptional<z.ZodNullable<z.ZodString>>;
65
+ next_page_token: z.ZodOptional<z.ZodNullable<z.ZodString>>;
66
+ section_page_token: z.ZodOptional<z.ZodNullable<z.ZodString>>;
67
+ see_more_token: z.ZodOptional<z.ZodNullable<z.ZodString>>;
68
+ movies_category: z.ZodOptional<z.ZodNullable<z.ZodString>>;
69
+ age: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
70
+ AGE_RANGE1: "AGE_RANGE1";
71
+ AGE_RANGE2: "AGE_RANGE2";
72
+ AGE_RANGE3: "AGE_RANGE3";
73
+ }>>>;
74
+ };
75
+ export declare const playProduct: {
76
+ hl: z.ZodDefault<z.ZodString>;
77
+ gl: z.ZodDefault<z.ZodString>;
78
+ product_id: z.ZodString;
79
+ store: z.ZodDefault<z.ZodEnum<{
80
+ apps: "apps";
81
+ audiobooks: "audiobooks";
82
+ books: "books";
83
+ movies: "movies";
84
+ tv: "tv";
85
+ }>>;
86
+ season_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
87
+ };
88
+ export declare const playReviews: {
89
+ hl: z.ZodDefault<z.ZodString>;
90
+ gl: z.ZodDefault<z.ZodString>;
91
+ product_id: z.ZodString;
92
+ store: z.ZodDefault<z.ZodEnum<{
93
+ apps: "apps";
94
+ audiobooks: "audiobooks";
95
+ books: "books";
96
+ movies: "movies";
97
+ tv: "tv";
98
+ }>>;
99
+ platform: z.ZodDefault<z.ZodEnum<{
100
+ chromebook: "chromebook";
101
+ phone: "phone";
102
+ tablet: "tablet";
103
+ tv: "tv";
104
+ watch: "watch";
105
+ }>>;
106
+ rating: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>]>, z.ZodNumber>, z.ZodNumber>>>;
107
+ sort_by: z.ZodDefault<z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>]>, z.ZodNumber>, z.ZodNumber>>;
108
+ num: z.ZodDefault<z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>]>, z.ZodNumber>, z.ZodNumber>>;
109
+ next_page_token: z.ZodOptional<z.ZodNullable<z.ZodString>>;
110
+ };
111
+ export declare const playRules: (operation: string) => Rule[];
112
+ export declare const appleSearch: {
113
+ country: z.ZodDefault<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
114
+ term: z.ZodString;
115
+ lang: z.ZodDefault<z.ZodString>;
116
+ num: z.ZodDefault<z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>]>, z.ZodNumber>, z.ZodNumber>>;
117
+ disallow_explicit: z.ZodDefault<z.ZodPipe<z.ZodUnion<readonly [z.ZodBoolean, z.ZodEnum<{
118
+ false: "false";
119
+ true: "true";
120
+ }>]>, z.ZodTransform<boolean, "false" | "true" | boolean>>>;
121
+ property: z.ZodOptional<z.ZodNullable<z.ZodLiteral<"developer">>>;
122
+ category_id: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>]>, z.ZodNumber>, z.ZodNumber>>>;
123
+ device: z.ZodDefault<z.ZodEnum<{
124
+ desktop: "desktop";
125
+ mobile: "mobile";
126
+ tablet: "tablet";
127
+ }>>;
128
+ };
129
+ export declare const appleProduct: {
130
+ country: z.ZodDefault<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
131
+ product_id: z.ZodString;
132
+ type: z.ZodDefault<z.ZodLiteral<"app">>;
133
+ };
134
+ export declare const appleReviews: {
135
+ country: z.ZodDefault<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
136
+ product_id: z.ZodString;
137
+ sort: z.ZodDefault<z.ZodEnum<{
138
+ mosthelpful: "mosthelpful";
139
+ mostrecent: "mostrecent";
140
+ }>>;
141
+ page: z.ZodDefault<z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>]>, z.ZodNumber>, z.ZodNumber>>;
142
+ };
143
+ //# sourceMappingURL=stores.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stores.d.ts","sourceRoot":"","sources":["../../src/stores.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAA+B,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAuDzE,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;CAKpB,CAAC;AACF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;CAIrB,CAAC;AACF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;CAKrB,CAAC;AACF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;CAAgE,CAAC;AACxF,eAAO,MAAM,WAAW;;;;;;;;;;;;CAA+E,CAAC;AACxG,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;CASvB,CAAC;AAGF,eAAO,MAAM,SAAS,cAAe,MAAM,KAAG,IAAI,EAsDjD,CAAC;AAoBF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;CA4BvB,CAAC;AACF,eAAO,MAAM,YAAY;;;;CAAmF,CAAC;AAC7G,eAAO,MAAM,YAAY;;;;;;;;CAYxB,CAAC"}
@@ -0,0 +1,190 @@
1
+ import { isDeepStrictEqual } from "node:util";
2
+ import { z } from "zod";
3
+ import { isObject } from "./errors.js";
4
+ import { optional as opt, has, issue } from "./validation.js";
5
+ const cleanText = z
6
+ .string()
7
+ .refine((value) => !/[\x00-\x1f\x7f]/.test(value), "Control characters are not allowed")
8
+ .refine((value) => !Array.from(value).some((c) => c.length === 1 && /[\ud800-\udfff]/.test(c)), "Use valid Unicode text");
9
+ const query = cleanText
10
+ .refine((value) => Buffer.byteLength(value.trim(), "utf8") <= 2048, "Use at most 2,048 UTF-8 bytes")
11
+ .trim()
12
+ .min(1)
13
+ .max(2048);
14
+ const whole = z
15
+ .union([
16
+ z.number().int(),
17
+ cleanText
18
+ .trim()
19
+ .regex(/^[+-]?\d+$/)
20
+ .transform(Number),
21
+ ])
22
+ .pipe(z.number().int());
23
+ const category = cleanText
24
+ .min(1)
25
+ .max(128)
26
+ .regex(/^[a-zA-Z0-9_-]+$/);
27
+ const identifier = cleanText
28
+ .min(1)
29
+ .max(512)
30
+ .regex(/^[a-zA-Z0-9_.-]+$/);
31
+ const token = cleanText
32
+ .min(1)
33
+ .max(65536)
34
+ .regex(/^[a-zA-Z0-9_=+/:.-]+$/);
35
+ const age = z.enum(["AGE_RANGE1", "AGE_RANGE2", "AGE_RANGE3"]);
36
+ const store = z.enum(["apps", "books", "audiobooks", "movies", "tv"]).default("apps");
37
+ const playLocale = {
38
+ hl: cleanText
39
+ .max(32)
40
+ .regex(/^[a-zA-Z]{2,3}(?:[-_][a-zA-Z0-9]{2,8}){0,3}$/)
41
+ .default("en"),
42
+ gl: cleanText
43
+ .regex(/^[a-zA-Z]{2}$/)
44
+ .toLowerCase()
45
+ .default("us"),
46
+ };
47
+ const listing = {
48
+ ...playLocale,
49
+ q: opt(query),
50
+ chart: opt(category),
51
+ next_page_token: opt(token),
52
+ section_page_token: opt(token),
53
+ see_more_token: opt(token),
54
+ };
55
+ export const playApps = {
56
+ ...listing,
57
+ apps_category: opt(category),
58
+ age: opt(age),
59
+ store_device: opt(z.enum(["phone", "tablet", "tv", "chromebook", "watch", "car"])),
60
+ };
61
+ export const playGames = {
62
+ ...listing,
63
+ games_category: opt(category),
64
+ store_device: opt(z.enum(["phone", "tablet", "tv", "chromebook", "watch", "windows"])),
65
+ };
66
+ export const playBooks = {
67
+ ...listing,
68
+ books_category: opt(category),
69
+ age: opt(age),
70
+ price: opt(whole.pipe(z.number().min(1).max(2))),
71
+ };
72
+ export const playMovies = { ...listing, movies_category: opt(category), age: opt(age) };
73
+ export const playProduct = { ...playLocale, product_id: identifier, store, season_id: opt(identifier) };
74
+ export const playReviews = {
75
+ ...playLocale,
76
+ product_id: identifier,
77
+ store,
78
+ platform: z.enum(["phone", "tablet", "watch", "chromebook", "tv"]).default("phone"),
79
+ rating: opt(whole.pipe(z.number().min(1).max(5))),
80
+ sort_by: whole.pipe(z.number().min(1).max(3)).default(1),
81
+ num: whole.pipe(z.number().min(1).max(199)).default(40),
82
+ next_page_token: opt(token),
83
+ };
84
+ const tokenFields = ["next_page_token", "section_page_token", "see_more_token"];
85
+ export const playRules = (operation) => [
86
+ (p, c) => {
87
+ if (["apps", "games", "books", "movies"].includes(operation)) {
88
+ if ([...tokenFields, "chart"].filter((f) => p[f]).length > 1)
89
+ issue(c, "chart and pagination selectors are mutually exclusive");
90
+ if (p.chart && p.q)
91
+ issue(c, "chart and q are mutually exclusive");
92
+ if (p.chart && has(p, "store_device") && p.store_device !== "phone")
93
+ issue(c, "Device-specific storefronts do not support charts; omit chart or use phone");
94
+ const categoryValue = p[`${operation}_category`];
95
+ if (p.q && categoryValue)
96
+ issue(c, "q and category are mutually exclusive");
97
+ if (has(p, "store_device") && (p.q || categoryValue))
98
+ issue(c, "store_device excludes q and category");
99
+ if (p.age && categoryValue !== (operation === "books" ? "coll_1689" : "FAMILY"))
100
+ issue(c, "age requires the children's category");
101
+ if (has(p, "price") && !p.q)
102
+ issue(c, "price requires q");
103
+ }
104
+ if (p.season_id && p.store !== "tv")
105
+ issue(c, "season_id requires store=tv");
106
+ const context = Object.fromEntries(Object.entries(p).filter(([key, value]) => value != null && ![...tokenFields, "chart"].includes(key)));
107
+ if (["apps", "games"].includes(operation) && !p.q && !p[`${operation}_category`])
108
+ context.store_device ??= "phone";
109
+ for (const field of tokenFields) {
110
+ const encoded = p[field];
111
+ if (typeof encoded !== "string")
112
+ continue;
113
+ const kind = field === "next_page_token"
114
+ ? operation === "reviews"
115
+ ? "reviews"
116
+ : "page"
117
+ : field === "section_page_token"
118
+ ? "section"
119
+ : "collection";
120
+ try {
121
+ if (!/^[a-zA-Z0-9+/_-]*={0,2}$/.test(encoded) || encoded.replace(/=+$/, "").length % 4 === 1)
122
+ throw new Error();
123
+ const decoded = JSON.parse(new TextDecoder("utf8", { fatal: true }).decode(Buffer.from(encoded, "base64url")));
124
+ if (!isObject(decoded) ||
125
+ decoded.v !== 1 ||
126
+ decoded.operation !== operation ||
127
+ decoded.kind !== kind ||
128
+ !isDeepStrictEqual(decoded.context, context) ||
129
+ typeof decoded.token !== "string" ||
130
+ !/^[a-zA-Z0-9_=+/:.-]{1,12000}$/.test(decoded.token))
131
+ throw new Error();
132
+ }
133
+ catch {
134
+ issue(c, "Use a returned token with the same operation and search parameters", [field]);
135
+ }
136
+ }
137
+ },
138
+ ];
139
+ const storefronts = new Set("ae af ag ai al am ao ar at au az ba bb be bf bg bh bj bm bn bo br bs bt bw by bz ca cd cg ch ci cl cm cn co cr cv cy cz de dk dm do dz ec ee eg es fi fj fm fr ga gb gd ge gh gm gr gt gw gy hk hn hr hu id ie il in iq is it jm jo jp ke kg kh kn kr kw ky kz la lb lc lk lr lt lu lv ly ma md me mg mk ml mm mn mo mr ms mt mu mv mw mx my mz na ne ng ni nl no np nr nz om pa pe pg ph pk pl pt pw py qa ro rs ru rw sa sb sc se sg si sk sl sn sr st sv sz tc td th tj tm tn to tr tt tw tz ua ug us uy uz vc ve vg vn vu xk ye za zm zw".split(" "));
140
+ const appleLocale = {
141
+ country: cleanText
142
+ .regex(/^[a-zA-Z]{2}$/)
143
+ .toLowerCase()
144
+ .transform((value) => (value === "uk" ? "gb" : value))
145
+ .refine((value) => storefronts.has(value), "Choose a supported Apple storefront country")
146
+ .default("us"),
147
+ };
148
+ const productId = cleanText.regex(/^[1-9][0-9]{0,19}$/);
149
+ const quotePlus = (value) => encodeURIComponent(value)
150
+ .replace(/[!'()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`)
151
+ .replace(/%20/g, "+");
152
+ export const appleSearch = {
153
+ ...appleLocale,
154
+ term: query.refine((value) => {
155
+ try {
156
+ return quotePlus(value).length <= 4096;
157
+ }
158
+ catch {
159
+ return false;
160
+ }
161
+ }, "Use at most 4,096 URL-encoded bytes"),
162
+ lang: cleanText
163
+ .regex(/^[a-zA-Z]{2,3}-[a-zA-Z]{2}$/)
164
+ .toLowerCase()
165
+ .default("en-us"),
166
+ num: whole.pipe(z.number().min(1).max(200)).default(10),
167
+ disallow_explicit: z
168
+ .union([z.boolean(), z.enum(["true", "false"])])
169
+ .transform((value) => value === true || value === "true")
170
+ .default(false),
171
+ property: opt(z.literal("developer")),
172
+ category_id: opt(whole.pipe(z
173
+ .number()
174
+ .min(1)
175
+ .max(2 ** 31 - 1))),
176
+ device: z.enum(["mobile", "tablet", "desktop"]).default("mobile"),
177
+ };
178
+ export const appleProduct = { ...appleLocale, product_id: productId, type: z.literal("app").default("app") };
179
+ export const appleReviews = {
180
+ ...appleLocale,
181
+ product_id: productId,
182
+ sort: z.enum(["mostrecent", "mosthelpful"]).default("mostrecent"),
183
+ page: whole
184
+ .pipe(z
185
+ .number()
186
+ .min(1)
187
+ .max(2 ** 31 - 1))
188
+ .default(1),
189
+ };
190
+ //# sourceMappingURL=stores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stores.js","sourceRoot":"","sources":["../../src/stores.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ export declare const optional: <S extends z.ZodType>(schema: S) => z.ZodOptional<z.ZodNullable<S>>;
3
+ export declare const text: z.ZodPipe<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBigInt]>, z.ZodTransform<string, string | number | bigint>>;
4
+ export declare const number: z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>, z.ZodPipe<z.ZodBoolean, z.ZodTransform<number, boolean>>]>, z.ZodNumber>;
5
+ export declare const integer: z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>, z.ZodPipe<z.ZodBoolean, z.ZodTransform<number, boolean>>]>, z.ZodNumber>, z.ZodNumber>;
6
+ export declare const boolean: z.ZodPipe<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<0>, z.ZodLiteral<1>, z.ZodPipe<z.ZodString, z.ZodEnum<{
7
+ 0: "0";
8
+ 1: "1";
9
+ f: "f";
10
+ false: "false";
11
+ n: "n";
12
+ no: "no";
13
+ off: "off";
14
+ on: "on";
15
+ t: "t";
16
+ true: "true";
17
+ y: "y";
18
+ yes: "yes";
19
+ }>>]>, z.ZodTransform<boolean, "0" | "1" | "f" | "false" | "n" | "no" | "off" | "on" | "t" | "true" | "y" | "yes" | 0 | 1 | boolean>>;
20
+ export declare const flag: z.ZodPipe<z.ZodUnion<readonly [z.ZodEnum<{
21
+ 0: "0";
22
+ 1: "1";
23
+ }>, z.ZodLiteral<0>, z.ZodLiteral<1>, z.ZodBoolean]>, z.ZodTransform<"0" | "1", "0" | "1" | 0 | 1 | boolean>>;
24
+ export declare const strictBoolean: z.ZodUnion<readonly [z.ZodBoolean, z.ZodEnum<{
25
+ false: "false";
26
+ true: "true";
27
+ }>]>;
28
+ export declare const timeoutSeconds: z.ZodNumber;
29
+ export declare const device: z.ZodEnum<{
30
+ desktop: "desktop";
31
+ mobile: "mobile";
32
+ tablet: "tablet";
33
+ }>;
34
+ type Params = Record<string, unknown>;
35
+ export type Rule = (params: Params, context: z.RefinementCtx) => void;
36
+ export declare const issue: (context: z.RefinementCtx, message: string, path?: string[]) => void;
37
+ export declare const has: (params: Params, field: string) => boolean;
38
+ export declare const requireAny: (...fields: string[]) => Rule;
39
+ export declare const exactlyOne: (...fields: string[]) => Rule;
40
+ export declare const atMostOne: (...fields: string[]) => Rule;
41
+ export declare const paired: (a: string, b: string) => Rule;
42
+ export declare const requires: (field: string, dependency: string) => Rule;
43
+ /** Validated, immutable request. Construct an endpoint class or pass a plain object to scrape. */
44
+ export declare class ScrapeRequest<E extends string = string> {
45
+ #private;
46
+ readonly endpoint: E;
47
+ readonly timeout?: number | null;
48
+ constructor(path: string, params: object & {
49
+ endpoint: E;
50
+ }, prototype?: object);
51
+ get path(): string;
52
+ queryParams(): Record<string, string>;
53
+ query_params(): Record<string, string>;
54
+ /** Copy a validated request with a default deadline without revalidating its cursor context. */
55
+ withTimeout(timeout: number): this;
56
+ }
57
+ export interface RequestClass<E extends string, Input, Output> {
58
+ new (params: Input): ScrapeRequest<E> & Readonly<Output>;
59
+ readonly endpoint: E;
60
+ readonly path: string;
61
+ readonly parameters: readonly string[];
62
+ }
63
+ export declare function defineRequest<E extends string, Shape extends z.ZodRawShape>(endpoint: E, path: string, shape: Shape, rules?: Rule[]): RequestClass<E, z.input<z.ZodObject<Shape>>, z.output<z.ZodObject<Shape>>>;
64
+ export {};
65
+ //# sourceMappingURL=validation.d.ts.map