1 |
|
2 | var deferred, dirname, lastInstance, lstatSync, normalize, parallel, pipeline, readdirSync, save, sep, underscore, _ref, _ref1, _ref2;
|
3 |
|
4 | _ref = require('also'), deferred = _ref.deferred, parallel = _ref.parallel, pipeline = _ref.pipeline;
|
5 |
|
6 | _ref1 = require('path'), normalize = _ref1.normalize, sep = _ref1.sep, dirname = _ref1.dirname;
|
7 |
|
8 | underscore = require('inflection').underscore;
|
9 |
|
10 | _ref2 = require('fs'), readdirSync = _ref2.readdirSync, lstatSync = _ref2.lstatSync;
|
11 |
|
12 | save = require('./saver').save;
|
13 |
|
14 | require('colors');
|
15 |
|
16 | lastInstance = void 0;
|
17 |
|
18 | module.exports._test = function() {
|
19 | return lastInstance;
|
20 | };
|
21 |
|
22 | module.exports.create = function(config) {
|
23 | var api, local;
|
24 | lastInstance = local = {
|
25 | loadModules: function(arrayOfNames, doesInstance) {
|
26 | var moduleName, promise;
|
27 | return promise = parallel((function() {
|
28 | var _i, _len, _results;
|
29 | _results = [];
|
30 | for (_i = 0, _len = arrayOfNames.length; _i < _len; _i++) {
|
31 | moduleName = arrayOfNames[_i];
|
32 | _results.push((function(moduleName) {
|
33 | return function() {
|
34 | var nestedPromise;
|
35 | return nestedPromise = pipeline([
|
36 | function() {
|
37 | return local.loadModule(moduleName, doesInstance);
|
38 | }, function(module) {
|
39 | return doesInstance.spectate({
|
40 | name: moduleName,
|
41 | tagged: false
|
42 | }, module);
|
43 | }
|
44 | ]);
|
45 | };
|
46 | })(moduleName));
|
47 | }
|
48 | return _results;
|
49 | })());
|
50 | },
|
51 | loadModulesSync: function(arrayOfNames, doesInstance) {
|
52 | var Module, arrayOfModules, moduleName;
|
53 | return arrayOfModules = (function() {
|
54 | var _i, _len, _results;
|
55 | _results = [];
|
56 | for (_i = 0, _len = arrayOfNames.length; _i < _len; _i++) {
|
57 | moduleName = arrayOfNames[_i];
|
58 | Module = local.loadModuleSync(moduleName, doesInstance);
|
59 | _results.push(doesInstance.spectateSync({
|
60 | name: moduleName,
|
61 | tagged: false
|
62 | }, Module));
|
63 | }
|
64 | return _results;
|
65 | })();
|
66 | },
|
67 | dir: config.dir,
|
68 | modules: config.modules,
|
69 | upperCase: function(string) {
|
70 | var char, error;
|
71 | try {
|
72 | char = string[0].charCodeAt(0);
|
73 | } catch (_error) {
|
74 | error = _error;
|
75 | return false;
|
76 | }
|
77 | if (char > 64 && char < 91) {
|
78 | return true;
|
79 | }
|
80 | return false;
|
81 | },
|
82 | recurse: function(name, path, matches) {
|
83 | var fd, file, stat, _i, _len, _ref3, _results;
|
84 | _ref3 = readdirSync(path);
|
85 | _results = [];
|
86 | for (_i = 0, _len = _ref3.length; _i < _len; _i++) {
|
87 | fd = _ref3[_i];
|
88 | file = path + sep + fd;
|
89 | stat = lstatSync(file);
|
90 | if (stat.isDirectory()) {
|
91 | local.recurse(name, file, matches);
|
92 | continue;
|
93 | }
|
94 | if (fd.match(new RegExp("^" + name + ".[js|coffee]"))) {
|
95 | _results.push(matches.push(dirname(file) + sep + name));
|
96 | } else {
|
97 | _results.push(void 0);
|
98 | }
|
99 | }
|
100 | return _results;
|
101 | },
|
102 | find: function(name) {
|
103 | var matches;
|
104 | matches = [];
|
105 | try {
|
106 | local.recurse(underscore(name), local.dir + sep + 'lib', matches);
|
107 | } catch (_error) {}
|
108 | try {
|
109 | local.recurse(underscore(name), local.dir + sep + 'app', matches);
|
110 | } catch (_error) {}
|
111 | if (matches.length > 1) {
|
112 | throw new Error("ipso: found multiple matches for " + name + ", use ipso.modules");
|
113 | }
|
114 | return matches[0];
|
115 | },
|
116 | loadModule: deferred(function(action, name, does) {
|
117 | return does.get({
|
118 | query: {
|
119 | tag: name
|
120 | }
|
121 | }, function(error, spectated) {
|
122 | var path;
|
123 | if (spectated != null) {
|
124 | return action.resolve(spectated.object);
|
125 | }
|
126 | if (path = ((function() {
|
127 | try {
|
128 | return local.modules[name].require;
|
129 | } catch (_error) {}
|
130 | })())) {
|
131 | if (path[0] === '.') {
|
132 | path = normalize(local.dir + sep + path);
|
133 | }
|
134 | return action.resolve(require(path));
|
135 | }
|
136 | if (!local.upperCase(name)) {
|
137 | return action.resolve(require(name));
|
138 | }
|
139 | if (path = local.find(name)) {
|
140 | return action.resolve(require(path));
|
141 | }
|
142 | console.log('ipso: ' + ("warning: missing module " + name).yellow);
|
143 | return action.resolve({
|
144 | $ipso: {
|
145 | PENDING: true,
|
146 | module: name
|
147 | },
|
148 | $save: function(template) {
|
149 | if (template == null) {
|
150 | template = 'default';
|
151 | }
|
152 | return save(template, name, does);
|
153 | }
|
154 | });
|
155 | });
|
156 | }),
|
157 | loadModuleSync: function(name, does) {
|
158 | var path;
|
159 | try {
|
160 | return does.getSync({
|
161 | query: {
|
162 | tag: name
|
163 | }
|
164 | });
|
165 | } catch (_error) {}
|
166 | if (path = ((function() {
|
167 | try {
|
168 | return local.modules[name].require;
|
169 | } catch (_error) {}
|
170 | })())) {
|
171 | if (path[0] === '.') {
|
172 | path = normalize(local.dir + sep + path);
|
173 | }
|
174 | return require(path);
|
175 | }
|
176 | if (!local.upperCase(name)) {
|
177 | return require(name);
|
178 | }
|
179 | if (path = local.find(name)) {
|
180 | return require(path);
|
181 | }
|
182 | console.log('ipso: ' + ("warning: missing module " + name).yellow);
|
183 | return {
|
184 | $ipso: {
|
185 | PENDING: true,
|
186 | module: name
|
187 | },
|
188 | $save: function(template) {
|
189 | if (template == null) {
|
190 | template = 'default';
|
191 | }
|
192 | return save(template, name, does);
|
193 | }
|
194 | };
|
195 | }
|
196 | };
|
197 | return api = {
|
198 | loadModules: local.loadModules,
|
199 | loadModulesSync: local.loadModulesSync
|
200 | };
|
201 | };
|