From 7420f8225199d89f010d9f968c528a8995db62f3 Mon Sep 17 00:00:00 2001 From: Bronley Plumb Date: Mon, 23 May 2022 15:40:13 -0400 Subject: [PATCH] Allow multiple keys for getAllDependencies --- src/DependencyGraph.spec.ts | 8 ++++++++ src/DependencyGraph.ts | 17 ++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/DependencyGraph.spec.ts b/src/DependencyGraph.spec.ts index 1ff4e682a..7d8f4bf9d 100644 --- a/src/DependencyGraph.spec.ts +++ b/src/DependencyGraph.spec.ts @@ -162,6 +162,14 @@ describe('DependencyGraph', () => { 'e' ]); }); + + it('works with multiple keys', () => { + graph.addOrReplace('a', ['b', 'c']); + graph.addOrReplace('b', ['c', 'd']); + expect(graph.getAllDependencies(['a', 'b']).sort()).to.eql([ + 'b', 'c', 'd' + ]); + }); }); describe('onchange', () => { diff --git a/src/DependencyGraph.ts b/src/DependencyGraph.ts index 73db46592..8c74223ac 100644 --- a/src/DependencyGraph.ts +++ b/src/DependencyGraph.ts @@ -59,11 +59,22 @@ export class DependencyGraph { /** * Get a list of the dependencies for the given key, recursively. - * @param key the key for which to get the dependencies + * @param key the key (or keys) for which to get the dependencies * @param exclude a list of keys to exclude from traversal. Anytime one of these nodes is encountered, it is skipped. */ - public getAllDependencies(key: string, exclude?: string[]) { - return this.nodes[key]?.getAllDependencies(exclude) ?? []; + public getAllDependencies(keys: string | string[], exclude?: string[]) { + if (typeof keys === 'string') { + return this.nodes[keys]?.getAllDependencies(exclude) ?? []; + } else { + const set = new Set(); + for (const key of keys) { + const dependencies = this.getAllDependencies(key, exclude); + for (const dependency of dependencies) { + set.add(dependency); + } + } + return [...set]; + } } /**