img-upload-kit 1.1.1 → 2.0.1
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/CHANGELOG.md +89 -74
- package/MIGRATION.md +192 -0
- package/README.md +243 -259
- package/dist/bin.js +1186 -0
- package/dist/bin.js.map +1 -0
- package/dist/blur.cjs +40 -412
- package/dist/blur.cjs.map +1 -1
- package/dist/blur.d.cts +5 -5
- package/dist/blur.d.ts +5 -5
- package/dist/blur.js +39 -393
- package/dist/blur.js.map +1 -1
- package/dist/blurDataUtils-DveBRtqE.d.cts +43 -0
- package/dist/blurDataUtils-yx9Q6HlU.d.ts +43 -0
- package/dist/blurService-D5TpMNji.d.ts +83 -0
- package/dist/blurService-DacwylJx.d.cts +83 -0
- package/dist/chunk-25GYKQ6J.js +158 -0
- package/dist/chunk-25GYKQ6J.js.map +1 -0
- package/dist/chunk-34L4TEE3.cjs +226 -0
- package/dist/chunk-34L4TEE3.cjs.map +1 -0
- package/dist/chunk-DFCSN3X7.cjs +158 -0
- package/dist/chunk-DFCSN3X7.cjs.map +1 -0
- package/dist/chunk-EWVIL57J.js +294 -0
- package/dist/chunk-EWVIL57J.js.map +1 -0
- package/dist/chunk-FP5YIWG5.cjs +135 -0
- package/dist/chunk-FP5YIWG5.cjs.map +1 -0
- package/dist/chunk-HILELQGS.js +226 -0
- package/dist/chunk-HILELQGS.js.map +1 -0
- package/dist/chunk-IDLLCVGB.js +2370 -0
- package/dist/chunk-IDLLCVGB.js.map +1 -0
- package/dist/chunk-J6A44Y3W.js +514 -0
- package/dist/chunk-J6A44Y3W.js.map +1 -0
- package/dist/chunk-LOSVFO56.cjs +145 -0
- package/dist/chunk-LOSVFO56.cjs.map +1 -0
- package/dist/chunk-MBQJ6NVJ.cjs +294 -0
- package/dist/chunk-MBQJ6NVJ.cjs.map +1 -0
- package/dist/chunk-MHGQEBPW.js +145 -0
- package/dist/chunk-MHGQEBPW.js.map +1 -0
- package/dist/chunk-QHU7FUO4.cjs +37 -0
- package/dist/chunk-QHU7FUO4.cjs.map +1 -0
- package/dist/chunk-S2IFAWJK.js +37 -0
- package/dist/chunk-S2IFAWJK.js.map +1 -0
- package/dist/chunk-TA5Y64JM.cjs +2370 -0
- package/dist/chunk-TA5Y64JM.cjs.map +1 -0
- package/dist/chunk-VYVZVUNI.js +135 -0
- package/dist/chunk-VYVZVUNI.js.map +1 -0
- package/dist/chunk-XKQMCY5Z.cjs +514 -0
- package/dist/chunk-XKQMCY5Z.cjs.map +1 -0
- package/dist/cli.cjs +273 -76
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +269 -73
- package/dist/cli.js.map +1 -1
- package/dist/headless.cjs +8 -1880
- package/dist/headless.cjs.map +1 -1
- package/dist/headless.d.cts +3 -1
- package/dist/headless.d.ts +3 -1
- package/dist/headless.js +25 -1886
- package/dist/headless.js.map +1 -1
- package/dist/index-BIdnqtW8.d.ts +234 -0
- package/dist/index-Brk_uHs6.d.cts +234 -0
- package/dist/{index-FVXXKf2v.d.ts → index-CPMlaQsC.d.ts} +76 -153
- package/dist/{index-FVXXKf2v.d.cts → index-DHINe-rA.d.cts} +76 -153
- package/dist/index.cjs +64 -532
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -4
- package/dist/index.d.ts +7 -4
- package/dist/index.js +63 -504
- package/dist/index.js.map +1 -1
- package/dist/{memoryAdapter-CBu7_3Pp.d.ts → memoryAdapter-Ck0ccZbF.d.cts} +3 -2
- package/dist/{memoryAdapter-BJjyLR-1.d.cts → memoryAdapter-DxEKaG0b.d.ts} +3 -2
- package/dist/placeholders-C4ftwaII.d.ts +5 -0
- package/dist/placeholders-x_3rt65M.d.cts +5 -0
- package/dist/react.cjs +1952 -3257
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +188 -50
- package/dist/react.d.ts +188 -50
- package/dist/react.js +1763 -3013
- package/dist/react.js.map +1 -1
- package/dist/server-handler.cjs +14 -0
- package/dist/server-handler.cjs.map +1 -0
- package/dist/server-handler.d.cts +3 -0
- package/dist/server-handler.d.ts +3 -0
- package/dist/server-handler.js +14 -0
- package/dist/server-handler.js.map +1 -0
- package/dist/server.cjs +1096 -532
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +77 -154
- package/dist/server.d.ts +77 -154
- package/dist/server.js +1050 -448
- package/dist/server.js.map +1 -1
- package/dist/storage.cjs +239 -232
- package/dist/storage.cjs.map +1 -1
- package/dist/storage.d.cts +21 -5
- package/dist/storage.d.ts +21 -5
- package/dist/storage.js +227 -207
- package/dist/storage.js.map +1 -1
- package/dist/styles/animated-image.css +112 -0
- package/dist/styles/dropzone-and-tiles.css +247 -0
- package/dist/styles/modals-and-dock.css +248 -0
- package/dist/styles/primitives.css +197 -0
- package/dist/styles/quality-and-inputs.css +184 -0
- package/dist/styles/tokens.css +123 -0
- package/dist/styles.css +235 -220
- package/dist/types-BrP-o9nd.d.cts +85 -0
- package/dist/types-sZ3KoFQY.d.ts +85 -0
- package/dist/types-yShGNQnW.d.cts +61 -0
- package/dist/types-yShGNQnW.d.ts +61 -0
- package/dist/{types-CiLY0DwB.d.cts → upload-C5Trd6Dh.d.cts} +27 -53
- package/dist/{types-CiLY0DwB.d.ts → upload-C5Trd6Dh.d.ts} +27 -53
- package/package.json +92 -32
- package/dist/blurService-DqsnfPTd.d.cts +0 -172
- package/dist/blurService-DqsnfPTd.d.ts +0 -172
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/storage/types.ts
|
|
2
|
+
function toPaginatedListResult(entries, nextCursor) {
|
|
3
|
+
const result = entries;
|
|
4
|
+
Object.defineProperties(result, {
|
|
5
|
+
items: {
|
|
6
|
+
value: entries,
|
|
7
|
+
enumerable: false,
|
|
8
|
+
configurable: true
|
|
9
|
+
},
|
|
10
|
+
nextCursor: {
|
|
11
|
+
value: nextCursor,
|
|
12
|
+
enumerable: false,
|
|
13
|
+
configurable: true
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
var PRINTABLE_ASCII_REGEX = /^[\x20-\x7E]*$/;
|
|
19
|
+
var MAX_METADATA_BYTES = 2048;
|
|
20
|
+
function validateStorageMetadata(metadata) {
|
|
21
|
+
if (!metadata) return;
|
|
22
|
+
let totalBytes = 0;
|
|
23
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
24
|
+
if (!key || typeof value !== "string" || !PRINTABLE_ASCII_REGEX.test(key) || !PRINTABLE_ASCII_REGEX.test(value)) {
|
|
25
|
+
const err = new Error(
|
|
26
|
+
"Invalid storage metadata: keys and values must contain printable ASCII characters only"
|
|
27
|
+
);
|
|
28
|
+
err.status = 400;
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
totalBytes += key.length + value.length;
|
|
32
|
+
if (totalBytes > MAX_METADATA_BYTES) {
|
|
33
|
+
const err = new Error(
|
|
34
|
+
`Storage metadata exceeds maximum size of ${MAX_METADATA_BYTES} bytes`
|
|
35
|
+
);
|
|
36
|
+
err.status = 400;
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function createStorageAdapter(adapter) {
|
|
42
|
+
return adapter;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// src/storage/memoryAdapter.ts
|
|
46
|
+
function createMemoryStorageAdapter(options = {}) {
|
|
47
|
+
const baseUrl = (options.baseUrl || "https://memory.local/uploads").replace(
|
|
48
|
+
/\/+$/,
|
|
49
|
+
""
|
|
50
|
+
);
|
|
51
|
+
const store = /* @__PURE__ */ new Map();
|
|
52
|
+
const toKey = (bucket, path) => `${bucket}::${path.replace(/^\/+/, "")}`;
|
|
53
|
+
const getPublicUrl = (bucket, path) => {
|
|
54
|
+
const cleanPath = path.replace(/^\/+/, "");
|
|
55
|
+
return `${baseUrl}/${bucket}/${cleanPath}`;
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
async upload(params) {
|
|
59
|
+
const cleanPath = params.path.replace(/^\/+/, "");
|
|
60
|
+
const key = toKey(params.bucket, cleanPath);
|
|
61
|
+
if (params.upsert === false && store.has(key)) {
|
|
62
|
+
const existsErr = new Error(
|
|
63
|
+
`Object already exists at ${params.bucket}/${cleanPath}`
|
|
64
|
+
);
|
|
65
|
+
existsErr.code = "EEXIST";
|
|
66
|
+
throw existsErr;
|
|
67
|
+
}
|
|
68
|
+
store.set(key, {
|
|
69
|
+
bucket: params.bucket,
|
|
70
|
+
path: cleanPath,
|
|
71
|
+
data: new Uint8Array(params.data),
|
|
72
|
+
contentType: params.contentType,
|
|
73
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
74
|
+
metadata: params.metadata
|
|
75
|
+
});
|
|
76
|
+
return {
|
|
77
|
+
bucket: params.bucket,
|
|
78
|
+
path: cleanPath,
|
|
79
|
+
url: getPublicUrl(params.bucket, cleanPath)
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
async delete(bucket, path) {
|
|
83
|
+
const key = toKey(bucket, path);
|
|
84
|
+
store.delete(key);
|
|
85
|
+
},
|
|
86
|
+
async exists(bucket, path) {
|
|
87
|
+
return store.has(toKey(bucket, path));
|
|
88
|
+
},
|
|
89
|
+
getPublicUrl,
|
|
90
|
+
async list(bucket, folder, listOptions) {
|
|
91
|
+
const cleanFolder = folder ? folder.replace(/^\/+|\/+$/g, "") : "";
|
|
92
|
+
const entries = [];
|
|
93
|
+
for (const obj of store.values()) {
|
|
94
|
+
if (obj.bucket !== bucket) continue;
|
|
95
|
+
if (cleanFolder && !obj.path.startsWith(`${cleanFolder}/`)) continue;
|
|
96
|
+
const name = cleanFolder ? obj.path.slice(cleanFolder.length + 1) : obj.path;
|
|
97
|
+
entries.push({
|
|
98
|
+
name,
|
|
99
|
+
id: `${obj.bucket}/${obj.path}`,
|
|
100
|
+
createdAt: obj.createdAt,
|
|
101
|
+
size: obj.data.byteLength
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const offset = _optionalChain([listOptions, 'optionalAccess', _ => _.cursor]) ? Number(listOptions.cursor) || 0 : 0;
|
|
105
|
+
const limit = _nullishCoalesce(_optionalChain([listOptions, 'optionalAccess', _2 => _2.limit]), () => ( entries.length));
|
|
106
|
+
const sliced = _optionalChain([listOptions, 'optionalAccess', _3 => _3.limit]) !== void 0 || offset > 0 ? entries.slice(offset, offset + limit) : entries;
|
|
107
|
+
const nextCursor = _optionalChain([listOptions, 'optionalAccess', _4 => _4.limit]) !== void 0 && offset + sliced.length < entries.length ? String(offset + sliced.length) : void 0;
|
|
108
|
+
return toPaginatedListResult(sliced, nextCursor);
|
|
109
|
+
},
|
|
110
|
+
async deleteByUrl(url) {
|
|
111
|
+
const parsed = _optionalChain([this, 'access', _5 => _5.parseUrl, 'optionalCall', _6 => _6(url)]);
|
|
112
|
+
if (!parsed || !parsed.bucket) return false;
|
|
113
|
+
const key = toKey(parsed.bucket, parsed.path);
|
|
114
|
+
return store.delete(key);
|
|
115
|
+
},
|
|
116
|
+
parseUrl(url) {
|
|
117
|
+
const prefix = `${baseUrl}/`;
|
|
118
|
+
if (!url || !url.startsWith(prefix)) return null;
|
|
119
|
+
const cleanUrl = url.split(/[?#]/)[0];
|
|
120
|
+
const rest = cleanUrl.slice(prefix.length);
|
|
121
|
+
const slashIdx = rest.indexOf("/");
|
|
122
|
+
if (slashIdx <= 0 || slashIdx === rest.length - 1) return null;
|
|
123
|
+
const bucket = rest.slice(0, slashIdx);
|
|
124
|
+
const filePath = rest.slice(slashIdx + 1);
|
|
125
|
+
return { bucket, path: filePath };
|
|
126
|
+
},
|
|
127
|
+
getObject(bucket, path) {
|
|
128
|
+
return store.get(toKey(bucket, path));
|
|
129
|
+
},
|
|
130
|
+
clear() {
|
|
131
|
+
store.clear();
|
|
132
|
+
},
|
|
133
|
+
get size() {
|
|
134
|
+
return store.size;
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
exports.toPaginatedListResult = toPaginatedListResult; exports.validateStorageMetadata = validateStorageMetadata; exports.createStorageAdapter = createStorageAdapter; exports.createMemoryStorageAdapter = createMemoryStorageAdapter;
|
|
145
|
+
//# sourceMappingURL=chunk-LOSVFO56.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["e:\\Personal-Projects\\image-upload-kit\\dist\\chunk-LOSVFO56.cjs"],"names":[],"mappings":"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","file":"E:\\Personal-Projects\\image-upload-kit\\dist\\chunk-LOSVFO56.cjs","sourcesContent":[null]}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/blur/lruCache.ts
|
|
2
|
+
var LRUCache = class {
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
constructor(maxSize = 500) {
|
|
6
|
+
this.maxSize = Math.max(1, maxSize);
|
|
7
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
8
|
+
}
|
|
9
|
+
get(key) {
|
|
10
|
+
if (!this.cache.has(key)) return void 0;
|
|
11
|
+
const value = this.cache.get(key);
|
|
12
|
+
this.cache.delete(key);
|
|
13
|
+
this.cache.set(key, value);
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
set(key, value) {
|
|
17
|
+
if (this.cache.has(key)) {
|
|
18
|
+
this.cache.delete(key);
|
|
19
|
+
}
|
|
20
|
+
if (this.cache.size >= this.maxSize) {
|
|
21
|
+
const firstKey = this.cache.keys().next().value;
|
|
22
|
+
if (firstKey !== void 0) {
|
|
23
|
+
this.cache.delete(firstKey);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
this.cache.set(key, value);
|
|
27
|
+
}
|
|
28
|
+
has(key) {
|
|
29
|
+
return this.cache.has(key);
|
|
30
|
+
}
|
|
31
|
+
clear() {
|
|
32
|
+
this.cache.clear();
|
|
33
|
+
}
|
|
34
|
+
get size() {
|
|
35
|
+
return this.cache.size;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/blur/pathMapper.ts
|
|
40
|
+
var DEFAULT_CDN_PATTERNS = [
|
|
41
|
+
/^https?:\/\/[^/]+\.supabase\.co\/storage\/v1\/object\/public\/([^/]+)\/(.+)$/,
|
|
42
|
+
/^https?:\/\/[^/]+\.r2\.dev\/(.+)$/,
|
|
43
|
+
/^https?:\/\/[^/]+\.amazonaws\.com\/(.+)$/,
|
|
44
|
+
/^https?:\/\/[^/]+\.cloudflare\.com\/(.+)$/,
|
|
45
|
+
/^https?:\/\/cdn\.[^/]+\/(.+)$/
|
|
46
|
+
];
|
|
47
|
+
function normalizeImagePath(imageSrc, options = {}) {
|
|
48
|
+
const originalPath = imageSrc;
|
|
49
|
+
let normalizedPath = imageSrc;
|
|
50
|
+
let isExternal = false;
|
|
51
|
+
try {
|
|
52
|
+
if (imageSrc.startsWith("data:") || imageSrc.startsWith("blob:")) {
|
|
53
|
+
return {
|
|
54
|
+
normalizedPath: imageSrc,
|
|
55
|
+
isExternal: false,
|
|
56
|
+
originalPath
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const patterns = options.cdnPatterns || DEFAULT_CDN_PATTERNS;
|
|
60
|
+
if (imageSrc.startsWith("http://") || imageSrc.startsWith("https://")) {
|
|
61
|
+
const url = new URL(imageSrc);
|
|
62
|
+
isExternal = true;
|
|
63
|
+
const cleanUrlNoQuery = `${url.origin}${url.pathname}`;
|
|
64
|
+
for (const pattern of patterns) {
|
|
65
|
+
const match = cleanUrlNoQuery.match(pattern);
|
|
66
|
+
if (match) {
|
|
67
|
+
const groups = match.slice(1).filter(Boolean);
|
|
68
|
+
const pathPart = groups.join("/");
|
|
69
|
+
normalizedPath = "/" + pathPart.replace(/^\/+/, "");
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (normalizedPath === imageSrc) {
|
|
74
|
+
normalizedPath = url.pathname;
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
normalizedPath = normalizedPath.split("?")[0].split("#")[0];
|
|
78
|
+
}
|
|
79
|
+
normalizedPath = normalizedPath.replace(/\\/g, "/").replace(/^\.\.?\//g, "");
|
|
80
|
+
if (!normalizedPath.startsWith("/")) {
|
|
81
|
+
normalizedPath = "/" + normalizedPath;
|
|
82
|
+
}
|
|
83
|
+
const prefixesToStrip = options.stripPrefixes || ["/public/"];
|
|
84
|
+
for (const prefix of prefixesToStrip) {
|
|
85
|
+
if (normalizedPath.startsWith(prefix)) {
|
|
86
|
+
normalizedPath = "/" + normalizedPath.slice(prefix.length).replace(/^\/+/, "");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const segments = normalizedPath.split("/").filter(Boolean);
|
|
90
|
+
const filename = segments[segments.length - 1];
|
|
91
|
+
const folder = segments.length > 1 ? segments.slice(0, -1).join("/") : void 0;
|
|
92
|
+
const dotIdx = filename ? filename.lastIndexOf(".") : -1;
|
|
93
|
+
const extension = filename && dotIdx > 0 ? filename.slice(dotIdx + 1).toLowerCase() : void 0;
|
|
94
|
+
return {
|
|
95
|
+
normalizedPath,
|
|
96
|
+
folder,
|
|
97
|
+
filename,
|
|
98
|
+
extension,
|
|
99
|
+
isExternal,
|
|
100
|
+
originalPath
|
|
101
|
+
};
|
|
102
|
+
} catch (e) {
|
|
103
|
+
return {
|
|
104
|
+
normalizedPath: imageSrc,
|
|
105
|
+
isExternal: false,
|
|
106
|
+
originalPath
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// src/blur/placeholders.ts
|
|
112
|
+
var DEFAULT_PLACEHOLDERS = {
|
|
113
|
+
default: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCIgdmlld0JveD0iMCAwIDE1MCAxNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkaWVudCIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3R5bGU9InN0b3AtY29sb3I6IzJhMzIzZDtzdG9wLW9wYWNpdHk6MSIvPjxzdG9wIG9mZnNldD0iNTAlIiBzdHlsZT0ic3RvcC1jb2xvcjojMjEyNzMwO3N0b3Atb3BhY2l0eToxIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdHlsZT0ic3RvcC1jb2xvcjojMTgxZDI0O3N0b3Atb3BhY2l0eToxIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3Qgd2lkdGg9IjE1MCIgaGVpZ2h0PSIxNTAiIGZpbGw9InVybCgjZ3JhZGllbnQpIi8+PC9zdmc+",
|
|
114
|
+
hero: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkyMCIgaGVpZ2h0PSIxMDgwIiB2aWV3Qm94PSIwIDAgMTkyMCAxMDgwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iaGVyb0dyYWRpZW50IiB4MT0iMCUiIHkxPSIwJSIgeDI9IjEwMCUiIHkyPSIxMDAlIj48c3RvcCBvZmZzZXQ9IjAlIiBzdHlsZT0ic3RvcC1jb2xvcjojMmQzNzQ4O3N0b3Atb3BhY2l0eToxIi8+PHN0b3Agb2Zmc2V0PSIzMCUiIHN0eWxlPSJzdG9wLWNvbG9yOiMyMzJiMzg7c3RvcC1vcGFjaXR5OjEiLz48c3RvcCBvZmZzZXQ9IjcwJSIgc3R5bGU9InN0b3AtY29sb3I6IzFlMjUzMDtzdG9wLW9wYWNpdHk6MSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3R5bGU9InN0b3AtY29sb3I6IzE3MWQyNztzdG9wLW9wYWNpdHk6MSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHdpZHRoPSIxOTIwIiBoZWlnaHQ9IjEwODAiIGZpbGw9InVybCgjaGVyb0dyYWRpZW50KSIvPjwvc3ZnPg==",
|
|
115
|
+
card: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjMwMCIgdmlld0JveD0iMCAwIDQwMCAzMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJjYXJkR3JhZGllbnQiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMTAwJSIgeTI9IjEwMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0eWxlPSJzdG9wLWNvbG9yOiMyYTMyM2Q7c3RvcC1vcGFjaXR5OjEiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0eWxlPSJzdG9wLWNvbG9yOiMxYzIyMmI7c3RvcC1vcGFjaXR5OjEiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjMwMCIgZmlsbD0idXJsKCNjYXJkR3JhZGllbnQpIi8+PC9zdmc+",
|
|
116
|
+
thumbnail: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIGZpbGw9IiMyNDJiMzUiLz48L3N2Zz4="
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
// src/blur/blurService.ts
|
|
120
|
+
var BlurService = class {
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
constructor(options = {}) {
|
|
127
|
+
this.blurData = {};
|
|
128
|
+
this.pathOptions = options.pathOptions;
|
|
129
|
+
this.metadata = {
|
|
130
|
+
version: "2.0",
|
|
131
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
132
|
+
totalImages: 0
|
|
133
|
+
};
|
|
134
|
+
this.cache = new LRUCache(_nullishCoalesce(options.cacheSize, () => ( 500)));
|
|
135
|
+
this.metrics = {
|
|
136
|
+
totalRequests: 0,
|
|
137
|
+
cacheHits: 0,
|
|
138
|
+
cacheMisses: 0,
|
|
139
|
+
errors: 0
|
|
140
|
+
};
|
|
141
|
+
if (options.manifest) {
|
|
142
|
+
this.loadManifest(options.manifest);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Hydrate the service with a generated `blur-hashes.json` manifest or hash map.
|
|
147
|
+
*/
|
|
148
|
+
loadManifest(manifest) {
|
|
149
|
+
this.cache.clear();
|
|
150
|
+
if ("hashes" in manifest && typeof manifest.hashes === "object" && manifest.hashes !== null) {
|
|
151
|
+
const typed = manifest;
|
|
152
|
+
this.blurData = { ...typed.hashes };
|
|
153
|
+
this.metadata = {
|
|
154
|
+
version: typed.version || "2.0",
|
|
155
|
+
generatedAt: typed.generatedAt || (/* @__PURE__ */ new Date()).toISOString(),
|
|
156
|
+
totalImages: Object.keys(this.blurData).length
|
|
157
|
+
};
|
|
158
|
+
} else {
|
|
159
|
+
this.blurData = { ...manifest };
|
|
160
|
+
this.metadata = {
|
|
161
|
+
version: "2.0",
|
|
162
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
163
|
+
totalImages: Object.keys(this.blurData).length
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Register or update a single image's blur data at runtime.
|
|
169
|
+
*/
|
|
170
|
+
registerEntry(imagePath, entry) {
|
|
171
|
+
this.blurData[imagePath] = entry;
|
|
172
|
+
this.metadata.totalImages = Object.keys(this.blurData).length;
|
|
173
|
+
this.cache.clear();
|
|
174
|
+
}
|
|
175
|
+
getDefaultPlaceholder(type = "default") {
|
|
176
|
+
return DEFAULT_PLACEHOLDERS[type];
|
|
177
|
+
}
|
|
178
|
+
findBlurDataByPath(imageSrc) {
|
|
179
|
+
let data = this.blurData[imageSrc];
|
|
180
|
+
if (data) return data;
|
|
181
|
+
const pathInfo = normalizeImagePath(imageSrc, this.pathOptions);
|
|
182
|
+
data = this.blurData[pathInfo.normalizedPath];
|
|
183
|
+
if (data) return data;
|
|
184
|
+
const withSlash = pathInfo.normalizedPath.startsWith("/") ? pathInfo.normalizedPath : "/" + pathInfo.normalizedPath;
|
|
185
|
+
const withoutSlash = pathInfo.normalizedPath.replace(/^\/+/, "");
|
|
186
|
+
data = this.blurData[withSlash] || this.blurData[withoutSlash];
|
|
187
|
+
if (data) return data;
|
|
188
|
+
const firstSlashIdx = withoutSlash.indexOf("/");
|
|
189
|
+
if (firstSlashIdx > 0 && firstSlashIdx < withoutSlash.length - 1) {
|
|
190
|
+
const withoutBucket = withoutSlash.slice(firstSlashIdx + 1);
|
|
191
|
+
data = this.blurData["/" + withoutBucket] || this.blurData[withoutBucket];
|
|
192
|
+
if (data) return data;
|
|
193
|
+
}
|
|
194
|
+
if (pathInfo.isExternal && pathInfo.originalPath !== imageSrc) {
|
|
195
|
+
data = this.blurData[pathInfo.originalPath];
|
|
196
|
+
if (data) return data;
|
|
197
|
+
}
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
getDominantColor(imageSrc) {
|
|
201
|
+
const data = this.findBlurDataByPath(imageSrc);
|
|
202
|
+
return _optionalChain([data, 'optionalAccess', _ => _.color]) || "#E5E7EB";
|
|
203
|
+
}
|
|
204
|
+
getBlurDataURL(imageSrc, options = {}) {
|
|
205
|
+
const { type = "default", size = "small" } = options;
|
|
206
|
+
this.metrics.totalRequests++;
|
|
207
|
+
const cacheKey = `${imageSrc}-${size}-${type}`;
|
|
208
|
+
if (this.cache.has(cacheKey)) {
|
|
209
|
+
this.metrics.cacheHits++;
|
|
210
|
+
return this.cache.get(cacheKey).dataUrl;
|
|
211
|
+
}
|
|
212
|
+
this.metrics.cacheMisses++;
|
|
213
|
+
if (Object.keys(this.blurData).length === 0) {
|
|
214
|
+
return this.getDefaultPlaceholder(type);
|
|
215
|
+
}
|
|
216
|
+
const data = this.findBlurDataByPath(imageSrc);
|
|
217
|
+
if (!data) {
|
|
218
|
+
return this.getDefaultPlaceholder(type);
|
|
219
|
+
}
|
|
220
|
+
const blurDataURL = _optionalChain([data, 'access', _2 => _2.variants, 'optionalAccess', _3 => _3[size]]) || _optionalChain([data, 'access', _4 => _4.variants, 'optionalAccess', _5 => _5.small]) || this.getDefaultPlaceholder(type);
|
|
221
|
+
this.cache.set(cacheKey, {
|
|
222
|
+
dataUrl: blurDataURL,
|
|
223
|
+
timestamp: Date.now()
|
|
224
|
+
});
|
|
225
|
+
return blurDataURL;
|
|
226
|
+
}
|
|
227
|
+
getBulkBlurData(imageSrcs, options = {}) {
|
|
228
|
+
const result = {};
|
|
229
|
+
for (const imageSrc of imageSrcs) {
|
|
230
|
+
result[imageSrc] = this.getBlurDataURL(imageSrc, options);
|
|
231
|
+
}
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
234
|
+
getProgressiveData(imageSrc, size = "small") {
|
|
235
|
+
return {
|
|
236
|
+
color: this.getDominantColor(imageSrc),
|
|
237
|
+
blur: this.getBlurDataURL(imageSrc, { size }),
|
|
238
|
+
hasBlur: this.hasBlurHash(imageSrc)
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
hasBlurHash(imageSrc) {
|
|
242
|
+
return Boolean(this.findBlurDataByPath(imageSrc));
|
|
243
|
+
}
|
|
244
|
+
getMetadata() {
|
|
245
|
+
const cacheHitRate = this.metrics.totalRequests > 0 ? (this.metrics.cacheHits / this.metrics.totalRequests * 100).toFixed(2) : "0.00";
|
|
246
|
+
return {
|
|
247
|
+
...this.metadata,
|
|
248
|
+
cacheSize: this.cache.size,
|
|
249
|
+
metrics: {
|
|
250
|
+
...this.metrics,
|
|
251
|
+
cacheHitRate: `${cacheHitRate}%`
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
clearCache() {
|
|
256
|
+
this.cache.clear();
|
|
257
|
+
}
|
|
258
|
+
getBlurHash(imageSrc) {
|
|
259
|
+
const data = this.findBlurDataByPath(imageSrc);
|
|
260
|
+
return _optionalChain([data, 'optionalAccess', _6 => _6.hash]) || null;
|
|
261
|
+
}
|
|
262
|
+
preloadBlurData(imageSrcs, size = "small") {
|
|
263
|
+
for (const imageSrc of imageSrcs) {
|
|
264
|
+
this.getBlurDataURL(imageSrc, { size });
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
async fetchBlurDataForImage(imageSrc, type = "default") {
|
|
268
|
+
return Promise.resolve(this.getBlurDataURL(imageSrc, { type }));
|
|
269
|
+
}
|
|
270
|
+
getAvailableKeys() {
|
|
271
|
+
return Object.keys(this.blurData);
|
|
272
|
+
}
|
|
273
|
+
findMatchingKeys(searchTerm) {
|
|
274
|
+
const lower = searchTerm.toLowerCase();
|
|
275
|
+
return Object.keys(this.blurData).filter(
|
|
276
|
+
(key) => key.toLowerCase().includes(lower)
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
function createBlurService(options) {
|
|
281
|
+
return new BlurService(options);
|
|
282
|
+
}
|
|
283
|
+
var blurService = new BlurService();
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
exports.LRUCache = LRUCache; exports.DEFAULT_CDN_PATTERNS = DEFAULT_CDN_PATTERNS; exports.normalizeImagePath = normalizeImagePath; exports.DEFAULT_PLACEHOLDERS = DEFAULT_PLACEHOLDERS; exports.BlurService = BlurService; exports.createBlurService = createBlurService; exports.blurService = blurService;
|
|
294
|
+
//# sourceMappingURL=chunk-MBQJ6NVJ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["e:\\Personal-Projects\\image-upload-kit\\dist\\chunk-MBQJ6NVJ.cjs"],"names":[],"mappings":"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ACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"E:\\Personal-Projects\\image-upload-kit\\dist\\chunk-MBQJ6NVJ.cjs","sourcesContent":[null]}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// src/storage/types.ts
|
|
2
|
+
function toPaginatedListResult(entries, nextCursor) {
|
|
3
|
+
const result = entries;
|
|
4
|
+
Object.defineProperties(result, {
|
|
5
|
+
items: {
|
|
6
|
+
value: entries,
|
|
7
|
+
enumerable: false,
|
|
8
|
+
configurable: true
|
|
9
|
+
},
|
|
10
|
+
nextCursor: {
|
|
11
|
+
value: nextCursor,
|
|
12
|
+
enumerable: false,
|
|
13
|
+
configurable: true
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
var PRINTABLE_ASCII_REGEX = /^[\x20-\x7E]*$/;
|
|
19
|
+
var MAX_METADATA_BYTES = 2048;
|
|
20
|
+
function validateStorageMetadata(metadata) {
|
|
21
|
+
if (!metadata) return;
|
|
22
|
+
let totalBytes = 0;
|
|
23
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
24
|
+
if (!key || typeof value !== "string" || !PRINTABLE_ASCII_REGEX.test(key) || !PRINTABLE_ASCII_REGEX.test(value)) {
|
|
25
|
+
const err = new Error(
|
|
26
|
+
"Invalid storage metadata: keys and values must contain printable ASCII characters only"
|
|
27
|
+
);
|
|
28
|
+
err.status = 400;
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
totalBytes += key.length + value.length;
|
|
32
|
+
if (totalBytes > MAX_METADATA_BYTES) {
|
|
33
|
+
const err = new Error(
|
|
34
|
+
`Storage metadata exceeds maximum size of ${MAX_METADATA_BYTES} bytes`
|
|
35
|
+
);
|
|
36
|
+
err.status = 400;
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function createStorageAdapter(adapter) {
|
|
42
|
+
return adapter;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// src/storage/memoryAdapter.ts
|
|
46
|
+
function createMemoryStorageAdapter(options = {}) {
|
|
47
|
+
const baseUrl = (options.baseUrl || "https://memory.local/uploads").replace(
|
|
48
|
+
/\/+$/,
|
|
49
|
+
""
|
|
50
|
+
);
|
|
51
|
+
const store = /* @__PURE__ */ new Map();
|
|
52
|
+
const toKey = (bucket, path) => `${bucket}::${path.replace(/^\/+/, "")}`;
|
|
53
|
+
const getPublicUrl = (bucket, path) => {
|
|
54
|
+
const cleanPath = path.replace(/^\/+/, "");
|
|
55
|
+
return `${baseUrl}/${bucket}/${cleanPath}`;
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
async upload(params) {
|
|
59
|
+
const cleanPath = params.path.replace(/^\/+/, "");
|
|
60
|
+
const key = toKey(params.bucket, cleanPath);
|
|
61
|
+
if (params.upsert === false && store.has(key)) {
|
|
62
|
+
const existsErr = new Error(
|
|
63
|
+
`Object already exists at ${params.bucket}/${cleanPath}`
|
|
64
|
+
);
|
|
65
|
+
existsErr.code = "EEXIST";
|
|
66
|
+
throw existsErr;
|
|
67
|
+
}
|
|
68
|
+
store.set(key, {
|
|
69
|
+
bucket: params.bucket,
|
|
70
|
+
path: cleanPath,
|
|
71
|
+
data: new Uint8Array(params.data),
|
|
72
|
+
contentType: params.contentType,
|
|
73
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
74
|
+
metadata: params.metadata
|
|
75
|
+
});
|
|
76
|
+
return {
|
|
77
|
+
bucket: params.bucket,
|
|
78
|
+
path: cleanPath,
|
|
79
|
+
url: getPublicUrl(params.bucket, cleanPath)
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
async delete(bucket, path) {
|
|
83
|
+
const key = toKey(bucket, path);
|
|
84
|
+
store.delete(key);
|
|
85
|
+
},
|
|
86
|
+
async exists(bucket, path) {
|
|
87
|
+
return store.has(toKey(bucket, path));
|
|
88
|
+
},
|
|
89
|
+
getPublicUrl,
|
|
90
|
+
async list(bucket, folder, listOptions) {
|
|
91
|
+
const cleanFolder = folder ? folder.replace(/^\/+|\/+$/g, "") : "";
|
|
92
|
+
const entries = [];
|
|
93
|
+
for (const obj of store.values()) {
|
|
94
|
+
if (obj.bucket !== bucket) continue;
|
|
95
|
+
if (cleanFolder && !obj.path.startsWith(`${cleanFolder}/`)) continue;
|
|
96
|
+
const name = cleanFolder ? obj.path.slice(cleanFolder.length + 1) : obj.path;
|
|
97
|
+
entries.push({
|
|
98
|
+
name,
|
|
99
|
+
id: `${obj.bucket}/${obj.path}`,
|
|
100
|
+
createdAt: obj.createdAt,
|
|
101
|
+
size: obj.data.byteLength
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const offset = listOptions?.cursor ? Number(listOptions.cursor) || 0 : 0;
|
|
105
|
+
const limit = listOptions?.limit ?? entries.length;
|
|
106
|
+
const sliced = listOptions?.limit !== void 0 || offset > 0 ? entries.slice(offset, offset + limit) : entries;
|
|
107
|
+
const nextCursor = listOptions?.limit !== void 0 && offset + sliced.length < entries.length ? String(offset + sliced.length) : void 0;
|
|
108
|
+
return toPaginatedListResult(sliced, nextCursor);
|
|
109
|
+
},
|
|
110
|
+
async deleteByUrl(url) {
|
|
111
|
+
const parsed = this.parseUrl?.(url);
|
|
112
|
+
if (!parsed || !parsed.bucket) return false;
|
|
113
|
+
const key = toKey(parsed.bucket, parsed.path);
|
|
114
|
+
return store.delete(key);
|
|
115
|
+
},
|
|
116
|
+
parseUrl(url) {
|
|
117
|
+
const prefix = `${baseUrl}/`;
|
|
118
|
+
if (!url || !url.startsWith(prefix)) return null;
|
|
119
|
+
const cleanUrl = url.split(/[?#]/)[0];
|
|
120
|
+
const rest = cleanUrl.slice(prefix.length);
|
|
121
|
+
const slashIdx = rest.indexOf("/");
|
|
122
|
+
if (slashIdx <= 0 || slashIdx === rest.length - 1) return null;
|
|
123
|
+
const bucket = rest.slice(0, slashIdx);
|
|
124
|
+
const filePath = rest.slice(slashIdx + 1);
|
|
125
|
+
return { bucket, path: filePath };
|
|
126
|
+
},
|
|
127
|
+
getObject(bucket, path) {
|
|
128
|
+
return store.get(toKey(bucket, path));
|
|
129
|
+
},
|
|
130
|
+
clear() {
|
|
131
|
+
store.clear();
|
|
132
|
+
},
|
|
133
|
+
get size() {
|
|
134
|
+
return store.size;
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export {
|
|
140
|
+
toPaginatedListResult,
|
|
141
|
+
validateStorageMetadata,
|
|
142
|
+
createStorageAdapter,
|
|
143
|
+
createMemoryStorageAdapter
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=chunk-MHGQEBPW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/types.ts","../src/storage/memoryAdapter.ts"],"sourcesContent":["import type { ImageUploadRecord } from '../types';\r\n\r\nexport interface StorageUploadParams {\r\n bucket: string;\r\n path: string;\r\n data: Buffer | Uint8Array;\r\n contentType: string;\r\n upsert?: boolean;\r\n cacheControl?: string;\r\n contentHash?: string;\r\n metadata?: Record<string, string>;\r\n}\r\n\r\nexport interface StorageUploadResult {\r\n bucket: string;\r\n path: string;\r\n url: string;\r\n}\r\n\r\nexport interface StorageFileEntry {\r\n name: string;\r\n id?: string;\r\n createdAt?: string;\r\n size?: number;\r\n}\r\n\r\nexport interface StorageListOptions {\r\n cursor?: string;\r\n limit?: number;\r\n}\r\n\r\nexport type StoragePaginatedListResult = StorageFileEntry[] & {\r\n items: StorageFileEntry[];\r\n nextCursor?: string;\r\n};\r\n\r\nexport type StorageUploadOptions = StorageUploadParams;\r\nexport type StorageFileMetadata = StorageFileEntry;\r\nexport type StorageListResult = StoragePaginatedListResult;\r\n\r\nexport interface StorageAdapter {\r\n /**\r\n * Upload optimized image bytes to your storage backend and return its public URL.\r\n */\r\n upload(params: StorageUploadParams): Promise<StorageUploadResult>;\r\n\r\n /**\r\n * Delete an image from your storage backend by bucket and relative path.\r\n */\r\n delete(bucket: string, path: string): Promise<void>;\r\n\r\n /**\r\n * Optional: Check whether an object exists at the given bucket and relative path.\r\n */\r\n exists?(bucket: string, path: string): Promise<boolean>;\r\n\r\n /**\r\n * Optional: Resolve a public URL for a bucket and path.\r\n */\r\n getPublicUrl?(bucket: string, path: string): string | Promise<string>;\r\n\r\n /**\r\n * Optional: List files inside a bucket/folder (supports optional cursor/limit pagination).\r\n */\r\n list?(\r\n bucket: string,\r\n folder?: string,\r\n options?: StorageListOptions,\r\n ): Promise<StoragePaginatedListResult>;\r\n\r\n /**\r\n * Optional: Delete an asset directly from its public URL.\r\n */\r\n deleteByUrl?(url: string): Promise<boolean>;\r\n\r\n /**\r\n * Optional: Parse a public storage URL into its bucket and relative path.\r\n */\r\n parseUrl?(url: string): { bucket?: string; path: string } | null;\r\n}\r\n\r\nexport type UploadRecordHook = (\r\n record: ImageUploadRecord,\r\n) => void | Promise<void>;\r\n\r\n/**\r\n * Attaches non-enumerable `.items` and `.nextCursor` properties to a `StorageFileEntry[]`\r\n * array so both array callers (`entries.map(...)`) and paginated destructuring callers\r\n * (`const { items, nextCursor } = await adapter.list(...)`) work seamlessly.\r\n */\r\nexport function toPaginatedListResult(\r\n entries: StorageFileEntry[],\r\n nextCursor?: string,\r\n): StoragePaginatedListResult {\r\n const result = entries as StoragePaginatedListResult;\r\n Object.defineProperties(result, {\r\n items: {\r\n value: entries,\r\n enumerable: false,\r\n configurable: true,\r\n },\r\n nextCursor: {\r\n value: nextCursor,\r\n enumerable: false,\r\n configurable: true,\r\n },\r\n });\r\n return result;\r\n}\r\n\r\nconst PRINTABLE_ASCII_REGEX = /^[\\x20-\\x7E]*$/;\r\nconst MAX_METADATA_BYTES = 2048;\r\n\r\n/**\r\n * Validates that storage metadata keys and values contain only printable ASCII\r\n * characters (preventing HTTP header/CRLF injection) and do not exceed 2 KB total.\r\n */\r\nexport function validateStorageMetadata(\r\n metadata?: Record<string, string>,\r\n): void {\r\n if (!metadata) return;\r\n let totalBytes = 0;\r\n\r\n for (const [key, value] of Object.entries(metadata)) {\r\n if (\r\n !key ||\r\n typeof value !== 'string' ||\r\n !PRINTABLE_ASCII_REGEX.test(key) ||\r\n !PRINTABLE_ASCII_REGEX.test(value)\r\n ) {\r\n const err = new Error(\r\n 'Invalid storage metadata: keys and values must contain printable ASCII characters only',\r\n ) as Error & { status?: number };\r\n err.status = 400;\r\n throw err;\r\n }\r\n totalBytes += key.length + value.length;\r\n if (totalBytes > MAX_METADATA_BYTES) {\r\n const err = new Error(\r\n `Storage metadata exceeds maximum size of ${MAX_METADATA_BYTES} bytes`,\r\n ) as Error & { status?: number };\r\n err.status = 400;\r\n throw err;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Type-safe helper for authoring a custom StorageAdapter (S3, R2, Vercel Blob, Firebase, etc.).\r\n */\r\nexport function createStorageAdapter(adapter: StorageAdapter): StorageAdapter {\r\n return adapter;\r\n}\r\n","import {\r\n type StorageAdapter,\r\n type StorageFileEntry,\r\n type StorageListOptions,\r\n type StoragePaginatedListResult,\r\n type StorageUploadParams,\r\n type StorageUploadResult,\r\n toPaginatedListResult,\r\n} from './types';\r\n\r\nexport interface StoredMemoryObject {\r\n bucket: string;\r\n path: string;\r\n data: Uint8Array;\r\n contentType: string;\r\n createdAt: string;\r\n metadata?: Record<string, string>;\r\n}\r\n\r\nexport interface MemoryStorageAdapter extends StorageAdapter {\r\n exists(bucket: string, path: string): Promise<boolean>;\r\n getPublicUrl(bucket: string, path: string): string;\r\n list(\r\n bucket: string,\r\n folder?: string,\r\n options?: StorageListOptions,\r\n ): Promise<StoragePaginatedListResult>;\r\n deleteByUrl(url: string): Promise<boolean>;\r\n getObject(bucket: string, path: string): StoredMemoryObject | undefined;\r\n clear(): void;\r\n readonly size: number;\r\n}\r\n\r\nexport interface MemoryStorageOptions {\r\n baseUrl?: string;\r\n}\r\n\r\nexport function createMemoryStorageAdapter(\r\n options: MemoryStorageOptions = {},\r\n): MemoryStorageAdapter {\r\n const baseUrl = (options.baseUrl || 'https://memory.local/uploads').replace(\r\n /\\/+$/,\r\n '',\r\n );\r\n const store = new Map<string, StoredMemoryObject>();\r\n\r\n const toKey = (bucket: string, path: string) =>\r\n `${bucket}::${path.replace(/^\\/+/, '')}`;\r\n\r\n const getPublicUrl = (bucket: string, path: string): string => {\r\n const cleanPath = path.replace(/^\\/+/, '');\r\n return `${baseUrl}/${bucket}/${cleanPath}`;\r\n };\r\n\r\n return {\r\n async upload(params: StorageUploadParams): Promise<StorageUploadResult> {\r\n const cleanPath = params.path.replace(/^\\/+/, '');\r\n const key = toKey(params.bucket, cleanPath);\r\n\r\n if (params.upsert === false && store.has(key)) {\r\n const existsErr = new Error(\r\n `Object already exists at ${params.bucket}/${cleanPath}`,\r\n ) as Error & { code?: string };\r\n existsErr.code = 'EEXIST';\r\n throw existsErr;\r\n }\r\n\r\n store.set(key, {\r\n bucket: params.bucket,\r\n path: cleanPath,\r\n data: new Uint8Array(params.data),\r\n contentType: params.contentType,\r\n createdAt: new Date().toISOString(),\r\n metadata: params.metadata,\r\n });\r\n\r\n return {\r\n bucket: params.bucket,\r\n path: cleanPath,\r\n url: getPublicUrl(params.bucket, cleanPath),\r\n };\r\n },\r\n\r\n async delete(bucket: string, path: string): Promise<void> {\r\n const key = toKey(bucket, path);\r\n store.delete(key);\r\n },\r\n\r\n async exists(bucket: string, path: string): Promise<boolean> {\r\n return store.has(toKey(bucket, path));\r\n },\r\n\r\n getPublicUrl,\r\n\r\n async list(\r\n bucket: string,\r\n folder?: string,\r\n listOptions?: StorageListOptions,\r\n ): Promise<StoragePaginatedListResult> {\r\n const cleanFolder = folder ? folder.replace(/^\\/+|\\/+$/g, '') : '';\r\n const entries: StorageFileEntry[] = [];\r\n\r\n for (const obj of store.values()) {\r\n if (obj.bucket !== bucket) continue;\r\n if (cleanFolder && !obj.path.startsWith(`${cleanFolder}/`)) continue;\r\n const name = cleanFolder\r\n ? obj.path.slice(cleanFolder.length + 1)\r\n : obj.path;\r\n entries.push({\r\n name,\r\n id: `${obj.bucket}/${obj.path}`,\r\n createdAt: obj.createdAt,\r\n size: obj.data.byteLength,\r\n });\r\n }\r\n\r\n const offset = listOptions?.cursor ? Number(listOptions.cursor) || 0 : 0;\r\n const limit = listOptions?.limit ?? entries.length;\r\n const sliced =\r\n listOptions?.limit !== undefined || offset > 0\r\n ? entries.slice(offset, offset + limit)\r\n : entries;\r\n const nextCursor =\r\n listOptions?.limit !== undefined && offset + sliced.length < entries.length\r\n ? String(offset + sliced.length)\r\n : undefined;\r\n\r\n return toPaginatedListResult(sliced, nextCursor);\r\n },\r\n\r\n async deleteByUrl(url: string): Promise<boolean> {\r\n const parsed = this.parseUrl?.(url);\r\n if (!parsed || !parsed.bucket) return false;\r\n const key = toKey(parsed.bucket, parsed.path);\r\n return store.delete(key);\r\n },\r\n\r\n parseUrl(url: string): { bucket?: string; path: string } | null {\r\n const prefix = `${baseUrl}/`;\r\n if (!url || !url.startsWith(prefix)) return null;\r\n const cleanUrl = url.split(/[?#]/)[0];\r\n const rest = cleanUrl.slice(prefix.length);\r\n const slashIdx = rest.indexOf('/');\r\n if (slashIdx <= 0 || slashIdx === rest.length - 1) return null;\r\n const bucket = rest.slice(0, slashIdx);\r\n const filePath = rest.slice(slashIdx + 1);\r\n return { bucket, path: filePath };\r\n },\r\n\r\n getObject(bucket: string, path: string): StoredMemoryObject | undefined {\r\n return store.get(toKey(bucket, path));\r\n },\r\n\r\n clear(): void {\r\n store.clear();\r\n },\r\n\r\n get size(): number {\r\n return store.size;\r\n },\r\n };\r\n}\r\n"],"mappings":";AA0FO,SAAS,sBACd,SACA,YAC4B;AAC5B,QAAM,SAAS;AACf,SAAO,iBAAiB,QAAQ;AAAA,IAC9B,OAAO;AAAA,MACL,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB;AAAA,IACA,YAAY;AAAA,MACV,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEA,IAAM,wBAAwB;AAC9B,IAAM,qBAAqB;AAMpB,SAAS,wBACd,UACM;AACN,MAAI,CAAC,SAAU;AACf,MAAI,aAAa;AAEjB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,QACE,CAAC,OACD,OAAO,UAAU,YACjB,CAAC,sBAAsB,KAAK,GAAG,KAC/B,CAAC,sBAAsB,KAAK,KAAK,GACjC;AACA,YAAM,MAAM,IAAI;AAAA,QACd;AAAA,MACF;AACA,UAAI,SAAS;AACb,YAAM;AAAA,IACR;AACA,kBAAc,IAAI,SAAS,MAAM;AACjC,QAAI,aAAa,oBAAoB;AACnC,YAAM,MAAM,IAAI;AAAA,QACd,4CAA4C,kBAAkB;AAAA,MAChE;AACA,UAAI,SAAS;AACb,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAKO,SAAS,qBAAqB,SAAyC;AAC5E,SAAO;AACT;;;ACnHO,SAAS,2BACd,UAAgC,CAAC,GACX;AACtB,QAAM,WAAW,QAAQ,WAAW,gCAAgC;AAAA,IAClE;AAAA,IACA;AAAA,EACF;AACA,QAAM,QAAQ,oBAAI,IAAgC;AAElD,QAAM,QAAQ,CAAC,QAAgB,SAC7B,GAAG,MAAM,KAAK,KAAK,QAAQ,QAAQ,EAAE,CAAC;AAExC,QAAM,eAAe,CAAC,QAAgB,SAAyB;AAC7D,UAAM,YAAY,KAAK,QAAQ,QAAQ,EAAE;AACzC,WAAO,GAAG,OAAO,IAAI,MAAM,IAAI,SAAS;AAAA,EAC1C;AAEA,SAAO;AAAA,IACL,MAAM,OAAO,QAA2D;AACtE,YAAM,YAAY,OAAO,KAAK,QAAQ,QAAQ,EAAE;AAChD,YAAM,MAAM,MAAM,OAAO,QAAQ,SAAS;AAE1C,UAAI,OAAO,WAAW,SAAS,MAAM,IAAI,GAAG,GAAG;AAC7C,cAAM,YAAY,IAAI;AAAA,UACpB,4BAA4B,OAAO,MAAM,IAAI,SAAS;AAAA,QACxD;AACA,kBAAU,OAAO;AACjB,cAAM;AAAA,MACR;AAEA,YAAM,IAAI,KAAK;AAAA,QACb,QAAQ,OAAO;AAAA,QACf,MAAM;AAAA,QACN,MAAM,IAAI,WAAW,OAAO,IAAI;AAAA,QAChC,aAAa,OAAO;AAAA,QACpB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,UAAU,OAAO;AAAA,MACnB,CAAC;AAED,aAAO;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,MAAM;AAAA,QACN,KAAK,aAAa,OAAO,QAAQ,SAAS;AAAA,MAC5C;AAAA,IACF;AAAA,IAEA,MAAM,OAAO,QAAgB,MAA6B;AACxD,YAAM,MAAM,MAAM,QAAQ,IAAI;AAC9B,YAAM,OAAO,GAAG;AAAA,IAClB;AAAA,IAEA,MAAM,OAAO,QAAgB,MAAgC;AAC3D,aAAO,MAAM,IAAI,MAAM,QAAQ,IAAI,CAAC;AAAA,IACtC;AAAA,IAEA;AAAA,IAEA,MAAM,KACJ,QACA,QACA,aACqC;AACrC,YAAM,cAAc,SAAS,OAAO,QAAQ,cAAc,EAAE,IAAI;AAChE,YAAM,UAA8B,CAAC;AAErC,iBAAW,OAAO,MAAM,OAAO,GAAG;AAChC,YAAI,IAAI,WAAW,OAAQ;AAC3B,YAAI,eAAe,CAAC,IAAI,KAAK,WAAW,GAAG,WAAW,GAAG,EAAG;AAC5D,cAAM,OAAO,cACT,IAAI,KAAK,MAAM,YAAY,SAAS,CAAC,IACrC,IAAI;AACR,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA,IAAI,GAAG,IAAI,MAAM,IAAI,IAAI,IAAI;AAAA,UAC7B,WAAW,IAAI;AAAA,UACf,MAAM,IAAI,KAAK;AAAA,QACjB,CAAC;AAAA,MACH;AAEA,YAAM,SAAS,aAAa,SAAS,OAAO,YAAY,MAAM,KAAK,IAAI;AACvE,YAAM,QAAQ,aAAa,SAAS,QAAQ;AAC5C,YAAM,SACJ,aAAa,UAAU,UAAa,SAAS,IACzC,QAAQ,MAAM,QAAQ,SAAS,KAAK,IACpC;AACN,YAAM,aACJ,aAAa,UAAU,UAAa,SAAS,OAAO,SAAS,QAAQ,SACjE,OAAO,SAAS,OAAO,MAAM,IAC7B;AAEN,aAAO,sBAAsB,QAAQ,UAAU;AAAA,IACjD;AAAA,IAEA,MAAM,YAAY,KAA+B;AAC/C,YAAM,SAAS,KAAK,WAAW,GAAG;AAClC,UAAI,CAAC,UAAU,CAAC,OAAO,OAAQ,QAAO;AACtC,YAAM,MAAM,MAAM,OAAO,QAAQ,OAAO,IAAI;AAC5C,aAAO,MAAM,OAAO,GAAG;AAAA,IACzB;AAAA,IAEA,SAAS,KAAuD;AAC9D,YAAM,SAAS,GAAG,OAAO;AACzB,UAAI,CAAC,OAAO,CAAC,IAAI,WAAW,MAAM,EAAG,QAAO;AAC5C,YAAM,WAAW,IAAI,MAAM,MAAM,EAAE,CAAC;AACpC,YAAM,OAAO,SAAS,MAAM,OAAO,MAAM;AACzC,YAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,UAAI,YAAY,KAAK,aAAa,KAAK,SAAS,EAAG,QAAO;AAC1D,YAAM,SAAS,KAAK,MAAM,GAAG,QAAQ;AACrC,YAAM,WAAW,KAAK,MAAM,WAAW,CAAC;AACxC,aAAO,EAAE,QAAQ,MAAM,SAAS;AAAA,IAClC;AAAA,IAEA,UAAU,QAAgB,MAA8C;AACtE,aAAO,MAAM,IAAI,MAAM,QAAQ,IAAI,CAAC;AAAA,IACtC;AAAA,IAEA,QAAc;AACZ,YAAM,MAAM;AAAA,IACd;AAAA,IAEA,IAAI,OAAe;AACjB,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/storage/urlParser.ts
|
|
2
|
+
var DEFAULT_PUBLIC_STORAGE_PREFIX = "/storage/v1/object/public/";
|
|
3
|
+
function parsePublicStorageUrl(url, publicPrefix = DEFAULT_PUBLIC_STORAGE_PREFIX) {
|
|
4
|
+
if (!url) return null;
|
|
5
|
+
try {
|
|
6
|
+
const parsed = new URL(url, "http://localhost");
|
|
7
|
+
const pathname = parsed.pathname;
|
|
8
|
+
const prefixIndex = pathname.indexOf(publicPrefix);
|
|
9
|
+
if (prefixIndex === -1) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
const relativePath = pathname.slice(prefixIndex + publicPrefix.length).replace(/^\/+/, "");
|
|
13
|
+
const segments = relativePath.split("/").filter(Boolean);
|
|
14
|
+
if (segments.length < 2) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const [bucket, ...pathParts] = segments;
|
|
18
|
+
const filePath = pathParts.join("/");
|
|
19
|
+
const filename = pathParts[pathParts.length - 1];
|
|
20
|
+
const lastDotIndex = filename.lastIndexOf(".");
|
|
21
|
+
const extension = lastDotIndex >= 0 ? filename.slice(lastDotIndex) : null;
|
|
22
|
+
return {
|
|
23
|
+
bucket,
|
|
24
|
+
path: filePath,
|
|
25
|
+
filename,
|
|
26
|
+
extension
|
|
27
|
+
};
|
|
28
|
+
} catch (e) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
exports.DEFAULT_PUBLIC_STORAGE_PREFIX = DEFAULT_PUBLIC_STORAGE_PREFIX; exports.parsePublicStorageUrl = parsePublicStorageUrl;
|
|
37
|
+
//# sourceMappingURL=chunk-QHU7FUO4.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["e:\\Personal-Projects\\image-upload-kit\\dist\\chunk-QHU7FUO4.cjs"],"names":[],"mappings":"AAAA;AACA,IAAI,8BAA8B,EAAE,4BAA4B;AAChE,SAAS,qBAAqB,CAAC,GAAG,EAAE,aAAa,EAAE,6BAA6B,EAAE;AAClF,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,IAAI;AACvB,EAAE,IAAI;AACN,IAAI,MAAM,OAAO,EAAE,IAAI,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC;AACnD,IAAI,MAAM,SAAS,EAAE,MAAM,CAAC,QAAQ;AACpC,IAAI,MAAM,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC;AACtD,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,EAAE;AAC5B,MAAM,OAAO,IAAI;AACjB,IAAI;AACJ,IAAI,MAAM,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAC9F,IAAI,MAAM,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAC5D,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE;AAC7B,MAAM,OAAO,IAAI;AACjB,IAAI;AACJ,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,SAAS,EAAE,EAAE,QAAQ;AAC3C,IAAI,MAAM,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;AACxC,IAAI,MAAM,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;AACpD,IAAI,MAAM,aAAa,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC;AAClD,IAAI,MAAM,UAAU,EAAE,aAAa,GAAG,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,IAAI;AAC7E,IAAI,OAAO;AACX,MAAM,MAAM;AACZ,MAAM,IAAI,EAAE,QAAQ;AACpB,MAAM,QAAQ;AACd,MAAM;AACN,IAAI,CAAC;AACL,EAAE,EAAE,UAAM;AACV,IAAI,OAAO,IAAI;AACf,EAAE;AACF;AACA;AACA;AACE;AACA;AACF,6HAAC","file":"E:\\Personal-Projects\\image-upload-kit\\dist\\chunk-QHU7FUO4.cjs","sourcesContent":[null]}
|