@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.
- package/README.md +28 -20
- package/dist/adapters/data-url.d.cts +13 -0
- package/dist/adapters/data-url.d.cts.map +1 -1
- package/dist/adapters/data-url.d.ts +13 -0
- package/dist/adapters/data-url.d.ts.map +1 -1
- package/dist/adapters/in-memory.d.cts +8 -1
- package/dist/adapters/in-memory.d.cts.map +1 -1
- package/dist/adapters/in-memory.d.ts +8 -1
- package/dist/adapters/in-memory.d.ts.map +1 -1
- package/dist/i18n/entry.cjs +75 -0
- package/dist/i18n/entry.d.cts +15 -0
- package/dist/i18n/entry.d.cts.map +1 -0
- package/dist/i18n/entry.d.ts +15 -0
- package/dist/i18n/entry.d.ts.map +1 -0
- package/dist/i18n/entry.js +29 -0
- package/dist/i18n/provider.cjs +49 -0
- package/dist/i18n/provider.d.cts +20 -0
- package/dist/i18n/provider.d.cts.map +1 -0
- package/dist/i18n/provider.d.ts +20 -0
- package/dist/i18n/provider.d.ts.map +1 -0
- package/dist/i18n/provider.js +11 -0
- package/dist/index.cjs +7 -0
- package/dist/index.d.cts +11 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/plugin.cjs +70 -5
- package/dist/plugin.d.cts +3 -2
- package/dist/plugin.d.cts.map +1 -1
- package/dist/plugin.d.ts +3 -2
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +70 -5
- package/dist/sources/composite-source.cjs +138 -0
- package/dist/sources/composite-source.d.cts +39 -0
- package/dist/sources/composite-source.d.cts.map +1 -0
- package/dist/sources/composite-source.d.ts +39 -0
- package/dist/sources/composite-source.d.ts.map +1 -0
- package/dist/sources/composite-source.js +100 -0
- package/dist/sources/federated-search.cjs +173 -0
- package/dist/sources/federated-search.d.cts +33 -0
- package/dist/sources/federated-search.d.cts.map +1 -0
- package/dist/sources/federated-search.d.ts +33 -0
- package/dist/sources/federated-search.d.ts.map +1 -0
- package/dist/sources/federated-search.js +123 -0
- package/dist/sources/provider.cjs +18 -0
- package/dist/sources/provider.d.cts +51 -0
- package/dist/sources/provider.d.cts.map +1 -0
- package/dist/sources/provider.d.ts +51 -0
- package/dist/sources/provider.d.ts.map +1 -0
- package/dist/sources/provider.js +1 -0
- package/dist/sources/unsplash/client.cjs +189 -0
- package/dist/sources/unsplash/client.d.cts +87 -0
- package/dist/sources/unsplash/client.d.cts.map +1 -0
- package/dist/sources/unsplash/client.d.ts +87 -0
- package/dist/sources/unsplash/client.d.ts.map +1 -0
- package/dist/sources/unsplash/client.js +151 -0
- package/dist/sources/unsplash/index.cjs +194 -0
- package/dist/sources/unsplash/index.d.cts +16 -0
- package/dist/sources/unsplash/index.d.cts.map +1 -0
- package/dist/sources/unsplash/index.d.ts +16 -0
- package/dist/sources/unsplash/index.d.ts.map +1 -0
- package/dist/sources/unsplash/index.js +150 -0
- package/dist/sources/unsplash/themes.cjs +141 -0
- package/dist/sources/unsplash/themes.d.cts +18 -0
- package/dist/sources/unsplash/themes.d.cts.map +1 -0
- package/dist/sources/unsplash/themes.d.ts +18 -0
- package/dist/sources/unsplash/themes.d.ts.map +1 -0
- package/dist/sources/unsplash/themes.js +93 -0
- package/dist/sources/unsplash/throttle-cache.cjs +86 -0
- package/dist/sources/unsplash/throttle-cache.d.cts +25 -0
- package/dist/sources/unsplash/throttle-cache.d.cts.map +1 -0
- package/dist/sources/unsplash/throttle-cache.d.ts +25 -0
- package/dist/sources/unsplash/throttle-cache.d.ts.map +1 -0
- package/dist/sources/unsplash/throttle-cache.js +45 -0
- package/dist/types/categories.cjs +18 -0
- package/dist/types/categories.d.cts +48 -0
- package/dist/types/categories.d.cts.map +1 -0
- package/dist/types/categories.d.ts +48 -0
- package/dist/types/categories.d.ts.map +1 -0
- package/dist/types/categories.js +1 -0
- package/dist/types/data-source.cjs +18 -0
- package/dist/types/data-source.d.cts +59 -0
- package/dist/types/data-source.d.cts.map +1 -0
- package/dist/types/data-source.d.ts +59 -0
- package/dist/types/data-source.d.ts.map +1 -0
- package/dist/types/data-source.js +1 -0
- package/dist/types/filter.cjs +18 -0
- package/dist/types/filter.d.cts +55 -0
- package/dist/types/filter.d.cts.map +1 -0
- package/dist/types/filter.d.ts +55 -0
- package/dist/types/filter.d.ts.map +1 -0
- package/dist/types/filter.js +1 -0
- package/dist/types/folders.cjs +42 -0
- package/dist/types/folders.d.cts +46 -0
- package/dist/types/folders.d.cts.map +1 -0
- package/dist/types/folders.d.ts +46 -0
- package/dist/types/folders.d.ts.map +1 -0
- package/dist/types/folders.js +4 -0
- package/dist/types/options.cjs +18 -0
- package/dist/types/options.d.cts +68 -0
- package/dist/types/options.d.cts.map +1 -0
- package/dist/types/options.d.ts +68 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +1 -0
- package/dist/types/types.d.cts +21 -27
- package/dist/types/types.d.cts.map +1 -1
- package/dist/types/types.d.ts +21 -27
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/unsplash.cjs +18 -0
- package/dist/types/unsplash.d.cts +60 -0
- package/dist/types/unsplash.d.cts.map +1 -0
- package/dist/types/unsplash.d.ts +60 -0
- package/dist/types/unsplash.d.ts.map +1 -0
- package/dist/types/unsplash.js +1 -0
- package/dist/ui/AssetBrowser.cjs +183 -121
- package/dist/ui/AssetBrowser.d.cts +12 -1
- package/dist/ui/AssetBrowser.d.cts.map +1 -1
- package/dist/ui/AssetBrowser.d.ts +12 -1
- package/dist/ui/AssetBrowser.d.ts.map +1 -1
- package/dist/ui/AssetBrowser.js +183 -121
- package/dist/ui/AssetCommandPalette.cjs +20 -18
- package/dist/ui/AssetCommandPalette.d.cts.map +1 -1
- package/dist/ui/AssetCommandPalette.d.ts.map +1 -1
- package/dist/ui/AssetCommandPalette.js +20 -18
- package/dist/ui/AssetManagerUI.cjs +31 -17
- package/dist/ui/AssetManagerUI.d.cts +19 -3
- package/dist/ui/AssetManagerUI.d.cts.map +1 -1
- package/dist/ui/AssetManagerUI.d.ts +19 -3
- package/dist/ui/AssetManagerUI.d.ts.map +1 -1
- package/dist/ui/AssetManagerUI.js +31 -17
- package/dist/ui/DeleteAssetDialog.cjs +5 -3
- package/dist/ui/DeleteAssetDialog.d.cts.map +1 -1
- package/dist/ui/DeleteAssetDialog.d.ts.map +1 -1
- package/dist/ui/DeleteAssetDialog.js +5 -3
- package/dist/ui/DeleteFolderDialog.cjs +80 -0
- package/dist/ui/DeleteFolderDialog.d.cts +11 -0
- package/dist/ui/DeleteFolderDialog.d.cts.map +1 -0
- package/dist/ui/DeleteFolderDialog.d.ts +11 -0
- package/dist/ui/DeleteFolderDialog.d.ts.map +1 -0
- package/dist/ui/DeleteFolderDialog.js +42 -0
- package/dist/ui/EmptyFolderState.cjs +56 -0
- package/dist/ui/EmptyFolderState.d.cts +6 -0
- package/dist/ui/EmptyFolderState.d.cts.map +1 -0
- package/dist/ui/EmptyFolderState.d.ts +6 -0
- package/dist/ui/EmptyFolderState.d.ts.map +1 -0
- package/dist/ui/EmptyFolderState.js +18 -0
- package/dist/ui/FolderBreadcrumb.cjs +76 -0
- package/dist/ui/FolderBreadcrumb.d.cts +9 -0
- package/dist/ui/FolderBreadcrumb.d.cts.map +1 -0
- package/dist/ui/FolderBreadcrumb.d.ts +9 -0
- package/dist/ui/FolderBreadcrumb.d.ts.map +1 -0
- package/dist/ui/FolderBreadcrumb.js +38 -0
- package/dist/ui/FolderNameDialog.cjs +105 -0
- package/dist/ui/FolderNameDialog.d.cts +14 -0
- package/dist/ui/FolderNameDialog.d.cts.map +1 -0
- package/dist/ui/FolderNameDialog.d.ts +14 -0
- package/dist/ui/FolderNameDialog.d.ts.map +1 -0
- package/dist/ui/FolderNameDialog.js +67 -0
- package/dist/ui/FolderTree.cjs +85 -0
- package/dist/ui/FolderTree.d.cts +13 -0
- package/dist/ui/FolderTree.d.cts.map +1 -0
- package/dist/ui/FolderTree.d.ts +13 -0
- package/dist/ui/FolderTree.d.ts.map +1 -0
- package/dist/ui/FolderTree.js +44 -0
- package/dist/ui/MetadataPanel.cjs +23 -17
- package/dist/ui/MetadataPanel.d.cts.map +1 -1
- package/dist/ui/MetadataPanel.d.ts.map +1 -1
- package/dist/ui/MetadataPanel.js +23 -17
- package/dist/ui/MoveTargetPicker.cjs +87 -0
- package/dist/ui/MoveTargetPicker.d.cts +16 -0
- package/dist/ui/MoveTargetPicker.d.cts.map +1 -0
- package/dist/ui/MoveTargetPicker.d.ts +16 -0
- package/dist/ui/MoveTargetPicker.d.ts.map +1 -0
- package/dist/ui/MoveTargetPicker.js +49 -0
- package/dist/ui/ReplaceAssetDialog.cjs +19 -17
- package/dist/ui/ReplaceAssetDialog.d.cts +2 -1
- package/dist/ui/ReplaceAssetDialog.d.cts.map +1 -1
- package/dist/ui/ReplaceAssetDialog.d.ts +2 -1
- package/dist/ui/ReplaceAssetDialog.d.ts.map +1 -1
- package/dist/ui/ReplaceAssetDialog.js +19 -17
- package/dist/ui/UnsplashPanel.cjs +137 -0
- package/dist/ui/UnsplashPanel.d.cts +28 -0
- package/dist/ui/UnsplashPanel.d.cts.map +1 -0
- package/dist/ui/UnsplashPanel.d.ts +28 -0
- package/dist/ui/UnsplashPanel.d.ts.map +1 -0
- package/dist/ui/UnsplashPanel.js +99 -0
- package/dist/ui/UploadButton.cjs +12 -13
- package/dist/ui/UploadButton.d.cts +9 -2
- package/dist/ui/UploadButton.d.cts.map +1 -1
- package/dist/ui/UploadButton.d.ts +9 -2
- package/dist/ui/UploadButton.d.ts.map +1 -1
- package/dist/ui/UploadButton.js +12 -13
- package/dist/ui/index.cjs +41 -0
- package/dist/ui/index.d.cts +15 -0
- package/dist/ui/index.d.cts.map +1 -1
- package/dist/ui/index.d.ts +15 -0
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +8 -0
- package/dist/utils/data-source.cjs +190 -0
- package/dist/utils/data-source.d.cts +63 -0
- package/dist/utils/data-source.d.cts.map +1 -0
- package/dist/utils/data-source.d.ts +63 -0
- package/dist/utils/data-source.d.ts.map +1 -0
- package/dist/utils/data-source.js +149 -0
- package/dist/utils/errors.cjs +18 -0
- package/dist/utils/errors.d.cts +27 -0
- package/dist/utils/errors.d.cts.map +1 -1
- package/dist/utils/errors.d.ts +27 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +16 -1
- package/dist/utils/folders.cjs +335 -0
- package/dist/utils/folders.d.cts +54 -0
- package/dist/utils/folders.d.cts.map +1 -0
- package/dist/utils/folders.d.ts +54 -0
- package/dist/utils/folders.d.ts.map +1 -0
- package/dist/utils/folders.js +297 -0
- package/dist/utils/header-action.cjs +1 -1
- package/dist/utils/header-action.d.cts.map +1 -1
- package/dist/utils/header-action.d.ts.map +1 -1
- package/dist/utils/header-action.js +1 -1
- package/dist/utils/registry.cjs +38 -12
- package/dist/utils/registry.d.cts +29 -1
- package/dist/utils/registry.d.cts.map +1 -1
- package/dist/utils/registry.d.ts +29 -1
- package/dist/utils/registry.d.ts.map +1 -1
- package/dist/utils/registry.js +31 -11
- package/dist/utils/resolver.cjs +5 -4
- package/dist/utils/resolver.d.cts.map +1 -1
- package/dist/utils/resolver.d.ts.map +1 -1
- package/dist/utils/resolver.js +5 -4
- package/dist/utils/studio-asset-source.cjs +13 -4
- package/dist/utils/studio-asset-source.d.cts +6 -1
- package/dist/utils/studio-asset-source.d.cts.map +1 -1
- package/dist/utils/studio-asset-source.d.ts +6 -1
- package/dist/utils/studio-asset-source.d.ts.map +1 -1
- package/dist/utils/studio-asset-source.js +9 -3
- package/dist/utils/validate-upload-result.d.cts +2 -1
- package/dist/utils/validate-upload-result.d.cts.map +1 -1
- package/dist/utils/validate-upload-result.d.ts +2 -1
- package/dist/utils/validate-upload-result.d.ts.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.d.cts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/i18n/messages/en.json +99 -0
- package/i18n/messages/ja.json +99 -0
- package/i18n/messages/ko.json +99 -0
- package/i18n/messages/zh.json +99 -0
- package/meta/config.json +1 -1
- 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
|
-
|
|
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,
|
|
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,
|
|
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"}
|
package/dist/utils/registry.cjs
CHANGED
|
@@ -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
|
|
159
|
+
function prepareAssetMatcher(options) {
|
|
153
160
|
const query = options.query?.trim().toLowerCase() ?? "";
|
|
154
|
-
const
|
|
155
|
-
const tagFilter = options.tags
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
if (
|
|
159
|
-
|
|
160
|
-
|
|
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,
|
|
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"}
|
package/dist/utils/registry.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/utils/registry.js
CHANGED
|
@@ -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
|
|
125
|
+
function prepareAssetMatcher(options) {
|
|
121
126
|
const query = options.query?.trim().toLowerCase() ?? "";
|
|
122
|
-
const
|
|
123
|
-
const tagFilter = options.tags
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if (
|
|
127
|
-
|
|
128
|
-
|
|
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 };
|
package/dist/utils/resolver.cjs
CHANGED
|
@@ -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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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,
|
|
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,
|
|
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"}
|
package/dist/utils/resolver.js
CHANGED
|
@@ -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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
|
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
|
|
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
|