[Service] Integrate DeviceHome and SignalingServer
[platform/framework/web/wrtjs.git] / device_home / node_modules / jake / lib / loader.js
1 /*
2  * Jake JavaScript build tool
3  * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *         http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17 */
18
19 let path = require('path');
20 let fs = require('fs');
21 let existsSync = fs.existsSync;
22 let utils = require('./utils');
23
24 // Files like jakelib/foobar.jake.js
25 const JAKELIB_FILE_PAT = /\.jake$|\.js$/;
26 const SUPPORTED_EXTENSIONS = {
27   'js': null,
28   'coffee': function () {
29     try {
30       let cs = require('coffeescript');
31       if (typeof cs.register == 'function') {
32         cs.register();
33       }
34     }
35     catch(e) {
36       throw new Error('You have a CoffeeScript Jakefile, but have not installed CoffeeScript');
37     }
38   },
39   'ls': function () {
40     try {
41       require('livescript');
42     }
43     catch (e) {
44       throw new Error('You have a LiveScript Jakefile, but have not installed LiveScript');
45     }
46   }
47 };
48 const IMPLICIT_JAKEFILE_NAMES = [
49   'Jakefile',
50   'Gulpfile'
51 ];
52
53 let Loader = function () {
54   // Load a Jakefile, running the code inside -- this may result in
55   // tasks getting defined using the original Jake API, e.g.,
56   // `task('foo' ['bar', 'baz']);`, or can also auto-create tasks
57   // from any functions exported from the file
58   function loadFile(filePath) {
59     let exported = require(filePath);
60     for (let [key, value] of Object.entries(exported)) {
61       let t;
62       if (typeof value == 'function') {
63         t = jake.task(key, value);
64         t.description = '(Exported function)';
65       }
66     }
67   }
68
69   function fileExists(name) {
70     let nameWithExt = null;
71     // Support no file extension as well
72     let exts = Object.keys(SUPPORTED_EXTENSIONS).concat(['']);
73     exts.some((ext) => {
74       let fname = ext ? `${name}.${ext}` : name;
75       if (existsSync(fname)) {
76         nameWithExt = fname;
77         return true;
78       }
79     });
80     return nameWithExt;
81   }
82
83   // Recursive
84   function findImplicitJakefile() {
85     let cwd = process.cwd();
86     let names = IMPLICIT_JAKEFILE_NAMES;
87     let found = null;
88     names.some((name) => {
89       let n;
90       // Prefer all-lowercase
91       n = name.toLowerCase();
92       if ((found = fileExists(n))) {
93         return found;
94       }
95       // Check mixed-case as well
96       n = name;
97       if ((found = fileExists(n))) {
98         return found;
99       }
100     });
101     if (found) {
102       return found;
103     }
104     else {
105       process.chdir("..");
106       // If we've walked all the way up the directory tree,
107       // bail out with no result
108       if (cwd === process.cwd()) {
109         return null;
110       }
111       return findImplicitJakefile();
112     }
113   }
114
115   this.loadFile = function (fileSpecified) {
116     let jakefile;
117     let origCwd = process.cwd();
118
119     if (fileSpecified) {
120       if (existsSync(fileSpecified)) {
121         jakefile = fileSpecified;
122       }
123     }
124     else {
125       jakefile = findImplicitJakefile();
126     }
127
128     if (jakefile) {
129       let ext = jakefile.split('.')[1];
130       let loaderFunc = SUPPORTED_EXTENSIONS[ext];
131       loaderFunc && loaderFunc();
132
133       loadFile(utils.file.absolutize(jakefile));
134       return true;
135     }
136     else {
137       if (!fileSpecified) {
138         // Restore the working directory on failure
139         process.chdir(origCwd);
140       }
141       return false;
142     }
143   };
144
145   this.loadDirectory = function (d) {
146     let dirname = d || 'jakelib';
147     let dirlist;
148     dirname = utils.file.absolutize(dirname);
149     if (existsSync(dirname)) {
150       dirlist = fs.readdirSync(dirname);
151       dirlist.forEach(function (filePath) {
152         if (JAKELIB_FILE_PAT.test(filePath)) {
153           loadFile(path.join(dirname, filePath));
154         }
155       });
156       return true;
157     }
158     return false;
159   };
160
161 };
162
163 module.exports = function () {
164   return new Loader();
165 };