Skip to content

Commit 05184e6

Browse files
authored
Merge pull request #91 from webdoc-labs/fix/include-exclude-conform
Match JSDoc in terms of config include/exclude/includePattern/excludePattern
2 parents d106247 + 61ff83b commit 05184e6

File tree

4 files changed

+72
-40
lines changed

4 files changed

+72
-40
lines changed

example/webdoc.conf.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"source": {
3-
"includePattern": "./src/**/*"
3+
"include": "./src/**/*"
44
},
55
"plugins": [
66
"plugins/markdown"

packages/webdoc-cli/src/config.js

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ type ConfigSchema = {
99
sort?: string
1010
},
1111
source?: {
12+
// Declared in order of priority
13+
include?: string | Array<string>,
1214
includePattern?: string | Array<string>,
13-
include?: string | Array<string>
15+
excludePattern?: string | Array<string>,
16+
exclude?: string | Array<string>,
1417
},
1518
conf?: {
1619
tags?: {
@@ -52,7 +55,6 @@ const defaultConfig: ConfigSchema = {
5255
sort: "type, scope, access, name", // @webdoc/parser{mod:sort}
5356
},
5457
source: {
55-
includePattern: "./**/*.js", // @webdoc/cli{main}
5658
},
5759
conf: {
5860
tags: {
@@ -103,30 +105,6 @@ export function loadConfig(file: string): ConfigSchema {
103105
return config;
104106
}
105107

106-
export function getIncludePattern(config: ConfigSchema): string[] {
107-
const source = config.source;
108-
109-
if (typeof source !== "undefined") {
110-
if (typeof source.includePattern !== "undefined") {
111-
if (Array.isArray(source.includePattern)) {
112-
return source.includePattern;
113-
} else if (typeof source.includePattern === "string") {
114-
return [source.includePattern];
115-
}
116-
}
117-
118-
if (typeof source.include !== "undefined") {
119-
if (Array.isArray(source.include)) {
120-
return source.include;
121-
} else if (typeof source.include === "string") {
122-
return [source.include];
123-
}
124-
}
125-
}
126-
127-
return [];
128-
}
129-
130108
export function getTemplate(config: ConfigSchema): string {
131109
if (config.opts && config.opts.template) {
132110
return config.opts.template;

packages/webdoc-cli/src/index.js

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ async function main(argv: yargs.Argv) {
5959
global.Webdoc = global.Webdoc || {};
6060
registerWebdocParser();// global.Webdoc.Parser
6161

62-
const {loadConfig, getIncludePattern, getTemplate} = require("./config");
62+
const {loadConfig, getTemplate} = require("./config");
6363
const config = loadConfig(argv.config);
6464
const tutorials = loadTutorials(argv.tutorials);
6565

@@ -79,13 +79,6 @@ async function main(argv: yargs.Argv) {
7979
global.Webdoc.env.conf = config;
8080
global.Webdoc.userConfig = config;
8181

82-
// TODO: excludePattern
83-
const includePattern = getIncludePattern(config);
84-
85-
if (!includePattern) {
86-
console.log("No source.include or source.includePattern found in config file");
87-
}
88-
8982
if (config.plugins) {
9083
for (const pluginPath of config.plugins) {
9184
if (pluginPath === "plugins/markdown") {

packages/webdoc-cli/src/sources/index.js

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,76 @@ import type {RootDoc, SourceFile} from "@webdoc/types";
22
import globby from "globby";
33
import {packages} from "./packages";
44

5+
// Create a filtering callback that returns whether a path passes all
6+
// patterns (if exclude = false) or if it fails all of them (if exclude = true).
7+
function makePatternFilter(
8+
patterns: string | string[],
9+
exclude: boolean = false,
10+
): (path: string) => boolean {
11+
const normalizedFormat = Array.isArray(patterns) ?
12+
patterns :
13+
((patterns && [patterns]) || []);
14+
15+
if (normalizedFormat.length === 0) {
16+
// If no patterns to match, then short circuit evaluation.
17+
return () => true;
18+
}
19+
20+
const regExps = normalizedFormat.map(
21+
(pattern) => {
22+
try {
23+
return new RegExp(pattern, "g");
24+
} catch (e) {
25+
console.error("Invalid pattern: " + pattern +
26+
"\nPlease make sure the patterns in sources.includePattern or source.excludePattern " +
27+
"defined in your configuration file are valid\n",
28+
);
29+
}
30+
},
31+
);
32+
33+
return function(path: string): boolean {
34+
for (const regExp of regExps) {
35+
if (path.match(regExp)) {
36+
// If include pattern matched, return true.
37+
// If exclude pattern matched, return false.
38+
return !exclude;
39+
}
40+
}
41+
42+
// If all include patterns failed, return false.
43+
// If all exclude patterns passed, return true.
44+
return exclude;
45+
};
46+
}
47+
548
export function sources(config: Object, documentTree: RootDoc): SourceFile[] {
6-
const includePattern = config.source.includePattern || config.source.include;
49+
const {
50+
include,
51+
includePattern,
52+
exclude,
53+
excludePattern,
54+
} = config.source;
755

8-
if (!includePattern) {
9-
console.log("No source.include or source.includePattern found in config file");
56+
if (!include) {
57+
console.error("No input files specified. You must " +
58+
"define source.include in your configuration file.");
59+
60+
return [];
1061
}
1162

12-
const paths = globby.sync(includePattern);
13-
const sources: SourceFile[] = paths.map((file) => ({path: file}));
63+
const paths = globby.sync(include);
64+
const excludePaths = Array.isArray(exclude) ?
65+
exclude :
66+
((exclude && [exclude]) || []);
67+
68+
const sources: SourceFile[] = paths
69+
.filter(makePatternFilter(includePattern, false))
70+
.filter(makePatternFilter(excludePattern, true))
71+
.filter((path) => !(excludePaths.some(
72+
(excludedPath) => path === excludePaths,
73+
)))
74+
.map((path) => ({path}));
1475

1576
documentTree.packages = packages(sources);
1677

0 commit comments

Comments
 (0)