67 lines
1.4 KiB
TypeScript

import type { DataSourceSchema, Id, MNode } from '@tmagic/core';
import {
DSL_NODE_KEY_COPY_PREFIX,
isDataSourceCondTarget,
isDataSourceTarget,
Target,
traverseNode,
Watcher,
} from '@tmagic/core';
const cache = new Map();
export const getDeps = (ds: DataSourceSchema, nodes: MNode[], inEditor: boolean) => {
let cacheKey: string;
if (inEditor) {
const ids: Id[] = [];
nodes.forEach((node) => {
traverseNode(node, (node) => {
ids.push(node.id);
});
});
cacheKey = `${ds.id}:${ids.join(':')}`;
} else {
cacheKey = `${ds.id}:${nodes.map((node) => node.id).join(':')}`;
}
if (cache.has(cacheKey)) {
return cache.get(cacheKey);
}
const watcher = new Watcher();
watcher.addTarget(
new Target({
id: ds.id,
type: 'data-source',
isTarget: (key: string | number, value: any) => {
if (`${key}`.includes(DSL_NODE_KEY_COPY_PREFIX)) {
return false;
}
return isDataSourceTarget(ds, key, value, true);
},
}),
);
watcher.addTarget(
new Target({
id: ds.id,
type: 'cond',
isTarget: (key, value) => isDataSourceCondTarget(ds, key, value, true),
}),
);
watcher.collect(nodes, {}, true);
const { deps } = watcher.getTarget(ds.id, 'data-source');
const { deps: condDeps } = watcher.getTarget(ds.id, 'cond');
const result = { deps, condDeps };
cache.set(cacheKey, result);
return result;
};