@anvilkit/plugin-asset-manager 0.1.2 → 0.1.4

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 (185) hide show
  1. package/README.md +366 -108
  2. package/dist/adapters/data-url.cjs +10 -6
  3. package/dist/adapters/data-url.d.cts +1 -1
  4. package/dist/adapters/data-url.d.cts.map +1 -1
  5. package/dist/adapters/data-url.d.ts +1 -1
  6. package/dist/adapters/data-url.d.ts.map +1 -1
  7. package/dist/adapters/data-url.js +7 -3
  8. package/dist/adapters/extract-image-dimensions.cjs +9 -0
  9. package/dist/adapters/extract-image-dimensions.d.cts +6 -0
  10. package/dist/adapters/extract-image-dimensions.d.cts.map +1 -1
  11. package/dist/adapters/extract-image-dimensions.d.ts +6 -0
  12. package/dist/adapters/extract-image-dimensions.d.ts.map +1 -1
  13. package/dist/adapters/extract-image-dimensions.js +9 -0
  14. package/dist/adapters/in-memory.cjs +6 -4
  15. package/dist/adapters/in-memory.d.cts +7 -1
  16. package/dist/adapters/in-memory.d.cts.map +1 -1
  17. package/dist/adapters/in-memory.d.ts +7 -1
  18. package/dist/adapters/in-memory.d.ts.map +1 -1
  19. package/dist/adapters/in-memory.js +6 -4
  20. package/dist/adapters/s3-presigned.cjs +90 -40
  21. package/dist/adapters/s3-presigned.d.cts +5 -4
  22. package/dist/adapters/s3-presigned.d.cts.map +1 -1
  23. package/dist/adapters/s3-presigned.d.ts +5 -4
  24. package/dist/adapters/s3-presigned.d.ts.map +1 -1
  25. package/dist/adapters/s3-presigned.js +80 -30
  26. package/dist/index.cjs +20 -20
  27. package/dist/index.d.cts +13 -13
  28. package/dist/index.d.cts.map +1 -1
  29. package/dist/index.d.ts +13 -13
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +7 -7
  32. package/dist/plugin.cjs +56 -31
  33. package/dist/plugin.d.cts +6 -5
  34. package/dist/plugin.d.cts.map +1 -1
  35. package/dist/plugin.d.ts +6 -5
  36. package/dist/plugin.d.ts.map +1 -1
  37. package/dist/plugin.js +34 -17
  38. package/dist/testing/index.cjs +2 -2
  39. package/dist/testing/index.d.cts +1 -1
  40. package/dist/testing/index.d.cts.map +1 -1
  41. package/dist/testing/index.d.ts +1 -1
  42. package/dist/testing/index.d.ts.map +1 -1
  43. package/dist/testing/index.js +1 -1
  44. package/dist/{types.d.cts → types/types.d.cts} +9 -1
  45. package/dist/types/types.d.cts.map +1 -0
  46. package/dist/{types.d.ts → types/types.d.ts} +9 -1
  47. package/dist/types/types.d.ts.map +1 -0
  48. package/dist/types/types.js +1 -0
  49. package/dist/ui/AssetBrowser.cjs +55 -20
  50. package/dist/ui/AssetBrowser.d.cts +11 -2
  51. package/dist/ui/AssetBrowser.d.cts.map +1 -1
  52. package/dist/ui/AssetBrowser.d.ts +11 -2
  53. package/dist/ui/AssetBrowser.d.ts.map +1 -1
  54. package/dist/ui/AssetBrowser.js +55 -20
  55. package/dist/ui/AssetCommandPalette.cjs +20 -11
  56. package/dist/ui/AssetCommandPalette.d.cts +1 -1
  57. package/dist/ui/AssetCommandPalette.d.cts.map +1 -1
  58. package/dist/ui/AssetCommandPalette.d.ts +1 -1
  59. package/dist/ui/AssetCommandPalette.d.ts.map +1 -1
  60. package/dist/ui/AssetCommandPalette.js +19 -10
  61. package/dist/ui/AssetManagerUI.cjs +3 -2
  62. package/dist/ui/AssetManagerUI.d.cts +1 -1
  63. package/dist/ui/AssetManagerUI.d.cts.map +1 -1
  64. package/dist/ui/AssetManagerUI.d.ts +1 -1
  65. package/dist/ui/AssetManagerUI.d.ts.map +1 -1
  66. package/dist/ui/AssetManagerUI.js +2 -1
  67. package/dist/ui/DeleteAssetDialog.cjs +1 -0
  68. package/dist/ui/DeleteAssetDialog.d.cts +1 -1
  69. package/dist/ui/DeleteAssetDialog.d.cts.map +1 -1
  70. package/dist/ui/DeleteAssetDialog.d.ts +1 -1
  71. package/dist/ui/DeleteAssetDialog.d.ts.map +1 -1
  72. package/dist/ui/DeleteAssetDialog.js +1 -0
  73. package/dist/ui/MetadataPanel.cjs +1 -0
  74. package/dist/ui/MetadataPanel.d.cts +1 -1
  75. package/dist/ui/MetadataPanel.d.cts.map +1 -1
  76. package/dist/ui/MetadataPanel.d.ts +1 -1
  77. package/dist/ui/MetadataPanel.d.ts.map +1 -1
  78. package/dist/ui/MetadataPanel.js +1 -0
  79. package/dist/ui/ReplaceAssetDialog.cjs +1 -0
  80. package/dist/ui/ReplaceAssetDialog.d.cts +1 -1
  81. package/dist/ui/ReplaceAssetDialog.d.cts.map +1 -1
  82. package/dist/ui/ReplaceAssetDialog.d.ts +1 -1
  83. package/dist/ui/ReplaceAssetDialog.d.ts.map +1 -1
  84. package/dist/ui/ReplaceAssetDialog.js +1 -0
  85. package/dist/ui/UploadButton.cjs +24 -9
  86. package/dist/ui/UploadButton.d.cts +1 -1
  87. package/dist/ui/UploadButton.d.cts.map +1 -1
  88. package/dist/ui/UploadButton.d.ts +1 -1
  89. package/dist/ui/UploadButton.d.ts.map +1 -1
  90. package/dist/ui/UploadButton.js +23 -8
  91. package/dist/ui/index.cjs +5 -5
  92. package/dist/utils/asset-reference.d.cts.map +1 -0
  93. package/dist/utils/asset-reference.d.ts.map +1 -0
  94. package/dist/utils/csp.d.cts.map +1 -0
  95. package/dist/utils/csp.d.ts.map +1 -0
  96. package/dist/utils/errors.d.cts.map +1 -0
  97. package/dist/utils/errors.d.ts.map +1 -0
  98. package/dist/utils/header-action.d.cts.map +1 -0
  99. package/dist/utils/header-action.d.ts.map +1 -0
  100. package/dist/{infer-kind.d.cts → utils/infer-kind.d.cts} +1 -1
  101. package/dist/utils/infer-kind.d.cts.map +1 -0
  102. package/dist/{infer-kind.d.ts → utils/infer-kind.d.ts} +1 -1
  103. package/dist/utils/infer-kind.d.ts.map +1 -0
  104. package/dist/utils/registry.d.cts +3 -0
  105. package/dist/utils/registry.d.cts.map +1 -0
  106. package/dist/utils/registry.d.ts +3 -0
  107. package/dist/utils/registry.d.ts.map +1 -0
  108. package/dist/{resolver.cjs → utils/resolver.cjs} +8 -3
  109. package/dist/{resolver.d.cts → utils/resolver.d.cts} +1 -1
  110. package/dist/utils/resolver.d.cts.map +1 -0
  111. package/dist/{resolver.d.ts → utils/resolver.d.ts} +1 -1
  112. package/dist/utils/resolver.d.ts.map +1 -0
  113. package/dist/{resolver.js → utils/resolver.js} +6 -1
  114. package/dist/{retry.cjs → utils/retry.cjs} +10 -8
  115. package/dist/utils/retry.d.cts.map +1 -0
  116. package/dist/utils/retry.d.ts.map +1 -0
  117. package/dist/{retry.js → utils/retry.js} +10 -8
  118. package/dist/{studio-asset-source.cjs → utils/studio-asset-source.cjs} +28 -7
  119. package/dist/{studio-asset-source.d.cts → utils/studio-asset-source.d.cts} +2 -2
  120. package/dist/utils/studio-asset-source.d.cts.map +1 -0
  121. package/dist/{studio-asset-source.d.ts → utils/studio-asset-source.d.ts} +2 -2
  122. package/dist/utils/studio-asset-source.d.ts.map +1 -0
  123. package/dist/{studio-asset-source.js → utils/studio-asset-source.js} +26 -5
  124. package/dist/{validate-upload-result.cjs → utils/validate-upload-result.cjs} +49 -10
  125. package/dist/{validate-upload-result.d.cts → utils/validate-upload-result.d.cts} +1 -1
  126. package/dist/utils/validate-upload-result.d.cts.map +1 -0
  127. package/dist/{validate-upload-result.d.ts → utils/validate-upload-result.d.ts} +1 -1
  128. package/dist/utils/validate-upload-result.d.ts.map +1 -0
  129. package/dist/{validate-upload-result.js → utils/validate-upload-result.js} +49 -10
  130. package/dist/version.cjs +36 -0
  131. package/dist/version.d.cts +20 -0
  132. package/dist/version.d.cts.map +1 -0
  133. package/dist/version.d.ts +20 -0
  134. package/dist/version.d.ts.map +1 -0
  135. package/dist/version.js +2 -0
  136. package/meta/config.json +8 -0
  137. package/package.json +23 -22
  138. package/dist/asset-reference.d.cts.map +0 -1
  139. package/dist/asset-reference.d.ts.map +0 -1
  140. package/dist/csp.d.cts.map +0 -1
  141. package/dist/csp.d.ts.map +0 -1
  142. package/dist/errors.d.cts.map +0 -1
  143. package/dist/errors.d.ts.map +0 -1
  144. package/dist/header-action.d.cts.map +0 -1
  145. package/dist/header-action.d.ts.map +0 -1
  146. package/dist/infer-kind.d.cts.map +0 -1
  147. package/dist/infer-kind.d.ts.map +0 -1
  148. package/dist/registry.d.cts +0 -3
  149. package/dist/registry.d.cts.map +0 -1
  150. package/dist/registry.d.ts +0 -3
  151. package/dist/registry.d.ts.map +0 -1
  152. package/dist/resolver.d.cts.map +0 -1
  153. package/dist/resolver.d.ts.map +0 -1
  154. package/dist/retry.d.cts.map +0 -1
  155. package/dist/retry.d.ts.map +0 -1
  156. package/dist/studio-asset-source.d.cts.map +0 -1
  157. package/dist/studio-asset-source.d.ts.map +0 -1
  158. package/dist/types.d.cts.map +0 -1
  159. package/dist/types.d.ts.map +0 -1
  160. package/dist/types.js +0 -0
  161. package/dist/validate-upload-result.d.cts.map +0 -1
  162. package/dist/validate-upload-result.d.ts.map +0 -1
  163. /package/dist/{types.cjs → types/types.cjs} +0 -0
  164. /package/dist/{asset-reference.cjs → utils/asset-reference.cjs} +0 -0
  165. /package/dist/{asset-reference.d.cts → utils/asset-reference.d.cts} +0 -0
  166. /package/dist/{asset-reference.d.ts → utils/asset-reference.d.ts} +0 -0
  167. /package/dist/{asset-reference.js → utils/asset-reference.js} +0 -0
  168. /package/dist/{csp.cjs → utils/csp.cjs} +0 -0
  169. /package/dist/{csp.d.cts → utils/csp.d.cts} +0 -0
  170. /package/dist/{csp.d.ts → utils/csp.d.ts} +0 -0
  171. /package/dist/{csp.js → utils/csp.js} +0 -0
  172. /package/dist/{errors.cjs → utils/errors.cjs} +0 -0
  173. /package/dist/{errors.d.cts → utils/errors.d.cts} +0 -0
  174. /package/dist/{errors.d.ts → utils/errors.d.ts} +0 -0
  175. /package/dist/{errors.js → utils/errors.js} +0 -0
  176. /package/dist/{header-action.cjs → utils/header-action.cjs} +0 -0
  177. /package/dist/{header-action.d.cts → utils/header-action.d.cts} +0 -0
  178. /package/dist/{header-action.d.ts → utils/header-action.d.ts} +0 -0
  179. /package/dist/{header-action.js → utils/header-action.js} +0 -0
  180. /package/dist/{infer-kind.cjs → utils/infer-kind.cjs} +0 -0
  181. /package/dist/{infer-kind.js → utils/infer-kind.js} +0 -0
  182. /package/dist/{registry.cjs → utils/registry.cjs} +0 -0
  183. /package/dist/{registry.js → utils/registry.js} +0 -0
  184. /package/dist/{retry.d.cts → utils/retry.d.cts} +0 -0
  185. /package/dist/{retry.d.ts → utils/retry.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"UploadButton.d.ts","sourceRoot":"","sources":["../../src/ui/UploadButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGrE,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAChB,SAAQ,IAAI,CACX,mBAAmB,EACjB,mBAAmB,GACnB,aAAa,GACb,UAAU,GACV,uBAAuB,GACvB,2BAA2B,CAC7B;IACD,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,KAAK,IAAI,CAAC;CACxE;AAED,wBAAgB,YAAY,CAAC,EAC5B,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,EACrB,WAAW,EACX,OAAO,EACP,UAAU,EACV,UAAU,EACV,QAAQ,GACR,EAAE,iBAAiB,2CAwJnB"}
1
+ {"version":3,"file":"UploadButton.d.ts","sourceRoot":"","sources":["../../src/ui/UploadButton.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAG3E,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAChB,SAAQ,IAAI,CACX,mBAAmB,EACjB,mBAAmB,GACnB,aAAa,GACb,UAAU,GACV,uBAAuB,GACvB,2BAA2B,CAC7B;IACD,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,KAAK,IAAI,CAAC;CACxE;AAED,wBAAgB,YAAY,CAAC,EAC5B,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,EACrB,WAAW,EACX,OAAO,EACP,UAAU,EACV,UAAU,EACV,QAAQ,GACR,EAAE,iBAAiB,2CA6KnB"}
@@ -1,6 +1,7 @@
1
+ "use client";
1
2
  import { Button } from "@anvilkit/ui/button";
2
3
  import { validateSelectedFile } from "../plugin.js";
3
- import { validateUploadResult } from "../validate-upload-result.js";
4
+ import { validateUploadResult } from "../utils/validate-upload-result.js";
4
5
  import * as __rspack_external_react from "react";
5
6
  function UploadButton({ acceptedMimeTypes, allowMixedScriptHostnames, dataUrlAllowlistOptIn, maxFileSize, onError, onProgress, onUploaded, uploader }) {
6
7
  const inputRef = __rspack_external_react.useRef(null);
@@ -8,11 +9,17 @@ function UploadButton({ acceptedMimeTypes, allowMixedScriptHostnames, dataUrlAll
8
9
  const [batch, setBatch] = __rspack_external_react.useState(null);
9
10
  const [isDragOver, setIsDragOver] = __rspack_external_react.useState(false);
10
11
  const isUploading = null !== batch;
12
+ const uploadAbortRef = __rspack_external_react.useRef(null);
13
+ __rspack_external_react.useEffect(()=>()=>uploadAbortRef.current?.abort(), []);
11
14
  const acceptAttr = __rspack_external_react.useMemo(()=>acceptedMimeTypes?.join(","), [
12
15
  acceptedMimeTypes
13
16
  ]);
14
17
  async function processFiles(files) {
15
18
  if (0 === files.length) return;
19
+ uploadAbortRef.current?.abort();
20
+ const controller = new AbortController();
21
+ uploadAbortRef.current = controller;
22
+ const { signal } = controller;
16
23
  const total = files.length;
17
24
  setErrorMessage(null);
18
25
  const initial = {
@@ -23,13 +30,17 @@ function UploadButton({ acceptedMimeTypes, allowMixedScriptHostnames, dataUrlAll
23
30
  onProgress?.(initial);
24
31
  let lastError = null;
25
32
  for(let index = 0; index < files.length; index += 1){
33
+ if (signal.aborted) return;
26
34
  const file = files[index];
27
35
  if (file) try {
28
36
  validateSelectedFile(file, {
29
37
  acceptedMimeTypes,
30
38
  maxFileSize
31
39
  });
32
- const uploaded = await uploader(file);
40
+ const uploaded = await uploader(file, {
41
+ signal
42
+ });
43
+ if (signal.aborted) return;
33
44
  const validated = validateUploadResult({
34
45
  ...uploaded,
35
46
  meta: {
@@ -45,17 +56,21 @@ function UploadButton({ acceptedMimeTypes, allowMixedScriptHostnames, dataUrlAll
45
56
  });
46
57
  onUploaded?.(validated);
47
58
  } catch (error) {
59
+ if (signal.aborted) return;
48
60
  lastError = error instanceof Error ? error.message : String(error);
49
61
  onError?.(error);
50
62
  } finally{
51
- const next = {
52
- completed: index + 1,
53
- total
54
- };
55
- setBatch(next);
56
- onProgress?.(next);
63
+ if (!signal.aborted) {
64
+ const next = {
65
+ completed: index + 1,
66
+ total
67
+ };
68
+ setBatch(next);
69
+ onProgress?.(next);
70
+ }
57
71
  }
58
72
  }
73
+ if (signal.aborted) return;
59
74
  if (null !== lastError) setErrorMessage(lastError);
60
75
  setBatch(null);
61
76
  onProgress?.(null);
package/dist/ui/index.cjs CHANGED
@@ -24,13 +24,13 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
- MetadataPanel: ()=>external_MetadataPanel_cjs_namespaceObject.MetadataPanel,
28
- DeleteAssetDialog: ()=>external_DeleteAssetDialog_cjs_namespaceObject.DeleteAssetDialog,
29
- AssetCommandPalette: ()=>external_AssetCommandPalette_cjs_namespaceObject.AssetCommandPalette,
30
- UploadButton: ()=>external_UploadButton_cjs_namespaceObject.UploadButton,
31
27
  AssetBrowser: ()=>external_AssetBrowser_cjs_namespaceObject.AssetBrowser,
28
+ AssetCommandPalette: ()=>external_AssetCommandPalette_cjs_namespaceObject.AssetCommandPalette,
32
29
  AssetManagerUI: ()=>external_AssetManagerUI_cjs_namespaceObject.AssetManagerUI,
33
- ReplaceAssetDialog: ()=>external_ReplaceAssetDialog_cjs_namespaceObject.ReplaceAssetDialog
30
+ DeleteAssetDialog: ()=>external_DeleteAssetDialog_cjs_namespaceObject.DeleteAssetDialog,
31
+ MetadataPanel: ()=>external_MetadataPanel_cjs_namespaceObject.MetadataPanel,
32
+ ReplaceAssetDialog: ()=>external_ReplaceAssetDialog_cjs_namespaceObject.ReplaceAssetDialog,
33
+ UploadButton: ()=>external_UploadButton_cjs_namespaceObject.UploadButton
34
34
  });
35
35
  const external_AssetBrowser_cjs_namespaceObject = require("./AssetBrowser.cjs");
36
36
  const external_AssetCommandPalette_cjs_namespaceObject = require("./AssetCommandPalette.cjs");
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-reference.d.cts","sourceRoot":"","sources":["../../src/utils/asset-reference.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEvD"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-reference.d.ts","sourceRoot":"","sources":["../../src/utils/asset-reference.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEvD"}
@@ -0,0 +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"}
@@ -0,0 +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"}
@@ -0,0 +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,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"}
@@ -0,0 +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,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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header-action.d.cts","sourceRoot":"","sources":["../../src/utils/header-action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,eAAO,MAAM,iBAAiB,EAAE,kBAQ/B,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header-action.d.ts","sourceRoot":"","sources":["../../src/utils/header-action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,eAAO,MAAM,iBAAiB,EAAE,kBAQ/B,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { AssetKind, UploadResult } from "./types.js";
1
+ import type { AssetKind, UploadResult } from "../types/types.js";
2
2
  /**
3
3
  * Library-management kind inference. Used by both
4
4
  * `AssetRegistry.search` (kind filter) and `inferStudioAssetKind`
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infer-kind.d.cts","sourceRoot":"","sources":["../../src/utils/infer-kind.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,CAgB7D"}
@@ -1,4 +1,4 @@
1
- import type { AssetKind, UploadResult } from "./types.js";
1
+ import type { AssetKind, UploadResult } from "../types/types.js";
2
2
  /**
3
3
  * Library-management kind inference. Used by both
4
4
  * `AssetRegistry.search` (kind filter) and `inferStudioAssetKind`
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infer-kind.d.ts","sourceRoot":"","sources":["../../src/utils/infer-kind.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,CAgB7D"}
@@ -0,0 +1,3 @@
1
+ import type { AssetRegistry } from "../types/types.js";
2
+ export declare function createAssetRegistry(): AssetRegistry;
3
+ //# sourceMappingURL=registry.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.cts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,aAAa,EAKb,MAAM,mBAAmB,CAAC;AAK3B,wBAAgB,mBAAmB,IAAI,aAAa,CA6EnD"}
@@ -0,0 +1,3 @@
1
+ import type { AssetRegistry } from "../types/types.js";
2
+ export declare function createAssetRegistry(): AssetRegistry;
3
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,aAAa,EAKb,MAAM,mBAAmB,CAAC;AAK3B,wBAAgB,mBAAmB,IAAI,aAAa,CA6EnD"}
@@ -24,8 +24,8 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
- resolveAssets: ()=>resolveAssets,
28
- createIRAssetResolver: ()=>createIRAssetResolver
27
+ createIRAssetResolver: ()=>createIRAssetResolver,
28
+ resolveAssets: ()=>resolveAssets
29
29
  });
30
30
  const external_errors_cjs_namespaceObject = require("./errors.cjs");
31
31
  const external_validate_upload_result_cjs_namespaceObject = require("./validate-upload-result.cjs");
@@ -137,7 +137,7 @@ function cloneNode(node, rewriteMap) {
137
137
  return {
138
138
  id: node.id,
139
139
  type: node.type,
140
- props: cloneValue(node.props, rewriteMap),
140
+ props: cloneProps(node.props, rewriteMap),
141
141
  ...node.children ? {
142
142
  children: node.children.map((child)=>cloneNode(child, rewriteMap))
143
143
  } : {},
@@ -157,6 +157,11 @@ function cloneAsset(asset, rewriteMap) {
157
157
  } : {}
158
158
  };
159
159
  }
160
+ function cloneProps(props, rewriteMap) {
161
+ const next = {};
162
+ for (const [key, value] of Object.entries(props))next[key] = cloneValue(value, rewriteMap, key);
163
+ return next;
164
+ }
160
165
  function cloneValue(value, rewriteMap, key) {
161
166
  if (Array.isArray(value)) return value.map((item)=>cloneValue(item, rewriteMap));
162
167
  if ("string" == typeof value) {
@@ -1,5 +1,5 @@
1
1
  import type { IRAssetResolver, PageIR } from "@anvilkit/core/types";
2
- import type { AssetRegistry } from "./types.js";
2
+ import type { AssetRegistry } from "../types/types.js";
3
3
  export interface CreateIRAssetResolverOptions {
4
4
  readonly registry: AssetRegistry;
5
5
  readonly dataUrlAllowlistOptIn?: boolean;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.cts","sourceRoot":"","sources":["../../src/utils/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,eAAe,EACf,MAAM,EAGN,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AA8BvD,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;CAC7C;AAED,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,4BAA4B,GACnC,eAAe,CAgDjB;AAED,wBAAsB,aAAa,CAClC,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
@@ -1,5 +1,5 @@
1
1
  import type { IRAssetResolver, PageIR } from "@anvilkit/core/types";
2
- import type { AssetRegistry } from "./types.js";
2
+ import type { AssetRegistry } from "../types/types.js";
3
3
  export interface CreateIRAssetResolverOptions {
4
4
  readonly registry: AssetRegistry;
5
5
  readonly dataUrlAllowlistOptIn?: boolean;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/utils/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,eAAe,EACf,MAAM,EAGN,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AA8BvD,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;CAC7C;AAED,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,4BAA4B,GACnC,eAAe,CAgDjB;AAED,wBAAsB,aAAa,CAClC,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
@@ -108,7 +108,7 @@ function cloneNode(node, rewriteMap) {
108
108
  return {
109
109
  id: node.id,
110
110
  type: node.type,
111
- props: cloneValue(node.props, rewriteMap),
111
+ props: cloneProps(node.props, rewriteMap),
112
112
  ...node.children ? {
113
113
  children: node.children.map((child)=>cloneNode(child, rewriteMap))
114
114
  } : {},
@@ -128,6 +128,11 @@ function cloneAsset(asset, rewriteMap) {
128
128
  } : {}
129
129
  };
130
130
  }
131
+ function cloneProps(props, rewriteMap) {
132
+ const next = {};
133
+ for (const [key, value] of Object.entries(props))next[key] = cloneValue(value, rewriteMap, key);
134
+ return next;
135
+ }
131
136
  function cloneValue(value, rewriteMap, key) {
132
137
  if (Array.isArray(value)) return value.map((item)=>cloneValue(item, rewriteMap));
133
138
  if ("string" == typeof value) {
@@ -92,21 +92,23 @@ function defaultSleep(ms, signal) {
92
92
  return Promise.resolve();
93
93
  }
94
94
  return new Promise((resolve, reject)=>{
95
+ let onAbort;
95
96
  const timer = setTimeout(()=>{
96
- signal?.removeEventListener("abort", onAbort);
97
+ if (signal && onAbort) signal.removeEventListener("abort", onAbort);
97
98
  resolve();
98
99
  }, ms);
99
- const onAbort = ()=>{
100
- clearTimeout(timer);
101
- reject(makeAbortError(signal));
102
- };
103
100
  if (signal) {
104
- if (signal.aborted) {
101
+ const activeSignal = signal;
102
+ onAbort = ()=>{
105
103
  clearTimeout(timer);
106
- reject(makeAbortError(signal));
104
+ reject(makeAbortError(activeSignal));
105
+ };
106
+ if (activeSignal.aborted) {
107
+ clearTimeout(timer);
108
+ reject(makeAbortError(activeSignal));
107
109
  return;
108
110
  }
109
- signal.addEventListener("abort", onAbort, {
111
+ activeSignal.addEventListener("abort", onAbort, {
110
112
  once: true
111
113
  });
112
114
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.cts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;GAWG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;gBAG9B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;CAYvE;AAED,MAAM,WAAW,YAAY;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IAC/B,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AAMD;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAChC,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACnC,OAAO,GAAE,YAAiB,GACxB,OAAO,CAAC,CAAC,CAAC,CAmCZ"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;GAWG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;gBAG9B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;CAYvE;AAED,MAAM,WAAW,YAAY;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IAC/B,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AAMD;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAChC,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACnC,OAAO,GAAE,YAAiB,GACxB,OAAO,CAAC,CAAC,CAAC,CAmCZ"}
@@ -63,21 +63,23 @@ function defaultSleep(ms, signal) {
63
63
  return Promise.resolve();
64
64
  }
65
65
  return new Promise((resolve, reject)=>{
66
+ let onAbort;
66
67
  const timer = setTimeout(()=>{
67
- signal?.removeEventListener("abort", onAbort);
68
+ if (signal && onAbort) signal.removeEventListener("abort", onAbort);
68
69
  resolve();
69
70
  }, ms);
70
- const onAbort = ()=>{
71
- clearTimeout(timer);
72
- reject(makeAbortError(signal));
73
- };
74
71
  if (signal) {
75
- if (signal.aborted) {
72
+ const activeSignal = signal;
73
+ onAbort = ()=>{
76
74
  clearTimeout(timer);
77
- reject(makeAbortError(signal));
75
+ reject(makeAbortError(activeSignal));
76
+ };
77
+ if (activeSignal.aborted) {
78
+ clearTimeout(timer);
79
+ reject(makeAbortError(activeSignal));
78
80
  return;
79
81
  }
80
- signal.addEventListener("abort", onAbort, {
82
+ activeSignal.addEventListener("abort", onAbort, {
81
83
  once: true
82
84
  });
83
85
  }
@@ -25,8 +25,8 @@ var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
27
  MAX_CONCURRENT_UPLOADS: ()=>MAX_CONCURRENT_UPLOADS,
28
- inferStudioAssetKind: ()=>inferStudioAssetKind,
29
- createStudioAssetSource: ()=>createStudioAssetSource
28
+ createStudioAssetSource: ()=>createStudioAssetSource,
29
+ inferStudioAssetKind: ()=>inferStudioAssetKind
30
30
  });
31
31
  const external_asset_reference_cjs_namespaceObject = require("./asset-reference.cjs");
32
32
  const external_infer_kind_cjs_namespaceObject = require("./infer-kind.cjs");
@@ -68,7 +68,7 @@ function createStudioAssetSource(options) {
68
68
  };
69
69
  return Promise.resolve(projected);
70
70
  },
71
- async upload (files, listener) {
71
+ async upload (files, listener, signal) {
72
72
  const fileList = Array.from(files);
73
73
  if (0 === fileList.length) return [];
74
74
  const totalBytes = fileList.reduce((acc, file)=>acc + file.size, 0);
@@ -80,6 +80,13 @@ function createStudioAssetSource(options) {
80
80
  listener?.(event);
81
81
  fanOut(event);
82
82
  };
83
+ const abortFromSignal = ()=>{
84
+ if (void 0 === abortError) abortError = signal?.reason instanceof Error ? signal.reason : makeAbortError();
85
+ };
86
+ if (signal?.aborted) abortFromSignal();
87
+ signal?.addEventListener("abort", abortFromSignal, {
88
+ once: true
89
+ });
83
90
  const runWorker = async ()=>{
84
91
  while(true){
85
92
  if (void 0 !== abortError) return;
@@ -88,7 +95,10 @@ function createStudioAssetSource(options) {
88
95
  const file = fileList[index];
89
96
  if (void 0 === file) return;
90
97
  try {
91
- const result = await upload(file);
98
+ const result = await upload(file, {
99
+ signal
100
+ });
101
+ if (void 0 !== abortError) return;
92
102
  bytesUploaded += file.size;
93
103
  const asset = project(result);
94
104
  results[index] = asset;
@@ -106,6 +116,7 @@ function createStudioAssetSource(options) {
106
116
  abortError = error;
107
117
  return;
108
118
  }
119
+ if (void 0 !== abortError || signal?.aborted) return;
109
120
  const message = error instanceof Error ? error.message : String(error);
110
121
  emit({
111
122
  type: "error",
@@ -117,9 +128,13 @@ function createStudioAssetSource(options) {
117
128
  const workerCount = Math.min(maxConcurrent, fileList.length);
118
129
  const workers = [];
119
130
  for(let i = 0; i < workerCount; i += 1)workers.push(runWorker());
120
- await Promise.all(workers);
121
- if (void 0 !== abortError) throw abortError;
122
- return results.filter((value)=>null !== value);
131
+ try {
132
+ await Promise.all(workers);
133
+ if (void 0 !== abortError) throw abortError;
134
+ return results.filter((value)=>null !== value);
135
+ } finally{
136
+ signal?.removeEventListener("abort", abortFromSignal);
137
+ }
123
138
  },
124
139
  delete (assetId) {
125
140
  registry.delete(assetId);
@@ -198,6 +213,12 @@ function isAbortError(error) {
198
213
  const name = error.name;
199
214
  return "AbortError" === name;
200
215
  }
216
+ function makeAbortError() {
217
+ if ("u" > typeof DOMException) return new DOMException("Upload aborted", "AbortError");
218
+ const error = new Error("Upload aborted");
219
+ error.name = "AbortError";
220
+ return error;
221
+ }
201
222
  exports.MAX_CONCURRENT_UPLOADS = __webpack_exports__.MAX_CONCURRENT_UPLOADS;
202
223
  exports.createStudioAssetSource = __webpack_exports__.createStudioAssetSource;
203
224
  exports.inferStudioAssetKind = __webpack_exports__.inferStudioAssetKind;
@@ -12,7 +12,7 @@
12
12
  * registry so the IR resolver and the sidebar see the same data.
13
13
  */
14
14
  import type { StudioAssetKind, StudioAssetSource } from "@anvilkit/core/types";
15
- import type { AssetRegistry, UploadResult } from "./types.js";
15
+ import type { AssetRegistry, UploadAdapterOptions, UploadResult } from "../types/types.js";
16
16
  /**
17
17
  * Default concurrency cap for batched uploads. Editors typically drag
18
18
  * 1–10 files at a time; three concurrent uploads strikes a balance
@@ -25,7 +25,7 @@ export interface CreateStudioAssetSourceOptions {
25
25
  * Performs the upload. Provided by the plugin so the adapter does
26
26
  * not need to depend on `StudioPluginContext` directly.
27
27
  */
28
- readonly upload: (file: File) => Promise<UploadResult>;
28
+ readonly upload: (file: File, options?: UploadAdapterOptions) => Promise<UploadResult>;
29
29
  /**
30
30
  * Optional thumbnail derivation. Returning a string sets
31
31
  * `StudioAsset.thumbnailUrl`; returning `undefined` suppresses the
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-asset-source.d.cts","sourceRoot":"","sources":["../../src/utils/studio-asset-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAEX,eAAe,EAGf,iBAAiB,EAGjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACX,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,MAAM,mBAAmB,CAAC;AAI3B;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,MAAM,WAAW,8BAA8B;IAC9C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,CAChB,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,oBAAoB,KAC1B,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3B;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,MAAM,GAAG,SAAS,CAAC;IACpE;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,wBAAgB,uBAAuB,CACtC,OAAO,EAAE,8BAA8B,GACrC,iBAAiB,CAqLnB;AA4BD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,eAAe,CAEzE"}
@@ -12,7 +12,7 @@
12
12
  * registry so the IR resolver and the sidebar see the same data.
13
13
  */
14
14
  import type { StudioAssetKind, StudioAssetSource } from "@anvilkit/core/types";
15
- import type { AssetRegistry, UploadResult } from "./types.js";
15
+ import type { AssetRegistry, UploadAdapterOptions, UploadResult } from "../types/types.js";
16
16
  /**
17
17
  * Default concurrency cap for batched uploads. Editors typically drag
18
18
  * 1–10 files at a time; three concurrent uploads strikes a balance
@@ -25,7 +25,7 @@ export interface CreateStudioAssetSourceOptions {
25
25
  * Performs the upload. Provided by the plugin so the adapter does
26
26
  * not need to depend on `StudioPluginContext` directly.
27
27
  */
28
- readonly upload: (file: File) => Promise<UploadResult>;
28
+ readonly upload: (file: File, options?: UploadAdapterOptions) => Promise<UploadResult>;
29
29
  /**
30
30
  * Optional thumbnail derivation. Returning a string sets
31
31
  * `StudioAsset.thumbnailUrl`; returning `undefined` suppresses the
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-asset-source.d.ts","sourceRoot":"","sources":["../../src/utils/studio-asset-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAEX,eAAe,EAGf,iBAAiB,EAGjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACX,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,MAAM,mBAAmB,CAAC;AAI3B;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,MAAM,WAAW,8BAA8B;IAC9C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,CAChB,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,oBAAoB,KAC1B,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3B;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,MAAM,GAAG,SAAS,CAAC;IACpE;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,wBAAgB,uBAAuB,CACtC,OAAO,EAAE,8BAA8B,GACrC,iBAAiB,CAqLnB;AA4BD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,eAAe,CAEzE"}
@@ -38,7 +38,7 @@ function createStudioAssetSource(options) {
38
38
  };
39
39
  return Promise.resolve(projected);
40
40
  },
41
- async upload (files, listener) {
41
+ async upload (files, listener, signal) {
42
42
  const fileList = Array.from(files);
43
43
  if (0 === fileList.length) return [];
44
44
  const totalBytes = fileList.reduce((acc, file)=>acc + file.size, 0);
@@ -50,6 +50,13 @@ function createStudioAssetSource(options) {
50
50
  listener?.(event);
51
51
  fanOut(event);
52
52
  };
53
+ const abortFromSignal = ()=>{
54
+ if (void 0 === abortError) abortError = signal?.reason instanceof Error ? signal.reason : makeAbortError();
55
+ };
56
+ if (signal?.aborted) abortFromSignal();
57
+ signal?.addEventListener("abort", abortFromSignal, {
58
+ once: true
59
+ });
53
60
  const runWorker = async ()=>{
54
61
  while(true){
55
62
  if (void 0 !== abortError) return;
@@ -58,7 +65,10 @@ function createStudioAssetSource(options) {
58
65
  const file = fileList[index];
59
66
  if (void 0 === file) return;
60
67
  try {
61
- const result = await upload(file);
68
+ const result = await upload(file, {
69
+ signal
70
+ });
71
+ if (void 0 !== abortError) return;
62
72
  bytesUploaded += file.size;
63
73
  const asset = project(result);
64
74
  results[index] = asset;
@@ -76,6 +86,7 @@ function createStudioAssetSource(options) {
76
86
  abortError = error;
77
87
  return;
78
88
  }
89
+ if (void 0 !== abortError || signal?.aborted) return;
79
90
  const message = error instanceof Error ? error.message : String(error);
80
91
  emit({
81
92
  type: "error",
@@ -87,9 +98,13 @@ function createStudioAssetSource(options) {
87
98
  const workerCount = Math.min(maxConcurrent, fileList.length);
88
99
  const workers = [];
89
100
  for(let i = 0; i < workerCount; i += 1)workers.push(runWorker());
90
- await Promise.all(workers);
91
- if (void 0 !== abortError) throw abortError;
92
- return results.filter((value)=>null !== value);
101
+ try {
102
+ await Promise.all(workers);
103
+ if (void 0 !== abortError) throw abortError;
104
+ return results.filter((value)=>null !== value);
105
+ } finally{
106
+ signal?.removeEventListener("abort", abortFromSignal);
107
+ }
93
108
  },
94
109
  delete (assetId) {
95
110
  registry.delete(assetId);
@@ -168,4 +183,10 @@ function isAbortError(error) {
168
183
  const name = error.name;
169
184
  return "AbortError" === name;
170
185
  }
186
+ function makeAbortError() {
187
+ if ("u" > typeof DOMException) return new DOMException("Upload aborted", "AbortError");
188
+ const error = new Error("Upload aborted");
189
+ error.name = "AbortError";
190
+ return error;
191
+ }
171
192
  export { MAX_CONCURRENT_UPLOADS, createStudioAssetSource, inferStudioAssetKind };
@@ -96,18 +96,57 @@ function assertNoMixedScriptHostname(url, options) {
96
96
  ].filter((s)=>scripts.has(s));
97
97
  if (hasLatin && confusable.length > 0) throw new external_errors_cjs_namespaceObject.AssetValidationError("MIXED_SCRIPT_HOSTNAME", `Upload adapter returned a URL whose hostname mixes Latin with a visually confusable script (${confusable.join(", ")}). Set allowMixedScriptHostnames: true to permit this.`);
98
98
  }
99
+ const SKIP_SCRIPT_RE = /[\p{Script=Common}\p{Script=Inherited}]/u;
100
+ const SCRIPT_MATCHERS = [
101
+ [
102
+ "Latin",
103
+ /\p{Script=Latin}/u
104
+ ],
105
+ [
106
+ "Cyrillic",
107
+ /\p{Script=Cyrillic}/u
108
+ ],
109
+ [
110
+ "Greek",
111
+ /\p{Script=Greek}/u
112
+ ],
113
+ [
114
+ "Han",
115
+ /\p{Script=Han}/u
116
+ ],
117
+ [
118
+ "Hiragana",
119
+ /\p{Script=Hiragana}/u
120
+ ],
121
+ [
122
+ "Katakana",
123
+ /\p{Script=Katakana}/u
124
+ ],
125
+ [
126
+ "Hangul",
127
+ /\p{Script=Hangul}/u
128
+ ],
129
+ [
130
+ "Arabic",
131
+ /\p{Script=Arabic}/u
132
+ ],
133
+ [
134
+ "Hebrew",
135
+ /\p{Script=Hebrew}/u
136
+ ]
137
+ ];
99
138
  function detectHostnameScripts(host) {
100
139
  const scripts = new Set();
101
- for (const ch of host)if (!/[\p{Script=Common}\p{Script=Inherited}]/u.test(ch)) if (/\p{Script=Latin}/u.test(ch)) scripts.add("Latin");
102
- else if (/\p{Script=Cyrillic}/u.test(ch)) scripts.add("Cyrillic");
103
- else if (/\p{Script=Greek}/u.test(ch)) scripts.add("Greek");
104
- else if (/\p{Script=Han}/u.test(ch)) scripts.add("Han");
105
- else if (/\p{Script=Hiragana}/u.test(ch)) scripts.add("Hiragana");
106
- else if (/\p{Script=Katakana}/u.test(ch)) scripts.add("Katakana");
107
- else if (/\p{Script=Hangul}/u.test(ch)) scripts.add("Hangul");
108
- else if (/\p{Script=Arabic}/u.test(ch)) scripts.add("Arabic");
109
- else if (/\p{Script=Hebrew}/u.test(ch)) scripts.add("Hebrew");
110
- else scripts.add("Other");
140
+ for (const ch of host){
141
+ if (SKIP_SCRIPT_RE.test(ch)) continue;
142
+ let matched = false;
143
+ for (const [name, re] of SCRIPT_MATCHERS)if (re.test(ch)) {
144
+ scripts.add(name);
145
+ matched = true;
146
+ break;
147
+ }
148
+ if (!matched) scripts.add("Other");
149
+ }
111
150
  return scripts;
112
151
  }
113
152
  function normalizeCandidate(input) {
@@ -1,4 +1,4 @@
1
- import type { AssetManagerOptions, UploadResult } from "./types.js";
1
+ import type { AssetManagerOptions, UploadResult } from "../types/types.js";
2
2
  /**
3
3
  * Subset of {@link AssetManagerOptions} consulted by the trust boundary.
4
4
  * `urlAllowlist` is intentionally absent — Phase 4 replaced the raw
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-upload-result.d.cts","sourceRoot":"","sources":["../../src/utils/validate-upload-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAM3E;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAC7C,mBAAmB,EACnB,uBAAuB,GAAG,2BAA2B,CACrD,CAAC;AAEF,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,2BAAgC,GACvC,YAAY,CAqBd"}
@@ -1,4 +1,4 @@
1
- import type { AssetManagerOptions, UploadResult } from "./types.js";
1
+ import type { AssetManagerOptions, UploadResult } from "../types/types.js";
2
2
  /**
3
3
  * Subset of {@link AssetManagerOptions} consulted by the trust boundary.
4
4
  * `urlAllowlist` is intentionally absent — Phase 4 replaced the raw
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-upload-result.d.ts","sourceRoot":"","sources":["../../src/utils/validate-upload-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAM3E;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAC7C,mBAAmB,EACnB,uBAAuB,GAAG,2BAA2B,CACrD,CAAC;AAEF,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,2BAAgC,GACvC,YAAY,CAqBd"}