UNPKG

3.12 kBJavaScriptView Raw
1// TODO(vojta): cache resolved
2var initClosureDependencyResolver = function(emitter, fileList, resolver, iit, files) {
3
4 // load var CLOSURE_NO_DEPS = true to disable this closure bullshit
5 files.unshift({
6 pattern: __dirname + '/no_deps_bullshit.js',
7 included: true,
8 served: true,
9 watched: false
10 });
11
12 // whenever file list changes, resolve the deps - update files.included
13 emitter.on('file_list_modified', function(promise) {
14 promise.then(function(files) {
15 var includedPaths = files.included.map(function(file) {
16 return file.originalPath;
17 });
18
19 if (iit.isInclusive()) {
20 includedPaths = includedPaths.filter(iit.filter);
21 }
22
23 var resolvedPaths = resolver.resolveFiles(includedPaths);
24 var servedFiles = files.served;
25
26 // TODO(vojta): change files.served to be a map, rather than an array
27 files.included = resolvedPaths.map(function(filepath) {
28 for (var i = 0, length = servedFiles.length; i < length; i++) {
29 if (servedFiles[i].originalPath === filepath) {
30 return servedFiles[i];
31 }
32 }
33
34 console.error('NOT SERVED FILE', filepath);
35 var externalFile = {
36 path: filepath,
37 originalPath: filepath,
38 contentPath: filepath,
39 isUrl: false,
40 // TODO(vojta): cache mtime and restat when deps.js changes ?
41 // TODO(votja): use the last synced CL number in google3 ?
42 mtime: new Date()
43 };
44
45 files.served.push(externalFile);
46 return externalFile;
47 });
48 });
49 });
50
51 // monkey-patch fileList to get notified when file is removed
52 var originalRemoveFile = fileList.removeFile;
53 fileList.removeFile = function(filepath, done) {
54 resolver.removeFile(filepath);
55 iit.removeFile(filepath);
56
57 return originalRemoveFile.call(fileList, filepath, done);
58 };
59
60 return resolver;
61};
62
63initClosureDependencyResolver.$inject = ['emitter', 'fileList', 'x:resolver', 'x:iit-filter',
64 'config.files'];
65
66
67var createPreprocesor = function(resolver) {
68 return function(content, file, done) {
69 resolver.updateFile(file.originalPath, content);
70 done(content);
71 };
72};
73
74createPreprocesor.$inject = ['x:resolver'];
75
76
77var createDepsPreprocesor = function(resolver) {
78 return function(content, file, done) {
79 resolver.loadExternalDeps(file.originalPath, content);
80 done(content);
81 };
82};
83
84createDepsPreprocesor.$inject = ['x:resolver'];
85
86
87var createIitPreprocesor = function(iit) {
88 return function(content, file, done) {
89 iit.updateFile(file.originalPath, content);
90 done(content);
91 };
92};
93
94createIitPreprocesor.$inject = ['x:iit-filter'];
95
96// PUBLISH DI MODULE
97module.exports = {
98 'framework:closure': ['factory', initClosureDependencyResolver],
99 'preprocessor:closure': ['factory', createPreprocesor],
100 'preprocessor:closure-deps': ['factory', createDepsPreprocesor],
101 'preprocessor:closure-iit': ['factory', createIitPreprocesor],
102
103 // TODO(vojta): these should be internal
104 'x:resolver': ['type', require('./resolver')],
105 'x:iit-filter': ['type', require('./iit')]
106};