node-red/packages/node_modules/@node-red/runtime/lib/library/examples.js

106 lines
3.5 KiB
JavaScript

/**
* Copyright JS Foundation and other contributors, http://js.foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
var fs = require('fs');
var runtime;
function init(_runtime) {
runtime = _runtime;
}
function getEntry(type,path) {
var examples = runtime.nodes.getNodeExampleFlows()||{};
var result = [];
if (path === "") {
return Promise.resolve(Object.keys(examples));
} else {
path = path.replace(/\/$/,"");
var parts = path.split("/");
var module = parts.shift();
if (module[0] === "@") {
module = module+"/"+parts.shift();
}
if (examples.hasOwnProperty(module)) {
examples = examples[module];
examples = parts.reduce(function(ex,k) {
if (ex) {
if (ex.d && ex.d[k]) {
return ex.d[k]
}
if (ex.f && ex.f.indexOf(k) > -1) {
return runtime.nodes.getNodeExampleFlowPath(module,parts.join("/"));
}
} else {
return null;
}
},examples);
if (!examples) {
return new Promise(function (resolve,reject) {
var error = new Error("not_found");
error.code = "not_found";
return reject(error);
});
} else if (typeof examples === 'string') {
return new Promise(function(resolve,reject) {
try {
fs.readFile(examples,'utf8',function(err, data) {
runtime.log.audit({event: "library.get",library:"_examples",type:"flow",path:path});
if (err) {
return reject(err);
}
return resolve(data);
})
} catch(err) {
return reject(err);
}
});
} else {
if (examples.d) {
for (var d in examples.d) {
if (examples.d.hasOwnProperty(d)) {
result.push(d);
}
}
}
if (examples.f) {
examples.f.forEach(function(f) {
result.push({fn:f})
})
}
return Promise.resolve(result);
}
} else {
return new Promise(function (resolve,reject) {
var error = new Error("not_found");
error.code = "not_found";
return reject(error);
});
}
}
}
module.exports = {
id: "examples",
label: "editor:library.types.examples",
icon: "font-awesome/fa-life-ring",
types: ["flows"],
readOnly: true,
init: init,
getEntry: getEntry
}