@frybynite/image-cloud 0.6.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +1 -28
  2. package/dist/image-cloud-auto-init.js +759 -345
  3. package/dist/image-cloud-auto-init.js.map +1 -1
  4. package/dist/image-cloud.js +1040 -1085
  5. package/dist/image-cloud.js.map +1 -1
  6. package/dist/image-cloud.umd.js +5 -5
  7. package/dist/image-cloud.umd.js.map +1 -1
  8. package/dist/index.d.ts +0 -31
  9. package/dist/react.d.ts +0 -31
  10. package/dist/react.js +848 -434
  11. package/dist/react.js.map +1 -1
  12. package/dist/vue.d.ts +0 -31
  13. package/dist/vue.js +856 -442
  14. package/dist/vue.js.map +1 -1
  15. package/dist/web-component.d.ts +0 -31
  16. package/dist/web-component.js +843 -429
  17. package/dist/web-component.js.map +1 -1
  18. package/package.json +14 -27
  19. package/dist/composite-BSJXKGwG.js +0 -63
  20. package/dist/composite-BSJXKGwG.js.map +0 -1
  21. package/dist/google-drive-DK2v0Xay.js +0 -227
  22. package/dist/google-drive-DK2v0Xay.js.map +0 -1
  23. package/dist/image-cloud-CO9PMUGK.js +0 -38
  24. package/dist/image-cloud-CO9PMUGK.js.map +0 -1
  25. package/dist/loaders/all.d.ts +0 -1683
  26. package/dist/loaders/all.js +0 -463
  27. package/dist/loaders/all.js.map +0 -1
  28. package/dist/loaders/composite.d.ts +0 -1683
  29. package/dist/loaders/composite.js +0 -63
  30. package/dist/loaders/composite.js.map +0 -1
  31. package/dist/loaders/google-drive.d.ts +0 -1683
  32. package/dist/loaders/google-drive.js +0 -227
  33. package/dist/loaders/google-drive.js.map +0 -1
  34. package/dist/loaders/static.d.ts +0 -1683
  35. package/dist/loaders/static.js +0 -186
  36. package/dist/loaders/static.js.map +0 -1
  37. package/dist/static-D9YjTesh.js +0 -186
  38. package/dist/static-D9YjTesh.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frybynite/image-cloud",
3
- "version": "0.6.5",
3
+ "version": "0.7.0",
4
4
  "description": "Javascript/TypeScript image cloud library with custom loaders, various layouts, full images styling, with animation and zoom effects",
5
5
  "type": "module",
6
6
  "main": "./dist/image-cloud.umd.js",
@@ -25,22 +25,6 @@
25
25
  "./web-component": {
26
26
  "types": "./dist/web-component.d.ts",
27
27
  "import": "./dist/web-component.js"
28
- },
29
- "./loaders/static": {
30
- "types": "./dist/loaders/static.d.ts",
31
- "import": "./dist/loaders/static.js"
32
- },
33
- "./loaders/google-drive": {
34
- "types": "./dist/loaders/google-drive.d.ts",
35
- "import": "./dist/loaders/google-drive.js"
36
- },
37
- "./loaders/composite": {
38
- "types": "./dist/loaders/composite.d.ts",
39
- "import": "./dist/loaders/composite.js"
40
- },
41
- "./loaders/all": {
42
- "types": "./dist/loaders/all.d.ts",
43
- "import": "./dist/loaders/all.js"
44
28
  }
45
29
  },
46
30
  "files": [
@@ -48,14 +32,13 @@
48
32
  ],
49
33
  "scripts": {
50
34
  "dev": "vite",
51
- "build": "npm run clean && tsc && vite build && vite build --config vite.image-cloud-auto-init.config.ts && vite build --config vite.loader-static.config.ts && vite build --config vite.loader-google-drive.config.ts && vite build --config vite.loader-composite.config.ts && vite build --config vite.loader-all.config.ts && vite build --config vite.react.config.ts && vite build --config vite.vue.config.ts && vite build --config vite.web-component.config.ts",
35
+ "build": "npm run clean && tsc && vite build && vite build --config vite.image-cloud-auto-init.config.ts && vite build --config vite.react.config.ts && vite build --config vite.vue.config.ts && vite build --config vite.web-component.config.ts",
52
36
  "test": "playwright test --config=test/playwright.config.ts",
53
37
  "test:ui": "playwright test --config=test/playwright.config.ts --ui",
54
38
  "test:headed": "playwright test --config=test/playwright.config.ts --headed",
55
39
  "test:update-snapshots": "playwright test --config=test/playwright.config.ts --update-snapshots",
56
40
  "build:dev": "./scripts/build.sh",
57
41
  "build:prod": "./scripts/build.sh --production",
58
- "build:analyze": "ANALYZE=true npm run build",
59
42
  "build:watch": "vite build --watch",
60
43
  "build:types": "tsc --emitDeclarationOnly",
61
44
  "clean": "rm -rf dist",
@@ -91,15 +74,20 @@
91
74
  },
92
75
  "homepage": "https://github.com/frybynite/image-cloud#readme",
93
76
  "peerDependencies": {
94
- "@frybynite/image-cloud": "*",
95
- "react": ">=17",
96
- "react-dom": ">=17",
97
- "vue": ">=3"
77
+ "react": ">=18.0.0",
78
+ "react-dom": ">=18.0.0",
79
+ "vue": ">=3.3.0"
98
80
  },
99
81
  "peerDependenciesMeta": {
100
- "react": { "optional": true },
101
- "react-dom": { "optional": true },
102
- "vue": { "optional": true }
82
+ "react": {
83
+ "optional": true
84
+ },
85
+ "react-dom": {
86
+ "optional": true
87
+ },
88
+ "vue": {
89
+ "optional": true
90
+ }
103
91
  },
104
92
  "devDependencies": {
105
93
  "@playwright/test": "^1.57.0",
@@ -108,7 +96,6 @@
108
96
  "@vitejs/plugin-react": "^5.1.4",
109
97
  "react": "^19.2.4",
110
98
  "react-dom": "^19.2.4",
111
- "rollup-plugin-visualizer": "^5.x",
112
99
  "typescript": "^5.3.3",
113
100
  "vite": "^7.3.1",
114
101
  "vite-plugin-dts": "^4.5.4",
@@ -1,63 +0,0 @@
1
- import { e as t } from "./image-cloud-CO9PMUGK.js";
2
- class a {
3
- constructor(e) {
4
- if (this._prepared = !1, this._discoveredUrls = [], this.loaders = e.loaders, this.debugLogging = e.debugLogging ?? !1, !this.loaders || this.loaders.length === 0)
5
- throw new Error("CompositeLoader requires at least one loader to be configured");
6
- this.log(`CompositeLoader initialized with ${this.loaders.length} loader(s)`);
7
- }
8
- /**
9
- * Prepare all loaders in parallel and combine their results
10
- * @param filter - Filter to apply to discovered images
11
- */
12
- async prepare(e) {
13
- this._discoveredUrls = [], this.log(`Preparing ${this.loaders.length} loader(s) in parallel`);
14
- const s = this.loaders.map((r, o) => r.prepare(e).then(() => {
15
- this.log(`Loader ${o} prepared with ${r.imagesLength()} images`);
16
- }).catch((i) => {
17
- console.warn(`Loader ${o} failed to prepare:`, i);
18
- }));
19
- await Promise.all(s);
20
- for (const r of this.loaders)
21
- if (r.isPrepared()) {
22
- const o = r.imageURLs();
23
- this._discoveredUrls.push(...o);
24
- }
25
- this._prepared = !0, this.log(`CompositeLoader prepared with ${this._discoveredUrls.length} total images`);
26
- }
27
- /**
28
- * Get the combined number of discovered images
29
- * @throws Error if called before prepare()
30
- */
31
- imagesLength() {
32
- if (!this._prepared)
33
- throw new Error("CompositeLoader.imagesLength() called before prepare()");
34
- return this._discoveredUrls.length;
35
- }
36
- /**
37
- * Get the combined ordered list of image URLs
38
- * @throws Error if called before prepare()
39
- */
40
- imageURLs() {
41
- if (!this._prepared)
42
- throw new Error("CompositeLoader.imageURLs() called before prepare()");
43
- return [...this._discoveredUrls];
44
- }
45
- /**
46
- * Check if the loader has been prepared
47
- */
48
- isPrepared() {
49
- return this._prepared;
50
- }
51
- /**
52
- * Debug logging helper
53
- * @param args - Arguments to log
54
- */
55
- log(...e) {
56
- this.debugLogging && typeof console < "u" && console.log("[CompositeLoader]", ...e);
57
- }
58
- }
59
- t.registerLoader("composite", a);
60
- export {
61
- a as CompositeLoader
62
- };
63
- //# sourceMappingURL=composite-BSJXKGwG.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"composite-BSJXKGwG.js","sources":["loaders/composite.js"],"sourcesContent":["import { LoaderRegistry as t } from \"@frybynite/image-cloud\";\nclass a {\n constructor(e) {\n if (this._prepared = !1, this._discoveredUrls = [], this.loaders = e.loaders, this.debugLogging = e.debugLogging ?? !1, !this.loaders || this.loaders.length === 0)\n throw new Error(\"CompositeLoader requires at least one loader to be configured\");\n this.log(`CompositeLoader initialized with ${this.loaders.length} loader(s)`);\n }\n /**\n * Prepare all loaders in parallel and combine their results\n * @param filter - Filter to apply to discovered images\n */\n async prepare(e) {\n this._discoveredUrls = [], this.log(`Preparing ${this.loaders.length} loader(s) in parallel`);\n const o = this.loaders.map((r, s) => r.prepare(e).then(() => {\n this.log(`Loader ${s} prepared with ${r.imagesLength()} images`);\n }).catch((i) => {\n console.warn(`Loader ${s} failed to prepare:`, i);\n }));\n await Promise.all(o);\n for (const r of this.loaders)\n if (r.isPrepared()) {\n const s = r.imageURLs();\n this._discoveredUrls.push(...s);\n }\n this._prepared = !0, this.log(`CompositeLoader prepared with ${this._discoveredUrls.length} total images`);\n }\n /**\n * Get the combined number of discovered images\n * @throws Error if called before prepare()\n */\n imagesLength() {\n if (!this._prepared)\n throw new Error(\"CompositeLoader.imagesLength() called before prepare()\");\n return this._discoveredUrls.length;\n }\n /**\n * Get the combined ordered list of image URLs\n * @throws Error if called before prepare()\n */\n imageURLs() {\n if (!this._prepared)\n throw new Error(\"CompositeLoader.imageURLs() called before prepare()\");\n return [...this._discoveredUrls];\n }\n /**\n * Check if the loader has been prepared\n */\n isPrepared() {\n return this._prepared;\n }\n /**\n * Debug logging helper\n * @param args - Arguments to log\n */\n log(...e) {\n this.debugLogging && typeof console < \"u\" && console.log(\"[CompositeLoader]\", ...e);\n }\n}\nt.registerLoader(\"composite\", a);\nexport {\n a as CompositeLoader\n};\n//# sourceMappingURL=composite.js.map\n"],"names":["o","s","t"],"mappings":";AACA,MAAM,EAAE;AAAA,EACN,YAAY,GAAG;AACb,QAAI,KAAK,YAAY,IAAI,KAAK,kBAAkB,CAAA,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,eAAe,EAAE,gBAAgB,IAAI,CAAC,KAAK,WAAW,KAAK,QAAQ,WAAW;AAC/J,YAAM,IAAI,MAAM,+DAA+D;AACjF,SAAK,IAAI,oCAAoC,KAAK,QAAQ,MAAM,YAAY;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,GAAG;AACf,SAAK,kBAAkB,IAAI,KAAK,IAAI,aAAa,KAAK,QAAQ,MAAM,wBAAwB;AAC5F,UAAMA,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAGC,MAAM,EAAE,QAAQ,CAAC,EAAE,KAAK,MAAM;AAC3D,WAAK,IAAI,UAAUA,CAAC,kBAAkB,EAAE,cAAc,SAAS;AAAA,IACjE,CAAC,EAAE,MAAM,CAAC,MAAM;AACd,cAAQ,KAAK,UAAUA,CAAC,uBAAuB,CAAC;AAAA,IAClD,CAAC,CAAC;AACF,UAAM,QAAQ,IAAID,CAAC;AACnB,eAAW,KAAK,KAAK;AACnB,UAAI,EAAE,cAAc;AAClB,cAAMC,IAAI,EAAE,UAAS;AACrB,aAAK,gBAAgB,KAAK,GAAGA,CAAC;AAAA,MAChC;AACF,SAAK,YAAY,IAAI,KAAK,IAAI,iCAAiC,KAAK,gBAAgB,MAAM,eAAe;AAAA,EAC3G;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe;AACb,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,wDAAwD;AAC1E,WAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY;AACV,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,qDAAqD;AACvE,WAAO,CAAC,GAAG,KAAK,eAAe;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAIA,aAAa;AACX,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAG;AACR,SAAK,gBAAgB,OAAO,UAAU,OAAO,QAAQ,IAAI,qBAAqB,GAAG,CAAC;AAAA,EACpF;AACF;AACAC,EAAE,eAAe,aAAa,CAAC;"}
@@ -1,227 +0,0 @@
1
- import { e as c } from "./image-cloud-CO9PMUGK.js";
2
- class g {
3
- constructor(e) {
4
- if (this._prepared = !1, this._discoveredUrls = [], this.apiKey = e.apiKey ?? "", this.apiEndpoint = e.apiEndpoint ?? "https://www.googleapis.com/drive/v3/files", this.debugLogging = e.debugLogging ?? !1, this.sources = e.sources ?? [], !this.sources || this.sources.length === 0)
5
- throw new Error("GoogleDriveLoader requires at least one source to be configured");
6
- }
7
- /**
8
- * Prepare the loader by discovering all images from configured sources
9
- * @param filter - Filter to apply to discovered images
10
- */
11
- async prepare(e) {
12
- this._discoveredUrls = [];
13
- for (const i of this.sources)
14
- if ("folders" in i)
15
- for (const o of i.folders) {
16
- const t = i.recursive !== void 0 ? i.recursive : !0, r = await this.loadFromFolder(o, e, t);
17
- this._discoveredUrls.push(...r);
18
- }
19
- else if ("files" in i) {
20
- const o = await this.loadFiles(i.files, e);
21
- this._discoveredUrls.push(...o);
22
- }
23
- this._prepared = !0;
24
- }
25
- /**
26
- * Get the number of discovered images
27
- * @throws Error if called before prepare()
28
- */
29
- imagesLength() {
30
- if (!this._prepared)
31
- throw new Error("GoogleDriveLoader.imagesLength() called before prepare()");
32
- return this._discoveredUrls.length;
33
- }
34
- /**
35
- * Get the ordered list of image URLs
36
- * @throws Error if called before prepare()
37
- */
38
- imageURLs() {
39
- if (!this._prepared)
40
- throw new Error("GoogleDriveLoader.imageURLs() called before prepare()");
41
- return [...this._discoveredUrls];
42
- }
43
- /**
44
- * Check if the loader has been prepared
45
- */
46
- isPrepared() {
47
- return this._prepared;
48
- }
49
- /**
50
- * Extract folder ID from various Google Drive URL formats
51
- * @param folderUrl - Google Drive folder URL
52
- * @returns Folder ID or null if invalid
53
- */
54
- extractFolderId(e) {
55
- const i = [
56
- /\/folders\/([a-zA-Z0-9_-]+)/,
57
- // Standard format
58
- /id=([a-zA-Z0-9_-]+)/
59
- // Alternative format
60
- ];
61
- for (const o of i) {
62
- const t = e.match(o);
63
- if (t && t[1])
64
- return t[1];
65
- }
66
- return null;
67
- }
68
- /**
69
- * Load images from a Google Drive folder
70
- * @param folderUrl - Google Drive folder URL
71
- * @param filter - Filter to apply to discovered images
72
- * @param recursive - Whether to include images from subfolders
73
- * @returns Promise resolving to array of image URLs
74
- */
75
- async loadFromFolder(e, i, o = !0) {
76
- const t = this.extractFolderId(e);
77
- if (!t)
78
- throw new Error("Invalid Google Drive folder URL. Please check the URL format.");
79
- if (!this.apiKey || this.apiKey === "YOUR_API_KEY_HERE")
80
- return this.loadImagesDirectly(t, i);
81
- try {
82
- return o ? await this.loadImagesRecursively(t, i) : await this.loadImagesFromSingleFolder(t, i);
83
- } catch (r) {
84
- return console.error("Error loading from Google Drive API:", r), this.loadImagesDirectly(t, i);
85
- }
86
- }
87
- /**
88
- * Load images from a single folder (non-recursive)
89
- * @param folderId - Google Drive folder ID
90
- * @param filter - Filter to apply to discovered images
91
- * @returns Promise resolving to array of image URLs
92
- */
93
- async loadImagesFromSingleFolder(e, i) {
94
- const o = [], t = `'${e}' in parents and trashed=false`, r = `${this.apiEndpoint}?q=${encodeURIComponent(t)}&fields=files(id,name,mimeType,thumbnailLink)&key=${this.apiKey}`, a = await fetch(r);
95
- if (!a.ok)
96
- throw new Error(`API request failed: ${a.status} ${a.statusText}`);
97
- const l = (await a.json()).files.filter(
98
- (s) => s.mimeType.startsWith("image/") && i.isAllowed(s.name)
99
- );
100
- return this.log(`Found ${l.length} images in folder ${e} (non-recursive)`), l.forEach((s) => {
101
- o.push(`https://lh3.googleusercontent.com/d/${s.id}=s1600`), this.log(`Added file: ${s.name}`);
102
- }), o;
103
- }
104
- /**
105
- * Load specific files by their URLs or IDs
106
- * @param fileUrls - Array of Google Drive file URLs or IDs
107
- * @param filter - Filter to apply to discovered images
108
- * @returns Promise resolving to array of image URLs
109
- */
110
- async loadFiles(e, i) {
111
- const o = [];
112
- for (const t of e) {
113
- const r = this.extractFileId(t);
114
- if (!r) {
115
- this.log(`Skipping invalid file URL: ${t}`);
116
- continue;
117
- }
118
- if (this.apiKey && this.apiKey !== "YOUR_API_KEY_HERE")
119
- try {
120
- const a = `${this.apiEndpoint}/${r}?fields=name,mimeType&key=${this.apiKey}`, l = await fetch(a);
121
- if (l.ok) {
122
- const s = await l.json();
123
- s.mimeType.startsWith("image/") && i.isAllowed(s.name) ? (o.push(`https://lh3.googleusercontent.com/d/${r}=s1600`), this.log(`Added file: ${s.name}`)) : this.log(`Skipping non-image file: ${s.name} (${s.mimeType})`);
124
- } else
125
- this.log(`Failed to fetch metadata for file ${r}: ${l.status}`);
126
- } catch (a) {
127
- this.log(`Error fetching metadata for file ${r}:`, a);
128
- }
129
- else
130
- o.push(`https://lh3.googleusercontent.com/d/${r}=s1600`);
131
- }
132
- return o;
133
- }
134
- /**
135
- * Extract file ID from Google Drive file URL
136
- * @param fileUrl - Google Drive file URL or file ID
137
- * @returns File ID or null if invalid
138
- */
139
- extractFileId(e) {
140
- if (!/[/:.]/.test(e))
141
- return e;
142
- const i = [
143
- /\/file\/d\/([a-zA-Z0-9_-]+)/,
144
- // Standard file format
145
- /\/open\?id=([a-zA-Z0-9_-]+)/,
146
- // Alternative format
147
- /id=([a-zA-Z0-9_-]+)/
148
- // Generic id parameter
149
- ];
150
- for (const o of i) {
151
- const t = e.match(o);
152
- if (t && t[1])
153
- return t[1];
154
- }
155
- return null;
156
- }
157
- /**
158
- * Recursively load images from a folder and all its subfolders
159
- * @param folderId - Google Drive folder ID
160
- * @param filter - Filter to apply to discovered images
161
- * @returns Promise resolving to array of image URLs
162
- */
163
- async loadImagesRecursively(e, i) {
164
- const o = [], t = `'${e}' in parents and trashed=false`, r = `${this.apiEndpoint}?q=${encodeURIComponent(t)}&fields=files(id,name,mimeType,thumbnailLink)&key=${this.apiKey}`, a = await fetch(r);
165
- if (!a.ok)
166
- throw new Error(`API request failed: ${a.status} ${a.statusText}`);
167
- const l = await a.json(), s = l.files.filter(
168
- (n) => n.mimeType.startsWith("image/") && i.isAllowed(n.name)
169
- ), d = l.files.filter(
170
- (n) => n.mimeType === "application/vnd.google-apps.folder"
171
- );
172
- this.log(`Found ${l.files.length} total items in folder ${e}`), l.files.forEach((n) => this.log(` - File: ${n.name} (${n.mimeType})`)), this.log(`- ${s.length} valid files (images only)`), this.log(`- ${d.length} subfolders`), s.forEach((n) => {
173
- o.push(`https://lh3.googleusercontent.com/d/${n.id}=s1600`), this.log(`Added file: ${n.name}`);
174
- });
175
- for (const n of d) {
176
- this.log(`Loading images from subfolder: ${n.name}`);
177
- const h = await this.loadImagesRecursively(n.id, i);
178
- o.push(...h);
179
- }
180
- return o;
181
- }
182
- /**
183
- * Direct loading method (no API key required, but less reliable)
184
- * Uses embedded folder view to scrape image IDs
185
- * @param folderId - Google Drive folder ID
186
- * @param filter - Filter to apply (not used in fallback mode)
187
- * @returns Promise resolving to array of image URLs
188
- */
189
- async loadImagesDirectly(e, i) {
190
- try {
191
- const o = `https://drive.google.com/embeddedfolderview?id=${e}`, t = await fetch(o, { mode: "cors" });
192
- if (!t.ok)
193
- throw new Error("Cannot access folder directly (CORS or permissions issue)");
194
- const r = await t.text(), a = /\/file\/d\/([a-zA-Z0-9_-]+)/g, l = [...r.matchAll(a)];
195
- return [...new Set(l.map((s) => s[1]))].map(
196
- (s) => `https://drive.google.com/uc?export=view&id=${s}`
197
- );
198
- } catch (o) {
199
- throw console.error("Direct loading failed:", o), new Error(
200
- `Unable to load images. Please ensure:
201
- 1. The folder is shared publicly (Anyone with the link can view)
202
- 2. The folder contains image files
203
- 3. Consider adding a Google Drive API key in config.js for better reliability`
204
- );
205
- }
206
- }
207
- /**
208
- * Manually add image URLs (for testing or when auto-loading fails)
209
- * @param imageIds - Array of Google Drive file IDs
210
- * @returns Array of direct image URLs
211
- */
212
- manualImageUrls(e) {
213
- return e.map((i) => `https://drive.google.com/uc?export=view&id=${i}`);
214
- }
215
- /**
216
- * Debug logging helper
217
- * @param args - Arguments to log
218
- */
219
- log(...e) {
220
- this.debugLogging && typeof console < "u" && console.log(...e);
221
- }
222
- }
223
- c.registerLoader("google-drive", g);
224
- export {
225
- g as GoogleDriveLoader
226
- };
227
- //# sourceMappingURL=google-drive-DK2v0Xay.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"google-drive-DK2v0Xay.js","sources":["loaders/google-drive.js"],"sourcesContent":["import { LoaderRegistry as g } from \"@frybynite/image-cloud\";\nclass m {\n constructor(e) {\n if (this._prepared = !1, this._discoveredUrls = [], this.apiKey = e.apiKey ?? \"\", this.apiEndpoint = e.apiEndpoint ?? \"https://www.googleapis.com/drive/v3/files\", this.debugLogging = e.debugLogging ?? !1, this.sources = e.sources ?? [], !this.sources || this.sources.length === 0)\n throw new Error(\"GoogleDriveLoader requires at least one source to be configured\");\n }\n /**\n * Prepare the loader by discovering all images from configured sources\n * @param filter - Filter to apply to discovered images\n */\n async prepare(e) {\n this._discoveredUrls = [];\n for (const s of this.sources)\n if (\"folders\" in s)\n for (const o of s.folders) {\n const t = s.recursive !== void 0 ? s.recursive : !0, r = await this.loadFromFolder(o, e, t);\n this._discoveredUrls.push(...r);\n }\n else if (\"files\" in s) {\n const o = await this.loadFiles(s.files, e);\n this._discoveredUrls.push(...o);\n }\n this._prepared = !0;\n }\n /**\n * Get the number of discovered images\n * @throws Error if called before prepare()\n */\n imagesLength() {\n if (!this._prepared)\n throw new Error(\"GoogleDriveLoader.imagesLength() called before prepare()\");\n return this._discoveredUrls.length;\n }\n /**\n * Get the ordered list of image URLs\n * @throws Error if called before prepare()\n */\n imageURLs() {\n if (!this._prepared)\n throw new Error(\"GoogleDriveLoader.imageURLs() called before prepare()\");\n return [...this._discoveredUrls];\n }\n /**\n * Check if the loader has been prepared\n */\n isPrepared() {\n return this._prepared;\n }\n /**\n * Extract folder ID from various Google Drive URL formats\n * @param folderUrl - Google Drive folder URL\n * @returns Folder ID or null if invalid\n */\n extractFolderId(e) {\n const s = [\n /\\/folders\\/([a-zA-Z0-9_-]+)/,\n // Standard format\n /id=([a-zA-Z0-9_-]+)/\n // Alternative format\n ];\n for (const o of s) {\n const t = e.match(o);\n if (t && t[1])\n return t[1];\n }\n return null;\n }\n /**\n * Load images from a Google Drive folder\n * @param folderUrl - Google Drive folder URL\n * @param filter - Filter to apply to discovered images\n * @param recursive - Whether to include images from subfolders\n * @returns Promise resolving to array of image URLs\n */\n async loadFromFolder(e, s, o = !0) {\n const t = this.extractFolderId(e);\n if (!t)\n throw new Error(\"Invalid Google Drive folder URL. Please check the URL format.\");\n if (!this.apiKey || this.apiKey === \"YOUR_API_KEY_HERE\")\n return this.loadImagesDirectly(t, s);\n try {\n return o ? await this.loadImagesRecursively(t, s) : await this.loadImagesFromSingleFolder(t, s);\n } catch (r) {\n return console.error(\"Error loading from Google Drive API:\", r), this.loadImagesDirectly(t, s);\n }\n }\n /**\n * Load images from a single folder (non-recursive)\n * @param folderId - Google Drive folder ID\n * @param filter - Filter to apply to discovered images\n * @returns Promise resolving to array of image URLs\n */\n async loadImagesFromSingleFolder(e, s) {\n const o = [], t = `'${e}' in parents and trashed=false`, d = `${this.apiEndpoint}?q=${encodeURIComponent(t)}&fields=files(id,name,mimeType,thumbnailLink)&key=${this.apiKey}`, i = await fetch(d);\n if (!i.ok)\n throw new Error(`API request failed: ${i.status} ${i.statusText}`);\n const c = (await i.json()).files.filter(\n (l) => l.mimeType.startsWith(\"image/\") && s.isAllowed(l.name)\n );\n return this.log(`Found ${c.length} images in folder ${e} (non-recursive)`), c.forEach((l) => {\n o.push(`https://lh3.googleusercontent.com/d/${l.id}=s1600`), this.log(`Added file: ${l.name}`);\n }), o;\n }\n /**\n * Load specific files by their URLs or IDs\n * @param fileUrls - Array of Google Drive file URLs or IDs\n * @param filter - Filter to apply to discovered images\n * @returns Promise resolving to array of image URLs\n */\n async loadFiles(e, s) {\n const o = [];\n for (const t of e) {\n const r = this.extractFileId(t);\n if (!r) {\n this.log(`Skipping invalid file URL: ${t}`);\n continue;\n }\n if (this.apiKey && this.apiKey !== \"YOUR_API_KEY_HERE\")\n try {\n const d = `${this.apiEndpoint}/${r}?fields=name,mimeType&key=${this.apiKey}`, i = await fetch(d);\n if (i.ok) {\n const n = await i.json();\n n.mimeType.startsWith(\"image/\") && s.isAllowed(n.name) ? (o.push(`https://lh3.googleusercontent.com/d/${r}=s1600`), this.log(`Added file: ${n.name}`)) : this.log(`Skipping non-image file: ${n.name} (${n.mimeType})`);\n } else\n this.log(`Failed to fetch metadata for file ${r}: ${i.status}`);\n } catch (d) {\n this.log(`Error fetching metadata for file ${r}:`, d);\n }\n else\n o.push(`https://lh3.googleusercontent.com/d/${r}=s1600`);\n }\n return o;\n }\n /**\n * Extract file ID from Google Drive file URL\n * @param fileUrl - Google Drive file URL or file ID\n * @returns File ID or null if invalid\n */\n extractFileId(e) {\n if (!/[/:.]/.test(e))\n return e;\n const s = [\n /\\/file\\/d\\/([a-zA-Z0-9_-]+)/,\n // Standard file format\n /\\/open\\?id=([a-zA-Z0-9_-]+)/,\n // Alternative format\n /id=([a-zA-Z0-9_-]+)/\n // Generic id parameter\n ];\n for (const o of s) {\n const t = e.match(o);\n if (t && t[1])\n return t[1];\n }\n return null;\n }\n /**\n * Recursively load images from a folder and all its subfolders\n * @param folderId - Google Drive folder ID\n * @param filter - Filter to apply to discovered images\n * @returns Promise resolving to array of image URLs\n */\n async loadImagesRecursively(e, s) {\n const o = [], t = `'${e}' in parents and trashed=false`, d = `${this.apiEndpoint}?q=${encodeURIComponent(t)}&fields=files(id,name,mimeType,thumbnailLink)&key=${this.apiKey}`, i = await fetch(d);\n if (!i.ok)\n throw new Error(`API request failed: ${i.status} ${i.statusText}`);\n const n = await i.json(), c = n.files.filter(\n (a) => a.mimeType.startsWith(\"image/\") && s.isAllowed(a.name)\n ), l = n.files.filter(\n (a) => a.mimeType === \"application/vnd.google-apps.folder\"\n );\n this.log(`Found ${n.files.length} total items in folder ${e}`), n.files.forEach((a) => this.log(` - File: ${a.name} (${a.mimeType})`)), this.log(`- ${c.length} valid files (images only)`), this.log(`- ${l.length} subfolders`), c.forEach((a) => {\n o.push(`https://lh3.googleusercontent.com/d/${a.id}=s1600`), this.log(`Added file: ${a.name}`);\n });\n for (const a of l) {\n this.log(`Loading images from subfolder: ${a.name}`);\n const h = await this.loadImagesRecursively(a.id, s);\n o.push(...h);\n }\n return o;\n }\n /**\n * Direct loading method (no API key required, but less reliable)\n * Uses embedded folder view to scrape image IDs\n * @param folderId - Google Drive folder ID\n * @param filter - Filter to apply (not used in fallback mode)\n * @returns Promise resolving to array of image URLs\n */\n async loadImagesDirectly(e, s) {\n try {\n const o = `https://drive.google.com/embeddedfolderview?id=${e}`, t = await fetch(o, { mode: \"cors\" });\n if (!t.ok)\n throw new Error(\"Cannot access folder directly (CORS or permissions issue)\");\n const r = await t.text(), d = /\\/file\\/d\\/([a-zA-Z0-9_-]+)/g, i = [...r.matchAll(d)];\n return [...new Set(i.map((l) => l[1]))].map(\n (l) => `https://drive.google.com/uc?export=view&id=${l}`\n );\n } catch (o) {\n throw console.error(\"Direct loading failed:\", o), new Error(\n `Unable to load images. Please ensure:\n1. The folder is shared publicly (Anyone with the link can view)\n2. The folder contains image files\n3. Consider adding a Google Drive API key in config.js for better reliability`\n );\n }\n }\n /**\n * Manually add image URLs (for testing or when auto-loading fails)\n * @param imageIds - Array of Google Drive file IDs\n * @returns Array of direct image URLs\n */\n manualImageUrls(e) {\n return e.map((s) => `https://drive.google.com/uc?export=view&id=${s}`);\n }\n /**\n * Debug logging helper\n * @param args - Arguments to log\n */\n log(...e) {\n this.debugLogging && typeof console < \"u\" && console.log(...e);\n }\n}\ng.registerLoader(\"google-drive\", m);\nexport {\n m as GoogleDriveLoader\n};\n//# sourceMappingURL=google-drive.js.map\n"],"names":["m","s","d","i","c","l","n","a","g"],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- const s = class t {
2
- /**
3
- * Register a loader implementation with the registry
4
- * @param name - Loader identifier (e.g., 'static', 'google-drive', 'composite')
5
- * @param Loader - Loader class constructor to register
6
- */
7
- static registerLoader(e, r) {
8
- t.registry.set(e, r);
9
- }
10
- /**
11
- * Get a registered loader implementation
12
- * @param name - Loader identifier
13
- * @returns Loader class constructor
14
- * @throws Error if loader is not registered
15
- */
16
- static getLoader(e) {
17
- const r = t.registry.get(e);
18
- if (!r)
19
- throw new Error(
20
- `Loader "${e}" is not registered. Import "@frybynite/image-cloud/loaders/${e}" or "@frybynite/image-cloud/loaders/all".`
21
- );
22
- return r;
23
- }
24
- /**
25
- * Check if a loader is registered
26
- * @param name - Loader identifier
27
- * @returns True if the loader is registered, false otherwise
28
- */
29
- static isRegistered(e) {
30
- return t.registry.has(e);
31
- }
32
- };
33
- s.registry = /* @__PURE__ */ new Map();
34
- let i = s;
35
- export {
36
- i as e
37
- };
38
- //# sourceMappingURL=image-cloud-CO9PMUGK.js.map