diff --git a/__tests__/fixtures/directive/dep7.ts b/__tests__/fixtures/directive/dep7.ts
new file mode 100644
index 0000000..07260d0
--- /dev/null
+++ b/__tests__/fixtures/directive/dep7.ts
@@ -0,0 +1 @@
+///
diff --git a/__tests__/fixtures/directive/dir1/dep5.py b/__tests__/fixtures/directive/dir1/dep5.py
new file mode 100644
index 0000000..e69de29
diff --git a/__tests__/fixtures/directive/dir1/dir2/dep6.md b/__tests__/fixtures/directive/dir1/dir2/dep6.md
new file mode 100644
index 0000000..e69de29
diff --git a/__tests__/fixtures/directive/util.ts b/__tests__/fixtures/directive/util.ts
index ee3c0ca..7d154e8 100644
--- a/__tests__/fixtures/directive/util.ts
+++ b/__tests__/fixtures/directive/util.ts
@@ -6,3 +6,4 @@
*/
///
+///
diff --git a/__tests__/index.test.ts b/__tests__/index.test.ts
index d1b3e63..85955a4 100644
--- a/__tests__/index.test.ts
+++ b/__tests__/index.test.ts
@@ -460,6 +460,7 @@ describe('dependencyTree', () => {
]),
resolved: new Map([
[fixture(dir, 'dep1.ts'), new Set()],
+ [fixture(dir, 'dep7.ts'), new Set([fixture(dir, 'dep3.sh')])],
[
fixture(dir, 'index.ts'),
new Set([
@@ -468,7 +469,14 @@ describe('dependencyTree', () => {
fixture(dir, 'dep3.sh'),
]),
],
- [fixture(dir, 'util.ts'), new Set([fixture(dir, 'dep4.ejs')])],
+ [
+ fixture(dir, 'util.ts'),
+ new Set([
+ fixture(dir, 'dep4.ejs'),
+ fixture(dir, 'dir1/dep5.py'),
+ fixture(dir, 'dir1/dir2/dep6.md'),
+ ]),
+ ],
]),
});
});
diff --git a/docs/directive.md b/docs/directive.md
index e976c7c..1caa5da 100644
--- a/docs/directive.md
+++ b/docs/directive.md
@@ -43,7 +43,9 @@ The element can be closed at a new line:
Available attributes:
-- **`depends-on="..."`** - contains a relative path to a dependency file.
+- **`depends-on="..."`**
+ - contains a relative path to a dependency file.
+ - or a relative path with glob pattern.
Note that unavailable attributes will cause a validation error.
@@ -59,6 +61,14 @@ resolve(__dirname, './dep1.sh');
resolve(__dirname, './dep2.ts'); ///
```
+directive comment can detect glob patterns:
+
+```typescript
+///
+resolve(__dirname, './dir1/dep5.py');
+resolve(__dirname, './dir1/dir2/dep6.md');
+```
+
Element's definition can be split into multiple lines:
```typescript
@@ -81,5 +91,39 @@ The line below will be treated as a comment and not being parsed because of the
//
```
+#### Example
+
+```bash
+root_dir/
+ |- index.js
+ |- dep1.sh
+ |- util.ts
+ |- dir1/
+ |- dep5.py
+ |- dir2/
+ |- dep6.md
+```
+
+```typescript
+// root_dir/util.ts
+
+///
+///
+```
+
+```typescript
+// index.js
+const dependencyTree = new DependencyTree(['root_dir']);
+const result = await dependencyTree.gather();
+const dependencies = result.resolved;
+//{
+// "root_dir/util.ts" => Set {
+// "root_dir/dep1.sh",
+// "root_dir/dir1/dep5.py",
+// "root_dir/dir1/dir2/dep6.md",
+// },
+//}
+```
+
[xml]: https://www.w3schools.com/xml/
[typescript]: https://www.typescriptlang.org/docs/home.html
diff --git a/src/processors/directive.ts b/src/processors/directive.ts
index ee5ae58..56d1313 100644
--- a/src/processors/directive.ts
+++ b/src/processors/directive.ts
@@ -3,8 +3,10 @@
import * as camelcase from 'camelcase';
import escapeRegExp = require('lodash.escaperegexp');
import { OptionsV2, parseStringPromise as xml2js } from 'xml2js';
-import { DependencyTree, FileToDeps, Path } from '../';
+import { DependencyTree, FileToDeps, Path, ReferenceTransformFn } from '../';
import { FileProcessor } from '../file_processor';
+import * as path from 'path';
+import * as fg from 'fast-glob';
type Directive = {
dependsOn?: string;
@@ -19,6 +21,19 @@ type Options = {
fileTypes: string[];
};
+/**
+ * Gets a list of files if the reference is a glob pattern. Otherwise, returns the original reference.
+ */
+export const transformReference: ReferenceTransformFn = (
+ ref: string,
+ source: string,
+) => {
+ if (fg.isDynamicPattern(ref)) {
+ return fg.sync(ref, { cwd: path.dirname(source), absolute: true });
+ }
+ return ref;
+};
+
/**
* An abstract DirectiveProcessor class that implements language-agnostic generic logic of
* directives' parsing. For more info see: tools/dependency-tree/docs/directive.md.
@@ -165,7 +180,7 @@ abstract class DirectiveProcessor implements FileProcessor {
dependsOn &&
dependencyTree.resolveAndCollect(
file,
- dependencyTree.transformReference(dependsOn, file),
+ transformReference(dependsOn, file),
importedFiles,
missing,
);