UNPKG

4.29 kBJavaScriptView Raw
1var MODULE_NAME = 'dataflo.ws';
2var INITIATOR_PATH = 'initiator';
3
4var path = require ('path'),
5 fs = require ('fs'),
6 util = require ('util'),
7 common = require ('./common'),
8 color = require ('./color'),
9 DF = require ('./index'),
10 io = require ('./io/easy');
11
12
13color.error = color.bind (color, "red+white_bg");
14color.path = color.cyan.bind (color);
15color.dataflows = color.green.bind (color, "dataflows");
16
17var util = require ('util');
18
19try {
20 util.clone = require('node-v8-clone').clone;
21} catch (e) {
22 console.log (
23 color.dataflows(),
24 color.path ('node-v8-clone'),
25 'recommended to install to fasten clone operations'
26 );
27}
28
29function NodeDF () {
30
31}
32
33util.inherits (NodeDF, DF);
34
35for (var staticFn in DF) {
36 if (DF.hasOwnProperty(staticFn)) {
37 NodeDF[staticFn] = DF[staticFn];
38 }
39}
40
41NodeDF.color = DF.color = color;
42
43NodeDF.registry = DF.registry;
44
45DF.instanceTypes.forEach (function (instanceType) {
46 // NodeDF.registry[instanceType] = {};
47 NodeDF[instanceType] = function (instanceName) {
48 return registryLookup (instanceType, instanceName);
49 };
50});
51
52module.exports = NodeDF;
53
54function registryLookup (instanceType, instanceName) {
55 var instanceClass = DF.registry[instanceType] &&
56 DF.registry[instanceType][instanceName];
57
58 if (instanceClass) {
59 return instanceClass;
60 }
61
62 // TODO: remove
63 if ($isClientSide) {
64 console.error (
65 'you need to run dataflows.register ("'
66 +instanceType+'", "'+instanceName
67 +'", instance) before using this task'
68 );
69 return;
70 }
71
72
73 var fixedName = instanceName;
74 if (instanceType == 'initiator') {
75 fixedName = instanceName.replace(/d$/, '');
76 if (fixedName !== instanceName) {
77 console.warn(
78 '[DEPRECATED] Remove trailing "d" from "%s" in your initiator config',
79 instanceName
80 );
81 }
82 } else if (instanceType == 'task') {
83 fixedName = instanceName.replace(/^(dataflo\.ws\/)?task\//, '');
84 if (fixedName !== instanceName) {
85 console.warn(
86 '[DEPRECATED] Remove preceding "task/" from "%s" in your task config',
87 instanceName
88 );
89 }
90 }
91
92 var project;
93 var project_root;
94
95 if (common.getProject)
96 project = common.getProject();
97
98 if (project)
99 project_root = project.root;
100
101 instanceClass = getModule (instanceType, fixedName, false, project_root);
102
103 DF.registry[instanceType][instanceName] = instanceClass;
104
105 return instanceClass;
106};
107
108function getModule (type, name, optional, root) {
109 optional = optional || false;
110 var mod;
111
112 if (!root) {
113 if (typeof project !== "undefined") {
114 root = project.root;
115 } else {
116 root = new io (path.dirname (require.main.filename));
117 }
118 }
119
120 var paths = [
121 path.join('dataflo.ws', type, name)
122 ];
123
124 if (name.match (/^\./)) {
125 paths.unshift (name);
126 }
127
128 if (root) {
129 paths.push (path.resolve(root.path ? root.path : root, type, name));
130 paths.push (path.resolve(root.path ? root.path : root, 'node_modules', type, name));
131 }
132
133 paths.push (name);
134
135 var taskFound = paths.some (function (modPath) {
136 try {
137 mod = require(modPath);
138 return true;
139 } catch (e) {
140 // assume format: Error: Cannot find module 'csv2array' {"code":"MODULE_NOT_FOUND"}
141 if (e.toString().indexOf(name + '\'') > 0 && e.code == "MODULE_NOT_FOUND") {
142 return false;
143 } else {
144 console.error (
145 'requirement failed:',
146 color.error (e.toString()),
147 root
148 ? "in " + color.path (root.relative (modPath).match (/^\.\./) ? modPath : root.path)
149 : ""
150 );
151 return true;
152 }
153 }
154 });
155
156 if (!mod && !optional)
157 console.error ("module " + type + " " + name + " cannot be used");
158
159 return mod;
160
161}
162
163// - - -
164
165/**
166 * Makes symlinks from modules to base dataflo.ws directory.
167 */
168module.exports.install = function (moduleName) {
169 var baseDir = path.dirname(require.resolve(MODULE_NAME));
170 var nodePath = path.dirname(baseDir);
171 var moduleDir = path.join(nodePath, moduleName);
172
173 instanceTypes.forEach(function (dir) {
174 var srcDir = path.join(moduleDir, dir);
175 var destDir = path.join(baseDir, dir);
176
177 if (fs.existsSync(srcDir)) {
178 var files = fs.readdirSync(srcDir);
179 files.forEach(function (fileName) {
180 var srcPath = path.join(srcDir, fileName);
181 var destPath = path.join(destDir, fileName);
182 if (!fs.existsSync(destPath)) {
183 fs.symlinkSync(srcPath, destPath);
184 }
185 });
186 }
187 });
188};