@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":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EACX,WAAW,EACX,kBAAkB,EAClB,YAAY,GACZ,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EACN,oBAAoB,EACpB,oBAAoB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACN,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,YAAY,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACrE,YAAY,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EACN,uBAAuB,EACvB,oBAAoB,GACpB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACX,SAAS,EACT,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,YAAY,GACZ,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EACN,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,GACX,MAAM,aAAa,CAAC;AACrB,YAAY,EACX,SAAS,EACT,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,YAAY,GACZ,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACX,WAAW,EACX,kBAAkB,EAClB,YAAY,GACZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3E,YAAY,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EACN,uBAAuB,EACvB,oBAAoB,GACpB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,18 +1,18 @@
1
1
  export type { DataUrlUploaderOptions } from "./adapters/data-url.js";
2
2
  export { dataUrlUploader } from "./adapters/data-url.js";
3
3
  export { inMemoryUploader } from "./adapters/in-memory.js";
4
- export type { RequiredCsp, RequiredCspOptions, S3CspOptions, } from "./csp.js";
5
- export { getRequiredCsp } from "./csp.js";
6
- export type { AssetResolutionErrorCode } from "./errors.js";
7
- export { AssetResolutionError, AssetValidationError, } from "./errors.js";
8
- export { inferAssetKind } from "./infer-kind.js";
9
4
  export { createAssetManagerPlugin, createAssetReference, getAssetRegistry, uploadAsset, } from "./plugin.js";
10
- export { createAssetRegistry } from "./registry.js";
11
- export type { CreateIRAssetResolverOptions } from "./resolver.js";
12
- export { createIRAssetResolver, resolveAssets } from "./resolver.js";
13
- export type { CreateStudioAssetSourceOptions } from "./studio-asset-source.js";
14
- export { createStudioAssetSource, inferStudioAssetKind, } from "./studio-asset-source.js";
15
- export type { AssetKind, AssetManagerOptions, AssetMeta, AssetRegistry, AssetRegistryListener, AssetSearchOptions, AssetSearchPage, UploadAdapter, UploadResult, } from "./types.js";
16
- export type { ValidateUploadResultOptions } from "./validate-upload-result.js";
17
- export { validateUploadResult } from "./validate-upload-result.js";
5
+ export type { AssetKind, AssetManagerOptions, AssetMeta, AssetRegistry, AssetRegistryListener, AssetSearchOptions, AssetSearchPage, UploadAdapter, UploadAdapterOptions, UploadResult, } from "./types/types.js";
6
+ export type { RequiredCsp, RequiredCspOptions, S3CspOptions, } from "./utils/csp.js";
7
+ export { getRequiredCsp } from "./utils/csp.js";
8
+ export type { AssetResolutionErrorCode } from "./utils/errors.js";
9
+ export { AssetResolutionError, AssetValidationError } from "./utils/errors.js";
10
+ export { inferAssetKind } from "./utils/infer-kind.js";
11
+ export { createAssetRegistry } from "./utils/registry.js";
12
+ export type { CreateIRAssetResolverOptions } from "./utils/resolver.js";
13
+ export { createIRAssetResolver, resolveAssets } from "./utils/resolver.js";
14
+ export type { CreateStudioAssetSourceOptions } from "./utils/studio-asset-source.js";
15
+ export { createStudioAssetSource, inferStudioAssetKind, } from "./utils/studio-asset-source.js";
16
+ export type { ValidateUploadResultOptions } from "./utils/validate-upload-result.js";
17
+ export { validateUploadResult } from "./utils/validate-upload-result.js";
18
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EACX,WAAW,EACX,kBAAkB,EAClB,YAAY,GACZ,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EACN,oBAAoB,EACpB,oBAAoB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACN,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,YAAY,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACrE,YAAY,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EACN,uBAAuB,EACvB,oBAAoB,GACpB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACX,SAAS,EACT,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,YAAY,GACZ,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EACN,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,GACX,MAAM,aAAa,CAAC;AACrB,YAAY,EACX,SAAS,EACT,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,YAAY,GACZ,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACX,WAAW,EACX,kBAAkB,EAClB,YAAY,GACZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3E,YAAY,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EACN,uBAAuB,EACvB,oBAAoB,GACpB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC"}
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  export { dataUrlUploader } from "./adapters/data-url.js";
2
2
  export { inMemoryUploader } from "./adapters/in-memory.js";
3
- export { getRequiredCsp } from "./csp.js";
4
- export { AssetResolutionError, AssetValidationError } from "./errors.js";
5
- export { inferAssetKind } from "./infer-kind.js";
6
3
  export { createAssetManagerPlugin, createAssetReference, getAssetRegistry, uploadAsset } from "./plugin.js";
7
- export { createAssetRegistry } from "./registry.js";
8
- export { createIRAssetResolver, resolveAssets } from "./resolver.js";
9
- export { createStudioAssetSource, inferStudioAssetKind } from "./studio-asset-source.js";
10
- export { validateUploadResult } from "./validate-upload-result.js";
4
+ export { getRequiredCsp } from "./utils/csp.js";
5
+ export { AssetResolutionError, AssetValidationError } from "./utils/errors.js";
6
+ export { inferAssetKind } from "./utils/infer-kind.js";
7
+ export { createAssetRegistry } from "./utils/registry.js";
8
+ export { createIRAssetResolver, resolveAssets } from "./utils/resolver.js";
9
+ export { createStudioAssetSource, inferStudioAssetKind } from "./utils/studio-asset-source.js";
10
+ export { validateUploadResult } from "./utils/validate-upload-result.js";
package/dist/plugin.cjs CHANGED
@@ -1,5 +1,14 @@
1
1
  "use strict";
2
2
  var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
3
12
  (()=>{
4
13
  __webpack_require__.d = (exports1, definition)=>{
5
14
  for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
@@ -24,34 +33,34 @@ var __webpack_require__ = {};
24
33
  var __webpack_exports__ = {};
25
34
  __webpack_require__.r(__webpack_exports__);
26
35
  __webpack_require__.d(__webpack_exports__, {
27
- uploadAsset: ()=>uploadAsset,
28
- validateSelectedFile: ()=>validateSelectedFile,
29
36
  createAssetManagerPlugin: ()=>createAssetManagerPlugin,
37
+ createAssetReference: ()=>asset_reference_cjs_namespaceObject.createAssetReference,
30
38
  getAssetRegistry: ()=>getAssetRegistry,
31
- createAssetReference: ()=>external_asset_reference_cjs_namespaceObject.createAssetReference
39
+ uploadAsset: ()=>uploadAsset,
40
+ validateSelectedFile: ()=>validateSelectedFile
32
41
  });
33
- const external_asset_reference_cjs_namespaceObject = require("./asset-reference.cjs");
34
- const external_errors_cjs_namespaceObject = require("./errors.cjs");
35
- const external_header_action_cjs_namespaceObject = require("./header-action.cjs");
36
- const external_infer_kind_cjs_namespaceObject = require("./infer-kind.cjs");
37
- const external_registry_cjs_namespaceObject = require("./registry.cjs");
38
- const external_resolver_cjs_namespaceObject = require("./resolver.cjs");
39
- const external_studio_asset_source_cjs_namespaceObject = require("./studio-asset-source.cjs");
40
- const external_validate_upload_result_cjs_namespaceObject = require("./validate-upload-result.cjs");
42
+ const config_json_namespaceObject = require("../meta/config.json");
43
+ var config_json_default = /*#__PURE__*/ __webpack_require__.n(config_json_namespaceObject);
44
+ const asset_reference_cjs_namespaceObject = require("./utils/asset-reference.cjs");
45
+ const errors_cjs_namespaceObject = require("./utils/errors.cjs");
46
+ const header_action_cjs_namespaceObject = require("./utils/header-action.cjs");
47
+ const infer_kind_cjs_namespaceObject = require("./utils/infer-kind.cjs");
48
+ const registry_cjs_namespaceObject = require("./utils/registry.cjs");
49
+ const resolver_cjs_namespaceObject = require("./utils/resolver.cjs");
50
+ const studio_asset_source_cjs_namespaceObject = require("./utils/studio-asset-source.cjs");
51
+ const validate_upload_result_cjs_namespaceObject = require("./utils/validate-upload-result.cjs");
52
+ const external_version_cjs_namespaceObject = require("./version.cjs");
41
53
  const META = {
42
- id: "anvilkit-plugin-asset-manager",
43
- name: "Asset Manager",
44
- version: "1.0.0",
45
- coreVersion: "^0.1.0-alpha",
46
- description: "Headless asset upload plugin with host-provided persistence and a separate React UI subpath."
54
+ ...config_json_default(),
55
+ version: external_version_cjs_namespaceObject.ASSET_MANAGER_VERSION
47
56
  };
48
57
  const stateByToken = new WeakMap();
49
58
  const tokenByContext = new WeakMap();
50
59
  function createAssetManagerPlugin(options) {
51
60
  const token = {};
52
- const registry = (0, external_registry_cjs_namespaceObject.createAssetRegistry)();
61
+ const registry = (0, registry_cjs_namespaceObject.createAssetRegistry)();
53
62
  const normalizedOptions = normalizeOptions(options);
54
- const assetResolver = (0, external_resolver_cjs_namespaceObject.createIRAssetResolver)({
63
+ const assetResolver = (0, resolver_cjs_namespaceObject.createIRAssetResolver)({
55
64
  registry,
56
65
  dataUrlAllowlistOptIn: normalizedOptions.dataUrlAllowlistOptIn,
57
66
  allowMixedScriptHostnames: normalizedOptions.allowMixedScriptHostnames
@@ -62,7 +71,7 @@ function createAssetManagerPlugin(options) {
62
71
  const registration = {
63
72
  meta: META,
64
73
  headerActions: [
65
- external_header_action_cjs_namespaceObject.uploadAssetAction
74
+ header_action_cjs_namespaceObject.uploadAssetAction
66
75
  ],
67
76
  hooks: {
68
77
  onInit (initCtx) {
@@ -74,9 +83,9 @@ function createAssetManagerPlugin(options) {
74
83
  });
75
84
  tokenByContext.set(initCtx, token);
76
85
  initCtx.registerAssetResolver(assetResolver);
77
- const studioAssetSource = (0, external_studio_asset_source_cjs_namespaceObject.createStudioAssetSource)({
86
+ const studioAssetSource = (0, studio_asset_source_cjs_namespaceObject.createStudioAssetSource)({
78
87
  registry,
79
- upload: (file)=>uploadAsset(initCtx, file),
88
+ upload: (file, opts)=>uploadAsset(initCtx, file, opts?.signal),
80
89
  ...normalizedOptions.getThumbnail ? {
81
90
  getThumbnail: normalizedOptions.getThumbnail
82
91
  } : {}
@@ -100,23 +109,27 @@ function getAssetRegistry(ctx) {
100
109
  const token = tokenByContext.get(ctx);
101
110
  return token ? stateByToken.get(token)?.registry : void 0;
102
111
  }
103
- async function uploadAsset(ctx, file) {
112
+ async function uploadAsset(ctx, file, signal) {
104
113
  const state = getRuntimeState(ctx);
105
114
  const { options, registry } = state;
106
115
  try {
107
116
  validateSelectedFile(file, options);
108
- const uploadResult = await options.uploader(file);
109
- const validated = (0, external_validate_upload_result_cjs_namespaceObject.validateUploadResult)(mergeUploadMeta(uploadResult, file), options);
117
+ const uploadResult = await options.uploader(file, signal ? {
118
+ signal
119
+ } : void 0);
120
+ if (signal?.aborted) throw makePluginAbortError();
121
+ const validated = (0, validate_upload_result_cjs_namespaceObject.validateUploadResult)(mergeUploadMeta(uploadResult, file), options);
110
122
  const tagged = withDerivedTags(validated, file);
111
123
  const stored = registry.register(tagged);
112
124
  dispatchAssetReference(ctx, stored);
113
125
  ctx.emit("asset-manager:uploaded", {
114
126
  asset: stored,
115
- reference: (0, external_asset_reference_cjs_namespaceObject.createAssetReference)(stored.id)
127
+ reference: (0, asset_reference_cjs_namespaceObject.createAssetReference)(stored.id)
116
128
  });
117
129
  return stored;
118
130
  } catch (error) {
119
- const normalizedError = error instanceof external_errors_cjs_namespaceObject.AssetValidationError ? error : new external_errors_cjs_namespaceObject.AssetValidationError("UPLOAD_FAILED", error instanceof Error ? error.message : String(error), {
131
+ if (isAbortLikeError(error) || signal?.aborted) throw error;
132
+ const normalizedError = error instanceof errors_cjs_namespaceObject.AssetValidationError ? error : new errors_cjs_namespaceObject.AssetValidationError("UPLOAD_FAILED", error instanceof Error ? error.message : String(error), {
120
133
  cause: error
121
134
  });
122
135
  ctx.emit("asset-manager:error", {
@@ -130,10 +143,10 @@ async function uploadAsset(ctx, file) {
130
143
  }
131
144
  }
132
145
  function validateSelectedFile(file, options) {
133
- if (void 0 !== options.maxFileSize && file.size > options.maxFileSize) throw new external_errors_cjs_namespaceObject.AssetValidationError("FILE_TOO_LARGE", `File size ${file.size} bytes exceeds the configured maxFileSize of ${options.maxFileSize} bytes.`);
146
+ if (void 0 !== options.maxFileSize && file.size > options.maxFileSize) throw new errors_cjs_namespaceObject.AssetValidationError("FILE_TOO_LARGE", `File size ${file.size} bytes exceeds the configured maxFileSize of ${options.maxFileSize} bytes.`);
134
147
  if (options.acceptedMimeTypes && options.acceptedMimeTypes.length > 0 && !mimeTypeMatches(file.type, options.acceptedMimeTypes)) {
135
148
  const mimeType = file.type || "unknown";
136
- throw new external_errors_cjs_namespaceObject.AssetValidationError("UNSUPPORTED_MIME_TYPE", `File MIME type "${mimeType}" is not in acceptedMimeTypes.`);
149
+ throw new errors_cjs_namespaceObject.AssetValidationError("UNSUPPORTED_MIME_TYPE", `File MIME type "${mimeType}" is not in acceptedMimeTypes.`);
137
150
  }
138
151
  }
139
152
  function getRuntimeState(ctx) {
@@ -155,7 +168,7 @@ function normalizeOptions(options) {
155
168
  function withDerivedTags(asset, file) {
156
169
  if (void 0 !== asset.tags && asset.tags.length > 0) return asset;
157
170
  const tags = new Set();
158
- const kind = (0, external_infer_kind_cjs_namespaceObject.inferAssetKind)(asset);
171
+ const kind = (0, infer_kind_cjs_namespaceObject.inferAssetKind)(asset);
159
172
  if ("other" !== kind) tags.add(kind);
160
173
  for (const token of filenameTokens(file.name)){
161
174
  if (tags.size >= 3) break;
@@ -202,7 +215,8 @@ function mimeTypeMatches(input, acceptedMimeTypes) {
202
215
  }
203
216
  function dispatchAssetReference(ctx, asset) {
204
217
  const currentData = ctx.getData();
205
- const currentAssetsRaw = Array.isArray(currentData.assets) ? currentData.assets : [];
218
+ const assetsView = currentData.assets;
219
+ const currentAssetsRaw = Array.isArray(assetsView) ? assetsView : [];
206
220
  const assetEntry = toIRAsset(asset);
207
221
  const nextAssets = [];
208
222
  let replaced = false;
@@ -224,7 +238,7 @@ function toIRAsset(asset) {
224
238
  return {
225
239
  id: asset.id,
226
240
  kind: inferIRAssetKind(asset.meta?.mimeType, asset.url),
227
- url: (0, external_asset_reference_cjs_namespaceObject.createAssetReference)(asset.id),
241
+ url: (0, asset_reference_cjs_namespaceObject.createAssetReference)(asset.id),
228
242
  ...asset.meta ? {
229
243
  meta: asset.meta
230
244
  } : {}
@@ -241,6 +255,17 @@ function inferIRAssetKind(mimeType, url) {
241
255
  function isRecord(value) {
242
256
  return "object" == typeof value && null !== value;
243
257
  }
258
+ function makePluginAbortError() {
259
+ if ("u" > typeof DOMException) return new DOMException("Upload aborted", "AbortError");
260
+ const error = new Error("Upload aborted");
261
+ error.name = "AbortError";
262
+ return error;
263
+ }
264
+ function isAbortLikeError(error) {
265
+ if (null === error || "object" != typeof error) return false;
266
+ const name = error.name;
267
+ return "AbortError" === name;
268
+ }
244
269
  exports.createAssetManagerPlugin = __webpack_exports__.createAssetManagerPlugin;
245
270
  exports.createAssetReference = __webpack_exports__.createAssetReference;
246
271
  exports.getAssetRegistry = __webpack_exports__.getAssetRegistry;
package/dist/plugin.d.cts CHANGED
@@ -1,9 +1,10 @@
1
1
  import type { StudioPlugin, StudioPluginContext } from "@anvilkit/core/types";
2
- import { createAssetReference } from "./asset-reference.js";
3
- import type { AssetManagerOptions, AssetRegistry, UploadResult } from "./types.js";
2
+ import type { Config as PuckConfig } from "@puckeditor/core";
3
+ import type { AssetManagerOptions, AssetRegistry, UploadResult } from "./types/types.js";
4
+ import { createAssetReference } from "./utils/asset-reference.js";
4
5
  export { createAssetReference };
5
- export declare function createAssetManagerPlugin(options: AssetManagerOptions): StudioPlugin;
6
- export declare function getAssetRegistry(ctx: StudioPluginContext): AssetRegistry | undefined;
7
- export declare function uploadAsset(ctx: StudioPluginContext, file: File): Promise<UploadResult>;
6
+ export declare function createAssetManagerPlugin<UserConfig extends PuckConfig = PuckConfig>(options: AssetManagerOptions): StudioPlugin<UserConfig>;
7
+ export declare function getAssetRegistry<UserConfig extends PuckConfig = PuckConfig>(ctx: StudioPluginContext<UserConfig>): AssetRegistry | undefined;
8
+ export declare function uploadAsset<UserConfig extends PuckConfig = PuckConfig>(ctx: StudioPluginContext<UserConfig>, file: File, signal?: AbortSignal): Promise<UploadResult>;
8
9
  export declare function validateSelectedFile(file: File, options: Pick<AssetManagerOptions, "acceptedMimeTypes" | "maxFileSize">): void;
9
10
  //# sourceMappingURL=plugin.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.cts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,YAAY,EACZ,mBAAmB,EAEnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAO5D,OAAO,KAAK,EACX,mBAAmB,EAEnB,aAAa,EACb,YAAY,EACZ,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAwBhC,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,mBAAmB,GAC1B,YAAY,CAwDd;AAED,wBAAgB,gBAAgB,CAC/B,GAAG,EAAE,mBAAmB,GACtB,aAAa,GAAG,SAAS,CAG3B;AAED,wBAAsB,WAAW,CAChC,GAAG,EAAE,mBAAmB,EACxB,IAAI,EAAE,IAAI,GACR,OAAO,CAAC,YAAY,CAAC,CAwCvB;AAED,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,aAAa,CAAC,GACrE,IAAI,CAmBN"}
1
+ {"version":3,"file":"plugin.d.cts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,YAAY,EACZ,mBAAmB,EAEnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG7D,OAAO,KAAK,EACX,mBAAmB,EAEnB,aAAa,EACb,YAAY,EACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAUlE,OAAO,EAAE,oBAAoB,EAAE,CAAC;AA0BhC,wBAAgB,wBAAwB,CACvC,UAAU,SAAS,UAAU,GAAG,UAAU,EACzC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAAC,UAAU,CAAC,CAwDxD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,SAAS,UAAU,GAAG,UAAU,EAC1E,GAAG,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAClC,aAAa,GAAG,SAAS,CAG3B;AAED,wBAAsB,WAAW,CAAC,UAAU,SAAS,UAAU,GAAG,UAAU,EAC3E,GAAG,EAAE,mBAAmB,CAAC,UAAU,CAAC,EACpC,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,YAAY,CAAC,CAwDvB;AAED,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,aAAa,CAAC,GACrE,IAAI,CAmBN"}
package/dist/plugin.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import type { StudioPlugin, StudioPluginContext } from "@anvilkit/core/types";
2
- import { createAssetReference } from "./asset-reference.js";
3
- import type { AssetManagerOptions, AssetRegistry, UploadResult } from "./types.js";
2
+ import type { Config as PuckConfig } from "@puckeditor/core";
3
+ import type { AssetManagerOptions, AssetRegistry, UploadResult } from "./types/types.js";
4
+ import { createAssetReference } from "./utils/asset-reference.js";
4
5
  export { createAssetReference };
5
- export declare function createAssetManagerPlugin(options: AssetManagerOptions): StudioPlugin;
6
- export declare function getAssetRegistry(ctx: StudioPluginContext): AssetRegistry | undefined;
7
- export declare function uploadAsset(ctx: StudioPluginContext, file: File): Promise<UploadResult>;
6
+ export declare function createAssetManagerPlugin<UserConfig extends PuckConfig = PuckConfig>(options: AssetManagerOptions): StudioPlugin<UserConfig>;
7
+ export declare function getAssetRegistry<UserConfig extends PuckConfig = PuckConfig>(ctx: StudioPluginContext<UserConfig>): AssetRegistry | undefined;
8
+ export declare function uploadAsset<UserConfig extends PuckConfig = PuckConfig>(ctx: StudioPluginContext<UserConfig>, file: File, signal?: AbortSignal): Promise<UploadResult>;
8
9
  export declare function validateSelectedFile(file: File, options: Pick<AssetManagerOptions, "acceptedMimeTypes" | "maxFileSize">): void;
9
10
  //# sourceMappingURL=plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,YAAY,EACZ,mBAAmB,EAEnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAO5D,OAAO,KAAK,EACX,mBAAmB,EAEnB,aAAa,EACb,YAAY,EACZ,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAwBhC,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,mBAAmB,GAC1B,YAAY,CAwDd;AAED,wBAAgB,gBAAgB,CAC/B,GAAG,EAAE,mBAAmB,GACtB,aAAa,GAAG,SAAS,CAG3B;AAED,wBAAsB,WAAW,CAChC,GAAG,EAAE,mBAAmB,EACxB,IAAI,EAAE,IAAI,GACR,OAAO,CAAC,YAAY,CAAC,CAwCvB;AAED,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,aAAa,CAAC,GACrE,IAAI,CAmBN"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,YAAY,EACZ,mBAAmB,EAEnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG7D,OAAO,KAAK,EACX,mBAAmB,EAEnB,aAAa,EACb,YAAY,EACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAUlE,OAAO,EAAE,oBAAoB,EAAE,CAAC;AA0BhC,wBAAgB,wBAAwB,CACvC,UAAU,SAAS,UAAU,GAAG,UAAU,EACzC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAAC,UAAU,CAAC,CAwDxD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,SAAS,UAAU,GAAG,UAAU,EAC1E,GAAG,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAClC,aAAa,GAAG,SAAS,CAG3B;AAED,wBAAsB,WAAW,CAAC,UAAU,SAAS,UAAU,GAAG,UAAU,EAC3E,GAAG,EAAE,mBAAmB,CAAC,UAAU,CAAC,EACpC,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,YAAY,CAAC,CAwDvB;AAED,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,aAAa,CAAC,GACrE,IAAI,CAmBN"}
package/dist/plugin.js CHANGED
@@ -1,17 +1,18 @@
1
- import { createAssetReference } from "./asset-reference.js";
2
- import { AssetValidationError } from "./errors.js";
3
- import { uploadAssetAction } from "./header-action.js";
4
- import { inferAssetKind } from "./infer-kind.js";
5
- import { createAssetRegistry } from "./registry.js";
6
- import { createIRAssetResolver } from "./resolver.js";
7
- import { createStudioAssetSource } from "./studio-asset-source.js";
8
- import { validateUploadResult } from "./validate-upload-result.js";
1
+ import config from "../meta/config.json" with {
2
+ type: "json"
3
+ };
4
+ import { createAssetReference } from "./utils/asset-reference.js";
5
+ import { AssetValidationError } from "./utils/errors.js";
6
+ import { uploadAssetAction } from "./utils/header-action.js";
7
+ import { inferAssetKind } from "./utils/infer-kind.js";
8
+ import { createAssetRegistry } from "./utils/registry.js";
9
+ import { createIRAssetResolver } from "./utils/resolver.js";
10
+ import { createStudioAssetSource } from "./utils/studio-asset-source.js";
11
+ import { validateUploadResult } from "./utils/validate-upload-result.js";
12
+ import { ASSET_MANAGER_VERSION } from "./version.js";
9
13
  const META = {
10
- id: "anvilkit-plugin-asset-manager",
11
- name: "Asset Manager",
12
- version: "1.0.0",
13
- coreVersion: "^0.1.0-alpha",
14
- description: "Headless asset upload plugin with host-provided persistence and a separate React UI subpath."
14
+ ...config,
15
+ version: ASSET_MANAGER_VERSION
15
16
  };
16
17
  const stateByToken = new WeakMap();
17
18
  const tokenByContext = new WeakMap();
@@ -44,7 +45,7 @@ function createAssetManagerPlugin(options) {
44
45
  initCtx.registerAssetResolver(assetResolver);
45
46
  const studioAssetSource = createStudioAssetSource({
46
47
  registry,
47
- upload: (file)=>uploadAsset(initCtx, file),
48
+ upload: (file, opts)=>uploadAsset(initCtx, file, opts?.signal),
48
49
  ...normalizedOptions.getThumbnail ? {
49
50
  getThumbnail: normalizedOptions.getThumbnail
50
51
  } : {}
@@ -68,12 +69,15 @@ function getAssetRegistry(ctx) {
68
69
  const token = tokenByContext.get(ctx);
69
70
  return token ? stateByToken.get(token)?.registry : void 0;
70
71
  }
71
- async function uploadAsset(ctx, file) {
72
+ async function uploadAsset(ctx, file, signal) {
72
73
  const state = getRuntimeState(ctx);
73
74
  const { options, registry } = state;
74
75
  try {
75
76
  validateSelectedFile(file, options);
76
- const uploadResult = await options.uploader(file);
77
+ const uploadResult = await options.uploader(file, signal ? {
78
+ signal
79
+ } : void 0);
80
+ if (signal?.aborted) throw makePluginAbortError();
77
81
  const validated = validateUploadResult(mergeUploadMeta(uploadResult, file), options);
78
82
  const tagged = withDerivedTags(validated, file);
79
83
  const stored = registry.register(tagged);
@@ -84,6 +88,7 @@ async function uploadAsset(ctx, file) {
84
88
  });
85
89
  return stored;
86
90
  } catch (error) {
91
+ if (isAbortLikeError(error) || signal?.aborted) throw error;
87
92
  const normalizedError = error instanceof AssetValidationError ? error : new AssetValidationError("UPLOAD_FAILED", error instanceof Error ? error.message : String(error), {
88
93
  cause: error
89
94
  });
@@ -170,7 +175,8 @@ function mimeTypeMatches(input, acceptedMimeTypes) {
170
175
  }
171
176
  function dispatchAssetReference(ctx, asset) {
172
177
  const currentData = ctx.getData();
173
- const currentAssetsRaw = Array.isArray(currentData.assets) ? currentData.assets : [];
178
+ const assetsView = currentData.assets;
179
+ const currentAssetsRaw = Array.isArray(assetsView) ? assetsView : [];
174
180
  const assetEntry = toIRAsset(asset);
175
181
  const nextAssets = [];
176
182
  let replaced = false;
@@ -209,4 +215,15 @@ function inferIRAssetKind(mimeType, url) {
209
215
  function isRecord(value) {
210
216
  return "object" == typeof value && null !== value;
211
217
  }
218
+ function makePluginAbortError() {
219
+ if ("u" > typeof DOMException) return new DOMException("Upload aborted", "AbortError");
220
+ const error = new Error("Upload aborted");
221
+ error.name = "AbortError";
222
+ return error;
223
+ }
224
+ function isAbortLikeError(error) {
225
+ if (null === error || "object" != typeof error) return false;
226
+ const name = error.name;
227
+ return "AbortError" === name;
228
+ }
212
229
  export { createAssetManagerPlugin, createAssetReference, getAssetRegistry, uploadAsset, validateSelectedFile };
@@ -27,9 +27,9 @@ __webpack_require__.d(__webpack_exports__, {
27
27
  createTestRegistry: ()=>createTestRegistry,
28
28
  fakeUploader: ()=>fakeUploader
29
29
  });
30
- const external_registry_cjs_namespaceObject = require("../registry.cjs");
30
+ const registry_cjs_namespaceObject = require("../utils/registry.cjs");
31
31
  function createTestRegistry(options = {}) {
32
- const registry = (0, external_registry_cjs_namespaceObject.createAssetRegistry)();
32
+ const registry = (0, registry_cjs_namespaceObject.createAssetRegistry)();
33
33
  for (const entry of options.initial ?? [])registry.register(entry);
34
34
  return registry;
35
35
  }
@@ -6,7 +6,7 @@
6
6
  * `@anvilkit/core/testing.createFakeStudioContext` — these helpers focus
7
7
  * on the registry + uploader contracts owned by this package.
8
8
  */
9
- import type { AssetRegistry, UploadAdapter, UploadResult } from "../types.js";
9
+ import type { AssetRegistry, UploadAdapter, UploadResult } from "../types/types.js";
10
10
  export interface CreateTestRegistryOptions {
11
11
  readonly initial?: readonly UploadResult[];
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAEX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,wBAAgB,kBAAkB,CACjC,OAAO,GAAE,yBAA8B,GACrC,aAAa,CAMf;AAED,MAAM,WAAW,mBAAmB;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAClD;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,aAAa,CAkB7E"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAEX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,wBAAgB,kBAAkB,CACjC,OAAO,GAAE,yBAA8B,GACrC,aAAa,CAMf;AAED,MAAM,WAAW,mBAAmB;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAClD;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,aAAa,CAkB7E"}
@@ -6,7 +6,7 @@
6
6
  * `@anvilkit/core/testing.createFakeStudioContext` — these helpers focus
7
7
  * on the registry + uploader contracts owned by this package.
8
8
  */
9
- import type { AssetRegistry, UploadAdapter, UploadResult } from "../types.js";
9
+ import type { AssetRegistry, UploadAdapter, UploadResult } from "../types/types.js";
10
10
  export interface CreateTestRegistryOptions {
11
11
  readonly initial?: readonly UploadResult[];
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAEX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,wBAAgB,kBAAkB,CACjC,OAAO,GAAE,yBAA8B,GACrC,aAAa,CAMf;AAED,MAAM,WAAW,mBAAmB;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAClD;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,aAAa,CAkB7E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAEX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,wBAAgB,kBAAkB,CACjC,OAAO,GAAE,yBAA8B,GACrC,aAAa,CAMf;AAED,MAAM,WAAW,mBAAmB;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAClD;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,aAAa,CAkB7E"}
@@ -1,4 +1,4 @@
1
- import { createAssetRegistry } from "../registry.js";
1
+ import { createAssetRegistry } from "../utils/registry.js";
2
2
  function createTestRegistry(options = {}) {
3
3
  const registry = createAssetRegistry();
4
4
  for (const entry of options.initial ?? [])registry.register(entry);
@@ -31,7 +31,15 @@ export interface UploadResult {
31
31
  */
32
32
  readonly tags?: readonly string[];
33
33
  }
34
- export type UploadAdapter = (file: File) => Promise<UploadResult>;
34
+ /**
35
+ * Options passed to an {@link UploadAdapter}. Currently carries an
36
+ * optional `AbortSignal` so a cancelled upload batch can short-circuit
37
+ * the adapter (network request, image decode). Adapters may ignore it.
38
+ */
39
+ export interface UploadAdapterOptions {
40
+ readonly signal?: AbortSignal;
41
+ }
42
+ export type UploadAdapter = (file: File, options?: UploadAdapterOptions) => Promise<UploadResult>;
35
43
  export interface AssetManagerOptions {
36
44
  readonly uploader: UploadAdapter;
37
45
  readonly maxFileSize?: number;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":"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"}
@@ -31,7 +31,15 @@ export interface UploadResult {
31
31
  */
32
32
  readonly tags?: readonly string[];
33
33
  }
34
- export type UploadAdapter = (file: File) => Promise<UploadResult>;
34
+ /**
35
+ * Options passed to an {@link UploadAdapter}. Currently carries an
36
+ * optional `AbortSignal` so a cancelled upload batch can short-circuit
37
+ * the adapter (network request, image decode). Adapters may ignore it.
38
+ */
39
+ export interface UploadAdapterOptions {
40
+ readonly signal?: AbortSignal;
41
+ }
42
+ export type UploadAdapter = (file: File, options?: UploadAdapterOptions) => Promise<UploadResult>;
35
43
  export interface AssetManagerOptions {
36
44
  readonly uploader: UploadAdapter;
37
45
  readonly maxFileSize?: number;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { };
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ "use client";
2
3
  var __webpack_require__ = {};
3
4
  (()=>{
4
5
  __webpack_require__.d = (exports1, definition)=>{
@@ -29,7 +30,8 @@ __webpack_require__.d(__webpack_exports__, {
29
30
  const card_namespaceObject = require("@anvilkit/ui/card");
30
31
  const input_namespaceObject = require("@anvilkit/ui/input");
31
32
  const external_react_namespaceObject = require("react");
32
- const external_infer_kind_cjs_namespaceObject = require("../infer-kind.cjs");
33
+ const external_react_dom_namespaceObject = require("react-dom");
34
+ const infer_kind_cjs_namespaceObject = require("../utils/infer-kind.cjs");
33
35
  const KIND_FILTERS = [
34
36
  "image",
35
37
  "video",
@@ -50,22 +52,40 @@ function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEna
50
52
  const [pageLimit, setPageLimit] = external_react_namespaceObject.useState(pageSize);
51
53
  const buttonRefs = external_react_namespaceObject.useRef([]);
52
54
  const scrollContainerRef = external_react_namespaceObject.useRef(null);
55
+ const scrollFrameRef = external_react_namespaceObject.useRef(null);
56
+ const pendingScrollTopRef = external_react_namespaceObject.useRef(0);
57
+ external_react_namespaceObject.useEffect(()=>()=>{
58
+ if (null !== scrollFrameRef.current && "function" == typeof cancelAnimationFrame) cancelAnimationFrame(scrollFrameRef.current);
59
+ }, []);
60
+ const searchIndex = external_react_namespaceObject.useMemo(()=>{
61
+ if (!searchEnabled) return null;
62
+ return assets.map((asset)=>({
63
+ asset,
64
+ kind: (0, infer_kind_cjs_namespaceObject.inferAssetKind)(asset),
65
+ haystack: [
66
+ asset.id,
67
+ asset.name ?? "",
68
+ asset.meta?.mimeType ?? "",
69
+ ...asset.tags ?? []
70
+ ].join("\u0000").toLowerCase()
71
+ }));
72
+ }, [
73
+ assets,
74
+ searchEnabled
75
+ ]);
53
76
  const filteredAssets = external_react_namespaceObject.useMemo(()=>{
54
- if (!searchEnabled) return assets;
77
+ if (!searchEnabled || null === searchIndex) return assets;
55
78
  const lower = query.trim().toLowerCase();
56
- return assets.filter((asset)=>{
57
- if (activeKinds.length > 0) {
58
- if (!activeKinds.includes((0, external_infer_kind_cjs_namespaceObject.inferAssetKind)(asset))) return false;
59
- }
60
- if ("" === lower) return true;
61
- if (asset.id.toLowerCase().includes(lower)) return true;
62
- if (asset.name?.toLowerCase().includes(lower)) return true;
63
- if (asset.meta?.mimeType?.toLowerCase().includes(lower)) return true;
64
- if (asset.tags?.some((tag)=>tag.toLowerCase().includes(lower))) return true;
65
- return false;
66
- });
79
+ const hasKindFilter = activeKinds.length > 0;
80
+ if ("" === lower && !hasKindFilter) return assets;
81
+ const result = [];
82
+ for (const entry of searchIndex)if (!hasKindFilter || activeKinds.includes(entry.kind)) {
83
+ if ("" === lower || entry.haystack.includes(lower)) result.push(entry.asset);
84
+ }
85
+ return result;
67
86
  }, [
68
87
  assets,
88
+ searchIndex,
69
89
  activeKinds,
70
90
  query,
71
91
  searchEnabled
@@ -87,19 +107,27 @@ function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEna
87
107
  function moveFocus(nextIndex) {
88
108
  if (0 === total) return;
89
109
  const clampedIndex = Math.max(0, Math.min(nextIndex, total - 1));
90
- setActiveIndex(clampedIndex);
91
110
  if (isVirtualized && scrollContainerRef.current) {
92
111
  const targetTop = clampedIndex * itemHeight;
93
112
  const targetBottom = targetTop + itemHeight;
94
113
  const viewTop = scrollContainerRef.current.scrollTop;
95
- const viewBottom = viewTop + maxHeight;
96
- if (targetTop < viewTop) scrollContainerRef.current.scrollTop = targetTop;
97
- else if (targetBottom > viewBottom) scrollContainerRef.current.scrollTop = targetBottom - maxHeight;
98
- queueMicrotask(()=>{
99
- buttonRefs.current[clampedIndex]?.focus();
114
+ let nextScrollTop = viewTop;
115
+ if (targetTop < viewTop) nextScrollTop = targetTop;
116
+ else if (targetBottom > viewTop + maxHeight) nextScrollTop = targetBottom - maxHeight;
117
+ if (null !== scrollFrameRef.current && "function" == typeof cancelAnimationFrame) {
118
+ cancelAnimationFrame(scrollFrameRef.current);
119
+ scrollFrameRef.current = null;
120
+ }
121
+ pendingScrollTopRef.current = nextScrollTop;
122
+ (0, external_react_dom_namespaceObject.flushSync)(()=>{
123
+ setActiveIndex(clampedIndex);
124
+ setScrollTop(nextScrollTop);
100
125
  });
126
+ scrollContainerRef.current.scrollTop = nextScrollTop;
127
+ buttonRefs.current[clampedIndex]?.focus();
101
128
  return;
102
129
  }
130
+ setActiveIndex(clampedIndex);
103
131
  buttonRefs.current[clampedIndex]?.focus();
104
132
  }
105
133
  function toggleKind(kind) {
@@ -230,7 +258,14 @@ function AssetBrowser({ assets, onInsert, onDelete, onReplace, onEdit, searchEna
230
258
  return /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.Card, null, /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardHeader, null, /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardTitle, null, "Asset browser"), /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardDescription, null, "Validated assets currently registered in memory.")), /*#__PURE__*/ external_react_namespaceObject.createElement(card_namespaceObject.CardContent, null, filterRow, /*#__PURE__*/ external_react_namespaceObject.createElement("div", {
231
259
  "data-asset-manager-virtual": true,
232
260
  onScroll: (event)=>{
233
- setScrollTop(event.currentTarget.scrollTop);
261
+ const next = event.currentTarget.scrollTop;
262
+ if ("function" != typeof requestAnimationFrame) return void setScrollTop(next);
263
+ pendingScrollTopRef.current = next;
264
+ if (null !== scrollFrameRef.current) return;
265
+ scrollFrameRef.current = requestAnimationFrame(()=>{
266
+ scrollFrameRef.current = null;
267
+ setScrollTop(pendingScrollTopRef.current);
268
+ });
234
269
  },
235
270
  ref: scrollContainerRef,
236
271
  style: {