@anvilkit/plugin-asset-manager 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -3
- package/dist/adapters/data-url.d.cts +1 -0
- package/dist/adapters/data-url.d.cts.map +1 -1
- package/dist/adapters/data-url.d.ts +1 -0
- package/dist/adapters/data-url.d.ts.map +1 -1
- package/dist/adapters/s3-multipart.cjs +425 -0
- package/dist/adapters/s3-multipart.d.cts +43 -0
- package/dist/adapters/s3-multipart.d.cts.map +1 -0
- package/dist/adapters/s3-multipart.d.ts +43 -0
- package/dist/adapters/s3-multipart.d.ts.map +1 -0
- package/dist/adapters/s3-multipart.js +387 -0
- package/dist/adapters/s3-presigned.d.cts +2 -0
- package/dist/adapters/s3-presigned.d.cts.map +1 -1
- package/dist/adapters/s3-presigned.d.ts +2 -0
- package/dist/adapters/s3-presigned.d.ts.map +1 -1
- package/dist/i18n/provider.d.cts +1 -0
- package/dist/i18n/provider.d.cts.map +1 -1
- package/dist/i18n/provider.d.ts +1 -0
- package/dist/i18n/provider.d.ts.map +1 -1
- package/dist/index.cjs +14 -0
- package/dist/index.d.cts +9 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/plugin.cjs +152 -12
- package/dist/plugin.d.cts +49 -1
- package/dist/plugin.d.cts.map +1 -1
- package/dist/plugin.d.ts +49 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +147 -13
- package/dist/sources/composite-source.cjs +3 -0
- package/dist/sources/composite-source.d.cts.map +1 -1
- package/dist/sources/composite-source.d.ts.map +1 -1
- package/dist/sources/composite-source.js +3 -0
- package/dist/sources/federated-search.cjs +45 -7
- package/dist/sources/federated-search.d.cts.map +1 -1
- package/dist/sources/federated-search.d.ts.map +1 -1
- package/dist/sources/federated-search.js +45 -7
- package/dist/sources/provider.d.cts +5 -0
- package/dist/sources/provider.d.cts.map +1 -1
- package/dist/sources/provider.d.ts +5 -0
- package/dist/sources/provider.d.ts.map +1 -1
- package/dist/sources/unsplash/index.d.cts +1 -0
- package/dist/sources/unsplash/index.d.cts.map +1 -1
- package/dist/sources/unsplash/index.d.ts +1 -0
- package/dist/sources/unsplash/index.d.ts.map +1 -1
- package/dist/testing/index.d.cts +4 -0
- package/dist/testing/index.d.cts.map +1 -1
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/types/categories.d.cts +3 -0
- package/dist/types/categories.d.cts.map +1 -1
- package/dist/types/categories.d.ts +3 -0
- package/dist/types/categories.d.ts.map +1 -1
- package/dist/types/data-source.d.cts +9 -0
- package/dist/types/data-source.d.cts.map +1 -1
- package/dist/types/data-source.d.ts +9 -0
- package/dist/types/data-source.d.ts.map +1 -1
- package/dist/types/filter.d.cts +11 -0
- package/dist/types/filter.d.cts.map +1 -1
- package/dist/types/filter.d.ts +11 -0
- package/dist/types/filter.d.ts.map +1 -1
- package/dist/types/folders.d.cts +2 -0
- package/dist/types/folders.d.cts.map +1 -1
- package/dist/types/folders.d.ts +2 -0
- package/dist/types/folders.d.ts.map +1 -1
- package/dist/types/options.d.cts +57 -1
- package/dist/types/options.d.cts.map +1 -1
- package/dist/types/options.d.ts +57 -1
- package/dist/types/options.d.ts.map +1 -1
- package/dist/types/resumable.cjs +42 -0
- package/dist/types/resumable.d.cts +204 -0
- package/dist/types/resumable.d.cts.map +1 -0
- package/dist/types/resumable.d.ts +204 -0
- package/dist/types/resumable.d.ts.map +1 -0
- package/dist/types/resumable.js +4 -0
- package/dist/types/transform.cjs +18 -0
- package/dist/types/transform.d.cts +45 -0
- package/dist/types/transform.d.cts.map +1 -0
- package/dist/types/transform.d.ts +45 -0
- package/dist/types/transform.d.ts.map +1 -0
- package/dist/types/transform.js +1 -0
- package/dist/types/types.d.cts +17 -0
- package/dist/types/types.d.cts.map +1 -1
- package/dist/types/types.d.ts +17 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/unsplash.d.cts +2 -0
- package/dist/types/unsplash.d.cts.map +1 -1
- package/dist/types/unsplash.d.ts +2 -0
- package/dist/types/unsplash.d.ts.map +1 -1
- package/dist/ui/AssetBrowser.d.cts +3 -1
- package/dist/ui/AssetBrowser.d.cts.map +1 -1
- package/dist/ui/AssetBrowser.d.ts +3 -1
- package/dist/ui/AssetBrowser.d.ts.map +1 -1
- package/dist/ui/AssetCommandPalette.d.cts +4 -1
- package/dist/ui/AssetCommandPalette.d.cts.map +1 -1
- package/dist/ui/AssetCommandPalette.d.ts +4 -1
- package/dist/ui/AssetCommandPalette.d.ts.map +1 -1
- package/dist/ui/AssetManagerUI.cjs +3 -1
- package/dist/ui/AssetManagerUI.d.cts +11 -2
- package/dist/ui/AssetManagerUI.d.cts.map +1 -1
- package/dist/ui/AssetManagerUI.d.ts +11 -2
- package/dist/ui/AssetManagerUI.d.ts.map +1 -1
- package/dist/ui/AssetManagerUI.js +3 -1
- package/dist/ui/DeleteAssetDialog.d.cts +4 -1
- package/dist/ui/DeleteAssetDialog.d.cts.map +1 -1
- package/dist/ui/DeleteAssetDialog.d.ts +4 -1
- package/dist/ui/DeleteAssetDialog.d.ts.map +1 -1
- package/dist/ui/DeleteFolderDialog.d.cts +4 -1
- package/dist/ui/DeleteFolderDialog.d.cts.map +1 -1
- package/dist/ui/DeleteFolderDialog.d.ts +4 -1
- package/dist/ui/DeleteFolderDialog.d.ts.map +1 -1
- package/dist/ui/EmptyFolderState.d.cts +4 -1
- package/dist/ui/EmptyFolderState.d.cts.map +1 -1
- package/dist/ui/EmptyFolderState.d.ts +4 -1
- package/dist/ui/EmptyFolderState.d.ts.map +1 -1
- package/dist/ui/FolderBreadcrumb.d.cts +4 -1
- package/dist/ui/FolderBreadcrumb.d.cts.map +1 -1
- package/dist/ui/FolderBreadcrumb.d.ts +4 -1
- package/dist/ui/FolderBreadcrumb.d.ts.map +1 -1
- package/dist/ui/FolderNameDialog.d.cts +3 -1
- package/dist/ui/FolderNameDialog.d.cts.map +1 -1
- package/dist/ui/FolderNameDialog.d.ts +3 -1
- package/dist/ui/FolderNameDialog.d.ts.map +1 -1
- package/dist/ui/FolderTree.d.cts +4 -1
- package/dist/ui/FolderTree.d.cts.map +1 -1
- package/dist/ui/FolderTree.d.ts +4 -1
- package/dist/ui/FolderTree.d.ts.map +1 -1
- package/dist/ui/MetadataPanel.d.cts +4 -1
- package/dist/ui/MetadataPanel.d.cts.map +1 -1
- package/dist/ui/MetadataPanel.d.ts +4 -1
- package/dist/ui/MetadataPanel.d.ts.map +1 -1
- package/dist/ui/MoveTargetPicker.d.cts +3 -1
- package/dist/ui/MoveTargetPicker.d.cts.map +1 -1
- package/dist/ui/MoveTargetPicker.d.ts +3 -1
- package/dist/ui/MoveTargetPicker.d.ts.map +1 -1
- package/dist/ui/ReplaceAssetDialog.cjs +7 -2
- package/dist/ui/ReplaceAssetDialog.d.cts +5 -2
- package/dist/ui/ReplaceAssetDialog.d.cts.map +1 -1
- package/dist/ui/ReplaceAssetDialog.d.ts +5 -2
- package/dist/ui/ReplaceAssetDialog.d.ts.map +1 -1
- package/dist/ui/ReplaceAssetDialog.js +7 -2
- package/dist/ui/UnsplashPanel.d.cts +4 -1
- package/dist/ui/UnsplashPanel.d.cts.map +1 -1
- package/dist/ui/UnsplashPanel.d.ts +4 -1
- package/dist/ui/UnsplashPanel.d.ts.map +1 -1
- package/dist/ui/UploadButton.cjs +7 -2
- package/dist/ui/UploadButton.d.cts +6 -2
- package/dist/ui/UploadButton.d.cts.map +1 -1
- package/dist/ui/UploadButton.d.ts +6 -2
- package/dist/ui/UploadButton.d.ts.map +1 -1
- package/dist/ui/UploadButton.js +7 -2
- package/dist/utils/asset-reference.cjs +87 -4
- package/dist/utils/asset-reference.d.cts +30 -6
- package/dist/utils/asset-reference.d.cts.map +1 -1
- package/dist/utils/asset-reference.d.ts +30 -6
- package/dist/utils/asset-reference.d.ts.map +1 -1
- package/dist/utils/asset-reference.js +83 -3
- package/dist/utils/csp.cjs +16 -0
- package/dist/utils/csp.d.cts +23 -0
- package/dist/utils/csp.d.cts.map +1 -1
- package/dist/utils/csp.d.ts +23 -0
- package/dist/utils/csp.d.ts.map +1 -1
- package/dist/utils/csp.js +16 -0
- package/dist/utils/data-source.cjs +19 -5
- package/dist/utils/data-source.d.cts +5 -1
- package/dist/utils/data-source.d.cts.map +1 -1
- package/dist/utils/data-source.d.ts +5 -1
- package/dist/utils/data-source.d.ts.map +1 -1
- package/dist/utils/data-source.js +19 -5
- package/dist/utils/errors.d.cts +5 -0
- package/dist/utils/errors.d.cts.map +1 -1
- package/dist/utils/errors.d.ts +5 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/query-param-transform.cjs +101 -0
- package/dist/utils/query-param-transform.d.cts +46 -0
- package/dist/utils/query-param-transform.d.cts.map +1 -0
- package/dist/utils/query-param-transform.d.ts +46 -0
- package/dist/utils/query-param-transform.d.ts.map +1 -0
- package/dist/utils/query-param-transform.js +60 -0
- package/dist/utils/registry.cjs +3 -0
- package/dist/utils/registry.d.cts +8 -0
- package/dist/utils/registry.d.cts.map +1 -1
- package/dist/utils/registry.d.ts +8 -0
- package/dist/utils/registry.d.ts.map +1 -1
- package/dist/utils/registry.js +3 -0
- package/dist/utils/resolver.cjs +19 -11
- package/dist/utils/resolver.d.cts +24 -0
- package/dist/utils/resolver.d.cts.map +1 -1
- package/dist/utils/resolver.d.ts +24 -0
- package/dist/utils/resolver.d.ts.map +1 -1
- package/dist/utils/resolver.js +19 -11
- package/dist/utils/retry.d.cts +2 -0
- package/dist/utils/retry.d.cts.map +1 -1
- package/dist/utils/retry.d.ts +2 -0
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/run-resumable-upload.cjs +160 -0
- package/dist/utils/run-resumable-upload.d.cts +56 -0
- package/dist/utils/run-resumable-upload.d.cts.map +1 -0
- package/dist/utils/run-resumable-upload.d.ts +56 -0
- package/dist/utils/run-resumable-upload.d.ts.map +1 -0
- package/dist/utils/run-resumable-upload.js +122 -0
- package/dist/utils/sniff-file-type.cjs +209 -0
- package/dist/utils/sniff-file-type.d.cts +25 -0
- package/dist/utils/sniff-file-type.d.cts.map +1 -0
- package/dist/utils/sniff-file-type.d.ts +25 -0
- package/dist/utils/sniff-file-type.d.ts.map +1 -0
- package/dist/utils/sniff-file-type.js +164 -0
- package/dist/utils/studio-asset-source.cjs +11 -6
- package/dist/utils/studio-asset-source.d.cts +5 -1
- package/dist/utils/studio-asset-source.d.cts.map +1 -1
- package/dist/utils/studio-asset-source.d.ts +5 -1
- package/dist/utils/studio-asset-source.d.ts.map +1 -1
- package/dist/utils/studio-asset-source.js +11 -6
- package/dist/utils/upload-session-store.cjs +125 -0
- package/dist/utils/upload-session-store.d.cts +55 -0
- package/dist/utils/upload-session-store.d.cts.map +1 -0
- package/dist/utils/upload-session-store.d.ts +55 -0
- package/dist/utils/upload-session-store.d.ts.map +1 -0
- package/dist/utils/upload-session-store.js +84 -0
- package/dist/utils/validate-upload-result.cjs +9 -1
- package/dist/utils/validate-upload-result.d.cts +1 -0
- package/dist/utils/validate-upload-result.d.cts.map +1 -1
- package/dist/utils/validate-upload-result.d.ts +1 -0
- package/dist/utils/validate-upload-result.d.ts.map +1 -1
- package/dist/utils/validate-upload-result.js +9 -1
- package/dist/version.cjs +1 -1
- package/dist/version.d.cts +1 -1
- package/dist/version.d.cts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/meta/config.json +1 -1
- package/package.json +42 -12
|
@@ -1,4 +1,84 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
const ASSET_REFERENCE_PREFIX = "asset://";
|
|
2
|
+
function createAssetReference(id, transform) {
|
|
3
|
+
const base = `${ASSET_REFERENCE_PREFIX}${encodeId(id)}`;
|
|
4
|
+
if (void 0 === transform) return base;
|
|
5
|
+
const query = encodeTransform(transform);
|
|
6
|
+
return "" === query ? base : `${base}?${query}`;
|
|
3
7
|
}
|
|
4
|
-
|
|
8
|
+
function parseAssetReference(url) {
|
|
9
|
+
if (!url.startsWith(ASSET_REFERENCE_PREFIX)) return null;
|
|
10
|
+
const rest = url.slice(ASSET_REFERENCE_PREFIX.length);
|
|
11
|
+
const queryIndex = rest.indexOf("?");
|
|
12
|
+
const id = decodeId((-1 === queryIndex ? rest : rest.slice(0, queryIndex)).trim());
|
|
13
|
+
if ("" === id) return null;
|
|
14
|
+
if (-1 === queryIndex) return {
|
|
15
|
+
id
|
|
16
|
+
};
|
|
17
|
+
const transform = decodeTransform(rest.slice(queryIndex + 1));
|
|
18
|
+
return void 0 === transform ? {
|
|
19
|
+
id
|
|
20
|
+
} : {
|
|
21
|
+
id,
|
|
22
|
+
transform
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function encodeId(id) {
|
|
26
|
+
return id.replace(/%/g, "%25").replace(/\?/g, "%3F").replace(/#/g, "%23");
|
|
27
|
+
}
|
|
28
|
+
function decodeId(id) {
|
|
29
|
+
return id.replace(/%3F/gi, "?").replace(/%23/gi, "#").replace(/%25/g, "%");
|
|
30
|
+
}
|
|
31
|
+
const FITS = new Set([
|
|
32
|
+
"cover",
|
|
33
|
+
"contain",
|
|
34
|
+
"fill",
|
|
35
|
+
"inside",
|
|
36
|
+
"outside"
|
|
37
|
+
]);
|
|
38
|
+
const FORMATS = new Set([
|
|
39
|
+
"webp",
|
|
40
|
+
"avif",
|
|
41
|
+
"jpeg",
|
|
42
|
+
"png",
|
|
43
|
+
"auto"
|
|
44
|
+
]);
|
|
45
|
+
function encodeTransform(transform) {
|
|
46
|
+
const params = new URLSearchParams();
|
|
47
|
+
if (void 0 !== transform.width) params.set("w", String(transform.width));
|
|
48
|
+
if (void 0 !== transform.height) params.set("h", String(transform.height));
|
|
49
|
+
if (void 0 !== transform.fit) params.set("fit", transform.fit);
|
|
50
|
+
if (void 0 !== transform.format) params.set("fm", transform.format);
|
|
51
|
+
if (void 0 !== transform.quality) params.set("q", String(transform.quality));
|
|
52
|
+
if (void 0 !== transform.dpr) params.set("dpr", String(transform.dpr));
|
|
53
|
+
return params.toString();
|
|
54
|
+
}
|
|
55
|
+
function decodeTransform(query) {
|
|
56
|
+
const params = new URLSearchParams(query);
|
|
57
|
+
const out = {};
|
|
58
|
+
const width = toPositiveInteger(params.get("w"));
|
|
59
|
+
if (void 0 !== width) out.width = width;
|
|
60
|
+
const height = toPositiveInteger(params.get("h"));
|
|
61
|
+
if (void 0 !== height) out.height = height;
|
|
62
|
+
const fit = params.get("fit");
|
|
63
|
+
if (FITS.has(fit)) out.fit = fit;
|
|
64
|
+
const format = params.get("fm");
|
|
65
|
+
if (FORMATS.has(format)) out.format = format;
|
|
66
|
+
const quality = toPositiveInteger(params.get("q"));
|
|
67
|
+
if (void 0 !== quality && quality <= 100) out.quality = quality;
|
|
68
|
+
const dpr = toPositiveNumber(params.get("dpr"));
|
|
69
|
+
if (void 0 !== dpr) out.dpr = dpr;
|
|
70
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
71
|
+
}
|
|
72
|
+
const DECIMAL_INTEGER_RE = /^[0-9]+$/;
|
|
73
|
+
const DECIMAL_NUMBER_RE = /^[0-9]+(?:\.[0-9]+)?$/;
|
|
74
|
+
function toPositiveInteger(value) {
|
|
75
|
+
if (null === value || !DECIMAL_INTEGER_RE.test(value)) return;
|
|
76
|
+
const n = Number(value);
|
|
77
|
+
return Number.isSafeInteger(n) && n > 0 ? n : void 0;
|
|
78
|
+
}
|
|
79
|
+
function toPositiveNumber(value) {
|
|
80
|
+
if (null === value || !DECIMAL_NUMBER_RE.test(value)) return;
|
|
81
|
+
const n = Number(value);
|
|
82
|
+
return Number.isFinite(n) && n > 0 ? n : void 0;
|
|
83
|
+
}
|
|
84
|
+
export { createAssetReference, parseAssetReference };
|
package/dist/utils/csp.cjs
CHANGED
|
@@ -55,6 +55,22 @@ function getRequiredCsp(options = {}) {
|
|
|
55
55
|
mediaSrc.add(presignOrigin);
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
|
+
const multipartList = Array.isArray(options.s3Multipart) ? options.s3Multipart : options.s3Multipart ? [
|
|
59
|
+
options.s3Multipart
|
|
60
|
+
] : [];
|
|
61
|
+
for (const entry of multipartList){
|
|
62
|
+
const endpointOrigin = parseOrigin(entry.endpoint);
|
|
63
|
+
if (void 0 !== endpointOrigin) connectSrc.add(endpointOrigin);
|
|
64
|
+
const bucketOrigin = void 0 !== entry.bucketHost ? parseOrigin(entry.bucketHost) : void 0;
|
|
65
|
+
if (void 0 !== bucketOrigin) connectSrc.add(bucketOrigin);
|
|
66
|
+
const publicOrigin = void 0 !== entry.publicHost ? parseOrigin(entry.publicHost) : void 0;
|
|
67
|
+
const serveOrigin = publicOrigin ?? bucketOrigin;
|
|
68
|
+
if (void 0 !== serveOrigin) {
|
|
69
|
+
connectSrc.add(serveOrigin);
|
|
70
|
+
imgSrc.add(serveOrigin);
|
|
71
|
+
mediaSrc.add(serveOrigin);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
58
74
|
return Object.freeze({
|
|
59
75
|
connectSrc: Object.freeze([
|
|
60
76
|
...connectSrc
|
package/dist/utils/csp.d.cts
CHANGED
|
@@ -28,6 +28,25 @@ export interface S3CspOptions {
|
|
|
28
28
|
*/
|
|
29
29
|
readonly publicHost?: string;
|
|
30
30
|
}
|
|
31
|
+
/** CSP inputs for an `s3MultipartAdapter` instance. */
|
|
32
|
+
export interface S3MultipartCspOptions {
|
|
33
|
+
/** The broker `endpoint` configured on `s3MultipartAdapter`. */
|
|
34
|
+
readonly endpoint: string | URL;
|
|
35
|
+
/**
|
|
36
|
+
* Origin that part PUTs and the completed object live on (e.g.
|
|
37
|
+
* `https://my-bucket.s3.amazonaws.com`). Presigned part URLs target it
|
|
38
|
+
* directly, so it must be in `connect-src`. When omitted, only the broker
|
|
39
|
+
* endpoint origin is added and you must allow the bucket origin yourself.
|
|
40
|
+
*/
|
|
41
|
+
readonly bucketHost?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Separate public/CDN origin the completed object is served from, if it
|
|
44
|
+
* differs from `bucketHost`. Added to `connect-src` / `img-src` /
|
|
45
|
+
* `media-src`.
|
|
46
|
+
*/
|
|
47
|
+
readonly publicHost?: string;
|
|
48
|
+
}
|
|
49
|
+
/** Inputs describing which asset backends need CSP allowances. */
|
|
31
50
|
export interface RequiredCspOptions {
|
|
32
51
|
/** True if `dataUrlUploader` is mounted. Defaults to false. */
|
|
33
52
|
readonly dataUrl?: boolean;
|
|
@@ -35,11 +54,15 @@ export interface RequiredCspOptions {
|
|
|
35
54
|
readonly inMemory?: boolean;
|
|
36
55
|
/** Description of any `s3PresignedAdapter` instance(s). */
|
|
37
56
|
readonly s3?: S3CspOptions | readonly S3CspOptions[];
|
|
57
|
+
/** Description of any `s3MultipartAdapter` instance(s). */
|
|
58
|
+
readonly s3Multipart?: S3MultipartCspOptions | readonly S3MultipartCspOptions[];
|
|
38
59
|
}
|
|
60
|
+
/** Computed CSP directive sources needed for configured asset backends. */
|
|
39
61
|
export interface RequiredCsp {
|
|
40
62
|
readonly connectSrc: readonly string[];
|
|
41
63
|
readonly imgSrc: readonly string[];
|
|
42
64
|
readonly mediaSrc: readonly string[];
|
|
43
65
|
}
|
|
66
|
+
/** Compute CSP origins required by the configured asset upload backends. */
|
|
44
67
|
export declare function getRequiredCsp(options?: RequiredCspOptions): RequiredCsp;
|
|
45
68
|
//# sourceMappingURL=csp.d.cts.map
|
package/dist/utils/csp.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csp.d.cts","sourceRoot":"","sources":["../../src/utils/csp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,YAAY;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,GAAG,CAAC;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IAClC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,EAAE,YAAY,GAAG,SAAS,YAAY,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"csp.d.cts","sourceRoot":"","sources":["../../src/utils/csp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,YAAY;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,GAAG,CAAC;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,uDAAuD;AACvD,MAAM,WAAW,qBAAqB;IACrC,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,kEAAkE;AAClE,MAAM,WAAW,kBAAkB;IAClC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,EAAE,YAAY,GAAG,SAAS,YAAY,EAAE,CAAC;IACrD,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,CAAC,EAClB,qBAAqB,GACrB,SAAS,qBAAqB,EAAE,CAAC;CACpC;AAED,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAyE5E"}
|
package/dist/utils/csp.d.ts
CHANGED
|
@@ -28,6 +28,25 @@ export interface S3CspOptions {
|
|
|
28
28
|
*/
|
|
29
29
|
readonly publicHost?: string;
|
|
30
30
|
}
|
|
31
|
+
/** CSP inputs for an `s3MultipartAdapter` instance. */
|
|
32
|
+
export interface S3MultipartCspOptions {
|
|
33
|
+
/** The broker `endpoint` configured on `s3MultipartAdapter`. */
|
|
34
|
+
readonly endpoint: string | URL;
|
|
35
|
+
/**
|
|
36
|
+
* Origin that part PUTs and the completed object live on (e.g.
|
|
37
|
+
* `https://my-bucket.s3.amazonaws.com`). Presigned part URLs target it
|
|
38
|
+
* directly, so it must be in `connect-src`. When omitted, only the broker
|
|
39
|
+
* endpoint origin is added and you must allow the bucket origin yourself.
|
|
40
|
+
*/
|
|
41
|
+
readonly bucketHost?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Separate public/CDN origin the completed object is served from, if it
|
|
44
|
+
* differs from `bucketHost`. Added to `connect-src` / `img-src` /
|
|
45
|
+
* `media-src`.
|
|
46
|
+
*/
|
|
47
|
+
readonly publicHost?: string;
|
|
48
|
+
}
|
|
49
|
+
/** Inputs describing which asset backends need CSP allowances. */
|
|
31
50
|
export interface RequiredCspOptions {
|
|
32
51
|
/** True if `dataUrlUploader` is mounted. Defaults to false. */
|
|
33
52
|
readonly dataUrl?: boolean;
|
|
@@ -35,11 +54,15 @@ export interface RequiredCspOptions {
|
|
|
35
54
|
readonly inMemory?: boolean;
|
|
36
55
|
/** Description of any `s3PresignedAdapter` instance(s). */
|
|
37
56
|
readonly s3?: S3CspOptions | readonly S3CspOptions[];
|
|
57
|
+
/** Description of any `s3MultipartAdapter` instance(s). */
|
|
58
|
+
readonly s3Multipart?: S3MultipartCspOptions | readonly S3MultipartCspOptions[];
|
|
38
59
|
}
|
|
60
|
+
/** Computed CSP directive sources needed for configured asset backends. */
|
|
39
61
|
export interface RequiredCsp {
|
|
40
62
|
readonly connectSrc: readonly string[];
|
|
41
63
|
readonly imgSrc: readonly string[];
|
|
42
64
|
readonly mediaSrc: readonly string[];
|
|
43
65
|
}
|
|
66
|
+
/** Compute CSP origins required by the configured asset upload backends. */
|
|
44
67
|
export declare function getRequiredCsp(options?: RequiredCspOptions): RequiredCsp;
|
|
45
68
|
//# sourceMappingURL=csp.d.ts.map
|
package/dist/utils/csp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csp.d.ts","sourceRoot":"","sources":["../../src/utils/csp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,YAAY;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,GAAG,CAAC;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IAClC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,EAAE,YAAY,GAAG,SAAS,YAAY,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"csp.d.ts","sourceRoot":"","sources":["../../src/utils/csp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,YAAY;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,GAAG,CAAC;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,uDAAuD;AACvD,MAAM,WAAW,qBAAqB;IACrC,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,kEAAkE;AAClE,MAAM,WAAW,kBAAkB;IAClC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,EAAE,YAAY,GAAG,SAAS,YAAY,EAAE,CAAC;IACrD,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,CAAC,EAClB,qBAAqB,GACrB,SAAS,qBAAqB,EAAE,CAAC;CACpC;AAED,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAyE5E"}
|
package/dist/utils/csp.js
CHANGED
|
@@ -26,6 +26,22 @@ function getRequiredCsp(options = {}) {
|
|
|
26
26
|
mediaSrc.add(presignOrigin);
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
+
const multipartList = Array.isArray(options.s3Multipart) ? options.s3Multipart : options.s3Multipart ? [
|
|
30
|
+
options.s3Multipart
|
|
31
|
+
] : [];
|
|
32
|
+
for (const entry of multipartList){
|
|
33
|
+
const endpointOrigin = parseOrigin(entry.endpoint);
|
|
34
|
+
if (void 0 !== endpointOrigin) connectSrc.add(endpointOrigin);
|
|
35
|
+
const bucketOrigin = void 0 !== entry.bucketHost ? parseOrigin(entry.bucketHost) : void 0;
|
|
36
|
+
if (void 0 !== bucketOrigin) connectSrc.add(bucketOrigin);
|
|
37
|
+
const publicOrigin = void 0 !== entry.publicHost ? parseOrigin(entry.publicHost) : void 0;
|
|
38
|
+
const serveOrigin = publicOrigin ?? bucketOrigin;
|
|
39
|
+
if (void 0 !== serveOrigin) {
|
|
40
|
+
connectSrc.add(serveOrigin);
|
|
41
|
+
imgSrc.add(serveOrigin);
|
|
42
|
+
mediaSrc.add(serveOrigin);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
29
45
|
return Object.freeze({
|
|
30
46
|
connectSrc: Object.freeze([
|
|
31
47
|
...connectSrc
|
|
@@ -46,6 +46,9 @@ function makeAbortError() {
|
|
|
46
46
|
error.name = "AbortError";
|
|
47
47
|
return error;
|
|
48
48
|
}
|
|
49
|
+
function makeMoveDisabledError() {
|
|
50
|
+
return new external_errors_cjs_namespaceObject.AssetSourceError("MOVE_REJECTED", "Asset and folder moves are disabled by FolderOptions.allowMove.");
|
|
51
|
+
}
|
|
49
52
|
function createInMemoryDataSource(options) {
|
|
50
53
|
const { registry, upload, maxDepth } = options;
|
|
51
54
|
const folders = options.folderStore ?? (0, external_folders_cjs_namespaceObject.createFolderStore)();
|
|
@@ -84,10 +87,12 @@ function createInMemoryDataSource(options) {
|
|
|
84
87
|
}
|
|
85
88
|
return Promise.resolve(buildPage((0, external_registry_cjs_namespaceObject.paginateMatches)(matches, query), query));
|
|
86
89
|
},
|
|
87
|
-
remove (id) {
|
|
90
|
+
async remove (id) {
|
|
91
|
+
const removed = registry.get(id);
|
|
92
|
+
if (void 0 === removed) throw new external_errors_cjs_namespaceObject.AssetSourceError("ASSET_MUTATION_REJECTED", `Cannot delete unknown asset "${id}".`);
|
|
88
93
|
registry.delete(id);
|
|
89
94
|
folders.removeAsset(id);
|
|
90
|
-
|
|
95
|
+
await options.onDelete?.(removed);
|
|
91
96
|
},
|
|
92
97
|
async replace (id, payload, signal) {
|
|
93
98
|
const result = await upload(payload, signal ? {
|
|
@@ -103,6 +108,7 @@ function createInMemoryDataSource(options) {
|
|
|
103
108
|
return Promise.resolve(updated);
|
|
104
109
|
},
|
|
105
110
|
move (id, folderId) {
|
|
111
|
+
if (false === options.allowMove) return Promise.reject(makeMoveDisabledError());
|
|
106
112
|
folders.moveAsset(id, folderId);
|
|
107
113
|
return Promise.resolve();
|
|
108
114
|
},
|
|
@@ -112,12 +118,16 @@ function createInMemoryDataSource(options) {
|
|
|
112
118
|
renameFolder (id, name) {
|
|
113
119
|
return Promise.resolve(folders.renameFolder(id, name));
|
|
114
120
|
},
|
|
115
|
-
removeFolder (id, opts) {
|
|
121
|
+
async removeFolder (id, opts) {
|
|
116
122
|
const { removedAssetIds } = folders.removeFolder(id, opts);
|
|
117
|
-
for (const assetId of removedAssetIds)
|
|
118
|
-
|
|
123
|
+
for (const assetId of removedAssetIds){
|
|
124
|
+
const removed = registry.get(assetId);
|
|
125
|
+
registry.delete(assetId);
|
|
126
|
+
if (void 0 !== removed) await options.onDelete?.(removed);
|
|
127
|
+
}
|
|
119
128
|
},
|
|
120
129
|
moveFolder (id, parentId) {
|
|
130
|
+
if (false === options.allowMove) return Promise.reject(makeMoveDisabledError());
|
|
121
131
|
return Promise.resolve(folders.moveFolder(id, parentId, maxDepth));
|
|
122
132
|
},
|
|
123
133
|
subscribe (listener) {
|
|
@@ -177,6 +187,10 @@ function resolveDataSource(input) {
|
|
|
177
187
|
resolved.moveFolder = host.moveFolder.bind(host);
|
|
178
188
|
}
|
|
179
189
|
if ("function" == typeof host.subscribeStatus) resolved.subscribeStatus = host.subscribeStatus.bind(host);
|
|
190
|
+
if (false === input.allowMove) {
|
|
191
|
+
resolved.move = ()=>Promise.reject(makeMoveDisabledError());
|
|
192
|
+
resolved.moveFolder = ()=>Promise.reject(makeMoveDisabledError());
|
|
193
|
+
}
|
|
180
194
|
return resolved;
|
|
181
195
|
}
|
|
182
196
|
exports.createInMemoryDataSource = __webpack_exports__.createInMemoryDataSource;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import type { AssetDataSource, AssetSourceStatus, ReplacePayload } from "../types/data-source.js";
|
|
9
9
|
import type { AssetFilter, AssetListPage } from "../types/filter.js";
|
|
10
10
|
import type { AssetFolder, FolderId } from "../types/folders.js";
|
|
11
|
-
import type { AssetRegistry, UploadResult } from "../types/types.js";
|
|
11
|
+
import type { AssetDeletedHook, AssetRegistry, UploadResult } from "../types/types.js";
|
|
12
12
|
import { type FolderStore } from "./folders.js";
|
|
13
13
|
/**
|
|
14
14
|
* Binary ingest used by `replace` — the same `uploadAsset`-bound callback the
|
|
@@ -43,6 +43,10 @@ export interface CreateInMemoryDataSourceOptions {
|
|
|
43
43
|
readonly folderStore?: FolderStore;
|
|
44
44
|
/** Max nesting depth from `FolderOptions`. */
|
|
45
45
|
readonly maxDepth?: number;
|
|
46
|
+
/** Allow moving assets/folders. `undefined` ⇒ treated as `true`. */
|
|
47
|
+
readonly allowMove?: boolean;
|
|
48
|
+
/** Fired with the removed record after a successful asset delete. */
|
|
49
|
+
readonly onDelete?: AssetDeletedHook;
|
|
46
50
|
}
|
|
47
51
|
export declare function createInMemoryDataSource(options: CreateInMemoryDataSourceOptions): ResolvedAssetDataSource;
|
|
48
52
|
export interface ResolveDataSourceInput extends CreateInMemoryDataSourceOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-source.d.cts","sourceRoot":"","sources":["../../src/utils/data-source.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACX,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,KAAK,EACX,aAAa,EAEb,YAAY,EACZ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAGnE;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,CACtB,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KACvC,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B,mFAAmF;AACnF,MAAM,WAAW,uBAAuB;IACvC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACvE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,CACN,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,YAAY,CAAC,CAAC;IACzB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9E,IAAI,CACH,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,YAAY,CACX,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CAAC;IACxB,YAAY,CACX,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CAAC;IACxB,YAAY,CACX,EAAE,EAAE,QAAQ,EACZ,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,EACrC,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,UAAU,CACT,EAAE,EAAE,QAAQ,EACZ,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CAAC;IACxB,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,eAAe,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC3E,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC9B;AAED,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,iFAAiF;IACjF,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"data-source.d.cts","sourceRoot":"","sources":["../../src/utils/data-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import type { AssetDataSource, AssetSourceStatus, ReplacePayload } from "../types/data-source.js";
|
|
9
9
|
import type { AssetFilter, AssetListPage } from "../types/filter.js";
|
|
10
10
|
import type { AssetFolder, FolderId } from "../types/folders.js";
|
|
11
|
-
import type { AssetRegistry, UploadResult } from "../types/types.js";
|
|
11
|
+
import type { AssetDeletedHook, AssetRegistry, UploadResult } from "../types/types.js";
|
|
12
12
|
import { type FolderStore } from "./folders.js";
|
|
13
13
|
/**
|
|
14
14
|
* Binary ingest used by `replace` — the same `uploadAsset`-bound callback the
|
|
@@ -43,6 +43,10 @@ export interface CreateInMemoryDataSourceOptions {
|
|
|
43
43
|
readonly folderStore?: FolderStore;
|
|
44
44
|
/** Max nesting depth from `FolderOptions`. */
|
|
45
45
|
readonly maxDepth?: number;
|
|
46
|
+
/** Allow moving assets/folders. `undefined` ⇒ treated as `true`. */
|
|
47
|
+
readonly allowMove?: boolean;
|
|
48
|
+
/** Fired with the removed record after a successful asset delete. */
|
|
49
|
+
readonly onDelete?: AssetDeletedHook;
|
|
46
50
|
}
|
|
47
51
|
export declare function createInMemoryDataSource(options: CreateInMemoryDataSourceOptions): ResolvedAssetDataSource;
|
|
48
52
|
export interface ResolveDataSourceInput extends CreateInMemoryDataSourceOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-source.d.ts","sourceRoot":"","sources":["../../src/utils/data-source.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACX,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,KAAK,EACX,aAAa,EAEb,YAAY,EACZ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAGnE;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,CACtB,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KACvC,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B,mFAAmF;AACnF,MAAM,WAAW,uBAAuB;IACvC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACvE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,CACN,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,YAAY,CAAC,CAAC;IACzB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9E,IAAI,CACH,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,YAAY,CACX,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CAAC;IACxB,YAAY,CACX,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CAAC;IACxB,YAAY,CACX,EAAE,EAAE,QAAQ,EACZ,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,EACrC,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,UAAU,CACT,EAAE,EAAE,QAAQ,EACZ,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CAAC;IACxB,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,eAAe,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC3E,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC9B;AAED,MAAM,WAAW,+BAA+B;IAC/C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,iFAAiF;IACjF,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"data-source.d.ts","sourceRoot":"","sources":["../../src/utils/data-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,9 @@ function makeAbortError() {
|
|
|
13
13
|
error.name = "AbortError";
|
|
14
14
|
return error;
|
|
15
15
|
}
|
|
16
|
+
function makeMoveDisabledError() {
|
|
17
|
+
return new AssetSourceError("MOVE_REJECTED", "Asset and folder moves are disabled by FolderOptions.allowMove.");
|
|
18
|
+
}
|
|
16
19
|
function createInMemoryDataSource(options) {
|
|
17
20
|
const { registry, upload, maxDepth } = options;
|
|
18
21
|
const folders = options.folderStore ?? createFolderStore();
|
|
@@ -51,10 +54,12 @@ function createInMemoryDataSource(options) {
|
|
|
51
54
|
}
|
|
52
55
|
return Promise.resolve(buildPage(paginateMatches(matches, query), query));
|
|
53
56
|
},
|
|
54
|
-
remove (id) {
|
|
57
|
+
async remove (id) {
|
|
58
|
+
const removed = registry.get(id);
|
|
59
|
+
if (void 0 === removed) throw new AssetSourceError("ASSET_MUTATION_REJECTED", `Cannot delete unknown asset "${id}".`);
|
|
55
60
|
registry.delete(id);
|
|
56
61
|
folders.removeAsset(id);
|
|
57
|
-
|
|
62
|
+
await options.onDelete?.(removed);
|
|
58
63
|
},
|
|
59
64
|
async replace (id, payload, signal) {
|
|
60
65
|
const result = await upload(payload, signal ? {
|
|
@@ -70,6 +75,7 @@ function createInMemoryDataSource(options) {
|
|
|
70
75
|
return Promise.resolve(updated);
|
|
71
76
|
},
|
|
72
77
|
move (id, folderId) {
|
|
78
|
+
if (false === options.allowMove) return Promise.reject(makeMoveDisabledError());
|
|
73
79
|
folders.moveAsset(id, folderId);
|
|
74
80
|
return Promise.resolve();
|
|
75
81
|
},
|
|
@@ -79,12 +85,16 @@ function createInMemoryDataSource(options) {
|
|
|
79
85
|
renameFolder (id, name) {
|
|
80
86
|
return Promise.resolve(folders.renameFolder(id, name));
|
|
81
87
|
},
|
|
82
|
-
removeFolder (id, opts) {
|
|
88
|
+
async removeFolder (id, opts) {
|
|
83
89
|
const { removedAssetIds } = folders.removeFolder(id, opts);
|
|
84
|
-
for (const assetId of removedAssetIds)
|
|
85
|
-
|
|
90
|
+
for (const assetId of removedAssetIds){
|
|
91
|
+
const removed = registry.get(assetId);
|
|
92
|
+
registry.delete(assetId);
|
|
93
|
+
if (void 0 !== removed) await options.onDelete?.(removed);
|
|
94
|
+
}
|
|
86
95
|
},
|
|
87
96
|
moveFolder (id, parentId) {
|
|
97
|
+
if (false === options.allowMove) return Promise.reject(makeMoveDisabledError());
|
|
88
98
|
return Promise.resolve(folders.moveFolder(id, parentId, maxDepth));
|
|
89
99
|
},
|
|
90
100
|
subscribe (listener) {
|
|
@@ -144,6 +154,10 @@ function resolveDataSource(input) {
|
|
|
144
154
|
resolved.moveFolder = host.moveFolder.bind(host);
|
|
145
155
|
}
|
|
146
156
|
if ("function" == typeof host.subscribeStatus) resolved.subscribeStatus = host.subscribeStatus.bind(host);
|
|
157
|
+
if (false === input.allowMove) {
|
|
158
|
+
resolved.move = ()=>Promise.reject(makeMoveDisabledError());
|
|
159
|
+
resolved.moveFolder = ()=>Promise.reject(makeMoveDisabledError());
|
|
160
|
+
}
|
|
147
161
|
return resolved;
|
|
148
162
|
}
|
|
149
163
|
export { createInMemoryDataSource, resolveDataSource };
|
package/dist/utils/errors.d.cts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
/** Error thrown when an upload adapter returns an invalid result. */
|
|
1
2
|
export declare class AssetValidationError extends Error {
|
|
2
3
|
readonly code: string;
|
|
4
|
+
/** Create a validation error with a stable machine-readable code. */
|
|
3
5
|
constructor(code: string, message: string, options?: {
|
|
4
6
|
readonly cause?: unknown;
|
|
5
7
|
});
|
|
@@ -24,6 +26,7 @@ export declare class AssetSourceError extends Error {
|
|
|
24
26
|
readonly retryable: boolean;
|
|
25
27
|
readonly status?: number;
|
|
26
28
|
readonly retryAfterMs?: number;
|
|
29
|
+
/** Create an asset-source error with optional retry and status metadata. */
|
|
27
30
|
constructor(code: AssetSourceErrorCode, message: string, options?: {
|
|
28
31
|
readonly cause?: unknown;
|
|
29
32
|
readonly retryable?: boolean;
|
|
@@ -32,9 +35,11 @@ export declare class AssetSourceError extends Error {
|
|
|
32
35
|
});
|
|
33
36
|
}
|
|
34
37
|
export type AssetResolutionErrorCode = "ASSET_NOT_FOUND" | "ASSET_URL_REJECTED" | "ASSET_VALIDATION_FAILED";
|
|
38
|
+
/** Error thrown when an `asset://` reference cannot be resolved safely. */
|
|
35
39
|
export declare class AssetResolutionError extends Error {
|
|
36
40
|
readonly assetId: string;
|
|
37
41
|
readonly code: AssetResolutionErrorCode;
|
|
42
|
+
/** Create a resolver error for a specific asset id and failure code. */
|
|
38
43
|
constructor(assetId: string, code?: AssetResolutionErrorCode, message?: string, options?: {
|
|
39
44
|
readonly cause?: unknown;
|
|
40
45
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.cts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.cts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,qEAAqE;gBAEpE,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAUvC;AAED;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAC7B,yBAAyB,GACzB,qBAAqB,GACrB,yBAAyB,GACzB,kBAAkB,GAClB,cAAc,GACd,sBAAsB,GACtB,kBAAkB,GAClB,eAAe,GACf,uBAAuB,GACvB,uBAAuB,GACvB,kBAAkB,GAClB,uBAAuB,GACvB,kBAAkB,GAClB,qBAAqB,CAAC;AAEzB;;;;;;;GAOG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B,4EAA4E;gBAE3E,IAAI,EAAE,oBAAoB,EAC1B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACT,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;KAC/B;CAaF;AAED,MAAM,MAAM,wBAAwB,GACjC,iBAAiB,GACjB,oBAAoB,GACpB,yBAAyB,CAAC;AAE7B,2EAA2E;AAC3E,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IAExC,wEAAwE;gBAEvE,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,wBAA4C,EAClD,OAAO,SAAyC,EAChD,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAWvC"}
|
package/dist/utils/errors.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
/** Error thrown when an upload adapter returns an invalid result. */
|
|
1
2
|
export declare class AssetValidationError extends Error {
|
|
2
3
|
readonly code: string;
|
|
4
|
+
/** Create a validation error with a stable machine-readable code. */
|
|
3
5
|
constructor(code: string, message: string, options?: {
|
|
4
6
|
readonly cause?: unknown;
|
|
5
7
|
});
|
|
@@ -24,6 +26,7 @@ export declare class AssetSourceError extends Error {
|
|
|
24
26
|
readonly retryable: boolean;
|
|
25
27
|
readonly status?: number;
|
|
26
28
|
readonly retryAfterMs?: number;
|
|
29
|
+
/** Create an asset-source error with optional retry and status metadata. */
|
|
27
30
|
constructor(code: AssetSourceErrorCode, message: string, options?: {
|
|
28
31
|
readonly cause?: unknown;
|
|
29
32
|
readonly retryable?: boolean;
|
|
@@ -32,9 +35,11 @@ export declare class AssetSourceError extends Error {
|
|
|
32
35
|
});
|
|
33
36
|
}
|
|
34
37
|
export type AssetResolutionErrorCode = "ASSET_NOT_FOUND" | "ASSET_URL_REJECTED" | "ASSET_VALIDATION_FAILED";
|
|
38
|
+
/** Error thrown when an `asset://` reference cannot be resolved safely. */
|
|
35
39
|
export declare class AssetResolutionError extends Error {
|
|
36
40
|
readonly assetId: string;
|
|
37
41
|
readonly code: AssetResolutionErrorCode;
|
|
42
|
+
/** Create a resolver error for a specific asset id and failure code. */
|
|
38
43
|
constructor(assetId: string, code?: AssetResolutionErrorCode, message?: string, options?: {
|
|
39
44
|
readonly cause?: unknown;
|
|
40
45
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,qEAAqE;gBAEpE,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAUvC;AAED;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAC7B,yBAAyB,GACzB,qBAAqB,GACrB,yBAAyB,GACzB,kBAAkB,GAClB,cAAc,GACd,sBAAsB,GACtB,kBAAkB,GAClB,eAAe,GACf,uBAAuB,GACvB,uBAAuB,GACvB,kBAAkB,GAClB,uBAAuB,GACvB,kBAAkB,GAClB,qBAAqB,CAAC;AAEzB;;;;;;;GAOG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B,4EAA4E;gBAE3E,IAAI,EAAE,oBAAoB,EAC1B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACT,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;KAC/B;CAaF;AAED,MAAM,MAAM,wBAAwB,GACjC,iBAAiB,GACjB,oBAAoB,GACpB,yBAAyB,CAAC;AAE7B,2EAA2E;AAC3E,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IAExC,wEAAwE;gBAEvE,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,wBAA4C,EAClD,OAAO,SAAyC,EAChD,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAWvC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, getters, values)=>{
|
|
5
|
+
var define = (defs, kind)=>{
|
|
6
|
+
for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
[kind]: defs[key]
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
define(getters, "get");
|
|
12
|
+
define(values, "value");
|
|
13
|
+
};
|
|
14
|
+
})();
|
|
15
|
+
(()=>{
|
|
16
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
17
|
+
})();
|
|
18
|
+
(()=>{
|
|
19
|
+
__webpack_require__.r = (exports1)=>{
|
|
20
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
21
|
+
value: 'Module'
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
24
|
+
value: true
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
})();
|
|
28
|
+
var __webpack_exports__ = {};
|
|
29
|
+
__webpack_require__.r(__webpack_exports__);
|
|
30
|
+
function deriveVariantUrl(asset, transform, resolver) {
|
|
31
|
+
return resolver(asset, transform) ?? asset.url;
|
|
32
|
+
}
|
|
33
|
+
function createQueryParamTransformResolver(options = {}) {
|
|
34
|
+
const names = {
|
|
35
|
+
width: options.params?.width ?? "w",
|
|
36
|
+
height: options.params?.height ?? "h",
|
|
37
|
+
fit: options.params?.fit ?? "fit",
|
|
38
|
+
format: options.params?.format ?? "fm",
|
|
39
|
+
quality: options.params?.quality ?? "q",
|
|
40
|
+
dpr: options.params?.dpr ?? "dpr"
|
|
41
|
+
};
|
|
42
|
+
return (asset, transform)=>{
|
|
43
|
+
const params = [];
|
|
44
|
+
if (void 0 !== transform.width) params.push([
|
|
45
|
+
names.width,
|
|
46
|
+
String(transform.width)
|
|
47
|
+
]);
|
|
48
|
+
if (void 0 !== transform.height) params.push([
|
|
49
|
+
names.height,
|
|
50
|
+
String(transform.height)
|
|
51
|
+
]);
|
|
52
|
+
if (void 0 !== transform.fit) params.push([
|
|
53
|
+
names.fit,
|
|
54
|
+
options.fitMap?.[transform.fit] ?? transform.fit
|
|
55
|
+
]);
|
|
56
|
+
if (void 0 !== transform.format) params.push([
|
|
57
|
+
names.format,
|
|
58
|
+
options.formatMap?.[transform.format] ?? transform.format
|
|
59
|
+
]);
|
|
60
|
+
if (void 0 !== transform.quality) params.push([
|
|
61
|
+
names.quality,
|
|
62
|
+
String(transform.quality)
|
|
63
|
+
]);
|
|
64
|
+
if (void 0 !== transform.dpr) params.push([
|
|
65
|
+
names.dpr,
|
|
66
|
+
String(transform.dpr)
|
|
67
|
+
]);
|
|
68
|
+
if (0 === params.length) return;
|
|
69
|
+
return appendQueryParams(asset.url, params);
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function appendQueryParams(rawUrl, params) {
|
|
73
|
+
try {
|
|
74
|
+
const url = new URL(rawUrl);
|
|
75
|
+
for (const [key, value] of params)url.searchParams.set(key, value);
|
|
76
|
+
return url.toString();
|
|
77
|
+
} catch {
|
|
78
|
+
const hashIndex = rawUrl.indexOf("#");
|
|
79
|
+
const hash = -1 === hashIndex ? "" : rawUrl.slice(hashIndex);
|
|
80
|
+
const beforeHash = -1 === hashIndex ? rawUrl : rawUrl.slice(0, hashIndex);
|
|
81
|
+
const queryIndex = beforeHash.indexOf("?");
|
|
82
|
+
const path = -1 === queryIndex ? beforeHash : beforeHash.slice(0, queryIndex);
|
|
83
|
+
const search = new URLSearchParams(-1 === queryIndex ? "" : beforeHash.slice(queryIndex + 1));
|
|
84
|
+
for (const [key, value] of params)search.set(key, value);
|
|
85
|
+
const query = search.toString();
|
|
86
|
+
return `${path}${"" === query ? "" : `?${query}`}${hash}`;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
90
|
+
createQueryParamTransformResolver: ()=>createQueryParamTransformResolver,
|
|
91
|
+
deriveVariantUrl: ()=>deriveVariantUrl
|
|
92
|
+
});
|
|
93
|
+
exports.createQueryParamTransformResolver = __webpack_exports__.createQueryParamTransformResolver;
|
|
94
|
+
exports.deriveVariantUrl = __webpack_exports__.deriveVariantUrl;
|
|
95
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
96
|
+
"createQueryParamTransformResolver",
|
|
97
|
+
"deriveVariantUrl"
|
|
98
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
99
|
+
Object.defineProperty(exports, '__esModule', {
|
|
100
|
+
value: true
|
|
101
|
+
});
|