codegenerator.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. const {
  2. __errorContinuable,
  3. __httpReq,
  4. __wHttpReq,
  5. __postInternalErrorMsg, __postMessage,
  6. __sequenceNumber,
  7. __successContinuable,
  8. __uri_to_id
  9. } = require("../__worker");
  10. const _do = require("../___do");
  11. const _utils = require('../utils');
  12. const _mmmk = require("../mmmk");
  13. const _fs = _do.convert(require('fs'), ['readFile', 'writeFile', 'readdir']);
  14. const _fspp = _do.convert(require('../___fs++'), ['mkdirs']);
  15. module.exports = {
  16. 'interfaces' : [{'method':'POST', 'url=':'/generatecode'}],
  17. 'csworker' :
  18. function(resp,method,uri,reqData,wcontext)
  19. {
  20. var actions = [__wHttpReq('GET','/current.model?wid='+wcontext.__aswid)];
  21. _do.chain(actions)(
  22. function(asdata) {
  23. var writeActions = [_fspp.mkdirs('./generated_code/'+reqData['root'])];
  24. _do.chain(writeActions)(
  25. function()
  26. {
  27. var res;
  28. if( (res = _mmmk.read())['$err'] ) {
  29. __postInternalErrorMsg(resp,res['$err']);
  30. } else {
  31. var cs = _utils.jsonp(res);
  32. var as = _utils.jsonp(asdata['data']);
  33. var subFolders = {};
  34. var from = {};
  35. var to = {};
  36. var filesInFolder = {};
  37. var possibleRoots = [];
  38. for (var key in as.nodes) {
  39. if (as.nodes[key]['$type'].indexOf('Folder') != -1) {
  40. possibleRoots.push(key);
  41. }
  42. }
  43. for (var key in as.edges) {
  44. if (as.nodes[as.edges[key]['src']]['$type'].indexOf('Folder') != -1) {
  45. from[as.edges[key]['dest']] = as.edges[key]['src'];
  46. } else if ((as.nodes[as.edges[key]['dest']]['$type'].indexOf('Folder') != -1)
  47. || (as.nodes[as.edges[key]['dest']]['$type'].indexOf('File') != -1)) {
  48. to[as.edges[key]['src']] = as.edges[key]['dest'];
  49. }
  50. }
  51. for (var key in from) {
  52. if (as.nodes[to[key]]['$type'].indexOf('Folder') != -1) {
  53. if (subFolders[from[key]]) {
  54. subFolders[from[key]].push(to[key]);
  55. } else {
  56. subFolders[from[key]] = [to[key]];
  57. }
  58. if (possibleRoots.indexOf(to[key]) > -1) {
  59. possibleRoots.splice(possibleRoots.indexOf(to[key]), 1);
  60. }
  61. } else if (as.nodes[to[key]]['$type'].indexOf('File') != -1) {
  62. if (filesInFolder[from[key]]) {
  63. filesInFolder[from[key]].push(to[key]);
  64. } else {
  65. filesInFolder[from[key]] = [to[key]];
  66. }
  67. }
  68. }
  69. if (possibleRoots.size > 1) {
  70. __postInternalErrorMsg(resp,"There can only be 1 root, found " + possibleRoots.size);
  71. } else {
  72. let generateFolder = function(key, prefix) {
  73. var dir = prefix + as.nodes[key]['name']['value'] + '/';
  74. writeActions = _fspp.mkdirs(dir);
  75. _do.chain(writeActions)(
  76. function() {
  77. for (var file in filesInFolder[key]) {
  78. _fs.writeFileSync(dir + as.nodes[filesInFolder[key][file]]['name']['value'], as.nodes[filesInFolder[key][file]]['contents']['value']);
  79. }
  80. },
  81. function(writeErr) { __postInternalErrorMsg(resp,writeErr); }
  82. );
  83. for (var subFolder in subFolders[key]) {
  84. generateFolder(subFolders[key][subFolder], dir);
  85. }
  86. };
  87. generateFolder(possibleRoots[0], './generated_code/' + reqData['root'] + '/');
  88. __postMessage({'statusCode':200,
  89. 'respIndex':resp});
  90. }
  91. }
  92. },
  93. function(writeErr) { __postInternalErrorMsg(resp,writeErr); }
  94. );
  95. },
  96. function(err) {__postInternalErrorMsg(resp,err);}
  97. );
  98. },
  99. 'asworker' :
  100. function(resp,method,uri,reqData,wcontext)
  101. {
  102. __postMessage(
  103. {'statusCode':200,
  104. 'respIndex':resp});
  105. }
  106. };