@techcake/broadcake-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.
- package/README.md +201 -0
- package/dist/index.cjs +219 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +350 -0
- package/dist/index.d.ts +350 -0
- package/dist/index.js +191 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// src/errors.ts
|
|
2
|
+
var BroadcakeError = class extends Error {
|
|
3
|
+
constructor(status, message, endpoint, body) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "BroadcakeError";
|
|
6
|
+
this.status = status;
|
|
7
|
+
this.endpoint = endpoint;
|
|
8
|
+
this.body = body;
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
// src/subscribe.ts
|
|
13
|
+
function createNowPlayingSubscribe(fetcher) {
|
|
14
|
+
return (callback, options) => {
|
|
15
|
+
const interval = options?.interval ?? 1e4;
|
|
16
|
+
let active = true;
|
|
17
|
+
let timer;
|
|
18
|
+
const poll = async () => {
|
|
19
|
+
if (!active) return;
|
|
20
|
+
try {
|
|
21
|
+
const data = await fetcher();
|
|
22
|
+
if (active) {
|
|
23
|
+
try {
|
|
24
|
+
callback(data);
|
|
25
|
+
} catch {
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
} catch {
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
timer = setInterval(poll, interval);
|
|
32
|
+
poll();
|
|
33
|
+
return () => {
|
|
34
|
+
active = false;
|
|
35
|
+
if (timer !== void 0) clearInterval(timer);
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// src/client.ts
|
|
41
|
+
var DEFAULT_BASE_URL = "https://app.broadcake.com";
|
|
42
|
+
var SLUG_PATTERN = /^[a-z0-9][a-z0-9._-]*$/i;
|
|
43
|
+
function validateSlug(value, name) {
|
|
44
|
+
if (!value?.trim()) {
|
|
45
|
+
throw new TypeError(`${name} must be a non-empty string`);
|
|
46
|
+
}
|
|
47
|
+
if (!SLUG_PATTERN.test(value)) {
|
|
48
|
+
throw new TypeError(`${name} contains invalid characters`);
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
var Broadcake = class {
|
|
53
|
+
constructor(stationSlug, options) {
|
|
54
|
+
this.stationSlug = validateSlug(stationSlug, "stationSlug");
|
|
55
|
+
this.baseUrl = (options?.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
56
|
+
const fetcher = () => this.request(this.stationPath("/now-playing"));
|
|
57
|
+
const fn = (() => fetcher());
|
|
58
|
+
fn.subscribe = createNowPlayingSubscribe(fetcher);
|
|
59
|
+
this.nowPlaying = fn;
|
|
60
|
+
}
|
|
61
|
+
// ── Internal ─────────────────────────────────────────────────────────────
|
|
62
|
+
async request(path, init) {
|
|
63
|
+
const endpoint = `${this.baseUrl}${path}`;
|
|
64
|
+
let res;
|
|
65
|
+
try {
|
|
66
|
+
res = await fetch(endpoint, init);
|
|
67
|
+
} catch (err) {
|
|
68
|
+
throw new BroadcakeError(
|
|
69
|
+
0,
|
|
70
|
+
err instanceof Error ? err.message : "Network error",
|
|
71
|
+
endpoint
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
if (!res.ok) {
|
|
75
|
+
let body;
|
|
76
|
+
try {
|
|
77
|
+
body = await res.json();
|
|
78
|
+
} catch {
|
|
79
|
+
body = null;
|
|
80
|
+
}
|
|
81
|
+
const message = body && typeof body === "object" && "error" in body ? String(body.error) : `HTTP ${res.status}`;
|
|
82
|
+
throw new BroadcakeError(res.status, message, endpoint, body);
|
|
83
|
+
}
|
|
84
|
+
return res.json();
|
|
85
|
+
}
|
|
86
|
+
post(path, data) {
|
|
87
|
+
return this.request(path, {
|
|
88
|
+
method: "POST",
|
|
89
|
+
headers: { "Content-Type": "application/json" },
|
|
90
|
+
body: JSON.stringify(data)
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
stationPath(suffix = "") {
|
|
94
|
+
return `/api/v1/stations/${this.stationSlug}${suffix}`;
|
|
95
|
+
}
|
|
96
|
+
// ── Stations ─────────────────────────────────────────────────────────────
|
|
97
|
+
/** List all stations. */
|
|
98
|
+
async stations() {
|
|
99
|
+
return this.request("/api/v1/stations");
|
|
100
|
+
}
|
|
101
|
+
/** Get this station's details. */
|
|
102
|
+
async station() {
|
|
103
|
+
return this.request(this.stationPath());
|
|
104
|
+
}
|
|
105
|
+
async schedule(dateOrRange) {
|
|
106
|
+
if (typeof dateOrRange === "string") {
|
|
107
|
+
return this.request(this.stationPath(`/schedule/${dateOrRange}`));
|
|
108
|
+
}
|
|
109
|
+
const params = new URLSearchParams({ from: dateOrRange.from });
|
|
110
|
+
if (dateOrRange.to) params.set("to", dateOrRange.to);
|
|
111
|
+
return this.request(this.stationPath(`/schedule?${params}`));
|
|
112
|
+
}
|
|
113
|
+
/** Get today's schedule (auto-resolves date in station timezone). */
|
|
114
|
+
async scheduleToday() {
|
|
115
|
+
return this.request(this.stationPath("/schedule/today"));
|
|
116
|
+
}
|
|
117
|
+
// ── Shows ────────────────────────────────────────────────────────────────
|
|
118
|
+
/** List all shows. */
|
|
119
|
+
async shows() {
|
|
120
|
+
return this.request(this.stationPath("/shows"));
|
|
121
|
+
}
|
|
122
|
+
/** Get a show by slug. */
|
|
123
|
+
async show(showSlug) {
|
|
124
|
+
return this.request(this.stationPath(`/shows/${validateSlug(showSlug, "showSlug")}`));
|
|
125
|
+
}
|
|
126
|
+
/** Get a show's recurring schedule slots (when it airs). */
|
|
127
|
+
async showSchedule(showSlug) {
|
|
128
|
+
return this.request(this.stationPath(`/shows/${validateSlug(showSlug, "showSlug")}/schedule`));
|
|
129
|
+
}
|
|
130
|
+
// ── Presenters ───────────────────────────────────────────────────────────
|
|
131
|
+
/** List all presenters. */
|
|
132
|
+
async presenters() {
|
|
133
|
+
return this.request(this.stationPath("/presenters"));
|
|
134
|
+
}
|
|
135
|
+
/** Get a presenter by slug. */
|
|
136
|
+
async presenter(presenterSlug) {
|
|
137
|
+
return this.request(this.stationPath(`/presenters/${validateSlug(presenterSlug, "presenterSlug")}`));
|
|
138
|
+
}
|
|
139
|
+
// ── Archives ─────────────────────────────────────────────────────────────
|
|
140
|
+
/** List station-wide archives (paginated). */
|
|
141
|
+
async archives(options) {
|
|
142
|
+
const params = new URLSearchParams();
|
|
143
|
+
if (options?.show) params.set("show", options.show);
|
|
144
|
+
if (options?.cursor) params.set("cursor", options.cursor);
|
|
145
|
+
if (options?.offset !== void 0) params.set("offset", String(options.offset));
|
|
146
|
+
if (options?.limit !== void 0) params.set("limit", String(options.limit));
|
|
147
|
+
const qs = params.toString();
|
|
148
|
+
return this.request(this.stationPath(`/archives${qs ? `?${qs}` : ""}`));
|
|
149
|
+
}
|
|
150
|
+
/** List archives for a specific show (cursor-paginated). */
|
|
151
|
+
async showArchives(showSlug, options) {
|
|
152
|
+
validateSlug(showSlug, "showSlug");
|
|
153
|
+
const params = new URLSearchParams();
|
|
154
|
+
if (options?.cursor) params.set("cursor", options.cursor);
|
|
155
|
+
if (options?.limit !== void 0) params.set("limit", String(options.limit));
|
|
156
|
+
const qs = params.toString();
|
|
157
|
+
return this.request(
|
|
158
|
+
this.stationPath(`/shows/${showSlug}/archives${qs ? `?${qs}` : ""}`)
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
// ── Events ───────────────────────────────────────────────────────────────
|
|
162
|
+
/** List upcoming events. */
|
|
163
|
+
async events() {
|
|
164
|
+
return this.request(this.stationPath("/events"));
|
|
165
|
+
}
|
|
166
|
+
/** Get an event by slug (includes segments and presenters). */
|
|
167
|
+
async event(eventSlug) {
|
|
168
|
+
return this.request(this.stationPath(`/events/${validateSlug(eventSlug, "eventSlug")}`));
|
|
169
|
+
}
|
|
170
|
+
// ── Forms ────────────────────────────────────────────────────────────────
|
|
171
|
+
/** List all published forms. */
|
|
172
|
+
async forms() {
|
|
173
|
+
return this.request(this.stationPath("/forms"));
|
|
174
|
+
}
|
|
175
|
+
/** Get a form by slug (includes connected data for genre/show/presenter fields). */
|
|
176
|
+
async form(formSlug) {
|
|
177
|
+
return this.request(this.stationPath(`/forms/${validateSlug(formSlug, "formSlug")}`));
|
|
178
|
+
}
|
|
179
|
+
/** Submit data to a form. */
|
|
180
|
+
async submitForm(formSlug, data) {
|
|
181
|
+
return this.post(
|
|
182
|
+
this.stationPath(`/forms/${validateSlug(formSlug, "formSlug")}/submit`),
|
|
183
|
+
data
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
export {
|
|
188
|
+
Broadcake,
|
|
189
|
+
BroadcakeError
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/subscribe.ts","../src/client.ts"],"sourcesContent":["export class BroadcakeError extends Error {\n\tpublic readonly status: number\n\tpublic readonly endpoint: string\n\tpublic readonly body: unknown\n\n\tconstructor(status: number, message: string, endpoint: string, body?: unknown) {\n\t\tsuper(message)\n\t\tthis.name = 'BroadcakeError'\n\t\tthis.status = status\n\t\tthis.endpoint = endpoint\n\t\tthis.body = body\n\t}\n}\n","import type { NowPlaying, SubscribeOptions } from './types'\n\nexport type NowPlayingCallback = (data: NowPlaying) => void\nexport type Unsubscribe = () => void\n\nexport function createNowPlayingSubscribe(\n\tfetcher: () => Promise<NowPlaying>,\n): (callback: NowPlayingCallback, options?: SubscribeOptions) => Unsubscribe {\n\treturn (callback: NowPlayingCallback, options?: SubscribeOptions): Unsubscribe => {\n\t\tconst interval = options?.interval ?? 10_000\n\t\tlet active = true\n\t\tlet timer: ReturnType<typeof setInterval> | undefined\n\n\t\tconst poll = async () => {\n\t\t\tif (!active) return\n\t\t\ttry {\n\t\t\t\tconst data = await fetcher()\n\t\t\t\tif (active) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcallback(data)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Callback errors don't break the polling loop\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Silently skip failed fetches — next tick retries\n\t\t\t}\n\t\t}\n\n\t\t// Set up interval before initial poll to avoid edge cases\n\t\ttimer = setInterval(poll, interval)\n\t\tpoll()\n\n\t\treturn () => {\n\t\t\tactive = false\n\t\t\tif (timer !== undefined) clearInterval(timer)\n\t\t}\n\t}\n}\n","import { BroadcakeError } from './errors'\nimport { createNowPlayingSubscribe } from './subscribe'\nimport type {\n\tStation,\n\tStationDetail,\n\tScheduleSlot,\n\tWeekSchedule,\n\tNowPlaying,\n\tShow,\n\tPresenter,\n\tEvent,\n\tEventDetail,\n\tArchivePage,\n\tStationArchivePage,\n\tForm,\n\tFormDetail,\n\tFormSubmitResult,\n\tBroadcakeOptions,\n\tScheduleRangeOptions,\n\tArchiveListOptions,\n\tShowArchiveListOptions,\n\tSubscribeOptions,\n\tShowSchedule,\n\tTodaySchedule,\n} from './types'\nimport type { NowPlayingCallback, Unsubscribe } from './subscribe'\n\nconst DEFAULT_BASE_URL = 'https://app.broadcake.com'\nconst SLUG_PATTERN = /^[a-z0-9][a-z0-9._-]*$/i\n\nfunction validateSlug(value: string, name: string): string {\n\tif (!value?.trim()) {\n\t\tthrow new TypeError(`${name} must be a non-empty string`)\n\t}\n\tif (!SLUG_PATTERN.test(value)) {\n\t\tthrow new TypeError(`${name} contains invalid characters`)\n\t}\n\treturn value\n}\n\ntype NowPlayingFn = {\n\t(): Promise<NowPlaying>\n\tsubscribe: (callback: NowPlayingCallback, options?: SubscribeOptions) => Unsubscribe\n}\n\nexport class Broadcake {\n\tprivate readonly stationSlug: string\n\tprivate readonly baseUrl: string\n\n\t/** Fetch current now-playing data, or subscribe for polling updates. */\n\tpublic readonly nowPlaying: NowPlayingFn\n\n\tconstructor(stationSlug: string, options?: BroadcakeOptions) {\n\t\tthis.stationSlug = validateSlug(stationSlug, 'stationSlug')\n\t\tthis.baseUrl = (options?.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '')\n\n\t\tconst fetcher = () => this.request<NowPlaying>(this.stationPath('/now-playing'))\n\t\tconst fn = (() => fetcher()) as NowPlayingFn\n\t\tfn.subscribe = createNowPlayingSubscribe(fetcher)\n\t\tthis.nowPlaying = fn\n\t}\n\n\t// ── Internal ─────────────────────────────────────────────────────────────\n\n\tprivate async request<T>(path: string, init?: RequestInit): Promise<T> {\n\t\tconst endpoint = `${this.baseUrl}${path}`\n\n\t\tlet res: Response\n\t\ttry {\n\t\t\tres = await fetch(endpoint, init)\n\t\t} catch (err) {\n\t\t\tthrow new BroadcakeError(\n\t\t\t\t0,\n\t\t\t\terr instanceof Error ? err.message : 'Network error',\n\t\t\t\tendpoint,\n\t\t\t)\n\t\t}\n\n\t\tif (!res.ok) {\n\t\t\tlet body: unknown\n\t\t\ttry {\n\t\t\t\tbody = await res.json()\n\t\t\t} catch {\n\t\t\t\tbody = null\n\t\t\t}\n\t\t\tconst message =\n\t\t\t\tbody && typeof body === 'object' && 'error' in body\n\t\t\t\t\t? String((body as Record<string, unknown>).error)\n\t\t\t\t\t: `HTTP ${res.status}`\n\t\t\tthrow new BroadcakeError(res.status, message, endpoint, body)\n\t\t}\n\n\t\treturn res.json() as Promise<T>\n\t}\n\n\tprivate post<T>(path: string, data: unknown): Promise<T> {\n\t\treturn this.request<T>(path, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify(data),\n\t\t})\n\t}\n\n\tprivate stationPath(suffix: string = ''): string {\n\t\treturn `/api/v1/stations/${this.stationSlug}${suffix}`\n\t}\n\n\t// ── Stations ─────────────────────────────────────────────────────────────\n\n\t/** List all stations. */\n\tasync stations(): Promise<Station[]> {\n\t\treturn this.request<Station[]>('/api/v1/stations')\n\t}\n\n\t/** Get this station's details. */\n\tasync station(): Promise<StationDetail> {\n\t\treturn this.request<StationDetail>(this.stationPath())\n\t}\n\n\t// ── Schedule ─────────────────────────────────────────────────────────────\n\n\t/** Get the schedule for a single day. */\n\tasync schedule(date: string): Promise<ScheduleSlot[]>\n\t/** Get the schedule for a date range (defaults to 7 days if `to` is omitted). */\n\tasync schedule(range: ScheduleRangeOptions): Promise<WeekSchedule>\n\tasync schedule(dateOrRange: string | ScheduleRangeOptions): Promise<ScheduleSlot[] | WeekSchedule> {\n\t\tif (typeof dateOrRange === 'string') {\n\t\t\treturn this.request<ScheduleSlot[]>(this.stationPath(`/schedule/${dateOrRange}`))\n\t\t}\n\t\tconst params = new URLSearchParams({ from: dateOrRange.from })\n\t\tif (dateOrRange.to) params.set('to', dateOrRange.to)\n\t\treturn this.request<WeekSchedule>(this.stationPath(`/schedule?${params}`))\n\t}\n\n\t/** Get today's schedule (auto-resolves date in station timezone). */\n\tasync scheduleToday(): Promise<TodaySchedule> {\n\t\treturn this.request<TodaySchedule>(this.stationPath('/schedule/today'))\n\t}\n\n\t// ── Shows ────────────────────────────────────────────────────────────────\n\n\t/** List all shows. */\n\tasync shows(): Promise<Show[]> {\n\t\treturn this.request<Show[]>(this.stationPath('/shows'))\n\t}\n\n\t/** Get a show by slug. */\n\tasync show(showSlug: string): Promise<Show> {\n\t\treturn this.request<Show>(this.stationPath(`/shows/${validateSlug(showSlug, 'showSlug')}`))\n\t}\n\n\t/** Get a show's recurring schedule slots (when it airs). */\n\tasync showSchedule(showSlug: string): Promise<ShowSchedule> {\n\t\treturn this.request<ShowSchedule>(this.stationPath(`/shows/${validateSlug(showSlug, 'showSlug')}/schedule`))\n\t}\n\n\t// ── Presenters ───────────────────────────────────────────────────────────\n\n\t/** List all presenters. */\n\tasync presenters(): Promise<Presenter[]> {\n\t\treturn this.request<Presenter[]>(this.stationPath('/presenters'))\n\t}\n\n\t/** Get a presenter by slug. */\n\tasync presenter(presenterSlug: string): Promise<Presenter> {\n\t\treturn this.request<Presenter>(this.stationPath(`/presenters/${validateSlug(presenterSlug, 'presenterSlug')}`))\n\t}\n\n\t// ── Archives ─────────────────────────────────────────────────────────────\n\n\t/** List station-wide archives (paginated). */\n\tasync archives(options?: ArchiveListOptions): Promise<StationArchivePage> {\n\t\tconst params = new URLSearchParams()\n\t\tif (options?.show) params.set('show', options.show)\n\t\tif (options?.cursor) params.set('cursor', options.cursor)\n\t\tif (options?.offset !== undefined) params.set('offset', String(options.offset))\n\t\tif (options?.limit !== undefined) params.set('limit', String(options.limit))\n\t\tconst qs = params.toString()\n\t\treturn this.request<StationArchivePage>(this.stationPath(`/archives${qs ? `?${qs}` : ''}`))\n\t}\n\n\t/** List archives for a specific show (cursor-paginated). */\n\tasync showArchives(showSlug: string, options?: ShowArchiveListOptions): Promise<ArchivePage> {\n\t\tvalidateSlug(showSlug, 'showSlug')\n\t\tconst params = new URLSearchParams()\n\t\tif (options?.cursor) params.set('cursor', options.cursor)\n\t\tif (options?.limit !== undefined) params.set('limit', String(options.limit))\n\t\tconst qs = params.toString()\n\t\treturn this.request<ArchivePage>(\n\t\t\tthis.stationPath(`/shows/${showSlug}/archives${qs ? `?${qs}` : ''}`),\n\t\t)\n\t}\n\n\t// ── Events ───────────────────────────────────────────────────────────────\n\n\t/** List upcoming events. */\n\tasync events(): Promise<Event[]> {\n\t\treturn this.request<Event[]>(this.stationPath('/events'))\n\t}\n\n\t/** Get an event by slug (includes segments and presenters). */\n\tasync event(eventSlug: string): Promise<EventDetail> {\n\t\treturn this.request<EventDetail>(this.stationPath(`/events/${validateSlug(eventSlug, 'eventSlug')}`))\n\t}\n\n\t// ── Forms ────────────────────────────────────────────────────────────────\n\n\t/** List all published forms. */\n\tasync forms(): Promise<Form[]> {\n\t\treturn this.request<Form[]>(this.stationPath('/forms'))\n\t}\n\n\t/** Get a form by slug (includes connected data for genre/show/presenter fields). */\n\tasync form(formSlug: string): Promise<FormDetail> {\n\t\treturn this.request<FormDetail>(this.stationPath(`/forms/${validateSlug(formSlug, 'formSlug')}`))\n\t}\n\n\t/** Submit data to a form. */\n\tasync submitForm(formSlug: string, data: Record<string, unknown>): Promise<FormSubmitResult> {\n\t\treturn this.post<FormSubmitResult>(\n\t\t\tthis.stationPath(`/forms/${validateSlug(formSlug, 'formSlug')}/submit`),\n\t\t\tdata,\n\t\t)\n\t}\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@techcake/broadcake-sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "TypeScript SDK for the Broadcake radio station management API",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.cjs",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"require": {
|
|
17
|
+
"types": "./dist/index.d.cts",
|
|
18
|
+
"default": "./dist/index.cjs"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"dev": "tsup --watch",
|
|
28
|
+
"check": "tsc --noEmit",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"test:watch": "vitest",
|
|
31
|
+
"prepublishOnly": "npm run build"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"tsup": "^8.4.0",
|
|
35
|
+
"typescript": "^5.9.3",
|
|
36
|
+
"vitest": "^4.1.0"
|
|
37
|
+
},
|
|
38
|
+
"sideEffects": false,
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18"
|
|
41
|
+
}
|
|
42
|
+
}
|