forked from angular/angular-cli
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdynamic-path-parser.js
63 lines (50 loc) · 1.88 KB
/
dynamic-path-parser.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
var path = require('path');
var process = require('process');
var fs = require('fs');
module.exports = function dynamicPathParser(project, entityName) {
var projectRoot = project.root;
var sourceDir = project.ngConfig.apps[0].root;
var appRoot = path.join(sourceDir, 'app');
var cwd = process.env.PWD;
var rootPath = path.join(projectRoot, appRoot);
var outputPath = path.join(rootPath, entityName);
if (entityName.indexOf(path.sep) === 0) {
outputPath = path.join(rootPath, entityName.substr(1));
} else if (cwd.indexOf(rootPath) >= 0) {
outputPath = path.join(cwd, entityName);
}
if (!fs.existsSync(outputPath)) {
// Verify the path exists on disk.
var parsedOutputPath = path.parse(outputPath);
var parts = parsedOutputPath.dir.split(path.sep).slice(1);
var newPath = parts.reduce((tempPath, part) => {
// if (tempPath === '') {
// return part;
// }
var withoutPlus = path.join(tempPath, path.sep, part);
var withPlus = path.join(tempPath, path.sep, '+' + part);
if (fs.existsSync(withoutPlus)) {
return withoutPlus;
} else if (fs.existsSync(withPlus)) {
return withPlus;
}
// Folder not found, create it, and return it
fs.mkdirSync(withoutPlus);
return withoutPlus;
}, parsedOutputPath.root);
outputPath = path.join(newPath, parsedOutputPath.name);
}
if (outputPath.indexOf(rootPath) < 0) {
throw `Invalid path: "${entityName}" cannot be ` +
`above the "${appRoot}" directory`;
}
var adjustedPath = outputPath.replace(projectRoot, '');
var parsedPath = path.parse(adjustedPath);
if (parsedPath.dir.indexOf(path.sep) === 0) {
parsedPath.dir = parsedPath.dir.substr(1);
}
parsedPath.dir = parsedPath.dir === path.sep ? '' : parsedPath.dir;
parsedPath.appRoot = appRoot;
parsedPath.sourceDir = sourceDir;
return parsedPath;
};