UNPKG

14.5 kBJavaScriptView Raw
1"use strict";
2var __extends = (this && this.__extends) || (function () {
3 var extendStatics = Object.setPrototypeOf ||
4 ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
5 function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
6 return function (d, b) {
7 extendStatics(d, b);
8 function __() { this.constructor = d; }
9 d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
10 };
11})();
12var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13 return new (P || (P = Promise))(function (resolve, reject) {
14 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
15 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
16 function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
17 step((generator = generator.apply(thisArg, _arguments || [])).next());
18 });
19};
20var __generator = (this && this.__generator) || function (thisArg, body) {
21 var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
22 return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
23 function verb(n) { return function (v) { return step([n, v]); }; }
24 function step(op) {
25 if (f) throw new TypeError("Generator is already executing.");
26 while (_) try {
27 if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
28 if (y = 0, t) op = [0, t.value];
29 switch (op[0]) {
30 case 0: case 1: t = op; break;
31 case 4: _.label++; return { value: op[1], done: false };
32 case 5: _.label++; y = op[1]; op = [0]; continue;
33 case 7: op = _.ops.pop(); _.trys.pop(); continue;
34 default:
35 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
36 if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
37 if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
38 if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
39 if (t[2]) _.ops.pop();
40 _.trys.pop(); continue;
41 }
42 op = body.call(thisArg, _);
43 } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
44 if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
45 }
46};
47var __values = (this && this.__values) || function (o) {
48 var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
49 if (m) return m.call(o);
50 return {
51 next: function () {
52 if (o && i >= o.length) o = void 0;
53 return { value: o && o[i++], done: !o };
54 }
55 };
56};
57Object.defineProperty(exports, "__esModule", { value: true });
58var events = require("events");
59var lib_1 = require("./lib");
60var util_1 = require("./util");
61/**
62 * Loader
63 *
64 * This is the base loader class
65 * Ít can be used to implement a definition loader
66 * for Chix
67 *
68 * @api public
69 * @author Rob Halff <rob.halff@gmail.com>
70 * @constructor
71 */
72var Loader = /** @class */ (function (_super) {
73 __extends(Loader, _super);
74 function Loader() {
75 var _this = _super.call(this) || this;
76 // npm loader returns a different source
77 _this.getNodeSource = Loader.prototype.getNodeDefinitionFrom;
78 _this.dependencyManager = new lib_1.DependencyManager();
79 _this.nodeDefinitionManager = new lib_1.NodeDefinitionManager(_this.dependencyManager);
80 return _this;
81 }
82 /**
83 * This is the main method all child classes should implement.
84 *
85 * @param {FlowDefinition[]} _flows
86 * @param {boolean} _update
87 * @returns {Promise<LoaderResponse>}
88 */
89 Loader.prototype.load = function (_flows, _update) {
90 return __awaiter(this, void 0, void 0, function () {
91 var flows, workload;
92 return __generator(this, function (_a) {
93 flows = Array.isArray(_flows) ? _flows : [_flows];
94 workload = this.getWorkLoad(flows, '@', false);
95 if (workload.length) {
96 throw Error('Default loader expects all nodeDefinitions to be preloaded');
97 }
98 return [2 /*return*/, {
99 dependencies: this.getDependencies(),
100 nodeDefinitions: this.getNodeDefinitions()
101 }];
102 });
103 });
104 };
105 Loader.prototype.loadNodeDefinitionFrom = function (provider, ns, name) {
106 return __awaiter(this, void 0, void 0, function () {
107 var loadNodeResult, nodeDefinition, flow;
108 return __generator(this, function (_a) {
109 switch (_a.label) {
110 case 0: return [4 /*yield*/, this.loadNode({
111 ns: ns,
112 name: name,
113 url: provider.replace('{ns}', ns).replace('{name}', name),
114 providerLocation: provider
115 })];
116 case 1:
117 loadNodeResult = _a.sent();
118 nodeDefinition = loadNodeResult.nodeDef;
119 // res.providerLocation
120 // provide a way to getDependencies for only this nodeDefinition.
121 // parseDependencies will just update *all* dependencies
122 // so in case if the nodeDefinition is a flow, it's just a method to traverse
123 // all dependencies and return that.
124 if (nodeDefinition.dependencies) {
125 this.dependencyManager.parseDependencies(nodeDefinition);
126 }
127 this.nodeDefinitionManager.setNodeDefinition(provider, nodeDefinition);
128 if (!(nodeDefinition.type === 'flow')) return [3 /*break*/, 3];
129 flow = nodeDefinition;
130 // Note: returns the full state, which in this case can be ignored.
131 return [4 /*yield*/, this.load([flow])];
132 case 2:
133 // Note: returns the full state, which in this case can be ignored.
134 _a.sent();
135 return [2 /*return*/, {
136 nodeDefinition: nodeDefinition,
137 dependencies: util_1.loadDependencies(nodeDefinition, this.nodeDefinitionManager.getNodeDefinitions())
138 }];
139 case 3: return [2 /*return*/, {
140 nodeDefinition: nodeDefinition,
141 dependencies: util_1.loadDependencies(nodeDefinition, this.nodeDefinitionManager.getNodeDefinitions())
142 }];
143 }
144 });
145 });
146 };
147 /**
148 * Loader itself only expects preloaded nodes.
149 * There is no actual load going on.
150 *
151 * Remote loader *does* implement loading.
152 *
153 * @param {ProviderDef} providerDef
154 * @returns {Promise<{nodeDef: NodeDefinition | {}}>}
155 */
156 Loader.prototype.loadNode = function (providerDef) {
157 return __awaiter(this, void 0, void 0, function () {
158 var providerLocation, ns, name, nodeDef;
159 return __generator(this, function (_a) {
160 providerLocation = providerDef.providerLocation, ns = providerDef.ns, name = providerDef.name;
161 nodeDef = this.nodeDefinitionManager.getNodeDefinitionFrom(
162 // provider,
163 providerLocation, ns, name);
164 if (nodeDef) {
165 return [2 /*return*/, {
166 providerLocation: providerLocation,
167 nodeDef: nodeDef
168 }];
169 }
170 throw Error("Could not load node " + ns + ":" + name + " from " + providerLocation);
171 });
172 });
173 };
174 /**
175 * loop the nodes, detect what provider they expect
176 * if they do not have a provider we will use the default,
177 * if the flow has set it's own default we will use that.
178 * the default within a flow is the one without namespace
179 */
180 Loader.prototype.getWorkLoad = function (flows, defaultProvider, update) {
181 var _this = this;
182 var willLoad = [];
183 var workload = [];
184 flows.forEach(function (flow) {
185 var e_1, _a;
186 // Todo for subflows this runs every time.
187 _this.nodeDefinitionManager.initProviderMap(flow, defaultProvider);
188 try {
189 for (var _b = __values(flow.nodes), _c = _b.next(); !_c.done; _c = _b.next()) {
190 var node = _c.value;
191 var providerLocation = void 0;
192 var remote
193 // select the name e.g. x
194 = void 0;
195 // select the name e.g. x
196 var provider = node.provider ? node.provider : '@';
197 if (!util_1.isProviderHandle(provider)) {
198 // it's already an url or path
199 providerLocation = provider;
200 remote = true;
201 }
202 else {
203 if (!flow.providers || !flow.providers.hasOwnProperty(provider)) {
204 throw Error([
205 'Node', node.ns + ':' + node.name,
206 'refers to unknown provider',
207 provider,
208 '\n\tplease specify it in the providers section'
209 ].join(' '));
210 }
211 // Within the flow detect what url x is about
212 if (flow.providers[provider].hasOwnProperty('path')) {
213 // hacked in, remote also takes care of local for now.
214 // just refactor this later on.
215 providerLocation = flow.providers[provider].path;
216 remote = false;
217 }
218 else if (flow.providers[provider].hasOwnProperty('url')) {
219 providerLocation = flow.providers[provider].url;
220 remote = true;
221 }
222 else {
223 throw Error("Do not know how to handle: " + provider);
224 }
225 }
226 if (!_this.nodeDefinitionManager.hasNodeDefinition(providerLocation, node.ns, node.name) && !update) {
227 var location_1 = providerLocation
228 .replace('{ns}', node.ns)
229 .replace('{name}', node.name);
230 // Check if it carries the info for our node also.
231 if (willLoad.indexOf(location_1) === -1) {
232 willLoad.push(location_1);
233 if (remote) {
234 workload.push({
235 url: location_1,
236 ns: node.ns,
237 name: node.name,
238 providerLocation: providerLocation
239 });
240 }
241 else {
242 workload.push({
243 path: location_1,
244 ns: node.ns,
245 name: node.name,
246 providerLocation: providerLocation
247 });
248 }
249 }
250 }
251 }
252 }
253 catch (e_1_1) { e_1 = { error: e_1_1 }; }
254 finally {
255 try {
256 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
257 }
258 finally { if (e_1) throw e_1.error; }
259 }
260 });
261 return workload;
262 };
263 // proxy nodeDefinitionManager methods
264 Loader.prototype.addNodeDefinitions = function (identifier, nodeDefs) {
265 return this.nodeDefinitionManager.addNodeDefinitions(identifier, nodeDefs);
266 };
267 Loader.prototype.addNodeDefinition = function (identifier, nodeDef) {
268 return this.nodeDefinitionManager.addNodeDefinition(identifier, nodeDef);
269 };
270 Loader.prototype.hasNodeDefinition = function (providerUrl, ns, name) {
271 return this.nodeDefinitionManager.hasNodeDefinition(providerUrl, ns, name);
272 };
273 Loader.prototype.getNodeDefinition = function (node, flow) {
274 return this.nodeDefinitionManager.getNodeDefinition(node, flow);
275 };
276 Loader.prototype.getNodeDefinitionFrom = function (provider, ns, name) {
277 return this.nodeDefinitionManager.getNodeDefinitionFrom(provider, ns, name);
278 };
279 Loader.prototype.saveNodeDefinition = function (_providerLocation, _nodeDefinition) {
280 throw new Error([
281 this.constructor.name,
282 'must implement a save method'
283 ].join(' '));
284 };
285 Loader.prototype.getNodeDefinitions = function (provider) {
286 return this.nodeDefinitionManager.getNodeDefinitions(provider);
287 };
288 Loader.prototype.setNodeDefinitions = function (nodeDefinitions) {
289 return this.nodeDefinitionManager.setNodeDefinitions(nodeDefinitions);
290 };
291 Loader.prototype.hasDependencies = function (type) {
292 return this.dependencyManager.hasDependencies(type);
293 };
294 Loader.prototype.getDependencies = function (type) {
295 return this.dependencyManager.getDependencies(type);
296 };
297 Loader.prototype.setDependencies = function (dependencies) {
298 return this.dependencyManager.setDependencies(dependencies);
299 };
300 return Loader;
301}(events.EventEmitter));
302exports.Loader = Loader;
303//# sourceMappingURL=loader.js.map
\No newline at end of file