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, );