node-csfd-api 4.3.3 → 5.0.0-next.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/bin/server.mjs CHANGED
@@ -1,72 +1,68 @@
1
1
  #!/usr/bin/env node
2
+ import { csfd } from "../index.mjs";
3
+ import { homepage, name, version } from "../package.mjs";
2
4
  import "dotenv/config";
3
5
  import express from "express";
4
- import packageJson from "./../package.json" with { type: "json" };
5
- import { csfd } from "./../index.mjs";
6
+
7
+ //#region src/server/index.ts
6
8
  const LOG_COLORS = {
7
- info: "\x1B[36m",
8
- // cyan
9
- warn: "\x1B[33m",
10
- // yellow
11
- error: "\x1B[31m",
12
- // red
13
- success: "\x1B[32m",
14
- // green
15
- reset: "\x1B[0m"
9
+ info: "\x1B[36m",
10
+ warn: "\x1B[33m",
11
+ error: "\x1B[31m",
12
+ success: "\x1B[32m",
13
+ reset: "\x1B[0m"
16
14
  };
17
15
  const LOG_SYMBOLS = {
18
- info: "\u2139\uFE0F",
19
- warn: "\u26A0\uFE0F",
20
- error: "\u274C",
21
- success: "\u2705"
16
+ info: "ℹ️",
17
+ warn: "⚠️",
18
+ error: "",
19
+ success: ""
22
20
  };
23
21
  const LOG_PADDED_SEVERITY = {
24
- info: "INFO ",
25
- warn: "WARN ",
26
- error: "ERROR ",
27
- success: "SUCCESS"
22
+ info: "INFO ",
23
+ warn: "WARN ",
24
+ error: "ERROR ",
25
+ success: "SUCCESS"
28
26
  };
29
- var Errors = /* @__PURE__ */ ((Errors2) => {
30
- Errors2["API_KEY_MISSING"] = "API_KEY_MISSING";
31
- Errors2["API_KEY_INVALID"] = "API_KEY_INVALID";
32
- Errors2["ID_MISSING"] = "ID_MISSING";
33
- Errors2["MOVIE_FETCH_FAILED"] = "MOVIE_FETCH_FAILED";
34
- Errors2["CREATOR_FETCH_FAILED"] = "CREATOR_FETCH_FAILED";
35
- Errors2["SEARCH_FETCH_FAILED"] = "SEARCH_FETCH_FAILED";
36
- Errors2["USER_RATINGS_FETCH_FAILED"] = "USER_RATINGS_FETCH_FAILED";
37
- Errors2["USER_REVIEWS_FETCH_FAILED"] = "USER_REVIEWS_FETCH_FAILED";
38
- Errors2["CINEMAS_FETCH_FAILED"] = "CINEMAS_FETCH_FAILED";
39
- Errors2["PAGE_NOT_FOUND"] = "PAGE_NOT_FOUND";
40
- Errors2["TOO_MANY_REQUESTS"] = "TOO_MANY_REQUESTS";
41
- return Errors2;
42
- })(Errors || {});
27
+ var Errors = /* @__PURE__ */ function(Errors) {
28
+ Errors["API_KEY_MISSING"] = "API_KEY_MISSING";
29
+ Errors["API_KEY_INVALID"] = "API_KEY_INVALID";
30
+ Errors["ID_MISSING"] = "ID_MISSING";
31
+ Errors["MOVIE_FETCH_FAILED"] = "MOVIE_FETCH_FAILED";
32
+ Errors["CREATOR_FETCH_FAILED"] = "CREATOR_FETCH_FAILED";
33
+ Errors["SEARCH_FETCH_FAILED"] = "SEARCH_FETCH_FAILED";
34
+ Errors["USER_RATINGS_FETCH_FAILED"] = "USER_RATINGS_FETCH_FAILED";
35
+ Errors["USER_REVIEWS_FETCH_FAILED"] = "USER_REVIEWS_FETCH_FAILED";
36
+ Errors["CINEMAS_FETCH_FAILED"] = "CINEMAS_FETCH_FAILED";
37
+ Errors["PAGE_NOT_FOUND"] = "PAGE_NOT_FOUND";
38
+ Errors["TOO_MANY_REQUESTS"] = "TOO_MANY_REQUESTS";
39
+ return Errors;
40
+ }(Errors || {});
41
+ /**
42
+ * Optimized logging function.
43
+ * Uses global constants to avoid memory reallocation on every request.
44
+ */
43
45
  function logMessage(severity, log, req) {
44
- const time = (/* @__PURE__ */ new Date()).toISOString();
45
- const reqInfo = req ? `${req.method}: ${req.originalUrl}` : "";
46
- const reqIp = req ? req.headers["x-forwarded-for"] || req.socket.remoteAddress || req.ip || req.ips : "";
47
- const msg = `${LOG_COLORS[severity]}[${LOG_PADDED_SEVERITY[severity]}]${LOG_COLORS.reset} ${time} | IP: ${reqIp} ${LOG_SYMBOLS[severity]} ${log.error ? log.error + ":" : ""} ${log.message} \u{1F517} ${reqInfo}`;
48
- const logSuccessEnabled = process.env.VERBOSE === "true";
49
- if (severity === "success") {
50
- if (logSuccessEnabled) {
51
- console.log(msg);
52
- }
53
- } else if (severity === "error") {
54
- console.error(msg);
55
- } else if (severity === "warn") {
56
- console.warn(msg);
57
- } else {
58
- console.log(msg);
59
- }
46
+ const time = (/* @__PURE__ */ new Date()).toISOString();
47
+ const reqInfo = req ? `${req.method}: ${req.originalUrl}` : "";
48
+ const reqIp = req ? req.headers["x-forwarded-for"] || req.socket.remoteAddress || req.ip || req.ips : "";
49
+ const msg = `${LOG_COLORS[severity]}[${LOG_PADDED_SEVERITY[severity]}]${LOG_COLORS.reset} ${time} | IP: ${reqIp} ${LOG_SYMBOLS[severity]} ${log.error ? log.error + ":" : ""} ${log.message} 🔗 ${reqInfo}`;
50
+ const logSuccessEnabled = process.env.VERBOSE === "true";
51
+ if (severity === "success") {
52
+ if (logSuccessEnabled) console.log(msg);
53
+ } else if (severity === "error") console.error(msg);
54
+ else if (severity === "warn") console.warn(msg);
55
+ else console.log(msg);
60
56
  }
61
- var Endpoint = /* @__PURE__ */ ((Endpoint2) => {
62
- Endpoint2["MOVIE"] = "/movie/:id";
63
- Endpoint2["CREATOR"] = "/creator/:id";
64
- Endpoint2["SEARCH"] = "/search/:query";
65
- Endpoint2["USER_RATINGS"] = "/user-ratings/:id";
66
- Endpoint2["USER_REVIEWS"] = "/user-reviews/:id";
67
- Endpoint2["CINEMAS"] = "/cinemas";
68
- return Endpoint2;
69
- })(Endpoint || {});
57
+ var Endpoint = /* @__PURE__ */ function(Endpoint) {
58
+ Endpoint["MOVIE"] = "/movie/:id";
59
+ Endpoint["CREATOR"] = "/creator/:id";
60
+ Endpoint["SEARCH"] = "/search/:query";
61
+ Endpoint["USER_RATINGS"] = "/user-ratings/:id";
62
+ Endpoint["USER_REVIEWS"] = "/user-reviews/:id";
63
+ Endpoint["CINEMAS"] = "/cinemas";
64
+ return Endpoint;
65
+ }(Endpoint || {});
70
66
  const app = express();
71
67
  const port = process.env.PORT || 3e3;
72
68
  const API_KEY_NAME = process.env.API_KEY_NAME || "x-api-key";
@@ -75,221 +71,195 @@ const RAW_LANGUAGE = process.env.LANGUAGE;
75
71
  const isSupportedLanguage = (value) => value === "cs" || value === "en" || value === "sk";
76
72
  const BASE_LANGUAGE = isSupportedLanguage(RAW_LANGUAGE) ? RAW_LANGUAGE : void 0;
77
73
  const API_KEYS_LIST = API_KEY ? API_KEY.split(/[,;\s]+/).map((k) => k.trim()).filter(Boolean) : [];
78
- if (BASE_LANGUAGE) {
79
- csfd.setOptions({ language: BASE_LANGUAGE });
80
- }
74
+ if (BASE_LANGUAGE) csfd.setOptions({ language: BASE_LANGUAGE });
81
75
  app.use((req, res, next) => {
82
- if (API_KEY) {
83
- const apiKey = req.get(API_KEY_NAME)?.trim();
84
- if (!apiKey) {
85
- const log = {
86
- error: "API_KEY_MISSING" /* API_KEY_MISSING */,
87
- message: `Missing API key in request header: ${API_KEY_NAME}`
88
- };
89
- logMessage("error", log, req);
90
- res.status(401).json(log);
91
- return;
92
- }
93
- if (!API_KEYS_LIST.includes(apiKey)) {
94
- const log = {
95
- error: "API_KEY_INVALID" /* API_KEY_INVALID */,
96
- message: `Invalid API key in request header: ${API_KEY_NAME}`
97
- };
98
- logMessage("error", log, req);
99
- res.status(401).json(log);
100
- return;
101
- }
102
- }
103
- next();
76
+ if (API_KEY) {
77
+ const apiKey = req.get(API_KEY_NAME)?.trim();
78
+ if (!apiKey) {
79
+ const log = {
80
+ error: Errors.API_KEY_MISSING,
81
+ message: `Missing API key in request header: ${API_KEY_NAME}`
82
+ };
83
+ logMessage("error", log, req);
84
+ res.status(401).json(log);
85
+ return;
86
+ }
87
+ if (!API_KEYS_LIST.includes(apiKey)) {
88
+ const log = {
89
+ error: Errors.API_KEY_INVALID,
90
+ message: `Invalid API key in request header: ${API_KEY_NAME}`
91
+ };
92
+ logMessage("error", log, req);
93
+ res.status(401).json(log);
94
+ return;
95
+ }
96
+ }
97
+ next();
104
98
  });
105
99
  app.get("/", (_, res) => {
106
- logMessage("info", { error: null, message: "/" });
107
- res.json({
108
- name: packageJson.name,
109
- version: packageJson.version,
110
- docs: packageJson.homepage,
111
- links: Object.values(Endpoint)
112
- });
100
+ logMessage("info", {
101
+ error: null,
102
+ message: "/"
103
+ });
104
+ res.json({
105
+ name,
106
+ version,
107
+ docs: homepage,
108
+ links: Object.values(Endpoint)
109
+ });
113
110
  });
114
- app.get(["/movie/", "/creator/", "/search/", "/user-ratings/", "/user-reviews/"], (req, res) => {
115
- const log = {
116
- error: "ID_MISSING" /* ID_MISSING */,
117
- message: `ID is missing. Provide ID like this: ${req.url}${req.url.endsWith("/") ? "" : "/"}1234`
118
- };
119
- logMessage("warn", log, req);
120
- res.status(404).json(log);
111
+ app.get([
112
+ "/movie/",
113
+ "/creator/",
114
+ "/search/",
115
+ "/user-ratings/",
116
+ "/user-reviews/"
117
+ ], (req, res) => {
118
+ const log = {
119
+ error: Errors.ID_MISSING,
120
+ message: `ID is missing. Provide ID like this: ${req.url}${req.url.endsWith("/") ? "" : "/"}1234`
121
+ };
122
+ logMessage("warn", log, req);
123
+ res.status(404).json(log);
121
124
  });
122
- app.get("/movie/:id" /* MOVIE */, async (req, res) => {
123
- const rawLanguage = req.query.language;
124
- const language = isSupportedLanguage(rawLanguage) ? rawLanguage : void 0;
125
- try {
126
- const movie = await csfd.movie(+req.params.id, { language });
127
- res.json(movie);
128
- logMessage(
129
- "success",
130
- {
131
- error: null,
132
- message: `${"/movie/:id" /* MOVIE */}: ${req.params.id}${language ? ` [${language}]` : ""}`
133
- },
134
- req
135
- );
136
- } catch (error) {
137
- const log = {
138
- error: "MOVIE_FETCH_FAILED" /* MOVIE_FETCH_FAILED */,
139
- message: "Failed to fetch movie data: " + error
140
- };
141
- logMessage("error", log, req);
142
- res.status(500).json(log);
143
- }
125
+ app.get(Endpoint.MOVIE, async (req, res) => {
126
+ const rawLanguage = req.query.language;
127
+ const language = isSupportedLanguage(rawLanguage) ? rawLanguage : void 0;
128
+ try {
129
+ const movie = await csfd.movie(+req.params.id, { language });
130
+ res.json(movie);
131
+ logMessage("success", {
132
+ error: null,
133
+ message: `${Endpoint.MOVIE}: ${req.params.id}${language ? ` [${language}]` : ""}`
134
+ }, req);
135
+ } catch (error) {
136
+ const log = {
137
+ error: Errors.MOVIE_FETCH_FAILED,
138
+ message: "Failed to fetch movie data: " + error
139
+ };
140
+ logMessage("error", log, req);
141
+ res.status(500).json(log);
142
+ }
144
143
  });
145
- app.get("/creator/:id" /* CREATOR */, async (req, res) => {
146
- const rawLanguage = req.query.language;
147
- const language = isSupportedLanguage(rawLanguage) ? rawLanguage : void 0;
148
- try {
149
- const result = await csfd.creator(+req.params.id, { language });
150
- res.json(result);
151
- logMessage(
152
- "success",
153
- {
154
- error: null,
155
- message: `${"/creator/:id" /* CREATOR */}: ${req.params.id}${language ? ` [${language}]` : ""}`
156
- },
157
- req
158
- );
159
- } catch (error) {
160
- const log = {
161
- error: "CREATOR_FETCH_FAILED" /* CREATOR_FETCH_FAILED */,
162
- message: "Failed to fetch creator data: " + error
163
- };
164
- logMessage("error", log, req);
165
- res.status(500).json(log);
166
- }
144
+ app.get(Endpoint.CREATOR, async (req, res) => {
145
+ const rawLanguage = req.query.language;
146
+ const language = isSupportedLanguage(rawLanguage) ? rawLanguage : void 0;
147
+ try {
148
+ const result = await csfd.creator(+req.params.id, { language });
149
+ res.json(result);
150
+ logMessage("success", {
151
+ error: null,
152
+ message: `${Endpoint.CREATOR}: ${req.params.id}${language ? ` [${language}]` : ""}`
153
+ }, req);
154
+ } catch (error) {
155
+ const log = {
156
+ error: Errors.CREATOR_FETCH_FAILED,
157
+ message: "Failed to fetch creator data: " + error
158
+ };
159
+ logMessage("error", log, req);
160
+ res.status(500).json(log);
161
+ }
167
162
  });
168
- app.get("/search/:query" /* SEARCH */, async (req, res) => {
169
- const rawLanguage = req.query.language;
170
- const language = isSupportedLanguage(rawLanguage) ? rawLanguage : void 0;
171
- try {
172
- const result = await csfd.search(req.params.query, { language });
173
- res.json(result);
174
- logMessage(
175
- "success",
176
- {
177
- error: null,
178
- message: `${"/search/:query" /* SEARCH */}: ${req.params.query}${language ? ` [${language}]` : ""}`
179
- },
180
- req
181
- );
182
- } catch (error) {
183
- const log = {
184
- error: "SEARCH_FETCH_FAILED" /* SEARCH_FETCH_FAILED */,
185
- message: "Failed to fetch search data: " + error
186
- };
187
- logMessage("error", log, req);
188
- res.status(500).json(log);
189
- }
163
+ app.get(Endpoint.SEARCH, async (req, res) => {
164
+ const rawLanguage = req.query.language;
165
+ const language = isSupportedLanguage(rawLanguage) ? rawLanguage : void 0;
166
+ try {
167
+ const result = await csfd.search(req.params.query, { language });
168
+ res.json(result);
169
+ logMessage("success", {
170
+ error: null,
171
+ message: `${Endpoint.SEARCH}: ${req.params.query}${language ? ` [${language}]` : ""}`
172
+ }, req);
173
+ } catch (error) {
174
+ const log = {
175
+ error: Errors.SEARCH_FETCH_FAILED,
176
+ message: "Failed to fetch search data: " + error
177
+ };
178
+ logMessage("error", log, req);
179
+ res.status(500).json(log);
180
+ }
190
181
  });
191
- app.get("/user-ratings/:id" /* USER_RATINGS */, async (req, res) => {
192
- const { allPages, allPagesDelay, excludes, includesOnly, page } = req.query;
193
- const rawLanguage = req.query.language;
194
- const language = isSupportedLanguage(rawLanguage) ? rawLanguage : void 0;
195
- try {
196
- const result = await csfd.userRatings(
197
- req.params.id,
198
- {
199
- allPages: allPages === "true",
200
- allPagesDelay: allPagesDelay ? +allPagesDelay : void 0,
201
- excludes: excludes ? excludes.split(",") : void 0,
202
- includesOnly: includesOnly ? includesOnly.split(",") : void 0,
203
- page: page ? +page : void 0
204
- },
205
- {
206
- language
207
- }
208
- );
209
- res.json(result);
210
- logMessage(
211
- "success",
212
- {
213
- error: null,
214
- message: `${"/user-ratings/:id" /* USER_RATINGS */}: ${req.params.id}${language ? ` [${language}]` : ""}`
215
- },
216
- req
217
- );
218
- } catch (error) {
219
- const log = {
220
- error: "USER_RATINGS_FETCH_FAILED" /* USER_RATINGS_FETCH_FAILED */,
221
- message: "Failed to fetch user-ratings data: " + error
222
- };
223
- logMessage("error", log, req);
224
- res.status(500).json(log);
225
- }
182
+ app.get(Endpoint.USER_RATINGS, async (req, res) => {
183
+ const { allPages, allPagesDelay, excludes, includesOnly, page } = req.query;
184
+ const rawLanguage = req.query.language;
185
+ const language = isSupportedLanguage(rawLanguage) ? rawLanguage : void 0;
186
+ try {
187
+ const result = await csfd.userRatings(req.params.id, {
188
+ allPages: allPages === "true",
189
+ allPagesDelay: allPagesDelay ? +allPagesDelay : void 0,
190
+ excludes: excludes ? excludes.split(",") : void 0,
191
+ includesOnly: includesOnly ? includesOnly.split(",") : void 0,
192
+ page: page ? +page : void 0
193
+ }, { language });
194
+ res.json(result);
195
+ logMessage("success", {
196
+ error: null,
197
+ message: `${Endpoint.USER_RATINGS}: ${req.params.id}${language ? ` [${language}]` : ""}`
198
+ }, req);
199
+ } catch (error) {
200
+ const log = {
201
+ error: Errors.USER_RATINGS_FETCH_FAILED,
202
+ message: "Failed to fetch user-ratings data: " + error
203
+ };
204
+ logMessage("error", log, req);
205
+ res.status(500).json(log);
206
+ }
226
207
  });
227
- app.get("/user-reviews/:id" /* USER_REVIEWS */, async (req, res) => {
228
- const { allPages, allPagesDelay, excludes, includesOnly, page } = req.query;
229
- const rawLanguage = req.query.language;
230
- const language = isSupportedLanguage(rawLanguage) ? rawLanguage : void 0;
231
- try {
232
- const result = await csfd.userReviews(
233
- req.params.id,
234
- {
235
- allPages: allPages === "true",
236
- allPagesDelay: allPagesDelay ? +allPagesDelay : void 0,
237
- excludes: excludes ? excludes.split(",") : void 0,
238
- includesOnly: includesOnly ? includesOnly.split(",") : void 0,
239
- page: page ? +page : void 0
240
- },
241
- {
242
- language
243
- }
244
- );
245
- res.json(result);
246
- logMessage(
247
- "success",
248
- {
249
- error: null,
250
- message: `${"/user-reviews/:id" /* USER_REVIEWS */}: ${req.params.id}${language ? ` [${language}]` : ""}`
251
- },
252
- req
253
- );
254
- } catch (error) {
255
- const log = {
256
- error: "USER_REVIEWS_FETCH_FAILED" /* USER_REVIEWS_FETCH_FAILED */,
257
- message: "Failed to fetch user-reviews data: " + error
258
- };
259
- logMessage("error", log, req);
260
- res.status(500).json(log);
261
- }
208
+ app.get(Endpoint.USER_REVIEWS, async (req, res) => {
209
+ const { allPages, allPagesDelay, excludes, includesOnly, page } = req.query;
210
+ const rawLanguage = req.query.language;
211
+ const language = isSupportedLanguage(rawLanguage) ? rawLanguage : void 0;
212
+ try {
213
+ const result = await csfd.userReviews(req.params.id, {
214
+ allPages: allPages === "true",
215
+ allPagesDelay: allPagesDelay ? +allPagesDelay : void 0,
216
+ excludes: excludes ? excludes.split(",") : void 0,
217
+ includesOnly: includesOnly ? includesOnly.split(",") : void 0,
218
+ page: page ? +page : void 0
219
+ }, { language });
220
+ res.json(result);
221
+ logMessage("success", {
222
+ error: null,
223
+ message: `${Endpoint.USER_REVIEWS}: ${req.params.id}${language ? ` [${language}]` : ""}`
224
+ }, req);
225
+ } catch (error) {
226
+ const log = {
227
+ error: Errors.USER_REVIEWS_FETCH_FAILED,
228
+ message: "Failed to fetch user-reviews data: " + error
229
+ };
230
+ logMessage("error", log, req);
231
+ res.status(500).json(log);
232
+ }
262
233
  });
263
- app.get("/cinemas" /* CINEMAS */, async (req, res) => {
264
- const rawLanguage = req.query.language;
265
- const language = isSupportedLanguage(rawLanguage) ? rawLanguage : void 0;
266
- try {
267
- const result = await csfd.cinema(1, "today", { language });
268
- logMessage(
269
- "success",
270
- { error: null, message: `${"/cinemas" /* CINEMAS */}${language ? ` [${language}]` : ""}` },
271
- req
272
- );
273
- res.json(result);
274
- } catch (error) {
275
- const log = {
276
- error: "CINEMAS_FETCH_FAILED" /* CINEMAS_FETCH_FAILED */,
277
- message: "Failed to fetch cinemas data: " + error
278
- };
279
- logMessage("error", log, req);
280
- res.status(500).json(log);
281
- }
234
+ app.get(Endpoint.CINEMAS, async (req, res) => {
235
+ const rawLanguage = req.query.language;
236
+ const language = isSupportedLanguage(rawLanguage) ? rawLanguage : void 0;
237
+ try {
238
+ const result = await csfd.cinema(1, "today", { language });
239
+ logMessage("success", {
240
+ error: null,
241
+ message: `${Endpoint.CINEMAS}${language ? ` [${language}]` : ""}`
242
+ }, req);
243
+ res.json(result);
244
+ } catch (error) {
245
+ const log = {
246
+ error: Errors.CINEMAS_FETCH_FAILED,
247
+ message: "Failed to fetch cinemas data: " + error
248
+ };
249
+ logMessage("error", log, req);
250
+ res.status(500).json(log);
251
+ }
282
252
  });
283
253
  app.use((req, res) => {
284
- const log = {
285
- error: "PAGE_NOT_FOUND" /* PAGE_NOT_FOUND */,
286
- message: "The requested endpoint could not be found."
287
- };
288
- logMessage("warn", log, req);
289
- res.status(404).json(log);
254
+ const log = {
255
+ error: Errors.PAGE_NOT_FOUND,
256
+ message: "The requested endpoint could not be found."
257
+ };
258
+ logMessage("warn", log, req);
259
+ res.status(404).json(log);
290
260
  });
291
261
  app.listen(port, () => {
292
- console.log(`
262
+ console.log(`
293
263
  _ __ _ _
294
264
  | | / _| | | (_)
295
265
  _ __ ___ __| | ___ ___ ___| |_ __| | __ _ _ __ _
@@ -299,26 +269,14 @@ app.listen(port, () => {
299
269
  | |
300
270
  |_|
301
271
  `);
302
- console.log(`node-csfd-api@${packageJson.version}
303
- `);
304
- console.log(`Docs: ${packageJson.homepage}`);
305
- console.log(`Endpoints: ${Object.values(Endpoint).join(", ")}
306
- `);
307
- console.log(`API is running on: http://localhost:${port}`);
308
- if (BASE_LANGUAGE) {
309
- console.log(`Base language configured: ${BASE_LANGUAGE}
310
- `);
311
- }
312
- if (API_KEYS_LIST.length === 0) {
313
- console.log(
314
- "\x1B[31m%s\x1B[0m",
315
- "\u26A0\uFE0F Server is OPEN!\n- Your server will be open to the world and potentially everyone can use it without any restriction.\n- To enable some basic protection, set API_KEY environment variable (single value or comma-separated list) and provide the same value in request header: " + API_KEY_NAME
316
- );
317
- } else {
318
- console.log(
319
- "\x1B[32m%s\x1B[0m",
320
- `\u2714\uFE0F Server is protected (somehow).
321
- - ${API_KEYS_LIST.length} API key(s) are configured and will be checked for each request header: ${API_KEY_NAME}`
322
- );
323
- }
272
+ console.log(`node-csfd-api@${version}\n`);
273
+ console.log(`Docs: ${homepage}`);
274
+ console.log(`Endpoints: ${Object.values(Endpoint).join(", ")}\n`);
275
+ console.log(`API is running on: http://localhost:${port}`);
276
+ if (BASE_LANGUAGE) console.log(`Base language configured: ${BASE_LANGUAGE}\n`);
277
+ if (API_KEYS_LIST.length === 0) console.log("\x1B[31m%s\x1B[0m", "⚠️ Server is OPEN!\n- Your server will be open to the world and potentially everyone can use it without any restriction.\n- To enable some basic protection, set API_KEY environment variable (single value or comma-separated list) and provide the same value in request header: " + API_KEY_NAME);
278
+ else console.log("\x1B[32m%s\x1B[0m", `✔️ Server is protected (somehow).\n- ${API_KEYS_LIST.length} API key(s) are configured and will be checked for each request header: ${API_KEY_NAME}`);
324
279
  });
280
+
281
+ //#endregion
282
+ export { };