@nghiavuive/random-image 1.0.0 → 1.0.2
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.d.mts +8 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.js +68 -18
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +57 -18
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -1
package/dist/index.d.mts
CHANGED
|
@@ -3,6 +3,7 @@ interface ImageOptions {
|
|
|
3
3
|
height?: number;
|
|
4
4
|
quality?: number;
|
|
5
5
|
query?: string;
|
|
6
|
+
orientation?: "landscape" | "portrait";
|
|
6
7
|
}
|
|
7
8
|
interface ImageResult {
|
|
8
9
|
url: string;
|
|
@@ -28,6 +29,12 @@ declare class PexelsProvider implements ImageProvider {
|
|
|
28
29
|
fetchRandomImage(options: ImageOptions): Promise<ImageResult>;
|
|
29
30
|
}
|
|
30
31
|
|
|
32
|
+
declare class PixabayProvider implements ImageProvider {
|
|
33
|
+
private apiKey;
|
|
34
|
+
constructor(apiKey: string);
|
|
35
|
+
fetchRandomImage(options: ImageOptions): Promise<ImageResult>;
|
|
36
|
+
}
|
|
37
|
+
|
|
31
38
|
declare class RandomImage {
|
|
32
39
|
private provider;
|
|
33
40
|
constructor(provider: ImageProvider);
|
|
@@ -39,4 +46,4 @@ declare class RandomImage {
|
|
|
39
46
|
getRandom(options?: ImageOptions): Promise<ImageResult>;
|
|
40
47
|
}
|
|
41
48
|
|
|
42
|
-
export { type ImageOptions, type ImageProvider, type ImageResult, PexelsProvider, RandomImage, UnsplashProvider };
|
|
49
|
+
export { type ImageOptions, type ImageProvider, type ImageResult, PexelsProvider, PixabayProvider, RandomImage, UnsplashProvider };
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ interface ImageOptions {
|
|
|
3
3
|
height?: number;
|
|
4
4
|
quality?: number;
|
|
5
5
|
query?: string;
|
|
6
|
+
orientation?: "landscape" | "portrait";
|
|
6
7
|
}
|
|
7
8
|
interface ImageResult {
|
|
8
9
|
url: string;
|
|
@@ -28,6 +29,12 @@ declare class PexelsProvider implements ImageProvider {
|
|
|
28
29
|
fetchRandomImage(options: ImageOptions): Promise<ImageResult>;
|
|
29
30
|
}
|
|
30
31
|
|
|
32
|
+
declare class PixabayProvider implements ImageProvider {
|
|
33
|
+
private apiKey;
|
|
34
|
+
constructor(apiKey: string);
|
|
35
|
+
fetchRandomImage(options: ImageOptions): Promise<ImageResult>;
|
|
36
|
+
}
|
|
37
|
+
|
|
31
38
|
declare class RandomImage {
|
|
32
39
|
private provider;
|
|
33
40
|
constructor(provider: ImageProvider);
|
|
@@ -39,4 +46,4 @@ declare class RandomImage {
|
|
|
39
46
|
getRandom(options?: ImageOptions): Promise<ImageResult>;
|
|
40
47
|
}
|
|
41
48
|
|
|
42
|
-
export { type ImageOptions, type ImageProvider, type ImageResult, PexelsProvider, RandomImage, UnsplashProvider };
|
|
49
|
+
export { type ImageOptions, type ImageProvider, type ImageResult, PexelsProvider, PixabayProvider, RandomImage, UnsplashProvider };
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
@@ -15,38 +17,50 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
17
|
}
|
|
16
18
|
return to;
|
|
17
19
|
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
18
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
29
|
|
|
20
30
|
// src/index.ts
|
|
21
31
|
var index_exports = {};
|
|
22
32
|
__export(index_exports, {
|
|
23
33
|
PexelsProvider: () => PexelsProvider,
|
|
34
|
+
PixabayProvider: () => PixabayProvider,
|
|
24
35
|
RandomImage: () => RandomImage,
|
|
25
36
|
UnsplashProvider: () => UnsplashProvider
|
|
26
37
|
});
|
|
27
38
|
module.exports = __toCommonJS(index_exports);
|
|
28
39
|
|
|
29
40
|
// src/providers/unsplash.ts
|
|
41
|
+
var import_axios = __toESM(require("axios"));
|
|
30
42
|
var UnsplashProvider = class {
|
|
31
43
|
constructor(accessKey) {
|
|
32
44
|
this.accessKey = accessKey;
|
|
33
45
|
}
|
|
34
46
|
async fetchRandomImage(options) {
|
|
35
|
-
const
|
|
36
|
-
if (options.query) params.append("query", options.query);
|
|
37
|
-
const url = `https://api.unsplash.com/photos/random?${params.toString()}`;
|
|
38
|
-
const response = await fetch(url, {
|
|
47
|
+
const response = await import_axios.default.get("https://api.unsplash.com/photos/random", {
|
|
39
48
|
headers: {
|
|
40
49
|
Authorization: `Client-ID ${this.accessKey}`
|
|
50
|
+
},
|
|
51
|
+
params: {
|
|
52
|
+
query: options.query,
|
|
53
|
+
orientation: options.orientation
|
|
41
54
|
}
|
|
42
55
|
});
|
|
43
|
-
|
|
44
|
-
throw new Error(`Unsplash API error: ${response.statusText}`);
|
|
45
|
-
}
|
|
46
|
-
const data = await response.json();
|
|
56
|
+
const data = response.data;
|
|
47
57
|
const photo = Array.isArray(data) ? data[0] : data;
|
|
48
58
|
const baseUrl = photo.urls.raw;
|
|
49
59
|
const sizeParams = new URLSearchParams();
|
|
60
|
+
if (options.height || options.width) {
|
|
61
|
+
sizeParams.append("fit", "crop");
|
|
62
|
+
sizeParams.append("crop", "entropy");
|
|
63
|
+
}
|
|
50
64
|
if (options.width) sizeParams.append("w", options.width.toString());
|
|
51
65
|
if (options.height) sizeParams.append("h", options.height.toString());
|
|
52
66
|
if (options.quality) sizeParams.append("q", options.quality.toString());
|
|
@@ -64,6 +78,7 @@ var UnsplashProvider = class {
|
|
|
64
78
|
};
|
|
65
79
|
|
|
66
80
|
// src/providers/pexels.ts
|
|
81
|
+
var import_axios2 = __toESM(require("axios"));
|
|
67
82
|
var PexelsProvider = class {
|
|
68
83
|
constructor(apiKey) {
|
|
69
84
|
this.apiKey = apiKey;
|
|
@@ -71,19 +86,18 @@ var PexelsProvider = class {
|
|
|
71
86
|
async fetchRandomImage(options) {
|
|
72
87
|
const endpoint = options.query ? "https://api.pexels.com/v1/search" : "https://api.pexels.com/v1/curated";
|
|
73
88
|
const randomPage = Math.floor(Math.random() * 100) + 1;
|
|
74
|
-
const params =
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
89
|
+
const params = {
|
|
90
|
+
per_page: 1,
|
|
91
|
+
page: randomPage
|
|
92
|
+
};
|
|
93
|
+
if (options.query) params.query = options.query;
|
|
94
|
+
const response = await import_axios2.default.get(endpoint, {
|
|
79
95
|
headers: {
|
|
80
96
|
Authorization: this.apiKey
|
|
81
|
-
}
|
|
97
|
+
},
|
|
98
|
+
params
|
|
82
99
|
});
|
|
83
|
-
|
|
84
|
-
throw new Error(`Pexels API error: ${response.statusText}`);
|
|
85
|
-
}
|
|
86
|
-
const data = await response.json();
|
|
100
|
+
const data = response.data;
|
|
87
101
|
if (!data.photos || data.photos.length === 0) {
|
|
88
102
|
throw new Error("No images found on Pexels");
|
|
89
103
|
}
|
|
@@ -106,6 +120,41 @@ var PexelsProvider = class {
|
|
|
106
120
|
}
|
|
107
121
|
};
|
|
108
122
|
|
|
123
|
+
// src/providers/pixabay.ts
|
|
124
|
+
var import_axios3 = __toESM(require("axios"));
|
|
125
|
+
var PixabayProvider = class {
|
|
126
|
+
constructor(apiKey) {
|
|
127
|
+
this.apiKey = apiKey;
|
|
128
|
+
}
|
|
129
|
+
async fetchRandomImage(options) {
|
|
130
|
+
const params = {
|
|
131
|
+
key: this.apiKey,
|
|
132
|
+
q: options.query || "",
|
|
133
|
+
per_page: 20
|
|
134
|
+
// Fetch a few to pick randomly
|
|
135
|
+
};
|
|
136
|
+
if (options.orientation) {
|
|
137
|
+
params.orientation = options.orientation === "portrait" ? "vertical" : "horizontal";
|
|
138
|
+
}
|
|
139
|
+
const response = await import_axios3.default.get("https://pixabay.com/api/", {
|
|
140
|
+
params
|
|
141
|
+
});
|
|
142
|
+
const hits = response.data.hits;
|
|
143
|
+
if (!hits || hits.length === 0) {
|
|
144
|
+
throw new Error("No images found");
|
|
145
|
+
}
|
|
146
|
+
const randomHit = hits[Math.floor(Math.random() * hits.length)];
|
|
147
|
+
return {
|
|
148
|
+
url: randomHit.largeImageURL || randomHit.webformatURL,
|
|
149
|
+
width: randomHit.imageWidth || randomHit.webformatWidth,
|
|
150
|
+
height: randomHit.imageHeight || randomHit.webformatHeight,
|
|
151
|
+
author: randomHit.user,
|
|
152
|
+
authorUrl: `https://pixabay.com/users/${randomHit.user}-${randomHit.user_id}/`,
|
|
153
|
+
originalUrl: randomHit.pageURL
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
|
|
109
158
|
// src/image-fetcher.ts
|
|
110
159
|
var RandomImage = class {
|
|
111
160
|
constructor(provider) {
|
|
@@ -123,6 +172,7 @@ var RandomImage = class {
|
|
|
123
172
|
// Annotate the CommonJS export names for ESM import in node:
|
|
124
173
|
0 && (module.exports = {
|
|
125
174
|
PexelsProvider,
|
|
175
|
+
PixabayProvider,
|
|
126
176
|
RandomImage,
|
|
127
177
|
UnsplashProvider
|
|
128
178
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/providers/unsplash.ts","../src/providers/pexels.ts","../src/image-fetcher.ts"],"sourcesContent":["export * from
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/providers/unsplash.ts","../src/providers/pexels.ts","../src/providers/pixabay.ts","../src/image-fetcher.ts"],"sourcesContent":["export * from \"./types\";\nexport * from \"./providers/unsplash\";\nexport * from \"./providers/pexels\";\nexport * from \"./providers/pixabay\";\nexport * from \"./image-fetcher\";\n","import axios from \"axios\";\nimport { ImageProvider, ImageOptions, ImageResult } from \"../types\";\n\nexport class UnsplashProvider implements ImageProvider {\n private accessKey: string;\n\n constructor(accessKey: string) {\n this.accessKey = accessKey;\n }\n\n async fetchRandomImage(options: ImageOptions): Promise<ImageResult> {\n const response = await axios.get(\"https://api.unsplash.com/photos/random\", {\n headers: {\n Authorization: `Client-ID ${this.accessKey}`,\n },\n params: {\n query: options.query,\n orientation: options.orientation,\n },\n });\n\n const data = response.data;\n\n // Handle single random photo (array if count param used, but here generic assumes one)\n const photo = Array.isArray(data) ? data[0] : data;\n\n // Construct resized URL\n // Unsplash uses Imgix. We can append parameters.\n const baseUrl = photo.urls.raw;\n const sizeParams = new URLSearchParams();\n if (options.height || options.width) {\n sizeParams.append(\"fit\", \"crop\");\n sizeParams.append(\"crop\", \"entropy\");\n }\n if (options.width) sizeParams.append(\"w\", options.width.toString());\n if (options.height) sizeParams.append(\"h\", options.height.toString());\n if (options.quality) sizeParams.append(\"q\", options.quality.toString());\n\n const finalUrl = `${baseUrl}&${sizeParams.toString()}`;\n\n return {\n url: finalUrl,\n width: options.width || photo.width,\n height: options.height || photo.height,\n author: photo.user.name,\n authorUrl: photo.user.links.html,\n originalUrl: photo.links.html, // Link to photo page\n };\n }\n}\n","import axios from \"axios\";\nimport { ImageProvider, ImageOptions, ImageResult } from \"../types\";\n\nexport class PexelsProvider implements ImageProvider {\n private apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n async fetchRandomImage(options: ImageOptions): Promise<ImageResult> {\n const endpoint = options.query\n ? \"https://api.pexels.com/v1/search\"\n : \"https://api.pexels.com/v1/curated\";\n\n // Randomizing page number (1-100) to get a \"random\" image\n const randomPage = Math.floor(Math.random() * 100) + 1;\n\n const params: any = {\n per_page: 1,\n page: randomPage,\n };\n if (options.query) params.query = options.query;\n\n const response = await axios.get(endpoint, {\n headers: {\n Authorization: this.apiKey,\n },\n params: params,\n });\n\n const data = response.data;\n\n if (!data.photos || data.photos.length === 0) {\n throw new Error(\"No images found on Pexels\");\n }\n\n const photo = data.photos[0];\n\n const baseUrl = photo.src.original;\n const sizeParams = new URLSearchParams();\n sizeParams.append(\"auto\", \"compress\");\n sizeParams.append(\"cs\", \"tinysrgb\"); // Default pexels param\n if (options.width) sizeParams.append(\"w\", options.width.toString());\n if (options.height) sizeParams.append(\"h\", options.height.toString());\n\n const finalUrl = `${baseUrl}?${sizeParams.toString()}`;\n\n return {\n url: finalUrl,\n width: options.width || photo.width,\n height: options.height || photo.height,\n author: photo.photographer,\n authorUrl: photo.photographer_url,\n originalUrl: photo.url,\n };\n }\n}\n","import axios from \"axios\";\nimport { ImageProvider, ImageOptions, ImageResult } from \"../types\";\n\nexport class PixabayProvider implements ImageProvider {\n private apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n async fetchRandomImage(options: ImageOptions): Promise<ImageResult> {\n const params: any = {\n key: this.apiKey,\n q: options.query || \"\",\n per_page: 20, // Fetch a few to pick randomly\n };\n\n if (options.orientation) {\n params.orientation =\n options.orientation === \"portrait\" ? \"vertical\" : \"horizontal\";\n }\n\n const response = await axios.get(\"https://pixabay.com/api/\", {\n params,\n });\n\n const hits = response.data.hits;\n\n if (!hits || hits.length === 0) {\n throw new Error(\"No images found\");\n }\n\n // Pick a random hit\n const randomHit = hits[Math.floor(Math.random() * hits.length)];\n\n return {\n url: randomHit.largeImageURL || randomHit.webformatURL,\n width: randomHit.imageWidth || randomHit.webformatWidth,\n height: randomHit.imageHeight || randomHit.webformatHeight,\n author: randomHit.user,\n authorUrl: `https://pixabay.com/users/${randomHit.user}-${randomHit.user_id}/`,\n originalUrl: randomHit.pageURL,\n };\n }\n}\n","import { ImageProvider, ImageOptions, ImageResult } from './types';\n\nexport class RandomImage {\n private provider: ImageProvider;\n\n constructor(provider: ImageProvider) {\n this.provider = provider;\n }\n\n /**\n * Fetches a random image based on the provided options.\n * @param options - Configuration options for the image (width, height, query, etc.)\n * @returns A promise that resolves to an ImageResult object.\n */\n async getRandom(options: ImageOptions = {}): Promise<ImageResult> {\n return this.provider.fetchRandomImage(options);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAkB;AAGX,IAAM,mBAAN,MAAgD;AAAA,EAGrD,YAAY,WAAmB;AAC7B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,iBAAiB,SAA6C;AAClE,UAAM,WAAW,MAAM,aAAAA,QAAM,IAAI,0CAA0C;AAAA,MACzE,SAAS;AAAA,QACP,eAAe,aAAa,KAAK,SAAS;AAAA,MAC5C;AAAA,MACA,QAAQ;AAAA,QACN,OAAO,QAAQ;AAAA,QACf,aAAa,QAAQ;AAAA,MACvB;AAAA,IACF,CAAC;AAED,UAAM,OAAO,SAAS;AAGtB,UAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,KAAK,CAAC,IAAI;AAI9C,UAAM,UAAU,MAAM,KAAK;AAC3B,UAAM,aAAa,IAAI,gBAAgB;AACvC,QAAI,QAAQ,UAAU,QAAQ,OAAO;AACnC,iBAAW,OAAO,OAAO,MAAM;AAC/B,iBAAW,OAAO,QAAQ,SAAS;AAAA,IACrC;AACA,QAAI,QAAQ,MAAO,YAAW,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AAClE,QAAI,QAAQ,OAAQ,YAAW,OAAO,KAAK,QAAQ,OAAO,SAAS,CAAC;AACpE,QAAI,QAAQ,QAAS,YAAW,OAAO,KAAK,QAAQ,QAAQ,SAAS,CAAC;AAEtE,UAAM,WAAW,GAAG,OAAO,IAAI,WAAW,SAAS,CAAC;AAEpD,WAAO;AAAA,MACL,KAAK;AAAA,MACL,OAAO,QAAQ,SAAS,MAAM;AAAA,MAC9B,QAAQ,QAAQ,UAAU,MAAM;AAAA,MAChC,QAAQ,MAAM,KAAK;AAAA,MACnB,WAAW,MAAM,KAAK,MAAM;AAAA,MAC5B,aAAa,MAAM,MAAM;AAAA;AAAA,IAC3B;AAAA,EACF;AACF;;;ACjDA,IAAAC,gBAAkB;AAGX,IAAM,iBAAN,MAA8C;AAAA,EAGnD,YAAY,QAAgB;AAC1B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,iBAAiB,SAA6C;AAClE,UAAM,WAAW,QAAQ,QACrB,qCACA;AAGJ,UAAM,aAAa,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG,IAAI;AAErD,UAAM,SAAc;AAAA,MAClB,UAAU;AAAA,MACV,MAAM;AAAA,IACR;AACA,QAAI,QAAQ,MAAO,QAAO,QAAQ,QAAQ;AAE1C,UAAM,WAAW,MAAM,cAAAC,QAAM,IAAI,UAAU;AAAA,MACzC,SAAS;AAAA,QACP,eAAe,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,OAAO,SAAS;AAEtB,QAAI,CAAC,KAAK,UAAU,KAAK,OAAO,WAAW,GAAG;AAC5C,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,UAAM,QAAQ,KAAK,OAAO,CAAC;AAE3B,UAAM,UAAU,MAAM,IAAI;AAC1B,UAAM,aAAa,IAAI,gBAAgB;AACvC,eAAW,OAAO,QAAQ,UAAU;AACpC,eAAW,OAAO,MAAM,UAAU;AAClC,QAAI,QAAQ,MAAO,YAAW,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AAClE,QAAI,QAAQ,OAAQ,YAAW,OAAO,KAAK,QAAQ,OAAO,SAAS,CAAC;AAEpE,UAAM,WAAW,GAAG,OAAO,IAAI,WAAW,SAAS,CAAC;AAEpD,WAAO;AAAA,MACL,KAAK;AAAA,MACL,OAAO,QAAQ,SAAS,MAAM;AAAA,MAC9B,QAAQ,QAAQ,UAAU,MAAM;AAAA,MAChC,QAAQ,MAAM;AAAA,MACd,WAAW,MAAM;AAAA,MACjB,aAAa,MAAM;AAAA,IACrB;AAAA,EACF;AACF;;;ACzDA,IAAAC,gBAAkB;AAGX,IAAM,kBAAN,MAA+C;AAAA,EAGpD,YAAY,QAAgB;AAC1B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,iBAAiB,SAA6C;AAClE,UAAM,SAAc;AAAA,MAClB,KAAK,KAAK;AAAA,MACV,GAAG,QAAQ,SAAS;AAAA,MACpB,UAAU;AAAA;AAAA,IACZ;AAEA,QAAI,QAAQ,aAAa;AACvB,aAAO,cACL,QAAQ,gBAAgB,aAAa,aAAa;AAAA,IACtD;AAEA,UAAM,WAAW,MAAM,cAAAC,QAAM,IAAI,4BAA4B;AAAA,MAC3D;AAAA,IACF,CAAC;AAED,UAAM,OAAO,SAAS,KAAK;AAE3B,QAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAC9B,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AAGA,UAAM,YAAY,KAAK,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,MAAM,CAAC;AAE9D,WAAO;AAAA,MACL,KAAK,UAAU,iBAAiB,UAAU;AAAA,MAC1C,OAAO,UAAU,cAAc,UAAU;AAAA,MACzC,QAAQ,UAAU,eAAe,UAAU;AAAA,MAC3C,QAAQ,UAAU;AAAA,MAClB,WAAW,6BAA6B,UAAU,IAAI,IAAI,UAAU,OAAO;AAAA,MAC3E,aAAa,UAAU;AAAA,IACzB;AAAA,EACF;AACF;;;AC1CO,IAAM,cAAN,MAAkB;AAAA,EAGvB,YAAY,UAAyB;AACnC,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAU,UAAwB,CAAC,GAAyB;AAChE,WAAO,KAAK,SAAS,iBAAiB,OAAO;AAAA,EAC/C;AACF;","names":["axios","import_axios","axios","import_axios","axios"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,24 +1,27 @@
|
|
|
1
1
|
// src/providers/unsplash.ts
|
|
2
|
+
import axios from "axios";
|
|
2
3
|
var UnsplashProvider = class {
|
|
3
4
|
constructor(accessKey) {
|
|
4
5
|
this.accessKey = accessKey;
|
|
5
6
|
}
|
|
6
7
|
async fetchRandomImage(options) {
|
|
7
|
-
const
|
|
8
|
-
if (options.query) params.append("query", options.query);
|
|
9
|
-
const url = `https://api.unsplash.com/photos/random?${params.toString()}`;
|
|
10
|
-
const response = await fetch(url, {
|
|
8
|
+
const response = await axios.get("https://api.unsplash.com/photos/random", {
|
|
11
9
|
headers: {
|
|
12
10
|
Authorization: `Client-ID ${this.accessKey}`
|
|
11
|
+
},
|
|
12
|
+
params: {
|
|
13
|
+
query: options.query,
|
|
14
|
+
orientation: options.orientation
|
|
13
15
|
}
|
|
14
16
|
});
|
|
15
|
-
|
|
16
|
-
throw new Error(`Unsplash API error: ${response.statusText}`);
|
|
17
|
-
}
|
|
18
|
-
const data = await response.json();
|
|
17
|
+
const data = response.data;
|
|
19
18
|
const photo = Array.isArray(data) ? data[0] : data;
|
|
20
19
|
const baseUrl = photo.urls.raw;
|
|
21
20
|
const sizeParams = new URLSearchParams();
|
|
21
|
+
if (options.height || options.width) {
|
|
22
|
+
sizeParams.append("fit", "crop");
|
|
23
|
+
sizeParams.append("crop", "entropy");
|
|
24
|
+
}
|
|
22
25
|
if (options.width) sizeParams.append("w", options.width.toString());
|
|
23
26
|
if (options.height) sizeParams.append("h", options.height.toString());
|
|
24
27
|
if (options.quality) sizeParams.append("q", options.quality.toString());
|
|
@@ -36,6 +39,7 @@ var UnsplashProvider = class {
|
|
|
36
39
|
};
|
|
37
40
|
|
|
38
41
|
// src/providers/pexels.ts
|
|
42
|
+
import axios2 from "axios";
|
|
39
43
|
var PexelsProvider = class {
|
|
40
44
|
constructor(apiKey) {
|
|
41
45
|
this.apiKey = apiKey;
|
|
@@ -43,19 +47,18 @@ var PexelsProvider = class {
|
|
|
43
47
|
async fetchRandomImage(options) {
|
|
44
48
|
const endpoint = options.query ? "https://api.pexels.com/v1/search" : "https://api.pexels.com/v1/curated";
|
|
45
49
|
const randomPage = Math.floor(Math.random() * 100) + 1;
|
|
46
|
-
const params =
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
const params = {
|
|
51
|
+
per_page: 1,
|
|
52
|
+
page: randomPage
|
|
53
|
+
};
|
|
54
|
+
if (options.query) params.query = options.query;
|
|
55
|
+
const response = await axios2.get(endpoint, {
|
|
51
56
|
headers: {
|
|
52
57
|
Authorization: this.apiKey
|
|
53
|
-
}
|
|
58
|
+
},
|
|
59
|
+
params
|
|
54
60
|
});
|
|
55
|
-
|
|
56
|
-
throw new Error(`Pexels API error: ${response.statusText}`);
|
|
57
|
-
}
|
|
58
|
-
const data = await response.json();
|
|
61
|
+
const data = response.data;
|
|
59
62
|
if (!data.photos || data.photos.length === 0) {
|
|
60
63
|
throw new Error("No images found on Pexels");
|
|
61
64
|
}
|
|
@@ -78,6 +81,41 @@ var PexelsProvider = class {
|
|
|
78
81
|
}
|
|
79
82
|
};
|
|
80
83
|
|
|
84
|
+
// src/providers/pixabay.ts
|
|
85
|
+
import axios3 from "axios";
|
|
86
|
+
var PixabayProvider = class {
|
|
87
|
+
constructor(apiKey) {
|
|
88
|
+
this.apiKey = apiKey;
|
|
89
|
+
}
|
|
90
|
+
async fetchRandomImage(options) {
|
|
91
|
+
const params = {
|
|
92
|
+
key: this.apiKey,
|
|
93
|
+
q: options.query || "",
|
|
94
|
+
per_page: 20
|
|
95
|
+
// Fetch a few to pick randomly
|
|
96
|
+
};
|
|
97
|
+
if (options.orientation) {
|
|
98
|
+
params.orientation = options.orientation === "portrait" ? "vertical" : "horizontal";
|
|
99
|
+
}
|
|
100
|
+
const response = await axios3.get("https://pixabay.com/api/", {
|
|
101
|
+
params
|
|
102
|
+
});
|
|
103
|
+
const hits = response.data.hits;
|
|
104
|
+
if (!hits || hits.length === 0) {
|
|
105
|
+
throw new Error("No images found");
|
|
106
|
+
}
|
|
107
|
+
const randomHit = hits[Math.floor(Math.random() * hits.length)];
|
|
108
|
+
return {
|
|
109
|
+
url: randomHit.largeImageURL || randomHit.webformatURL,
|
|
110
|
+
width: randomHit.imageWidth || randomHit.webformatWidth,
|
|
111
|
+
height: randomHit.imageHeight || randomHit.webformatHeight,
|
|
112
|
+
author: randomHit.user,
|
|
113
|
+
authorUrl: `https://pixabay.com/users/${randomHit.user}-${randomHit.user_id}/`,
|
|
114
|
+
originalUrl: randomHit.pageURL
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
|
|
81
119
|
// src/image-fetcher.ts
|
|
82
120
|
var RandomImage = class {
|
|
83
121
|
constructor(provider) {
|
|
@@ -94,6 +132,7 @@ var RandomImage = class {
|
|
|
94
132
|
};
|
|
95
133
|
export {
|
|
96
134
|
PexelsProvider,
|
|
135
|
+
PixabayProvider,
|
|
97
136
|
RandomImage,
|
|
98
137
|
UnsplashProvider
|
|
99
138
|
};
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/unsplash.ts","../src/providers/pexels.ts","../src/image-fetcher.ts"],"sourcesContent":["import { ImageProvider, ImageOptions, ImageResult } from
|
|
1
|
+
{"version":3,"sources":["../src/providers/unsplash.ts","../src/providers/pexels.ts","../src/providers/pixabay.ts","../src/image-fetcher.ts"],"sourcesContent":["import axios from \"axios\";\nimport { ImageProvider, ImageOptions, ImageResult } from \"../types\";\n\nexport class UnsplashProvider implements ImageProvider {\n private accessKey: string;\n\n constructor(accessKey: string) {\n this.accessKey = accessKey;\n }\n\n async fetchRandomImage(options: ImageOptions): Promise<ImageResult> {\n const response = await axios.get(\"https://api.unsplash.com/photos/random\", {\n headers: {\n Authorization: `Client-ID ${this.accessKey}`,\n },\n params: {\n query: options.query,\n orientation: options.orientation,\n },\n });\n\n const data = response.data;\n\n // Handle single random photo (array if count param used, but here generic assumes one)\n const photo = Array.isArray(data) ? data[0] : data;\n\n // Construct resized URL\n // Unsplash uses Imgix. We can append parameters.\n const baseUrl = photo.urls.raw;\n const sizeParams = new URLSearchParams();\n if (options.height || options.width) {\n sizeParams.append(\"fit\", \"crop\");\n sizeParams.append(\"crop\", \"entropy\");\n }\n if (options.width) sizeParams.append(\"w\", options.width.toString());\n if (options.height) sizeParams.append(\"h\", options.height.toString());\n if (options.quality) sizeParams.append(\"q\", options.quality.toString());\n\n const finalUrl = `${baseUrl}&${sizeParams.toString()}`;\n\n return {\n url: finalUrl,\n width: options.width || photo.width,\n height: options.height || photo.height,\n author: photo.user.name,\n authorUrl: photo.user.links.html,\n originalUrl: photo.links.html, // Link to photo page\n };\n }\n}\n","import axios from \"axios\";\nimport { ImageProvider, ImageOptions, ImageResult } from \"../types\";\n\nexport class PexelsProvider implements ImageProvider {\n private apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n async fetchRandomImage(options: ImageOptions): Promise<ImageResult> {\n const endpoint = options.query\n ? \"https://api.pexels.com/v1/search\"\n : \"https://api.pexels.com/v1/curated\";\n\n // Randomizing page number (1-100) to get a \"random\" image\n const randomPage = Math.floor(Math.random() * 100) + 1;\n\n const params: any = {\n per_page: 1,\n page: randomPage,\n };\n if (options.query) params.query = options.query;\n\n const response = await axios.get(endpoint, {\n headers: {\n Authorization: this.apiKey,\n },\n params: params,\n });\n\n const data = response.data;\n\n if (!data.photos || data.photos.length === 0) {\n throw new Error(\"No images found on Pexels\");\n }\n\n const photo = data.photos[0];\n\n const baseUrl = photo.src.original;\n const sizeParams = new URLSearchParams();\n sizeParams.append(\"auto\", \"compress\");\n sizeParams.append(\"cs\", \"tinysrgb\"); // Default pexels param\n if (options.width) sizeParams.append(\"w\", options.width.toString());\n if (options.height) sizeParams.append(\"h\", options.height.toString());\n\n const finalUrl = `${baseUrl}?${sizeParams.toString()}`;\n\n return {\n url: finalUrl,\n width: options.width || photo.width,\n height: options.height || photo.height,\n author: photo.photographer,\n authorUrl: photo.photographer_url,\n originalUrl: photo.url,\n };\n }\n}\n","import axios from \"axios\";\nimport { ImageProvider, ImageOptions, ImageResult } from \"../types\";\n\nexport class PixabayProvider implements ImageProvider {\n private apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n async fetchRandomImage(options: ImageOptions): Promise<ImageResult> {\n const params: any = {\n key: this.apiKey,\n q: options.query || \"\",\n per_page: 20, // Fetch a few to pick randomly\n };\n\n if (options.orientation) {\n params.orientation =\n options.orientation === \"portrait\" ? \"vertical\" : \"horizontal\";\n }\n\n const response = await axios.get(\"https://pixabay.com/api/\", {\n params,\n });\n\n const hits = response.data.hits;\n\n if (!hits || hits.length === 0) {\n throw new Error(\"No images found\");\n }\n\n // Pick a random hit\n const randomHit = hits[Math.floor(Math.random() * hits.length)];\n\n return {\n url: randomHit.largeImageURL || randomHit.webformatURL,\n width: randomHit.imageWidth || randomHit.webformatWidth,\n height: randomHit.imageHeight || randomHit.webformatHeight,\n author: randomHit.user,\n authorUrl: `https://pixabay.com/users/${randomHit.user}-${randomHit.user_id}/`,\n originalUrl: randomHit.pageURL,\n };\n }\n}\n","import { ImageProvider, ImageOptions, ImageResult } from './types';\n\nexport class RandomImage {\n private provider: ImageProvider;\n\n constructor(provider: ImageProvider) {\n this.provider = provider;\n }\n\n /**\n * Fetches a random image based on the provided options.\n * @param options - Configuration options for the image (width, height, query, etc.)\n * @returns A promise that resolves to an ImageResult object.\n */\n async getRandom(options: ImageOptions = {}): Promise<ImageResult> {\n return this.provider.fetchRandomImage(options);\n }\n}\n"],"mappings":"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","names":["axios","axios"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nghiavuive/random-image",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -31,8 +31,12 @@
|
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/node": "^25.2.0",
|
|
34
|
+
"dotenv": "^17.2.3",
|
|
34
35
|
"tsup": "^8.5.1",
|
|
35
36
|
"typescript": "^5.9.3",
|
|
36
37
|
"vitest": "^4.0.18"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"axios": "^1.13.4"
|
|
37
41
|
}
|
|
38
42
|
}
|