@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,335 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ createFolderStore: ()=>createFolderStore
32
+ });
33
+ const folders_cjs_namespaceObject = require("../types/folders.cjs");
34
+ const external_errors_cjs_namespaceObject = require("./errors.cjs");
35
+ function createFolderStore(options = {}) {
36
+ const now = options.now ?? (()=>Date.now());
37
+ const records = new Map();
38
+ const assetFolder = new Map();
39
+ const listeners = new Set();
40
+ let seq = 0;
41
+ const childrenByParent = new Map();
42
+ const folderAssets = new Map();
43
+ const notify = ()=>{
44
+ for (const listener of listeners)listener();
45
+ };
46
+ const requireRecord = (id)=>{
47
+ const rec = records.get(id);
48
+ if (void 0 === rec) throw new external_errors_cjs_namespaceObject.AssetSourceError("FOLDER_NOT_FOUND", `Unknown folder "${id}".`);
49
+ return rec;
50
+ };
51
+ const linkChild = (parentId, childId)=>{
52
+ let set = childrenByParent.get(parentId);
53
+ if (void 0 === set) {
54
+ set = new Set();
55
+ childrenByParent.set(parentId, set);
56
+ }
57
+ set.add(childId);
58
+ };
59
+ const unlinkChild = (parentId, childId)=>{
60
+ const set = childrenByParent.get(parentId);
61
+ if (void 0 === set) return;
62
+ set.delete(childId);
63
+ if (0 === set.size) childrenByParent.delete(parentId);
64
+ };
65
+ const detachAsset = (assetId, folderId)=>{
66
+ const set = folderAssets.get(folderId);
67
+ if (void 0 === set) return;
68
+ set.delete(assetId);
69
+ if (0 === set.size) folderAssets.delete(folderId);
70
+ };
71
+ const setMembership = (assetId, folderId)=>{
72
+ const prev = assetFolder.get(assetId);
73
+ if (prev === folderId) return;
74
+ if (void 0 !== prev) detachAsset(assetId, prev);
75
+ assetFolder.set(assetId, folderId);
76
+ let set = folderAssets.get(folderId);
77
+ if (void 0 === set) {
78
+ set = new Set();
79
+ folderAssets.set(folderId, set);
80
+ }
81
+ set.add(assetId);
82
+ };
83
+ const clearMembership = (assetId)=>{
84
+ const prev = assetFolder.get(assetId);
85
+ if (void 0 === prev) return false;
86
+ assetFolder.delete(assetId);
87
+ detachAsset(assetId, prev);
88
+ return true;
89
+ };
90
+ const childFolderCount = (id)=>childrenByParent.get(id)?.size ?? 0;
91
+ const directAssetCount = (id)=>folderAssets.get(id)?.size ?? 0;
92
+ const project = (rec)=>Object.freeze({
93
+ id: rec.id,
94
+ name: rec.name,
95
+ parentId: rec.parentId,
96
+ createdAt: rec.createdAt,
97
+ updatedAt: rec.updatedAt,
98
+ counts: Object.freeze({
99
+ assets: directAssetCount(rec.id),
100
+ folders: childFolderCount(rec.id)
101
+ })
102
+ });
103
+ const depthOf = (id)=>{
104
+ let depth = 0;
105
+ let cursor = id;
106
+ while(null !== cursor){
107
+ const rec = records.get(cursor);
108
+ if (void 0 === rec) break;
109
+ depth += 1;
110
+ cursor = rec.parentId;
111
+ }
112
+ return depth;
113
+ };
114
+ const subtree = (id)=>{
115
+ const out = new Set([
116
+ id
117
+ ]);
118
+ const stack = [
119
+ id
120
+ ];
121
+ while(stack.length > 0){
122
+ const current = stack.pop();
123
+ if (void 0 === current) continue;
124
+ const kids = childrenByParent.get(current);
125
+ if (void 0 === kids) continue;
126
+ for (const kid of kids)if (!out.has(kid)) {
127
+ out.add(kid);
128
+ stack.push(kid);
129
+ }
130
+ }
131
+ return out;
132
+ };
133
+ const heightOf = (id)=>{
134
+ let height = 0;
135
+ const ids = subtree(id);
136
+ for (const fid of ids){
137
+ const d = depthOf(fid) - depthOf(id);
138
+ if (d > height) height = d;
139
+ }
140
+ return height;
141
+ };
142
+ const assertNameFree = (parentId, name, exceptId)=>{
143
+ const lowered = name.toLowerCase();
144
+ const siblings = childrenByParent.get(parentId);
145
+ if (void 0 === siblings) return;
146
+ for (const sibId of siblings){
147
+ if (sibId === exceptId) continue;
148
+ const rec = records.get(sibId);
149
+ if (void 0 !== rec && rec.name.toLowerCase() === lowered) throw new external_errors_cjs_namespaceObject.AssetSourceError("FOLDER_NAME_CONFLICT", `A folder named "${name}" already exists here.`);
150
+ }
151
+ };
152
+ const normalizeName = (name)=>{
153
+ const trimmed = name.trim();
154
+ if ("" === trimmed) throw new external_errors_cjs_namespaceObject.AssetSourceError("FOLDER_NAME_CONFLICT", "Folder name must not be empty.");
155
+ return trimmed;
156
+ };
157
+ const assertDepthOk = (parentDepth, extraHeight, maxDepth)=>{
158
+ if (void 0 === maxDepth) return;
159
+ if (parentDepth + 1 + extraHeight > maxDepth) throw new external_errors_cjs_namespaceObject.AssetSourceError("MOVE_REJECTED", `Operation would exceed the maximum folder depth of ${maxDepth}.`);
160
+ };
161
+ return {
162
+ listChildren (parentId) {
163
+ const target = (0, folders_cjs_namespaceObject.resolveFolderId)(parentId);
164
+ const ids = childrenByParent.get(target);
165
+ if (void 0 === ids) return Object.freeze([]);
166
+ const out = [];
167
+ for (const id of ids){
168
+ const rec = records.get(id);
169
+ if (void 0 !== rec) out.push(project(rec));
170
+ }
171
+ return Object.freeze(out);
172
+ },
173
+ listAll () {
174
+ return Object.freeze([
175
+ ...records.values()
176
+ ].map(project));
177
+ },
178
+ get (id) {
179
+ const rec = records.get(id);
180
+ return void 0 === rec ? void 0 : project(rec);
181
+ },
182
+ path (id) {
183
+ const target = (0, folders_cjs_namespaceObject.resolveFolderId)(id);
184
+ if (null === target) return Object.freeze([]);
185
+ const chain = [];
186
+ let cursor = target;
187
+ const seen = new Set();
188
+ while(null !== cursor){
189
+ if (seen.has(cursor)) break;
190
+ seen.add(cursor);
191
+ const rec = records.get(cursor);
192
+ if (void 0 === rec) break;
193
+ chain.unshift(project(rec));
194
+ cursor = rec.parentId;
195
+ }
196
+ return Object.freeze(chain);
197
+ },
198
+ createFolder (parentId, name, maxDepth) {
199
+ const target = (0, folders_cjs_namespaceObject.resolveFolderId)(parentId);
200
+ if (null !== target) requireRecord(target);
201
+ const clean = normalizeName(name);
202
+ assertNameFree(target, clean);
203
+ assertDepthOk(depthOf(target), 0, maxDepth);
204
+ const ts = now();
205
+ const rec = {
206
+ id: `folder-${seq += 1}`,
207
+ name: clean,
208
+ parentId: target,
209
+ createdAt: ts,
210
+ updatedAt: ts
211
+ };
212
+ records.set(rec.id, rec);
213
+ linkChild(target, rec.id);
214
+ notify();
215
+ return project(rec);
216
+ },
217
+ renameFolder (id, name) {
218
+ const rec = requireRecord(id);
219
+ const clean = normalizeName(name);
220
+ assertNameFree(rec.parentId, clean, id);
221
+ rec.name = clean;
222
+ rec.updatedAt = now();
223
+ notify();
224
+ return project(rec);
225
+ },
226
+ moveFolder (id, parentId, maxDepth) {
227
+ const rec = requireRecord(id);
228
+ const target = (0, folders_cjs_namespaceObject.resolveFolderId)(parentId);
229
+ if (target === id) throw new external_errors_cjs_namespaceObject.AssetSourceError("FOLDER_CYCLE", "A folder cannot be moved into itself.");
230
+ if (null !== target) {
231
+ requireRecord(target);
232
+ if (subtree(id).has(target)) throw new external_errors_cjs_namespaceObject.AssetSourceError("FOLDER_CYCLE", "A folder cannot be moved into one of its own descendants.");
233
+ }
234
+ if (rec.parentId === target) return project(rec);
235
+ assertNameFree(target, rec.name, id);
236
+ assertDepthOk(depthOf(target), heightOf(id), maxDepth);
237
+ unlinkChild(rec.parentId, id);
238
+ rec.parentId = target;
239
+ rec.updatedAt = now();
240
+ linkChild(target, id);
241
+ notify();
242
+ return project(rec);
243
+ },
244
+ removeFolder (id, opts) {
245
+ const rec = requireRecord(id);
246
+ if (opts?.cascade) {
247
+ const ids = subtree(id);
248
+ const removedAssetIds = [];
249
+ for (const fid of ids){
250
+ const assetsHere = folderAssets.get(fid);
251
+ if (void 0 !== assetsHere) {
252
+ for (const assetId of assetsHere){
253
+ removedAssetIds.push(assetId);
254
+ assetFolder.delete(assetId);
255
+ }
256
+ folderAssets.delete(fid);
257
+ }
258
+ childrenByParent.delete(fid);
259
+ records.delete(fid);
260
+ }
261
+ unlinkChild(rec.parentId, id);
262
+ notify();
263
+ return {
264
+ removedAssetIds: Object.freeze(removedAssetIds)
265
+ };
266
+ }
267
+ const newParent = rec.parentId;
268
+ const childIds = [
269
+ ...childrenByParent.get(id) ?? []
270
+ ];
271
+ for (const childId of childIds){
272
+ const child = records.get(childId);
273
+ if (void 0 !== child) {
274
+ child.parentId = newParent;
275
+ child.updatedAt = now();
276
+ linkChild(newParent, childId);
277
+ }
278
+ }
279
+ childrenByParent.delete(id);
280
+ const assetIds = [
281
+ ...folderAssets.get(id) ?? []
282
+ ];
283
+ for (const assetId of assetIds)if (null === newParent) clearMembership(assetId);
284
+ else setMembership(assetId, newParent);
285
+ unlinkChild(newParent, id);
286
+ records.delete(id);
287
+ notify();
288
+ return {
289
+ removedAssetIds: Object.freeze([])
290
+ };
291
+ },
292
+ folderOf (assetId) {
293
+ return assetFolder.get(assetId) ?? null;
294
+ },
295
+ moveAsset (assetId, folderId) {
296
+ const target = (0, folders_cjs_namespaceObject.resolveFolderId)(folderId);
297
+ if (null !== target) requireRecord(target);
298
+ if (null === target) clearMembership(assetId);
299
+ else setMembership(assetId, target);
300
+ notify();
301
+ },
302
+ moveAssets (assetIds, folderId) {
303
+ const target = (0, folders_cjs_namespaceObject.resolveFolderId)(folderId);
304
+ if (null !== target) requireRecord(target);
305
+ for (const assetId of assetIds)if (null === target) clearMembership(assetId);
306
+ else setMembership(assetId, target);
307
+ notify();
308
+ },
309
+ removeAsset (assetId) {
310
+ if (clearMembership(assetId)) notify();
311
+ },
312
+ subtreeIds (id) {
313
+ return subtree(id);
314
+ },
315
+ directAssetIds (id) {
316
+ const set = folderAssets.get(id);
317
+ return void 0 === set ? Object.freeze([]) : Object.freeze([
318
+ ...set
319
+ ]);
320
+ },
321
+ subscribe (listener) {
322
+ listeners.add(listener);
323
+ return ()=>{
324
+ listeners.delete(listener);
325
+ };
326
+ }
327
+ };
328
+ }
329
+ exports.createFolderStore = __webpack_exports__.createFolderStore;
330
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
331
+ "createFolderStore"
332
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
333
+ Object.defineProperty(exports, '__esModule', {
334
+ value: true
335
+ });
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @file In-memory folder store (PRD 0002 §7). Lazy-importable from the factory
3
+ * so flat callers pay zero headless bytes for it.
4
+ *
5
+ * Owns the folder tree (records) and the asset→folder side-index. Membership is
6
+ * stored ONLY for non-root assets (absence ⇒ root), so `UploadResult` is never
7
+ * extended and the registry's freeze reconstructor can't strip a folder field.
8
+ * `AssetFolder.counts` is served from two reverse indexes — `childrenByParent`
9
+ * (parent → child folder ids) and `folderAssets` (folder → direct asset ids) —
10
+ * kept in lockstep with the authoritative maps via centralized mutation helpers,
11
+ * so projection, `listChildren`, and subtree walks are O(result size) instead of
12
+ * O(every record), and the counts still cannot drift from the side-index.
13
+ */
14
+ import type { AssetFolder, FolderId } from "../types/folders.js";
15
+ export interface CreateFolderStoreOptions {
16
+ /** Injectable clock for deterministic timestamps in tests. Defaults to `Date.now`. */
17
+ readonly now?: () => number;
18
+ }
19
+ export interface FolderStore {
20
+ /** Direct child folders of `parentId` (`null`/undefined ⇒ root's children). */
21
+ listChildren(parentId?: FolderId | null): readonly AssetFolder[];
22
+ /** All folders, flat. */
23
+ listAll(): readonly AssetFolder[];
24
+ get(id: FolderId): AssetFolder | undefined;
25
+ /** Root → … → `id` (inclusive). `[]` for root/undefined. */
26
+ path(id?: FolderId | null): readonly AssetFolder[];
27
+ createFolder(parentId: FolderId | null, name: string, maxDepth?: number): AssetFolder;
28
+ renameFolder(id: FolderId, name: string): AssetFolder;
29
+ moveFolder(id: FolderId, parentId: FolderId | null, maxDepth?: number): AssetFolder;
30
+ /**
31
+ * Remove a folder. Default policy reparents children (folders + assets) to
32
+ * the removed folder's parent; `{ cascade: true }` instead returns every
33
+ * descendant asset id for the caller to delete from the registry.
34
+ */
35
+ removeFolder(id: FolderId, opts?: {
36
+ readonly cascade?: boolean;
37
+ }): {
38
+ readonly removedAssetIds: readonly string[];
39
+ };
40
+ /** Owning folder of an asset (`null` ⇒ root). */
41
+ folderOf(assetId: string): FolderId | null;
42
+ moveAsset(assetId: string, folderId: FolderId | null): void;
43
+ /** Batch move — validates the target once (all-or-nothing) before applying. */
44
+ moveAssets(assetIds: readonly string[], folderId: FolderId | null): void;
45
+ /** Drop an asset's membership (call when the asset is deleted from the registry). */
46
+ removeAsset(assetId: string): void;
47
+ /** Folder id + every descendant folder id (for recursive listing). */
48
+ subtreeIds(id: FolderId): ReadonlySet<FolderId>;
49
+ /** Asset ids directly contained by `id` (membership only; no descendants). */
50
+ directAssetIds(id: FolderId): readonly string[];
51
+ subscribe(listener: () => void): () => void;
52
+ }
53
+ export declare function createFolderStore(options?: CreateFolderStoreOptions): FolderStore;
54
+ //# sourceMappingURL=folders.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.d.cts","sourceRoot":"","sources":["../../src/utils/folders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAYjE,MAAM,WAAW,wBAAwB;IACxC,sFAAsF;IACtF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC3B,+EAA+E;IAC/E,YAAY,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,WAAW,EAAE,CAAC;IACjE,yBAAyB;IACzB,OAAO,IAAI,SAAS,WAAW,EAAE,CAAC;IAClC,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IAC3C,4DAA4D;IAC5D,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,WAAW,EAAE,CAAC;IAEnD,YAAY,CACX,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GACf,WAAW,CAAC;IACf,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IACtD,UAAU,CACT,EAAE,EAAE,QAAQ,EACZ,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,QAAQ,CAAC,EAAE,MAAM,GACf,WAAW,CAAC;IACf;;;;OAIG;IACH,YAAY,CACX,EAAE,EAAE,QAAQ,EACZ,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GACnC;QAAE,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IAEnD,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC3C,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5D,+EAA+E;IAC/E,UAAU,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;IACzE,qFAAqF;IACrF,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,sEAAsE;IACtE,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEhD,8EAA8E;IAC9E,cAAc,CAAC,EAAE,EAAE,QAAQ,GAAG,SAAS,MAAM,EAAE,CAAC;IAEhD,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC5C;AAED,wBAAgB,iBAAiB,CAChC,OAAO,GAAE,wBAA6B,GACpC,WAAW,CA4Wb"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @file In-memory folder store (PRD 0002 §7). Lazy-importable from the factory
3
+ * so flat callers pay zero headless bytes for it.
4
+ *
5
+ * Owns the folder tree (records) and the asset→folder side-index. Membership is
6
+ * stored ONLY for non-root assets (absence ⇒ root), so `UploadResult` is never
7
+ * extended and the registry's freeze reconstructor can't strip a folder field.
8
+ * `AssetFolder.counts` is served from two reverse indexes — `childrenByParent`
9
+ * (parent → child folder ids) and `folderAssets` (folder → direct asset ids) —
10
+ * kept in lockstep with the authoritative maps via centralized mutation helpers,
11
+ * so projection, `listChildren`, and subtree walks are O(result size) instead of
12
+ * O(every record), and the counts still cannot drift from the side-index.
13
+ */
14
+ import type { AssetFolder, FolderId } from "../types/folders.js";
15
+ export interface CreateFolderStoreOptions {
16
+ /** Injectable clock for deterministic timestamps in tests. Defaults to `Date.now`. */
17
+ readonly now?: () => number;
18
+ }
19
+ export interface FolderStore {
20
+ /** Direct child folders of `parentId` (`null`/undefined ⇒ root's children). */
21
+ listChildren(parentId?: FolderId | null): readonly AssetFolder[];
22
+ /** All folders, flat. */
23
+ listAll(): readonly AssetFolder[];
24
+ get(id: FolderId): AssetFolder | undefined;
25
+ /** Root → … → `id` (inclusive). `[]` for root/undefined. */
26
+ path(id?: FolderId | null): readonly AssetFolder[];
27
+ createFolder(parentId: FolderId | null, name: string, maxDepth?: number): AssetFolder;
28
+ renameFolder(id: FolderId, name: string): AssetFolder;
29
+ moveFolder(id: FolderId, parentId: FolderId | null, maxDepth?: number): AssetFolder;
30
+ /**
31
+ * Remove a folder. Default policy reparents children (folders + assets) to
32
+ * the removed folder's parent; `{ cascade: true }` instead returns every
33
+ * descendant asset id for the caller to delete from the registry.
34
+ */
35
+ removeFolder(id: FolderId, opts?: {
36
+ readonly cascade?: boolean;
37
+ }): {
38
+ readonly removedAssetIds: readonly string[];
39
+ };
40
+ /** Owning folder of an asset (`null` ⇒ root). */
41
+ folderOf(assetId: string): FolderId | null;
42
+ moveAsset(assetId: string, folderId: FolderId | null): void;
43
+ /** Batch move — validates the target once (all-or-nothing) before applying. */
44
+ moveAssets(assetIds: readonly string[], folderId: FolderId | null): void;
45
+ /** Drop an asset's membership (call when the asset is deleted from the registry). */
46
+ removeAsset(assetId: string): void;
47
+ /** Folder id + every descendant folder id (for recursive listing). */
48
+ subtreeIds(id: FolderId): ReadonlySet<FolderId>;
49
+ /** Asset ids directly contained by `id` (membership only; no descendants). */
50
+ directAssetIds(id: FolderId): readonly string[];
51
+ subscribe(listener: () => void): () => void;
52
+ }
53
+ export declare function createFolderStore(options?: CreateFolderStoreOptions): FolderStore;
54
+ //# sourceMappingURL=folders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.d.ts","sourceRoot":"","sources":["../../src/utils/folders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAYjE,MAAM,WAAW,wBAAwB;IACxC,sFAAsF;IACtF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC3B,+EAA+E;IAC/E,YAAY,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,WAAW,EAAE,CAAC;IACjE,yBAAyB;IACzB,OAAO,IAAI,SAAS,WAAW,EAAE,CAAC;IAClC,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IAC3C,4DAA4D;IAC5D,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,WAAW,EAAE,CAAC;IAEnD,YAAY,CACX,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GACf,WAAW,CAAC;IACf,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IACtD,UAAU,CACT,EAAE,EAAE,QAAQ,EACZ,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,QAAQ,CAAC,EAAE,MAAM,GACf,WAAW,CAAC;IACf;;;;OAIG;IACH,YAAY,CACX,EAAE,EAAE,QAAQ,EACZ,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GACnC;QAAE,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IAEnD,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC3C,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5D,+EAA+E;IAC/E,UAAU,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;IACzE,qFAAqF;IACrF,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,sEAAsE;IACtE,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEhD,8EAA8E;IAC9E,cAAc,CAAC,EAAE,EAAE,QAAQ,GAAG,SAAS,MAAM,EAAE,CAAC;IAEhD,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC5C;AAED,wBAAgB,iBAAiB,CAChC,OAAO,GAAE,wBAA6B,GACpC,WAAW,CA4Wb"}