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,237 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Semaphore = exports.emptyOutcome = exports.CLIENT_HEADER_VALUE = exports.USER_AGENT = exports.DEFAULT_BASE_URL = void 0;
4
+ exports.keySemaphore = keySemaphore;
5
+ exports.shouldRetry = shouldRetry;
6
+ exports.backoff = backoff;
7
+ exports.sleep = sleep;
8
+ exports.requestWithRetries = requestWithRetries;
9
+ exports.each = each;
10
+ const node_crypto_1 = require("node:crypto");
11
+ const promises_1 = require("node:timers/promises");
12
+ const errors_js_1 = require("./errors.js");
13
+ const version_js_1 = require("./version.js");
14
+ exports.DEFAULT_BASE_URL = "https://api.litescrape.com";
15
+ exports.USER_AGENT = `litescrape-sdk/${version_js_1.VERSION} (Node/${process.versions.node}; ${process.platform}; TypeScript)`;
16
+ exports.CLIENT_HEADER_VALUE = `typescript-sdk/${version_js_1.VERSION}`;
17
+ const emptyOutcome = () => ({
18
+ data: null,
19
+ error: null,
20
+ statusCode: null,
21
+ requestId: "",
22
+ attempts: 0,
23
+ });
24
+ exports.emptyOutcome = emptyOutcome;
25
+ /** FIFO gate. Waiting and backoff do not hold a network slot. */
26
+ class Semaphore {
27
+ limit;
28
+ active = 0;
29
+ queue = [];
30
+ constructor(limit) {
31
+ this.limit = limit;
32
+ }
33
+ async acquire(signal) {
34
+ signal?.throwIfAborted();
35
+ return new Promise((resolve, reject) => {
36
+ const waiter = {
37
+ start: () => {
38
+ signal?.removeEventListener("abort", waiter.cancel);
39
+ this.active++;
40
+ let released = false;
41
+ resolve(() => {
42
+ if (released)
43
+ return;
44
+ released = true;
45
+ this.active--;
46
+ this.drain();
47
+ });
48
+ },
49
+ cancel: () => {
50
+ const index = this.queue.indexOf(waiter);
51
+ if (index !== -1)
52
+ this.queue.splice(index, 1);
53
+ reject(signal?.reason);
54
+ },
55
+ };
56
+ if (this.active < this.limit)
57
+ waiter.start();
58
+ else {
59
+ this.queue.push(waiter);
60
+ signal?.addEventListener("abort", waiter.cancel, { once: true });
61
+ }
62
+ });
63
+ }
64
+ resize(limit) {
65
+ this.limit = limit;
66
+ this.drain();
67
+ }
68
+ drain() {
69
+ while (this.active < this.limit && this.queue.length)
70
+ this.queue.shift().start();
71
+ }
72
+ }
73
+ exports.Semaphore = Semaphore;
74
+ // One key-wide cap shared by overlapping scrape calls. Per-call limits are separate,
75
+ // so two callers with different overrides cannot accidentally multiply the key limit.
76
+ const sharedLimits = new Map();
77
+ function keySemaphore(key, baseUrl, limit) {
78
+ const identity = (0, node_crypto_1.createHash)("sha256")
79
+ .update(JSON.stringify([key, baseUrl]))
80
+ .digest("hex");
81
+ let entry = sharedLimits.get(identity);
82
+ if (!entry) {
83
+ entry = { semaphore: new Semaphore(limit), users: 0 };
84
+ sharedLimits.set(identity, entry);
85
+ }
86
+ else
87
+ entry.semaphore.resize(limit);
88
+ entry.users++;
89
+ const held = entry;
90
+ return {
91
+ semaphore: held.semaphore,
92
+ release: () => {
93
+ held.users--;
94
+ if (held.users === 0)
95
+ sharedLimits.delete(identity);
96
+ },
97
+ };
98
+ }
99
+ function shouldRetry(error) {
100
+ if (error instanceof errors_js_1.TransportError)
101
+ return error.retryable;
102
+ return (error instanceof errors_js_1.APIError &&
103
+ (error.retryable ||
104
+ error.statusCode === 429 ||
105
+ (error.statusCode ?? 0) >= 500 ||
106
+ ["proxy_capacity_unavailable", "upstream_session_unavailable", "service_unavailable"].includes(error.errorCode)));
107
+ }
108
+ function backoff(attempt, retryAfter = null) {
109
+ if (retryAfter !== null)
110
+ return Math.min(Math.max(retryAfter, 0), 30);
111
+ const ceiling = Math.min(30, 2 ** Math.min(Math.max(attempt - 1, 0), 6));
112
+ return ceiling * (0.5 + Math.random() / 2);
113
+ }
114
+ async function sleep(seconds, signal) {
115
+ signal?.throwIfAborted();
116
+ try {
117
+ await (0, promises_1.setTimeout)(seconds * 1000, undefined, { signal });
118
+ }
119
+ catch (error) {
120
+ signal?.throwIfAborted();
121
+ throw error;
122
+ }
123
+ }
124
+ async function requestWithRetries(path, options) {
125
+ const { signal } = options;
126
+ const outcome = (0, exports.emptyOutcome)();
127
+ for (let attempt = 1; attempt <= options.attempts; attempt++) {
128
+ signal?.throwIfAborted();
129
+ const release = [];
130
+ try {
131
+ for (const semaphore of options.semaphores ?? [])
132
+ release.push(await semaphore.acquire(signal));
133
+ signal?.throwIfAborted();
134
+ const blocked = options.gate?.();
135
+ if (blocked) {
136
+ outcome.error = blocked;
137
+ outcome.statusCode = blocked.statusCode;
138
+ outcome.requestId = blocked.requestId;
139
+ return outcome;
140
+ }
141
+ Object.assign(outcome, (0, exports.emptyOutcome)(), { attempts: attempt });
142
+ const controller = new AbortController();
143
+ const timeout = setTimeout(() => controller.abort(new DOMException("HTTP transport timed out", "TimeoutError")), options.timeout * 1000);
144
+ const combined = signal ? AbortSignal.any([signal, controller.signal]) : controller.signal;
145
+ try {
146
+ const url = new URL(options.baseUrl + path);
147
+ for (const [key, value] of Object.entries(options.params ?? {}))
148
+ url.searchParams.set(key, value);
149
+ const response = await options.fetch(url, {
150
+ method: options.method ?? "GET",
151
+ redirect: "manual",
152
+ signal: combined,
153
+ headers: {
154
+ Accept: "application/json",
155
+ "User-Agent": exports.USER_AGENT,
156
+ "X-Litescrape-Client": exports.CLIENT_HEADER_VALUE,
157
+ Authorization: `Bearer ${options.apiKey}`,
158
+ ...(options.body ? { "Content-Type": "application/json" } : {}),
159
+ ...options.headers,
160
+ },
161
+ ...(options.body ? { body: JSON.stringify(options.body) } : {}),
162
+ });
163
+ outcome.statusCode = response.status;
164
+ outcome.requestId = response.headers.get("x-request-id") ?? "";
165
+ let data;
166
+ let bodyError;
167
+ try {
168
+ data = await response.json();
169
+ }
170
+ catch (error) {
171
+ bodyError = error;
172
+ }
173
+ signal?.throwIfAborted();
174
+ if (!(options.acceptedStatuses ?? [200]).includes(response.status)) {
175
+ outcome.error = (0, errors_js_1.apiError)(response.status, data, response.headers);
176
+ outcome.requestId = outcome.error instanceof errors_js_1.APIError ? outcome.error.requestId : outcome.requestId;
177
+ }
178
+ else if (bodyError) {
179
+ outcome.error = new errors_js_1.TransportError("Response body was not JSON", {
180
+ retryable: true,
181
+ cause: bodyError,
182
+ });
183
+ }
184
+ else if (!(0, errors_js_1.isObject)(data)) {
185
+ outcome.error = new errors_js_1.TransportError("Response body was not a JSON object", { retryable: true });
186
+ }
187
+ else
188
+ outcome.data = data;
189
+ }
190
+ catch (cause) {
191
+ signal?.throwIfAborted();
192
+ const retryable = controller.signal.aborted ||
193
+ cause instanceof TypeError ||
194
+ (cause instanceof DOMException && ["AbortError", "TimeoutError"].includes(cause.name));
195
+ outcome.error = new errors_js_1.TransportError(cause instanceof Error ? cause.message : String(cause), {
196
+ retryable,
197
+ cause,
198
+ });
199
+ }
200
+ finally {
201
+ clearTimeout(timeout);
202
+ }
203
+ // Set the fatal gate while the slot is held, before queued requests can start.
204
+ options.onOutcome?.(outcome);
205
+ }
206
+ finally {
207
+ for (const unlock of release.reverse())
208
+ unlock();
209
+ }
210
+ if (!outcome.error || attempt === options.attempts || !shouldRetry(outcome.error))
211
+ return outcome;
212
+ await sleep(backoff(attempt, outcome.error instanceof errors_js_1.APIError ? outcome.error.retryAfter : null), signal);
213
+ }
214
+ return outcome;
215
+ }
216
+ /** A bounded worker pool; errors stop new work and settle all workers before returning. */
217
+ async function each(items, limit, operation) {
218
+ let next = 0;
219
+ let failed = false;
220
+ const worker = async () => {
221
+ while (!failed && next < items.length) {
222
+ const item = items[next++];
223
+ try {
224
+ await operation(item);
225
+ }
226
+ catch (error) {
227
+ failed = true;
228
+ throw error;
229
+ }
230
+ }
231
+ };
232
+ const settled = await Promise.allSettled(Array.from({ length: Math.min(limit, items.length) }, worker));
233
+ const failure = settled.find((result) => result.status === "rejected");
234
+ if (failure?.status === "rejected")
235
+ throw failure.reason;
236
+ }
237
+ //# 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,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.appleReviews = exports.appleProduct = exports.appleSearch = exports.playRules = exports.playReviews = exports.playProduct = exports.playMovies = exports.playBooks = exports.playGames = exports.playApps = void 0;
4
+ const node_util_1 = require("node:util");
5
+ const zod_1 = require("zod");
6
+ const errors_js_1 = require("./errors.js");
7
+ const validation_js_1 = require("./validation.js");
8
+ const cleanText = zod_1.z
9
+ .string()
10
+ .refine((value) => !/[\x00-\x1f\x7f]/.test(value), "Control characters are not allowed")
11
+ .refine((value) => !Array.from(value).some((c) => c.length === 1 && /[\ud800-\udfff]/.test(c)), "Use valid Unicode text");
12
+ const query = cleanText
13
+ .refine((value) => Buffer.byteLength(value.trim(), "utf8") <= 2048, "Use at most 2,048 UTF-8 bytes")
14
+ .trim()
15
+ .min(1)
16
+ .max(2048);
17
+ const whole = zod_1.z
18
+ .union([
19
+ zod_1.z.number().int(),
20
+ cleanText
21
+ .trim()
22
+ .regex(/^[+-]?\d+$/)
23
+ .transform(Number),
24
+ ])
25
+ .pipe(zod_1.z.number().int());
26
+ const category = cleanText
27
+ .min(1)
28
+ .max(128)
29
+ .regex(/^[a-zA-Z0-9_-]+$/);
30
+ const identifier = cleanText
31
+ .min(1)
32
+ .max(512)
33
+ .regex(/^[a-zA-Z0-9_.-]+$/);
34
+ const token = cleanText
35
+ .min(1)
36
+ .max(65536)
37
+ .regex(/^[a-zA-Z0-9_=+/:.-]+$/);
38
+ const age = zod_1.z.enum(["AGE_RANGE1", "AGE_RANGE2", "AGE_RANGE3"]);
39
+ const store = zod_1.z.enum(["apps", "books", "audiobooks", "movies", "tv"]).default("apps");
40
+ const playLocale = {
41
+ hl: cleanText
42
+ .max(32)
43
+ .regex(/^[a-zA-Z]{2,3}(?:[-_][a-zA-Z0-9]{2,8}){0,3}$/)
44
+ .default("en"),
45
+ gl: cleanText
46
+ .regex(/^[a-zA-Z]{2}$/)
47
+ .toLowerCase()
48
+ .default("us"),
49
+ };
50
+ const listing = {
51
+ ...playLocale,
52
+ q: (0, validation_js_1.optional)(query),
53
+ chart: (0, validation_js_1.optional)(category),
54
+ next_page_token: (0, validation_js_1.optional)(token),
55
+ section_page_token: (0, validation_js_1.optional)(token),
56
+ see_more_token: (0, validation_js_1.optional)(token),
57
+ };
58
+ exports.playApps = {
59
+ ...listing,
60
+ apps_category: (0, validation_js_1.optional)(category),
61
+ age: (0, validation_js_1.optional)(age),
62
+ store_device: (0, validation_js_1.optional)(zod_1.z.enum(["phone", "tablet", "tv", "chromebook", "watch", "car"])),
63
+ };
64
+ exports.playGames = {
65
+ ...listing,
66
+ games_category: (0, validation_js_1.optional)(category),
67
+ store_device: (0, validation_js_1.optional)(zod_1.z.enum(["phone", "tablet", "tv", "chromebook", "watch", "windows"])),
68
+ };
69
+ exports.playBooks = {
70
+ ...listing,
71
+ books_category: (0, validation_js_1.optional)(category),
72
+ age: (0, validation_js_1.optional)(age),
73
+ price: (0, validation_js_1.optional)(whole.pipe(zod_1.z.number().min(1).max(2))),
74
+ };
75
+ exports.playMovies = { ...listing, movies_category: (0, validation_js_1.optional)(category), age: (0, validation_js_1.optional)(age) };
76
+ exports.playProduct = { ...playLocale, product_id: identifier, store, season_id: (0, validation_js_1.optional)(identifier) };
77
+ exports.playReviews = {
78
+ ...playLocale,
79
+ product_id: identifier,
80
+ store,
81
+ platform: zod_1.z.enum(["phone", "tablet", "watch", "chromebook", "tv"]).default("phone"),
82
+ rating: (0, validation_js_1.optional)(whole.pipe(zod_1.z.number().min(1).max(5))),
83
+ sort_by: whole.pipe(zod_1.z.number().min(1).max(3)).default(1),
84
+ num: whole.pipe(zod_1.z.number().min(1).max(199)).default(40),
85
+ next_page_token: (0, validation_js_1.optional)(token),
86
+ };
87
+ const tokenFields = ["next_page_token", "section_page_token", "see_more_token"];
88
+ const playRules = (operation) => [
89
+ (p, c) => {
90
+ if (["apps", "games", "books", "movies"].includes(operation)) {
91
+ if ([...tokenFields, "chart"].filter((f) => p[f]).length > 1)
92
+ (0, validation_js_1.issue)(c, "chart and pagination selectors are mutually exclusive");
93
+ if (p.chart && p.q)
94
+ (0, validation_js_1.issue)(c, "chart and q are mutually exclusive");
95
+ if (p.chart && (0, validation_js_1.has)(p, "store_device") && p.store_device !== "phone")
96
+ (0, validation_js_1.issue)(c, "Device-specific storefronts do not support charts; omit chart or use phone");
97
+ const categoryValue = p[`${operation}_category`];
98
+ if (p.q && categoryValue)
99
+ (0, validation_js_1.issue)(c, "q and category are mutually exclusive");
100
+ if ((0, validation_js_1.has)(p, "store_device") && (p.q || categoryValue))
101
+ (0, validation_js_1.issue)(c, "store_device excludes q and category");
102
+ if (p.age && categoryValue !== (operation === "books" ? "coll_1689" : "FAMILY"))
103
+ (0, validation_js_1.issue)(c, "age requires the children's category");
104
+ if ((0, validation_js_1.has)(p, "price") && !p.q)
105
+ (0, validation_js_1.issue)(c, "price requires q");
106
+ }
107
+ if (p.season_id && p.store !== "tv")
108
+ (0, validation_js_1.issue)(c, "season_id requires store=tv");
109
+ const context = Object.fromEntries(Object.entries(p).filter(([key, value]) => value != null && ![...tokenFields, "chart"].includes(key)));
110
+ if (["apps", "games"].includes(operation) && !p.q && !p[`${operation}_category`])
111
+ context.store_device ??= "phone";
112
+ for (const field of tokenFields) {
113
+ const encoded = p[field];
114
+ if (typeof encoded !== "string")
115
+ continue;
116
+ const kind = field === "next_page_token"
117
+ ? operation === "reviews"
118
+ ? "reviews"
119
+ : "page"
120
+ : field === "section_page_token"
121
+ ? "section"
122
+ : "collection";
123
+ try {
124
+ if (!/^[a-zA-Z0-9+/_-]*={0,2}$/.test(encoded) || encoded.replace(/=+$/, "").length % 4 === 1)
125
+ throw new Error();
126
+ const decoded = JSON.parse(new TextDecoder("utf8", { fatal: true }).decode(Buffer.from(encoded, "base64url")));
127
+ if (!(0, errors_js_1.isObject)(decoded) ||
128
+ decoded.v !== 1 ||
129
+ decoded.operation !== operation ||
130
+ decoded.kind !== kind ||
131
+ !(0, node_util_1.isDeepStrictEqual)(decoded.context, context) ||
132
+ typeof decoded.token !== "string" ||
133
+ !/^[a-zA-Z0-9_=+/:.-]{1,12000}$/.test(decoded.token))
134
+ throw new Error();
135
+ }
136
+ catch {
137
+ (0, validation_js_1.issue)(c, "Use a returned token with the same operation and search parameters", [field]);
138
+ }
139
+ }
140
+ },
141
+ ];
142
+ exports.playRules = playRules;
143
+ 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(" "));
144
+ const appleLocale = {
145
+ country: cleanText
146
+ .regex(/^[a-zA-Z]{2}$/)
147
+ .toLowerCase()
148
+ .transform((value) => (value === "uk" ? "gb" : value))
149
+ .refine((value) => storefronts.has(value), "Choose a supported Apple storefront country")
150
+ .default("us"),
151
+ };
152
+ const productId = cleanText.regex(/^[1-9][0-9]{0,19}$/);
153
+ const quotePlus = (value) => encodeURIComponent(value)
154
+ .replace(/[!'()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`)
155
+ .replace(/%20/g, "+");
156
+ exports.appleSearch = {
157
+ ...appleLocale,
158
+ term: query.refine((value) => {
159
+ try {
160
+ return quotePlus(value).length <= 4096;
161
+ }
162
+ catch {
163
+ return false;
164
+ }
165
+ }, "Use at most 4,096 URL-encoded bytes"),
166
+ lang: cleanText
167
+ .regex(/^[a-zA-Z]{2,3}-[a-zA-Z]{2}$/)
168
+ .toLowerCase()
169
+ .default("en-us"),
170
+ num: whole.pipe(zod_1.z.number().min(1).max(200)).default(10),
171
+ disallow_explicit: zod_1.z
172
+ .union([zod_1.z.boolean(), zod_1.z.enum(["true", "false"])])
173
+ .transform((value) => value === true || value === "true")
174
+ .default(false),
175
+ property: (0, validation_js_1.optional)(zod_1.z.literal("developer")),
176
+ category_id: (0, validation_js_1.optional)(whole.pipe(zod_1.z
177
+ .number()
178
+ .min(1)
179
+ .max(2 ** 31 - 1))),
180
+ device: zod_1.z.enum(["mobile", "tablet", "desktop"]).default("mobile"),
181
+ };
182
+ exports.appleProduct = { ...appleLocale, product_id: productId, type: zod_1.z.literal("app").default("app") };
183
+ exports.appleReviews = {
184
+ ...appleLocale,
185
+ product_id: productId,
186
+ sort: zod_1.z.enum(["mostrecent", "mosthelpful"]).default("mostrecent"),
187
+ page: whole
188
+ .pipe(zod_1.z
189
+ .number()
190
+ .min(1)
191
+ .max(2 ** 31 - 1))
192
+ .default(1),
193
+ };
194
+ //# sourceMappingURL=stores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stores.js","sourceRoot":"","sources":["../../src/stores.ts"],"names":[],"mappings":"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"}