-
-
Notifications
You must be signed in to change notification settings - Fork 197
/
Copy pathbuilder.ts
116 lines (96 loc) · 4.22 KB
/
builder.ts
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
///<reference path="../../.d.ts"/>
"use strict";
let broccoli = require('broccoli');
let path = require('path');
import Future = require("fibers/future");
import {TreeDiffer} from './tree-differ';
import destCopyLib = require('./node-modules-dest-copy');
var gulp = require("gulp");
var vinylFilterSince = require('vinyl-filter-since')
var through = require("through2");
export class Builder implements IBroccoliBuilder {
private nodeModules: any = {};
constructor(private $fs: IFileSystem,
private $nodeModulesTree: INodeModulesTree,
private $projectDataService: IProjectDataService,
private $injector: IInjector,
private $logger: ILogger) { }
public prepareNodeModules(absoluteOutputPath: string, projectDir: string, platform: string, lastModifiedTime?: Date): IFuture<void> {
return (() => {
let isNodeModulesModified = false;
let nodeModulesPath = path.join(projectDir, "node_modules");
if(lastModifiedTime) {
let pipeline = gulp.src(path.join(projectDir, "node_modules/**"))
.pipe(vinylFilterSince(lastModifiedTime))
.pipe(through.obj( (chunk: any, enc: any, cb: Function) => {
if(chunk.path === nodeModulesPath) {
isNodeModulesModified = true;
}
if(!isNodeModulesModified) {
let rootModuleName = chunk.path.split(nodeModulesPath)[1].split(path.sep)[1];
let rootModuleFullPath = path.join(nodeModulesPath, rootModuleName);
this.nodeModules[rootModuleFullPath] = rootModuleFullPath;
}
cb(null);
}))
.pipe(gulp.dest(absoluteOutputPath));
let future = new Future<void>();
pipeline.on('end', (err: any, data: any) => {
if(err) {
future.throw(err);
} else {
future.return();
}
});
future.wait();
}
if(isNodeModulesModified && this.$fs.exists(absoluteOutputPath).wait()) {
let currentPreparedTnsModules = this.$fs.readDirectory(absoluteOutputPath).wait();
let tnsModulesInApp = this.$fs.readDirectory(path.join(projectDir, "app", "tns_modules")).wait();
let modulesToDelete = _.difference(currentPreparedTnsModules, tnsModulesInApp);
_.each(modulesToDelete, moduleName => this.$fs.deleteDirectory(path.join(absoluteOutputPath, moduleName)).wait())
}
if(!lastModifiedTime || isNodeModulesModified) {
let nodeModulesDirectories = this.$fs.exists(nodeModulesPath).wait() ? this.$fs.readDirectory(nodeModulesPath).wait() : [];
_.each(nodeModulesDirectories, nodeModuleDirectoryName => {
let nodeModuleFullPath = path.join(nodeModulesPath, nodeModuleDirectoryName);
this.nodeModules[nodeModuleFullPath] = nodeModuleFullPath;
});
}
let destCopy = this.$injector.resolve(destCopyLib.DestCopy, {
inputPath: projectDir,
cachePath: "",
outputRoot: absoluteOutputPath,
projectDir: projectDir,
platform: platform
});
destCopy.rebuildChangedDirectories(_.keys(this.nodeModules));
}).future<void>()();
}
private rebuildNodeModulesTree(outputPath: string, projectDir: string): IFuture<any> {
let nodeModulesBuilder = this.makeNodeModulesBuilder(outputPath, projectDir);
return this.rebuild(nodeModulesBuilder);
}
private makeNodeModulesBuilder(outputPath: string, projectDir: string): BroccoliBuilder {
let tree = this.$nodeModulesTree.makeNodeModulesTree(outputPath, projectDir);
return new broccoli.Builder(tree);
}
private rebuild(builder: any): IFuture<any> {
let future = new Future<any>();
builder.build()
.then((result: any) => {
future.return(result);
})
.catch((err: any) => {
if(err.file) {
this.$logger.error("File: " + err.file);
}
if(err.stack) {
this.$logger.error(err.stack);
}
future.throw(err);
});
return future;
}
}
$injector.register("broccoliBuilder", Builder);