@anvilkit/plugin-asset-manager 0.1.6 → 0.1.8

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 (251) hide show
  1. package/README.md +28 -20
  2. package/dist/adapters/data-url.d.cts +13 -0
  3. package/dist/adapters/data-url.d.cts.map +1 -1
  4. package/dist/adapters/data-url.d.ts +13 -0
  5. package/dist/adapters/data-url.d.ts.map +1 -1
  6. package/dist/adapters/in-memory.d.cts +8 -1
  7. package/dist/adapters/in-memory.d.cts.map +1 -1
  8. package/dist/adapters/in-memory.d.ts +8 -1
  9. package/dist/adapters/in-memory.d.ts.map +1 -1
  10. package/dist/i18n/entry.cjs +75 -0
  11. package/dist/i18n/entry.d.cts +15 -0
  12. package/dist/i18n/entry.d.cts.map +1 -0
  13. package/dist/i18n/entry.d.ts +15 -0
  14. package/dist/i18n/entry.d.ts.map +1 -0
  15. package/dist/i18n/entry.js +29 -0
  16. package/dist/i18n/provider.cjs +49 -0
  17. package/dist/i18n/provider.d.cts +20 -0
  18. package/dist/i18n/provider.d.cts.map +1 -0
  19. package/dist/i18n/provider.d.ts +20 -0
  20. package/dist/i18n/provider.d.ts.map +1 -0
  21. package/dist/i18n/provider.js +11 -0
  22. package/dist/index.cjs +7 -0
  23. package/dist/index.d.cts +11 -3
  24. package/dist/index.d.cts.map +1 -1
  25. package/dist/index.d.ts +11 -3
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2 -1
  28. package/dist/plugin.cjs +70 -5
  29. package/dist/plugin.d.cts +3 -2
  30. package/dist/plugin.d.cts.map +1 -1
  31. package/dist/plugin.d.ts +3 -2
  32. package/dist/plugin.d.ts.map +1 -1
  33. package/dist/plugin.js +70 -5
  34. package/dist/sources/composite-source.cjs +138 -0
  35. package/dist/sources/composite-source.d.cts +39 -0
  36. package/dist/sources/composite-source.d.cts.map +1 -0
  37. package/dist/sources/composite-source.d.ts +39 -0
  38. package/dist/sources/composite-source.d.ts.map +1 -0
  39. package/dist/sources/composite-source.js +100 -0
  40. package/dist/sources/federated-search.cjs +173 -0
  41. package/dist/sources/federated-search.d.cts +33 -0
  42. package/dist/sources/federated-search.d.cts.map +1 -0
  43. package/dist/sources/federated-search.d.ts +33 -0
  44. package/dist/sources/federated-search.d.ts.map +1 -0
  45. package/dist/sources/federated-search.js +123 -0
  46. package/dist/sources/provider.cjs +18 -0
  47. package/dist/sources/provider.d.cts +51 -0
  48. package/dist/sources/provider.d.cts.map +1 -0
  49. package/dist/sources/provider.d.ts +51 -0
  50. package/dist/sources/provider.d.ts.map +1 -0
  51. package/dist/sources/provider.js +1 -0
  52. package/dist/sources/unsplash/client.cjs +189 -0
  53. package/dist/sources/unsplash/client.d.cts +87 -0
  54. package/dist/sources/unsplash/client.d.cts.map +1 -0
  55. package/dist/sources/unsplash/client.d.ts +87 -0
  56. package/dist/sources/unsplash/client.d.ts.map +1 -0
  57. package/dist/sources/unsplash/client.js +151 -0
  58. package/dist/sources/unsplash/index.cjs +194 -0
  59. package/dist/sources/unsplash/index.d.cts +16 -0
  60. package/dist/sources/unsplash/index.d.cts.map +1 -0
  61. package/dist/sources/unsplash/index.d.ts +16 -0
  62. package/dist/sources/unsplash/index.d.ts.map +1 -0
  63. package/dist/sources/unsplash/index.js +150 -0
  64. package/dist/sources/unsplash/themes.cjs +141 -0
  65. package/dist/sources/unsplash/themes.d.cts +18 -0
  66. package/dist/sources/unsplash/themes.d.cts.map +1 -0
  67. package/dist/sources/unsplash/themes.d.ts +18 -0
  68. package/dist/sources/unsplash/themes.d.ts.map +1 -0
  69. package/dist/sources/unsplash/themes.js +93 -0
  70. package/dist/sources/unsplash/throttle-cache.cjs +86 -0
  71. package/dist/sources/unsplash/throttle-cache.d.cts +25 -0
  72. package/dist/sources/unsplash/throttle-cache.d.cts.map +1 -0
  73. package/dist/sources/unsplash/throttle-cache.d.ts +25 -0
  74. package/dist/sources/unsplash/throttle-cache.d.ts.map +1 -0
  75. package/dist/sources/unsplash/throttle-cache.js +45 -0
  76. package/dist/types/categories.cjs +18 -0
  77. package/dist/types/categories.d.cts +48 -0
  78. package/dist/types/categories.d.cts.map +1 -0
  79. package/dist/types/categories.d.ts +48 -0
  80. package/dist/types/categories.d.ts.map +1 -0
  81. package/dist/types/categories.js +1 -0
  82. package/dist/types/data-source.cjs +18 -0
  83. package/dist/types/data-source.d.cts +59 -0
  84. package/dist/types/data-source.d.cts.map +1 -0
  85. package/dist/types/data-source.d.ts +59 -0
  86. package/dist/types/data-source.d.ts.map +1 -0
  87. package/dist/types/data-source.js +1 -0
  88. package/dist/types/filter.cjs +18 -0
  89. package/dist/types/filter.d.cts +55 -0
  90. package/dist/types/filter.d.cts.map +1 -0
  91. package/dist/types/filter.d.ts +55 -0
  92. package/dist/types/filter.d.ts.map +1 -0
  93. package/dist/types/filter.js +1 -0
  94. package/dist/types/folders.cjs +42 -0
  95. package/dist/types/folders.d.cts +46 -0
  96. package/dist/types/folders.d.cts.map +1 -0
  97. package/dist/types/folders.d.ts +46 -0
  98. package/dist/types/folders.d.ts.map +1 -0
  99. package/dist/types/folders.js +4 -0
  100. package/dist/types/options.cjs +18 -0
  101. package/dist/types/options.d.cts +68 -0
  102. package/dist/types/options.d.cts.map +1 -0
  103. package/dist/types/options.d.ts +68 -0
  104. package/dist/types/options.d.ts.map +1 -0
  105. package/dist/types/options.js +1 -0
  106. package/dist/types/types.d.cts +21 -27
  107. package/dist/types/types.d.cts.map +1 -1
  108. package/dist/types/types.d.ts +21 -27
  109. package/dist/types/types.d.ts.map +1 -1
  110. package/dist/types/unsplash.cjs +18 -0
  111. package/dist/types/unsplash.d.cts +60 -0
  112. package/dist/types/unsplash.d.cts.map +1 -0
  113. package/dist/types/unsplash.d.ts +60 -0
  114. package/dist/types/unsplash.d.ts.map +1 -0
  115. package/dist/types/unsplash.js +1 -0
  116. package/dist/ui/AssetBrowser.cjs +183 -121
  117. package/dist/ui/AssetBrowser.d.cts +12 -1
  118. package/dist/ui/AssetBrowser.d.cts.map +1 -1
  119. package/dist/ui/AssetBrowser.d.ts +12 -1
  120. package/dist/ui/AssetBrowser.d.ts.map +1 -1
  121. package/dist/ui/AssetBrowser.js +183 -121
  122. package/dist/ui/AssetCommandPalette.cjs +20 -18
  123. package/dist/ui/AssetCommandPalette.d.cts.map +1 -1
  124. package/dist/ui/AssetCommandPalette.d.ts.map +1 -1
  125. package/dist/ui/AssetCommandPalette.js +20 -18
  126. package/dist/ui/AssetManagerUI.cjs +31 -17
  127. package/dist/ui/AssetManagerUI.d.cts +19 -3
  128. package/dist/ui/AssetManagerUI.d.cts.map +1 -1
  129. package/dist/ui/AssetManagerUI.d.ts +19 -3
  130. package/dist/ui/AssetManagerUI.d.ts.map +1 -1
  131. package/dist/ui/AssetManagerUI.js +31 -17
  132. package/dist/ui/DeleteAssetDialog.cjs +5 -3
  133. package/dist/ui/DeleteAssetDialog.d.cts.map +1 -1
  134. package/dist/ui/DeleteAssetDialog.d.ts.map +1 -1
  135. package/dist/ui/DeleteAssetDialog.js +5 -3
  136. package/dist/ui/DeleteFolderDialog.cjs +80 -0
  137. package/dist/ui/DeleteFolderDialog.d.cts +11 -0
  138. package/dist/ui/DeleteFolderDialog.d.cts.map +1 -0
  139. package/dist/ui/DeleteFolderDialog.d.ts +11 -0
  140. package/dist/ui/DeleteFolderDialog.d.ts.map +1 -0
  141. package/dist/ui/DeleteFolderDialog.js +42 -0
  142. package/dist/ui/EmptyFolderState.cjs +56 -0
  143. package/dist/ui/EmptyFolderState.d.cts +6 -0
  144. package/dist/ui/EmptyFolderState.d.cts.map +1 -0
  145. package/dist/ui/EmptyFolderState.d.ts +6 -0
  146. package/dist/ui/EmptyFolderState.d.ts.map +1 -0
  147. package/dist/ui/EmptyFolderState.js +18 -0
  148. package/dist/ui/FolderBreadcrumb.cjs +76 -0
  149. package/dist/ui/FolderBreadcrumb.d.cts +9 -0
  150. package/dist/ui/FolderBreadcrumb.d.cts.map +1 -0
  151. package/dist/ui/FolderBreadcrumb.d.ts +9 -0
  152. package/dist/ui/FolderBreadcrumb.d.ts.map +1 -0
  153. package/dist/ui/FolderBreadcrumb.js +38 -0
  154. package/dist/ui/FolderNameDialog.cjs +105 -0
  155. package/dist/ui/FolderNameDialog.d.cts +14 -0
  156. package/dist/ui/FolderNameDialog.d.cts.map +1 -0
  157. package/dist/ui/FolderNameDialog.d.ts +14 -0
  158. package/dist/ui/FolderNameDialog.d.ts.map +1 -0
  159. package/dist/ui/FolderNameDialog.js +67 -0
  160. package/dist/ui/FolderTree.cjs +85 -0
  161. package/dist/ui/FolderTree.d.cts +13 -0
  162. package/dist/ui/FolderTree.d.cts.map +1 -0
  163. package/dist/ui/FolderTree.d.ts +13 -0
  164. package/dist/ui/FolderTree.d.ts.map +1 -0
  165. package/dist/ui/FolderTree.js +44 -0
  166. package/dist/ui/MetadataPanel.cjs +23 -17
  167. package/dist/ui/MetadataPanel.d.cts.map +1 -1
  168. package/dist/ui/MetadataPanel.d.ts.map +1 -1
  169. package/dist/ui/MetadataPanel.js +23 -17
  170. package/dist/ui/MoveTargetPicker.cjs +87 -0
  171. package/dist/ui/MoveTargetPicker.d.cts +16 -0
  172. package/dist/ui/MoveTargetPicker.d.cts.map +1 -0
  173. package/dist/ui/MoveTargetPicker.d.ts +16 -0
  174. package/dist/ui/MoveTargetPicker.d.ts.map +1 -0
  175. package/dist/ui/MoveTargetPicker.js +49 -0
  176. package/dist/ui/ReplaceAssetDialog.cjs +19 -17
  177. package/dist/ui/ReplaceAssetDialog.d.cts +2 -1
  178. package/dist/ui/ReplaceAssetDialog.d.cts.map +1 -1
  179. package/dist/ui/ReplaceAssetDialog.d.ts +2 -1
  180. package/dist/ui/ReplaceAssetDialog.d.ts.map +1 -1
  181. package/dist/ui/ReplaceAssetDialog.js +19 -17
  182. package/dist/ui/UnsplashPanel.cjs +137 -0
  183. package/dist/ui/UnsplashPanel.d.cts +28 -0
  184. package/dist/ui/UnsplashPanel.d.cts.map +1 -0
  185. package/dist/ui/UnsplashPanel.d.ts +28 -0
  186. package/dist/ui/UnsplashPanel.d.ts.map +1 -0
  187. package/dist/ui/UnsplashPanel.js +99 -0
  188. package/dist/ui/UploadButton.cjs +12 -13
  189. package/dist/ui/UploadButton.d.cts +9 -2
  190. package/dist/ui/UploadButton.d.cts.map +1 -1
  191. package/dist/ui/UploadButton.d.ts +9 -2
  192. package/dist/ui/UploadButton.d.ts.map +1 -1
  193. package/dist/ui/UploadButton.js +12 -13
  194. package/dist/ui/index.cjs +41 -0
  195. package/dist/ui/index.d.cts +15 -0
  196. package/dist/ui/index.d.cts.map +1 -1
  197. package/dist/ui/index.d.ts +15 -0
  198. package/dist/ui/index.d.ts.map +1 -1
  199. package/dist/ui/index.js +8 -0
  200. package/dist/utils/data-source.cjs +190 -0
  201. package/dist/utils/data-source.d.cts +63 -0
  202. package/dist/utils/data-source.d.cts.map +1 -0
  203. package/dist/utils/data-source.d.ts +63 -0
  204. package/dist/utils/data-source.d.ts.map +1 -0
  205. package/dist/utils/data-source.js +149 -0
  206. package/dist/utils/errors.cjs +18 -0
  207. package/dist/utils/errors.d.cts +27 -0
  208. package/dist/utils/errors.d.cts.map +1 -1
  209. package/dist/utils/errors.d.ts +27 -0
  210. package/dist/utils/errors.d.ts.map +1 -1
  211. package/dist/utils/errors.js +16 -1
  212. package/dist/utils/folders.cjs +335 -0
  213. package/dist/utils/folders.d.cts +54 -0
  214. package/dist/utils/folders.d.cts.map +1 -0
  215. package/dist/utils/folders.d.ts +54 -0
  216. package/dist/utils/folders.d.ts.map +1 -0
  217. package/dist/utils/folders.js +297 -0
  218. package/dist/utils/header-action.cjs +1 -1
  219. package/dist/utils/header-action.d.cts.map +1 -1
  220. package/dist/utils/header-action.d.ts.map +1 -1
  221. package/dist/utils/header-action.js +1 -1
  222. package/dist/utils/registry.cjs +38 -12
  223. package/dist/utils/registry.d.cts +29 -1
  224. package/dist/utils/registry.d.cts.map +1 -1
  225. package/dist/utils/registry.d.ts +29 -1
  226. package/dist/utils/registry.d.ts.map +1 -1
  227. package/dist/utils/registry.js +31 -11
  228. package/dist/utils/resolver.cjs +5 -4
  229. package/dist/utils/resolver.d.cts.map +1 -1
  230. package/dist/utils/resolver.d.ts.map +1 -1
  231. package/dist/utils/resolver.js +5 -4
  232. package/dist/utils/studio-asset-source.cjs +13 -4
  233. package/dist/utils/studio-asset-source.d.cts +6 -1
  234. package/dist/utils/studio-asset-source.d.cts.map +1 -1
  235. package/dist/utils/studio-asset-source.d.ts +6 -1
  236. package/dist/utils/studio-asset-source.d.ts.map +1 -1
  237. package/dist/utils/studio-asset-source.js +9 -3
  238. package/dist/utils/validate-upload-result.d.cts +2 -1
  239. package/dist/utils/validate-upload-result.d.cts.map +1 -1
  240. package/dist/utils/validate-upload-result.d.ts +2 -1
  241. package/dist/utils/validate-upload-result.d.ts.map +1 -1
  242. package/dist/version.cjs +1 -1
  243. package/dist/version.d.cts +1 -1
  244. package/dist/version.d.ts +1 -1
  245. package/dist/version.js +1 -1
  246. package/i18n/messages/en.json +99 -0
  247. package/i18n/messages/ja.json +99 -0
  248. package/i18n/messages/ko.json +99 -0
  249. package/i18n/messages/zh.json +99 -0
  250. package/meta/config.json +1 -1
  251. package/package.json +19 -8
@@ -0,0 +1,297 @@
1
+ import { resolveFolderId } from "../types/folders.js";
2
+ import { AssetSourceError } from "./errors.js";
3
+ function createFolderStore(options = {}) {
4
+ const now = options.now ?? (()=>Date.now());
5
+ const records = new Map();
6
+ const assetFolder = new Map();
7
+ const listeners = new Set();
8
+ let seq = 0;
9
+ const childrenByParent = new Map();
10
+ const folderAssets = new Map();
11
+ const notify = ()=>{
12
+ for (const listener of listeners)listener();
13
+ };
14
+ const requireRecord = (id)=>{
15
+ const rec = records.get(id);
16
+ if (void 0 === rec) throw new AssetSourceError("FOLDER_NOT_FOUND", `Unknown folder "${id}".`);
17
+ return rec;
18
+ };
19
+ const linkChild = (parentId, childId)=>{
20
+ let set = childrenByParent.get(parentId);
21
+ if (void 0 === set) {
22
+ set = new Set();
23
+ childrenByParent.set(parentId, set);
24
+ }
25
+ set.add(childId);
26
+ };
27
+ const unlinkChild = (parentId, childId)=>{
28
+ const set = childrenByParent.get(parentId);
29
+ if (void 0 === set) return;
30
+ set.delete(childId);
31
+ if (0 === set.size) childrenByParent.delete(parentId);
32
+ };
33
+ const detachAsset = (assetId, folderId)=>{
34
+ const set = folderAssets.get(folderId);
35
+ if (void 0 === set) return;
36
+ set.delete(assetId);
37
+ if (0 === set.size) folderAssets.delete(folderId);
38
+ };
39
+ const setMembership = (assetId, folderId)=>{
40
+ const prev = assetFolder.get(assetId);
41
+ if (prev === folderId) return;
42
+ if (void 0 !== prev) detachAsset(assetId, prev);
43
+ assetFolder.set(assetId, folderId);
44
+ let set = folderAssets.get(folderId);
45
+ if (void 0 === set) {
46
+ set = new Set();
47
+ folderAssets.set(folderId, set);
48
+ }
49
+ set.add(assetId);
50
+ };
51
+ const clearMembership = (assetId)=>{
52
+ const prev = assetFolder.get(assetId);
53
+ if (void 0 === prev) return false;
54
+ assetFolder.delete(assetId);
55
+ detachAsset(assetId, prev);
56
+ return true;
57
+ };
58
+ const childFolderCount = (id)=>childrenByParent.get(id)?.size ?? 0;
59
+ const directAssetCount = (id)=>folderAssets.get(id)?.size ?? 0;
60
+ const project = (rec)=>Object.freeze({
61
+ id: rec.id,
62
+ name: rec.name,
63
+ parentId: rec.parentId,
64
+ createdAt: rec.createdAt,
65
+ updatedAt: rec.updatedAt,
66
+ counts: Object.freeze({
67
+ assets: directAssetCount(rec.id),
68
+ folders: childFolderCount(rec.id)
69
+ })
70
+ });
71
+ const depthOf = (id)=>{
72
+ let depth = 0;
73
+ let cursor = id;
74
+ while(null !== cursor){
75
+ const rec = records.get(cursor);
76
+ if (void 0 === rec) break;
77
+ depth += 1;
78
+ cursor = rec.parentId;
79
+ }
80
+ return depth;
81
+ };
82
+ const subtree = (id)=>{
83
+ const out = new Set([
84
+ id
85
+ ]);
86
+ const stack = [
87
+ id
88
+ ];
89
+ while(stack.length > 0){
90
+ const current = stack.pop();
91
+ if (void 0 === current) continue;
92
+ const kids = childrenByParent.get(current);
93
+ if (void 0 === kids) continue;
94
+ for (const kid of kids)if (!out.has(kid)) {
95
+ out.add(kid);
96
+ stack.push(kid);
97
+ }
98
+ }
99
+ return out;
100
+ };
101
+ const heightOf = (id)=>{
102
+ let height = 0;
103
+ const ids = subtree(id);
104
+ for (const fid of ids){
105
+ const d = depthOf(fid) - depthOf(id);
106
+ if (d > height) height = d;
107
+ }
108
+ return height;
109
+ };
110
+ const assertNameFree = (parentId, name, exceptId)=>{
111
+ const lowered = name.toLowerCase();
112
+ const siblings = childrenByParent.get(parentId);
113
+ if (void 0 === siblings) return;
114
+ for (const sibId of siblings){
115
+ if (sibId === exceptId) continue;
116
+ const rec = records.get(sibId);
117
+ if (void 0 !== rec && rec.name.toLowerCase() === lowered) throw new AssetSourceError("FOLDER_NAME_CONFLICT", `A folder named "${name}" already exists here.`);
118
+ }
119
+ };
120
+ const normalizeName = (name)=>{
121
+ const trimmed = name.trim();
122
+ if ("" === trimmed) throw new AssetSourceError("FOLDER_NAME_CONFLICT", "Folder name must not be empty.");
123
+ return trimmed;
124
+ };
125
+ const assertDepthOk = (parentDepth, extraHeight, maxDepth)=>{
126
+ if (void 0 === maxDepth) return;
127
+ if (parentDepth + 1 + extraHeight > maxDepth) throw new AssetSourceError("MOVE_REJECTED", `Operation would exceed the maximum folder depth of ${maxDepth}.`);
128
+ };
129
+ return {
130
+ listChildren (parentId) {
131
+ const target = resolveFolderId(parentId);
132
+ const ids = childrenByParent.get(target);
133
+ if (void 0 === ids) return Object.freeze([]);
134
+ const out = [];
135
+ for (const id of ids){
136
+ const rec = records.get(id);
137
+ if (void 0 !== rec) out.push(project(rec));
138
+ }
139
+ return Object.freeze(out);
140
+ },
141
+ listAll () {
142
+ return Object.freeze([
143
+ ...records.values()
144
+ ].map(project));
145
+ },
146
+ get (id) {
147
+ const rec = records.get(id);
148
+ return void 0 === rec ? void 0 : project(rec);
149
+ },
150
+ path (id) {
151
+ const target = resolveFolderId(id);
152
+ if (null === target) return Object.freeze([]);
153
+ const chain = [];
154
+ let cursor = target;
155
+ const seen = new Set();
156
+ while(null !== cursor){
157
+ if (seen.has(cursor)) break;
158
+ seen.add(cursor);
159
+ const rec = records.get(cursor);
160
+ if (void 0 === rec) break;
161
+ chain.unshift(project(rec));
162
+ cursor = rec.parentId;
163
+ }
164
+ return Object.freeze(chain);
165
+ },
166
+ createFolder (parentId, name, maxDepth) {
167
+ const target = resolveFolderId(parentId);
168
+ if (null !== target) requireRecord(target);
169
+ const clean = normalizeName(name);
170
+ assertNameFree(target, clean);
171
+ assertDepthOk(depthOf(target), 0, maxDepth);
172
+ const ts = now();
173
+ const rec = {
174
+ id: `folder-${seq += 1}`,
175
+ name: clean,
176
+ parentId: target,
177
+ createdAt: ts,
178
+ updatedAt: ts
179
+ };
180
+ records.set(rec.id, rec);
181
+ linkChild(target, rec.id);
182
+ notify();
183
+ return project(rec);
184
+ },
185
+ renameFolder (id, name) {
186
+ const rec = requireRecord(id);
187
+ const clean = normalizeName(name);
188
+ assertNameFree(rec.parentId, clean, id);
189
+ rec.name = clean;
190
+ rec.updatedAt = now();
191
+ notify();
192
+ return project(rec);
193
+ },
194
+ moveFolder (id, parentId, maxDepth) {
195
+ const rec = requireRecord(id);
196
+ const target = resolveFolderId(parentId);
197
+ if (target === id) throw new AssetSourceError("FOLDER_CYCLE", "A folder cannot be moved into itself.");
198
+ if (null !== target) {
199
+ requireRecord(target);
200
+ if (subtree(id).has(target)) throw new AssetSourceError("FOLDER_CYCLE", "A folder cannot be moved into one of its own descendants.");
201
+ }
202
+ if (rec.parentId === target) return project(rec);
203
+ assertNameFree(target, rec.name, id);
204
+ assertDepthOk(depthOf(target), heightOf(id), maxDepth);
205
+ unlinkChild(rec.parentId, id);
206
+ rec.parentId = target;
207
+ rec.updatedAt = now();
208
+ linkChild(target, id);
209
+ notify();
210
+ return project(rec);
211
+ },
212
+ removeFolder (id, opts) {
213
+ const rec = requireRecord(id);
214
+ if (opts?.cascade) {
215
+ const ids = subtree(id);
216
+ const removedAssetIds = [];
217
+ for (const fid of ids){
218
+ const assetsHere = folderAssets.get(fid);
219
+ if (void 0 !== assetsHere) {
220
+ for (const assetId of assetsHere){
221
+ removedAssetIds.push(assetId);
222
+ assetFolder.delete(assetId);
223
+ }
224
+ folderAssets.delete(fid);
225
+ }
226
+ childrenByParent.delete(fid);
227
+ records.delete(fid);
228
+ }
229
+ unlinkChild(rec.parentId, id);
230
+ notify();
231
+ return {
232
+ removedAssetIds: Object.freeze(removedAssetIds)
233
+ };
234
+ }
235
+ const newParent = rec.parentId;
236
+ const childIds = [
237
+ ...childrenByParent.get(id) ?? []
238
+ ];
239
+ for (const childId of childIds){
240
+ const child = records.get(childId);
241
+ if (void 0 !== child) {
242
+ child.parentId = newParent;
243
+ child.updatedAt = now();
244
+ linkChild(newParent, childId);
245
+ }
246
+ }
247
+ childrenByParent.delete(id);
248
+ const assetIds = [
249
+ ...folderAssets.get(id) ?? []
250
+ ];
251
+ for (const assetId of assetIds)if (null === newParent) clearMembership(assetId);
252
+ else setMembership(assetId, newParent);
253
+ unlinkChild(newParent, id);
254
+ records.delete(id);
255
+ notify();
256
+ return {
257
+ removedAssetIds: Object.freeze([])
258
+ };
259
+ },
260
+ folderOf (assetId) {
261
+ return assetFolder.get(assetId) ?? null;
262
+ },
263
+ moveAsset (assetId, folderId) {
264
+ const target = resolveFolderId(folderId);
265
+ if (null !== target) requireRecord(target);
266
+ if (null === target) clearMembership(assetId);
267
+ else setMembership(assetId, target);
268
+ notify();
269
+ },
270
+ moveAssets (assetIds, folderId) {
271
+ const target = resolveFolderId(folderId);
272
+ if (null !== target) requireRecord(target);
273
+ for (const assetId of assetIds)if (null === target) clearMembership(assetId);
274
+ else setMembership(assetId, target);
275
+ notify();
276
+ },
277
+ removeAsset (assetId) {
278
+ if (clearMembership(assetId)) notify();
279
+ },
280
+ subtreeIds (id) {
281
+ return subtree(id);
282
+ },
283
+ directAssetIds (id) {
284
+ const set = folderAssets.get(id);
285
+ return void 0 === set ? Object.freeze([]) : Object.freeze([
286
+ ...set
287
+ ]);
288
+ },
289
+ subscribe (listener) {
290
+ listeners.add(listener);
291
+ return ()=>{
292
+ listeners.delete(listener);
293
+ };
294
+ }
295
+ };
296
+ }
297
+ export { createFolderStore };
@@ -29,7 +29,7 @@ var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  const uploadAssetAction = {
31
31
  id: "asset-manager:upload",
32
- label: "Upload asset",
32
+ labelKey: "assetManager.action.upload",
33
33
  icon: "upload",
34
34
  group: "secondary",
35
35
  onClick (ctx) {
@@ -1 +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"}
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,kBAW/B,CAAC"}
@@ -1 +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
+ {"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,kBAW/B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  const uploadAssetAction = {
2
2
  id: "asset-manager:upload",
3
- label: "Upload asset",
3
+ labelKey: "assetManager.action.upload",
4
4
  icon: "upload",
5
5
  group: "secondary",
6
6
  onClick (ctx) {
@@ -28,7 +28,9 @@ var __webpack_require__ = {};
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
- createAssetRegistry: ()=>createAssetRegistry
31
+ createAssetRegistry: ()=>createAssetRegistry,
32
+ paginateMatches: ()=>paginateMatches,
33
+ prepareAssetMatcher: ()=>prepareAssetMatcher
32
34
  });
33
35
  const external_infer_kind_cjs_namespaceObject = require("./infer-kind.cjs");
34
36
  const DEFAULT_SEARCH_LIMIT = 50;
@@ -126,6 +128,11 @@ function freezeUploadResult(asset) {
126
128
  } : {},
127
129
  ...void 0 !== asset.meta.height ? {
128
130
  height: asset.meta.height
131
+ } : {},
132
+ ...void 0 !== asset.meta.attribution ? {
133
+ attribution: Object.freeze({
134
+ ...asset.meta.attribution
135
+ })
129
136
  } : {}
130
137
  })
131
138
  } : {},
@@ -149,18 +156,27 @@ function normalizeTags(tags) {
149
156
  }
150
157
  return out;
151
158
  }
152
- function runSearch(assetsById, options) {
159
+ function prepareAssetMatcher(options) {
153
160
  const query = options.query?.trim().toLowerCase() ?? "";
154
- const kindFilter = options.kinds && options.kinds.length > 0 ? options.kinds : void 0;
155
- const tagFilter = options.tags && options.tags.length > 0 ? options.tags.map((t)=>t.trim().toLowerCase()).filter((t)=>"" !== t) : void 0;
156
- const matches = [];
157
- for (const entry of assetsById.values()){
158
- if (matchesQuery(entry, query)) {
159
- if (void 0 === kindFilter || kindFilter.includes((0, external_infer_kind_cjs_namespaceObject.inferAssetKind)(entry))) {
160
- if (void 0 === tagFilter || matchesAllTags(entry, tagFilter)) matches.push(entry);
161
- }
162
- }
161
+ const kindSet = options.kinds && options.kinds.length > 0 ? new Set(options.kinds) : null;
162
+ const tagFilter = normalizeTagFilter(options.tags);
163
+ return (entry)=>{
164
+ if (!matchesQuery(entry, query)) return false;
165
+ if (null !== kindSet && !kindSet.has((0, external_infer_kind_cjs_namespaceObject.inferAssetKind)(entry))) return false;
166
+ if (tagFilter.length > 0 && !matchesAllTags(entry, tagFilter)) return false;
167
+ return true;
168
+ };
169
+ }
170
+ function normalizeTagFilter(tags) {
171
+ if (void 0 === tags || 0 === tags.length) return [];
172
+ const out = [];
173
+ for (const raw of tags){
174
+ const tag = raw.trim().toLowerCase();
175
+ if ("" !== tag) out.push(tag);
163
176
  }
177
+ return out;
178
+ }
179
+ function paginateMatches(matches, options) {
164
180
  const total = matches.length;
165
181
  const limit = void 0 !== options.limit && options.limit > 0 ? options.limit : DEFAULT_SEARCH_LIMIT;
166
182
  const offset = parseCursor(options.cursor);
@@ -173,6 +189,12 @@ function runSearch(assetsById, options) {
173
189
  nextCursor
174
190
  });
175
191
  }
192
+ function runSearch(assetsById, options) {
193
+ const matches = [];
194
+ const matcher = prepareAssetMatcher(options);
195
+ for (const entry of assetsById.values())if (matcher(entry)) matches.push(entry);
196
+ return paginateMatches(matches, options);
197
+ }
176
198
  function matchesQuery(entry, query) {
177
199
  if ("" === query) return true;
178
200
  if (entry.id.toLowerCase().includes(query)) return true;
@@ -194,8 +216,12 @@ function parseCursor(cursor) {
194
216
  return value;
195
217
  }
196
218
  exports.createAssetRegistry = __webpack_exports__.createAssetRegistry;
219
+ exports.paginateMatches = __webpack_exports__.paginateMatches;
220
+ exports.prepareAssetMatcher = __webpack_exports__.prepareAssetMatcher;
197
221
  for(var __rspack_i in __webpack_exports__)if (-1 === [
198
- "createAssetRegistry"
222
+ "createAssetRegistry",
223
+ "paginateMatches",
224
+ "prepareAssetMatcher"
199
225
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
200
226
  Object.defineProperty(exports, '__esModule', {
201
227
  value: true
@@ -1,3 +1,31 @@
1
- import type { AssetRegistry } from "../types/types.js";
1
+ import type { AssetKind, AssetRegistry, AssetSearchPage, UploadResult } from "../types/types.js";
2
2
  export declare function createAssetRegistry(): AssetRegistry;
3
+ /** Query / kind / tag filter shared by the registry and the data-source path. */
4
+ export interface AssetMatchFilter {
5
+ readonly query?: string;
6
+ readonly kinds?: readonly AssetKind[];
7
+ readonly tags?: readonly string[];
8
+ }
9
+ /**
10
+ * Compile a search filter into a reusable predicate. The query string and tag
11
+ * filter are trimmed + lowercased ONCE here, not once per candidate, so a scan
12
+ * over N assets normalizes the filter a single time instead of N times. This is
13
+ * the registry's search hot path — `AssetCommandPalette` re-runs a free-text
14
+ * query on every keystroke — so build the matcher once, then apply it across the
15
+ * list (see `runSearch`).
16
+ *
17
+ * Exported so the in-memory data-source compose layer applies the EXACT same
18
+ * matching before adding its folder clause (PRD 0002 §9.2 — single source of
19
+ * truth for search semantics).
20
+ */
21
+ export declare function prepareAssetMatcher(options: AssetMatchFilter): (entry: UploadResult) => boolean;
22
+ /**
23
+ * Pure offset-cursor pagination over a pre-filtered match list. Shared by
24
+ * `runSearch` and the folder-scoped data-source path so the cursor contract is
25
+ * identical regardless of which clause did the filtering.
26
+ */
27
+ export declare function paginateMatches(matches: readonly UploadResult[], options: {
28
+ readonly cursor?: string;
29
+ readonly limit?: number;
30
+ }): AssetSearchPage;
3
31
  //# sourceMappingURL=registry.d.cts.map
@@ -1 +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"}
1
+ {"version":3,"file":"registry.d.cts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,SAAS,EACT,aAAa,EAGb,eAAe,EACf,YAAY,EACZ,MAAM,mBAAmB,CAAC;AAK3B,wBAAgB,mBAAmB,IAAI,aAAa,CA6EnD;AAmDD,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,gBAAgB,GACvB,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAclC;AAaD;;;;GAIG;AACH,wBAAgB,eAAe,CAC9B,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,OAAO,EAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,eAAe,CAejB"}
@@ -1,3 +1,31 @@
1
- import type { AssetRegistry } from "../types/types.js";
1
+ import type { AssetKind, AssetRegistry, AssetSearchPage, UploadResult } from "../types/types.js";
2
2
  export declare function createAssetRegistry(): AssetRegistry;
3
+ /** Query / kind / tag filter shared by the registry and the data-source path. */
4
+ export interface AssetMatchFilter {
5
+ readonly query?: string;
6
+ readonly kinds?: readonly AssetKind[];
7
+ readonly tags?: readonly string[];
8
+ }
9
+ /**
10
+ * Compile a search filter into a reusable predicate. The query string and tag
11
+ * filter are trimmed + lowercased ONCE here, not once per candidate, so a scan
12
+ * over N assets normalizes the filter a single time instead of N times. This is
13
+ * the registry's search hot path — `AssetCommandPalette` re-runs a free-text
14
+ * query on every keystroke — so build the matcher once, then apply it across the
15
+ * list (see `runSearch`).
16
+ *
17
+ * Exported so the in-memory data-source compose layer applies the EXACT same
18
+ * matching before adding its folder clause (PRD 0002 §9.2 — single source of
19
+ * truth for search semantics).
20
+ */
21
+ export declare function prepareAssetMatcher(options: AssetMatchFilter): (entry: UploadResult) => boolean;
22
+ /**
23
+ * Pure offset-cursor pagination over a pre-filtered match list. Shared by
24
+ * `runSearch` and the folder-scoped data-source path so the cursor contract is
25
+ * identical regardless of which clause did the filtering.
26
+ */
27
+ export declare function paginateMatches(matches: readonly UploadResult[], options: {
28
+ readonly cursor?: string;
29
+ readonly limit?: number;
30
+ }): AssetSearchPage;
3
31
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,SAAS,EACT,aAAa,EAGb,eAAe,EACf,YAAY,EACZ,MAAM,mBAAmB,CAAC;AAK3B,wBAAgB,mBAAmB,IAAI,aAAa,CA6EnD;AAmDD,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,gBAAgB,GACvB,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAclC;AAaD;;;;GAIG;AACH,wBAAgB,eAAe,CAC9B,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,OAAO,EAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,eAAe,CAejB"}
@@ -94,6 +94,11 @@ function freezeUploadResult(asset) {
94
94
  } : {},
95
95
  ...void 0 !== asset.meta.height ? {
96
96
  height: asset.meta.height
97
+ } : {},
98
+ ...void 0 !== asset.meta.attribution ? {
99
+ attribution: Object.freeze({
100
+ ...asset.meta.attribution
101
+ })
97
102
  } : {}
98
103
  })
99
104
  } : {},
@@ -117,18 +122,27 @@ function normalizeTags(tags) {
117
122
  }
118
123
  return out;
119
124
  }
120
- function runSearch(assetsById, options) {
125
+ function prepareAssetMatcher(options) {
121
126
  const query = options.query?.trim().toLowerCase() ?? "";
122
- const kindFilter = options.kinds && options.kinds.length > 0 ? options.kinds : void 0;
123
- const tagFilter = options.tags && options.tags.length > 0 ? options.tags.map((t)=>t.trim().toLowerCase()).filter((t)=>"" !== t) : void 0;
124
- const matches = [];
125
- for (const entry of assetsById.values()){
126
- if (matchesQuery(entry, query)) {
127
- if (void 0 === kindFilter || kindFilter.includes(inferAssetKind(entry))) {
128
- if (void 0 === tagFilter || matchesAllTags(entry, tagFilter)) matches.push(entry);
129
- }
130
- }
127
+ const kindSet = options.kinds && options.kinds.length > 0 ? new Set(options.kinds) : null;
128
+ const tagFilter = normalizeTagFilter(options.tags);
129
+ return (entry)=>{
130
+ if (!matchesQuery(entry, query)) return false;
131
+ if (null !== kindSet && !kindSet.has(inferAssetKind(entry))) return false;
132
+ if (tagFilter.length > 0 && !matchesAllTags(entry, tagFilter)) return false;
133
+ return true;
134
+ };
135
+ }
136
+ function normalizeTagFilter(tags) {
137
+ if (void 0 === tags || 0 === tags.length) return [];
138
+ const out = [];
139
+ for (const raw of tags){
140
+ const tag = raw.trim().toLowerCase();
141
+ if ("" !== tag) out.push(tag);
131
142
  }
143
+ return out;
144
+ }
145
+ function paginateMatches(matches, options) {
132
146
  const total = matches.length;
133
147
  const limit = void 0 !== options.limit && options.limit > 0 ? options.limit : DEFAULT_SEARCH_LIMIT;
134
148
  const offset = parseCursor(options.cursor);
@@ -141,6 +155,12 @@ function runSearch(assetsById, options) {
141
155
  nextCursor
142
156
  });
143
157
  }
158
+ function runSearch(assetsById, options) {
159
+ const matches = [];
160
+ const matcher = prepareAssetMatcher(options);
161
+ for (const entry of assetsById.values())if (matcher(entry)) matches.push(entry);
162
+ return paginateMatches(matches, options);
163
+ }
144
164
  function matchesQuery(entry, query) {
145
165
  if ("" === query) return true;
146
166
  if (entry.id.toLowerCase().includes(query)) return true;
@@ -161,4 +181,4 @@ function parseCursor(cursor) {
161
181
  if (!Number.isFinite(value) || value < 0) return 0;
162
182
  return value;
163
183
  }
164
- export { createAssetRegistry };
184
+ export { createAssetRegistry, paginateMatches, prepareAssetMatcher };
@@ -93,10 +93,11 @@ function createIRAssetResolver(options) {
93
93
  async function resolveAssets(ir, resolver) {
94
94
  const rewriteMap = new Map();
95
95
  const assetUrls = collectAssetUrls(ir);
96
- for (const url of assetUrls){
97
- const resolution = await resolver(url);
98
- if (null !== resolution) rewriteMap.set(url, resolution);
99
- }
96
+ const resolutions = await Promise.all(Array.from(assetUrls, async (url)=>[
97
+ url,
98
+ await resolver(url)
99
+ ]));
100
+ for (const [url, resolution] of resolutions)if (null !== resolution) rewriteMap.set(url, resolution);
100
101
  const nextIr = {
101
102
  version: ir.version,
102
103
  root: cloneNode(ir.root, rewriteMap),
@@ -1 +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
+ {"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,CAwBjB"}
@@ -1 +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"}
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,CAwBjB"}
@@ -60,10 +60,11 @@ function createIRAssetResolver(options) {
60
60
  async function resolveAssets(ir, resolver) {
61
61
  const rewriteMap = new Map();
62
62
  const assetUrls = collectAssetUrls(ir);
63
- for (const url of assetUrls){
64
- const resolution = await resolver(url);
65
- if (null !== resolution) rewriteMap.set(url, resolution);
66
- }
63
+ const resolutions = await Promise.all(Array.from(assetUrls, async (url)=>[
64
+ url,
65
+ await resolver(url)
66
+ ]));
67
+ for (const [url, resolution] of resolutions)if (null !== resolution) rewriteMap.set(url, resolution);
67
68
  const nextIr = {
68
69
  version: ir.version,
69
70
  root: cloneNode(ir.root, rewriteMap),
@@ -30,7 +30,8 @@ __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
31
  MAX_CONCURRENT_UPLOADS: ()=>MAX_CONCURRENT_UPLOADS,
32
32
  createStudioAssetSource: ()=>createStudioAssetSource,
33
- inferStudioAssetKind: ()=>inferStudioAssetKind
33
+ inferStudioAssetKind: ()=>inferStudioAssetKind,
34
+ toStudioAsset: ()=>toStudioAsset
34
35
  });
35
36
  const external_asset_reference_cjs_namespaceObject = require("./asset-reference.cjs");
36
37
  const external_infer_kind_cjs_namespaceObject = require("./infer-kind.cjs");
@@ -41,7 +42,7 @@ function createStudioAssetSource(options) {
41
42
  const project = (entry)=>toStudioAsset(entry, getThumbnail);
42
43
  const uploadListeners = new Set();
43
44
  const fanOut = (event)=>{
44
- for (const listener of uploadListeners)listener(event);
45
+ for (const subscriber of uploadListeners)safeNotify(subscriber, event);
45
46
  };
46
47
  return {
47
48
  list () {
@@ -81,7 +82,7 @@ function createStudioAssetSource(options) {
81
82
  let nextIndex = 0;
82
83
  let abortError;
83
84
  const emit = (event)=>{
84
- listener?.(event);
85
+ safeNotify(listener, event);
85
86
  fanOut(event);
86
87
  };
87
88
  const abortFromSignal = ()=>{
@@ -212,6 +213,12 @@ function deriveFallbackName(entry) {
212
213
  const idTail = entry.id.length > 12 ? `${entry.id.slice(0, 8)}…` : entry.id;
213
214
  return `Asset ${idTail}`;
214
215
  }
216
+ function safeNotify(listener, event) {
217
+ if (void 0 === listener) return;
218
+ try {
219
+ listener(event);
220
+ } catch {}
221
+ }
215
222
  function isAbortError(error) {
216
223
  if (null === error || "object" != typeof error) return false;
217
224
  const name = error.name;
@@ -226,10 +233,12 @@ function makeAbortError() {
226
233
  exports.MAX_CONCURRENT_UPLOADS = __webpack_exports__.MAX_CONCURRENT_UPLOADS;
227
234
  exports.createStudioAssetSource = __webpack_exports__.createStudioAssetSource;
228
235
  exports.inferStudioAssetKind = __webpack_exports__.inferStudioAssetKind;
236
+ exports.toStudioAsset = __webpack_exports__.toStudioAsset;
229
237
  for(var __rspack_i in __webpack_exports__)if (-1 === [
230
238
  "MAX_CONCURRENT_UPLOADS",
231
239
  "createStudioAssetSource",
232
- "inferStudioAssetKind"
240
+ "inferStudioAssetKind",
241
+ "toStudioAsset"
233
242
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
234
243
  Object.defineProperty(exports, '__esModule', {
235
244
  value: true