tmdb-kit 0.1.0-beta.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/dist/index.js ADDED
@@ -0,0 +1,459 @@
1
+ //#region src/errors.ts
2
+ /** Base class for all SDK-originated errors. */
3
+ var TMDBError = class extends Error {
4
+ constructor(message, options) {
5
+ super(message, options);
6
+ this.name = "TMDBError";
7
+ }
8
+ };
9
+ /** Thrown before a request is sent or when fetch itself rejects. */
10
+ var TMDBRequestError = class extends TMDBError {
11
+ constructor(message, options) {
12
+ super(message, options);
13
+ this.name = "TMDBRequestError";
14
+ }
15
+ };
16
+ /** Thrown when TMDB returns a non-2xx response. */
17
+ var TMDBResponseError = class extends TMDBError {
18
+ body;
19
+ headers;
20
+ requestId;
21
+ status;
22
+ statusCode;
23
+ statusMessage;
24
+ statusText;
25
+ url;
26
+ constructor(message, options) {
27
+ super(message);
28
+ this.name = "TMDBResponseError";
29
+ this.body = options.body;
30
+ this.headers = options.headers;
31
+ this.requestId = options.headers.get("x-request-id");
32
+ this.status = options.status;
33
+ this.statusText = options.statusText;
34
+ this.url = options.url;
35
+ const body = isErrorResponseBody(options.body) ? options.body : void 0;
36
+ this.statusCode = body?.status_code;
37
+ this.statusMessage = body?.status_message;
38
+ }
39
+ };
40
+ function createResponseError(options) {
41
+ return new TMDBResponseError((isErrorResponseBody(options.body) ? options.body : void 0)?.status_message ?? `${options.status} ${options.statusText}`.trim(), options);
42
+ }
43
+ function isErrorResponseBody(value) {
44
+ return typeof value === "object" && value !== null;
45
+ }
46
+ function appendQuery(url, query) {
47
+ for (const [key, value] of Object.entries(query)) {
48
+ if (value === void 0 || value === null) continue;
49
+ if (Array.isArray(value)) {
50
+ url.searchParams.set(key, value.map(String).join(","));
51
+ continue;
52
+ }
53
+ url.searchParams.set(key, String(value));
54
+ }
55
+ }
56
+ function withLanguage(defaults, query) {
57
+ const language = typeof query.language === "string" ? query.language : defaults.language;
58
+ return {
59
+ ...query,
60
+ language
61
+ };
62
+ }
63
+ function withListDefaults(defaults, query) {
64
+ const region = typeof query.region === "string" ? query.region : defaults.region;
65
+ return {
66
+ ...withLanguage(defaults, query),
67
+ region
68
+ };
69
+ }
70
+ function toCommaList(value) {
71
+ if (value === void 0) return;
72
+ return typeof value === "string" ? value : value.join(",");
73
+ }
74
+ function toId(value, name) {
75
+ if (!Number.isInteger(value) || value <= 0) throw new TMDBRequestError(`${name} must be a positive integer`);
76
+ return String(value);
77
+ }
78
+ function toSearchQuery(value) {
79
+ const query = value.trim();
80
+ if (query.length === 0) throw new TMDBRequestError("search query must not be empty");
81
+ return query;
82
+ }
83
+ function toTimeWindow(value) {
84
+ if (value !== "day" && value !== "week") throw new TMDBRequestError("timeWindow must be either \"day\" or \"week\"");
85
+ return value;
86
+ }
87
+ /**
88
+ * Build a full TMDB image URL from the path returned by API payloads.
89
+ * Returns null for nullish image paths so UI code can branch naturally.
90
+ */
91
+ function buildImageUrl(path, size = "original", options = {}) {
92
+ if (path === void 0 || path === null || path.trim() === "") return null;
93
+ return `${normalizeBaseUrl(options.baseUrl ?? "https://image.tmdb.org/t/p")}/${size}${path.startsWith("/") ? path : `/${path}`}`;
94
+ }
95
+ function normalizeBaseUrl(baseUrl) {
96
+ return baseUrl.replace(/\/+$/, "");
97
+ }
98
+ //#endregion
99
+ //#region src/http.ts
100
+ var TMDBHttpClient = class {
101
+ defaults;
102
+ #apiKey;
103
+ #accessToken;
104
+ #baseUrl;
105
+ #fetch;
106
+ #headers;
107
+ constructor(options) {
108
+ const accessToken = normalizeSecret("accessToken" in options ? options.accessToken : void 0);
109
+ const apiKey = normalizeSecret("apiKey" in options ? options.apiKey : void 0);
110
+ if (Boolean(accessToken) === Boolean(apiKey)) throw new TMDBRequestError("Provide exactly one of accessToken or apiKey");
111
+ const fetchImpl = options.fetch ?? globalThis.fetch?.bind(globalThis);
112
+ if (typeof fetchImpl !== "function") throw new TMDBRequestError("No fetch implementation found. Pass options.fetch in this runtime.");
113
+ this.#accessToken = accessToken;
114
+ this.#apiKey = apiKey;
115
+ this.#baseUrl = normalizeBaseUrl(options.baseUrl ?? "https://api.themoviedb.org/3");
116
+ this.#fetch = fetchImpl;
117
+ this.#headers = options.headers;
118
+ this.defaults = {
119
+ imageBaseUrl: normalizeBaseUrl(options.imageBaseUrl ?? "https://image.tmdb.org/t/p"),
120
+ language: options.defaultLanguage,
121
+ region: options.defaultRegion
122
+ };
123
+ }
124
+ async get(path, options = {}) {
125
+ const url = this.#createUrl(path, options.query ?? {});
126
+ const headers = this.#createHeaders(options.headers);
127
+ let response;
128
+ try {
129
+ response = await this.#fetch(url, {
130
+ headers,
131
+ method: "GET",
132
+ signal: options.signal
133
+ });
134
+ } catch (error) {
135
+ throw new TMDBRequestError(`TMDB request failed: ${String(error)}`, { cause: error });
136
+ }
137
+ const body = await readJson(response);
138
+ if (!response.ok) throw createResponseError({
139
+ body,
140
+ headers: response.headers,
141
+ status: response.status,
142
+ statusText: response.statusText,
143
+ url
144
+ });
145
+ return body;
146
+ }
147
+ #createHeaders(headersInit) {
148
+ const headers = new Headers(this.#headers);
149
+ const requestHeaders = new Headers(headersInit);
150
+ headers.set("Accept", "application/json");
151
+ for (const [key, value] of requestHeaders) headers.set(key, value);
152
+ if (this.#accessToken !== void 0) headers.set("Authorization", `Bearer ${this.#accessToken}`);
153
+ return headers;
154
+ }
155
+ #createUrl(path, query) {
156
+ const relativePath = path.replace(/^\/+/, "");
157
+ const url = new URL(relativePath, `${this.#baseUrl}/`);
158
+ appendQuery(url, {
159
+ ...query,
160
+ api_key: this.#apiKey
161
+ });
162
+ return url.toString();
163
+ }
164
+ };
165
+ async function readJson(response) {
166
+ const text = await response.text();
167
+ if (text.length === 0) return;
168
+ try {
169
+ return JSON.parse(text);
170
+ } catch {
171
+ return text;
172
+ }
173
+ }
174
+ function normalizeSecret(value) {
175
+ const secret = value?.trim();
176
+ return secret === "" ? void 0 : secret;
177
+ }
178
+ //#endregion
179
+ //#region src/resources/configuration.ts
180
+ var ConfigurationResource = class {
181
+ #transport;
182
+ constructor(transport) {
183
+ this.#transport = transport;
184
+ }
185
+ details() {
186
+ return this.#transport.get("/configuration");
187
+ }
188
+ countries() {
189
+ return this.#transport.get("/configuration/countries");
190
+ }
191
+ jobs() {
192
+ return this.#transport.get("/configuration/jobs");
193
+ }
194
+ languages() {
195
+ return this.#transport.get("/configuration/languages");
196
+ }
197
+ primaryTranslations() {
198
+ return this.#transport.get("/configuration/primary_translations");
199
+ }
200
+ timezones() {
201
+ return this.#transport.get("/configuration/timezones");
202
+ }
203
+ };
204
+ //#endregion
205
+ //#region src/resources/genres.ts
206
+ var GenresResource = class {
207
+ #transport;
208
+ constructor(transport) {
209
+ this.#transport = transport;
210
+ }
211
+ movies(options = {}) {
212
+ return this.#transport.get("/genre/movie/list", { query: withLanguage(this.#transport.defaults, { language: options.language }) });
213
+ }
214
+ tv(options = {}) {
215
+ return this.#transport.get("/genre/tv/list", { query: withLanguage(this.#transport.defaults, { language: options.language }) });
216
+ }
217
+ };
218
+ //#endregion
219
+ //#region src/resources/images.ts
220
+ var ImagesHelper = class {
221
+ #transport;
222
+ constructor(transport) {
223
+ this.#transport = transport;
224
+ }
225
+ url(path, size = "original") {
226
+ return buildImageUrl(path, size, { baseUrl: this.#transport.defaults.imageBaseUrl });
227
+ }
228
+ };
229
+ //#endregion
230
+ //#region src/resources/movies.ts
231
+ var MoviesResource = class {
232
+ #transport;
233
+ constructor(transport) {
234
+ this.#transport = transport;
235
+ }
236
+ popular(options = {}) {
237
+ return this.#transport.get("/movie/popular", { query: movieListQuery(this.#transport, options) });
238
+ }
239
+ topRated(options = {}) {
240
+ return this.#transport.get("/movie/top_rated", { query: movieListQuery(this.#transport, options) });
241
+ }
242
+ nowPlaying(options = {}) {
243
+ return this.#transport.get("/movie/now_playing", { query: movieListQuery(this.#transport, options) });
244
+ }
245
+ upcoming(options = {}) {
246
+ return this.#transport.get("/movie/upcoming", { query: movieListQuery(this.#transport, options) });
247
+ }
248
+ details(movieId, options = {}) {
249
+ return this.#transport.get(`/movie/${toId(movieId, "movieId")}`, { query: withLanguage(this.#transport.defaults, {
250
+ append_to_response: toCommaList(options.appendToResponse),
251
+ language: options.language
252
+ }) });
253
+ }
254
+ credits(movieId, options = {}) {
255
+ return this.#transport.get(`/movie/${toId(movieId, "movieId")}/credits`, { query: withLanguage(this.#transport.defaults, { language: options.language }) });
256
+ }
257
+ images(movieId, options = {}) {
258
+ return this.#transport.get(`/movie/${toId(movieId, "movieId")}/images`, { query: withLanguage(this.#transport.defaults, {
259
+ include_image_language: toCommaList(options.includeImageLanguage),
260
+ language: options.language
261
+ }) });
262
+ }
263
+ recommendations(movieId, options = {}) {
264
+ return this.#transport.get(`/movie/${toId(movieId, "movieId")}/recommendations`, { query: movieListQuery(this.#transport, options) });
265
+ }
266
+ similar(movieId, options = {}) {
267
+ return this.#transport.get(`/movie/${toId(movieId, "movieId")}/similar`, { query: movieListQuery(this.#transport, options) });
268
+ }
269
+ videos(movieId, options = {}) {
270
+ return this.#transport.get(`/movie/${toId(movieId, "movieId")}/videos`, { query: withLanguage(this.#transport.defaults, { language: options.language }) });
271
+ }
272
+ };
273
+ function movieListQuery(transport, options) {
274
+ return withListDefaults(transport.defaults, {
275
+ language: options.language,
276
+ page: options.page,
277
+ region: options.region
278
+ });
279
+ }
280
+ //#endregion
281
+ //#region src/resources/people.ts
282
+ var PeopleResource = class {
283
+ #transport;
284
+ constructor(transport) {
285
+ this.#transport = transport;
286
+ }
287
+ popular(options = {}) {
288
+ return this.#transport.get("/person/popular", { query: peopleListQuery(this.#transport, options) });
289
+ }
290
+ details(personId, options = {}) {
291
+ return this.#transport.get(`/person/${toId(personId, "personId")}`, { query: withLanguage(this.#transport.defaults, { language: options.language }) });
292
+ }
293
+ };
294
+ function peopleListQuery(transport, options) {
295
+ return withLanguage(transport.defaults, {
296
+ language: options.language,
297
+ page: options.page
298
+ });
299
+ }
300
+ //#endregion
301
+ //#region src/resources/search.ts
302
+ var SearchResource = class {
303
+ #transport;
304
+ constructor(transport) {
305
+ this.#transport = transport;
306
+ }
307
+ movies(query, options = {}) {
308
+ return this.#transport.get("/search/movie", { query: movieSearchQuery(this.#transport, query, options) });
309
+ }
310
+ tv(query, options = {}) {
311
+ return this.#transport.get("/search/tv", { query: tvSearchQuery(this.#transport, query, options) });
312
+ }
313
+ people(query, options = {}) {
314
+ return this.#transport.get("/search/person", { query: commonSearchQuery(this.#transport, query, options) });
315
+ }
316
+ multi(query, options = {}) {
317
+ return this.#transport.get("/search/multi", { query: commonSearchQuery(this.#transport, query, options) });
318
+ }
319
+ };
320
+ function movieSearchQuery(transport, query, options) {
321
+ return withListDefaults(transport.defaults, {
322
+ include_adult: options.includeAdult,
323
+ language: options.language,
324
+ page: options.page,
325
+ primary_release_year: options.primaryReleaseYear,
326
+ query: toSearchQuery(query),
327
+ region: options.region,
328
+ year: options.year
329
+ });
330
+ }
331
+ function tvSearchQuery(transport, query, options) {
332
+ return withLanguage(transport.defaults, {
333
+ first_air_date_year: options.firstAirDateYear,
334
+ include_adult: options.includeAdult,
335
+ language: options.language,
336
+ page: options.page,
337
+ query: toSearchQuery(query),
338
+ year: options.year
339
+ });
340
+ }
341
+ function commonSearchQuery(transport, query, options) {
342
+ return withLanguage(transport.defaults, {
343
+ include_adult: options.includeAdult,
344
+ language: options.language,
345
+ page: options.page,
346
+ query: toSearchQuery(query)
347
+ });
348
+ }
349
+ //#endregion
350
+ //#region src/resources/trending.ts
351
+ var TrendingResource = class {
352
+ #transport;
353
+ constructor(transport) {
354
+ this.#transport = transport;
355
+ }
356
+ all(timeWindow = "day", options = {}) {
357
+ return this.#transport.get(`/trending/all/${toTimeWindow(timeWindow)}`, { query: withLanguage(this.#transport.defaults, { language: options.language }) });
358
+ }
359
+ movies(timeWindow = "day", options = {}) {
360
+ return this.#transport.get(`/trending/movie/${toTimeWindow(timeWindow)}`, { query: withLanguage(this.#transport.defaults, { language: options.language }) });
361
+ }
362
+ tv(timeWindow = "day", options = {}) {
363
+ return this.#transport.get(`/trending/tv/${toTimeWindow(timeWindow)}`, { query: withLanguage(this.#transport.defaults, { language: options.language }) });
364
+ }
365
+ people(timeWindow = "day", options = {}) {
366
+ return this.#transport.get(`/trending/person/${toTimeWindow(timeWindow)}`, { query: withLanguage(this.#transport.defaults, { language: options.language }) });
367
+ }
368
+ };
369
+ //#endregion
370
+ //#region src/resources/tv.ts
371
+ var TVResource = class {
372
+ #transport;
373
+ constructor(transport) {
374
+ this.#transport = transport;
375
+ }
376
+ popular(options = {}) {
377
+ return this.#transport.get("/tv/popular", { query: tvListQuery(this.#transport, options) });
378
+ }
379
+ topRated(options = {}) {
380
+ return this.#transport.get("/tv/top_rated", { query: tvListQuery(this.#transport, options) });
381
+ }
382
+ airingToday(options = {}) {
383
+ return this.#transport.get("/tv/airing_today", { query: tvListQuery(this.#transport, options) });
384
+ }
385
+ onTheAir(options = {}) {
386
+ return this.#transport.get("/tv/on_the_air", { query: tvListQuery(this.#transport, options) });
387
+ }
388
+ details(seriesId, options = {}) {
389
+ return this.#transport.get(`/tv/${toId(seriesId, "seriesId")}`, { query: withLanguage(this.#transport.defaults, {
390
+ append_to_response: toCommaList(options.appendToResponse),
391
+ language: options.language
392
+ }) });
393
+ }
394
+ credits(seriesId, options = {}) {
395
+ return this.#transport.get(`/tv/${toId(seriesId, "seriesId")}/credits`, { query: withLanguage(this.#transport.defaults, { language: options.language }) });
396
+ }
397
+ images(seriesId, options = {}) {
398
+ return this.#transport.get(`/tv/${toId(seriesId, "seriesId")}/images`, { query: withLanguage(this.#transport.defaults, {
399
+ include_image_language: toCommaList(options.includeImageLanguage),
400
+ language: options.language
401
+ }) });
402
+ }
403
+ recommendations(seriesId, options = {}) {
404
+ return this.#transport.get(`/tv/${toId(seriesId, "seriesId")}/recommendations`, { query: tvListQuery(this.#transport, options) });
405
+ }
406
+ similar(seriesId, options = {}) {
407
+ return this.#transport.get(`/tv/${toId(seriesId, "seriesId")}/similar`, { query: tvListQuery(this.#transport, options) });
408
+ }
409
+ videos(seriesId, options = {}) {
410
+ return this.#transport.get(`/tv/${toId(seriesId, "seriesId")}/videos`, { query: withLanguage(this.#transport.defaults, { language: options.language }) });
411
+ }
412
+ };
413
+ function tvListQuery(transport, options) {
414
+ return withLanguage(transport.defaults, {
415
+ language: options.language,
416
+ page: options.page
417
+ });
418
+ }
419
+ //#endregion
420
+ //#region src/client.ts
421
+ /**
422
+ * Main SDK entry point.
423
+ *
424
+ * Resource properties are intentionally small and explicit. The SDK focuses on
425
+ * common TMDB workflows first, while request<T>() keeps uncommon endpoints easy
426
+ * to call without waiting for a generated surface area.
427
+ */
428
+ var TMDBClient = class {
429
+ configuration;
430
+ genres;
431
+ images;
432
+ movies;
433
+ people;
434
+ search;
435
+ trending;
436
+ tv;
437
+ #http;
438
+ constructor(options) {
439
+ this.#http = new TMDBHttpClient(options);
440
+ this.configuration = new ConfigurationResource(this.#http);
441
+ this.genres = new GenresResource(this.#http);
442
+ this.images = new ImagesHelper(this.#http);
443
+ this.movies = new MoviesResource(this.#http);
444
+ this.people = new PeopleResource(this.#http);
445
+ this.search = new SearchResource(this.#http);
446
+ this.trending = new TrendingResource(this.#http);
447
+ this.tv = new TVResource(this.#http);
448
+ }
449
+ request(path, options) {
450
+ return this.#http.get(path, options);
451
+ }
452
+ };
453
+ function createTMDB(options) {
454
+ return new TMDBClient(options);
455
+ }
456
+ //#endregion
457
+ export { TMDBClient, TMDBError, TMDBRequestError, TMDBResponseError, buildImageUrl, createTMDB };
458
+
459
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["#apiKey","#accessToken","#baseUrl","#fetch","#headers","#createUrl","#createHeaders","#transport","#transport","#transport","#transport","#transport","#transport","#transport","#transport","#http"],"sources":["../src/errors.ts","../src/query.ts","../src/http.ts","../src/resources/configuration.ts","../src/resources/genres.ts","../src/resources/images.ts","../src/resources/movies.ts","../src/resources/people.ts","../src/resources/search.ts","../src/resources/trending.ts","../src/resources/tv.ts","../src/client.ts"],"sourcesContent":["import type { JsonValue } from './types'\n\nexport interface TMDBErrorResponseBody {\n success?: boolean\n status_code?: number\n status_message?: string\n}\n\nexport interface TMDBResponseErrorOptions {\n body: JsonValue | undefined\n headers: Headers\n status: number\n statusText: string\n url: string\n}\n\n/** Base class for all SDK-originated errors. */\nexport class TMDBError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'TMDBError'\n }\n}\n\n/** Thrown before a request is sent or when fetch itself rejects. */\nexport class TMDBRequestError extends TMDBError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'TMDBRequestError'\n }\n}\n\n/** Thrown when TMDB returns a non-2xx response. */\nexport class TMDBResponseError extends TMDBError {\n readonly body: JsonValue | undefined\n readonly headers: Headers\n readonly requestId: string | null\n readonly status: number\n readonly statusCode: number | undefined\n readonly statusMessage: string | undefined\n readonly statusText: string\n readonly url: string\n\n constructor(message: string, options: TMDBResponseErrorOptions) {\n super(message)\n this.name = 'TMDBResponseError'\n this.body = options.body\n this.headers = options.headers\n this.requestId = options.headers.get('x-request-id')\n this.status = options.status\n this.statusText = options.statusText\n this.url = options.url\n\n const body = isErrorResponseBody(options.body) ? options.body : undefined\n this.statusCode = body?.status_code\n this.statusMessage = body?.status_message\n }\n}\n\nexport function createResponseError(options: TMDBResponseErrorOptions): TMDBResponseError {\n const body = isErrorResponseBody(options.body) ? options.body : undefined\n const message = body?.status_message ?? `${options.status} ${options.statusText}`.trim()\n\n return new TMDBResponseError(message, options)\n}\n\nfunction isErrorResponseBody(value: unknown): value is TMDBErrorResponseBody {\n return typeof value === 'object' && value !== null\n}\n","import { TMDBRequestError } from './errors'\nimport type { ImageSize, RegionCode, LanguageCode, TrendingTimeWindow } from './types'\n\nexport type QueryPrimitive = string | number | boolean\nexport type QueryValue = QueryPrimitive | readonly QueryPrimitive[] | null | undefined\nexport type QueryParams = Record<string, QueryValue>\n\nexport interface QueryDefaults {\n language?: LanguageCode\n region?: RegionCode\n}\n\nexport const DEFAULT_API_BASE_URL = 'https://api.themoviedb.org/3'\nexport const DEFAULT_IMAGE_BASE_URL = 'https://image.tmdb.org/t/p'\n\nexport function appendQuery(url: URL, query: QueryParams): void {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) {\n continue\n }\n\n if (Array.isArray(value)) {\n url.searchParams.set(key, value.map(String).join(','))\n continue\n }\n\n url.searchParams.set(key, String(value))\n }\n}\n\nexport function withLanguage(\n defaults: QueryDefaults,\n query: QueryParams,\n): QueryParams {\n const language = typeof query.language === 'string' ? query.language : defaults.language\n\n return {\n ...query,\n language,\n }\n}\n\nexport function withListDefaults(\n defaults: QueryDefaults,\n query: QueryParams,\n): QueryParams {\n const region = typeof query.region === 'string' ? query.region : defaults.region\n\n return {\n ...withLanguage(defaults, query),\n region,\n }\n}\n\nexport function toCommaList(value: string | readonly string[] | undefined): string | undefined {\n if (value === undefined) {\n return undefined\n }\n\n return typeof value === 'string' ? value : value.join(',')\n}\n\nexport function toId(value: number, name: string): string {\n if (!Number.isInteger(value) || value <= 0) {\n throw new TMDBRequestError(`${name} must be a positive integer`)\n }\n\n return String(value)\n}\n\nexport function toSearchQuery(value: string): string {\n const query = value.trim()\n\n if (query.length === 0) {\n throw new TMDBRequestError('search query must not be empty')\n }\n\n return query\n}\n\nexport function toTimeWindow(value: TrendingTimeWindow): TrendingTimeWindow {\n if (value !== 'day' && value !== 'week') {\n throw new TMDBRequestError('timeWindow must be either \"day\" or \"week\"')\n }\n\n return value\n}\n\nexport interface BuildImageUrlOptions {\n baseUrl?: string\n}\n\n/**\n * Build a full TMDB image URL from the path returned by API payloads.\n * Returns null for nullish image paths so UI code can branch naturally.\n */\nexport function buildImageUrl(\n path: string | null | undefined,\n size: ImageSize = 'original',\n options: BuildImageUrlOptions = {},\n): string | null {\n if (path === undefined || path === null || path.trim() === '') {\n return null\n }\n\n const baseUrl = normalizeBaseUrl(options.baseUrl ?? DEFAULT_IMAGE_BASE_URL)\n const normalizedPath = path.startsWith('/') ? path : `/${path}`\n\n return `${baseUrl}/${size}${normalizedPath}`\n}\n\nexport function normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, '')\n}\n","import { createResponseError, TMDBRequestError } from './errors'\nimport {\n appendQuery,\n DEFAULT_API_BASE_URL,\n DEFAULT_IMAGE_BASE_URL,\n normalizeBaseUrl,\n type QueryDefaults,\n type QueryParams,\n} from './query'\nimport type { JsonValue, LanguageCode, RegionCode } from './types'\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>\n\nexport interface TMDBAccessTokenAuth {\n /** TMDB API Read Access Token. Sent as an Authorization Bearer header. */\n accessToken: string\n apiKey?: never\n}\n\nexport interface TMDBApiKeyAuth {\n /** Legacy v3 API key. Sent as api_key query parameter. */\n apiKey: string\n accessToken?: never\n}\n\nexport type TMDBAuth = TMDBAccessTokenAuth | TMDBApiKeyAuth\n\nexport interface TMDBClientDefaults extends QueryDefaults {\n imageBaseUrl: string\n}\n\nexport type TMDBClientOptions = TMDBAuth & {\n /** Defaults to https://api.themoviedb.org/3. Useful for tests or proxies. */\n baseUrl?: string\n /** Inject a fetch implementation for tests, custom runtimes, or instrumentation. */\n fetch?: FetchLike\n /** Default language for endpoints that accept a language query parameter. */\n defaultLanguage?: LanguageCode\n /** Default region for movie list/search endpoints that accept a region query parameter. */\n defaultRegion?: RegionCode\n /** Custom image host. Defaults to https://image.tmdb.org/t/p. */\n imageBaseUrl?: string\n /** Additional headers merged into every request before authentication is applied. */\n headers?: HeadersInit\n}\n\nexport interface TMDBRequestOptions {\n headers?: HeadersInit\n query?: QueryParams\n signal?: AbortSignal\n}\n\nexport interface TMDBTransport {\n readonly defaults: TMDBClientDefaults\n get<T>(path: string, options?: TMDBRequestOptions): Promise<T>\n}\n\nexport class TMDBHttpClient implements TMDBTransport {\n readonly defaults: TMDBClientDefaults\n\n readonly #apiKey: string | undefined\n readonly #accessToken: string | undefined\n readonly #baseUrl: string\n readonly #fetch: FetchLike\n readonly #headers: HeadersInit | undefined\n\n constructor(options: TMDBClientOptions) {\n const accessToken = normalizeSecret('accessToken' in options ? options.accessToken : undefined)\n const apiKey = normalizeSecret('apiKey' in options ? options.apiKey : undefined)\n\n if (Boolean(accessToken) === Boolean(apiKey)) {\n throw new TMDBRequestError('Provide exactly one of accessToken or apiKey')\n }\n\n const fetchImpl = options.fetch ?? globalThis.fetch?.bind(globalThis)\n\n if (typeof fetchImpl !== 'function') {\n throw new TMDBRequestError('No fetch implementation found. Pass options.fetch in this runtime.')\n }\n\n this.#accessToken = accessToken\n this.#apiKey = apiKey\n this.#baseUrl = normalizeBaseUrl(options.baseUrl ?? DEFAULT_API_BASE_URL)\n this.#fetch = fetchImpl\n this.#headers = options.headers\n this.defaults = {\n imageBaseUrl: normalizeBaseUrl(options.imageBaseUrl ?? DEFAULT_IMAGE_BASE_URL),\n language: options.defaultLanguage,\n region: options.defaultRegion,\n }\n }\n\n async get<T>(path: string, options: TMDBRequestOptions = {}): Promise<T> {\n const url = this.#createUrl(path, options.query ?? {})\n const headers = this.#createHeaders(options.headers)\n\n let response: Response\n\n try {\n response = await this.#fetch(url, {\n headers,\n method: 'GET',\n signal: options.signal,\n })\n } catch (error) {\n throw new TMDBRequestError(`TMDB request failed: ${String(error)}`, { cause: error })\n }\n\n const body = await readJson(response)\n\n if (!response.ok) {\n throw createResponseError({\n body,\n headers: response.headers,\n status: response.status,\n statusText: response.statusText,\n url,\n })\n }\n\n return body as T\n }\n\n #createHeaders(headersInit: HeadersInit | undefined): Headers {\n const headers = new Headers(this.#headers)\n const requestHeaders = new Headers(headersInit)\n\n headers.set('Accept', 'application/json')\n\n for (const [key, value] of requestHeaders) {\n headers.set(key, value)\n }\n\n if (this.#accessToken !== undefined) {\n headers.set('Authorization', `Bearer ${this.#accessToken}`)\n }\n\n return headers\n }\n\n #createUrl(path: string, query: QueryParams): string {\n const relativePath = path.replace(/^\\/+/, '')\n const url = new URL(relativePath, `${this.#baseUrl}/`)\n\n appendQuery(url, {\n ...query,\n api_key: this.#apiKey,\n })\n\n return url.toString()\n }\n}\n\nasync function readJson(response: Response): Promise<JsonValue | undefined> {\n const text = await response.text()\n\n if (text.length === 0) {\n return undefined\n }\n\n try {\n return JSON.parse(text) as JsonValue\n } catch {\n return text\n }\n}\n\nfunction normalizeSecret(value: string | undefined): string | undefined {\n const secret = value?.trim()\n return secret === '' ? undefined : secret\n}\n","import type { TMDBTransport } from '../http'\nimport type { Configuration, Country, JobDepartment, Language, Timezone } from '../types'\n\nexport class ConfigurationResource {\n readonly #transport: TMDBTransport\n\n constructor(transport: TMDBTransport) {\n this.#transport = transport\n }\n\n details(): Promise<Configuration> {\n return this.#transport.get('/configuration')\n }\n\n countries(): Promise<Country[]> {\n return this.#transport.get('/configuration/countries')\n }\n\n jobs(): Promise<JobDepartment[]> {\n return this.#transport.get('/configuration/jobs')\n }\n\n languages(): Promise<Language[]> {\n return this.#transport.get('/configuration/languages')\n }\n\n primaryTranslations(): Promise<string[]> {\n return this.#transport.get('/configuration/primary_translations')\n }\n\n timezones(): Promise<Timezone[]> {\n return this.#transport.get('/configuration/timezones')\n }\n}\n","import type { TMDBTransport } from '../http'\nimport { withLanguage } from '../query'\nimport type { GenresResponse, LanguageOptions } from '../types'\n\nexport class GenresResource {\n readonly #transport: TMDBTransport\n\n constructor(transport: TMDBTransport) {\n this.#transport = transport\n }\n\n movies(options: LanguageOptions = {}): Promise<GenresResponse> {\n return this.#transport.get('/genre/movie/list', {\n query: withLanguage(this.#transport.defaults, {\n language: options.language,\n }),\n })\n }\n\n tv(options: LanguageOptions = {}): Promise<GenresResponse> {\n return this.#transport.get('/genre/tv/list', {\n query: withLanguage(this.#transport.defaults, {\n language: options.language,\n }),\n })\n }\n}\n","import type { TMDBTransport } from '../http'\nimport { buildImageUrl } from '../query'\nimport type { ImageSize } from '../types'\n\nexport class ImagesHelper {\n readonly #transport: TMDBTransport\n\n constructor(transport: TMDBTransport) {\n this.#transport = transport\n }\n\n url(path: string | null | undefined, size: ImageSize = 'original'): string | null {\n return buildImageUrl(path, size, {\n baseUrl: this.#transport.defaults.imageBaseUrl,\n })\n }\n}\n","import type { TMDBTransport } from '../http'\nimport { toCommaList, toId, withLanguage, withListDefaults, type QueryParams } from '../query'\nimport type {\n CreditsResponse,\n ImageQueryOptions,\n ImagesResponse,\n ListOptions,\n MovieDetails,\n MovieDetailsOptions,\n MovieSummary,\n PagedResponse,\n TMDBObject,\n VideosResponse,\n} from '../types'\n\nexport class MoviesResource {\n readonly #transport: TMDBTransport\n\n constructor(transport: TMDBTransport) {\n this.#transport = transport\n }\n\n popular(options: ListOptions = {}): Promise<PagedResponse<MovieSummary>> {\n return this.#transport.get('/movie/popular', {\n query: movieListQuery(this.#transport, options),\n })\n }\n\n topRated(options: ListOptions = {}): Promise<PagedResponse<MovieSummary>> {\n return this.#transport.get('/movie/top_rated', {\n query: movieListQuery(this.#transport, options),\n })\n }\n\n nowPlaying(options: ListOptions = {}): Promise<PagedResponse<MovieSummary>> {\n return this.#transport.get('/movie/now_playing', {\n query: movieListQuery(this.#transport, options),\n })\n }\n\n upcoming(options: ListOptions = {}): Promise<PagedResponse<MovieSummary>> {\n return this.#transport.get('/movie/upcoming', {\n query: movieListQuery(this.#transport, options),\n })\n }\n\n details<TAppend extends TMDBObject = TMDBObject>(\n movieId: number,\n options: MovieDetailsOptions = {},\n ): Promise<MovieDetails & TAppend> {\n return this.#transport.get(`/movie/${toId(movieId, 'movieId')}`, {\n query: withLanguage(this.#transport.defaults, {\n append_to_response: toCommaList(options.appendToResponse),\n language: options.language,\n }),\n })\n }\n\n credits(movieId: number, options: Pick<ListOptions, 'language'> = {}): Promise<CreditsResponse> {\n return this.#transport.get(`/movie/${toId(movieId, 'movieId')}/credits`, {\n query: withLanguage(this.#transport.defaults, {\n language: options.language,\n }),\n })\n }\n\n images(movieId: number, options: ImageQueryOptions = {}): Promise<ImagesResponse> {\n return this.#transport.get(`/movie/${toId(movieId, 'movieId')}/images`, {\n query: withLanguage(this.#transport.defaults, {\n include_image_language: toCommaList(options.includeImageLanguage),\n language: options.language,\n }),\n })\n }\n\n recommendations(movieId: number, options: ListOptions = {}): Promise<PagedResponse<MovieSummary>> {\n return this.#transport.get(`/movie/${toId(movieId, 'movieId')}/recommendations`, {\n query: movieListQuery(this.#transport, options),\n })\n }\n\n similar(movieId: number, options: ListOptions = {}): Promise<PagedResponse<MovieSummary>> {\n return this.#transport.get(`/movie/${toId(movieId, 'movieId')}/similar`, {\n query: movieListQuery(this.#transport, options),\n })\n }\n\n videos(movieId: number, options: Pick<ListOptions, 'language'> = {}): Promise<VideosResponse> {\n return this.#transport.get(`/movie/${toId(movieId, 'movieId')}/videos`, {\n query: withLanguage(this.#transport.defaults, {\n language: options.language,\n }),\n })\n }\n}\n\nfunction movieListQuery(transport: TMDBTransport, options: ListOptions): QueryParams {\n return withListDefaults(transport.defaults, {\n language: options.language,\n page: options.page,\n region: options.region,\n })\n}\n","import type { TMDBTransport } from '../http'\nimport { toId, withLanguage, type QueryParams } from '../query'\nimport type { LanguageOptions, ListOptions, PagedResponse, PersonDetails, PersonSummary } from '../types'\n\nexport class PeopleResource {\n readonly #transport: TMDBTransport\n\n constructor(transport: TMDBTransport) {\n this.#transport = transport\n }\n\n popular(options: Omit<ListOptions, 'region'> = {}): Promise<PagedResponse<PersonSummary>> {\n return this.#transport.get('/person/popular', {\n query: peopleListQuery(this.#transport, options),\n })\n }\n\n details(personId: number, options: LanguageOptions = {}): Promise<PersonDetails> {\n return this.#transport.get(`/person/${toId(personId, 'personId')}`, {\n query: withLanguage(this.#transport.defaults, {\n language: options.language,\n }),\n })\n }\n}\n\nfunction peopleListQuery(\n transport: TMDBTransport,\n options: Omit<ListOptions, 'region'>,\n): QueryParams {\n return withLanguage(transport.defaults, {\n language: options.language,\n page: options.page,\n })\n}\n","import type { TMDBTransport } from '../http'\nimport { toSearchQuery, withLanguage, withListDefaults, type QueryParams } from '../query'\nimport type {\n MovieSearchOptions,\n MovieSearchResult,\n MultiSearchOptions,\n PagedResponse,\n PersonSearchResult,\n SearchMultiResult,\n TVSearchOptions,\n TVSearchResult,\n} from '../types'\n\nexport class SearchResource {\n readonly #transport: TMDBTransport\n\n constructor(transport: TMDBTransport) {\n this.#transport = transport\n }\n\n movies(query: string, options: MovieSearchOptions = {}): Promise<PagedResponse<MovieSearchResult>> {\n return this.#transport.get('/search/movie', {\n query: movieSearchQuery(this.#transport, query, options),\n })\n }\n\n tv(query: string, options: TVSearchOptions = {}): Promise<PagedResponse<TVSearchResult>> {\n return this.#transport.get('/search/tv', {\n query: tvSearchQuery(this.#transport, query, options),\n })\n }\n\n people(query: string, options: MultiSearchOptions = {}): Promise<PagedResponse<PersonSearchResult>> {\n return this.#transport.get('/search/person', {\n query: commonSearchQuery(this.#transport, query, options),\n })\n }\n\n multi(query: string, options: MultiSearchOptions = {}): Promise<PagedResponse<SearchMultiResult>> {\n return this.#transport.get('/search/multi', {\n query: commonSearchQuery(this.#transport, query, options),\n })\n }\n}\n\nfunction movieSearchQuery(\n transport: TMDBTransport,\n query: string,\n options: MovieSearchOptions,\n): QueryParams {\n return withListDefaults(transport.defaults, {\n include_adult: options.includeAdult,\n language: options.language,\n page: options.page,\n primary_release_year: options.primaryReleaseYear,\n query: toSearchQuery(query),\n region: options.region,\n year: options.year,\n })\n}\n\nfunction tvSearchQuery(\n transport: TMDBTransport,\n query: string,\n options: TVSearchOptions,\n): QueryParams {\n return withLanguage(transport.defaults, {\n first_air_date_year: options.firstAirDateYear,\n include_adult: options.includeAdult,\n language: options.language,\n page: options.page,\n query: toSearchQuery(query),\n year: options.year,\n })\n}\n\nfunction commonSearchQuery(\n transport: TMDBTransport,\n query: string,\n options: MultiSearchOptions,\n): QueryParams {\n return withLanguage(transport.defaults, {\n include_adult: options.includeAdult,\n language: options.language,\n page: options.page,\n query: toSearchQuery(query),\n })\n}\n","import type { TMDBTransport } from '../http'\nimport { toTimeWindow, withLanguage } from '../query'\nimport type {\n LanguageOptions,\n MovieSummary,\n PagedResponse,\n PersonSummary,\n TrendingResult,\n TrendingTimeWindow,\n TVSummary,\n} from '../types'\n\nexport class TrendingResource {\n readonly #transport: TMDBTransport\n\n constructor(transport: TMDBTransport) {\n this.#transport = transport\n }\n\n all(\n timeWindow: TrendingTimeWindow = 'day',\n options: LanguageOptions = {},\n ): Promise<PagedResponse<TrendingResult>> {\n return this.#transport.get(`/trending/all/${toTimeWindow(timeWindow)}`, {\n query: withLanguage(this.#transport.defaults, {\n language: options.language,\n }),\n })\n }\n\n movies(\n timeWindow: TrendingTimeWindow = 'day',\n options: LanguageOptions = {},\n ): Promise<PagedResponse<MovieSummary & { media_type?: 'movie' }>> {\n return this.#transport.get(`/trending/movie/${toTimeWindow(timeWindow)}`, {\n query: withLanguage(this.#transport.defaults, {\n language: options.language,\n }),\n })\n }\n\n tv(\n timeWindow: TrendingTimeWindow = 'day',\n options: LanguageOptions = {},\n ): Promise<PagedResponse<TVSummary & { media_type?: 'tv' }>> {\n return this.#transport.get(`/trending/tv/${toTimeWindow(timeWindow)}`, {\n query: withLanguage(this.#transport.defaults, {\n language: options.language,\n }),\n })\n }\n\n people(\n timeWindow: TrendingTimeWindow = 'day',\n options: LanguageOptions = {},\n ): Promise<PagedResponse<PersonSummary & { media_type?: 'person' }>> {\n return this.#transport.get(`/trending/person/${toTimeWindow(timeWindow)}`, {\n query: withLanguage(this.#transport.defaults, {\n language: options.language,\n }),\n })\n }\n}\n","import type { TMDBTransport } from '../http'\nimport { toCommaList, toId, withLanguage, type QueryParams } from '../query'\nimport type {\n CreditsResponse,\n ImageQueryOptions,\n ImagesResponse,\n LanguageOptions,\n ListOptions,\n PagedResponse,\n TMDBObject,\n TVDetails,\n TVDetailsOptions,\n TVSummary,\n VideosResponse,\n} from '../types'\n\nexport class TVResource {\n readonly #transport: TMDBTransport\n\n constructor(transport: TMDBTransport) {\n this.#transport = transport\n }\n\n popular(options: Omit<ListOptions, 'region'> = {}): Promise<PagedResponse<TVSummary>> {\n return this.#transport.get('/tv/popular', {\n query: tvListQuery(this.#transport, options),\n })\n }\n\n topRated(options: Omit<ListOptions, 'region'> = {}): Promise<PagedResponse<TVSummary>> {\n return this.#transport.get('/tv/top_rated', {\n query: tvListQuery(this.#transport, options),\n })\n }\n\n airingToday(options: Omit<ListOptions, 'region'> = {}): Promise<PagedResponse<TVSummary>> {\n return this.#transport.get('/tv/airing_today', {\n query: tvListQuery(this.#transport, options),\n })\n }\n\n onTheAir(options: Omit<ListOptions, 'region'> = {}): Promise<PagedResponse<TVSummary>> {\n return this.#transport.get('/tv/on_the_air', {\n query: tvListQuery(this.#transport, options),\n })\n }\n\n details<TAppend extends TMDBObject = TMDBObject>(\n seriesId: number,\n options: TVDetailsOptions = {},\n ): Promise<TVDetails & TAppend> {\n return this.#transport.get(`/tv/${toId(seriesId, 'seriesId')}`, {\n query: withLanguage(this.#transport.defaults, {\n append_to_response: toCommaList(options.appendToResponse),\n language: options.language,\n }),\n })\n }\n\n credits(seriesId: number, options: LanguageOptions = {}): Promise<CreditsResponse> {\n return this.#transport.get(`/tv/${toId(seriesId, 'seriesId')}/credits`, {\n query: withLanguage(this.#transport.defaults, {\n language: options.language,\n }),\n })\n }\n\n images(seriesId: number, options: ImageQueryOptions = {}): Promise<ImagesResponse> {\n return this.#transport.get(`/tv/${toId(seriesId, 'seriesId')}/images`, {\n query: withLanguage(this.#transport.defaults, {\n include_image_language: toCommaList(options.includeImageLanguage),\n language: options.language,\n }),\n })\n }\n\n recommendations(seriesId: number, options: Omit<ListOptions, 'region'> = {}): Promise<PagedResponse<TVSummary>> {\n return this.#transport.get(`/tv/${toId(seriesId, 'seriesId')}/recommendations`, {\n query: tvListQuery(this.#transport, options),\n })\n }\n\n similar(seriesId: number, options: Omit<ListOptions, 'region'> = {}): Promise<PagedResponse<TVSummary>> {\n return this.#transport.get(`/tv/${toId(seriesId, 'seriesId')}/similar`, {\n query: tvListQuery(this.#transport, options),\n })\n }\n\n videos(seriesId: number, options: LanguageOptions = {}): Promise<VideosResponse> {\n return this.#transport.get(`/tv/${toId(seriesId, 'seriesId')}/videos`, {\n query: withLanguage(this.#transport.defaults, {\n language: options.language,\n }),\n })\n }\n}\n\nfunction tvListQuery(\n transport: TMDBTransport,\n options: Omit<ListOptions, 'region'>,\n): QueryParams {\n return withLanguage(transport.defaults, {\n language: options.language,\n page: options.page,\n })\n}\n","import { TMDBHttpClient, type TMDBClientOptions, type TMDBRequestOptions } from './http'\nimport { ConfigurationResource } from './resources/configuration'\nimport { GenresResource } from './resources/genres'\nimport { ImagesHelper } from './resources/images'\nimport { MoviesResource } from './resources/movies'\nimport { PeopleResource } from './resources/people'\nimport { SearchResource } from './resources/search'\nimport { TrendingResource } from './resources/trending'\nimport { TVResource } from './resources/tv'\n\n/**\n * Main SDK entry point.\n *\n * Resource properties are intentionally small and explicit. The SDK focuses on\n * common TMDB workflows first, while request<T>() keeps uncommon endpoints easy\n * to call without waiting for a generated surface area.\n */\nexport class TMDBClient {\n readonly configuration: ConfigurationResource\n readonly genres: GenresResource\n readonly images: ImagesHelper\n readonly movies: MoviesResource\n readonly people: PeopleResource\n readonly search: SearchResource\n readonly trending: TrendingResource\n readonly tv: TVResource\n\n readonly #http: TMDBHttpClient\n\n constructor(options: TMDBClientOptions) {\n this.#http = new TMDBHttpClient(options)\n\n this.configuration = new ConfigurationResource(this.#http)\n this.genres = new GenresResource(this.#http)\n this.images = new ImagesHelper(this.#http)\n this.movies = new MoviesResource(this.#http)\n this.people = new PeopleResource(this.#http)\n this.search = new SearchResource(this.#http)\n this.trending = new TrendingResource(this.#http)\n this.tv = new TVResource(this.#http)\n }\n\n request<T>(path: string, options?: TMDBRequestOptions): Promise<T> {\n return this.#http.get<T>(path, options)\n }\n}\n\nexport function createTMDB(options: TMDBClientOptions): TMDBClient {\n return new TMDBClient(options)\n}\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "tmdb-kit",
3
+ "type": "module",
4
+ "version": "0.1.0-beta.0",
5
+ "description": "A tiny, typed, zero-runtime-dependency TMDB SDK for Node.js, Bun, Deno, and edge runtimes.",
6
+ "author": "isaced",
7
+ "license": "MIT",
8
+ "homepage": "https://github.com/isaced/tmdb-sdk#readme",
9
+ "keywords": [
10
+ "tmdb",
11
+ "themoviedb",
12
+ "sdk",
13
+ "typescript",
14
+ "node",
15
+ "bun",
16
+ "deno",
17
+ "edge",
18
+ "esm",
19
+ "cjs"
20
+ ],
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/isaced/tmdb-sdk.git"
24
+ },
25
+ "bugs": {
26
+ "url": "https://github.com/isaced/tmdb-sdk/issues"
27
+ },
28
+ "sideEffects": false,
29
+ "engines": {
30
+ "node": ">=18"
31
+ },
32
+ "packageManager": "npm@11.12.1",
33
+ "exports": {
34
+ ".": {
35
+ "import": {
36
+ "types": "./dist/index.d.ts",
37
+ "default": "./dist/index.js"
38
+ },
39
+ "require": {
40
+ "types": "./dist/index.d.cts",
41
+ "default": "./dist/index.cjs"
42
+ },
43
+ "default": "./dist/index.js"
44
+ },
45
+ "./package.json": "./package.json"
46
+ },
47
+ "main": "./dist/index.cjs",
48
+ "module": "./dist/index.js",
49
+ "types": "./dist/index.d.ts",
50
+ "files": [
51
+ "dist",
52
+ "README.md"
53
+ ],
54
+ "publishConfig": {
55
+ "access": "public",
56
+ "provenance": true
57
+ },
58
+ "scripts": {
59
+ "build": "tsdown",
60
+ "dev": "tsdown --watch",
61
+ "test": "vitest run",
62
+ "test:watch": "vitest",
63
+ "test:coverage": "vitest run --coverage",
64
+ "typecheck": "tsc --noEmit",
65
+ "ci": "npm run typecheck && npm run test:coverage && npm run build",
66
+ "release": "bumpp",
67
+ "prepublishOnly": "npm run ci"
68
+ },
69
+ "devDependencies": {
70
+ "@types/node": "^25.6.2",
71
+ "@vitest/coverage-v8": "^4.1.5",
72
+ "@typescript/native-preview": "7.0.0-dev.20260509.2",
73
+ "bumpp": "^11.1.0",
74
+ "tsdown": "^0.22.0",
75
+ "typescript": "^6.0.3",
76
+ "vitest": "^4.1.5"
77
+ }
78
+ }