@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.
Files changed (235) hide show
  1. package/README.md +96 -3
  2. package/dist/adapters/data-url.d.cts +1 -0
  3. package/dist/adapters/data-url.d.cts.map +1 -1
  4. package/dist/adapters/data-url.d.ts +1 -0
  5. package/dist/adapters/data-url.d.ts.map +1 -1
  6. package/dist/adapters/s3-multipart.cjs +425 -0
  7. package/dist/adapters/s3-multipart.d.cts +43 -0
  8. package/dist/adapters/s3-multipart.d.cts.map +1 -0
  9. package/dist/adapters/s3-multipart.d.ts +43 -0
  10. package/dist/adapters/s3-multipart.d.ts.map +1 -0
  11. package/dist/adapters/s3-multipart.js +387 -0
  12. package/dist/adapters/s3-presigned.d.cts +2 -0
  13. package/dist/adapters/s3-presigned.d.cts.map +1 -1
  14. package/dist/adapters/s3-presigned.d.ts +2 -0
  15. package/dist/adapters/s3-presigned.d.ts.map +1 -1
  16. package/dist/i18n/provider.d.cts +1 -0
  17. package/dist/i18n/provider.d.cts.map +1 -1
  18. package/dist/i18n/provider.d.ts +1 -0
  19. package/dist/i18n/provider.d.ts.map +1 -1
  20. package/dist/index.cjs +14 -0
  21. package/dist/index.d.cts +9 -3
  22. package/dist/index.d.cts.map +1 -1
  23. package/dist/index.d.ts +9 -3
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +3 -1
  26. package/dist/plugin.cjs +152 -12
  27. package/dist/plugin.d.cts +49 -1
  28. package/dist/plugin.d.cts.map +1 -1
  29. package/dist/plugin.d.ts +49 -1
  30. package/dist/plugin.d.ts.map +1 -1
  31. package/dist/plugin.js +147 -13
  32. package/dist/sources/composite-source.cjs +3 -0
  33. package/dist/sources/composite-source.d.cts.map +1 -1
  34. package/dist/sources/composite-source.d.ts.map +1 -1
  35. package/dist/sources/composite-source.js +3 -0
  36. package/dist/sources/federated-search.cjs +45 -7
  37. package/dist/sources/federated-search.d.cts.map +1 -1
  38. package/dist/sources/federated-search.d.ts.map +1 -1
  39. package/dist/sources/federated-search.js +45 -7
  40. package/dist/sources/provider.d.cts +5 -0
  41. package/dist/sources/provider.d.cts.map +1 -1
  42. package/dist/sources/provider.d.ts +5 -0
  43. package/dist/sources/provider.d.ts.map +1 -1
  44. package/dist/sources/unsplash/index.d.cts +1 -0
  45. package/dist/sources/unsplash/index.d.cts.map +1 -1
  46. package/dist/sources/unsplash/index.d.ts +1 -0
  47. package/dist/sources/unsplash/index.d.ts.map +1 -1
  48. package/dist/testing/index.d.cts +4 -0
  49. package/dist/testing/index.d.cts.map +1 -1
  50. package/dist/testing/index.d.ts +4 -0
  51. package/dist/testing/index.d.ts.map +1 -1
  52. package/dist/types/categories.d.cts +3 -0
  53. package/dist/types/categories.d.cts.map +1 -1
  54. package/dist/types/categories.d.ts +3 -0
  55. package/dist/types/categories.d.ts.map +1 -1
  56. package/dist/types/data-source.d.cts +9 -0
  57. package/dist/types/data-source.d.cts.map +1 -1
  58. package/dist/types/data-source.d.ts +9 -0
  59. package/dist/types/data-source.d.ts.map +1 -1
  60. package/dist/types/filter.d.cts +11 -0
  61. package/dist/types/filter.d.cts.map +1 -1
  62. package/dist/types/filter.d.ts +11 -0
  63. package/dist/types/filter.d.ts.map +1 -1
  64. package/dist/types/folders.d.cts +2 -0
  65. package/dist/types/folders.d.cts.map +1 -1
  66. package/dist/types/folders.d.ts +2 -0
  67. package/dist/types/folders.d.ts.map +1 -1
  68. package/dist/types/options.d.cts +57 -1
  69. package/dist/types/options.d.cts.map +1 -1
  70. package/dist/types/options.d.ts +57 -1
  71. package/dist/types/options.d.ts.map +1 -1
  72. package/dist/types/resumable.cjs +42 -0
  73. package/dist/types/resumable.d.cts +204 -0
  74. package/dist/types/resumable.d.cts.map +1 -0
  75. package/dist/types/resumable.d.ts +204 -0
  76. package/dist/types/resumable.d.ts.map +1 -0
  77. package/dist/types/resumable.js +4 -0
  78. package/dist/types/transform.cjs +18 -0
  79. package/dist/types/transform.d.cts +45 -0
  80. package/dist/types/transform.d.cts.map +1 -0
  81. package/dist/types/transform.d.ts +45 -0
  82. package/dist/types/transform.d.ts.map +1 -0
  83. package/dist/types/transform.js +1 -0
  84. package/dist/types/types.d.cts +17 -0
  85. package/dist/types/types.d.cts.map +1 -1
  86. package/dist/types/types.d.ts +17 -0
  87. package/dist/types/types.d.ts.map +1 -1
  88. package/dist/types/unsplash.d.cts +2 -0
  89. package/dist/types/unsplash.d.cts.map +1 -1
  90. package/dist/types/unsplash.d.ts +2 -0
  91. package/dist/types/unsplash.d.ts.map +1 -1
  92. package/dist/ui/AssetBrowser.d.cts +3 -1
  93. package/dist/ui/AssetBrowser.d.cts.map +1 -1
  94. package/dist/ui/AssetBrowser.d.ts +3 -1
  95. package/dist/ui/AssetBrowser.d.ts.map +1 -1
  96. package/dist/ui/AssetCommandPalette.d.cts +4 -1
  97. package/dist/ui/AssetCommandPalette.d.cts.map +1 -1
  98. package/dist/ui/AssetCommandPalette.d.ts +4 -1
  99. package/dist/ui/AssetCommandPalette.d.ts.map +1 -1
  100. package/dist/ui/AssetManagerUI.cjs +3 -1
  101. package/dist/ui/AssetManagerUI.d.cts +11 -2
  102. package/dist/ui/AssetManagerUI.d.cts.map +1 -1
  103. package/dist/ui/AssetManagerUI.d.ts +11 -2
  104. package/dist/ui/AssetManagerUI.d.ts.map +1 -1
  105. package/dist/ui/AssetManagerUI.js +3 -1
  106. package/dist/ui/DeleteAssetDialog.d.cts +4 -1
  107. package/dist/ui/DeleteAssetDialog.d.cts.map +1 -1
  108. package/dist/ui/DeleteAssetDialog.d.ts +4 -1
  109. package/dist/ui/DeleteAssetDialog.d.ts.map +1 -1
  110. package/dist/ui/DeleteFolderDialog.d.cts +4 -1
  111. package/dist/ui/DeleteFolderDialog.d.cts.map +1 -1
  112. package/dist/ui/DeleteFolderDialog.d.ts +4 -1
  113. package/dist/ui/DeleteFolderDialog.d.ts.map +1 -1
  114. package/dist/ui/EmptyFolderState.d.cts +4 -1
  115. package/dist/ui/EmptyFolderState.d.cts.map +1 -1
  116. package/dist/ui/EmptyFolderState.d.ts +4 -1
  117. package/dist/ui/EmptyFolderState.d.ts.map +1 -1
  118. package/dist/ui/FolderBreadcrumb.d.cts +4 -1
  119. package/dist/ui/FolderBreadcrumb.d.cts.map +1 -1
  120. package/dist/ui/FolderBreadcrumb.d.ts +4 -1
  121. package/dist/ui/FolderBreadcrumb.d.ts.map +1 -1
  122. package/dist/ui/FolderNameDialog.d.cts +3 -1
  123. package/dist/ui/FolderNameDialog.d.cts.map +1 -1
  124. package/dist/ui/FolderNameDialog.d.ts +3 -1
  125. package/dist/ui/FolderNameDialog.d.ts.map +1 -1
  126. package/dist/ui/FolderTree.d.cts +4 -1
  127. package/dist/ui/FolderTree.d.cts.map +1 -1
  128. package/dist/ui/FolderTree.d.ts +4 -1
  129. package/dist/ui/FolderTree.d.ts.map +1 -1
  130. package/dist/ui/MetadataPanel.d.cts +4 -1
  131. package/dist/ui/MetadataPanel.d.cts.map +1 -1
  132. package/dist/ui/MetadataPanel.d.ts +4 -1
  133. package/dist/ui/MetadataPanel.d.ts.map +1 -1
  134. package/dist/ui/MoveTargetPicker.d.cts +3 -1
  135. package/dist/ui/MoveTargetPicker.d.cts.map +1 -1
  136. package/dist/ui/MoveTargetPicker.d.ts +3 -1
  137. package/dist/ui/MoveTargetPicker.d.ts.map +1 -1
  138. package/dist/ui/ReplaceAssetDialog.cjs +7 -2
  139. package/dist/ui/ReplaceAssetDialog.d.cts +5 -2
  140. package/dist/ui/ReplaceAssetDialog.d.cts.map +1 -1
  141. package/dist/ui/ReplaceAssetDialog.d.ts +5 -2
  142. package/dist/ui/ReplaceAssetDialog.d.ts.map +1 -1
  143. package/dist/ui/ReplaceAssetDialog.js +7 -2
  144. package/dist/ui/UnsplashPanel.d.cts +4 -1
  145. package/dist/ui/UnsplashPanel.d.cts.map +1 -1
  146. package/dist/ui/UnsplashPanel.d.ts +4 -1
  147. package/dist/ui/UnsplashPanel.d.ts.map +1 -1
  148. package/dist/ui/UploadButton.cjs +7 -2
  149. package/dist/ui/UploadButton.d.cts +6 -2
  150. package/dist/ui/UploadButton.d.cts.map +1 -1
  151. package/dist/ui/UploadButton.d.ts +6 -2
  152. package/dist/ui/UploadButton.d.ts.map +1 -1
  153. package/dist/ui/UploadButton.js +7 -2
  154. package/dist/utils/asset-reference.cjs +87 -4
  155. package/dist/utils/asset-reference.d.cts +30 -6
  156. package/dist/utils/asset-reference.d.cts.map +1 -1
  157. package/dist/utils/asset-reference.d.ts +30 -6
  158. package/dist/utils/asset-reference.d.ts.map +1 -1
  159. package/dist/utils/asset-reference.js +83 -3
  160. package/dist/utils/csp.cjs +16 -0
  161. package/dist/utils/csp.d.cts +23 -0
  162. package/dist/utils/csp.d.cts.map +1 -1
  163. package/dist/utils/csp.d.ts +23 -0
  164. package/dist/utils/csp.d.ts.map +1 -1
  165. package/dist/utils/csp.js +16 -0
  166. package/dist/utils/data-source.cjs +19 -5
  167. package/dist/utils/data-source.d.cts +5 -1
  168. package/dist/utils/data-source.d.cts.map +1 -1
  169. package/dist/utils/data-source.d.ts +5 -1
  170. package/dist/utils/data-source.d.ts.map +1 -1
  171. package/dist/utils/data-source.js +19 -5
  172. package/dist/utils/errors.d.cts +5 -0
  173. package/dist/utils/errors.d.cts.map +1 -1
  174. package/dist/utils/errors.d.ts +5 -0
  175. package/dist/utils/errors.d.ts.map +1 -1
  176. package/dist/utils/query-param-transform.cjs +101 -0
  177. package/dist/utils/query-param-transform.d.cts +46 -0
  178. package/dist/utils/query-param-transform.d.cts.map +1 -0
  179. package/dist/utils/query-param-transform.d.ts +46 -0
  180. package/dist/utils/query-param-transform.d.ts.map +1 -0
  181. package/dist/utils/query-param-transform.js +60 -0
  182. package/dist/utils/registry.cjs +3 -0
  183. package/dist/utils/registry.d.cts +8 -0
  184. package/dist/utils/registry.d.cts.map +1 -1
  185. package/dist/utils/registry.d.ts +8 -0
  186. package/dist/utils/registry.d.ts.map +1 -1
  187. package/dist/utils/registry.js +3 -0
  188. package/dist/utils/resolver.cjs +19 -11
  189. package/dist/utils/resolver.d.cts +24 -0
  190. package/dist/utils/resolver.d.cts.map +1 -1
  191. package/dist/utils/resolver.d.ts +24 -0
  192. package/dist/utils/resolver.d.ts.map +1 -1
  193. package/dist/utils/resolver.js +19 -11
  194. package/dist/utils/retry.d.cts +2 -0
  195. package/dist/utils/retry.d.cts.map +1 -1
  196. package/dist/utils/retry.d.ts +2 -0
  197. package/dist/utils/retry.d.ts.map +1 -1
  198. package/dist/utils/run-resumable-upload.cjs +160 -0
  199. package/dist/utils/run-resumable-upload.d.cts +56 -0
  200. package/dist/utils/run-resumable-upload.d.cts.map +1 -0
  201. package/dist/utils/run-resumable-upload.d.ts +56 -0
  202. package/dist/utils/run-resumable-upload.d.ts.map +1 -0
  203. package/dist/utils/run-resumable-upload.js +122 -0
  204. package/dist/utils/sniff-file-type.cjs +209 -0
  205. package/dist/utils/sniff-file-type.d.cts +25 -0
  206. package/dist/utils/sniff-file-type.d.cts.map +1 -0
  207. package/dist/utils/sniff-file-type.d.ts +25 -0
  208. package/dist/utils/sniff-file-type.d.ts.map +1 -0
  209. package/dist/utils/sniff-file-type.js +164 -0
  210. package/dist/utils/studio-asset-source.cjs +11 -6
  211. package/dist/utils/studio-asset-source.d.cts +5 -1
  212. package/dist/utils/studio-asset-source.d.cts.map +1 -1
  213. package/dist/utils/studio-asset-source.d.ts +5 -1
  214. package/dist/utils/studio-asset-source.d.ts.map +1 -1
  215. package/dist/utils/studio-asset-source.js +11 -6
  216. package/dist/utils/upload-session-store.cjs +125 -0
  217. package/dist/utils/upload-session-store.d.cts +55 -0
  218. package/dist/utils/upload-session-store.d.cts.map +1 -0
  219. package/dist/utils/upload-session-store.d.ts +55 -0
  220. package/dist/utils/upload-session-store.d.ts.map +1 -0
  221. package/dist/utils/upload-session-store.js +84 -0
  222. package/dist/utils/validate-upload-result.cjs +9 -1
  223. package/dist/utils/validate-upload-result.d.cts +1 -0
  224. package/dist/utils/validate-upload-result.d.cts.map +1 -1
  225. package/dist/utils/validate-upload-result.d.ts +1 -0
  226. package/dist/utils/validate-upload-result.d.ts.map +1 -1
  227. package/dist/utils/validate-upload-result.js +9 -1
  228. package/dist/version.cjs +1 -1
  229. package/dist/version.d.cts +1 -1
  230. package/dist/version.d.cts.map +1 -1
  231. package/dist/version.d.ts +1 -1
  232. package/dist/version.d.ts.map +1 -1
  233. package/dist/version.js +1 -1
  234. package/meta/config.json +1 -1
  235. package/package.json +42 -12
@@ -1,4 +1,84 @@
1
- function createAssetReference(id) {
2
- return `asset://${id}`;
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
- export { createAssetReference };
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 };
@@ -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
@@ -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
@@ -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;CACrD;AAED,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,wBAAgB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CA4C5E"}
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"}
@@ -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
@@ -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;CACrD;AAED,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,wBAAgB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CA4C5E"}
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
- return Promise.resolve();
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)registry.delete(assetId);
118
- return Promise.resolve();
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":"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"}
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":"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"}
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
- return Promise.resolve();
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)registry.delete(assetId);
85
- return Promise.resolve();
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 };
@@ -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;gBAGrB,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;gBAG9B,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,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;gBAGvC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,wBAA4C,EAClD,OAAO,SAAyC,EAChD,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAWvC"}
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"}
@@ -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;gBAGrB,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;gBAG9B,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,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;gBAGvC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,wBAA4C,EAClD,OAAO,SAAyC,EAChD,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAWvC"}
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
+ });