1 | var MODULE_NAME = 'dataflo.ws';
|
2 | var INITIATOR_PATH = 'initiator';
|
3 |
|
4 | var 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 |
|
13 | color.error = color.bind (color, "red+white_bg");
|
14 | color.path = color.cyan.bind (color);
|
15 | color.dataflows = color.green.bind (color, "dataflows");
|
16 |
|
17 | var util = require ('util');
|
18 |
|
19 | try {
|
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 |
|
29 | function NodeDF () {
|
30 |
|
31 | }
|
32 |
|
33 | util.inherits (NodeDF, DF);
|
34 |
|
35 | for (var staticFn in DF) {
|
36 | if (DF.hasOwnProperty(staticFn)) {
|
37 | NodeDF[staticFn] = DF[staticFn];
|
38 | }
|
39 | }
|
40 |
|
41 | NodeDF.color = DF.color = color;
|
42 |
|
43 | NodeDF.registry = DF.registry;
|
44 |
|
45 | DF.instanceTypes.forEach (function (instanceType) {
|
46 |
|
47 | NodeDF[instanceType] = function (instanceName) {
|
48 | return registryLookup (instanceType, instanceName);
|
49 | };
|
50 | });
|
51 |
|
52 | module.exports = NodeDF;
|
53 |
|
54 | function registryLookup (instanceType, instanceName) {
|
55 | var instanceClass = DF.registry[instanceType] &&
|
56 | DF.registry[instanceType][instanceName];
|
57 |
|
58 | if (instanceClass) {
|
59 | return instanceClass;
|
60 | }
|
61 |
|
62 |
|
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 |
|
108 | function 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 |
|
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 |
|
167 |
|
168 | module.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 | };
|