forked from spryker-shop/suite
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfinder.js
93 lines (77 loc) · 3.12 KB
/
finder.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
const path = require('path');
const glob = require('fast-glob');
// define the default glob settings for fast-glob
const defaultGlobSettings = {
followSymlinkedDirectories: false,
absolute: true,
onlyFiles: true,
onlyDirectories: false
};
// perform a search in a list of directories
// matching provided patterns
// using provided glob settings
const globAsync = async (patterns, rootConfiguration) => {
try {
return await glob(patterns, rootConfiguration);
} catch(error) {
console.error('An error occurred while globbing the system for entry points.', error);
}
};
const findFiles = (globDirs, globPatterns, globSettings) => (
globDirs.reduce(async (resultsPromise, dir) => {
const rootConfiguration = {
...defaultGlobSettings,
...globSettings,
cwd: dir
};
const results = await resultsPromise;
const globPath = await globAsync(globPatterns, rootConfiguration);
return results.concat(globPath);
}, Promise.resolve([]))
);
const find = async (globDirs, globPatterns, globFallbackPatterns, globSettings = {}) => {
const customThemeFiles = await findFiles(globDirs, globPatterns, globSettings);
const defaultThemeFiles = globFallbackPatterns.length ?
await findFiles(globDirs, globFallbackPatterns, globSettings) : [];
return defaultThemeFiles.concat(customThemeFiles);
};
// find entry points
const findEntryPoints = async settings => {
const files = await find(settings.dirs, settings.patterns, settings.fallbackPatterns, settings.globSettings);
return mergeEntryPoints(files);
};
// merge entry points
const mergeEntryPoints = async files => Object.values(files.reduce((map, file) => {
const dir = path.dirname(file);
const name = path.basename(dir);
const type = path.basename(path.dirname(dir));
map[`${type}/${name}`] = file;
return map;
}, {}));
// find components entry points
const findComponentEntryPoints = async settings => await findEntryPoints(settings);
// find style entry points
const findStyleEntryPoints = async settings => {
const coreFiles = await find(settings.core.dirs, settings.core.patterns, [], settings.globSettings);
const nonCoreFiles = await find(settings.nonCore.dirs, settings.nonCore.patterns, [], settings.globSettings);
const files = [...coreFiles, ...nonCoreFiles];
return mergeEntryPoints(files);
};
// find component styles
const findComponentStyles = async settings =>
await find(settings.dirs, settings.patterns, [], settings.globSettings);
// find application entry points
const findAppEntryPoint = async (settings, file) => {
const config = Object.assign({}, settings);
const updatePatterns = patternCollection => patternCollection.map(pattern => path.join(pattern, file));
config.patterns = updatePatterns(config.patterns);
config.fallbackPatterns = updatePatterns(config.fallbackPatterns);
const entryPoint = await findEntryPoints(config);
return entryPoint[0];
};
module.exports = {
findComponentEntryPoints,
findStyleEntryPoints,
findComponentStyles,
findAppEntryPoint,
};